using Microsoft.Xna.Framework; using System; using System.Collections.Generic; using System.Linq; using System.Reflection; using System.Xml.Linq; namespace Barotrauma { class Mission { private static List list = new List(); private static string configFile = "Content/Missions.xml"; private string name; private string description; protected bool completed; protected string successMessage; protected string failureMessage; protected string radarLabel; protected List headers; protected List messages; private int reward; public string Name { get { return name; } } public string Description { get { return description; } } public int Reward { get { return reward; } } public bool Completed { get { return completed; } } public virtual string RadarLabel { get { return radarLabel; } } public virtual Vector2 RadarPosition { get { return Vector2.Zero; } } public string SuccessMessage { get { return successMessage; } } public string FailureMessage { get { return failureMessage; } } public Mission(XElement element) { name = ToolBox.GetAttributeString(element, "name", ""); description = ToolBox.GetAttributeString(element, "description", ""); reward = ToolBox.GetAttributeInt(element, "reward", 1); successMessage = ToolBox.GetAttributeString(element, "successmessage", "Mission completed successfully"); failureMessage = ToolBox.GetAttributeString(element, "failuremessage", "Mission failed"); radarLabel = ToolBox.GetAttributeString(element, "radarlabel", ""); messages = new List(); headers = new List(); foreach (XElement subElement in element.Elements()) { if (subElement.Name.ToString().ToLower() != "message") continue; headers.Add(ToolBox.GetAttributeString(subElement, "header", "")); messages.Add(ToolBox.GetAttributeString(subElement, "text", "")); } } public static Mission LoadRandom(Location[] locations, Random rand) { XDocument doc = ToolBox.TryLoadXml(configFile); if (doc == null) return null; int eventCount = doc.Root.Elements().Count(); //int[] commonness = new int[eventCount]; float[] eventProbability = new float[eventCount]; float probabilitySum = 0.0f; int i = 0; foreach (XElement element in doc.Root.Elements()) { eventProbability[i] = ToolBox.GetAttributeInt(element, "commonness", 1); probabilitySum += eventProbability[i]; i++; } float randomNumber = (float)rand.NextDouble() * probabilitySum; i = 0; foreach (XElement element in doc.Root.Elements()) { if (randomNumber <= eventProbability[i]) { Type t; string type = element.Name.ToString(); try { t = Type.GetType("Barotrauma." + type, true, true); if (t == null) { DebugConsole.ThrowError("Error in " + configFile + "! Could not find a mission class of the type ''" + type + "''."); continue; } } catch { DebugConsole.ThrowError("Error in " + configFile + "! Could not find a mission class of the type ''" + type + "''."); continue; } ConstructorInfo constructor = t.GetConstructor(new[] { typeof(XElement) }); object instance = constructor.Invoke(new object[] { element }); Mission mission = (Mission)instance; for (int n = 0; n<2; n++) { mission.description = mission.description.Replace("[location"+(n+1)+"]", locations[n].Name); mission.successMessage = mission.successMessage.Replace("[location" + (n + 1) + "]", locations[n].Name); mission.failureMessage = mission.failureMessage.Replace("[location" + (n + 1) + "]", locations[n].Name); } return mission; } randomNumber -= eventProbability[i]; i++; } return null; } public virtual void Start(Level level) { } public virtual void Update(float deltaTime) { } public void ShowMessage(int index) { if (index >= headers.Count && index >= messages.Count) return; new GUIMessageBox( index < headers.Count ? headers[index] : "", index < messages.Count ? messages[index] : ""); } /// /// End the mission and give a reward if it was completed successfully /// public virtual void End() { completed = true; GiveReward(); } public void GiveReward() { var mode = GameMain.GameSession.gameMode as SinglePlayerMode; if (mode == null) return; mode.Money += reward; } } }