524 lines
20 KiB
C#
524 lines
20 KiB
C#
using Server;
|
|
using System;
|
|
using Server.Targeting;
|
|
using Server.Gumps;
|
|
using Server.Network;
|
|
|
|
namespace Server.Items
|
|
{
|
|
public enum BinderType
|
|
{
|
|
None,
|
|
StatScroll,
|
|
PowerScroll,
|
|
SOT
|
|
}
|
|
|
|
public class ScrollBinderDeed : Item
|
|
{
|
|
private BinderType m_BinderType;
|
|
private SkillName m_Skill;
|
|
private double m_Value;
|
|
private int m_Needed;
|
|
private double m_Has;
|
|
|
|
[CommandProperty(AccessLevel.GameMaster)]
|
|
public BinderType BinderType { get { return m_BinderType; } set { m_BinderType = value; InvalidateProperties(); } }
|
|
|
|
[CommandProperty(AccessLevel.GameMaster)]
|
|
public SkillName Skill { get { return m_Skill; } set { m_Skill = value; InvalidateProperties(); } }
|
|
|
|
[CommandProperty(AccessLevel.GameMaster)]
|
|
public double Value { get { return m_Value; } set { m_Value = value; InvalidateProperties(); } }
|
|
|
|
[CommandProperty(AccessLevel.GameMaster)]
|
|
public int Needed { get { return m_Needed; } set { m_Needed = value; InvalidateProperties(); } }
|
|
|
|
[CommandProperty(AccessLevel.GameMaster)]
|
|
public double Has { get { return m_Has; } set { m_Has = value; InvalidateProperties(); } }
|
|
|
|
public override int LabelNumber { get { return 1113135; } } // Scroll Binder
|
|
|
|
[Constructable]
|
|
public ScrollBinderDeed()
|
|
: base(0x14F0)
|
|
{
|
|
LootType = LootType.Cursed;
|
|
Hue = 1636;
|
|
}
|
|
|
|
public override void GetProperties(ObjectPropertyList list)
|
|
{
|
|
base.GetProperties(list);
|
|
|
|
int v = (int)Value;
|
|
|
|
switch (BinderType)
|
|
{
|
|
case BinderType.None: break;
|
|
case BinderType.PowerScroll:
|
|
{
|
|
string skillName = SkillInfo.Table[(int)Skill].Name;
|
|
|
|
list.Add(1113149, string.Format("{0}\t{1}\t{2}\t{3}", v.ToString(), skillName, ((int)Has).ToString(), Needed.ToString())); // ~1_bonus~ ~2_type~: ~3_given~/~4_needed~
|
|
break;
|
|
}
|
|
case BinderType.StatScroll:
|
|
{
|
|
list.Add(1113149, string.Format("+{0}\t#{1}\t{2}\t{3}", v - 225, 1049477, ((int)Has).ToString(), Needed.ToString())); // ~1_bonus~ ~2_type~: ~3_given~/~4_needed~
|
|
break;
|
|
}
|
|
case BinderType.SOT:
|
|
{
|
|
string value = string.Format("{0:0.##}", Has);
|
|
string skillName = SkillInfo.Table[(int)Skill].Name;
|
|
int number;
|
|
|
|
if (Needed == 2)
|
|
number = 1113148; // ~1_type~ transcendence: ~2_given~/2.0
|
|
else
|
|
number = 1113620; // ~1_type~ transcendence: ~2_given~/5.0
|
|
|
|
list.Add(number, string.Format("{0}\t{1}", skillName, value));
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
public override void OnDoubleClick(Mobile from)
|
|
{
|
|
if (IsChildOf(from.Backpack))
|
|
{
|
|
from.Target = new InternalTarget(this);
|
|
|
|
int cliloc;
|
|
switch (BinderType)
|
|
{
|
|
default:
|
|
case BinderType.None:
|
|
cliloc = 1113141; break; // Target the scroll you wish to bind.
|
|
case BinderType.PowerScroll:
|
|
cliloc = 1113138; break; // Target the powerscroll you wish to bind.
|
|
case BinderType.StatScroll:
|
|
cliloc = 1113140; break; // Target the stats scroll you wish to bind.
|
|
case BinderType.SOT:
|
|
cliloc = 1113139; break; // Target the scroll of transcendence you wish to bind.
|
|
}
|
|
|
|
from.SendLocalizedMessage(cliloc);
|
|
}
|
|
}
|
|
|
|
public void OnTarget(Mobile from, object targeted)
|
|
{
|
|
if (targeted is Item && !((Item)targeted).IsChildOf(from.Backpack))
|
|
{
|
|
from.SendLocalizedMessage(1060640); // The item must be in your backpack to use it.
|
|
return;
|
|
}
|
|
|
|
switch (BinderType)
|
|
{
|
|
case BinderType.None:
|
|
{
|
|
if (targeted is PowerScroll)
|
|
{
|
|
PowerScroll ps = (PowerScroll)targeted;
|
|
|
|
if (ps.Value >= 120)
|
|
{
|
|
from.SendLocalizedMessage(1113144); // This scroll is already the highest of its type and cannot be bound.
|
|
return;
|
|
}
|
|
|
|
double value = ps.Value;
|
|
int needed = 0;
|
|
|
|
if (value == 105)
|
|
needed = 8;
|
|
else if (value == 110)
|
|
needed = 12;
|
|
else if (value == 115)
|
|
needed = 10;
|
|
else
|
|
return;
|
|
|
|
Value = value;
|
|
Needed = needed;
|
|
Has = 1;
|
|
Skill = ps.Skill;
|
|
BinderType = BinderType.PowerScroll;
|
|
ps.Delete();
|
|
}
|
|
else if (targeted is StatCapScroll)
|
|
{
|
|
StatCapScroll ss = (StatCapScroll)targeted;
|
|
|
|
if (ss.Value >= 250)
|
|
{
|
|
from.SendLocalizedMessage(1113144); //This scroll is already the highest of its type and cannot be bound.
|
|
return;
|
|
}
|
|
|
|
double value = ss.Value;
|
|
int needed = 0;
|
|
|
|
if (value == 230)
|
|
needed = 6;
|
|
else if (value == 235)
|
|
needed = 8;
|
|
else if (value == 240)
|
|
needed = 8;
|
|
else if (value == 245)
|
|
needed = 5;
|
|
else
|
|
return;
|
|
|
|
Value = value;
|
|
Needed = needed;
|
|
Has = 1;
|
|
BinderType = BinderType.StatScroll;
|
|
ss.Delete();
|
|
}
|
|
else if (targeted is ScrollOfTranscendence)
|
|
{
|
|
ScrollOfTranscendence sot = (ScrollOfTranscendence)targeted;
|
|
|
|
if (sot.Value >= 5.0)
|
|
{
|
|
from.SendLocalizedMessage(1113144); //This scroll is already the highest of its type and cannot be bound.
|
|
return;
|
|
}
|
|
|
|
Skill = sot.Skill;
|
|
BinderType = BinderType.SOT;
|
|
Needed = 2;
|
|
Has = sot.Value;
|
|
sot.Delete();
|
|
}
|
|
else
|
|
{
|
|
from.SendLocalizedMessage(1113142); // You may only bind powerscrolls, stats scrolls or scrolls of transcendence.
|
|
}
|
|
|
|
break;
|
|
}
|
|
case BinderType.PowerScroll:
|
|
{
|
|
if (targeted is PowerScroll)
|
|
{
|
|
PowerScroll ps = (PowerScroll)targeted;
|
|
|
|
if (ps.Skill != Skill || ps.Value != Value)
|
|
{
|
|
from.SendLocalizedMessage(1113143); // This scroll does not match the type currently being bound.
|
|
return;
|
|
}
|
|
|
|
Has++;
|
|
|
|
if (Has >= Needed)
|
|
{
|
|
GiveItem(from, new PowerScroll(Skill, Value + 5));
|
|
from.SendLocalizedMessage(1113145); // You've completed your binding and received an upgraded version of your scroll!
|
|
ps.Delete();
|
|
Delete();
|
|
}
|
|
else
|
|
{
|
|
ps.Delete();
|
|
}
|
|
}
|
|
else if (targeted is ScrollBinderDeed)
|
|
{
|
|
ScrollBinderDeed sb = (ScrollBinderDeed)targeted;
|
|
|
|
if (sb == this)
|
|
return;
|
|
|
|
if (sb.BinderType != BinderType || sb.Value != Value || sb.Skill != Skill)
|
|
{
|
|
from.SendLocalizedMessage(1113143); // This scroll does not match the type currently being bound.
|
|
return;
|
|
}
|
|
|
|
Has += sb.Has;
|
|
|
|
double rest = Has - Needed;
|
|
|
|
if (Has >= Needed)
|
|
{
|
|
GiveItem(from, new PowerScroll(Skill, Value + 5));
|
|
from.SendLocalizedMessage(1113145); // You've completed your binding and received an upgraded version of your scroll!
|
|
Delete();
|
|
}
|
|
|
|
if (rest > 0)
|
|
sb.Has = rest;
|
|
else
|
|
sb.Delete();
|
|
}
|
|
break;
|
|
}
|
|
case BinderType.StatScroll:
|
|
{
|
|
if (targeted is StatCapScroll)
|
|
{
|
|
StatCapScroll ss = (StatCapScroll)targeted;
|
|
|
|
if (ss.Value != Value)
|
|
{
|
|
from.SendLocalizedMessage(1113143); // This scroll does not match the type currently being bound.
|
|
return;
|
|
}
|
|
|
|
Has++;
|
|
|
|
if (Has >= Needed)
|
|
{
|
|
GiveItem(from, new StatCapScroll((int)Value + 5));
|
|
from.SendLocalizedMessage(1113145); // You've completed your binding and received an upgraded version of your scroll!
|
|
ss.Delete();
|
|
Delete();
|
|
}
|
|
else
|
|
{
|
|
ss.Delete();
|
|
}
|
|
}
|
|
else if (targeted is ScrollBinderDeed)
|
|
{
|
|
ScrollBinderDeed sb = (ScrollBinderDeed)targeted;
|
|
|
|
if (sb == this)
|
|
return;
|
|
|
|
if (sb.BinderType != BinderType || sb.Value != Value)
|
|
{
|
|
from.SendLocalizedMessage(1113143); // This scroll does not match the type currently being bound.
|
|
return;
|
|
}
|
|
|
|
Has += sb.Has;
|
|
|
|
double rest = Has - Needed;
|
|
|
|
if (Has >= Needed)
|
|
{
|
|
GiveItem(from, new StatCapScroll((int)Value + 5));
|
|
from.SendLocalizedMessage(1113145); // You've completed your binding and received an upgraded version of your scroll!
|
|
Delete();
|
|
}
|
|
|
|
if (rest > 0)
|
|
sb.Has = rest;
|
|
else
|
|
sb.Delete();
|
|
}
|
|
break;
|
|
}
|
|
case BinderType.SOT:
|
|
{
|
|
if (targeted is ScrollOfTranscendence)
|
|
{
|
|
ScrollOfTranscendence sot = (ScrollOfTranscendence)targeted;
|
|
|
|
if (sot.Skill != Skill)
|
|
{
|
|
from.SendLocalizedMessage(1113143); // This scroll does not match the type currently being bound.
|
|
return;
|
|
}
|
|
|
|
if (sot.Value >= 5.0)
|
|
{
|
|
from.SendLocalizedMessage(1113144); // This scroll is already the highest of its type and cannot be bound.
|
|
return;
|
|
}
|
|
|
|
double newValue = sot.Value + Has;
|
|
|
|
if (newValue > 2 && Needed == 2)
|
|
Needed = 5;
|
|
|
|
if (newValue == Needed)
|
|
{
|
|
GiveItem(from, new ScrollOfTranscendence(Skill, Needed));
|
|
from.SendLocalizedMessage(1113145); // You've completed your binding and received an upgraded version of your scroll!
|
|
Delete();
|
|
}
|
|
else if (newValue > Needed)
|
|
{
|
|
from.SendGump(new BinderWarningGump(newValue, this, sot, Needed));
|
|
}
|
|
else
|
|
{
|
|
Has += sot.Value;
|
|
sot.Delete();
|
|
}
|
|
}
|
|
else if (targeted is ScrollBinderDeed)
|
|
{
|
|
ScrollBinderDeed sb = (ScrollBinderDeed)targeted;
|
|
|
|
if (sb == this)
|
|
return;
|
|
|
|
if (sb.BinderType != BinderType || sb.Skill != Skill)
|
|
{
|
|
from.SendLocalizedMessage(1113143); // This scroll does not match the type currently being bound.
|
|
return;
|
|
}
|
|
|
|
double newValue = sb.Has + Has;
|
|
|
|
if (newValue > 2 && Needed == 2)
|
|
Needed = 5;
|
|
|
|
Has = newValue;
|
|
|
|
double rest = Has - Needed;
|
|
|
|
if (Has >= Needed)
|
|
{
|
|
GiveItem(from, new ScrollOfTranscendence(Skill, Needed));
|
|
from.SendLocalizedMessage(1113145); // You've completed your binding and received an upgraded version of your scroll!
|
|
Delete();
|
|
}
|
|
|
|
if (rest > 0)
|
|
{
|
|
sb.Has = rest;
|
|
}
|
|
else
|
|
{
|
|
sb.Delete();
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
public void GiveItem(Mobile from, Item item)
|
|
{
|
|
Container pack = from.Backpack;
|
|
|
|
if (pack == null || !pack.TryDropItem(from, item, false))
|
|
item.MoveToWorld(from.Location, from.Map);
|
|
}
|
|
|
|
private class InternalTarget : Target
|
|
{
|
|
private ScrollBinderDeed m_Binder;
|
|
|
|
public InternalTarget(ScrollBinderDeed binder) : base(-1, false, TargetFlags.None)
|
|
{
|
|
m_Binder = binder;
|
|
}
|
|
|
|
protected override void OnTarget(Mobile from, object targeted)
|
|
{
|
|
if (m_Binder != null && !m_Binder.Deleted && m_Binder.IsChildOf(from.Backpack))
|
|
m_Binder.OnTarget(from, targeted);
|
|
}
|
|
}
|
|
|
|
private class BinderWarningGump : Gump
|
|
{
|
|
private readonly double m_Value;
|
|
private readonly int m_Needed;
|
|
private ScrollOfTranscendence m_Scroll;
|
|
private ScrollBinderDeed m_Binder;
|
|
|
|
public BinderWarningGump(double value, ScrollBinderDeed binder, ScrollOfTranscendence scroll, int needed)
|
|
: base(340, 340)
|
|
{
|
|
TypeID = 0x236C;
|
|
|
|
m_Value = value;
|
|
m_Needed = needed;
|
|
m_Scroll = scroll;
|
|
m_Binder = binder;
|
|
|
|
AddPage(0);
|
|
|
|
AddBackground(0, 0, 291, 99, 0x13BE);
|
|
AddImageTiled(5, 6, 280, 20, 0xA40);
|
|
|
|
AddHtmlLocalized(9, 8, 280, 20, 1113146, 0x7FFF, false, false); // Binding Scrolls of Transcendence
|
|
AddImageTiled(5, 31, 280, 40, 0xA40);
|
|
|
|
AddHtmlLocalized(9, 35, 272, 40, 1113147, 0x7FFF, false, false); // Binding this SoT will exceed the cap of 5, some points will be lost. Proceed?
|
|
|
|
AddButton(215, 73, 0xFB7, 0xFB8, 1, GumpButtonType.Reply, 0);
|
|
AddHtmlLocalized(250, 75, 65, 20, 1006044, 0x7FFF, false, false); // OK
|
|
|
|
AddButton(5, 73, 0xFB1, 0xFB2, 0, GumpButtonType.Reply, 0);
|
|
AddHtmlLocalized(40, 75, 100, 20, 1060051, 0x7FFF, false, false); // CANCEL
|
|
}
|
|
|
|
public override void OnResponse(NetState sender, RelayInfo info)
|
|
{
|
|
Mobile from = sender.Mobile;
|
|
|
|
if (info.ButtonID == 1 && m_Scroll != null && m_Binder != null)
|
|
{
|
|
m_Binder.GiveItem(from, new ScrollOfTranscendence(m_Scroll.Skill, m_Needed));
|
|
m_Scroll.Delete();
|
|
m_Binder.Delete();
|
|
from.SendLocalizedMessage(1113145); // You've completed your binding and received an upgraded version of your scroll!
|
|
}
|
|
}
|
|
}
|
|
|
|
public ScrollBinderDeed(Serial serial) : base(serial)
|
|
{
|
|
}
|
|
|
|
public override void Serialize(GenericWriter writer)
|
|
{
|
|
base.Serialize(writer);
|
|
writer.Write((int)2);
|
|
|
|
writer.Write((int)m_BinderType);
|
|
writer.Write((int)m_Skill);
|
|
writer.Write(m_Value);
|
|
writer.Write(m_Needed);
|
|
writer.Write(m_Has);
|
|
}
|
|
|
|
public override void Deserialize(GenericReader reader)
|
|
{
|
|
base.Deserialize(reader);
|
|
int v = reader.ReadInt();
|
|
|
|
if (v < 2)
|
|
{
|
|
m_Skill = (SkillName)reader.ReadInt();
|
|
m_Value = reader.ReadDouble();
|
|
m_Needed = (int)reader.ReadDouble();
|
|
m_Has = reader.ReadDouble();
|
|
|
|
switch (reader.ReadInt())
|
|
{
|
|
case 0: m_BinderType = BinderType.None; break;
|
|
case 1: m_BinderType = BinderType.PowerScroll; break;
|
|
case 2: m_BinderType = BinderType.StatScroll; break;
|
|
case 3: m_BinderType = BinderType.SOT; break;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
m_BinderType = (BinderType)reader.ReadInt();
|
|
m_Skill = (SkillName)reader.ReadInt();
|
|
m_Value = reader.ReadDouble();
|
|
m_Needed = reader.ReadInt();
|
|
m_Has = reader.ReadDouble();
|
|
}
|
|
|
|
if (Hue != 1636)
|
|
Hue = 1636;
|
|
}
|
|
}
|
|
}
|