Implement unit action queueing and busy state validation

This commit is contained in:
bart
2026-11-08 21:31:56 +01:00
parent cbba54969a
commit 4b237872eb
7 changed files with 502 additions and 50 deletions
+56 -27
View File
@@ -715,19 +715,25 @@ void QSceneRenderer::drawUnitsOverlay(QPainter &painter, const QMatrix4x4 &vMatr
} else if (act == "aanvallen") {
isActive = (GameManager::instance().currentActionMode() == ActionMode::Attack);
iconFile = "images/actions/attack.png";
tip = QString("Aanvallen (A) [Bereik: %1]").arg(unit->config.attackRange);
tip = Localization::instance().get("ui.unit.tip_attack", "Attack (A) [Range: %1]").arg(unit->config.attackRange);
} else if (act == "steden_bouwen" || act == "build_city") {
isActive = (GameManager::instance().currentActionMode() == ActionMode::BuildCity);
bool isQueued = unit->hasQueuedActionType(UnitActionType::BuildCity);
isActive = (GameManager::instance().currentActionMode() == ActionMode::BuildCity) || isQueued;
iconFile = "images/actions/build_city.png";
tip = "Steden bouwen (B)";
tip = isQueued
? Localization::instance().get("ui.unit.city_queued", "Found City queued on arrival")
: Localization::instance().get("ui.unit.tip_build_city", "Found City (B)");
} else if (act == "boerderij_bouwen" || act == "build_farm") {
isActive = unit->isBuilding();
bool isQueued = unit->hasQueuedActionType(UnitActionType::BuildImprovement);
isActive = unit->isBuilding() || isQueued;
iconFile = "images/actions/farm.png";
if (unit->isBuilding()) {
int pct = (int)(std::min(1.0f, unit->buildProgress) * 100.0f);
tip = QString("Aan het bouwen... %1%").arg(pct);
tip = Localization::instance().get("ui.unit.tip_farm_building", "Busy building... %1%").arg(pct);
} else if (isQueued) {
tip = Localization::instance().get("ui.unit.tip_farm_queued", "Build Farm (Queued on arrival - click to cancel)");
} else {
tip = "Boerderij bouwen (F)";
tip = Localization::instance().get("ui.unit.tip_build_farm", "Build Farm (F)");
}
}
@@ -918,28 +924,39 @@ void QSceneRenderer::drawUnitCard(QPainter &painter, Unit *unit)
painter.setFont(QFont("sans-serif", 8));
painter.setPen(QColor(200, 220, 240));
QString speedInfo = QString("Snelheid: %1 hex/tick").arg(unit->config.movementSpeed, 0, 'f', 1);
QString speedInfo = Localization::instance().get("ui.unit.speed_format", "Speed: %1 hex/tick").arg(unit->config.movementSpeed, 0, 'f', 1);
painter.drawText(QRect(cardRect.left() + 12, cardRect.top() + 76, 140, 14), Qt::AlignLeft | Qt::AlignVCenter, speedInfo);
QString costInfo = QString("Kosten: %1 pnt").arg(unit->config.cost);
QString costInfo = Localization::instance().get("ui.unit.cost_format", "Cost: %1 pts").arg(unit->config.cost);
painter.drawText(QRect(cardRect.left() + 160, cardRect.top() + 76, 130, 14), Qt::AlignLeft | Qt::AlignVCenter, costInfo);
if (unit->config.isMilitary()) {
QString combatInfo = QString("Aanval: %1 | Bereik: %2 hex").arg(unit->config.attackDamage).arg(unit->config.attackRange);
QString combatInfo = Localization::instance().get("ui.unit.combat_format", "Attack: %1 | Range: %2 hex")
.arg(unit->config.attackDamage).arg(unit->config.attackRange);
painter.drawText(QRect(cardRect.left() + 12, cardRect.top() + 94, 280, 14), Qt::AlignLeft | Qt::AlignVCenter, combatInfo);
} else if (unit->isBuilding()) {
int pct = (int)(std::min(1.0f, unit->buildProgress) * 100.0f);
QString buildInfo = QString("Aan het bouwen... %1%").arg(pct);
QString buildInfo = Localization::instance().get("ui.unit.building_pct", "Building... %1%").arg(pct);
if (!unit->config.infiniteCharges && unit->buildCharges > 0) {
buildInfo += QString(" | Ladingen: %1").arg(unit->buildCharges);
buildInfo += QString(" | ") + Localization::instance().get("ui.unit.charges_format", "Charges: %1").arg(unit->buildCharges);
}
painter.setPen(QColor(255, 210, 80));
painter.drawText(QRect(cardRect.left() + 12, cardRect.top() + 94, 280, 14), Qt::AlignLeft | Qt::AlignVCenter, buildInfo);
} else if (unit->hasQueuedAction()) {
QString qSummary = unit->getQueuedActionSummary();
QString queuedInfo = Localization::instance().get("ui.unit.status_queued", "Queued: %1").arg(qSummary);
if (unit->config.canBuildFarm() && !unit->config.infiniteCharges && unit->buildCharges > 0) {
queuedInfo += QString(" | ") + Localization::instance().get("ui.unit.charges_format", "Charges: %1").arg(unit->buildCharges);
}
painter.setPen(QColor(100, 220, 140));
painter.drawText(QRect(cardRect.left() + 12, cardRect.top() + 94, 280, 14), Qt::AlignLeft | Qt::AlignVCenter, queuedInfo);
} else if (unit->config.canBuildFarm() && !unit->config.infiniteCharges && unit->buildCharges > 0) {
QString builderInfo = QString("Civiele eenheid | Ladingen: %1").arg(unit->buildCharges);
QString builderInfo = Localization::instance().get("ui.unit.civilian_unit", "Civilian unit") + QString(" | ") +
Localization::instance().get("ui.unit.charges_format", "Charges: %1").arg(unit->buildCharges);
painter.drawText(QRect(cardRect.left() + 12, cardRect.top() + 94, 280, 14), Qt::AlignLeft | Qt::AlignVCenter, builderInfo);
} else {
painter.drawText(QRect(cardRect.left() + 12, cardRect.top() + 94, 280, 14), Qt::AlignLeft | Qt::AlignVCenter, "Civiele eenheid");
painter.drawText(QRect(cardRect.left() + 12, cardRect.top() + 94, 280, 14), Qt::AlignLeft | Qt::AlignVCenter,
Localization::instance().get("ui.unit.civilian_unit", "Civilian unit"));
}
// Action Bubbles Row at bottom of card
@@ -958,34 +975,41 @@ void QSceneRenderer::drawUnitCard(QPainter &painter, Unit *unit)
bool isActive = false;
QString iconFile = "images/actions/move.png";
QString label = "Verplaats";
QString tip = "Verplaatsen (M)";
QString label = Localization::instance().get("ui.unit.btn_move", "Move [M]");
QString tip = Localization::instance().get("ui.unit.tip_move", "Move (M)");
if (act == "verplaatsen") {
isActive = (GameManager::instance().currentActionMode() == ActionMode::Move);
iconFile = "images/actions/move.png";
label = "Beweeg [M]";
tip = "Verplaatsen (M)";
label = Localization::instance().get("ui.unit.btn_move", "Move [M]");
tip = Localization::instance().get("ui.unit.tip_move", "Move (M)");
} else if (act == "aanvallen") {
isActive = (GameManager::instance().currentActionMode() == ActionMode::Attack);
iconFile = "images/actions/attack.png";
label = "Aanval [A]";
tip = QString("Aanvallen (A) [Bereik: %1]").arg(unit->config.attackRange);
label = Localization::instance().get("ui.unit.btn_attack", "Attack [A]");
tip = Localization::instance().get("ui.unit.tip_attack", "Attack (A) [Range: %1]").arg(unit->config.attackRange);
} else if (act == "steden_bouwen" || act == "build_city") {
isActive = (GameManager::instance().currentActionMode() == ActionMode::BuildCity);
bool isQueued = unit->hasQueuedActionType(UnitActionType::BuildCity);
isActive = (GameManager::instance().currentActionMode() == ActionMode::BuildCity) || isQueued;
iconFile = "images/actions/build_city.png";
label = "Sticht [B]";
tip = "Steden bouwen (B)";
label = isQueued ? "Queued" : Localization::instance().get("ui.unit.btn_build_city", "Settle [B]");
tip = isQueued
? Localization::instance().get("ui.unit.city_queued", "Found City queued on arrival")
: Localization::instance().get("ui.unit.tip_build_city", "Found City (B)");
} else if (act == "boerderij_bouwen" || act == "build_farm") {
isActive = unit->isBuilding();
bool isQueued = unit->hasQueuedActionType(UnitActionType::BuildImprovement);
isActive = unit->isBuilding() || isQueued;
iconFile = "images/actions/farm.png";
if (unit->isBuilding()) {
int pct = (int)(std::min(1.0f, unit->buildProgress) * 100.0f);
label = QString("Bouwt %1%").arg(pct);
tip = QString("Bezig met bouwen... %1%").arg(pct);
label = Localization::instance().get("ui.unit.btn_farm_building", "Building %1%").arg(pct);
tip = Localization::instance().get("ui.unit.tip_farm_building", "Busy building... %1%").arg(pct);
} else if (isQueued) {
label = Localization::instance().get("ui.unit.btn_farm_queued", "Farm (Queued)");
tip = Localization::instance().get("ui.unit.tip_farm_queued", "Build Farm (Queued on arrival - click to cancel)");
} else {
label = "Boerderij [F]";
tip = "Boerderij bouwen (F)";
label = Localization::instance().get("ui.unit.btn_build_farm", "Farm [F]");
tip = Localization::instance().get("ui.unit.tip_build_farm", "Build Farm (F)");
}
}
@@ -2046,6 +2070,11 @@ void QSceneRenderer::keyPressEvent(QKeyEvent *e)
else if (e->key() == Qt::Key_Escape) {
if (GameManager::instance().currentActionMode() != ActionMode::None) {
GameManager::instance().setActionMode(ActionMode::None);
} else if (sel && sel->hasQueuedAction()) {
sel->clearActionQueue();
GameManager::instance().addFloatingText(
Localization::instance().get("ui.unit.queue_cleared", "Queued actions cancelled"),
sel->worldPos + QVector3D(0, 0, 0.8f), QColor(255, 180, 80));
} else {
GameManager::instance().deselectUnit();
}