using Server; using Server.Network; using System; using System.Collections.Generic; using System.IO; using System.Linq; namespace Server.Engines.SphynxFortune { public class SphynxFortuneArray { public Mobile Mobile { get; set; } public DateTime Date { get; set; } public EnumType Type { get; set; } public EnumTypeValue TypeValue { get; set; } public int Value { get; set; } } public enum EnumTypeValue { Physical, Fire, Cold, Poison, Energy, Luck, EnhancePotions, DefendChance, RegenMana } public enum EnumType { ResistanceType, AosAttribute } public class SphynxFortune { public static string FilePath = Path.Combine("Saves/Misc/SphynxFortune", "Persistence.bin"); private static List Fountains = new List(); private static Timer m_Timer; public static void Configure() { EventSink.WorldSave += OnSave; EventSink.WorldLoad += OnLoad; } public static void ApplyFortune(Mobile from, Mobile m) { int cliloc = 0; switch (Utility.Random(20)) { case 0: { Fountains.Add(new SphynxFortuneArray { Mobile = from, Date = DateTime.UtcNow, Type = EnumType.ResistanceType, TypeValue = EnumTypeValue.Physical, Value = Utility.RandomMinMax(1, 10) }); cliloc = 1060886; // Your endurance shall protect you from your enemies blows. break; } case 1: { Fountains.Add(new SphynxFortuneArray { Mobile = from, Date = DateTime.UtcNow, Type = EnumType.ResistanceType, TypeValue = EnumTypeValue.Physical, Value = Utility.RandomMinMax(-1, -15) }); cliloc = 1060901; // Your wounds in battle shall run deep. break; } case 2: { Fountains.Add(new SphynxFortuneArray { Mobile = from, Date = DateTime.UtcNow, Type = EnumType.ResistanceType, TypeValue = EnumTypeValue.Fire, Value = Utility.RandomMinMax(1, 10) }); cliloc = 1060887; // A smile will be upon your lips, as you gaze into the infernos. break; } case 3: { Fountains.Add(new SphynxFortuneArray { Mobile = from, Date = DateTime.UtcNow, Type = EnumType.ResistanceType, TypeValue = EnumTypeValue.Fire, Value = Utility.RandomMinMax(-1, -15) }); cliloc = 1060902; // The fires of the abyss shall tear asunder your flesh! break; } case 4: { Fountains.Add(new SphynxFortuneArray { Mobile = from, Date = DateTime.UtcNow, Type = EnumType.ResistanceType, TypeValue = EnumTypeValue.Cold, Value = Utility.RandomMinMax(1, 10) }); cliloc = 1060888; // The ice of ages will embrace you, and you will embrace it alike. break; } case 5: { Fountains.Add(new SphynxFortuneArray { Mobile = from, Date = DateTime.UtcNow, Type = EnumType.ResistanceType, TypeValue = EnumTypeValue.Cold, Value = Utility.RandomMinMax(-1, -15) }); cliloc = 1060903; // Winter’s touch shall be your undoing. break; } case 6: { Fountains.Add(new SphynxFortuneArray { Mobile = from, Date = DateTime.UtcNow, Type = EnumType.ResistanceType, TypeValue = EnumTypeValue.Poison, Value = Utility.RandomMinMax(1, 10) }); cliloc = 1060889; // Your blood runs pure and strong. break; } case 7: { Fountains.Add(new SphynxFortuneArray { Mobile = from, Date = DateTime.UtcNow, Type = EnumType.ResistanceType, TypeValue = EnumTypeValue.Poison, Value = Utility.RandomMinMax(-1, -15) }); cliloc = 1060904; // Your veins will freeze with poison’s chill. break; } case 8: { Fountains.Add(new SphynxFortuneArray { Mobile = from, Date = DateTime.UtcNow, Type = EnumType.ResistanceType, TypeValue = EnumTypeValue.Energy, Value = Utility.RandomMinMax(1, 10) }); cliloc = 1060890; // Your flesh shall endure the power of storms. break; } case 9: { Fountains.Add(new SphynxFortuneArray { Mobile = from, Date = DateTime.UtcNow, Type = EnumType.ResistanceType, TypeValue = EnumTypeValue.Energy, Value = Utility.RandomMinMax(-1, -15) }); cliloc = 1060905; // The wise will seek to avoid the anger of storms. break; } case 10: { Fountains.Add(new SphynxFortuneArray { Mobile = from, Date = DateTime.UtcNow, Type = EnumType.AosAttribute, TypeValue = EnumTypeValue.Luck, Value = Utility.RandomMinMax(10, 50) }); cliloc = 1060891; // Seek riches and they will seek you. break; } case 11: { Fountains.Add(new SphynxFortuneArray { Mobile = from, Date = DateTime.UtcNow, Type = EnumType.AosAttribute, TypeValue = EnumTypeValue.Luck, Value = Utility.RandomMinMax(-10, -50) }); cliloc = 1060901; // Your wounds in battle shall run deep. break; } case 12: { Fountains.Add(new SphynxFortuneArray { Mobile = from, Date = DateTime.UtcNow, Type = EnumType.AosAttribute, TypeValue = EnumTypeValue.EnhancePotions, Value = Utility.RandomMinMax(5, 25) }); cliloc = 1060892; // The power of alchemy shall thrive within you. break; } case 13: { Fountains.Add(new SphynxFortuneArray { Mobile = from, Date = DateTime.UtcNow, Type = EnumType.AosAttribute, TypeValue = EnumTypeValue.EnhancePotions, Value = Utility.RandomMinMax(-5, -25) }); cliloc = 1060907; // The strength of alchemy will fail you. break; } case 14: { Fountains.Add(new SphynxFortuneArray { Mobile = from, Date = DateTime.UtcNow, Type = EnumType.AosAttribute, TypeValue = EnumTypeValue.Luck, Value = Utility.RandomMinMax(10, 100) }); cliloc = 1060893; // Fate smiles upon you this day. break; } case 15: { Fountains.Add(new SphynxFortuneArray { Mobile = from, Date = DateTime.UtcNow, Type = EnumType.AosAttribute, TypeValue = EnumTypeValue.Luck, Value = Utility.RandomMinMax(-10, -100) }); cliloc = 1060908; // Only fools take risks in fate’s shadow. break; } case 16: { Fountains.Add(new SphynxFortuneArray { Mobile = from, Date = DateTime.UtcNow, Type = EnumType.AosAttribute, TypeValue = EnumTypeValue.DefendChance, Value = Utility.RandomMinMax(1, 10) }); cliloc = 1060894; // A keen mind in battle will help you avoid injury. break; } case 17: { Fountains.Add(new SphynxFortuneArray { Mobile = from, Date = DateTime.UtcNow, Type = EnumType.AosAttribute, TypeValue = EnumTypeValue.DefendChance, Value = Utility.RandomMinMax(-1, -10) }); cliloc = 1060909; // Your lack of focus in battle shall be your undoing. break; } case 18: { Fountains.Add(new SphynxFortuneArray { Mobile = from, Date = DateTime.UtcNow, Type = EnumType.AosAttribute, TypeValue = EnumTypeValue.RegenMana, Value = Utility.RandomMinMax(1, 3) }); cliloc = 1060895; // The flow of the ether is strong within you. break; } case 19: { Fountains.Add(new SphynxFortuneArray { Mobile = from, Date = DateTime.UtcNow, Type = EnumType.AosAttribute, TypeValue = EnumTypeValue.RegenMana, Value = Utility.RandomMinMax(-1, -3) }); cliloc = 1060910; // Your connection with the ether is weak, take heed. break; } } m.PrivateOverheadMessage(MessageType.Regular, 0x3B2, cliloc, from.NetState); } public static bool UnderEffect(Mobile from) { return Fountains.Any(x => x.Mobile == from); } public static int GetResistanceBonus(Mobile from, ResistanceType type) { return Fountains.Where(x => x.Mobile == from && (x.Type == EnumType.ResistanceType) && Enum.GetName(typeof(ResistanceType), type) == x.TypeValue.ToString()).Sum(y => y.Value); } public static int GetAosAttributeBonus(Mobile from, AosAttribute type) { return Fountains.Where(x => x.Mobile == from && (x.Type == EnumType.AosAttribute) && Enum.GetName(typeof(AosAttribute), type) == x.TypeValue.ToString()).Sum(y => y.Value); } public static void DefragTables() { Fountains.ForEach(x => { if (DateTime.UtcNow > x.Date + TimeSpan.FromHours(24)) { x.Mobile.SendLocalizedMessage(1060859); // The effects of the Sphynx have worn off. } }); Fountains.RemoveAll(x => DateTime.UtcNow > x.Date + TimeSpan.FromHours(24)); } public static void StartTimer() { if (m_Timer != null && m_Timer.Running) return; m_Timer = Timer.DelayCall(TimeSpan.FromMinutes(1), TimeSpan.FromMinutes(1), new TimerCallback(DefragTables)); m_Timer.Start(); } public static void OnSave(WorldSaveEventArgs e) { Persistence.Serialize( FilePath, writer => { writer.Write((int)0); writer.Write(Fountains.Count); Fountains.ForEach(s => { writer.Write(s.Mobile); writer.Write(s.Date); writer.Write((int)s.Type); writer.Write((int)s.TypeValue); writer.Write(s.Value); }); }); } public static void OnLoad() { Persistence.Deserialize( FilePath, reader => { int version = reader.ReadInt(); int count = reader.ReadInt(); for (int i = count; i > 0; i--) { Mobile m = reader.ReadMobile(); DateTime dt = reader.ReadDateTime(); EnumType et = (EnumType)reader.ReadInt(); EnumTypeValue etv = (EnumTypeValue)reader.ReadInt(); int value = reader.ReadInt(); if (m != null) { Fountains.Add(new SphynxFortuneArray { Mobile = m, Date = dt, Type = et, TypeValue = etv, Value = value }); } } }); StartTimer(); } } }