using System; using System.Collections.Generic; using System.Reflection; using System.Xml.Linq; namespace Barotrauma { class ScriptedEvent { private static List prefabs; protected readonly string name; protected readonly string description; private readonly int minEventCount, maxEventCount; protected bool isFinished; private readonly XElement configElement; private readonly Dictionary overrideMinEventCount; private readonly Dictionary overrideMaxEventCount; public string Name { get { return name; } } public string Description { get { return description; } } public string MusicType { get; set; } public virtual bool IsActive { get { return true; } } public bool IsFinished { get { return isFinished; } } public override string ToString() { return "ScriptedEvent (" + name + ")"; } protected ScriptedEvent(XElement element) { configElement = element; name = element.GetAttributeString("name", ""); description = element.GetAttributeString("description", ""); minEventCount = element.GetAttributeInt("mineventcount", 0); maxEventCount = element.GetAttributeInt("maxeventcount", 0); MusicType = element.GetAttributeString("musictype", "default"); overrideMinEventCount = new Dictionary(); overrideMaxEventCount = new Dictionary(); foreach (XElement subElement in element.Elements()) { switch (subElement.Name.ToString().ToLowerInvariant()) { case "overrideeventcount": string levelType = subElement.GetAttributeString("leveltype", ""); if (!overrideMinEventCount.ContainsKey(levelType)) { overrideMinEventCount.Add(levelType, subElement.GetAttributeInt("min", 0)); overrideMaxEventCount.Add(levelType, subElement.GetAttributeInt("max", 0)); } break; } } } public virtual void Init() { isFinished = false; } public virtual void Update(float deltaTime) { } public virtual void Finished() { isFinished = true; } private static void LoadPrefabs() { prefabs = new List(); var configFiles = GameMain.Config.SelectedContentPackage.GetFilesOfType(ContentType.RandomEvents); if (configFiles.Count == 0) { DebugConsole.ThrowError("No config files for random events found in the selected content package"); return; } foreach (string configFile in configFiles) { XDocument doc = XMLExtensions.TryLoadXml(configFile); if (doc == null) continue; foreach (XElement element in doc.Root.Elements()) { prefabs.Add(new ScriptedEvent(element)); } } } public static List GenerateLevelEvents(Random random, Level level) { if (prefabs == null) { LoadPrefabs(); } List events = new List(); foreach (ScriptedEvent scriptedEvent in prefabs) { int minCount = scriptedEvent.overrideMinEventCount.ContainsKey(level.GenerationParams.Name) ? scriptedEvent.overrideMinEventCount[level.GenerationParams.Name] : scriptedEvent.minEventCount; int maxCount = scriptedEvent.overrideMaxEventCount.ContainsKey(level.GenerationParams.Name) ? scriptedEvent.overrideMaxEventCount[level.GenerationParams.Name] : scriptedEvent.maxEventCount; minCount = Math.Min(minCount, maxCount); int count = random.Next(maxCount - minCount) + minCount; for (int i = 0; i