448 lines
No EOL
12 KiB
C#
448 lines
No EOL
12 KiB
C#
using System;
|
||
using System.Collections;
|
||
using System.Collections.Generic;
|
||
using Server;
|
||
using Server.Items;
|
||
using Server.Network;
|
||
using Server.Spells;
|
||
using Server.Spells.Fourth;
|
||
using Server.Spells.Seventh;
|
||
using Server.Spells.Chivalry;
|
||
using Server.Prompts;
|
||
|
||
namespace Server.Gumps
|
||
{
|
||
public class RunebookGump : Gump
|
||
{
|
||
private Runebook m_Book;
|
||
|
||
public Runebook Book{ get{ return m_Book; } }
|
||
|
||
public int GetMapHue( Map map )
|
||
{
|
||
if ( map == Map.Trammel )
|
||
return 10;
|
||
else if ( map == Map.Felucca )
|
||
return 81;
|
||
else if ( map == Map.Ilshenar )
|
||
return 1102;
|
||
else if ( map == Map.Malas )
|
||
return 1102;
|
||
else if ( map == Map.Tokuno )
|
||
return 1154;
|
||
|
||
return 0;
|
||
}
|
||
|
||
public string GetName( string name )
|
||
{
|
||
if ( name == null || (name = name.Trim()).Length <= 0 )
|
||
return "(indescript)";
|
||
|
||
return name;
|
||
}
|
||
|
||
private void AddBackground()
|
||
{
|
||
AddPage( 0 );
|
||
|
||
// Background image
|
||
AddImage( 100, 10, 2200 );
|
||
|
||
// Two separators
|
||
for ( int i = 0; i < 2; ++i )
|
||
{
|
||
int xOffset = 125 + (i * 165);
|
||
|
||
AddImage( xOffset, 50, 57 );
|
||
xOffset += 20;
|
||
|
||
for ( int j = 0; j < 6; ++j, xOffset += 15 )
|
||
AddImage( xOffset, 50, 58 );
|
||
|
||
AddImage( xOffset - 5, 50, 59 );
|
||
}
|
||
|
||
// First four page buttons
|
||
for ( int i = 0, xOffset = 130, gumpID = 2225; i < 4; ++i, xOffset += 35, ++gumpID )
|
||
AddButton( xOffset, 187, gumpID, gumpID, 0, GumpButtonType.Page, 2 + i );
|
||
|
||
// Next four page buttons
|
||
for ( int i = 0, xOffset = 300, gumpID = 2229; i < 4; ++i, xOffset += 35, ++gumpID )
|
||
AddButton( xOffset, 187, gumpID, gumpID, 0, GumpButtonType.Page, 6 + i );
|
||
|
||
// Charges
|
||
AddHtmlLocalized( 140, 40, 80, 18, 1011296, false, false ); // Charges:
|
||
AddHtml( 220, 40, 30, 18, m_Book.CurCharges.ToString(), false, false );
|
||
|
||
// Max charges
|
||
AddHtmlLocalized( 300, 40, 100, 18, 1011297, false, false ); // Max Charges:
|
||
AddHtml( 400, 40, 30, 18, m_Book.MaxCharges.ToString(), false, false );
|
||
}
|
||
|
||
private void AddIndex()
|
||
{
|
||
// Index
|
||
AddPage( 1 );
|
||
|
||
// Rename button
|
||
AddButton( 125, 15, 2472, 2473, 1, GumpButtonType.Reply, 0 );
|
||
AddHtmlLocalized( 158, 22, 100, 18, 1011299, false, false ); // Rename book
|
||
|
||
// List of entries
|
||
List<RunebookEntry> entries = m_Book.Entries;
|
||
|
||
for ( int i = 0; i < 16; ++i )
|
||
{
|
||
string desc;
|
||
int hue;
|
||
|
||
if ( i < entries.Count )
|
||
{
|
||
desc = GetName( entries[i].Description );
|
||
hue = GetMapHue( entries[i].Map );
|
||
}
|
||
else
|
||
{
|
||
desc = "Empty";
|
||
hue = 0;
|
||
}
|
||
|
||
// Use charge button
|
||
AddButton( 130 + ((i / 8) * 160), 65 + ((i % 8) * 15), 2103, 2104, 2 + (i * 6) + 0, GumpButtonType.Reply, 0 );
|
||
|
||
// Description label
|
||
AddLabelCropped( 145 + ((i / 8) * 160), 60 + ((i % 8) * 15), 115, 17, hue, desc );
|
||
}
|
||
|
||
// Turn page button
|
||
AddButton( 393, 14, 2206, 2206, 0, GumpButtonType.Page, 2 );
|
||
}
|
||
|
||
private void AddDetails( int index, int half )
|
||
{
|
||
// Use charge button
|
||
AddButton( 130 + (half * 160), 65, 2103, 2104, 2 + (index * 6) + 0, GumpButtonType.Reply, 0 );
|
||
|
||
string desc;
|
||
int hue;
|
||
|
||
if ( index < m_Book.Entries.Count )
|
||
{
|
||
RunebookEntry e = (RunebookEntry)m_Book.Entries[index];
|
||
|
||
desc = GetName( e.Description );
|
||
hue = GetMapHue( e.Map );
|
||
|
||
// Location labels
|
||
int xLong = 0, yLat = 0;
|
||
int xMins = 0, yMins = 0;
|
||
bool xEast = false, ySouth = false;
|
||
|
||
if ( Sextant.Format( e.Location, e.Map, ref xLong, ref yLat, ref xMins, ref yMins, ref xEast, ref ySouth ) )
|
||
{
|
||
AddLabel( 135 + (half * 160), 80, 0, String.Format( "{0}<7D> {1}'{2}", yLat, yMins, ySouth ? "S" : "N" ) );
|
||
AddLabel( 135 + (half * 160), 95, 0, String.Format( "{0}<7D> {1}'{2}", xLong, xMins, xEast ? "E" : "W" ) );
|
||
}
|
||
|
||
// Drop rune button
|
||
AddButton( 135 + (half * 160), 115, 2437, 2438, 2 + (index * 6) + 1, GumpButtonType.Reply, 0 );
|
||
AddHtmlLocalized( 150 + (half * 160), 115, 100, 18, 1011298, false, false ); // Drop rune
|
||
|
||
// Set as default button
|
||
int defButtonID = e != m_Book.Default ? 2361 : 2360;
|
||
|
||
AddButton( 160 + (half * 140), 20, defButtonID, defButtonID, 2 + (index * 6) + 2, GumpButtonType.Reply, 0 );
|
||
AddHtmlLocalized( 175 + (half * 140), 15, 100, 18, 1011300, false, false ); // Set default
|
||
|
||
if ( Core.AOS )
|
||
{
|
||
AddButton( 135 + (half * 160), 140, 2103, 2104, 2 + (index * 6) + 3, GumpButtonType.Reply, 0 );
|
||
AddHtmlLocalized( 150 + (half * 160), 136, 110, 20, 1062722, false, false ); // Recall
|
||
|
||
AddButton( 135 + (half * 160), 158, 2103, 2104, 2 + (index * 6) + 4, GumpButtonType.Reply, 0 );
|
||
AddHtmlLocalized( 150 + (half * 160), 154, 110, 20, 1062723, false, false ); // Gate Travel
|
||
|
||
AddButton( 135 + (half * 160), 176, 2103, 2104, 2 + (index * 6) + 5, GumpButtonType.Reply, 0 );
|
||
AddHtmlLocalized( 150 + (half * 160), 172, 110, 20, 1062724, false, false ); // Sacred Journey
|
||
}
|
||
else
|
||
{
|
||
// Recall button
|
||
AddButton( 135 + (half * 160), 140, 2271, 2271, 2 + (index * 6) + 3, GumpButtonType.Reply, 0 );
|
||
|
||
// Gate button
|
||
AddButton( 205 + (half * 160), 140, 2291, 2291, 2 + (index * 6) + 4, GumpButtonType.Reply, 0 );
|
||
}
|
||
}
|
||
else
|
||
{
|
||
desc = "Empty";
|
||
hue = 0;
|
||
}
|
||
|
||
// Description label
|
||
AddLabelCropped( 145 + (half * 160), 60, 115, 17, hue, desc );
|
||
}
|
||
|
||
public RunebookGump( Mobile from, Runebook book ) : base( 150, 200 )
|
||
{
|
||
m_Book = book;
|
||
|
||
AddBackground();
|
||
AddIndex();
|
||
|
||
for ( int page = 0; page < 8; ++page )
|
||
{
|
||
AddPage( 2 + page );
|
||
|
||
AddButton( 125, 14, 2205, 2205, 0, GumpButtonType.Page, 1 + page );
|
||
|
||
if ( page < 7 )
|
||
AddButton( 393, 14, 2206, 2206, 0, GumpButtonType.Page, 3 + page );
|
||
|
||
for ( int half = 0; half < 2; ++half )
|
||
AddDetails( (page * 2) + half, half );
|
||
}
|
||
}
|
||
|
||
public static bool HasSpell( Mobile from, int spellID )
|
||
{
|
||
Spellbook book = Spellbook.Find( from, spellID );
|
||
|
||
return ( book != null && book.HasSpell( spellID ) );
|
||
}
|
||
|
||
private class InternalPrompt : Prompt
|
||
{
|
||
private Runebook m_Book;
|
||
|
||
public InternalPrompt( Runebook book )
|
||
{
|
||
m_Book = book;
|
||
}
|
||
|
||
public override void OnResponse( Mobile from, string text )
|
||
{
|
||
if ( m_Book.Deleted || !from.InRange( m_Book.GetWorldLocation(), (Core.ML ? 3 : 1) ) )
|
||
return;
|
||
|
||
if ( m_Book.CheckAccess( from ) )
|
||
{
|
||
m_Book.Description = Utility.FixHtml( text.Trim() );
|
||
|
||
from.CloseGump( typeof( RunebookGump ) );
|
||
from.SendGump( new RunebookGump( from, m_Book ) );
|
||
|
||
from.SendMessage( "The book's title has been changed." );
|
||
}
|
||
else
|
||
{
|
||
m_Book.Openers.Remove( from );
|
||
|
||
from.SendLocalizedMessage( 502416 ); // That cannot be done while the book is locked down.
|
||
}
|
||
}
|
||
|
||
public override void OnCancel( Mobile from )
|
||
{
|
||
from.SendLocalizedMessage( 502415 ); // Request cancelled.
|
||
|
||
if ( !m_Book.Deleted && from.InRange( m_Book.GetWorldLocation(), (Core.ML ? 3 : 1) ) )
|
||
{
|
||
from.CloseGump( typeof( RunebookGump ) );
|
||
from.SendGump( new RunebookGump( from, m_Book ) );
|
||
}
|
||
}
|
||
}
|
||
|
||
public override void OnResponse( NetState state, RelayInfo info )
|
||
{
|
||
Mobile from = state.Mobile;
|
||
|
||
if ( m_Book.Deleted || !from.InRange( m_Book.GetWorldLocation(), (Core.ML ? 3 : 1) ) || !Multis.DesignContext.Check( from ) )
|
||
{
|
||
m_Book.Openers.Remove( from );
|
||
return;
|
||
}
|
||
|
||
int buttonID = info.ButtonID;
|
||
|
||
if ( buttonID == 1 ) // Rename book
|
||
{
|
||
if ( !m_Book.IsLockedDown || from.AccessLevel >= AccessLevel.GameMaster )
|
||
{
|
||
from.SendLocalizedMessage( 502414 ); // Please enter a title for the runebook:
|
||
from.Prompt = new InternalPrompt( m_Book );
|
||
}
|
||
else
|
||
{
|
||
m_Book.Openers.Remove( from );
|
||
|
||
from.SendLocalizedMessage( 502413, null, 0x35 ); // That cannot be done while the book is locked down.
|
||
}
|
||
}
|
||
else
|
||
{
|
||
buttonID -= 2;
|
||
|
||
int index = buttonID / 6;
|
||
int type = buttonID % 6;
|
||
|
||
if ( index >= 0 && index < m_Book.Entries.Count )
|
||
{
|
||
RunebookEntry e = (RunebookEntry)m_Book.Entries[index];
|
||
|
||
switch ( type )
|
||
{
|
||
case 0: // Use charges
|
||
{
|
||
if ( m_Book.CurCharges <= 0 )
|
||
{
|
||
from.CloseGump( typeof( RunebookGump ) );
|
||
from.SendGump( new RunebookGump( from, m_Book ) );
|
||
|
||
from.SendLocalizedMessage( 502412 ); // There are no charges left on that item.
|
||
}
|
||
else
|
||
{
|
||
int xLong = 0, yLat = 0;
|
||
int xMins = 0, yMins = 0;
|
||
bool xEast = false, ySouth = false;
|
||
|
||
if ( Sextant.Format( e.Location, e.Map, ref xLong, ref yLat, ref xMins, ref yMins, ref xEast, ref ySouth ) )
|
||
{
|
||
string location = String.Format( "{0}<7D> {1}'{2}, {3}<7D> {4}'{5}", yLat, yMins, ySouth ? "S" : "N", xLong, xMins, xEast ? "E" : "W" );
|
||
from.SendMessage( location );
|
||
}
|
||
|
||
m_Book.OnTravel();
|
||
new RecallSpell( from, m_Book, e, m_Book ).Cast();
|
||
|
||
m_Book.Openers.Remove( from );
|
||
}
|
||
|
||
break;
|
||
}
|
||
case 1: // Drop rune
|
||
{
|
||
if ( !m_Book.IsLockedDown || from.AccessLevel >= AccessLevel.GameMaster )
|
||
{
|
||
m_Book.DropRune( from, e, index );
|
||
|
||
from.CloseGump( typeof( RunebookGump ) );
|
||
if ( !Core.ML )
|
||
from.SendGump( new RunebookGump( from, m_Book ) );
|
||
}
|
||
else
|
||
{
|
||
m_Book.Openers.Remove( from );
|
||
|
||
from.SendLocalizedMessage( 502413, null, 0x35 ); // That cannot be done while the book is locked down.
|
||
}
|
||
|
||
break;
|
||
}
|
||
case 2: // Set default
|
||
{
|
||
if ( m_Book.CheckAccess( from ) )
|
||
{
|
||
m_Book.Default = e;
|
||
|
||
from.CloseGump( typeof( RunebookGump ) );
|
||
from.SendGump( new RunebookGump( from, m_Book ) );
|
||
|
||
from.SendLocalizedMessage( 502417 ); // New default location set.
|
||
}
|
||
|
||
break;
|
||
}
|
||
case 3: // Recall
|
||
{
|
||
if ( HasSpell( from, 31 ) )
|
||
{
|
||
int xLong = 0, yLat = 0;
|
||
int xMins = 0, yMins = 0;
|
||
bool xEast = false, ySouth = false;
|
||
|
||
if ( Sextant.Format( e.Location, e.Map, ref xLong, ref yLat, ref xMins, ref yMins, ref xEast, ref ySouth ) )
|
||
{
|
||
string location = String.Format( "{0}<7D> {1}'{2}, {3}<7D> {4}'{5}", yLat, yMins, ySouth ? "S" : "N", xLong, xMins, xEast ? "E" : "W" );
|
||
from.SendMessage( location );
|
||
}
|
||
|
||
m_Book.OnTravel();
|
||
new RecallSpell( from, null, e, null ).Cast();
|
||
}
|
||
else
|
||
{
|
||
from.SendLocalizedMessage( 500015 ); // You do not have that spell!
|
||
}
|
||
|
||
m_Book.Openers.Remove( from );
|
||
|
||
break;
|
||
}
|
||
case 4: // Gate
|
||
{
|
||
if ( HasSpell( from, 51 ) )
|
||
{
|
||
int xLong = 0, yLat = 0;
|
||
int xMins = 0, yMins = 0;
|
||
bool xEast = false, ySouth = false;
|
||
|
||
if ( Sextant.Format( e.Location, e.Map, ref xLong, ref yLat, ref xMins, ref yMins, ref xEast, ref ySouth ) )
|
||
{
|
||
string location = String.Format( "{0}<7D> {1}'{2}, {3}<7D> {4}'{5}", yLat, yMins, ySouth ? "S" : "N", xLong, xMins, xEast ? "E" : "W" );
|
||
from.SendMessage( location );
|
||
}
|
||
|
||
m_Book.OnTravel();
|
||
new GateTravelSpell( from, null, e ).Cast();
|
||
}
|
||
else
|
||
{
|
||
from.SendLocalizedMessage( 500015 ); // You do not have that spell!
|
||
}
|
||
|
||
m_Book.Openers.Remove( from );
|
||
|
||
break;
|
||
}
|
||
case 5: // Sacred Journey
|
||
{
|
||
if ( Core.AOS )
|
||
{
|
||
if ( HasSpell( from, 209 ) )
|
||
{
|
||
int xLong = 0, yLat = 0;
|
||
int xMins = 0, yMins = 0;
|
||
bool xEast = false, ySouth = false;
|
||
|
||
if ( Sextant.Format( e.Location, e.Map, ref xLong, ref yLat, ref xMins, ref yMins, ref xEast, ref ySouth ) )
|
||
{
|
||
string location = String.Format( "{0}<7D> {1}'{2}, {3}<7D> {4}'{5}", yLat, yMins, ySouth ? "S" : "N", xLong, xMins, xEast ? "E" : "W" );
|
||
from.SendMessage( location );
|
||
}
|
||
|
||
m_Book.OnTravel();
|
||
new SacredJourneySpell( from, null, e, null ).Cast();
|
||
}
|
||
else
|
||
{
|
||
from.SendLocalizedMessage( 500015 ); // You do not have that spell!
|
||
}
|
||
}
|
||
|
||
m_Book.Openers.Remove( from );
|
||
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
else
|
||
m_Book.Openers.Remove( from );
|
||
}
|
||
}
|
||
}
|
||
} |