From b77f45e4b71eddb215ec4e840e69d4d27015119e Mon Sep 17 00:00:00 2001
From: Joris <joris.dauphin@gmail.com>
Date: Fri, 11 May 2012 14:18:19 +0200
Subject: [PATCH] Fix possible crash when the last defending unit die in
 AiForce.

---
 src/ai/ai_force.cpp | 42 ++++++++++++++++++++++++------------------
 1 file changed, 24 insertions(+), 18 deletions(-)

diff --git a/src/ai/ai_force.cpp b/src/ai/ai_force.cpp
index 765f0e42e..675357e1d 100644
--- a/src/ai/ai_force.cpp
+++ b/src/ai/ai_force.cpp
@@ -262,7 +262,6 @@ void AiForce::RemoveDeadUnit()
 		}
 		++i;
 	}
-
 }
 
 void AiForce::Attack(const Vec2i &pos)
@@ -303,17 +302,17 @@ void AiForce::Attack(const Vec2i &pos)
 	//  Send all units in the force to enemy.
 	this->State = AiForceAttackingState_Attacking;
 	for (size_t i = 0; i != this->Units.size(); ++i) {
-		CUnit* const unit = this->Units[i];
-		int delta = 0;
-		if (unit->Container == NULL) {
-			// To avoid lot of CPU consuption, send them with a small time difference.
-			unit->Wait = delta;
-			++delta;
-			if (unit->Type->CanAttack) {
-				CommandAttack(*unit, goalPos,  NULL, FlushCommands);
-			} else {
-				CommandMove(*unit, goalPos, FlushCommands);
-			}
+		CUnit *const unit = this->Units[i];
+
+		if (unit->Container == NULL) {
+			const int delay = i / 5; // To avoid lot of CPU consuption, send them with a small time difference.
+
+			unit->Wait = delay;
+			if (unit->Type->CanAttack) {
+				CommandAttack(*unit, goalPos,  NULL, FlushCommands);
+			} else {
+				CommandMove(*unit, goalPos, FlushCommands);
+			}
 		}
 	}
 }
@@ -727,19 +726,26 @@ void AiForceManager::Update()
 
 		if (force.Defending) {
 			force.RemoveDeadUnit();
+
+			if (force.Size() == 0) {
+				force.Attacking = false;
+				force.Defending = false;
+				continue;
+			}
+			const int nearDist = 5;
 			//  Check if some unit from force reached goal point
-			if (Map.Info.IsPointOnMap(force.GoalPos) &&
-				force.Units[0]->MapDistanceTo(force.GoalPos) <= 5) {
+			if (Map.Info.IsPointOnMap(force.GoalPos)
+				&& force.Units[0]->MapDistanceTo(force.GoalPos) <= nearDist) {
 				//  Look if still enemies in attack range.
 				const CUnit *dummy = NULL;
 				if (!AiForceEnemyFinder<true>(force, &dummy).found()) {
 					if (Map.Info.IsPointOnMap(force.HomePos)) {
+						for (size_t i = 0; i != force.Units.size(); ++i) {
+							CUnit &unit = *force.Units[i];
+							CommandMove(unit, force.HomePos, FlushCommands);
+						}
 						const Vec2i invalidPos = { -1, -1};
 
-						for (size_t i = 0; i != force.Units.size(); ++i) {
-							CUnit* const unit = force.Units[i];
-							CommandMove(*unit, force.HomePos, FlushCommands);
-						}
 						force.HomePos = invalidPos;
 					}
 					force.Defending = false;