BritainKnights/Scripts/Items/Jewels/BaseJewel.cs

358 lines
No EOL
9.5 KiB
C#

using System;
using Server.Engines.Craft;
namespace Server.Items
{
public enum GemType
{
None,
StarSapphire,
Emerald,
Sapphire,
Ruby,
Citrine,
Amethyst,
Tourmaline,
Amber,
Diamond
}
public abstract class BaseJewel : Item, ICraftable
{
private CraftResource m_Resource;
private GemType m_GemType;
private int m_StrBonus = -1, m_DexBonus = -1, m_IntBonus = -1;
public virtual int UOStrBonus{ get{ return 0; } }
public virtual int UODexBonus{ get{ return 0; } }
public virtual int UOIntBonus{ get{ return 0; } }
[CommandProperty( AccessLevel.GameMaster )]
public int StrBonus
{
get{ return ( m_StrBonus == -1 ? UOStrBonus : m_StrBonus ); }
set{ m_StrBonus = value; InvalidateProperties(); }
}
[CommandProperty( AccessLevel.GameMaster )]
public int DexBonus
{
get{ return ( m_DexBonus == -1 ? UODexBonus : m_DexBonus ); }
set{ m_DexBonus = value; InvalidateProperties(); }
}
[CommandProperty( AccessLevel.GameMaster )]
public int IntBonus
{
get{ return ( m_IntBonus == -1 ? UOIntBonus : m_IntBonus ); }
set{ m_IntBonus = value; InvalidateProperties(); }
}
[CommandProperty( AccessLevel.GameMaster )]
public CraftResource Resource
{
get{ return m_Resource; }
set{ m_Resource = value; Hue = CraftResources.GetHue( m_Resource ); }
}
[CommandProperty( AccessLevel.GameMaster )]
public GemType GemType
{
get{ return m_GemType; }
set{ m_GemType = value; InvalidateProperties(); }
}
public virtual int BaseGemTypeNumber{ get{ return 0; } }
public override int LabelNumber
{
get
{
if ( m_GemType == GemType.None )
return base.LabelNumber;
return BaseGemTypeNumber + (int)m_GemType - 1;
}
}
public override void OnAfterDuped( Item newItem )
{
BaseJewel jewel = newItem as BaseJewel;
if ( jewel == null )
return;
}
public BaseJewel( int itemID, Layer layer ) : base( itemID )
{
m_Resource = CraftResource.Iron;
m_GemType = GemType.None;
switch ( Utility.Random( 9 ) )
{
case 0: m_GemType = GemType.StarSapphire; break;
case 1: m_GemType = GemType.Emerald; break;
case 2: m_GemType = GemType.Sapphire; break;
case 3: m_GemType = GemType.Ruby; break;
case 4: m_GemType = GemType.Citrine; break;
case 5: m_GemType = GemType.Amethyst; break;
case 6: m_GemType = GemType.Tourmaline; break;
case 7: m_GemType = GemType.Amber; break;
case 8: m_GemType = GemType.Diamond; break;
}
Layer = layer;
}
public int ComputeStatBonus( StatType type )
{
if ( type == StatType.Str )
return StrBonus;
else if ( type == StatType.Dex )
return DexBonus;
else
return IntBonus;
}
public override void OnAfterSpawn()
{
}
public virtual void AddStatBonuses( Mobile parent )
{
if ( parent == null )
return;
int strBonus = ComputeStatBonus( StatType.Str );
int dexBonus = ComputeStatBonus( StatType.Dex );
int intBonus = ComputeStatBonus( StatType.Int );
if ( strBonus == 0 && dexBonus == 0 && intBonus == 0 )
return;
string modName = this.Serial.ToString();
if ( strBonus != 0 )
parent.AddStatMod( new StatMod( StatType.Str, modName + "Str", strBonus, TimeSpan.Zero ) );
if ( dexBonus != 0 )
parent.AddStatMod( new StatMod( StatType.Dex, modName + "Dex", dexBonus, TimeSpan.Zero ) );
if ( intBonus != 0 )
parent.AddStatMod( new StatMod( StatType.Int, modName + "Int", intBonus, TimeSpan.Zero ) );
}
public override bool OnEquip( Mobile from )
{
from.CheckStatTimers();
int strBonus = ComputeStatBonus( StatType.Str );
int dexBonus = ComputeStatBonus( StatType.Dex );
int intBonus = ComputeStatBonus( StatType.Int );
if ( strBonus != 0 || dexBonus != 0 || intBonus != 0 )
{
string modName = this.Serial.ToString();
if ( strBonus != 0 )
from.AddStatMod( new StatMod( StatType.Str, modName + "Str", strBonus, TimeSpan.Zero ) );
if ( dexBonus != 0 )
from.AddStatMod( new StatMod( StatType.Dex, modName + "Dex", dexBonus, TimeSpan.Zero ) );
if ( intBonus != 0 )
from.AddStatMod( new StatMod( StatType.Int, modName + "Int", intBonus, TimeSpan.Zero ) );
}
return base.OnEquip( from );
}
public override void OnAdded( object parent )
{
Mobile mob = parent as Mobile;
if ( mob != null )
{
AddStatBonuses( mob );
mob.CheckStatTimers();
}
base.OnAdded( parent );
}
public override void OnRemoved( object parent )
{
if ( parent is Mobile )
{
Mobile m = (Mobile)parent;
string modName = this.Serial.ToString();
m.RemoveStatMod( modName + "Str" );
m.RemoveStatMod( modName + "Dex" );
m.RemoveStatMod( modName + "Int" );
m.CheckStatTimers();
}
base.OnRemoved( parent );
}
public BaseJewel( Serial serial ) : base( serial )
{
}
public override void GetProperties( ObjectPropertyList list )
{
base.GetProperties( list );
if ( m_StrBonus > 0 && m_StrBonus < 3 )
list.Add( 1038027 ); // Great Strength
else if ( m_StrBonus > 2 && m_StrBonus < 5 )
list.Add( 1038028 ); // Greater Strength
else if ( m_StrBonus > 4 )
list.Add( 1038029 ); // Ultimate Strength
if ( m_DexBonus > 0 && m_DexBonus < 3 )
list.Add( 1038033 ); // Great Agility
else if ( m_DexBonus > 2 && m_DexBonus < 5 )
list.Add( 1038034 ); // Greater Agility
else if ( m_DexBonus > 4 )
list.Add( 1038035 ); // Ultimate Agility
if ( m_IntBonus > 0 && m_IntBonus < 3 )
list.Add( 1038030 ); // Great Intellect
else if ( m_IntBonus > 2 && m_IntBonus < 5 )
list.Add( 1038031 ); // Greater Intellect
else if ( m_IntBonus > 4 )
list.Add( 1038032 ); // Ultimate Intellect
if ( Magical > 0 && Uses > 0 )
{
list.Add( 1062520, "\t#{0}", Magical );
}
if ( Uses > 0 && Server.Misc.Settings.DisplayInfo() )
{
if ( Uses > 1 )
list.Add( 1062516, "{0}", Uses );
else
list.Add( 1062517, "{0}", Uses );
}
else if ( Uses > 0 )
{
double usage = (double)Uses / (double)UsesMax;
if ( usage > 0.95 )
list.Add( 1063269 ); // Fully Charged
else if ( usage > 0.75 )
list.Add( 1063270 ); // Mostly Charged
else if ( usage > 0.50 )
list.Add( 1063271 ); // Partially Charged
else if ( usage > 0.25 )
list.Add( 1063272 ); // Somewhat Charged
else if ( usage > 0.05 )
list.Add( 1063273 ); // Barely Charged
else
list.Add( 1063274 ); // Almost Drained
}
if ( m_GemType == GemType.StarSapphire )
list.Add( 1044231 );
else if ( m_GemType == GemType.Emerald )
list.Add( 1044232 );
else if ( m_GemType == GemType.Sapphire )
list.Add( 1044233 );
else if ( m_GemType == GemType.Ruby )
list.Add( 1044234 );
else if ( m_GemType == GemType.Citrine )
list.Add( 1044235 );
else if ( m_GemType == GemType.Amethyst )
list.Add( 1044236 );
else if ( m_GemType == GemType.Tourmaline )
list.Add( 1044237 );
else if ( m_GemType == GemType.Amber )
list.Add( 1044238 );
else if ( m_GemType == GemType.Diamond )
list.Add( 1044239 );
}
public override void Serialize( GenericWriter writer )
{
base.Serialize( writer );
writer.Write( (int) 0 ); // version
writer.WriteEncodedInt( (int) m_StrBonus );
writer.WriteEncodedInt( (int) m_DexBonus );
writer.WriteEncodedInt( (int) m_IntBonus );
writer.WriteEncodedInt( (int) m_Resource );
writer.WriteEncodedInt( (int) m_GemType );
}
public override void Deserialize( GenericReader reader )
{
base.Deserialize( reader );
int version = reader.ReadInt();
m_StrBonus = reader.ReadEncodedInt();
m_DexBonus = reader.ReadEncodedInt();
m_IntBonus = reader.ReadEncodedInt();
m_Resource = (CraftResource)reader.ReadEncodedInt();
m_GemType = (GemType)reader.ReadEncodedInt();
Mobile parent = Parent as Mobile;
if ( parent != null )
{
AddStatBonuses( parent );
parent.CheckStatTimers();
}
}
#region ICraftable Members
public int OnCraft( int quality, bool makersMark, Mobile from, CraftSystem craftSystem, Type typeRes, BaseTool tool, CraftItem craftItem, int resHue )
{
Type resourceType = typeRes;
if ( resourceType == null )
resourceType = craftItem.Resources.GetAt( 0 ).ItemType;
Resource = CraftResources.GetFromType( resourceType );
CraftContext context = craftSystem.GetContext( from );
if ( context != null && context.DoNotColor )
Hue = 0;
if ( 1 < craftItem.Resources.Count )
{
resourceType = craftItem.Resources.GetAt( 1 ).ItemType;
if ( resourceType == typeof( StarSapphire ) )
GemType = GemType.StarSapphire;
else if ( resourceType == typeof( Emerald ) )
GemType = GemType.Emerald;
else if ( resourceType == typeof( Sapphire ) )
GemType = GemType.Sapphire;
else if ( resourceType == typeof( Ruby ) )
GemType = GemType.Ruby;
else if ( resourceType == typeof( Citrine ) )
GemType = GemType.Citrine;
else if ( resourceType == typeof( Amethyst ) )
GemType = GemType.Amethyst;
else if ( resourceType == typeof( Tourmaline ) )
GemType = GemType.Tourmaline;
else if ( resourceType == typeof( Amber ) )
GemType = GemType.Amber;
else if ( resourceType == typeof( Diamond ) )
GemType = GemType.Diamond;
}
return 1;
}
#endregion
}
}