// give move orders to units along previously generated pathToTarget void CAttackGroup::MoveAlongPath(float3& groupPosition, int numUnits) { const int maxStepsAhead = 8; int pathMaxIndex = (int) pathToTarget.size() - 1; int step1 = std::min(pathIterator + maxStepsAhead / 2, pathMaxIndex); int step2 = std::min(pathIterator + maxStepsAhead, pathMaxIndex); const float3& moveToHereFirst = pathToTarget[step1]; const float3& moveToHere = pathToTarget[step2]; // if we aren't there yet if (groupPosition.distance2D(pathToTarget[pathMaxIndex]) > GROUP_DESTINATION_SLACK) { // TODO: give a group the order instead of each unit assert(numUnits >= 0); for (unsigned int i = 0; i < (unsigned int)numUnits; i++) { CUNIT* unit = ai->GetUnit(units[i]); if (ai->cb->GetUnitDef(unit->uid) != NULL) { // TODO: when they are near target, change this so they eg. line up // while some are here and some aren't, there's also something that // should be done with the units in front that are given the same // order+shiftorder and skittle around back and forth meanwhile if // the single unit isn't there yet if ((unit->pos()).distance2D(pathToTarget[pathMaxIndex]) > UNIT_DESTINATION_SLACK) { unit->Move(moveToHereFirst); if (moveToHere != moveToHereFirst) { unit->MoveShift(moveToHere); } } } } // if group is as close as the pathiterator-indicated target // is to the end of the path, increase pathIterator pathIterator = 0; float3 endOfPathPos = pathToTarget[pathMaxIndex]; float groupDistanceToEnemy = groupPosition.distance2D(endOfPathPos); float pathIteratorTargetDistanceToEnemy = pathToTarget[pathIterator].distance2D(endOfPathPos); int increment = maxStepsAhead / 2; while (groupDistanceToEnemy <= pathIteratorTargetDistanceToEnemy && pathIterator < pathMaxIndex) { pathIterator = std::min(pathIterator + increment, pathMaxIndex); pathIteratorTargetDistanceToEnemy = pathToTarget[pathIterator].distance2D(endOfPathPos); } pathIterator = std::min(pathIterator, pathMaxIndex); } else { // group thinks it has arrived at the destination this->ClearTarget(); } }