Index: src/action.c
===================================================================
--- src/action.c	(revision 5990)
+++ src/action.c	(working copy)
@@ -135,7 +135,8 @@
 		"DACTION_RETURNTOPOS",			// (38) used by scout/patrol order when returning to route
 		"DACTION_FIRESUPPORT_RETREAT",	// (39) used by firesupport order when sensor retreats
 		"ACTION UNKNOWN",
-		"DACTION_CIRCLE"				// (41) circling while engaging
+		"DACTION_CIRCLE",				// (41) circling while engaging
+		"DACTION_DROIDSELFREPAIR",
 	};
 
 	ASSERT(action < sizeof(name) / sizeof(name[0]), "DROID_ACTION out of range: %u", action);
@@ -997,11 +998,11 @@
 	STRUCTURE_STATS		*psStructStats;
 	BASE_OBJECT			*psTarget;
 	WEAPON_STATS		*psWeapStats;
-	SDWORD				targetDir, dirDiff, pbx,pby;
+	SDWORD				pbx, pby;
 	SDWORD				xdiff,ydiff, rangeSq;
 	SECONDARY_STATE			state;
 	PROPULSION_STATS	*psPropStats;
-	BOOL				bChaseBloke, bInvert;
+	BOOL				bInvert;
 	FEATURE				*psNextWreck;
 	BOOL				(*actionUpdateFunc)(DROID *psDroid) = NULL;
 	SDWORD				moveAction;
@@ -1010,8 +1011,6 @@
 	UBYTE	 i = 0;
 	//this is a bit field
 	UBYTE	 num_weapons = 0;
-	BASE_OBJECT			*psTargets[DROID_MAXWEAPS];
-	UBYTE	j,iVisible = 1;
 	BOOL	bHasTarget;
 
 	CHECK_DROID(psDroid);
@@ -1070,20 +1069,69 @@
 		}
 	}
 
-	if (psDroid->numWeaps > 1)
+	// Attacks of opportunity
+	for (i = 0; i < psDroid->numWeaps; i++)
 	{
-		for(i = 0;i < psDroid->numWeaps;i++)
+		bool unsetTarget = false;
+		
+		psWeapStats = asWeaponStats + psDroid->asWeaps[i].nStat;
+
+		// TODO: Check psWeapStats->fireOnMove != FOM_NO?
+		if (psDroid->asWeaps[i].nStat <= 0 || isVtolDroid(psDroid) || !psWeapStats->rotate)
 		{
-			if (psDroid->asWeaps[i].nStat > 0)
+			continue;	// not a weapon, is vtol, or cannot rotate turret
+		}
+
+		if (psDroid->psActionTarget[i])
+		{
+			if (!validTarget((BASE_OBJECT *)psDroid, psDroid->psActionTarget[i], i)
+			    || !actionVisibleTarget(psDroid, psDroid->psActionTarget[i], i))
 			{
-				num_weapons += (1 << (i+1));
+				unsetTarget = true;
 			}
+			if (i > 0 && !actionInRange(psDroid, psDroid->psActionTarget[i], i))
+			{
+				unsetTarget = true;	// unset sidearm if out of range
+			}
 		}
+
+		if (unsetTarget && i == 0)	// main target gone, reconsider action?
+		{
+			switch (psDroid->action)
+			{
+			case DACTION_ATTACK:
+			case DACTION_MOVETOATTACK:
+				psDroid->action = DACTION_NONE;
+				break;
+			}
+			setDroidActionTarget(psDroid, NULL, i);
+		}
+
+		if (!psDroid->psActionTarget[i])
+		{
+			// Acquire a target
+			aiBestNearestTarget(psDroid, &psDroid->psActionTarget[i], i);
+		}
+
+		if (psDroid->psActionTarget[i])
+		{
+			// Fire or rotate turret
+			if (actionTargetTurret((BASE_OBJECT *)psDroid, psDroid->psActionTarget[i], &(psDroid->turretRotation[i]), &(psDroid->turretPitch[i]), 
+			                       &asWeaponStats[psDroid->asWeaps[i].nStat], bInvert, i))
+			{
+				// We have a target and this turret is aligned on it - so fire!
+				combFire(&psDroid->asWeaps[i], (BASE_OBJECT *)psDroid, psDroid->psActionTarget[i], i);
+			}
+		}
+		else
+		{
+			// Reset turret orientation
+			if (psDroid->turretRotation[i] != 0 || psDroid->turretPitch[i] != 0)
+			{
+				actionAlignTurret((BASE_OBJECT *)psDroid, i);
+			}
+		}
 	}
