Files
Unstable Kitsune b918192e4e Overwrite
Complete Overwrite of the Folder with the free shard. ServUO 57.3 has been added.
2023-11-28 23:20:26 -05:00

498 lines
20 KiB
C#

using Server;
using System;
using Server.Items;
using Server.Mobiles;
using Server.Gumps;
using Server.Prompts;
using Server.Targeting;
using Server.Network;
using System.Collections.Generic;
namespace Server.Engines.Distillation
{
public class DistillationGump : Gump
{
private const int LabelHue = 0x480;
private const int LabelColor = 0x7FFF;
private const int FontColor = 0xFFFFFF;
private DistillationContext m_Context;
private CraftDefinition m_Def;
public DistillationGump(Mobile from) : base(35, 35)
{
from.CloseGump(typeof(DistillationGump));
m_Context = DistillationSystem.GetContext(from);
Group group = m_Context.LastGroup;
Liquor liquor = m_Context.LastLiquor;
if (liquor == Liquor.None)
liquor = DistillationSystem.GetFirstLiquor(group);
m_Def = DistillationSystem.GetDefinition(liquor, group);
if (m_Def == null)
return;
if (m_Def.Liquor != liquor)
liquor = m_Def.Liquor;
AddBackground(0, 0, 500, 500, 5054);
AddImageTiled(10, 10, 480, 30, 2624);
AddImageTiled(10, 50, 230, 120, 2624);
AddImageTiled(10, 180, 230, 200, 2624);
AddImageTiled(250, 50, 240, 200, 2624);
AddImageTiled(250, 260, 240, 120, 2624);
AddImageTiled(10, 390, 480, 60, 2624);
AddImageTiled(10, 460, 480, 30, 2624);
AddAlphaRegion(10, 10, 480, 480);
AddHtmlLocalized(10, 16, 510, 20, 1150682, LabelColor, false, false); // <center>DISTILLERY MENU</center>
AddHtmlLocalized(10, 55, 230, 20, 1150683, LabelColor, false, false); // <center>Select the group</center>
AddButton(15, 80, 4005, 4007, 1, GumpButtonType.Reply, 0);
AddHtmlLocalized(55, 80, 200, 20, DistillationSystem.GetLabel(Group.WheatBased), LabelColor, false, false); // WHEAT BASED
AddButton(15, 106, 4005, 4007, 2, GumpButtonType.Reply, 0);
AddHtmlLocalized(55, 106, 200, 20, DistillationSystem.GetLabel(Group.WaterBased), LabelColor, false, false); // WATER BASED
AddButton(15, 132, 4005, 4007, 3, GumpButtonType.Reply, 0);
AddHtmlLocalized(55, 132, 200, 20, DistillationSystem.GetLabel(Group.Other), LabelColor, false, false); // OTHER
AddHtmlLocalized(10, 184, 230, 20, 1150684, LabelColor, false, false); // <center>Select the liquor type</center>
int y = 210;
for (int i = 0; i < DistillationSystem.CraftDefs.Count; i++)
{
CraftDefinition def = DistillationSystem.CraftDefs[i];
if (def.Group == group)
{
AddButton(15, y, 4005, 4007, 1000 + i, GumpButtonType.Reply, 0);
AddHtmlLocalized(55, y, 200, 20, DistillationSystem.GetLabel(def.Liquor, false), LabelColor, false, false);
y += 26;
}
}
AddHtmlLocalized(250, 54, 240, 20, 1150735, String.Format("#{0}", DistillationSystem.GetLabel(liquor, false)), LabelColor, false, false); // <center>Ingredients of ~1_NAME~</center>
y = 80;
for (int i = 0; i < m_Def.Ingredients.Length; i++)
{
Type type = m_Def.Ingredients[i];
int amt = m_Def.Amounts[i];
bool strong = m_Context.MakeStrong;
if (i == 0 && type == typeof(Yeast))
{
for (int j = 0; j < amt; j++)
{
Yeast yeast = m_Context.SelectedYeast[j];
AddHtmlLocalized(295, y, 200, 20, yeast == null ? 1150778 : 1150779, "#1150453", LabelColor, false, false); // Yeast: ~1_VAL~
AddButton(255, y, 4005, 4007, 2000 + j, GumpButtonType.Reply, 0);
y += 26;
}
continue;
}
else
{
int total = strong ? amt * 2 : amt;
int amount = DistillationTarget.GetAmount(from, type, liquor);
if (amount > total)
amount = total;
AddHtmlLocalized(295, y, 200, 20, 1150733, String.Format("#{0}\t{1}", m_Def.Labels[i], String.Format("{0}/{1}", amount.ToString(), total.ToString())), LabelColor, false, false); // ~1_NAME~ : ~2_NUMBER~
}
y += 26;
}
AddHtmlLocalized(250, 264, 240, 20, 1150770, LabelColor, false, false); // <center>Distillery Options</center>
AddButton(255, 290, 4005, 4007, 4, GumpButtonType.Reply, 0);
AddHtmlLocalized(295, 290, 200, 20, m_Context.MakeStrong ? 1150730 : 1150729, LabelColor, false, false); // Double Distillation - Standard Distillation
AddButton(255, 316, 4005, 4007, 5, GumpButtonType.Reply, 0);
AddHtmlLocalized(295, 320, 200, 20, m_Context.Mark ? 1150731 : 1150732, LabelColor, false, false); // Mark Distiller Name - Do Not Mark
AddButton(15, 395, 4005, 4007, 6, GumpButtonType.Reply, 0);
AddHtmlLocalized(55, 395, 200, 20, 1150733, String.Format("Label\t{0}", m_Context.Label == null ? "None" : m_Context.Label), LabelColor, false, false); // ~1_NAME~ : ~2_NUMBER~
AddButton(15, 465, 4005, 4007, 7, GumpButtonType.Reply, 0);
AddHtmlLocalized(55, 465, 200, 20, 1150771, LabelColor, false, false); // Execute Distillation
AddButton(455, 465, 4017, 4019, 0, GumpButtonType.Reply, 0);
AddHtmlLocalized(400, 465, 100, 20, 1060675, LabelColor, false, false); // CLOSE
}
public override void OnResponse(NetState state, RelayInfo info)
{
Mobile from = state.Mobile;
switch (info.ButtonID)
{
case 0: return;
case 1: // Select Wheat Based
m_Context.LastGroup = Group.WheatBased;
break;
case 2: // Select Water Based
m_Context.LastGroup = Group.WaterBased;
break;
case 3: // Select Other
m_Context.LastGroup = Group.Other;
break;
case 4: // Distillation Strength
if (m_Context.MakeStrong)
m_Context.MakeStrong = false;
else
m_Context.MakeStrong = true;
break;
case 5: // Mark Option
if (m_Context.Mark)
m_Context.Mark = false;
else
m_Context.Mark = true;
break;
case 6: // Label
from.Prompt = new LabelPrompt(m_Context);
from.SendLocalizedMessage(1150734); // Please enter the text with which you wish to label the liquor that you will distill. You many enter up to 15 characters. Leave the text area blank to remove any existing text.
return;
case 7: // Execute Distillation
from.Target = new DistillationTarget(from, m_Context, m_Def);
from.SendLocalizedMessage(1150810); // Target an empty liquor barrel in your backpack. If you don't have one already, you can use the Carpentry skill to make one.
return;
default:
{
if (info.ButtonID < 2000) // Select Liquor Type
{
int sel = info.ButtonID - 1000;
if (sel >= 0 && sel < DistillationSystem.CraftDefs.Count)
{
CraftDefinition def = DistillationSystem.CraftDefs[sel];
m_Context.LastLiquor = def.Liquor;
}
}
else // Select Yeast
{
int sel = info.ButtonID - 2000;
if(m_Def.Ingredients[0] == typeof(Yeast) && m_Def.Amounts.Length > 0)
{
int amt = m_Def.Amounts[0];
if (sel >= 0 && sel < amt)
{
from.Target = new YeastSelectionTarget(m_Context, sel);
from.SendLocalizedMessage(1150437); // Target the yeast in your backpack that you wish to toggle distillation item status on. Hit <ESC> to cancel.
return;
}
}
}
}
break;
}
from.SendGump(new DistillationGump(from));
}
private class LabelPrompt : Prompt
{
private DistillationContext m_Context;
public LabelPrompt(DistillationContext context)
{
m_Context = context;
}
public override void OnResponse(Mobile from, string text)
{
if (text == null || text.Length == 0)
m_Context.Label = null;
else if (text != null)
{
text = text.Trim();
if (text.Length > 15 || !Server.Guilds.BaseGuildGump.CheckProfanity(text))
from.SendMessage("That label is unacceptable. Please try again.");
else
m_Context.Label = text;
}
from.SendGump(new DistillationGump(from));
}
public override void OnCancel(Mobile from)
{
from.SendGump(new DistillationGump(from));
}
}
public class DistillationTarget : Target
{
private DistillationContext m_Context;
private CraftDefinition m_Def;
public DistillationTarget(Mobile from, DistillationContext context, CraftDefinition def)
: base(-1, false, TargetFlags.None)
{
m_Context = context;
m_Def = def;
BeginTimeout(from, TimeSpan.FromSeconds(30));
}
protected override void OnTarget(Mobile from, object targeted)
{
if (targeted is LiquorBarrel)
{
LiquorBarrel barrel = targeted as LiquorBarrel;
if (barrel.IsChildOf(from.Backpack))
{
if (barrel.IsMature)
from.SendLocalizedMessage(1150811); // This liquor barrel already contains liquor.
else if (!barrel.IsEmpty)
from.SendLocalizedMessage(1150802); // You realize that the liquor is on the process of maturation so you leave it alone.
else
{
double perc = m_Context.MakeStrong ? 2 : 1;
if (HasTotal(from, perc) && barrel != null)
{
double cooking = from.Skills[SkillName.Cooking].Value;
double alchemy = from.Skills[SkillName.Alchemy].Value / 2;
int resist = 0;
for (int i = 0; i < m_Context.SelectedYeast.Length; i++)
{
Yeast yeast = m_Context.SelectedYeast[i];
if (yeast != null)
resist += yeast.BacterialResistance;
}
int chance = (int)((cooking + alchemy + (resist * 12)) / 2.5);
if (chance > Utility.Random(100))
{
ConsumeTotal(from, perc);
m_Context.ClearYeasts();
from.SendLocalizedMessage(1150772); // You succeed at your distillation attempt.
Mobile marker = m_Context.Mark ? from : null;
from.PlaySound(0x2D6);
barrel.BeginDistillation(m_Def.Liquor, m_Def.MaturationDuration, m_Context.Label, m_Context.MakeStrong, marker);
}
else
{
from.PlaySound(0x2D6);
ConsumeTotal(from, perc / 2);
from.SendLocalizedMessage(1150745); // You have failed your distillation attempt and ingredients have been lost.
}
}
else
from.SendLocalizedMessage(1150747); // You don't have enough ingredients.
}
}
else
from.SendLocalizedMessage(1054107); // This item must be in your backpack.
}
else
from.SendMessage("That is not a liquor barrel.");
DistillationSystem.SendDelayedGump(from);
}
protected override void OnTargetCancel(Mobile from, TargetCancelType cancelType)
{
if (cancelType == TargetCancelType.Timeout)
from.SendLocalizedMessage(1150859); // You have waited too long to make your selection, your distillation attempt has timed out.
from.SendGump(new DistillationGump(from));
}
public static int GetAmount(Mobile from, Type type, Liquor liquor)
{
if (from == null || from.Backpack == null)
return 0;
Container pack = from.Backpack;
if (type == typeof(Pitcher))
{
int amount = 0;
BeverageType bType = liquor == Liquor.Brandy ? BeverageType.Wine : BeverageType.Water;
Item[] items = pack.FindItemsByType(type);
foreach (Item item in items)
{
Pitcher Pitcher = item as Pitcher;
if (Pitcher != null && Pitcher.Content == bType && Pitcher.Quantity >= Pitcher.MaxQuantity)
amount++;
}
return amount;
}
else if (type == typeof(PewterBowlOfCorn))
{
return pack.GetAmount(type) + pack.GetAmount(typeof(WoodenBowlOfCorn));
}
return pack.GetAmount(type);
}
private bool HasTotal(Mobile from, double percentage)
{
for (int i = 0; i < m_Def.Ingredients.Length; i++)
{
Type type = m_Def.Ingredients[i];
int toConsume = m_Def.Amounts[i];
if (i == 0 && type == typeof(Yeast))
{
for (int j = 0; j < toConsume; j++)
{
Yeast yeast = m_Context.SelectedYeast[j];
if (yeast == null || !yeast.IsChildOf(from.Backpack))
return false;
}
}
else
{
toConsume = (int)((double)toConsume * percentage);
if (GetAmount(from, type, m_Def.Liquor) < toConsume)
return false;
}
}
return true;
}
private void ConsumeTotal(Mobile from, double percentage)
{
if (from == null || from.Backpack == null)
return;
Container pack = from.Backpack;
for (int i = 0; i < m_Def.Ingredients.Length; i++)
{
Type type = m_Def.Ingredients[i];
int toConsume = m_Def.Amounts[i];
if (i == 0 && type == typeof(Yeast))
{
for (int j = 0; j < toConsume; j++)
{
Yeast yeast = m_Context.SelectedYeast[j];
if (yeast != null)
yeast.Consume();
}
}
else if (type == typeof(Pitcher))
{
toConsume = (int)((double)toConsume * percentage);
BeverageType bType = m_Def.Liquor == Liquor.Brandy ? BeverageType.Wine : BeverageType.Water;
Item[] items = pack.FindItemsByType(type);
foreach (Item item in items)
{
Pitcher Pitcher = item as Pitcher;
if (Pitcher != null && Pitcher.Content == bType && Pitcher.Quantity >= Pitcher.MaxQuantity)
{
Pitcher.Quantity = 0;
toConsume--;
}
if (toConsume <= 0)
break;
}
}
else if (type == typeof(PewterBowlOfCorn))
{
toConsume = (int)((double)toConsume * percentage);
int totalPewter = pack.GetAmount(type);
int totalWooden = pack.GetAmount(typeof(WoodenBowlOfCorn));
if (totalPewter >= toConsume)
pack.ConsumeTotal(type, toConsume);
else
{
pack.ConsumeTotal(type, totalPewter);
toConsume -= totalPewter;
pack.ConsumeTotal(typeof(WoodenBowlOfCorn), toConsume);
}
}
else
{
toConsume = (int)((double)toConsume * percentage);
pack.ConsumeTotal(type, toConsume);
}
}
}
}
private class YeastSelectionTarget : Target
{
private int m_Index;
private DistillationContext m_Context;
public YeastSelectionTarget(DistillationContext context, int index)
: base(-1, false, TargetFlags.None)
{
m_Index = index;
m_Context = context;
}
protected override void OnTarget(Mobile from, object targeted)
{
if (targeted is Yeast)
{
Yeast yeast = targeted as Yeast;
if (yeast.IsChildOf(from.Backpack))
{
if (!m_Context.YeastInUse(yeast))
{
m_Context.SelectedYeast[m_Index] = yeast;
from.SendLocalizedMessage(1150740); // You have chosen the yeast.
}
else
from.SendLocalizedMessage(1150742); // You have already chosen other yeast.
}
else
from.SendLocalizedMessage(1054107); // This item must be in your backpack.
}
else
from.SendLocalizedMessage(1150741); // That is not yeast.
from.SendGump(new DistillationGump(from));
}
protected override void OnTargetCancel(Mobile from, TargetCancelType cancelType)
{
if (m_Context.SelectedYeast[m_Index] != null)
{
m_Context.SelectedYeast[m_Index] = null;
from.SendLocalizedMessage(1150743); // You no longer choose this yeast.
}
from.SendGump(new DistillationGump(from));
}
}
}
}