/* Make droid/structure look for a better target */ static bool updateAttackTarget(BASE_OBJECT *psAttacker, SDWORD weapon_slot) { BASE_OBJECT *psBetterTarget = NULL; TARGET_ORIGIN tmpOrigin = ORIGIN_UNKNOWN; if (aiChooseTarget(psAttacker, &psBetterTarget, weapon_slot, true, &tmpOrigin)) //update target { if (psAttacker->type == OBJ_DROID) { DROID *psDroid = (DROID *)psAttacker; if ((orderState(psDroid, DORDER_NONE) || orderState(psDroid, DORDER_GUARD) || orderState(psDroid, DORDER_ATTACKTARGET)) && weapon_slot == 0) { actionDroid((DROID *)psAttacker, DACTION_ATTACK, psBetterTarget); } else //can't override current order { setDroidActionTarget(psDroid, psBetterTarget, weapon_slot); } } else if (psAttacker->type == OBJ_STRUCTURE) { STRUCTURE *psBuilding = (STRUCTURE *)psAttacker; setStructureTarget(psBuilding, psBetterTarget, weapon_slot, tmpOrigin); } return true; } return false; }
/* Make droid/structure look for a better target */ static BOOL updateAttackTarget(BASE_OBJECT * psAttacker, SDWORD weapon_slot) { BASE_OBJECT *psBetterTarget=NULL; UWORD tmpOrigin = ORIGIN_UNKNOWN; if(aiChooseTarget(psAttacker, &psBetterTarget, weapon_slot, true, &tmpOrigin)) //update target { if(psAttacker->type == OBJ_DROID) { DROID *psDroid = (DROID *)psAttacker; if( (orderState(psDroid, DORDER_NONE) || orderState(psDroid, DORDER_GUARD) || orderState(psDroid, DORDER_ATTACKTARGET)) && weapon_slot == 0) //Watermelon:only primary slot(0) updates affect order { orderDroidObj((DROID *)psAttacker, DORDER_ATTACKTARGET, psBetterTarget); } else //can't override current order { setDroidActionTarget(psDroid, psBetterTarget, weapon_slot); } } else if (psAttacker->type == OBJ_STRUCTURE) { STRUCTURE *psBuilding = (STRUCTURE *)psAttacker; setStructureTarget(psBuilding, psBetterTarget, weapon_slot, tmpOrigin); } return true; } return false; }
/*checks through the target players list of structures and droids to see if any support a counter battery sensor*/ void counterBatteryFire(BASE_OBJECT *psAttacker, BASE_OBJECT *psTarget) { /*if a null target is passed in ignore - this will be the case when a 'miss' 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 == nullptr || (psAttacker != nullptr && psAttacker->player == psTarget->player) || (psAttacker != nullptr && aiObjectIsProbablyDoomed(psAttacker, false))) { return; } CHECK_OBJECT(psTarget); for (BASE_OBJECT *psViewer = apsSensorList[0]; psViewer; psViewer = psViewer->psNextFunc) { if (aiCheckAlliances(psTarget->player, psViewer->player)) { if ((psViewer->type == OBJ_STRUCTURE && !structCBSensor((STRUCTURE *)psViewer)) || (psViewer->type == OBJ_DROID && !cbSensorDroid((DROID *)psViewer))) { continue; } 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) { // Inform viewer of target if (psViewer->type == OBJ_DROID) { orderDroidObj((DROID *)psViewer, DORDER_OBSERVE, psAttacker, ModeImmediate); } else if (psViewer->type == OBJ_STRUCTURE) { setStructureTarget((STRUCTURE *)psViewer, psAttacker, 0, ORIGIN_CB_SENSOR); } } } } }