-	else
-	{
-		num_weapons = 2;
-	}
 
 	psTarget = psDroid->psTarget;
 
@@ -1175,41 +1223,6 @@
 			psScrCBOrderDroid = NULL;
 			psScrCBOrder = DORDER_NONE;
 		}
-
-		//Watermelon:added multiple weapon check
-		else if (psDroid->numWeaps > 0)
-		{
-			for(i = 0;i < psDroid->numWeaps;i++)
-			{
-				if ( (num_weapons & (1 << (i+1))) )
-				{
-					BASE_OBJECT *psTemp = NULL;
-
-					//Watermelon:I moved psWeapStats flag update there
-					psWeapStats = asWeaponStats + psDroid->asWeaps[i].nStat;
-					if (!isVtolDroid(psDroid) &&
-						psDroid->asWeaps[i].nStat > 0 &&
-						psWeapStats->rotate &&
-						psWeapStats->fireOnMove != FOM_NO &&
-						CAN_UPDATE_NAYBORS(psDroid) &&
-						(aiBestNearestTarget(psDroid, &psTemp, i) >= 0))
-					{
-						if (secondaryGetState(psDroid, DSO_ATTACK_LEVEL, &state))
-						{
-							if (state == DSS_ALEV_ALWAYS)
-							{
-								psDroid->action = DACTION_MOVEFIRE;
-							}
-						}
-						else
-						{
-							psDroid->action = DACTION_MOVEFIRE;
-						}
-					}
-					setDroidActionTarget(psDroid, psTemp, 0);
-				}
-			}
-		}
 		break;
 	case DACTION_RETURNTOPOS:
 	case DACTION_FIRESUPPORT_RETREAT:
@@ -1230,143 +1243,17 @@
 			moveToRearm(psDroid);
 		}
 
-		bHasTarget = false;
-		//loop through weapons and look for target for each weapon
-		for (i = 0;i < psDroid->numWeaps;i++)
-		{
-			if (psDroid->psActionTarget[i] == NULL)
-			{
-				BASE_OBJECT *psTemp;
-
-				if (aiBestNearestTarget(psDroid, &psTemp, i) >= 0)
-				{
-					bHasTarget = true;
-					setDroidActionTarget(psDroid, psTemp, i);
-				}
-			}
-
-			if (psDroid->psActionTarget[i] &&
-				visibleObject((BASE_OBJECT*)psDroid, psDroid->psActionTarget[i], false))
-			{
-				iVisible += (1 << (i+1));
-			}
-		}
-
-		for (j = 0;j < psDroid->numWeaps;j++)
-		{
-			//Watermelon:vtResult uses psActionTarget[0] for now since it's the first target
-			if (psDroid->psActionTarget[j] != NULL &&
-				validTarget((BASE_OBJECT *)psDroid, psDroid->psActionTarget[j], j))
-			{
-				// firing on something while moving
-				if (DROID_STOPPED(psDroid))
-				{
-					// Got to desitination
-					psDroid->action = DACTION_NONE;
-					break;
-				}
-				else if ((psDroid->psActionTarget[j] == NULL) ||
-						!validTarget((BASE_OBJECT *)psDroid, psDroid->psActionTarget[j], j) ||
-						(secondaryGetState(psDroid, DSO_ATTACK_LEVEL, &state) && (state != DSS_ALEV_ALWAYS)))
-				{
-					if (j == (psDroid->numWeaps - 1) && !bHasTarget)
-					{
-						// Target lost
-						psDroid->action = DACTION_MOVE;
-					}
-					else
-					{
-						continue;
-					}
-					//if Vtol - return to rearm pad
-					/*if (isVtolDroid(psDroid))
-					{
-						moveToRearm(psDroid);
-					}*/
-				}
-				//check the target hasn't become one the same player ID - eg Electronic Warfare
-				else if	(electronicDroid(psDroid) &&
-						(psDroid->player == psDroid->psActionTarget[j]->player))
-				{
-					setDroidActionTarget(psDroid, NULL, i);
-					psDroid->action = DACTION_NONE;
-				}
-				else
-				{
-					if (iVisible == 1 && !bHasTarget && j == (psDroid->numWeaps - 1))
-					{
-						// lost the target
-						psDroid->action = DACTION_MOVE;
-						for (i = 0;i < psDroid->numWeaps;i++)
-						{
-							setDroidActionTarget(psDroid, NULL, i);
-						}
-					}
-
-					if (iVisible & (1 << (j+1)))
-					{
-						bHasTarget = true;
-						//Watermelon:I moved psWeapStats flag update there
-						psWeapStats = asWeaponStats + psDroid->asWeaps[j].nStat;
-						//Watermelon:to fix a AA-weapon attack ground unit exploit
-						if ( (num_weapons & (1 << (j+1))) )
-						{
-							BASE_OBJECT* psActionTarget;
-
-							if (psDroid->psActionTarget[j])
-							{
-								psActionTarget = psDroid->psActionTarget[j];
-							}
-							else
-							{
-								psActionTarget = psDroid->psActionTarget[0];
-							}
-
-							if (validTarget((BASE_OBJECT *)psDroid, psActionTarget, j))
-							{
-								if (actionTargetTurret((BASE_OBJECT*)psDroid, psActionTarget,
-														&(psDroid->turretRotation[j]), &(psDroid->turretPitch[j]),
-														&asWeaponStats[psDroid->asWeaps[j].nStat],
-														bInvert,j))
-								{
-									// In range - fire !!!
-									combFire(&psDroid->asWeaps[j], (BASE_OBJECT *)psDroid,
-											psActionTarget, j);
-								}
-							}
-							else
-							{
-								if ((iVisible & 2) && validTarget((BASE_OBJECT *)psDroid, psDroid->psActionTarget[0], j))
-								{
-									if (actionTargetTurret((BASE_OBJECT*)psDroid, psDroid->psActionTarget[0],
-															&(psDroid->turretRotation[j]), &(psDroid->turretPitch[j]),
-															&asWeaponStats[psDroid->asWeaps[j].nStat],
-															bInvert,j))
-									{
-										// In range - fire !!!
-										combFire(&psDroid->asWeaps[j], (BASE_OBJECT *)psDroid,
-												psDroid->psActionTarget[0], j);
-									}
-								}
-							}
-						}
-					}
-				}
-			}
-		}
-
 		//check its a VTOL unit since adding Transporter's into multiPlayer
 		/* check vtol attack runs */
 		if (isVtolDroid(psDroid))
 		{
 			actionUpdateVtolAttack( psDroid );
 		}
