Implement target-tile selection and Shift-queueing for all unit actions

This commit is contained in:
2026-11-09 22:13:49 +01:00
parent 882c83ba13
commit 8eda9a2532
8 changed files with 1157 additions and 693 deletions
+58 -13
View File
@@ -1,8 +1,10 @@
#include "unit.h"
#include "pathfinder.h"
#include "terrainmovementmanager.h"
#include "localization.h"
#include <algorithm>
#include <cmath>
#include <QStringList>
Unit::Unit(int uId, int pId, const UnitConfig &cfg, int startX, int startY, float groundZ)
: id(uId), playerId(pId), config(cfg), tileX(startX), tileY(startY),
@@ -57,6 +59,36 @@ bool Unit::hasQueuedActionType(UnitActionType type) const
return false;
}
bool Unit::hasQueuedImprovementAt(int tx, int ty) const
{
if (currentAction.type == UnitActionType::BuildImprovement &&
currentAction.targetX == tx && currentAction.targetY == ty) {
return true;
}
for (const auto &act : actionQueue) {
if (act.type == UnitActionType::BuildImprovement &&
act.targetX == tx && act.targetY == ty) {
return true;
}
}
return false;
}
bool Unit::hasQueuedCityAt(int tx, int ty) const
{
if (currentAction.type == UnitActionType::BuildCity &&
currentAction.targetX == tx && currentAction.targetY == ty) {
return true;
}
for (const auto &act : actionQueue) {
if (act.type == UnitActionType::BuildCity &&
act.targetX == tx && act.targetY == ty) {
return true;
}
}
return false;
}
void Unit::removeQueuedActionsOfType(UnitActionType type)
{
for (auto it = actionQueue.begin(); it != actionQueue.end(); ) {
@@ -82,23 +114,35 @@ const UnitAction* Unit::peekNextQueuedAction() const
return &actionQueue.front();
}
QString Unit::getActionSummary(const UnitAction &act) const
{
switch (act.type) {
case UnitActionType::Move:
return Localization::instance().get("ui.actions.move", "Move");
case UnitActionType::BuildImprovement:
return Localization::instance().get("ui.actions.build_farm", "Build Farm");
case UnitActionType::BuildCity:
return Localization::instance().get("ui.actions.found_city", "Found City");
case UnitActionType::BuildRoad:
return Localization::instance().get("ui.actions.build_road", "Build Road");
case UnitActionType::Attack:
return Localization::instance().get("ui.actions.attack", "Attack");
default:
return "";
}
}
QString Unit::getQueuedActionSummary() const
{
if (actionQueue.empty()) return "";
switch (actionQueue.front().type) {
case UnitActionType::Move:
return "Move";
case UnitActionType::BuildImprovement:
return "Build Farm";
case UnitActionType::BuildCity:
return "Found City";
case UnitActionType::BuildRoad:
return "Build Road";
case UnitActionType::Attack:
return "Attack";
default:
return "Action";
QStringList parts;
for (size_t i = 0; i < actionQueue.size() && i < 3; ++i) {
parts.append(getActionSummary(actionQueue[i]));
}
if (actionQueue.size() > 3) {
parts.append(QString("+%1").arg(actionQueue.size() - 3));
}
return parts.join(" -> ");
}
void Unit::setPath(const std::vector<std::pair<int, int>> &newPath)
@@ -122,6 +166,7 @@ void Unit::stopMovement()
pathIndex = 0;
moveProgress = 0.0f;
state = UnitState::Idle;
currentAction = UnitAction();
clearActionQueue();
clearRoadRoute();
}