using System; using Server; using Server.Mobiles; using Server.ContextMenus; using Server.Targeting; using System.Collections; using Server.Gumps; using Server.Prompts; namespace Server.Items { #region Book public class PSBook : Item { private ArrayList m_Entries; private string m_BookName; public ArrayList Entries{get{ return m_Entries; }} [CommandProperty( AccessLevel.GameMaster )] public string BookName { get{ return m_BookName; } set{ m_BookName = value; InvalidateProperties(); } } [Constructable] public PSBook() : base(8793) { Weight = 1.0; LootType = LootType.Blessed; m_Entries = new ArrayList(); Hue = 1153; Name = "PowerScroll Book"; } public PSBook(Serial serial) : base(serial) { } public override void Serialize(GenericWriter writer) { base.Serialize(writer); writer.Write((int) 2); writer.WriteEncodedInt( (int) m_Entries.Count ); writer.Write( m_BookName ); for ( int i = 0; i < m_Entries.Count; ++i ) { object obj = m_Entries[i]; ((PSBookEntry)obj).Serialize( writer ); } } public override void Deserialize(GenericReader reader) { base.Deserialize(reader); int version = reader.ReadInt(); int count = reader.ReadEncodedInt(); m_Entries = new ArrayList( count ); switch ( version ) { case 2: { m_BookName = reader.ReadString(); for ( int i = 0; i < count; ++i ) { m_Entries.Add( new PSBookEntry( reader ) ); } break; } case 1: { // Convert the old PSBook entries for ( int i = 0; i < count; ++i ) { SkillName skill = (SkillName)reader.ReadEncodedInt(); double value = reader.ReadDouble(); m_Entries.Add( new PSBookEntry( skill, value ) ); } break; } } } public override void OnDoubleClick( Mobile from ) { if ( !IsChildOf( from.Backpack ) ) { from.SendMessage( "Book must be in your backpack to use it." ); } else if ( m_Entries.Count == 0 ) { from.SendLocalizedMessage( 1062381 ); } else if ( from is PlayerMobile ) { from.CloseGump( typeof( PSBookGump ) ); from.SendGump( new PSBookGump( from, this ) ); } } public override bool OnDragDrop( Mobile from, Item dropped ) { if ( dropped is PowerScroll ) { if ( !IsChildOf( from.Backpack ) ) { from.SendMessage( "You must have the book in your backpack to add scrolls to it." ); return false; } else if ( m_Entries.Count < 20 )//will hold 20 { PowerScroll scroll = (PowerScroll)dropped; this.Entries.Add( new PSBookEntry(scroll) ); InvalidateProperties(); from.SendMessage( "Scroll added to book." ); if ( from is PlayerMobile ) { from.CloseGump( typeof( PSBookGump ) ); from.SendGump( new PSBookGump( from, this ) ); } dropped.Delete(); return true; } else { from.SendMessage( "The book is full of scrolls." ); return false; } } from.SendMessage( "That is not a powerscroll." ); return false; } public override void GetProperties( ObjectPropertyList list ) { base.GetProperties( list ); list.Add( 1062344, m_Entries.Count.ToString() ); // Deeds in book: ~1_val~ if ( m_BookName != null && m_BookName.Length > 0 ) list.Add( 1062481, m_BookName ); // Book Name: ~1_val~ } public override void GetContextMenuEntries( Mobile from, ArrayList list ) { base.GetContextMenuEntries( from, list ); if ( from.CheckAlive() && IsChildOf( from.Backpack ) ) list.Add( new NameBookEntry( from, this ) ); //SetSecureLevelEntry.AddTo( from, this, list ); } private class NameBookEntry : ContextMenuEntry { private Mobile m_From; private PSBook m_Book; public NameBookEntry( Mobile from, PSBook book ) : base( 6216 ) { m_From = from; m_Book = book; } public override void OnClick() { if ( m_From.CheckAlive() && m_Book.IsChildOf( m_From.Backpack ) ) { m_From.Prompt = new NameBookPrompt( m_Book ); m_From.SendLocalizedMessage( 1062479 ); // Type in the new name of the book: } } } private class NameBookPrompt : Prompt { private PSBook m_Book; public NameBookPrompt( PSBook book ) { m_Book = book; } public override void OnResponse( Mobile from, string text ) { if ( text.Length > 40 ) text = text.Substring( 0, 40 ); if ( from.CheckAlive() && m_Book.IsChildOf( from.Backpack ) ) { m_Book.BookName = Utility.FixHtml( text.Trim() ); from.SendMessage( "The PowerScroll book's name has been changed." ); //from.SendLocalizedMessage( 1062480 ); // The bulk order book's name has been changed. } } public override void OnCancel( Mobile from ) { } } } #endregion #region Gump public class PSBookGump : Gump { private int y; public Mobile m_From; public PSBook m_Book; public PSBookGump(Mobile from, PSBook book) : base( 0, 0 ) { m_From = from; m_Book = book; y = (m_Book.Entries.Count -1)*20; Closable=true; Disposable=true; Dragable=true; Resizable=false; AddPage(0); AddBackground(10, 50, 230, 113+y, 9250); AddImageTiled( 24, 65, 200, 85+y, 2053); AddAlphaRegion(24, 65, 200, 85+y); AddImageTiled(24, 87, 200, 10, 9264); AddImageTiled(24, 120, 200, 10, 9264); AddImageTiled(105, 95, 3, 55+y, 9264); AddImageTiled(179, 95, 3, 55+y, 9264); AddLabel(65, 65, 190, "PowerScroll Book"); AddLabel(30, 100, 199, "Skill"); AddLabel(110, 100, 199, "Value"); AddLabel(185, 100, 199, "Drop"); int y2 = 0; int butNumb = 1; for(int i = 0; i < m_Book.Entries.Count; i++) { PSBookEntry psBookEntry = m_Book.Entries[i] as PSBookEntry; AddLabel(25, 130+y2, 195, psBookEntry.Skill.ToString()); AddLabel(110, 130+y2, 195, psBookEntry.Value.ToString()); AddButton(195, 133+y2, 1209, 1210, butNumb, GumpButtonType.Reply, 0); y2+=20; butNumb++; } } public override void OnResponse( Server.Network.NetState sender, RelayInfo info ) { int bp = 0;//button pushed switch(info.ButtonID) { case 1:bp = 0;break; case 2:bp = 1;break; case 3:bp = 2;break; case 4:bp = 3;break; case 5:bp = 4;break; case 6:bp = 5;break; case 7:bp = 6;break; case 8:bp = 7;break; case 9:bp = 8;break; case 10:bp = 9;break; case 11:bp = 10;break; case 12:bp = 11;break; case 13:bp = 12;break; case 14:bp = 13;break; case 15:bp = 14;break; case 16:bp = 15;break; case 17:bp = 16;break; case 18:bp = 17;break; case 19:bp = 18;break; case 20:bp = 19;break; default:return;break; } if ( ! m_Book.IsChildOf( m_From.Backpack ) ) { m_From.SendMessage( "Book must be in your backpack to use it." ); } else { PSBookEntry psBookEntry = m_Book.Entries[bp] as PSBookEntry; PowerScroll newScroll = new PowerScroll(psBookEntry.Skill, psBookEntry.Value); m_From.AddToBackpack(newScroll); m_Book.Entries.RemoveAt(bp); m_Book.InvalidateProperties(); } } } #endregion }