using System; using Server; using Server.Gumps; using Server.Items; using Server.Network; using Server.Factions; namespace Server.Gumps { public class TurboSlotGump : Gump { private TurboSlot m_Slot; private int[] m_Symbols; public enum SlotThemeType { Classic, ClassicII, ClassicIII, FarmerFaceoff, GruesomeGambling, Holiday1, LadyLuck, MinerMadness, OffToTheRaces, Pirates, PowerScrolls, StatScrolls, TailorTreats, TrophyHunter } public TurboSlotGump(TurboSlot Slot, int[] Symbols) : base(25, 25) { m_Slot = Slot; m_Symbols = Symbols; if (m_Slot == null) return; // Something is obviously wrong! int dispy = m_Symbols[13]; int backgroundcolor = m_Symbols[14]; int titlecolor = m_Symbols[15]; int titlestyle = m_Symbols[16]; int headingcolor1 = m_Symbols[17]; int headingcolor2 = m_Symbols[18]; int paycolor = m_Symbols[19]; int slotart = m_Symbols[20]; decimal payout = 0; string[] Jackpot = { null, null }; bool progressive = false; int ProgressiveHue = 0; int PayoutHue = 37; int lastjackpotstarty = 85; int progstarty = 65; int symbolxoffset = 0; string text = null; int tilecolor = 9304; if ((SlotThemeType)m_Slot.SlotTheme == SlotThemeType.GruesomeGambling || (SlotThemeType)m_Slot.SlotTheme == SlotThemeType.StatScrolls) tilecolor = 9204; else if ((SlotThemeType)m_Slot.SlotTheme == SlotThemeType.Holiday1) tilecolor = 0xBBC; else if ((SlotThemeType)m_Slot.SlotTheme == SlotThemeType.FarmerFaceoff || (SlotThemeType)m_Slot.SlotTheme == SlotThemeType.OffToTheRaces || (SlotThemeType)m_Slot.SlotTheme == SlotThemeType.TrophyHunter) tilecolor = 2524; else if ((SlotThemeType)m_Slot.SlotTheme == SlotThemeType.PowerScrolls) { tilecolor = 9354; symbolxoffset = 16; } if (backgroundcolor == 0) text = String.Format("
{2}
", titlestyle, titlecolor, m_Slot.Name); else if (backgroundcolor < 0) text = String.Format("
{2}
", titlestyle, titlecolor, m_Slot.Name); else text = String.Format("
{3}
", backgroundcolor, titlestyle, titlecolor, m_Slot.Name); if ((m_Slot.ProgSlotMaster != null && !m_Slot.ProgSlotMaster.Deleted && ((TurboSlot)m_Slot.ProgSlotMaster).ProgIsMaster) || m_Slot.ProgIsMaster) { progressive = true; lastjackpotstarty = 110; if (m_Slot.ProgIsMaster) { //pjackpot += m_Slot.ProgJackpot; ProgressiveHue = m_Slot.Hue; } else { //pjackpot += ((TurboSlot) m_Slot.ProgSlotMaster).ProgJackpot; ProgressiveHue = ((TurboSlot)m_Slot.ProgSlotMaster).Hue; } ProgressiveHue += -1; if (ProgressiveHue < 0) ProgressiveHue = 1149; } Closable = true; Disposable = true; Dragable = true; Resizable = false; AddPage(0); AddBackground(18, 64, 371, 278, 5120); AddBackground(32, 193, 345, 100, 2620); AddImageTiled(23, 298, 363, 10, 5121); AddHtml(30, 65, 170, 23, @text, (bool)false, (bool)false); if (m_Slot.ShowPayback || (m_Slot.InUseBy != null && m_Slot.InUseBy.AccessLevel != AccessLevel.Player)) { float payoutdif = Math.Abs(m_Slot.w_Percentage - m_Slot.WinningPercentage); PayoutHue = 267; if (payoutdif > 15.0f || m_Slot.WinningPercentage > 100.0f) PayoutHue = 37; else if (payoutdif > 7.0f) PayoutHue = 55; else if (payoutdif > 3.0f) PayoutHue = 87; text = String.Format("{0:##0.00}%", m_Slot.WinningPercentage); AddLabel(205, 65, headingcolor1, @"Payback Percentage:"); AddLabel(330, 65, PayoutHue, @text); progstarty = 85; if (progressive) lastjackpotstarty = 125; if (m_Slot.InUseBy != null && m_Slot.InUseBy.AccessLevel != AccessLevel.Player) { if (m_Slot.w_Percentage > 99.5f) PayoutHue = 37; else if (m_Slot.w_Percentage > 90.0f) PayoutHue = 267; else if (m_Slot.w_Percentage > 80.0f) PayoutHue = 87; else if (m_Slot.w_Percentage > 60.0f) PayoutHue = 55; else if (m_Slot.w_Percentage > 40.0f) PayoutHue = 37; string[] pstring = new string[] { "L", "N", "T", "E", "C", "R" }; text = String.Format("({0})", pstring[(int)m_Slot.CurrentPayback]); if ((int)m_Slot.SlotPaybackOdds == 5) AddLabel(208, 80, 37, @text); else AddLabel(208, 80, headingcolor1, @text); AddLabel(232, 80, headingcolor1, @"Statisical Odds:"); text = String.Format("{0:##0.00}%", m_Slot.w_Percentage); AddLabel(330, 80, PayoutHue, @text); progstarty = 155; lastjackpotstarty = 94; } } AddImageTiled(37, 200, 335, 86, 9354); AddImageTiled(150, 202, 2, 83, 9353); AddLabel(30, 100, headingcolor2, @"Cost: "); AddLabel(65, 100, paycolor, m_Slot.Cost.ToString()); AddLabel(30, 120, headingcolor2, @"Credits: "); AddLabel(80, 120, paycolor, m_Slot.Won.ToString()); AddLabel(30, 140, headingcolor2, @"Last Pay: "); AddLabel(92, 140, paycolor, m_Slot.LastPay.ToString()); AddButton(30, 163, 4026, 4027, 11, GumpButtonType.Reply, 0); AddLabel(65, 164, headingcolor1, @"View Pay Table"); AddButton(30, 307, 4020, 4021, 12, GumpButtonType.Reply, 0); if (m_Slot.FreeSpin) AddLabel(65, 307, headingcolor2, @"Free"); else AddLabel(65, 307, headingcolor1, @"Spin"); AddButton(118, 307, 4029, 4030, 13, GumpButtonType.Reply, 0); AddLabel(153, 307, headingcolor1, @"Cash Out"); AddButton(235, 300, 4037, 4036, 14, GumpButtonType.Reply, 0); AddLabel(270, 307, headingcolor1, @"ATM"); AddImageTiled(60, 205, 75, 75, tilecolor); AddImageTiled(167, 205, 75, 75, tilecolor); AddImageTiled(274, 205, 75, 75, tilecolor); AddImageTiled(258, 202, 2, 83, 9353); if (slotart != 0) ShowSymbol(155, 90, slotart); if (m_Slot.LastWonBy != null && !m_Slot.LastWonBy.Deleted) { AddLabel(230, lastjackpotstarty, headingcolor2, "Last Jackpot won by:"); text = String.Format("
{0}", m_Slot.LastWonBy.Name); AddHtml(205, lastjackpotstarty + 15, 180, 15, @text, (bool)false, (bool)false); text = String.Format("{0:MM/dd/yy hh:mm:ss tt}", m_Slot.LastWonByDate); AddLabel(205, lastjackpotstarty + 30, headingcolor2, "Date:"); AddLabel(237, lastjackpotstarty + 30, paycolor, text); text = String.Format("{0:##,###,### Gold!}", m_Slot.LastWonAmount); AddLabel(202, lastjackpotstarty + 45, headingcolor2, "Value:"); AddLabel(237, lastjackpotstarty + 45, paycolor, text); } if (progressive) { Jackpot = m_Slot.GetJackpotPayoutStr(0, out payout); AddHtml(245, progstarty, 356, 23, @"Progressive Jackpot", (bool)false, (bool)false); AddLabel(280, progstarty + 15, ProgressiveHue, Jackpot[0]); } ShowSymbol(75 - symbolxoffset, 220 - dispy / 3, m_Slot.ReelOne); ShowSymbol(183 - symbolxoffset, 220 - dispy / 3, m_Slot.ReelTwo); ShowSymbol(290 - symbolxoffset, 220 - dispy / 3, m_Slot.ReelThree); if (Utility.Random(25000) == 45) CEOCookie(headingcolor2); } private void CEOCookie(int hue) { AddImageTiled(310, 50, 142, 230, 990); AddLabel(20, 230, hue, "TurboSlot Author, CEO, says \"Hello! Enjoying my slot machine?\" :)"); if (m_Slot.InUseBy != null) m_Slot.InUseBy.PlaySound(Utility.RandomList(1358, 1359, 1360, 1361, 1362, 1363, 1368, 1382)); } private void ShowSymbol(int x, int y, int symbol) { string text = null; switch (symbol) { case 0: break; case 90001: text = String.Format("
7
"); AddHtml(x, y + 10, 40, 50, @text, (bool)false, (bool)false); break; case 90002: text = String.Format("
7
"); AddHtml(x, y + 10, 40, 50, @text, (bool)false, (bool)false); break; case 90003: text = String.Format("
7
"); AddHtml(x, y + 10, 40, 50, @text, (bool)false, (bool)false); break; case 90004: text = String.Format("
7
"); AddHtml(x, y + 10, 40, 50, @text, (bool)false, (bool)false); break; case 90100: //White "Lucky" Necklace & Golden Robe AddItem(x, y, 7940, 2213); AddItem(x - 8, y + 3, 4232, 1150); break; case 90101: //Golden Cloak and Sash AddItem(x, y, 5424, 2213); break; case 90102: //Golden Sash AddItem(x, y + 5, 5441, 2213); break; case 90103: //Golden Bars AddItem(x, y, 7153, 2213); break; case 90104: //Golden Horseshoes AddItem(x, y, 4022, 2213); break; case 90110: //Golden Statue AddItem(x - 3, y - 18, 4782, 2213); break; case 90200: // Barbed Kit AddItem(x, y, 3997, 2128); break; case 90201: // Horned Kit AddItem(x, y, 3997, 2116); break; case 90202: // Spined Kit AddItem(x, y, 3997, 2219); break; case 90203: // Purple Fancy Shirt AddItem(x, y, 7933, 23); break; case 90204: // Colored Folded Cloth AddItem(x, y, 5984, 1151); break; case 90210: // Loom AddItem(x - 10, y - 12, 4197); AddItem(x + 15, y + 25, 4198); break; case 90250: // Sea Horse AddItem(x, y, 8479, 694); break; case 90300: // Stat Scroll AddItem(x, y+15, 5359, 1153); break; case 90301: // TrueHarrower AddItem(x-10, y+10, 9736, 1175); break; case 90302: // Red Corpser AddItem(x, y, 8402, 36); break; case 90303: // Fake Harrower AddItem(x+10, y+5, 9659); break; case 90304: // OrnateCrown AddItem(x, y+15, 5201, 1269); break; case 90305: // Summon Altars AddItem(x, y+15, 6587, 1109); break; case 90306: // Red Skull Candle AddItem(x, y+5, 6228, 37); break; default: AddItem(x, y, symbol); break; } } private void CloseAllGumps(Mobile from) { from.CloseGump(typeof(TurboSlotGump)); from.CloseGump(typeof(NewMinerBonusGump)); from.CloseGump(typeof(TurboSlotPayTableGump)); } public override void OnResponse(NetState state, RelayInfo info) { Mobile from = state.Mobile; if (from == null || m_Slot == null) return; if (m_Slot.InUseBy == null) { from.SendMessage("Someone else played this machine while you were idle. Double click it again to resume play."); CloseAllGumps(from); return; } if (from.Serial != m_Slot.InUseBy.Serial) { from.SendMessage("You have left this machine idle too long and {0} has taken it over!", m_Slot.InUseBy.Name); CloseAllGumps(from); return; } if (!m_Slot.Active || m_Slot.Deleted) { from.SendMessage("This slot machine is no longer available."); if (m_Slot.Won != 0) { from.SendMessage("Cashing out your winnings of {0} gold.", m_Slot.Won); m_Slot.DoCashOut(from); } CloseAllGumps(from); m_Slot.InUseBy = null; return; } if (!from.Alive) { from.SendMessage("Ghosts can not play this game."); if (m_Slot.Won != 0) { from.SendMessage("Cashing out your winnings of {0} gold.", m_Slot.Won); m_Slot.DoCashOut(from); } CloseAllGumps(from); m_Slot.InUseBy = null; return; } m_Slot.LastPlayed = DateTime.Now; if (info.ButtonID == 0) // Close { if (m_Slot.Won != 0) { from.SendMessage("You quit playing this machine and cashout your credits.", m_Slot.Won); m_Slot.DoCashOut(from); CloseAllGumps(from); } m_Slot.InUseBy = null; return; } if (info.ButtonID == 11) // Pay Table { from.CloseGump(typeof(TurboSlotPayTableGump)); from.SendGump(new TurboSlotGump(m_Slot, m_Symbols)); from.SendGump(new TurboSlotPayTableGump(m_Slot, m_Symbols)); return; } if (info.ButtonID == 12) // Spin { int amount = 0; if (!from.InRange(m_Slot.GetWorldLocation(), 2) || !from.InLOS(m_Slot)) { from.SendMessage("You are too far away from the machine, others may now play it."); if (m_Slot.Won != 0) { m_Slot.DoCashOut(from); m_Slot.InUseBy = null; } return; } if (m_Slot.FreeSpin) { m_Slot.DoSpin(from); m_Slot.LastPay = 0; } else { if (from.Backpack.ConsumeTotal(typeof(CasinoToken), 1)) { m_Slot.DoSpin(from); m_Slot.LastPay = 0; } else if (from.Backpack.ConsumeTotal(typeof(Gold), m_Slot.Cost)) { m_Slot.DoSpin(from); m_Slot.LastPay = 0; m_Slot.SlotTotalCollected += m_Slot.Cost; } else if (m_Slot.Won >= m_Slot.Cost) { m_Slot.SlotWon -= m_Slot.Cost; m_Slot.DoSpin(from); m_Slot.LastPay = 0; m_Slot.SlotTotalCollected += m_Slot.Cost; } else if (m_Slot.CashCheck(from, out amount)) { from.SendMessage("Cashing bank check for {0} gold from your backpack, you may now spin again.", amount); from.SendGump(new TurboSlotGump(m_Slot, m_Symbols)); } else { from.SendMessage("You must have at least {0} gold, or credits on the machine to play.", m_Slot.Cost); from.SendGump(new TurboSlotGump(m_Slot, m_Symbols)); } } return; } if (info.ButtonID == 13) // Cash Out { if (m_Slot.Won != 0) m_Slot.DoCashOut(from); from.SendGump(new TurboSlotGump(m_Slot, m_Symbols)); return; } if (info.ButtonID == 14) // Withdraw m_Slot.CreditATMIncrements from bank { if (m_Slot.Won >= m_Slot.CreditATMLimit) { from.SendMessage("This machine is at or over its credit limit."); } else { int amount = (m_Slot.CreditATMLimit - m_Slot.Won < m_Slot.CreditATMIncrements) ? m_Slot.CreditATMLimit - m_Slot.Won : m_Slot.CreditATMIncrements; if (from.BankBox.ConsumeTotal(typeof(Gold), amount)) { m_Slot.SlotWon += amount; from.SendMessage("{0} gold has been withdrawn from your bank and added to this machine's credit counter.", amount); Effects.PlaySound(new Point3D(m_Slot.X, m_Slot.Y, m_Slot.Z), m_Slot.Map, 501); } else from.SendMessage("Insufficient funds for ATM withdrawal."); } from.SendGump(new TurboSlotGump(m_Slot, m_Symbols)); return; } from.SendMessage("Invalid button detected. Fix your macro!"); } } }