Implement builder road construction with hex-edge auto-connection, winding rendering, and speed bonus
This commit is contained in:
+33
-1
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user