1 #region Copyright & License Information
2 /*
3  * Copyright 2007-2020 The OpenRA Developers (see AUTHORS)
4  * This file is part of OpenRA, which is free software. It is made
5  * available to you under the terms of the GNU General Public License
6  * as published by the Free Software Foundation, either version 3 of
7  * the License, or (at your option) any later version. For more
8  * information, see COPYING.
9  */
10 #endregion
11 
12 using System.Collections.Generic;
13 using System.Linq;
14 using OpenRA.Traits;
15 
16 namespace OpenRA
17 {
18 	public class MapPlayers
19 	{
20 		public readonly Dictionary<string, PlayerReference> Players;
21 
MapPlayers()22 		public MapPlayers()
23 			: this(new List<MiniYamlNode>()) { }
24 
MapPlayers(IEnumerable<MiniYamlNode> playerDefinitions)25 		public MapPlayers(IEnumerable<MiniYamlNode> playerDefinitions)
26 		{
27 			Players = playerDefinitions.Select(pr => new PlayerReference(new MiniYaml(pr.Key, pr.Value.Nodes)))
28 				.ToDictionary(player => player.Name);
29 		}
30 
MapPlayers(Ruleset rules, int playerCount)31 		public MapPlayers(Ruleset rules, int playerCount)
32 		{
33 			var firstFaction = rules.Actors["world"].TraitInfos<FactionInfo>()
34 				.First(f => f.Selectable).InternalName;
35 
36 			Players = new Dictionary<string, PlayerReference>
37 			{
38 				{
39 					"Neutral", new PlayerReference
40 					{
41 						Name = "Neutral",
42 						Faction = firstFaction,
43 						OwnsWorld = true,
44 						NonCombatant = true
45 					}
46 				},
47 				{
48 					"Creeps", new PlayerReference
49 					{
50 						Name = "Creeps",
51 						Faction = firstFaction,
52 						NonCombatant = true,
53 						Enemies = Exts.MakeArray(playerCount, i => "Multi{0}".F(i))
54 					}
55 				}
56 			};
57 
58 			for (var index = 0; index < playerCount; index++)
59 			{
60 				var p = new PlayerReference
61 				{
62 					Name = "Multi{0}".F(index),
63 					Faction = "Random",
64 					Playable = true,
65 					Enemies = new[] { "Creeps" }
66 				};
67 				Players.Add(p.Name, p);
68 			}
69 		}
70 
ToMiniYaml()71 		public List<MiniYamlNode> ToMiniYaml()
72 		{
73 			return Players.Select(p => new MiniYamlNode("PlayerReference@{0}".F(p.Key),
74 				FieldSaver.SaveDifferences(p.Value, new PlayerReference()))).ToList();
75 		}
76 	}
77 }
78