context: using System;
  using Server;
  using Server.Gumps;
  using Server.Multis;
  using Server.Network;
  using Server.Targeting;
  using Server.Engines.VeteranRewards;
  
  namespace Server.Items
  {	
  	public class HangingSkeleton : Item, IAddon, IRewardItem
  	{
  		public override bool ForceShowProperties{ get{ return ObjectPropertyList.Enabled; } }
  
  		public Item Deed
  		{ 
  			get
  			{ 
  				HangingSkeletonDeed deed = new HangingSkeletonDeed();
  				deed.IsRewardItem = m_IsRewardItem;
  
  				return deed;	
  			} 
  		}
  
  		private bool m_IsRewardItem;
  
  		[CommandProperty( AccessLevel.GameMaster )]
  		public bool IsRewardItem
  		{
  			get{ return m_IsRewardItem; }
  			set{ m_IsRewardItem = value; InvalidateProperties(); }
  		}
  		
  		public bool FacingSouth
  		{
  			get
  			{ 
  				if ( ItemID == 0x1A03 || ItemID == 0x1A05 || ItemID == 0x1A09 || 
  					 ItemID == 0x1B1E || ItemID == 0x1B7F )
  					return true; 
  
  				return false;
  			}
  		}
  		
  		[Constructable]
  		public HangingSkeleton() : this( 0x1596 )
  		{
  		}
  		
  		[Constructable]
  		public HangingSkeleton( int itemID ) : base( itemID )
  		{
  			LootType = LootType.Blessed;
  			Movable = false;
  		}
  
  		public HangingSkeleton( Serial serial ) : base( serial )
  		{
  		}
  		
  		public override void GetProperties( ObjectPropertyList list )
  		{
  			base.GetProperties( list );
  			
  			if ( Core.ML && m_IsRewardItem )
  				list.Add( 1076220 ); // 4th Year Veteran Reward
  		}
  		
  		public override void OnDoubleClick( Mobile from )
  		{
  			if ( from.InRange( Location, 3 ) )
  			{
  				BaseHouse house = BaseHouse.FindHouseAt( this );  
  				
  				if ( house != null && house.IsOwner( from ) )
  				{
  					from.CloseGump( typeof( RewardDemolitionGump ) );
  					from.SendGump( new RewardDemolitionGump( this, 1049783 ) ); // Do you wish to re-deed this decoration?
  				}
  				else
  					from.SendLocalizedMessage( 1049784 ); // You can only re-deed this decoration if you are the house owner or originally placed the decoration.
  			}
  			else
  				from.LocalOverheadMessage( MessageType.Regular, 0x3B2, 1019045 ); // I can't reach that.
  		}
  
  		public override void Serialize( GenericWriter writer )
  		{
  			base.Serialize( writer );
  
  			writer.WriteEncodedInt( 0 ); // version
  			
  			writer.Write( (bool) m_IsRewardItem );
  		}
  			
  		public override void Deserialize( GenericReader reader )
  		{
  			base.Deserialize( reader );
  
  			int version = reader.ReadEncodedInt();
  			
  			m_IsRewardItem = reader.ReadBool();
  		}
  		
  		public bool CouldFit( IPoint3D p, Map map )
  		{			
  			if ( map == null || !map.CanFit( p.X, p.Y, p.Z, ItemData.Height ) )
  				return false;
  				
  			if ( FacingSouth )	
  				return BaseAddon.IsWall( p.X, p.Y - 1, p.Z, map ); // north wall
  			else
  				return BaseAddon.IsWall( p.X - 1, p.Y, p.Z, map ); // west wall
  		}
  	}	
  	
  	public class HangingSkeletonDeed : Item, IRewardItem
  	{
  		public override int LabelNumber{ get{ return 1049772; } } // deed for a hanging skeleton decoration
  
  		private bool m_IsRewardItem;
  
  		[CommandProperty( AccessLevel.GameMaster )]
  		public bool IsRewardItem
  		{
  			get{ return m_IsRewardItem; }
  			set{ m_IsRewardItem = value; InvalidateProperties(); }
  		}
  		
  		[Constructable]
  		public HangingSkeletonDeed() : base( 0x14F0 )
  		{			
  			LootType = LootType.Blessed;
  			Weight = 1.0;
  		}
  
  		public HangingSkeletonDeed( Serial serial ) : base( serial )
  		{
  		}
  		
  		public override void GetProperties( ObjectPropertyList list )
  		{
  			base.GetProperties( list );
  			
  			if ( m_IsRewardItem )
  				list.Add( 1076220 ); // 4th Year Veteran Reward
  		}
  		
  		public override void OnDoubleClick( Mobile from )
  		{        	
  			if ( m_IsRewardItem && !RewardSystem.CheckIsUsableBy( from, this, null ) )
  				return;
  		
  			if ( IsChildOf( from.Backpack ) )
  			{
  				BaseHouse house = BaseHouse.FindHouseAt( from );
  
  				if ( house != null && house.IsOwner( from ) )
  				{
  					from.CloseGump( typeof( InternalGump ) );
  					from.SendGump( new InternalGump( this ) );
  				}
  				else
  					from.SendLocalizedMessage( 502092 ); // You must be in your house to do this.
  			}
  			else
  				from.SendLocalizedMessage( 1042038 ); // You must have the object in your backpack to use it.          	
  		}
  
  		public override void Serialize( GenericWriter writer )
  		{
  			base.Serialize( writer );
  
  			writer.WriteEncodedInt( 0 ); // version
  			
  			writer.Write( (bool) m_IsRewardItem );
  		}
  			
  		public override void Deserialize( GenericReader reader )
  		{
  			base.Deserialize( reader );
  
  			int version = reader.ReadEncodedInt();
  			
  			m_IsRewardItem = reader.ReadBool();
  		}
  		
  		public static int GetWestItemID( int south )
  		{
  			switch ( south )
  			{
  				case 0x1B1E: return 0x1B1D;
  				case 0x1B7F: return 0x1B7C; 
  				default: return south + 1;
  			}
  		}
  		
  		private class InternalGump : Gump
  		{			
  			private HangingSkeletonDeed m_Skeleton;
  			
  			public InternalGump( HangingSkeletonDeed skeleton ) : base( 100, 200 )
  			{
  				m_Skeleton = skeleton;
  				
  				Closable = true;
  				Disposable = true;
  				Dragable = true;
  				Resizable = false;
  				
  				AddPage( 0 );
  
  				AddBackground( 25, 0, 500, 230, 0xA28 );
  
  				AddPage( 1 );
  
  				AddItem( 130, 70, 0x1A03 );
  				AddButton( 150, 50, 0x845, 0x846, 0x1A03, GumpButtonType.Reply, 0 );
  
  				AddItem( 190, 70, 0x1A05 );
  				AddButton( 210, 50, 0x845, 0x846, 0x1A05, GumpButtonType.Reply, 0 );
  
  				AddItem( 250, 70, 0x1A09 );
  				AddButton( 270, 50, 0x845, 0x846, 0x1A09, GumpButtonType.Reply, 0 );
  
  				AddItem( 310, 70, 0x1B1E );
  				AddButton( 330, 50, 0x845, 0x846, 0x1B1E, GumpButtonType.Reply, 0 );
  
  				AddItem( 370, 70, 0x1B7F );
  				AddButton( 390, 50, 0x845, 0x846, 0x1B7F, GumpButtonType.Reply, 0 );
  			}
  			
  			public override void OnResponse( NetState sender, RelayInfo info )
  			{
  				if ( m_Skeleton == null | m_Skeleton.Deleted )
  					return;		
  				
  				Mobile m = sender.Mobile;	
  			
  				if ( info.ButtonID == 0x1A03 || info.ButtonID == 0x1A05 || info.ButtonID == 0x1A09 || 
  					 info.ButtonID == 0x1B1E || info.ButtonID == 0x1B7F )
  				{
  					m.SendLocalizedMessage( 1049780 ); // Where would you like to place this decoration?
  					m.Target = new InternalTarget( m_Skeleton, info.ButtonID );
  				}
  			}
  		}
  		
  		private class InternalTarget : Target
  		{
  			private HangingSkeletonDeed m_Skeleton;
  			private int m_ItemID;
  		
  			public InternalTarget( HangingSkeletonDeed banner, int itemID ) : base( -1, true, TargetFlags.None )
  			{
  				m_Skeleton = banner;
  				m_ItemID = itemID;
  			}
  			
  			protected override void OnTarget( Mobile from, object targeted )
  			{
  				if ( m_Skeleton == null || m_Skeleton.Deleted )
  					return;
  					
  				if ( m_Skeleton.IsChildOf( from.Backpack ) )
  				{
  					BaseHouse house = BaseHouse.FindHouseAt( from );
  
  					if ( house != null && house.IsOwner( from ) )
  					{
  						IPoint3D p = targeted as IPoint3D;
  						Map map = from.Map;
  						
  						if ( p == null || map == null )
  							return;
  							
  						Point3D p3d = new Point3D( p );
  						ItemData id = TileData.ItemTable[ m_ItemID & 0x3FFF ];
  						
  						if ( map.CanFit( p3d, id.Height ) )
  						{
  							house = BaseHouse.FindHouseAt( p3d, map, id.Height );
  							
  							if ( house != null && house.IsOwner( from ) )
  							{
  								bool north = BaseAddon.IsWall( p3d.X, p3d.Y - 1, p3d.Z, map );
  								bool west = BaseAddon.IsWall( p3d.X - 1, p3d.Y, p3d.Z, map );
  															
  								if ( north && west )
  								{
  									from.CloseGump( typeof( FacingGump ) );
  									from.SendGump( new FacingGump( m_Skeleton, m_ItemID, p3d, house ) );
  								}
  								else if ( north || west )
  								{
  									HangingSkeleton banner = null;
  									
  									if ( north )
  										banner = new HangingSkeleton( m_ItemID );
  									else if ( west )
  										banner = new HangingSkeleton( GetWestItemID( m_ItemID ) );
  										
  									house.Addons.Add( banner );
  
  									banner.IsRewardItem = m_Skeleton.IsRewardItem;
  									banner.MoveToWorld( p3d, map );
  
  									m_Skeleton.Delete();
  								}
  								else
  									from.SendLocalizedMessage( 1042039 ); // The banner must be placed next to a wall.								
  							}
  							else
  								from.SendLocalizedMessage( 1042036 ); // That location is not in your house.
  						}
  						else
  							from.SendLocalizedMessage( 500269 ); // You cannot build that there.		
  					}
  					else
  						from.SendLocalizedMessage( 502092 ); // You must be in your house to do this.
  				}
  				else
  					from.SendLocalizedMessage( 1042038 ); // You must have the object in your backpack to use it.       
  			}
  			
  			private class FacingGump : Gump
  			{
  				private HangingSkeletonDeed m_Skeleton;
  				private int m_ItemID;
  				private Point3D m_Location;
  				private BaseHouse m_House;
  				
  				private enum Buttons
  				{
  					Cancel,
  					South,
  					East
  				}
  				
  				public FacingGump( HangingSkeletonDeed banner, int itemID, Point3D location, BaseHouse house ) : base( 150, 50 )
  				{
  					m_Skeleton = banner;
  					m_ItemID = itemID;
  					m_Location = location;
  					m_House = house;
  				
  					Closable = true;
  					Disposable = true;
  					Dragable = true;
  					Resizable = false;
  
  					AddPage( 0 );
  
  					AddBackground( 0, 0, 300, 150, 0xA28 );
  
  					AddItem( 90, 30, GetWestItemID( itemID ) );
  
gt: 					AddItem( 180, 30, itemID );