fix minor shroud bug [where we have no units]; spawn point choosing

This commit is contained in:
Chris Forbes
2010-01-16 17:31:52 +13:00
parent b46087986d
commit af2abf5205
3 changed files with 34 additions and 4 deletions

View File

@@ -400,9 +400,41 @@ namespace OpenRa.Game
public static void StartGame()
{
// todo: spawn starting units for everyone
var available = SpawnPoints.ToList();
var taken = new List<int2>();
foreach (var client in LobbyInfo.Clients)
{
// todo: allow players to choose their own spawn points.
// only select a point for them if they didn't.
// todo: spawn more than one unit, in most cases!
var sp = ChooseSpawnPoint(available, taken);
world.Add(new Actor("mcv", sp, players[client.Index]));
}
Game.viewport.GoToStartLocation();
orderManager.StartGame();
}
static int2 ChooseSpawnPoint(List<int2> available, List<int2> taken)
{
if (available.Count == 0)
throw new InvalidOperationException("No free spawnpoint.");
var n = taken.Count == 0
? Game.SharedRandom.Next(available.Count)
: available // pick the most distant spawnpoint from everyone else
.Select((k,i) => Pair.New(k,i))
.OrderByDescending(a => taken.Sum(t => (t - a.First).LengthSquared))
.Select(a => a.Second)
.First();
var sp = available[n];
available.RemoveAt(n);
taken.Add(sp);
return sp;
}
}
}