Implement builder road construction with hex-edge auto-connection, winding rendering, and speed bonus

This commit is contained in:
bart
2026-11-08 21:52:34 +01:00
parent 4b237872eb
commit dfefb2d7fb
15 changed files with 620 additions and 16 deletions
+33 -1
View File
@@ -12,13 +12,32 @@
#include "matrix2d.h"
#include "terrain.h"
#include "terrainyieldmanager.h"
#include "roadconfig.h"
enum class ActionMode {
None,
Move,
Attack,
BuildCity,
BuildFarm
BuildFarm,
BuildRoad
};
struct TileRoad {
int tileX;
int tileY;
int playerId;
QString roadTypeId; // "dirt", "stone", "rail"
unsigned char connectionMask; // 6 bits: bit e (0..5) is 1 if connected to neighbor across edge e
QVector3D worldPos;
bool hasConnection(int edge) const {
return (connectionMask & (1 << (edge % 6))) != 0;
}
void setConnection(int edge, bool connected) {
if (connected) connectionMask |= (1 << (edge % 6));
else connectionMask &= ~(1 << (edge % 6));
}
};
struct TileImprovement {
@@ -48,6 +67,8 @@ public:
UnitConfigManager& unitConfigs() { return m_unitConfigManager; }
BuildingConfigManager& buildingConfigs() { return m_buildingConfigManager; }
const BuildingConfigManager& buildingConfigs() const { return m_buildingConfigManager; }
RoadConfigManager& roadConfigs() { return m_roadConfigManager; }
const RoadConfigManager& roadConfigs() const { return m_roadConfigManager; }
const std::vector<std::shared_ptr<Unit>>& getUnits() const { return m_units; }
const std::vector<City>& getCities() const { return m_cities; }
@@ -90,6 +111,7 @@ public:
void commandAttack(Unit *target);
void commandBuildCitySelected(Matrix2D<TerrainPoint> *mapPoints, int numPoints05);
void commandBuildFarmSelected(Matrix2D<TerrainPoint> *mapPoints, int numPoints05);
void commandBuildRoadSelected(Matrix2D<TerrainPoint> *mapPoints, int numPoints05);
void completeUnitBuilding(Unit &unit, Matrix2D<TerrainPoint> *mapPoints, int numPoints05);
void processUnitActionQueue(Unit &unit, Matrix2D<TerrainPoint> *mapPoints, int numPoints05);
@@ -97,6 +119,14 @@ public:
const TileImprovement* getImprovementAt(int tx, int ty) const;
bool hasImprovementAt(int tx, int ty) const;
const std::map<std::pair<int, int>, TileRoad>& getTileRoads() const { return m_tileRoads; }
const TileRoad* getRoadAt(int tx, int ty) const;
bool hasRoadAt(int tx, int ty) const;
void addRoad(int tx, int ty, int playerId, const QString &roadTypeId = "dirt", Matrix2D<TerrainPoint> *mapPoints = nullptr, int numPoints05 = 0);
void removeRoad(int tx, int ty);
void updateRoadConnections(int tx, int ty);
float getRoadSpeedMultiplierBetween(int fromX, int fromY, int toX, int toY) const;
float getTickDuration() const { return m_movementTickDuration; }
void setTickDuration(float d) { m_movementTickDuration = std::max(1.0f, d); }
float getTickTimer() const { return m_tickTimer; }
@@ -123,10 +153,12 @@ private:
PlayerManager m_playerManager;
UnitConfigManager m_unitConfigManager;
BuildingConfigManager m_buildingConfigManager;
RoadConfigManager m_roadConfigManager;
std::vector<std::shared_ptr<Unit>> m_units;
std::vector<City> m_cities;
std::vector<FloatingText> m_floatingTexts;
std::map<std::pair<int, int>, TileImprovement> m_tileImprovements;
std::map<std::pair<int, int>, TileRoad> m_tileRoads;
int m_selectedUnitId;
int m_activeCityViewId;