diff --git a/OpenRa.Game/Game.cs b/OpenRa.Game/Game.cs index 20849fefd1..814c9524d1 100644 --- a/OpenRa.Game/Game.cs +++ b/OpenRa.Game/Game.cs @@ -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(); + 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 available, List 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; + } } } diff --git a/OpenRa.Game/GameRules/Rules.cs b/OpenRa.Game/GameRules/Rules.cs index d3f741d546..f7a161b071 100755 --- a/OpenRa.Game/GameRules/Rules.cs +++ b/OpenRa.Game/GameRules/Rules.cs @@ -28,7 +28,6 @@ namespace OpenRa.Game { if( useAftermath ) AllRules = new IniFile( - FileSystem.Open( "session.ini" ), FileSystem.Open( mapFileName ), FileSystem.Open("aftermathUnits.ini"), FileSystem.Open("units.ini"), @@ -38,7 +37,6 @@ namespace OpenRa.Game FileSystem.Open("trees.ini")); else AllRules = new IniFile( - FileSystem.Open("session.ini"), FileSystem.Open(mapFileName), FileSystem.Open("units.ini"), FileSystem.Open("rules.ini"), diff --git a/OpenRa.Game/Shroud.cs b/OpenRa.Game/Shroud.cs index 35c6f6abec..cd8ccd0911 100644 --- a/OpenRa.Game/Shroud.cs +++ b/OpenRa.Game/Shroud.cs @@ -13,7 +13,7 @@ namespace OpenRa.Game bool[,] explored = new bool[128, 128]; Sprite[] shadowBits = SpriteSheetBuilder.LoadAllSprites("shadow"); Sprite[,] sprites = new Sprite[128, 128]; - bool dirty; + bool dirty = true; bool hasGPS = false; float gapOpaqueTicks = (int)(Rules.General.GapRegenInterval * 25 * 60);