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; private int[] activeMissionsV1; private int[] upcomingMissionsV1; private int[] activeMissionsMaM; private int[] upcomingMissionsMaM; 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; defaultMissions = XmlUtil.DeserializeXml(XmlUtil.ReadResourceXmlString("defaultmissionlistv1")); activeMissionsV1 = defaultMissions.Active; upcomingMissionsV1 = defaultMissions.Upcoming; defaultMissions = XmlUtil.DeserializeXml(XmlUtil.ReadResourceXmlString("defaultmissionlistmam")); activeMissionsMaM = defaultMissions.Active; upcomingMissionsMaM = defaultMissions.Upcoming; } public Mission GetMission(int missionID) { return DeepCopy(missions[missionID]); } public int[] GetActiveMissions(string apiKey) { if (ClientVersion.Use2013SoDTutorial(apiKey)) { return activeMissionsV1; } if (ClientVersion.IsMaM(apiKey)) { return activeMissionsMaM; } return activeMissions; } public int[] GetUpcomingMissions(string apiKey) { if (ClientVersion.Use2013SoDTutorial(apiKey)) { return upcomingMissionsV1; } if (ClientVersion.IsMaM(apiKey)) { return upcomingMissionsMaM; } 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; } } }