/// <summary> /// Checks the given file for additional Level-, Campaign- or Player-Elements. /// </summary> /// <param name="extensionPaths">List of pathes to search for Extensions</param> /// <param name="file">Assembly als Byte-Dump</param> /// <param name="level">Search for Levels</param> /// <param name="campaign">Search for Campaigns</param> /// <param name="player">Search for Player</param> /// <returns>Collection of found elements and occured errors</returns> public LoaderInfo AnalyseExtension(string[] extensionPaths, byte[] file, bool level, bool campaign, bool player) { // Load all Extensions ExtensionLoader.LoadExtensions(extensionPaths, null, false); // Load given Assembly and analyze it Assembly assembly = Assembly.Load(file); return(ExtensionLoader.AnalyseAssembly(assembly, level, campaign, player)); }
public void Setup(string[] extensionPaths, Setup settings) { if (settings == null) { throw new ArgumentNullException("settings", "Settings is null"); } if (settings.Level == null) { throw new ArgumentNullException("settings", "Leve is null"); } if (settings.Player.Length != Level.MAX_SLOTS) { throw new ArgumentException(string.Format("Player-Array must have a length of {0}", Level.MAX_SLOTS)); } if (settings.Colors.Length != Level.MAX_SLOTS) { throw new ArgumentException(string.Format("Player-Array must have a length of {0}", Level.MAX_SLOTS)); } // Eindeutigkeit der Farben prüfen var colors = new List <PlayerColor>(); for (int i = 0; i < Level.MAX_SLOTS; i++) { if (settings.Colors[i] == PlayerColor.Undefined) { throw new ArgumentException("Undefined is not a valid color for slot " + i, "settings"); } if (colors.Contains(settings.Colors[i])) { throw new ArgumentException("Color " + settings.Colors[i] + " is assigned double", "settings"); } colors.Add(settings.Colors[i]); } colors.Clear(); // Load Default Assemblies ExtensionLoader.LoadExtensions(extensionPaths, null, false); // TODO: this is for debug AppDomain.CurrentDomain.AssemblyLoad += (x, y) => { }; AppDomain.CurrentDomain.AssemblyResolve += (x, y) => null; AppDomain.CurrentDomain.ResourceResolve += (x, y) => null; AppDomain.CurrentDomain.TypeResolve += (x, y) => null; // Level erzeugen Assembly levelAssembly = Assembly.Load(settings.Level.AssemblyFile); Type levelType = levelAssembly.GetType(settings.Level.TypeName, true); Level lvl = Activator.CreateInstance(levelType, ExtensionLoader.DefaultTypeResolver) as Level; _level = lvl; // Player erzeugen LevelSlot[] levelSlots = new LevelSlot[Level.MAX_SLOTS]; for (int i = 0; i < Level.MAX_SLOTS; i++) { // Skipp, falls nicht vorhanden if (settings.Player[i] == null) { continue; } Assembly playerAssembly = Assembly.Load(settings.Player[i].AssemblyFile); Type factoryType = playerAssembly.GetType(settings.Player[i].TypeName); // Identify Name object[] playerAttributes = factoryType.GetCustomAttributes(typeof(FactoryAttribute), true); if (playerAttributes.Length != 1) { throw new Exception("Player does not have the right number of Player Attributes"); } var playerAttribute = playerAttributes[0] as FactoryAttribute; // Find the right Mapping object[] mappingAttributes = playerAttribute.GetType(). GetCustomAttributes(typeof(FactoryAttributeMappingAttribute), false); if (mappingAttributes.Length != 1) { throw new Exception("Player Attribute has no valid Property Mapping Attribute"); } var mappingAttribute = mappingAttributes[0] as FactoryAttributeMappingAttribute; // Werte auslesen var name = playerAttribute.GetType().GetProperty(mappingAttribute.NameProperty). GetValue(playerAttribute, null) as string; levelSlots[i] = new LevelSlot() { FactoryType = factoryType, Name = name, Color = settings.Colors[i], Team = settings.Teams[i] }; } // Level initialisieren _level.Init(settings.Seed, levelSlots); }