-
 		break;
 
 	case DACTION_ATTACK:
-		ASSERT( psDroid->psActionTarget[0] != NULL,
-			"actionUpdateUnit: target is NULL while attacking" );
+		// Reconsider main target, turn, pursue, etc..
+		ASSERT(psDroid->psActionTarget[0] != NULL, "target is NULL while attacking");
 
 		// don't wan't formations for this one
 		if (psDroid->sMove.psFormation)
@@ -1375,99 +1262,43 @@
 			psDroid->sMove.psFormation = NULL;
 		}
 
-		//check the target hasn't become one the same player ID - Electronic Warfare
-		if ((electronicDroid(psDroid) && (psDroid->player == psDroid->psActionTarget[0]->player)))
-		{
-			for (i = 0;i < psDroid->numWeaps;i++)
-			{
-				setDroidActionTarget(psDroid, NULL, i);
-			}
-			psDroid->action = DACTION_NONE;
-			break;
-		}
-
 		bHasTarget = false;
-		for(i = 0;i < psDroid->numWeaps;i++)
-		{
-			BASE_OBJECT* psActionTarget;
 
-			//Skip main turret target changes
-			if (i > 0 &&
-				psDroid->psActionTarget[i] == NULL &&
-				aiChooseTarget((BASE_OBJECT*)psDroid, &psTargets[i], i, false))
-			{
-				setDroidActionTarget(psDroid, psTargets[i], i);
-			}
-
-			if (psDroid->psActionTarget[i])
-			{
-				psActionTarget = psDroid->psActionTarget[i];
-			}
-			else
-			{
-				psActionTarget = psDroid->psActionTarget[0];
-			}
-
-			if ( (num_weapons & (1 << (i+1))) &&
-				actionVisibleTarget(psDroid, psActionTarget, i) &&
-				actionInRange(psDroid, psActionTarget, i))
-			{
-				bHasTarget = true;
-				psWeapStats = asWeaponStats + psDroid->asWeaps[i].nStat;
-				if (validTarget((BASE_OBJECT *)psDroid, psActionTarget, i))
-				{
-					if (!psWeapStats->rotate)
-					{
-						// no rotating turret - need to check aligned with target
-						targetDir = (SDWORD)calcDirection(
-										psDroid->pos.x,psDroid->pos.y,
-										psActionTarget->pos.x, psActionTarget->pos.y);
-						dirDiff = labs(targetDir - (SDWORD)psDroid->direction);
-					}
-					else
-					{
-						dirDiff = 0;
-					}
-					if (dirDiff > FIXED_TURRET_DIR)
-					{
-						if (psDroid->sMove.Status != MOVESHUFFLE)
-						{
-							psDroid->action = DACTION_ROTATETOATTACK;
-							moveTurnDroid(psDroid, psActionTarget->pos.x, psActionTarget->pos.y);
-						}
-					}
-					else if (!psWeapStats->rotate ||
-							actionTargetTurret((BASE_OBJECT*)psDroid, psActionTarget,
-												&(psDroid->turretRotation[i]), &(psDroid->turretPitch[i]),
-												&asWeaponStats[psDroid->asWeaps[i].nStat],
-												bInvert,i))
-					{
-						/* In range - fire !!! */
-						combFire(&psDroid->asWeaps[i], (BASE_OBJECT *)psDroid, psActionTarget, i);
-					}
-				}
-			}
-		}
-
-		if (!bHasTarget)
+		// Pursue?
+		if (!actionInRange(psDroid, psDroid->psActionTarget[0], i))
 		{
-			if (((psDroid->order == DORDER_ATTACKTARGET
-			   || psDroid->order == DORDER_FIRESUPPORT)
-			  && secondaryGetState(psDroid, DSO_HALTTYPE, &state)
-			  && (state == DSS_HALT_HOLD))
-			 || (!isVtolDroid(psDroid)
-			  && (psTarget = orderStateObj(psDroid, DORDER_FIRESUPPORT))
-			  && psTarget->type == OBJ_STRUCTURE))
+			if (((psDroid->order == DORDER_ATTACKTARGET || psDroid->order == DORDER_FIRESUPPORT)
+			     && secondaryGetState(psDroid, DSO_HALTTYPE, &state)
+			     && (state == DSS_HALT_HOLD))
+			    || (!isVtolDroid(psDroid)
+			        && (psTarget = orderStateObj(psDroid, DORDER_FIRESUPPORT))
+			        && psTarget->type == OBJ_STRUCTURE))
 			{
 				// don't move if on hold or firesupport for a sensor tower
 				psDroid->action = DACTION_NONE;				// holding, cancel the order.
+				setDroidActionTarget(psDroid, NULL, 0);
 			}
 			else
 			{
 				psDroid->action = DACTION_MOVETOATTACK;	// out of range - chase it
 			}
 		}
