Implement target-tile selection and Shift-queueing for all unit actions
This commit is contained in:
@@ -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();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user