using System; using Server.Mobiles; using Server.ContextMenus; using System.Collections.Generic; using Server.Gumps; namespace Server.Items { public enum FruitType { None, Grape, Apple, Peach, Pear, Plum } [FlipableAttribute(0x9E36, 0x9E37)] public class FermentationBarrel : Item { private static readonly int MinFruit = 20; private static readonly int MaxFruit = 80; private FruitType _FruitType; private int _Fruit; private int _BacterialResistance; private bool _Fermenting; private DateTime _FermentingEnds; private bool _Fermented; private bool _BadBatch; private int _BottlesRemaining; public string _Vintage; public Mobile _Maker; [CommandProperty(AccessLevel.GameMaster)] public FruitType FruitType { get { return _FruitType; } set { _FruitType = value; InvalidateProperties(); } } [CommandProperty(AccessLevel.GameMaster)] public int Fruit { get { return _Fruit; } set { _Fruit = value; InvalidateProperties(); } } [CommandProperty(AccessLevel.GameMaster)] public int BacterialResistance { get { return _BacterialResistance; } set { _BacterialResistance = value; InvalidateProperties(); } } [CommandProperty(AccessLevel.GameMaster)] public bool Fermenting { get { return _Fermenting; } set { _Fermenting = value; InvalidateProperties(); } } [CommandProperty(AccessLevel.GameMaster)] public DateTime FermentingEnds { get { return _FermentingEnds; } set { _FermentingEnds = value; InvalidateProperties(); } } [CommandProperty(AccessLevel.GameMaster)] public bool Fermented { get { return _Fermented; } set { _Fermented = value; InvalidateProperties(); } } [CommandProperty(AccessLevel.GameMaster)] public bool BadBatch { get { return _BadBatch; } } [CommandProperty(AccessLevel.GameMaster)] public int BottlesRemaining { get { return _BottlesRemaining; } set { _BottlesRemaining = value; InvalidateProperties(); } } [CommandProperty(AccessLevel.GameMaster)] public string Vintage { get { return _Vintage; } set { _Vintage = value; InvalidateProperties(); } } [CommandProperty(AccessLevel.GameMaster)] public Mobile Maker { get { return _Maker; } set { _Maker = value; } } public bool HasYeast { get { return _BacterialResistance > 0; } } public override int LabelNumber { get { return 1124526; } } // Fermentation Barrel public override double DefaultWeight { get { if (BottlesRemaining <= 0) return 1.0; return (double)BottlesRemaining; } } [Constructable] public FermentationBarrel() : base(0x9E36) { } public override void OnDoubleClick(Mobile from) { if (from.InRange(this.GetWorldLocation(), 2)) { if (_Fermenting && _FermentingEnds < DateTime.UtcNow) { _Fermented = true; int skill = (int)((from.Skills[SkillName.Cooking].Value + from.Skills[SkillName.Alchemy].Value) / 2); skill *= _BacterialResistance / 4; _BadBatch = skill < Utility.Random(225); if (!_BadBatch) { BottlesRemaining = _Fruit / 4; } } if (_Fermented) { if (_BadBatch) { from.PrivateOverheadMessage(Server.Network.MessageType.Regular, 1154, 1157258, from.NetState); // *You gently taste the fermentation...it's spoiled! You should probably empty the barrel* } else if (_BottlesRemaining > 0) { BottleOfWine bottle = new BottleOfWine(_FruitType, _Vintage, _Maker); if (from.Backpack != null && from.Backpack.TryDropItem(from, bottle, false)) { from.PlaySound(0x240); from.SendMessage("You pour the wine into a bottle and place it in your backpack."); BottlesRemaining--; } else { from.SendLocalizedMessage(500720); // You don't have enough room in your backpack! bottle.Delete(); } } } } } public override bool OnDragDrop(Mobile from, Item dropped) { if (_Fermented) { from.SendLocalizedMessage(1157245); // The fermentation barrel is not empty. Empty it first to add fruit and yeast. } else if (_Fermenting) { from.SendLocalizedMessage(1157244); // You may not add anything to the fermentation barrel after fermentation has begun. } else if (dropped is Yeast) { if (HasYeast) { from.SendLocalizedMessage(1157256); // You have already added yeast to the barrel. } else { BacterialResistance = ((Yeast)dropped).BacterialResistance; dropped.Delete(); } } else { FruitType type = GetFruitType(dropped.GetType()); if (_FruitType != FruitType.None && _FruitType != type) { from.SendLocalizedMessage(1157243); // You may only put one type of fruit in the fermentation barrel at one time. Empty the barrel first. } else if (type != FruitType.None) { if (_FruitType == FruitType.None) _FruitType = type; if (_Fruit + dropped.Amount <= MaxFruit) { Fruit += dropped.Amount; dropped.Delete(); } else { dropped.Amount -= MaxFruit - _Fruit; Fruit = MaxFruit; } } else if (!(dropped is Yeast)) { from.SendLocalizedMessage(1157246); // You may only put fruit and yeast in the fermentation barrel. } } return false; } public override void GetProperties(ObjectPropertyList list) { base.GetProperties(list); if (_Vintage != null) { list.Add(1157254, _Vintage); // ~1_VAL~ } if (_FruitType != FruitType.None) { list.Add(1157248 + (int)_FruitType); } if (_Fermented) { list.Add(1157259, _BottlesRemaining.ToString()); // Bottles Remaining: ~1_VAL~ } } public override void GetContextMenuEntries(Mobile from, List entries) { base.GetContextMenuEntries(from, entries); entries.Add(new SimpleContextMenuEntry(from, 1157231, m => // Begin Fermentation { if (_Fermenting) { m.SendLocalizedMessage(1157237); // The fermentation process has already begun. } else if (!HasYeast || _Fruit < MinFruit) { m.SendLocalizedMessage(1157255); // You do not have enough fruit or yeast to begin fermentation. } else { m.SendGump(new ConfirmCallbackGump(m as PlayerMobile, 1157234, 1157240, null, confirm: StartFermentation, close: CancelFermentation)); // Are you sure you wish to start the fermentation process? } }, 3, !_Fermented && (HasYeast || _Fruit > 0))); entries.Add(new SimpleContextMenuEntry(from, 1157232, m => // Empty Barrel { m.SendGump(new ConfirmCallbackGump(m as PlayerMobile, 1157234, 1157235, null, confirm: DoEmpty)); // Are you sure you wish to end the fermentation process? All progress and materials will be lost! }, 3, HasYeast || _Fruit > 0)); entries.Add(new SimpleContextMenuEntry(from, 1157233, m => // Rename Vintage { if (_Fermenting) { m.SendLocalizedMessage(1157238); // You may not rename the vintage once the fermentation process has begun. } else { m.SendLocalizedMessage(1157242); // What do you wish to call this vintage? m.BeginPrompt((mob, text) => { if (text != null) { text = text.Trim(); text = Utility.FixHtml(text); if (text.Length > 15 || !Server.Guilds.BaseGuildGump.CheckProfanity(text)) { mob.SendMessage("That label is unacceptable. Please try again."); } else { Vintage = text; } } }, null); } }, 3, !_Fermented)); } private void StartFermentation(Mobile m, object state) { m.SendLocalizedMessage(1157239); // The fermentation process has begun. _Fermenting = true; _FermentingEnds = DateTime.UtcNow + TimeSpan.FromHours(24); } private void CancelFermentation(Mobile m, object state) { m.SendLocalizedMessage(1157241); // The fermentation process has not been started. } private void DoEmpty(Mobile m, object state) { m.SendLocalizedMessage(1157236); // You empty the contents of the barrel. Reset(); } private void Reset() { _FruitType = FruitType.None; _Fruit = 0; _BacterialResistance = 0; _Fermenting = false; _FermentingEnds = DateTime.MinValue; _Fermented = false; _BottlesRemaining = 0; _Vintage = null; _Maker = null; InvalidateProperties(); } private FruitType GetFruitType(Type t) { for(int i = 0; i < _FruitTypes.Length; i++) { foreach (var type in _FruitTypes[i]) { if (type == t) return (FruitType)i + 1; } } return FruitType.None; } private Type[][] _FruitTypes = { new Type[] { typeof(GrapeBunch), typeof(Grapes) }, new Type[] { typeof(Apple) }, new Type[] { typeof(Peach) }, new Type[] { typeof(Pear) }, new Type[] { typeof(Plum) } }; public FermentationBarrel(Serial serial) : base(serial) { } public override void Serialize(GenericWriter writer) { base.Serialize(writer); writer.Write((int)0); // version writer.Write((int)_FruitType); writer.Write(_Fruit); writer.Write(_BacterialResistance); writer.Write(_Fermenting); writer.Write(_FermentingEnds); writer.Write(_Fermented); writer.Write(_BadBatch); writer.Write(_BottlesRemaining); writer.Write(_Vintage); writer.Write(_Maker); } public override void Deserialize(GenericReader reader) { base.Deserialize(reader); int version = reader.ReadInt(); _FruitType = (FruitType)reader.ReadInt(); _Fruit = reader.ReadInt(); _BacterialResistance = reader.ReadInt(); _Fermenting = reader.ReadBool(); _FermentingEnds = reader.ReadDateTime(); _Fermented = reader.ReadBool(); _BadBatch = reader.ReadBool(); _BottlesRemaining = reader.ReadInt(); _Vintage = reader.ReadString(); _Maker = reader.ReadMobile(); } } public class BottleOfWine : BeverageBottle { private FruitType _FruitType; private string _Vintage; private Mobile _Maker; [CommandProperty(AccessLevel.GameMaster)] public FruitType FruitType { get { return _FruitType; } set { _FruitType = value; InvalidateProperties(); } } [CommandProperty(AccessLevel.GameMaster)] public string Vintage { get { return _Vintage; } set { _Vintage = value; InvalidateProperties(); } } [CommandProperty(AccessLevel.GameMaster)] public Mobile Maker { get { return _Maker; } set { _Maker = value; InvalidateProperties(); } } [Constructable] public BottleOfWine() : this(FruitType.Grape, null, null) { } [Constructable] public BottleOfWine(FruitType type, string vintage, Mobile maker) : base(BeverageType.Wine) { Quantity = MaxQuantity; _FruitType = type; _Vintage = vintage; _Maker = maker; } public override void AddNameProperty(ObjectPropertyList list) { list.Add(1049519, String.Format("#{0}", (1157248 + (int)_FruitType).ToString())); // a bottle of ~1_DRINK_NAME~ } public override void GetProperties(ObjectPropertyList list) { base.GetProperties(list); if (_Vintage != null) { list.Add(1157254, _Vintage); // ~1_VAL~ } if (_Maker != null) { list.Add(1150679, _Maker.Name); // Distiller: ~1_NAME~ } list.Add(GetQuantityDescription()); } public BottleOfWine(Serial serial) : base(serial) { } public override void Serialize(GenericWriter writer) { base.Serialize(writer); writer.Write((int)0); writer.Write((int)_FruitType); writer.Write(_Vintage); writer.Write(_Maker); } public override void Deserialize(GenericReader reader) { base.Deserialize(reader); int version = reader.ReadInt(); _FruitType = (FruitType)reader.ReadInt(); _Vintage = reader.ReadString(); _Maker = reader.ReadMobile(); } } }