+		if (!psWeapStats->rotate)
+		{
+			int dirDiff, targetDir;
 
+			// no rotating turret - need to check aligned with target
+			targetDir = (SDWORD)calcDirection(psDroid->pos.x,psDroid->pos.y, psDroid->psActionTarget[0]->pos.x, psDroid->psActionTarget[0]->pos.y);
+			dirDiff = labs(targetDir - (SDWORD)psDroid->direction);
+			if (dirDiff > FIXED_TURRET_DIR)
+			{
+				if (psDroid->sMove.Status != MOVESHUFFLE)
+				{
+					psDroid->action = DACTION_ROTATETOATTACK;
+					moveTurnDroid(psDroid, psDroid->psActionTarget[0]->pos.x, psDroid->psActionTarget[0]->pos.y);
+				}
+			}
+		}
 		break;
 
 	case DACTION_VTOLATTACK:
@@ -1570,7 +1401,6 @@
 		break;
 
 	case DACTION_MOVETOATTACK:
-
 		// don't wan't formations for this one
 		if (psDroid->sMove.psFormation)
 		{
@@ -1588,91 +1418,31 @@
 
 		ASSERT(psDroid->psActionTarget[0] != NULL, "action update move to attack target is NULL");
 
-		//check the target hasn't become one the same player ID - Electronic Warfare
-		if ((electronicDroid(psDroid) && (psDroid->player == psDroid->psActionTarget[0]->player)) ||
-			!validTarget((BASE_OBJECT *)psDroid, psDroid->psActionTarget[0], 0) )
+		if (!isVtolDroid(psDroid) && psDroid->psActionTarget[0]->type == OBJ_DROID && ((DROID *)psDroid->psActionTarget[0])->droidType == DROID_PERSON && psWeapStats->fireOnMove != FOM_NO)
 		{
-			for (i = 0;i < psDroid->numWeaps;i++)
-			{
-				setDroidActionTarget(psDroid, NULL, i);
-			}
-			psDroid->action = DACTION_NONE;
+			// Run over
 		}
 		else
 		{
-			if (actionVisibleTarget(psDroid, psDroid->psActionTarget[0], 0))
+			if (actionInAttackRange(psDroid, psDroid->psActionTarget[0], i))
 			{
-				for(i = 0;i < psDroid->numWeaps;i++)
+				/* init vtol attack runs count if necessary */
+				if (psPropStats->propulsionType == PROPULSION_TYPE_LIFT)
 				{
-					if( (num_weapons & (1 << (i+1))) &&
-						validTarget((BASE_OBJECT *)psDroid, psDroid->psActionTarget[0], i) &&
-						actionVisibleTarget(psDroid, psDroid->psActionTarget[0], i) )
-					{
-						psWeapStats = asWeaponStats + psDroid->asWeaps[i].nStat;
-						if (psWeapStats->rotate)
-						{
-							actionTargetTurret((BASE_OBJECT*)psDroid, psDroid->psActionTarget[0],
-													&(psDroid->turretRotation[i]), &(psDroid->turretPitch[i]),
-													&asWeaponStats[psDroid->asWeaps[i].nStat],
-													bInvert,i);
-						}
-
-						bChaseBloke = false;
-						if (!isVtolDroid(psDroid) &&
-							psDroid->psActionTarget[0]->type == OBJ_DROID &&
-							((DROID *)psDroid->psActionTarget[0])->droidType == DROID_PERSON &&
-							psWeapStats->fireOnMove != FOM_NO)
-						{
-							bChaseBloke = true;
-						}
-
-
-						if ( (actionInAttackRange(psDroid, psDroid->psActionTarget[0], i)) &&
-							!bChaseBloke)
-						{
-							/* Stop the droid moving any closer */
-		//				    ASSERT( psDroid->pos.x != 0 && psDroid->pos.y != 0,
-		//						"moveUpdateUnit: Unit at (0,0)" );
-
-							/* init vtol attack runs count if necessary */
-							if ( psPropStats->propulsionType == PROPULSION_TYPE_LIFT )
-							{
-								psDroid->action = DACTION_VTOLATTACK;
-								//actionAddVtolAttackRun( psDroid );
-								//actionUpdateVtolAttack( psDroid );
-							}
-							else
-							{
-								moveStopDroid(psDroid);
-
-								if (psWeapStats->rotate)
-								{
-									psDroid->action = DACTION_ATTACK;
-								}
-								else
-								{
-									psDroid->action = DACTION_ROTATETOATTACK;
-									moveTurnDroid(psDroid, psDroid->psActionTarget[0]->pos.x,psDroid->psActionTarget[0]->pos.y);
-								}
-							}
-						}
-						else if ( actionInRange(psDroid, psDroid->psActionTarget[0], i) )
-						{
-							// fire while closing range
-							combFire(&psDroid->asWeaps[i], (BASE_OBJECT *)psDroid, psDroid->psActionTarget[0], i);
-						}
-					}
+					psDroid->action = DACTION_VTOLATTACK;
 				}
-			}
-			else
-			{
-				for(i = 0;i < psDroid->numWeaps;i++)
+				else
 				{
-					if ((psDroid->turretRotation[i] != 0) ||
-						(psDroid->turretPitch[i] != 0))
+					moveStopDroid(psDroid);
+					if (psWeapStats->rotate)
 					{
-						actionAlignTurret((BASE_OBJECT *)psDroid, i);
+						psDroid->action = DACTION_ATTACK;
 					}
+					else
+					{
+						psDroid->action = DACTION_ROTATETOATTACK;
+						moveTurnDroid(psDroid, psDroid->psActionTarget[0]->pos.x,psDroid->psActionTarget[0]->pos.y);
+					}
 				}
 			}
 
@@ -1730,7 +1500,6 @@
 		break;
 
 	case DACTION_ROTATETOATTACK:
-//		if (DROID_STOPPED(psDroid))
 		if (psDroid->sMove.Status != MOVETURNTOTARGET)
 		{
 			psDroid->action = DACTION_ATTACK;
@@ -2296,6 +2065,12 @@
 			moveDroidTo(psDroid, psDroid->actionX, psDroid->actionY);
 		}
 		break;
+	case DACTION_DROIDSELFREPAIR:
+		if (!droidUpdateDroidRepair(psDroid, psDroid))
+		{
+			psDroid->action = DACTION_NONE;
+		}
+		break;
 	case DACTION_DROIDREPAIR:
 		//if not doing self-repair
 		//Watermelon:use 0 for repair droid
@@ -2330,7 +2105,7 @@
 		}
 		else
 		{
-			if (!droidUpdateDroidRepair(psDroid))
+			if (!droidUpdateDroidRepair(psDroid, (DROID *)psDroid->psActionTarget[0]))
 			{
 				psDroid->action = DACTION_NONE;
 				//if the order is RTR then resubmit order so that the unit will go to repair facility point
Index: src/action.h
===================================================================
--- src/action.h	(revision 5990)
+++ src/action.h	(working copy)
@@ -84,6 +84,7 @@
 	DACTION_RETURNTOPOS,				///< 38 used by scout/patrol order when returning to route
 	DACTION_FIRESUPPORT_RETREAT,			///< 39 used by firesupport order when sensor retreats
 	DACTION_CIRCLE = 41,				///< 41 circling while engaging
+	DACTION_DROIDSELFREPAIR,			///< 42 start self-repair
 } DROID_ACTION;
 
 extern const char* getDroidActionName(DROID_ACTION action);
Index: src/droid.c
===================================================================
--- src/droid.c	(revision 5990)
+++ src/droid.c	(working copy)
@@ -1535,8 +1535,7 @@
 		{
 			if (psDroid->asBits[COMP_REPAIRUNIT].nStat != 0)
 			{
-				psDroid->action = DACTION_DROIDREPAIR;
-				setDroidActionTarget(psDroid, (BASE_OBJECT *)psDroid, 0);
+				psDroid->action = DACTION_DROIDSELFREPAIR;
 				psDroid->actionStarted = gameTime;
 				psDroid->actionPoints  = 0;
 			}
@@ -1735,20 +1734,17 @@
 }
 
 /*Updates a Repair Droid working on a damaged droid*/
-BOOL droidUpdateDroidRepair(DROID *psRepairDroid)
+BOOL droidUpdateDroidRepair(DROID *psRepairDroid, DROID *psDroidToRepair)
 {
-	DROID		*psDroidToRepair;
 	UDWORD		iPointsToAdd, iRepairPoints, powerCost;
 	Vector3i iVecEffect;
 
 	CHECK_DROID(psRepairDroid);
 
-	ASSERT( psRepairDroid->action == DACTION_DROIDREPAIR,
+	ASSERT( psRepairDroid->action == DACTION_DROIDREPAIR || psRepairDroid->action == DACTION_DROIDSELFREPAIR,
 		"unitUpdateUnitRepair: unit does not have unit repair order" );
 	ASSERT( psRepairDroid->asBits[COMP_REPAIRUNIT].nStat != 0,
 		"unitUpdateUnitRepair: unit does not have a repair turret" );
-
-	psDroidToRepair = (DROID *)psRepairDroid->psActionTarget[0];
 	ASSERT( psDroidToRepair->type == OBJ_DROID,
 		"unitUpdateUnitRepair: target is not a unit" );
 
Index: src/droid.h
===================================================================
--- src/droid.h	(revision 5990)
+++ src/droid.h	(working copy)
@@ -180,7 +180,7 @@
 extern BOOL droidStartDroidRepair( DROID *psDroid );
 
 /*Updates a Repair Droid working on a damaged droid - returns true whilst repairing*/
-extern BOOL droidUpdateDroidRepair(DROID *psRepairDroid);
+extern BOOL droidUpdateDroidRepair(DROID *psRepairDroid, DROID *psDroidToRepair);
 
 /*checks a droids current body points to see if need to self repair*/
 extern void droidSelfRepair(DROID *psDroid);
Index: src/ai.c
===================================================================
--- src/ai.c	(revision 5990)
+++ src/ai.c	(working copy)
@@ -1052,9 +1052,9 @@
 	BOOL	bTargetInAir, bValidTarget = false;
 	UBYTE	surfaceToAir;
 
-	if (!psTarget)
+	if (!psTarget || psObject->player == psTarget->player || aiCheckAlliances(psObject->player, psTarget->player))
 	{
-		return false;
+		return false;	// no target, or has become friendly (eg due to Nexus machine mind control)
 	}
 
 	//need to check propulsion type of target
