sodoff/src/Services/MissionStoreSingleton.cs
Spirtix 9cef74dd26 add support for missions
still requires achievements to work corrently
2023-07-07 01:25:25 +02:00

58 lines
1.8 KiB
C#

using sodoff.Schema;
using sodoff.Util;
using System.Runtime.Serialization.Formatters.Binary;
namespace sodoff.Services;
public class MissionStoreSingleton {
private Dictionary<int, Mission> missions = new();
private int[] activeMissions;
private int[] upcomingMissions;
public MissionStoreSingleton() {
ServerMissionArray missionArray = XmlUtil.DeserializeXml<ServerMissionArray>(XmlUtil.ReadResourceXmlString("missions"));
DefaultMissions defaultMissions = XmlUtil.DeserializeXml<DefaultMissions>(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 <EnableUnsafeBinaryFormatterSerialization> 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;
}
}
}