using System; namespace Server.Items { public enum MoonPhase { NewMoon, WaxingCrescentMoon, FirstQuarter, WaxingGibbous, FullMoon, WaningGibbous, LastQuarter, WaningCrescent } [Flippable(0x104B, 0x104C)] public class Clock : Item { public const double SecondsPerUOMinute = 5.0; public const double MinutesPerUODay = SecondsPerUOMinute * 24; private static DateTime WorldStart = new DateTime(1997, 9, 1); [Constructible] public Clock(int itemID = 0x104B) : base(itemID) { Weight = 3.0; } public Clock(Serial serial) : base(serial) { } public static DateTime ServerStart{ get; private set; } public static void Initialize() { ServerStart = DateTime.UtcNow; } public static MoonPhase GetMoonPhase(Map map, int x, int y) { GetTime(map, x, y, out _, out _, out int totalMinutes); if (map != null) totalMinutes /= 10 + map.MapIndex * 20; return (MoonPhase)(totalMinutes % 8); } public static void GetTime(Map map, int x, int y, out int hours, out int minutes) { GetTime(map, x, y, out hours, out minutes, out _); } public static void GetTime(Map map, int x, int y, out int hours, out int minutes, out int totalMinutes) { TimeSpan timeSpan = DateTime.UtcNow - WorldStart; totalMinutes = (int)(timeSpan.TotalSeconds / SecondsPerUOMinute); if (map != null) totalMinutes += map.MapIndex * 320; // Really on OSI this must be by subserver totalMinutes += x / 16; hours = totalMinutes / 60 % 24; minutes = totalMinutes % 60; } public static void GetTime(out int generalNumber, out string exactTime) { GetTime(null, 0, 0, out generalNumber, out exactTime); } public static void GetTime(Mobile from, out int generalNumber, out string exactTime) { GetTime(from.Map, from.X, from.Y, out generalNumber, out exactTime); } public static void GetTime(Map map, int x, int y, out int generalNumber, out string exactTime) { GetTime(map, x, y, out int hours, out int minutes); // 00:00 AM - 00:59 AM : Witching hour // 01:00 AM - 03:59 AM : Middle of night // 04:00 AM - 07:59 AM : Early morning // 08:00 AM - 11:59 AM : Late morning // 12:00 PM - 12:59 PM : Noon // 01:00 PM - 03:59 PM : Afternoon // 04:00 PM - 07:59 PM : Early evening // 08:00 PM - 11:59 AM : Late at night if (hours >= 20) generalNumber = 1042957; // It's late at night else if (hours >= 16) generalNumber = 1042956; // It's early in the evening else if (hours >= 13) generalNumber = 1042955; // It's the afternoon else if (hours >= 12) generalNumber = 1042954; // It's around noon else if (hours >= 08) generalNumber = 1042953; // It's late in the morning else if (hours >= 04) generalNumber = 1042952; // It's early in the morning else if (hours >= 01) generalNumber = 1042951; // It's the middle of the night else generalNumber = 1042950; // 'Tis the witching hour. 12 Midnight. hours %= 12; if (hours == 0) hours = 12; exactTime = $"{hours}:{minutes:D2}"; } public override void OnDoubleClick(Mobile from) { GetTime(from, out int genericNumber, out string exactTime); SendLocalizedMessageTo(from, genericNumber); SendLocalizedMessageTo(from, 1042958, exactTime); // ~1_TIME~ to be exact } public override void Serialize(GenericWriter writer) { base.Serialize(writer); writer.Write(0); // version } public override void Deserialize(GenericReader reader) { base.Deserialize(reader); int version = reader.ReadInt(); } } [Flippable(0x104B, 0x104C)] public class ClockRight : Clock { public ClockRight(Serial serial) : base(serial) { } public override void Serialize(GenericWriter writer) { base.Serialize(writer); writer.Write(0); // version } public override void Deserialize(GenericReader reader) { base.Deserialize(reader); int version = reader.ReadInt(); } } [Flippable(0x104B, 0x104C)] public class ClockLeft : Clock { [Constructible] public ClockLeft() : base(0x104C) { } public ClockLeft(Serial serial) : base(serial) { } public override void Serialize(GenericWriter writer) { base.Serialize(writer); writer.Write(0); // version } public override void Deserialize(GenericReader reader) { base.Deserialize(reader); int version = reader.ReadInt(); } } }