diff --git a/unit.cpp b/unit.cpp index fcee7e1..8c17a1d 100755 --- a/unit.cpp +++ b/unit.cpp @@ -356,46 +356,44 @@ namespace battleship{ //TODO remove order argument from action methods void Unit::executeOrders() { - if(condition != Condition::ABLE) return; + if(orders.empty() || condition != Condition::ABLE) return; - if (orders.size() > 0) { - Order order = orders[0]; + if(!currOrderStarted) startCurrentOrder(); - switch (order.type) { - case Order::TYPE::ATTACK: - attack(order); - break; - case Order::TYPE::BUILD: - build(order); - break; - case Order::TYPE::MOVE: - move(order); - break; - case Order::TYPE::GARRISON: - garrison(order); - break; - case Order::TYPE::EJECT: - eject(order); - break; - case Order::TYPE::PATROL: - patrol(order); - break; - case Order::TYPE::LAUNCH: - launch(order); - break; - break; - case Order::TYPE::LOAD: - case Order::TYPE::SUPPLY: - case Order::TYPE::UNLOAD: - handleResources(order); - break; - case Order::TYPE::HACK: - hack(order); - break; - default: - break; - } - } + switch (orders[0].type) { + case Order::TYPE::ATTACK: + attack(orders[0]); + break; + case Order::TYPE::BUILD: + build(orders[0]); + break; + case Order::TYPE::MOVE: + move(orders[0]); + break; + case Order::TYPE::GARRISON: + garrison(orders[0]); + break; + case Order::TYPE::EJECT: + eject(orders[0]); + break; + case Order::TYPE::PATROL: + patrol(orders[0]); + break; + case Order::TYPE::LAUNCH: + launch(orders[0]); + break; + break; + case Order::TYPE::LOAD: + case Order::TYPE::SUPPLY: + case Order::TYPE::UNLOAD: + handleResources(orders[0]); + break; + case Order::TYPE::HACK: + hack(orders[0]); + break; + default: + break; + } } void Unit::eject(Order order){ @@ -547,6 +545,7 @@ namespace battleship{ LineRenderer::getSingleton()->removeLine(orders[id].lineId); orders.erase(orders.begin() + id); + currOrderStarted = false; } void Unit::select() { diff --git a/unit.h b/unit.h index 1c1bf0e..958692f 100755 --- a/unit.h +++ b/unit.h @@ -159,7 +159,7 @@ namespace battleship{ sf::SoundBuffer *selectionSfxBuffer; sf::Sound *selectionSfx = nullptr; vb01::Node *hpBackgroundNode = nullptr, *hpForegroundNode = nullptr, *losLightNode = nullptr; - bool vehicle; + bool vehicle, currOrderStarted = false; Condition condition = Condition::ABLE; protected: UnitClass unitClass; @@ -178,6 +178,7 @@ namespace battleship{ void placeAt(vb01::Vector3); std::vector getSelectingPlayers(); void removeOrder(int); + virtual void startCurrentOrder(){currOrderStarted = true;} virtual bool validateLaunchOrder(){return !getWeaponsByOrder(Order::TYPE::LAUNCH).empty();} virtual bool validateGarrisonOrder(Order){return false;} virtual void targetUnitsAutomatically(); diff --git a/vehicle.cpp b/vehicle.cpp index 2d540f6..68d5a43 100644 --- a/vehicle.cpp +++ b/vehicle.cpp @@ -42,6 +42,17 @@ namespace battleship{ pursuingTarget = false; } + void Vehicle::startCurrentOrder(){ + Unit::startCurrentOrder(); + + if(orders[0].type == Order::TYPE::LAUNCH) return; + + removeAllPathpoints(); + + Vector3 targPos = (orders[0].targets[0].unit ? orders[0].targets[0].unit->getPos() : orders[0].targets[0].pos); + preparePathpoints(orders[0], targPos); + } + bool Vehicle::validateGarrisonOrder(Order order){ Unit *targUnit = order.targets[0].unit; @@ -157,10 +168,7 @@ namespace battleship{ } void Vehicle::move(Order order) { - if(pathPoints.empty()) - preparePathpoints(order, order.targets[0].pos); - else - navigate(0.5 * Map::getSingleton()->getCellSize().x); + navigate(0.5 * Map::getSingleton()->getCellSize().x); if(type == UnitType::LAND) alignToSurface(); diff --git a/vehicle.h b/vehicle.h index 7e35a27..3edbb26 100644 --- a/vehicle.h +++ b/vehicle.h @@ -25,6 +25,7 @@ namespace battleship{ vb01::s64 lastBuildTime = 0; inline int getNextPatrolPointId(int numPoints) {return patrolPointId == numPoints - 1 ? 0 : patrolPointId + 1;} + void startCurrentOrder(); bool validateGarrisonOrder(Order); void enterGarrisonable(); void halt();