ModernUO/Projects/Scripts/Engines/Factions/Gumps/FinanceGump.cs
2019-08-02 18:16:11 -07:00

292 lines
9.5 KiB
C#

using System;
using System.Collections.Generic;
using Server.Gumps;
using Server.Mobiles;
using Server.Multis;
using Server.Network;
namespace Server.Factions
{
public class FinanceGump : FactionGump
{
private static int[] m_PriceOffsets =
{
-30, -25, -20, -15, -10, -5,
+50, +100, +150, +200, +250, +300
};
private Faction m_Faction;
private PlayerMobile m_From;
private Town m_Town;
public FinanceGump(PlayerMobile from, Faction faction, Town town) : base(50, 50)
{
m_From = from;
m_Faction = faction;
m_Town = town;
AddPage(0);
AddBackground(0, 0, 320, 410, 5054);
AddBackground(10, 10, 300, 390, 3000);
#region General
AddPage(1);
AddHtmlLocalized(20, 30, 260, 25, 1011541); // FINANCE MINISTER
AddHtmlLocalized(55, 90, 200, 25, 1011539); // CHANGE PRICES
AddButton(20, 90, 4005, 4007, 0, GumpButtonType.Page, 2);
AddHtmlLocalized(55, 120, 200, 25, 1011540); // BUY SHOPKEEPERS
AddButton(20, 120, 4005, 4007, 0, GumpButtonType.Page, 3);
AddHtmlLocalized(55, 150, 200, 25, 1011495); // VIEW FINANCES
AddButton(20, 150, 4005, 4007, 0, GumpButtonType.Page, 4);
AddHtmlLocalized(55, 360, 200, 25, 1011441); // EXIT
AddButton(20, 360, 4005, 4007, 0);
#endregion
#region Change Prices
AddPage(2);
AddHtmlLocalized(20, 30, 200, 25, 1011539); // CHANGE PRICES
for (int i = 0; i < m_PriceOffsets.Length; ++i)
{
int ofs = m_PriceOffsets[i];
int x = 20 + i / 6 * 150;
int y = 90 + i % 6 * 30;
AddRadio(x, y, 208, 209, town.Tax == ofs, i + 1);
if (ofs < 0)
AddLabel(x + 35, y, 0x26, string.Concat("- ", -ofs, "%"));
else
AddLabel(x + 35, y, 0x12A, string.Concat("+ ", ofs, "%"));
}
AddRadio(20, 270, 208, 209, town.Tax == 0, 0);
AddHtmlLocalized(55, 270, 90, 25, 1011542); // normal
AddHtmlLocalized(55, 330, 200, 25, 1011509); // Set Prices
AddButton(20, 330, 4005, 4007, ToButtonID(0, 0));
AddHtmlLocalized(55, 360, 200, 25, 1011067); // Previous page
AddButton(20, 360, 4005, 4007, 0, GumpButtonType.Page, 1);
#endregion
#region Buy Shopkeepers
AddPage(3);
AddHtmlLocalized(20, 30, 200, 25, 1011540); // BUY SHOPKEEPERS
List<VendorList> vendorLists = town.VendorLists;
for (int i = 0; i < vendorLists.Count; ++i)
{
VendorList list = vendorLists[i];
AddButton(20, 90 + i * 40, 4005, 4007, 0, GumpButtonType.Page, 5 + i);
AddItem(55, 90 + i * 40, list.Definition.ItemID);
AddHtmlText(100, 90 + i * 40, 200, 25, list.Definition.Label, false, false);
}
AddHtmlLocalized(55, 360, 200, 25, 1011067); // Previous page
AddButton(20, 360, 4005, 4007, 0, GumpButtonType.Page, 1);
#endregion
#region View Finances
AddPage(4);
int financeUpkeep = town.FinanceUpkeep;
int sheriffUpkeep = town.SheriffUpkeep;
int dailyIncome = town.DailyIncome;
int netCashFlow = town.NetCashFlow;
AddHtmlLocalized(20, 30, 300, 25, 1011524); // FINANCE STATEMENT
AddHtmlLocalized(20, 80, 300, 25, 1011538); // Current total money for town :
AddLabel(20, 100, 0x44, town.Silver.ToString());
AddHtmlLocalized(20, 130, 300, 25, 1011520); // Finance Minister Upkeep :
AddLabel(20, 150, 0x44, financeUpkeep.ToString("N0")); // NOTE: Added 'N0'
AddHtmlLocalized(20, 180, 300, 25, 1011521); // Sheriff Upkeep :
AddLabel(20, 200, 0x44, sheriffUpkeep.ToString("N0")); // NOTE: Added 'N0'
AddHtmlLocalized(20, 230, 300, 25, 1011522); // Town Income :
AddLabel(20, 250, 0x44, dailyIncome.ToString("N0")); // NOTE: Added 'N0'
AddHtmlLocalized(20, 280, 300, 25, 1011523); // Net Cash flow per day :
AddLabel(20, 300, 0x44, netCashFlow.ToString("N0")); // NOTE: Added 'N0'
AddHtmlLocalized(55, 360, 200, 25, 1011067); // Previous page
AddButton(20, 360, 4005, 4007, 0, GumpButtonType.Page, 1);
#endregion
#region Shopkeeper Pages
for (int i = 0; i < vendorLists.Count; ++i)
{
VendorList vendorList = vendorLists[i];
AddPage(5 + i);
AddHtmlText(60, 30, 300, 25, vendorList.Definition.Header, false, false);
AddItem(20, 30, vendorList.Definition.ItemID);
AddHtmlLocalized(20, 90, 200, 25, 1011514); // You have :
AddLabel(230, 90, 0x26, vendorList.Vendors.Count.ToString());
AddHtmlLocalized(20, 120, 200, 25, 1011515); // Maximum :
AddLabel(230, 120, 0x256, vendorList.Definition.Maximum.ToString());
AddHtmlLocalized(20, 150, 200, 25, 1011516); // Cost :
AddLabel(230, 150, 0x44, vendorList.Definition.Price.ToString("N0")); // NOTE: Added 'N0'
AddHtmlLocalized(20, 180, 200, 25, 1011517); // Daily Pay :
AddLabel(230, 180, 0x37, vendorList.Definition.Upkeep.ToString("N0")); // NOTE: Added 'N0'
AddHtmlLocalized(20, 210, 200, 25, 1011518); // Current Silver :
AddLabel(230, 210, 0x44, town.Silver.ToString("N0")); // NOTE: Added 'N0'
AddHtmlLocalized(20, 240, 200, 25, 1011519); // Current Payroll :
AddLabel(230, 240, 0x44, financeUpkeep.ToString("N0")); // NOTE: Added 'N0'
AddHtmlText(55, 300, 200, 25, vendorList.Definition.Label, false, false);
if (town.Silver >= vendorList.Definition.Price)
AddButton(20, 300, 4005, 4007, ToButtonID(1, i));
else
AddImage(20, 300, 4020);
AddHtmlLocalized(55, 360, 200, 25, 1011067); // Previous page
AddButton(20, 360, 4005, 4007, 0, GumpButtonType.Page, 3);
}
#endregion
}
public override int ButtonTypes => 2;
public override void OnResponse(NetState sender, RelayInfo info)
{
if (!m_Town.IsFinance(m_From) || m_Town.Owner != m_Faction)
{
m_From.SendLocalizedMessage(1010339); // You no longer control this city
return;
}
if (!FromButtonID(info.ButtonID, out int type, out int index))
return;
switch (type)
{
case 0: // general
{
switch (index)
{
case 0: // set price
{
int[] switches = info.Switches;
if (switches.Length == 0)
break;
int opt = switches[0];
int newTax = 0;
if (opt >= 1 && opt <= m_PriceOffsets.Length)
newTax = m_PriceOffsets[opt - 1];
if (m_Town.Tax == newTax)
break;
if (m_From.AccessLevel == AccessLevel.Player && !m_Town.TaxChangeReady)
{
TimeSpan remaining = DateTime.UtcNow - (m_Town.LastTaxChange + Town.TaxChangePeriod);
if (remaining.TotalMinutes < 4)
m_From.SendLocalizedMessage(
1042165); // You must wait a short while before changing prices again.
else if (remaining.TotalMinutes < 10)
m_From.SendLocalizedMessage(
1042166); // You must wait several minutes before changing prices again.
else if (remaining.TotalHours < 1)
m_From.SendLocalizedMessage(
1042167); // You must wait up to an hour before changing prices again.
else if (remaining.TotalHours < 4)
m_From.SendLocalizedMessage(
1042168); // You must wait a few hours before changing prices again.
else
m_From.SendLocalizedMessage(
1042169); // You must wait several hours before changing prices again.
}
else
{
m_Town.Tax = newTax;
if (m_From.AccessLevel == AccessLevel.Player)
m_Town.LastTaxChange = DateTime.UtcNow;
}
break;
}
}
break;
}
case 1: // make vendor
{
List<VendorList> vendorLists = m_Town.VendorLists;
if (index >= 0 && index < vendorLists.Count)
{
VendorList vendorList = vendorLists[index];
if (Town.FromRegion(m_From.Region) != m_Town)
{
m_From.SendLocalizedMessage(1010305); // You must be in your controlled city to buy Items
}
else if (vendorList.Vendors.Count >= vendorList.Definition.Maximum)
{
m_From.SendLocalizedMessage(
1010306); // You currently have too many of this enhancement type to place another
}
else if (BaseBoat.FindBoatAt(m_From.Location, m_From.Map) != null)
{
m_From.SendMessage("You cannot place a vendor here");
}
else if (m_Town.Silver >= vendorList.Definition.Price)
{
BaseFactionVendor vendor = vendorList.Construct(m_Town, m_Faction);
if (vendor != null)
{
m_Town.Silver -= vendorList.Definition.Price;
vendor.MoveToWorld(m_From.Location, m_From.Map);
vendor.Home = vendor.Location;
}
}
}
break;
}
}
}
}
}