Merge branch 'main' into session/builder-roads

This commit is contained in:
bart
2026-11-08 21:55:44 +01:00
9 changed files with 482 additions and 51 deletions
+67 -25
View File
@@ -76,10 +76,8 @@ void GameManager::init(const QString &baseDir, Matrix2D<TerrainPoint> *mapPoints
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";
// Assign initial 1 pop to work the city center tile with best yield resource
QString defRes = getBestTileResource(35, 17, mapPoints, numPoints05);
initialCity.assignWorker(35, 17, defRes);
m_cities.push_back(initialCity);
@@ -251,6 +249,67 @@ void GameManager::exitCityView()
m_activeCityViewId = -1;
}
QMap<QString, int> GameManager::getTileYields(int tx, int ty, Matrix2D<TerrainPoint> *mapPoints, int numPoints05) const
{
QMap<QString, int> yields;
const CityConfig &cCfg = TerrainYieldManager::instance().getCityConfig();
QStringList resources = cCfg.resourcePriority;
if (resources.isEmpty()) {
resources = {"voedsel", "arbeid", "goud", "kennis", "cultuur", "geloof"};
}
QString tType = TerrainYieldManager::instance().getTerrainType(tx, ty, mapPoints, numPoints05);
const TerrainYieldConfig *yCfg = TerrainYieldManager::instance().getYieldConfig(tType);
const TileImprovement *imp = getImprovementAt(tx, ty);
const ImprovementConfig *iCfg = imp ? TerrainYieldManager::instance().getImprovementConfig(imp->improvementId) : nullptr;
for (const QString &res : resources) {
int amount = yCfg ? yCfg->getYield(res) : 0;
if (iCfg && iCfg->yieldBonus.contains(res)) {
amount += iCfg->yieldBonus.value(res, 0);
}
yields[res] = amount;
}
return yields;
}
int GameManager::getTileYield(int tx, int ty, const QString &res, Matrix2D<TerrainPoint> *mapPoints, int numPoints05) const
{
QString tType = TerrainYieldManager::instance().getTerrainType(tx, ty, mapPoints, numPoints05);
const TerrainYieldConfig *yCfg = TerrainYieldManager::instance().getYieldConfig(tType);
int amount = yCfg ? yCfg->getYield(res) : 0;
const TileImprovement *imp = getImprovementAt(tx, ty);
if (imp) {
const ImprovementConfig *iCfg = TerrainYieldManager::instance().getImprovementConfig(imp->improvementId);
if (iCfg && iCfg->yieldBonus.contains(res)) {
amount += iCfg->yieldBonus.value(res, 0);
}
}
return amount;
}
QString GameManager::getBestTileResource(int tx, int ty, Matrix2D<TerrainPoint> *mapPoints, int numPoints05) const
{
const CityConfig &cCfg = TerrainYieldManager::instance().getCityConfig();
QStringList priority = cCfg.resourcePriority;
if (priority.isEmpty()) {
priority = {"voedsel", "arbeid", "goud", "kennis", "cultuur", "geloof"};
}
QMap<QString, int> yields = getTileYields(tx, ty, mapPoints, numPoints05);
QString bestRes = priority.first();
int maxYield = -1;
for (const QString &res : priority) {
int y = yields.value(res, 0);
if (y > maxYield) {
maxYield = y;
bestRes = res;
}
}
return bestRes;
}
CityYieldSummary GameManager::calculateCityYields(const City &city, Matrix2D<TerrainPoint> *mapPoints, int numPoints05) const
{
CityYieldSummary summary;
@@ -270,20 +329,7 @@ CityYieldSummary GameManager::calculateCityYields(const City &city, Matrix2D<Ter
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);
// Add bonus from tile improvements (e.g. farm bonus)
const TileImprovement *imp = getImprovementAt(tx, ty);
if (imp) {
const ImprovementConfig *iCfg = TerrainYieldManager::instance().getImprovementConfig(imp->improvementId);
if (iCfg && iCfg->yieldBonus.contains(assignedRes)) {
amount += iCfg->yieldBonus.value(assignedRes, 0);
}
}
int amount = getTileYield(tx, ty, assignedRes, mapPoints, numPoints05);
if (assignedRes == "voedsel") summary.food += amount;
else if (assignedRes == "arbeid") summary.labor += amount;
@@ -636,10 +682,8 @@ void GameManager::commandBuildCitySelected(Matrix2D<TerrainPoint> *mapPoints, in
QVector3D(w.x(), w.y(), gz),
cCfg.initialInhabitants, cCfg.inhabitantsPerPop, cCfg.initialBorderRadius);
// Assign initial worker to center tile
QString tType = TerrainYieldManager::instance().getTerrainType(tx, ty, mapPoints, numPoints05);
const TerrainYieldConfig *yCfg = TerrainYieldManager::instance().getYieldConfig(tType);
QString defRes = yCfg ? yCfg->primaryResource : "voedsel";
// Assign initial worker to center tile with best yield resource
QString defRes = getBestTileResource(tx, ty, mapPoints, numPoints05);
newCity.assignWorker(tx, ty, defRes);
m_cities.push_back(newCity);
@@ -1084,9 +1128,7 @@ void GameManager::processUnitActionQueue(Unit &unit, Matrix2D<TerrainPoint> *map
QVector3D(w.x(), w.y(), gz),
cCfg.initialInhabitants, cCfg.inhabitantsPerPop, cCfg.initialBorderRadius);
QString tType = TerrainYieldManager::instance().getTerrainType(tx, ty, mapPoints, numPoints05);
const TerrainYieldConfig *yCfg = TerrainYieldManager::instance().getYieldConfig(tType);
QString defRes = yCfg ? yCfg->primaryResource : "voedsel";
QString defRes = getBestTileResource(tx, ty, mapPoints, numPoints05);
newCity.assignWorker(tx, ty, defRes);
m_cities.push_back(newCity);