using System; using Server.Mobiles; namespace Server { public enum VirtueLevel { None, Seeker, Follower, Knight } public enum VirtueName { Humility, Sacrifice, Compassion, Spirituality, Valor, Honor, Justice, Honesty } public class VirtueHelper { public static bool HasAny(Mobile from, VirtueName virtue) { return from.Virtues.GetValue((int)virtue) > 0; } public static bool IsHighestPath(Mobile from, VirtueName virtue) { return from.Virtues.GetValue((int)virtue) >= GetMaxAmount(virtue); } public static VirtueLevel GetLevel(Mobile from, VirtueName virtue) { int v = from.Virtues.GetValue((int)virtue); int vl; int vmax = GetMaxAmount(virtue); if (v < 4000) vl = 0; else if (v >= vmax) vl = 3; else vl = (v + 9999) / 10000; return (VirtueLevel)vl; } public static int GetMaxAmount(VirtueName virtue) { if (virtue == VirtueName.Honor) return 20000; if (virtue == VirtueName.Sacrifice) return 22000; return 21000; } public static bool Award(Mobile from, VirtueName virtue, int amount, ref bool gainedPath) { int current = from.Virtues.GetValue((int)virtue); int maxAmount = GetMaxAmount(virtue); if (current >= maxAmount) return false; if (current + amount >= maxAmount) amount = maxAmount - current; VirtueLevel oldLevel = GetLevel(from, virtue); from.Virtues.SetValue((int)virtue, current + amount); gainedPath = GetLevel(from, virtue) != oldLevel; return true; } public static bool Atrophy(Mobile from, VirtueName virtue) { return Atrophy(from, virtue, 1); } public static bool Atrophy(Mobile from, VirtueName virtue, int amount) { int current = from.Virtues.GetValue((int)virtue); if (current - amount >= 0) from.Virtues.SetValue((int)virtue, current - amount); else from.Virtues.SetValue((int)virtue, 0); return current > 0; } public static bool IsSeeker(Mobile from, VirtueName virtue) { return GetLevel(from, virtue) >= VirtueLevel.Seeker; } public static bool IsFollower(Mobile from, VirtueName virtue) { return GetLevel(from, virtue) >= VirtueLevel.Follower; } public static bool IsKnight(Mobile from, VirtueName virtue) { return GetLevel(from, virtue) >= VirtueLevel.Knight; } public static void AwardVirtue(PlayerMobile pm, VirtueName virtue, int amount) { if (virtue == VirtueName.Compassion) { if (pm.CompassionGains > 0 && DateTime.UtcNow > pm.NextCompassionDay) { pm.NextCompassionDay = DateTime.MinValue; pm.CompassionGains = 0; } if (pm.CompassionGains >= 5) { pm.SendLocalizedMessage(1053004); // You must wait about a day before you can gain in compassion again. return; } } bool gainedPath = false; string virtueName = Enum.GetName(typeof(VirtueName), virtue); if (Award(pm, virtue, amount, ref gainedPath)) { // TODO: Localize? if (gainedPath) pm.SendMessage("You have gained a path in {0}!", virtueName); else pm.SendMessage("You have gained in {0}.", virtueName); if (virtue == VirtueName.Compassion) { pm.NextCompassionDay = DateTime.UtcNow + TimeSpan.FromDays(1.0); ++pm.CompassionGains; if (pm.CompassionGains >= 5) pm.SendLocalizedMessage( 1053004); // You must wait about a day before you can gain in compassion again. } } else { // TODO: Localize? pm.SendMessage("You have achieved the highest path of {0} and can no longer gain any further.", virtueName); } } } }