stad
This commit is contained in:
+102
-5
@@ -1,6 +1,7 @@
|
||||
#include "gamemanager.h"
|
||||
#include "pathfinder.h"
|
||||
#include "yamlparser.h"
|
||||
#include "terrainyieldmanager.h"
|
||||
#include <QDebug>
|
||||
#include <cmath>
|
||||
|
||||
@@ -11,7 +12,7 @@ GameManager& GameManager::instance()
|
||||
}
|
||||
|
||||
GameManager::GameManager()
|
||||
: m_selectedUnitId(-1), m_actionMode(ActionMode::None),
|
||||
: m_selectedUnitId(-1), m_activeCityViewId(-1), m_actionMode(ActionMode::None),
|
||||
m_movementTickDuration(30.0f), m_tickTimer(0.0f),
|
||||
m_simSpeedMultiplier(1.0f), m_nextUnitId(0), m_nextCityId(0),
|
||||
m_initialized(false)
|
||||
@@ -22,6 +23,9 @@ void GameManager::init(const QString &baseDir, Matrix2D<TerrainPoint> *mapPoints
|
||||
{
|
||||
if (m_initialized) return;
|
||||
|
||||
// Load terrain yields & city configuration
|
||||
TerrainYieldManager::instance().loadConfigs(baseDir);
|
||||
|
||||
// Load game settings
|
||||
QString gameConfigPath = baseDir + "/config/game.yaml";
|
||||
YamlNode gameRoot = YamlParser::parseFile(gameConfigPath);
|
||||
@@ -33,7 +37,24 @@ void GameManager::init(const QString &baseDir, Matrix2D<TerrainPoint> *mapPoints
|
||||
QString unitsConfigDir = baseDir + "/config/units";
|
||||
m_unitConfigManager.loadFromDirectory(unitsConfigDir);
|
||||
|
||||
// Spawn initial demo units near starting camera position (Cam: ~28, 16 km -> hex ~37, 18)
|
||||
// Spawn an initial established city for Player 1 at (35, 17)
|
||||
const CityConfig &cCfg = TerrainYieldManager::instance().getCityConfig();
|
||||
int cId = getNextCityId();
|
||||
QVector2D w = Pathfinder::hexToWorld(35, 17);
|
||||
float gz = Unit::getTerrainHeight(w.x(), w.y(), mapPoints, numPoints05);
|
||||
|
||||
City initialCity(cId, 1, "Roma", 35, 17, QVector3D(w.x(), w.y(), gz),
|
||||
cCfg.initialInhabitants, cCfg.inhabitantsPerPop, cCfg.initialBorderRadius);
|
||||
|
||||
// Assign initial 1 pop to work the city center tile
|
||||
QString tType = TerrainYieldManager::instance().getTerrainType(35, 17, mapPoints, numPoints05);
|
||||
const TerrainYieldConfig *yCfg = TerrainYieldManager::instance().getYieldConfig(tType);
|
||||
QString defRes = yCfg ? yCfg->primaryResource : "voedsel";
|
||||
initialCity.assignWorker(35, 17, defRes);
|
||||
|
||||
m_cities.push_back(initialCity);
|
||||
|
||||
// Spawn initial demo units near starting camera position
|
||||
// Player 1 (Blue & Gold)
|
||||
spawnUnit("settler", 1, 36, 18, mapPoints, numPoints05);
|
||||
spawnUnit("warrior", 1, 37, 18, mapPoints, numPoints05);
|
||||
@@ -44,7 +65,7 @@ void GameManager::init(const QString &baseDir, Matrix2D<TerrainPoint> *mapPoints
|
||||
spawnUnit("slinger", 2, 41, 19, mapPoints, numPoints05);
|
||||
|
||||
m_initialized = true;
|
||||
qDebug() << "GameManager initialized with" << m_units.size() << "units.";
|
||||
qDebug() << "GameManager initialized with" << m_cities.size() << "cities and" << m_units.size() << "units.";
|
||||
}
|
||||
|
||||
Unit* GameManager::spawnUnit(const QString &configId, int playerId, int tileX, int tileY,
|
||||
@@ -96,7 +117,7 @@ void GameManager::update(float deltaTime, Matrix2D<TerrainPoint> *mapPoints, int
|
||||
// Update floating texts
|
||||
for (auto it = m_floatingTexts.begin(); it != m_floatingTexts.end(); ) {
|
||||
it->life -= deltaTime;
|
||||
it->worldPos.setZ(it->worldPos.z() + deltaTime * 0.4f); // Float upward
|
||||
it->worldPos.setZ(it->worldPos.z() + deltaTime * 0.4f);
|
||||
if (it->life <= 0.0f) {
|
||||
it = m_floatingTexts.erase(it);
|
||||
} else {
|
||||
@@ -121,6 +142,7 @@ const Unit* GameManager::getSelectedUnit() const
|
||||
void GameManager::selectUnit(int id)
|
||||
{
|
||||
m_selectedUnitId = id;
|
||||
m_activeCityViewId = -1; // Close city view when unit is selected
|
||||
m_actionMode = ActionMode::None;
|
||||
}
|
||||
|
||||
@@ -148,6 +170,70 @@ Unit* GameManager::getUnitById(int id)
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
City* GameManager::getCityAt(int tx, int ty)
|
||||
{
|
||||
for (auto &c : m_cities) {
|
||||
if (c.tileX == tx && c.tileY == ty) return &c;
|
||||
}
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
City* GameManager::getCityById(int id)
|
||||
{
|
||||
for (auto &c : m_cities) {
|
||||
if (c.id == id) return &c;
|
||||
}
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
City* GameManager::getActiveCityView()
|
||||
{
|
||||
return getCityById(m_activeCityViewId);
|
||||
}
|
||||
|
||||
const City* GameManager::getActiveCityView() const
|
||||
{
|
||||
for (const auto &c : m_cities) {
|
||||
if (c.id == m_activeCityViewId) return &c;
|
||||
}
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
void GameManager::enterCityView(int cityId)
|
||||
{
|
||||
m_activeCityViewId = cityId;
|
||||
m_selectedUnitId = -1;
|
||||
m_actionMode = ActionMode::None;
|
||||
}
|
||||
|
||||
void GameManager::exitCityView()
|
||||
{
|
||||
m_activeCityViewId = -1;
|
||||
}
|
||||
|
||||
CityYieldSummary GameManager::calculateCityYields(const City &city, Matrix2D<TerrainPoint> *mapPoints, int numPoints05) const
|
||||
{
|
||||
CityYieldSummary summary;
|
||||
for (const auto &pair : city.workedTiles) {
|
||||
int tx = pair.first.first;
|
||||
int ty = pair.first.second;
|
||||
QString assignedRes = pair.second;
|
||||
|
||||
QString tType = TerrainYieldManager::instance().getTerrainType(tx, ty, mapPoints, numPoints05);
|
||||
const TerrainYieldConfig *yCfg = TerrainYieldManager::instance().getYieldConfig(tType);
|
||||
if (!yCfg) continue;
|
||||
|
||||
int amount = yCfg->getYield(assignedRes);
|
||||
if (assignedRes == "voedsel") summary.food += amount;
|
||||
else if (assignedRes == "arbeid") summary.labor += amount;
|
||||
else if (assignedRes == "kennis") summary.science += amount;
|
||||
else if (assignedRes == "cultuur") summary.culture += amount;
|
||||
else if (assignedRes == "geloof") summary.faith += amount;
|
||||
else if (assignedRes == "goud") summary.gold += amount;
|
||||
}
|
||||
return summary;
|
||||
}
|
||||
|
||||
void GameManager::commandMoveSelected(int targetX, int targetY, Matrix2D<TerrainPoint> *mapPoints, int numPoints05)
|
||||
{
|
||||
Unit *selected = getSelectedUnit();
|
||||
@@ -203,12 +289,23 @@ void GameManager::commandBuildCitySelected(Matrix2D<TerrainPoint> *mapPoints, in
|
||||
}
|
||||
}
|
||||
|
||||
const CityConfig &cCfg = TerrainYieldManager::instance().getCityConfig();
|
||||
int cId = getNextCityId();
|
||||
QString cityName = QString("Stad %1").arg(cId);
|
||||
QVector2D w = Pathfinder::hexToWorld(selected->tileX, selected->tileY);
|
||||
float gz = Unit::getTerrainHeight(w.x(), w.y(), mapPoints, numPoints05);
|
||||
|
||||
m_cities.emplace_back(cId, selected->playerId, cityName, selected->tileX, selected->tileY, QVector3D(w.x(), w.y(), gz));
|
||||
City newCity(cId, selected->playerId, cityName, selected->tileX, selected->tileY,
|
||||
QVector3D(w.x(), w.y(), gz),
|
||||
cCfg.initialInhabitants, cCfg.inhabitantsPerPop, cCfg.initialBorderRadius);
|
||||
|
||||
// Assign initial worker to center tile
|
||||
QString tType = TerrainYieldManager::instance().getTerrainType(selected->tileX, selected->tileY, mapPoints, numPoints05);
|
||||
const TerrainYieldConfig *yCfg = TerrainYieldManager::instance().getYieldConfig(tType);
|
||||
QString defRes = yCfg ? yCfg->primaryResource : "voedsel";
|
||||
newCity.assignWorker(selected->tileX, selected->tileY, defRes);
|
||||
|
||||
m_cities.push_back(newCity);
|
||||
addFloatingText(QString("%1 gesticht!").arg(cityName), QVector3D(w.x(), w.y(), gz + 1.2f), QColor(80, 255, 120), 2.5f);
|
||||
|
||||
// Consuming settler
|
||||
|
||||
Reference in New Issue
Block a user