Skip to content

Commit

Permalink
When checking for Counterbattery response, use the sensor list instead
Browse files Browse the repository at this point in the history
of doing a grid check on a constant range. Also allow using allied
counterbattery sensors now.
  • Loading branch information
perim committed Mar 4, 2012
1 parent 6484dca commit 70c5bd3
Showing 1 changed file with 15 additions and 37 deletions.
52 changes: 15 additions & 37 deletions src/combat.cpp
Expand Up @@ -350,55 +350,33 @@ void counterBatteryFire(BASE_OBJECT *psAttacker, BASE_OBJECT *psTarget)
projectile is sent - we may have to cater for these at some point*/
// also ignore cases where you attack your own player
// Also ignore cases where there are already 1000 missiles heading towards the attacker.
if ((psTarget == NULL) ||
((psAttacker != NULL) && (psAttacker->player == psTarget->player)) ||
aiObjectIsProbablyDoomed(psAttacker))
if (psTarget == NULL
|| (psAttacker != NULL && psAttacker->player == psTarget->player)
|| aiObjectIsProbablyDoomed(psAttacker))
{
return;
}

CHECK_OBJECT(psTarget);

gridStartIterate(psTarget->pos.x, psTarget->pos.y, PREVIOUS_DEFAULT_GRID_SEARCH_RADIUS);
for (psViewer = gridIterate(); psViewer != NULL; psViewer = gridIterate())
for (psViewer = apsSensorList[0]; psViewer; psViewer = psViewer->psNextFunc)
{
STRUCTURE *psStruct;
DROID *psDroid;
SDWORD sensorRange = 0;

if (psViewer->player != psTarget->player)
{
//ignore non target players' objects
continue;
}
if (psViewer->type == OBJ_STRUCTURE)
{
psStruct = (STRUCTURE *)psViewer;
//check if have a sensor of correct type
if (structCBSensor(psStruct) || structVTOLCBSensor(psStruct))
{
sensorRange = psStruct->pStructureType->pSensor->range;
}
}
else if (psViewer->type == OBJ_DROID)
if (aiCheckAlliances(psTarget->player, psViewer->player))
{
psDroid = (DROID *)psViewer;
//must be a CB sensor
if (cbSensorDroid(psDroid))
if ((psViewer->type == OBJ_STRUCTURE && !structCBSensor((STRUCTURE *)psViewer))
|| (psViewer->type == OBJ_DROID && !cbSensorDroid((DROID *)psViewer)))
{
sensorRange = asSensorStats[psDroid->asBits[COMP_SENSOR].
nStat].range;
continue;
}
}
//check sensor distance from target
if (sensorRange)
{
SDWORD xDiff = (SDWORD)psViewer->pos.x - (SDWORD)psTarget->pos.x;
SDWORD yDiff = (SDWORD)psViewer->pos.y - (SDWORD)psTarget->pos.y;
const int sensorRange = objSensorRange(psViewer);

// Check sensor distance from target
const int xDiff = psViewer->pos.x - psTarget->pos.x;
const int yDiff = psViewer->pos.y - psTarget->pos.y;

if (xDiff*xDiff + yDiff*yDiff < sensorRange * sensorRange)
if (xDiff * xDiff + yDiff * yDiff < sensorRange * sensorRange)
{
//inform viewer of target
// Inform viewer of target
if (psViewer->type == OBJ_DROID)
{
orderDroidObj((DROID *)psViewer, DORDER_OBSERVE, psAttacker, ModeImmediate);
Expand Down

0 comments on commit 70c5bd3

Please sign in to comment.