From 4a7ef68b39ee5ebe1ecded08533a7aa1b58277ae Mon Sep 17 00:00:00 2001 From: Paul Chote Date: Fri, 18 Mar 2016 19:53:11 +0000 Subject: [PATCH] Remove Map.SpawnPoints. --- OpenRA.Game/Map/Map.cs | 17 ----------------- OpenRA.Mods.Common/Lint/CheckPlayers.cs | 17 +++++++++++------ .../Traits/World/MPStartLocations.cs | 5 ++++- .../UtilityCommands/ImportLegacyMapCommand.cs | 17 ++++++++++------- .../Widgets/Logic/Editor/NewMapLogic.cs | 2 +- .../UtilityCommands/D2kMapImporter.cs | 13 ++++++++++--- 6 files changed, 36 insertions(+), 35 deletions(-) diff --git a/OpenRA.Game/Map/Map.cs b/OpenRA.Game/Map/Map.cs index f9331c3e30..bc577324e1 100644 --- a/OpenRA.Game/Map/Map.cs +++ b/OpenRA.Game/Map/Map.cs @@ -126,8 +126,6 @@ namespace OpenRA /// public WPos ProjectedBottomRight; - public Lazy SpawnPoints; - // Yaml map data [FieldLoader.Ignore] public readonly MiniYaml RuleDefinitions; [FieldLoader.Ignore] public readonly MiniYaml SequenceDefinitions; @@ -203,8 +201,6 @@ namespace OpenRA Tiles.Clear(tileRef); - SpawnPoints = Exts.Lazy(() => new CPos[0]); - PostInit(); } @@ -222,19 +218,6 @@ namespace OpenRA if (MapFormat != SupportedMapFormat) throw new InvalidDataException("Map format {0} is not supported.\n File: {1}".F(MapFormat, package.Name)); - SpawnPoints = Exts.Lazy(() => - { - var spawns = new List(); - foreach (var kv in ActorDefinitions.Where(d => d.Value.Value == "mpspawn")) - { - var s = new ActorReference(kv.Value.Value, kv.Value.ToDictionary()); - - spawns.Add(s.InitDict.Get().Value(null)); - } - - return spawns.ToArray(); - }); - RuleDefinitions = LoadRuleSection(yaml, "Rules"); SequenceDefinitions = LoadRuleSection(yaml, "Sequences"); VoxelSequenceDefinitions = LoadRuleSection(yaml, "VoxelSequences"); diff --git a/OpenRA.Mods.Common/Lint/CheckPlayers.cs b/OpenRA.Mods.Common/Lint/CheckPlayers.cs index b2f29fb498..f5629967a0 100644 --- a/OpenRA.Mods.Common/Lint/CheckPlayers.cs +++ b/OpenRA.Mods.Common/Lint/CheckPlayers.cs @@ -10,6 +10,7 @@ #endregion using System; +using System.Collections.Generic; using System.Linq; using OpenRA.Mods.Common.Traits; using OpenRA.Traits; @@ -46,14 +47,18 @@ namespace OpenRA.Mods.Common.Lint if (worldActor.HasTraitInfo()) { - var multiPlayers = players.Count(p => p.Value.Playable); - var spawns = map.ActorDefinitions.Where(a => a.Value.Value == "mpspawn"); - var spawnCount = spawns.Count(); + var playerCount = players.Count(p => p.Value.Playable); + var spawns = new List(); + foreach (var kv in map.ActorDefinitions.Where(d => d.Value.Value == "mpspawn")) + { + var s = new ActorReference(kv.Value.Value, kv.Value.ToDictionary()); + spawns.Add(s.InitDict.Get().Value(null)); + } - if (multiPlayers > spawnCount) - emitError("The map allows {0} possible players, but defines only {1} spawn points".F(multiPlayers, spawnCount)); + if (playerCount > spawns.Count) + emitError("The map allows {0} possible players, but defines only {1} spawn points".F(playerCount, spawns.Count)); - if (map.SpawnPoints.Value.Distinct().Count() != spawnCount) + if (spawns.Distinct().Count() != spawns.Count) emitError("Duplicate spawn point locations detected."); } diff --git a/OpenRA.Mods.Common/Traits/World/MPStartLocations.cs b/OpenRA.Mods.Common/Traits/World/MPStartLocations.cs index 35823374f3..d6b5f641c6 100644 --- a/OpenRA.Mods.Common/Traits/World/MPStartLocations.cs +++ b/OpenRA.Mods.Common/Traits/World/MPStartLocations.cs @@ -38,7 +38,10 @@ namespace OpenRA.Mods.Common.Traits public void WorldLoaded(World world, WorldRenderer wr) { - var spawns = world.Map.SpawnPoints.Value; + var spawns = world.Actors.Where(a => a.Info.Name == "mpspawn") + .Select(a => a.Location) + .ToArray(); + var taken = world.LobbyInfo.Clients.Where(c => c.SpawnPoint != 0 && c.Slot != null) .Select(c => spawns[c.SpawnPoint - 1]).ToList(); var available = spawns.Except(taken).ToList(); diff --git a/OpenRA.Mods.Common/UtilityCommands/ImportLegacyMapCommand.cs b/OpenRA.Mods.Common/UtilityCommands/ImportLegacyMapCommand.cs index 2728cddcef..b93b1bc0da 100644 --- a/OpenRA.Mods.Common/UtilityCommands/ImportLegacyMapCommand.cs +++ b/OpenRA.Mods.Common/UtilityCommands/ImportLegacyMapCommand.cs @@ -35,6 +35,7 @@ namespace OpenRA.Mods.Common.UtilityCommands public Map Map; public List Players = new List(); public MapPlayers MapPlayers; + int spawnCount; public bool ValidateArguments(string[] args) { @@ -81,12 +82,13 @@ namespace OpenRA.Mods.Common.UtilityCommands LoadSmudges(file, "SMUDGE"); var waypoints = file.GetSection("Waypoints"); - LoadWaypoints(Map, waypoints, MapSize); + LoadWaypoints(waypoints); // Create default player definitions only if there are no players to import - MapPlayers = new MapPlayers(Map.Rules, (Players.Count == 0) ? Map.SpawnPoints.Value.Length : 0); + MapPlayers = new MapPlayers(Map.Rules, Players.Count == 0 ? spawnCount : 0); foreach (var p in Players) LoadPlayer(file, p); + Map.PlayerDefinitions = MapPlayers.ToMiniYaml(); } @@ -235,13 +237,13 @@ namespace OpenRA.Mods.Common.UtilityCommands return new int2(offset % mapSize, offset / mapSize); } - static void LoadWaypoints(Map map, IniSection waypointSection, int mapSize) + void LoadWaypoints(IniSection waypointSection) { - var actorCount = map.ActorDefinitions.Count; + var actorCount = Map.ActorDefinitions.Count; var wps = waypointSection .Where(kv => Exts.ParseIntegerInvariant(kv.Value) > 0) .Select(kv => Pair.New(Exts.ParseIntegerInvariant(kv.Key), - LocationFromMapOffset(Exts.ParseIntegerInvariant(kv.Value), mapSize))); + LocationFromMapOffset(Exts.ParseIntegerInvariant(kv.Value), MapSize))); // Add waypoint actors foreach (var kv in wps) @@ -254,7 +256,8 @@ namespace OpenRA.Mods.Common.UtilityCommands new OwnerInit("Neutral") }; - map.ActorDefinitions.Add(new MiniYamlNode("Actor" + actorCount++, ar.Save())); + Map.ActorDefinitions.Add(new MiniYamlNode("Actor" + actorCount++, ar.Save())); + spawnCount++; } else { @@ -264,7 +267,7 @@ namespace OpenRA.Mods.Common.UtilityCommands new OwnerInit("Neutral") }; - map.ActorDefinitions.Add(new MiniYamlNode("waypoint" + kv.First, ar.Save())); + Map.ActorDefinitions.Add(new MiniYamlNode("waypoint" + kv.First, ar.Save())); } } } diff --git a/OpenRA.Mods.Common/Widgets/Logic/Editor/NewMapLogic.cs b/OpenRA.Mods.Common/Widgets/Logic/Editor/NewMapLogic.cs index 00067aa452..615bf847a3 100644 --- a/OpenRA.Mods.Common/Widgets/Logic/Editor/NewMapLogic.cs +++ b/OpenRA.Mods.Common/Widgets/Logic/Editor/NewMapLogic.cs @@ -62,7 +62,7 @@ namespace OpenRA.Mods.Common.Widgets.Logic var br = new PPos(width, height + maxTerrainHeight); map.SetBounds(tl, br); - map.PlayerDefinitions = new MapPlayers(map.Rules, map.SpawnPoints.Value.Length).ToMiniYaml(); + map.PlayerDefinitions = new MapPlayers(map.Rules, 0).ToMiniYaml(); map.FixOpenAreas(); Action afterSave = uid => diff --git a/OpenRA.Mods.D2k/UtilityCommands/D2kMapImporter.cs b/OpenRA.Mods.D2k/UtilityCommands/D2kMapImporter.cs index 5fe559a2ef..619e9c4661 100644 --- a/OpenRA.Mods.D2k/UtilityCommands/D2kMapImporter.cs +++ b/OpenRA.Mods.D2k/UtilityCommands/D2kMapImporter.cs @@ -263,6 +263,7 @@ namespace OpenRA.Mods.D2k.UtilityCommands Size mapSize; TileSet tileSet; List tileSetsFromYaml; + int playerCount; D2kMapImporter(string filename, string tileset, Ruleset rules) { @@ -293,13 +294,12 @@ namespace OpenRA.Mods.D2k.UtilityCommands public static Map Import(string filename, string mod, string tileset, Ruleset rules) { - var map = new D2kMapImporter(filename, tileset, rules).map; + var importer = new D2kMapImporter(filename, tileset, rules); + var map = importer.map; if (map == null) return null; map.RequiresMod = mod; - var players = new MapPlayers(map.Rules, map.SpawnPoints.Value.Length); - map.PlayerDefinitions = players.ToMiniYaml(); return map; } @@ -324,6 +324,9 @@ namespace OpenRA.Mods.D2k.UtilityCommands // Each frame is a tile from the Dune 2000 tileset files, with the Frame ID being the index of the tile in the original file tileSetsFromYaml = tileSet.Templates.Where(t => t.Value.Frames != null && t.Value.Images[0].ToLower() == tilesetName.ToLower()).Select(ts => ts.Value).ToList(); + + var players = new MapPlayers(map.Rules, playerCount); + map.PlayerDefinitions = players.ToMiniYaml(); } void FillMap() @@ -356,7 +359,11 @@ namespace OpenRA.Mods.D2k.UtilityCommands new LocationInit(locationOnMap), new OwnerInit(kvp.Second) }; + map.ActorDefinitions.Add(new MiniYamlNode("Actor" + map.ActorDefinitions.Count, a.Save())); + + if (kvp.First == "mpspawn") + playerCount++; } } }