Files
abysmal-isle/Scripts/SubSystem/LockpickingGump/LockpickingGump.cs
2023-11-28 23:48:34 -05:00

155 lines
3.4 KiB
C#

using System;
using System.Linq;
using Server.Items;
using Server.Mobiles;
namespace Server.Gumps
{
public class LockpickingGump : BaseGump
{
private const int PinUpId = 116;
private const int PinDownId = 115;
private const int LockpickId = 114;
private const int PinWidth = 520;
private const int PinHeight = 65;
private const int LockpickWidth = 52;
private const int LockpickHeight = 184;
private const int MaxPins = 10;
private const int MinPins = 3;
private int PinsToPick;
private int[] PressedPins;
private int[] Combination;
private int CurrentPinIndex;
private ILockpickable Lpable;
private Lockpick Lpick;
public LockpickingGump(PlayerMobile pm, ILockpickable lpable, Lockpick lp)
: base(pm)
{
Lpable = lpable;
Lpick = lp;
double requiredSkill = lpable.RequiredSkill;
double lockpickSkill = pm.Skills[SkillName.Lockpicking].Value;
PinsToPick = MinPins + (int)Math.Max(0, Math.Floor((1 - lockpickSkill / requiredSkill) * (MaxPins - MinPins)));
int i;
Combination = new int[10];
PressedPins = new int[10];
Random rnd = new Random();
for (i = 0; i < Combination.Length; i++)
Combination[i] = i+1;
Combination = Combination.OrderBy(x => rnd.Next()).ToArray();
for (i = 0; i < 10 - PinsToPick; i++)
PressedPins[i] = Combination[i];
CurrentPinIndex = i;
AddGumpLayout();
}
public override void AddGumpLayout()
{
User.CloseGump(this.GetType());
if (!Lpable.Locked)
{
User.SendMessage("This lock is already unlocked.");
return;
}
int borders = 16;
int title = 0;
AddBackground(0, 0, PinWidth + 2 * borders, PinHeight + LockpickHeight + 2 * borders + title, 2620);
int i = 0;
for (i = 1; i <= 10 ; i++)
{
if (PressedPins.Contains(i))
AddButton((i - 1) * LockpickWidth + borders, borders + title, PinUpId, PinUpId, i, GumpButtonType.Reply, 0);
else
AddButton((i - 1) * LockpickWidth + borders, borders + title, PinDownId, PinDownId, i, GumpButtonType.Reply, 0);
}
AddImage(borders, borders + title + LockpickHeight, LockpickId, 0);
}
public override void OnResponse(RelayInfo info)
{
Item lpable = Lpable as Item;
if(lpable == null || lpable.Deleted || !lpable.IsAccessibleTo(User) || !lpable.InRange(User.Location, 1))
{
this.Close();
return;
}
int id = info.ButtonID;
if (id == 0)
{
this.Close();
return;
}
if (!PressedPins.Contains(id))
{
if (Lpick.Amount < 1)
{
User.SendMessage("You are out of lockpicks!");
this.Close();
return;
}
int rnd = Utility.Random(4);
if (rnd == 0)
{
User.PlaySound(0x3A4);
Lpick.Consume();
}
else
User.PlaySound(0x3B9 + rnd);
PressedPins[CurrentPinIndex] = id;
CurrentPinIndex++;
}
if (CurrentPinIndex >= 10)
{
User.PlaySound(0x241);
Timer.DelayCall(TimeSpan.FromMilliseconds(500.0), CheckCombination);
}
Refresh();
}
public void CheckCombination()
{
if (Combination.SequenceEqual(PressedPins))
{
User.PlaySound(0x0EA);
Lpable.LockPick(User);
User.SendMessage("You successfully pick the lock!");
this.Close();
}
else //retry
{
int i;
PressedPins = new int[10];
User.SendMessage("You failed to pick the lock.");
for (i = 0; i < 10 - PinsToPick; ++i)
PressedPins[i] = Combination[i];
CurrentPinIndex = i;
Refresh();
}
}
}
}