using sodoff.Schema; using sodoff.Util; using System.Runtime.Serialization.Formatters.Binary; namespace sodoff.Services; public class MissionStoreSingleton { private Dictionary missions = new(); private int[] activeMissions; private int[] upcomingMissions; public MissionStoreSingleton() { ServerMissionArray missionArray = XmlUtil.DeserializeXml(XmlUtil.ReadResourceXmlString("missions")); DefaultMissions defaultMissions = XmlUtil.DeserializeXml(XmlUtil.ReadResourceXmlString("defaultmissionlist")); foreach (var mission in missionArray.MissionDataArray) { SetUpRecursive(mission); } activeMissions = defaultMissions.Active; upcomingMissions = defaultMissions.Upcoming; } public Mission GetMission(int missionID) { return DeepCopy(missions[missionID]); } public int[] GetActiveMissions() { return activeMissions; } public int[] GetUpcomingMissions() { return upcomingMissions; } private void SetUpRecursive(Mission mission) { missions.Add(mission.MissionID, mission); foreach (var innerMission in mission.Missions) { SetUpRecursive(innerMission); } } // FIXME: Don't use BinaryFormatter for deep copying // FIXME: Remove flag from the project file once we have a different way of deep copying public static Mission DeepCopy(Mission original) { using (MemoryStream memoryStream = new MemoryStream()) { BinaryFormatter formatter = new BinaryFormatter(); formatter.Serialize(memoryStream, original); memoryStream.Position = 0; Mission clone = (Mission)formatter.Deserialize(memoryStream); return clone; } } }