sodoff/src/Services/MissionStoreSingleton.cs
Robert Paciorek e5570f7c91 Magic and Mythies fixes:
- add fake missions for unlock fishing and mythie grow up
- add games to store
2023-12-11 16:50:20 +01:00

82 lines
2.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;
private int[] activeMissionsV1;
private int[] upcomingMissionsV1;
private int[] activeMissionsMaM;
private int[] upcomingMissionsMaM;
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;
defaultMissions = XmlUtil.DeserializeXml<DefaultMissions>(XmlUtil.ReadResourceXmlString("defaultmissionlistv1"));
activeMissionsV1 = defaultMissions.Active;
upcomingMissionsV1 = defaultMissions.Upcoming;
defaultMissions = XmlUtil.DeserializeXml<DefaultMissions>(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 <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;
}
}
}