diff --git a/activeGameState.cpp b/activeGameState.cpp index 6f26dc6..0865b2c 100755 --- a/activeGameState.cpp +++ b/activeGameState.cpp @@ -391,9 +391,9 @@ namespace battleship{ else{ bool canSelect = canSelectHoveredOnGameObj(); - if(gameObjHoveredOn && gameObjHoveredOn->getPlayer()->getSide() != mainPlayer->getSide()) - issueOrder(Order::TYPE::ATTACK, vector{Order::Target((Unit*)gameObjHoveredOn, Vector3())}, shiftPressed); - else if(controlPressed){ + if(gameObjHoveredOn && (controlPressed || (gameObjHoveredOn->getPlayer()->getSide() != mainPlayer->getSide()))) + issueOrder(Order::TYPE::ATTACK, vector{Order::Target((Unit*)gameObjHoveredOn, gameObjHoveredOn->getPos())}, shiftPressed); + else if(controlPressed && !gameObjHoveredOn){ castRayToTerrain(); issueOrder(Order::TYPE::ATTACK, targets, shiftPressed); } diff --git a/unit.cpp b/unit.cpp index ca0fb98..147d253 100755 --- a/unit.cpp +++ b/unit.cpp @@ -248,6 +248,24 @@ namespace battleship{ } } + void Unit::attack(Order order){ + if(orders[0].targets[0].unit){ + bool unitFound = false; + + for(Player *pl : Game::getSingleton()->getPlayers()){ + vector units = pl->getUnits(); + + if(find(units.begin(), units.end(), orders[0].targets[0].unit) != units.end()){ + unitFound = true; + break; + } + } + + if(!unitFound) + removeOrder(0); + } + } + void Unit::setOrder(Order order) { while (!orders.empty()) removeOrder(0); diff --git a/unit.h b/unit.h index d858dba..3a639f0 100755 --- a/unit.h +++ b/unit.h @@ -107,7 +107,7 @@ namespace battleship{ virtual void initUnitStats(); virtual void executeOrders(); virtual void eject(Order); - virtual void attack(Order){} + virtual void attack(Order); virtual void garrison(Order){} virtual void build(Order){} virtual void move(Order){} diff --git a/vehicle.cpp b/vehicle.cpp index 49f546c..32c59e6 100644 --- a/vehicle.cpp +++ b/vehicle.cpp @@ -189,9 +189,10 @@ namespace battleship{ pursuingTarget = false; } - void Vehicle::navigateToMovingTarget(float minDist){ + void Vehicle::navigateToTarget(float minDist){ if(!pursuingTarget){ - preparePathpoints(orders[0].targets[0].unit->getPos()); + Vector3 targPos = (orders[0].targets[0].unit ? orders[0].targets[0].unit->getPos() : orders[0].targets[0].pos); + preparePathpoints(targPos); pursuingTarget = true; } @@ -204,7 +205,7 @@ namespace battleship{ float distToGarrisonable = pos.getDistanceFrom(targUnit->getPos()); if(distToGarrisonable > garrisonDist) - navigateToMovingTarget(garrisonDist); + navigateToTarget(garrisonDist); else enterGarrisonable(); } @@ -272,20 +273,21 @@ namespace battleship{ } void Vehicle::attack(Order order){ + Unit::attack(order); + Order::Target target = order.targets[0]; float distToTarg = pos.getDistanceFrom(target.unit ? target.unit->getPos() : target.pos); float minDist = range; if(distToTarg > minDist) - navigateToMovingTarget(.5 * Map::getSingleton()->getCellSize().x); - else{ + navigateToTarget(.5 * Map::getSingleton()->getCellSize().x); + else pursuingTarget = false; - if(getTime() - lastFireTime > rateOfFire){ - fire(); + if(distToTarg <= range && getTime() - lastFireTime > rateOfFire){ + fire(); - lastFireTime = getTime(); - } + lastFireTime = getTime(); } } diff --git a/vehicle.h b/vehicle.h index ac217f4..688a509 100644 --- a/vehicle.h +++ b/vehicle.h @@ -29,7 +29,7 @@ namespace battleship{ inline int getNextPatrolPointId(int numPoints) {return patrolPointId == numPoints - 1 ? 0 : patrolPointId + 1;} void enterGarrisonable(); float calculateRotation(vb01::Vector3, float); - void navigateToMovingTarget(float); + void navigateToTarget(float); void halt(); void turn(float); void addOrder(Order);