This commit is contained in:
mark 2006-06-15 04:14:30 +00:00
commit 47711d616e
2644 changed files with 479454 additions and 0 deletions

View file

@ -0,0 +1,610 @@
using Server;
using System;
using Server.Misc;
using Server.Mobiles;
namespace Server.Items
{
public class DarkenedSky : Kama
{
public override int InitMinHits { get { return 255; } }
public override int InitMaxHits { get { return 255; } }
public override int LabelNumber { get { return 1070966; } } // Darkened Sky
[Constructable]
public DarkenedSky() : base()
{
WeaponAttributes.HitLightning = 60;
Attributes.WeaponSpeed = 25;
Attributes.WeaponDamage = 50;
}
public override void GetDamageTypes( Mobile wielder, out int phys, out int fire, out int cold, out int pois, out int nrgy )
{
phys = fire = pois = 0;
cold = nrgy = 50;
}
public DarkenedSky( Serial serial ) : base( serial )
{
}
public override void Serialize( GenericWriter writer )
{
base.Serialize( writer );
writer.Write( (int)0 );
}
public override void Deserialize( GenericReader reader )
{
base.Deserialize( reader );
int version = reader.ReadInt();
}
}
public class KasaOfTheRajin : Kasa
{
public override int LabelNumber { get { return 1070969; } } // Kasa of the Raj-in
public override int BasePhysicalResistance { get { return 12; } }
public override int BaseFireResistance { get { return 17; } }
public override int BaseColdResistance { get { return 21; } }
public override int BasePoisonResistance { get { return 17; } }
public override int BaseEnergyResistance { get { return 17; } }
public override bool CanBeBlessed { get { return false; } }
public override int InitMinHits { get { return 255; } }
public override int InitMaxHits { get { return 255; } }
[Constructable]
public KasaOfTheRajin() : base()
{
Attributes.SpellDamage = 12;
}
public KasaOfTheRajin( Serial serial ) : base( serial )
{
}
public override void Serialize( GenericWriter writer )
{
base.Serialize( writer );
writer.Write( (int)2 );
}
public override void Deserialize( GenericReader reader )
{
base.Deserialize( reader );
int version = reader.ReadInt();
if ( version <= 1 )
{
MaxHitPoints = 255;
HitPoints = 255;
}
if( version == 0 )
LootType = LootType.Regular;
}
}
public class RuneBeetleCarapace : PlateDo
{
public override int InitMinHits { get { return 255; } }
public override int InitMaxHits { get { return 255; } }
public override int LabelNumber{ get{ return 1070968; } } // Rune Beetle Carapace
public override int BaseColdResistance { get { return 14; } }
public override int BaseEnergyResistance { get { return 14; } }
[Constructable]
public RuneBeetleCarapace() : base()
{
Attributes.BonusMana = 10;
Attributes.RegenMana = 3;
Attributes.LowerManaCost = 15;
ArmorAttributes.LowerStatReq = 100;
ArmorAttributes.MageArmor = 1;
}
public RuneBeetleCarapace( Serial serial ) : base( serial )
{
}
public override void Serialize( GenericWriter writer )
{
base.Serialize( writer );
writer.Write( (int)0 );
}
public override void Deserialize( GenericReader reader )
{
base.Deserialize( reader );
int version = reader.ReadInt();
}
}
public class Stormgrip : LeatherGloves
{
public override int InitMinHits { get { return 255; } }
public override int InitMaxHits { get { return 255; } }
public override int LabelNumber{ get{ return 1070970; } } // Stormgrip
public override int BasePhysicalResistance { get { return 10; } }
public override int BaseColdResistance { get { return 18; } }
public override int BaseEnergyResistance { get { return 18; } }
[Constructable]
public Stormgrip() : base()
{
Attributes.BonusInt = 8;
Attributes.Luck = 125;
Attributes.WeaponDamage = 25;
}
public Stormgrip( Serial serial ) : base( serial )
{
}
public override void Serialize( GenericWriter writer )
{
base.Serialize( writer );
writer.Write( (int)0 );
}
public override void Deserialize( GenericReader reader )
{
base.Deserialize( reader );
int version = reader.ReadInt();
}
}
public class SwordOfTheStampede : NoDachi
{
public override int InitMinHits { get { return 255; } }
public override int InitMaxHits { get { return 255; } }
public override int LabelNumber { get { return 1070964; } } // Sword of the Stampede
[Constructable]
public SwordOfTheStampede() : base()
{
WeaponAttributes.HitHarm = 100;
Attributes.AttackChance = 10;
Attributes.WeaponDamage = 60;
}
public override void GetDamageTypes( Mobile wielder, out int phys, out int fire, out int cold, out int pois, out int nrgy )
{
phys = fire = pois = nrgy = 0;
cold = 100;
}
public SwordOfTheStampede( Serial serial ) : base( serial )
{
}
public override void Serialize( GenericWriter writer )
{
base.Serialize( writer );
writer.Write( (int)0 );
}
public override void Deserialize( GenericReader reader )
{
base.Deserialize( reader );
int version = reader.ReadInt();
}
}
public class SwordsOfProsperity : Daisho
{
public override int InitMinHits { get { return 255; } }
public override int InitMaxHits { get { return 255; } }
public override int LabelNumber { get { return 1070963; } } // Swords of Prosperity
[Constructable]
public SwordsOfProsperity() : base()
{
WeaponAttributes.MageWeapon = 30;
Attributes.SpellChanneling = 1;
Attributes.CastSpeed = 1;
Attributes.Luck = 200;
}
public override void GetDamageTypes( Mobile wielder, out int phys, out int fire, out int cold, out int pois, out int nrgy )
{
phys = cold = pois = nrgy = 0;
fire = 100;
}
public SwordsOfProsperity( Serial serial ) : base( serial )
{
}
public override void Serialize( GenericWriter writer )
{
base.Serialize( writer );
writer.Write( (int)0 );
}
public override void Deserialize( GenericReader reader )
{
base.Deserialize( reader );
int version = reader.ReadInt();
}
}
public class TheHorselord : Yumi
{
public override int InitMinHits { get { return 255; } }
public override int InitMaxHits { get { return 255; } }
public override int LabelNumber { get { return 1070967; } } // The Horselord
[Constructable]
public TheHorselord() : base()
{
Attributes.BonusDex = 5;
Attributes.RegenMana = 1;
Attributes.Luck = 125;
Attributes.WeaponDamage = 50;
Slayer = SlayerName.ElementalBan;
Slayer2 = SlayerName.ReptilianDeath;
}
public TheHorselord( Serial serial ) : base( serial )
{
}
public override void Serialize( GenericWriter writer )
{
base.Serialize( writer );
writer.Write( (int)0 );
}
public override void Deserialize( GenericReader reader )
{
base.Deserialize( reader );
int version = reader.ReadInt();
}
}
public class TomeOfLostKnowledge : Spellbook
{
public override int LabelNumber { get { return 1070971; } } // Tome of Lost Knowledge
[Constructable]
public TomeOfLostKnowledge() : base()
{
LootType = LootType.Regular;
Hue = 0x530;
SkillBonuses.SetValues( 0, SkillName.Magery, 15.0 );
Attributes.BonusInt = 8;
Attributes.LowerManaCost = 15;
Attributes.SpellDamage = 15;
}
public TomeOfLostKnowledge( Serial serial ) : base( serial )
{
}
public override void Serialize( GenericWriter writer )
{
base.Serialize( writer );
writer.Write( (int)0 );
}
public override void Deserialize( GenericReader reader )
{
base.Deserialize( reader );
int version = reader.ReadInt();
}
}
public class WindsEdge : Tessen
{
public override int LabelNumber { get { return 1070965; } } // Wind's Edge
[Constructable]
public WindsEdge() : base()
{
WeaponAttributes.HitLeechMana = 40;
Attributes.WeaponDamage = 50;
Attributes.WeaponSpeed = 50;
Attributes.DefendChance = 10;
}
public override void GetDamageTypes( Mobile wielder, out int phys, out int fire, out int cold, out int pois, out int nrgy )
{
phys = fire = cold = pois = 0;
nrgy = 100;
}
public WindsEdge( Serial serial ) : base( serial )
{
}
public override void Serialize( GenericWriter writer )
{
base.Serialize( writer );
writer.Write( (int)0 );
}
public override void Deserialize( GenericReader reader )
{
base.Deserialize( reader );
int version = reader.ReadInt();
}
public override int InitMinHits { get { return 255; } }
public override int InitMaxHits { get { return 255; } }
}
public enum PigmentType
{
None,
ParagonGold,
VioletCouragePurple,
InvulnerabilityBlue,
LunaWhite,
DryadGreen,
ShadowDancerBlack,
BerserkerRed,
NoxGreen,
RumRed,
FireOrange
}
public class PigmentsOfTokuno : Item, IUsesRemaining
{
public class PigmentInfo
{
//private PigmentType m_PigmentType;
private int m_Hue;
private TextDefinition m_Label;
public int Hue { get { return m_Hue; } }
public TextDefinition Label { get { return m_Label; } }
public PigmentInfo( int hue, TextDefinition label )
{
m_Hue = hue;
m_Label = label;
}
private static PigmentInfo[] m_Table = new PigmentInfo[]
{
new PigmentInfo( /*PigmentType.None,*/ 0, -1 ),
new PigmentInfo( /*PigmentType.ParagonGold,*/ 0x501, 1070987 ),
new PigmentInfo( /*PigmentType.VioletCouragePurple,*/ 0x486, 1070988 ),
new PigmentInfo( /*PigmentType.InvulnerabilityBlue,*/ 0x4F2, 1070989 ),
new PigmentInfo( /*PigmentType.LunaWhite,*/ 0x47E, 1070990 ),
new PigmentInfo( /*PigmentType.DryadGreen,*/ 0x48F, 1070991 ),
new PigmentInfo( /*PigmentType.ShadowDancerBlack,*/ 0x455, 1070992 ),
new PigmentInfo( /*PigmentType.BerserkerRed,*/ 0x21, 1070993 ),
new PigmentInfo( /*PigmentType.NoxGreen,*/ 0x58C, 1070994 ),
new PigmentInfo( /*PigmentType.RumRed,*/ 0x66C, 1070995 ),
new PigmentInfo( /*PigmentType.FireOrange,*/ 0x54F, 1070996 )
};
public static PigmentInfo GetInfo( PigmentType type )
{
int v = (int)type;
if( v < 0 || v >= m_Table.Length )
v = 0;
return m_Table[v];
}
}
private PigmentType m_Type;
[CommandProperty( AccessLevel.GameMaster )]
public PigmentType Type
{
get { return m_Type; }
set
{
m_Type = value;
PigmentInfo p = PigmentInfo.GetInfo( m_Type );
Hue = p.Hue;
InvalidateProperties();
}
}
private int m_UsesRemaining;
public override int LabelNumber { get { return 1070933; } } // Pigments of Tokuno
[Constructable]
public PigmentsOfTokuno() : this( PigmentType.None, 10 )
{
}
[Constructable]
public PigmentsOfTokuno( PigmentType type ) : this( type, (type == PigmentType.None)? 10 : 50 )
{
}
[Constructable]
public PigmentsOfTokuno( PigmentType type, int uses ) : base( 0xEFF )
{
Weight = 1.0;
m_UsesRemaining = uses;
Type = type;
}
public override void GetProperties( ObjectPropertyList list )
{
base.GetProperties( list );
if( m_Type != PigmentType.None )
{
PigmentInfo p = PigmentInfo.GetInfo( m_Type );
TextDefinition.AddTo( list, p.Label );
}
list.Add( 1060584, m_UsesRemaining.ToString() ); // uses remaining: ~1_val~
}
public override void OnDoubleClick( Mobile from )
{
if( IsAccessibleTo( from ) && from.InRange( GetWorldLocation(), 3 ) )
{
from.SendLocalizedMessage( 1070929 ); // Select the artifact or enhanced magic item to dye.
from.BeginTarget( 3, false, Server.Targeting.TargetFlags.None, new TargetStateCallback( InternalCallback ), this );
}
else
from.SendLocalizedMessage( 502436 ); // That is not accessible.
}
private void InternalCallback( Mobile from, object targeted, object state )
{
PigmentsOfTokuno pigment = (PigmentsOfTokuno)state;
if( pigment.Deleted || pigment.UsesRemaining <= 0 || !from.InRange( pigment.GetWorldLocation(), 3 ) || !pigment.IsAccessibleTo( from ))
return;
Item i = targeted as Item;
if( i == null )
from.SendLocalizedMessage( 1070931 ); // You can only dye artifacts and enhanced magic items with this tub.
else if( !from.InRange( i.GetWorldLocation(), 3 ) || !IsAccessibleTo( from ) )
from.SendLocalizedMessage( 502436 ); // That is not accessible.
else if( from.Items.Contains( i ) )
from.SendLocalizedMessage( 1070930 ); // Can't dye artifacts or enhanced magic items that are being worn.
else if( i.IsLockedDown )
from.SendLocalizedMessage( 1070932 ); // You may not dye artifacts and enhanced magic items which are locked down.
else if( i is PigmentsOfTokuno )
from.SendLocalizedMessage( 1042417 ); // You cannot dye that.
else if( !IsValidItem( i ) )
from.SendLocalizedMessage( 1070931 ); // You can only dye artifacts and enhanced magic items with this tub. //Yes, it says tub on OSI. Don't ask me why ;p
else
{
//Notes: on OSI there IS no hue check to see if it's already hued. and no messages on successful hue either
i.Hue = PigmentInfo.GetInfo( pigment.Type ).Hue;
if( --pigment.UsesRemaining <= 0 )
pigment.Delete();
}
}
public static bool IsValidItem( Item i )
{
if( i is PigmentsOfTokuno )
return false;
Type t = i.GetType();
CraftResource resource = CraftResource.None;
if( i is BaseWeapon )
resource = ((BaseWeapon)i).Resource;
else if( i is BaseArmor )
resource = ((BaseArmor)i).Resource;
if( !CraftResources.IsStandard( resource ) )
return true;
return(
IsInTypeList( t, TreasuresOfTokuno.LesserArtifacts )
|| IsInTypeList( t, TreasuresOfTokuno.GreaterArtifacts )
|| IsInTypeList( t, DemonKnight.ArtifactRarity10 )
|| IsInTypeList( t, DemonKnight.ArtifactRarity11 )
|| IsInTypeList( t, DemonKnight.ArtifactRarity10 )
|| IsInTypeList( t, StealableArtifactsSpawner.TypesOfEntires )
|| IsInTypeList( t, Paragon.Artifacts )
|| IsInTypeList( t, Leviathan.Artifacts )
|| IsInTypeList( t, TreasureMapChest.Artifacts )
);
}
private static bool IsInTypeList( Type t, Type[] list )
{
for( int i = 0; i < list.Length; i++ )
{
if( list[i] == t ) return true;
}
return false;
}
public PigmentsOfTokuno( Serial serial ) : base( serial )
{
}
public override void Serialize( GenericWriter writer )
{
base.Serialize( writer );
writer.Write( (int)0 );
writer.WriteEncodedInt( (int)m_Type );
writer.WriteEncodedInt( m_UsesRemaining );
}
public override void Deserialize( GenericReader reader )
{
base.Deserialize( reader );
int version = reader.ReadInt();
m_Type = (PigmentType)reader.ReadEncodedInt();
m_UsesRemaining = reader.ReadEncodedInt();
}
#region IUsesRemaining Members
[CommandProperty( AccessLevel.GameMaster )]
public int UsesRemaining
{
get { return m_UsesRemaining; }
set { m_UsesRemaining = value; InvalidateProperties(); }
}
public bool ShowUsesRemaining
{
get { return true; }
set {}
}
#endregion
}
}

View file

@ -0,0 +1,785 @@
using Server;
using System;
namespace Server.Items
{
public class AncientFarmersKasa : Kasa
{
public override int LabelNumber{ get{ return 1070922; } } // Ancient Farmer's Kasa
public override int BaseColdResistance { get { return 19; } }
public override int InitMinHits{ get{ return 255; } }
public override int InitMaxHits{ get { return 255; } }
[Constructable]
public AncientFarmersKasa() : base()
{
Attributes.BonusStr = 5;
Attributes.BonusStam = 5;
Attributes.RegenStam = 5;
SkillBonuses.SetValues( 0, SkillName.AnimalLore, 5.0 );
}
public AncientFarmersKasa( Serial serial ) : base( serial )
{
}
public override void Serialize( GenericWriter writer )
{
base.Serialize( writer );
writer.Write( (int) 2 );
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize( reader );
int version = reader.ReadInt();
if ( version <= 1 )
{
MaxHitPoints = 255;
HitPoints = 255;
}
if( version == 0 )
SkillBonuses.SetValues( 0, SkillName.AnimalLore, 5.0 );
}
}
public class AncientSamuraiDo : PlateDo
{
public override int LabelNumber { get { return 1070926; } } // Ancient Samurai Do
public override int BasePhysicalResistance { get { return 15; } }
public override int BaseFireResistance { get { return 12; } }
public override int BaseColdResistance { get { return 10; } }
public override int BasePoisonResistance { get { return 11; } }
public override int BaseEnergyResistance { get { return 8; } }
[Constructable]
public AncientSamuraiDo() : base()
{
ArmorAttributes.LowerStatReq = 100;
ArmorAttributes.MageArmor = 1;
SkillBonuses.SetValues( 0, SkillName.Parry, 10.0 );
}
public AncientSamuraiDo( Serial serial ) : base( serial )
{
}
public override void Serialize( GenericWriter writer )
{
base.Serialize( writer );
writer.Write( (int)0 );
}
public override void Deserialize( GenericReader reader )
{
base.Deserialize( reader );
int version = reader.ReadInt();
}
public override int InitMinHits { get { return 255; } }
public override int InitMaxHits { get { return 255; } }
}
public class ArmsOfTacticalExcellence : LeatherHiroSode
{
public override int LabelNumber { get { return 1070921; } } // Arms of Tactical Excellence
public override int BaseFireResistance { get { return 9; } }
public override int BaseColdResistance { get { return 13; } }
public override int BasePoisonResistance { get { return 8; } }
[Constructable]
public ArmsOfTacticalExcellence() : base()
{
Attributes.BonusDex = 5;
SkillBonuses.SetValues( 0, SkillName.Tactics, 12.0 );
}
public ArmsOfTacticalExcellence( Serial serial ) : base( serial )
{
}
public override void Serialize( GenericWriter writer )
{
base.Serialize( writer );
writer.Write( (int)0 );
}
public override void Deserialize( GenericReader reader )
{
base.Deserialize( reader );
int version = reader.ReadInt();
}
public override int InitMinHits { get { return 255; } }
public override int InitMaxHits { get { return 255; } }
}
public class BlackLotusHood : ClothNinjaHood
{
public override int LabelNumber { get { return 1070919; } } // Black Lotus Hood
public override int BasePhysicalResistance { get { return 0; } }
public override int BaseFireResistance { get { return 11; } }
public override int BaseColdResistance { get { return 15; } }
public override int BasePoisonResistance { get { return 11; } }
public override int BaseEnergyResistance { get { return 11; } }
public override int InitMinHits { get { return 255; } }
public override int InitMaxHits { get { return 255; } }
[Constructable]
public BlackLotusHood() : base()
{
Attributes.LowerManaCost = 6;
Attributes.AttackChance = 6;
ClothingAttributes.SelfRepair = 5;
}
public BlackLotusHood( Serial serial ) : base( serial )
{
}
public override void Serialize( GenericWriter writer )
{
base.Serialize( writer );
writer.Write( (int)1 );
}
public override void Deserialize( GenericReader reader )
{
base.Deserialize( reader );
int version = reader.ReadInt();
if ( version == 0 )
{
MaxHitPoints = 255;
HitPoints = 255;
}
}
}
public class DaimyosHelm : PlateBattleKabuto
{
public override int LabelNumber { get { return 1070920; } } // Daimyo's Helm
public override int BaseColdResistance { get { return 10; } }
[Constructable]
public DaimyosHelm() : base()
{
ArmorAttributes.LowerStatReq = 100;
ArmorAttributes.MageArmor = 1;
ArmorAttributes.SelfRepair = 3;
Attributes.WeaponSpeed = 10;
}
public DaimyosHelm( Serial serial ) : base( serial )
{
}
public override void Serialize( GenericWriter writer )
{
base.Serialize( writer );
writer.Write( (int)0 );
}
public override void Deserialize( GenericReader reader )
{
base.Deserialize( reader );
int version = reader.ReadInt();
}
public override int InitMinHits { get { return 255; } }
public override int InitMaxHits { get { return 255; } }
}
public class DemonForks : Sai
{
public override int LabelNumber{ get{ return 1070917; } } // Demon Forks
[Constructable]
public DemonForks() : base()
{
WeaponAttributes.ResistFireBonus = 10;
WeaponAttributes.ResistPoisonBonus = 10;
Attributes.ReflectPhysical = 10;
Attributes.WeaponDamage = 35;
Attributes.DefendChance = 10;
}
public DemonForks( Serial serial ) : base( serial )
{
}
public override void Serialize( GenericWriter writer )
{
base.Serialize( writer );
writer.Write( (int)0 );
}
public override void Deserialize( GenericReader reader )
{
base.Deserialize( reader );
int version = reader.ReadInt();
}
public override int InitMinHits { get { return 255; } }
public override int InitMaxHits { get { return 255; } }
}
public class DragonNunchaku : Nunchaku
{
public override int LabelNumber{ get{ return 1070914; } } // Dragon Nunchaku
[Constructable]
public DragonNunchaku() : base()
{
WeaponAttributes.ResistFireBonus = 5;
WeaponAttributes.SelfRepair = 3;
WeaponAttributes.HitFireball = 50;
Attributes.WeaponDamage = 40;
Attributes.WeaponSpeed = 20;
}
public DragonNunchaku( Serial serial ) : base( serial )
{
}
public override void Serialize( GenericWriter writer )
{
base.Serialize( writer );
writer.Write( (int)0 );
}
public override void Deserialize( GenericReader reader )
{
base.Deserialize( reader );
int version = reader.ReadInt();
}
public override int InitMinHits { get { return 255; } }
public override int InitMaxHits { get { return 255; } }
}
public class Exiler : Tetsubo
{
public override int LabelNumber{ get{ return 1070913; } } // Exiler
[Constructable]
public Exiler() : base()
{
WeaponAttributes.HitDispel = 33;
Slayer = SlayerName.Exorcism;
Attributes.WeaponDamage = 40;
Attributes.WeaponSpeed = 20;
}
public override void GetDamageTypes( Mobile wielder, out int phys, out int fire, out int cold, out int pois, out int nrgy )
{
phys = fire = cold = pois = 0;
nrgy = 100;
}
public Exiler( Serial serial ) : base( serial )
{
}
public override void Serialize( GenericWriter writer )
{
base.Serialize( writer );
writer.Write( (int)0 );
}
public override void Deserialize( GenericReader reader )
{
base.Deserialize( reader );
int version = reader.ReadInt();
}
public override int InitMinHits { get { return 255; } }
public override int InitMaxHits { get { return 255; } }
}
public class GlovesOfTheSun : LeatherNinjaMitts
{
public override int LabelNumber { get { return 1070924; } } // Gloves of the Sun
public override int BaseFireResistance { get { return 24; } }
[Constructable]
public GlovesOfTheSun() : base()
{
Attributes.RegenHits = 2;
Attributes.NightSight = 1;
Attributes.LowerManaCost = 5;
Attributes.LowerRegCost = 18;
}
public GlovesOfTheSun( Serial serial ) : base( serial )
{
}
public override void Serialize( GenericWriter writer )
{
base.Serialize( writer );
writer.Write( (int)0 );
}
public override void Deserialize( GenericReader reader )
{
base.Deserialize( reader );
int version = reader.ReadInt();
}
public override int InitMinHits { get { return 255; } }
public override int InitMaxHits { get { return 255; } }
}
public class HanzosBow : Yumi
{
public override int LabelNumber { get { return 1070918; } } // Hanzo's Bow
[Constructable]
public HanzosBow() : base()
{
WeaponAttributes.HitLeechHits = 40;
WeaponAttributes.SelfRepair = 3;
Attributes.WeaponDamage = 50;
SkillBonuses.SetValues( 0, SkillName.Ninjitsu, 10 );
}
public HanzosBow( Serial serial ) : base( serial )
{
}
public override void Serialize( GenericWriter writer )
{
base.Serialize( writer );
writer.Write( (int)0 );
}
public override void Deserialize( GenericReader reader )
{
base.Deserialize( reader );
int version = reader.ReadInt();
}
public override int InitMinHits { get { return 255; } }
public override int InitMaxHits { get { return 255; } }
}
public class LegsOfStability : PlateSuneate
{
public override int LabelNumber { get { return 1070925; } } // Legs of Stability
public override int BasePhysicalResistance { get { return 20; } }
public override int BasePoisonResistance { get { return 18; } }
[Constructable]
public LegsOfStability() : base()
{
Attributes.BonusStam = 5;
ArmorAttributes.SelfRepair = 3;
ArmorAttributes.LowerStatReq = 100;
ArmorAttributes.MageArmor = 1;
}
public LegsOfStability( Serial serial ) : base( serial )
{
}
public override void Serialize( GenericWriter writer )
{
base.Serialize( writer );
writer.Write( (int)0 );
}
public override void Deserialize( GenericReader reader )
{
base.Deserialize( reader );
int version = reader.ReadInt();
}
public override int InitMinHits { get { return 255; } }
public override int InitMaxHits { get { return 255; } }
}
public class PeasantsBokuto : Bokuto
{
public override int LabelNumber { get { return 1070912; } } // Peasant's Bokuto
[Constructable]
public PeasantsBokuto() : base()
{
WeaponAttributes.SelfRepair = 3;
WeaponAttributes.HitLowerDefend = 30;
Attributes.WeaponDamage = 35;
Attributes.WeaponSpeed = 10;
Slayer = SlayerName.SnakesBane;
}
public PeasantsBokuto( Serial serial ) : base( serial )
{
}
public override void Serialize( GenericWriter writer )
{
base.Serialize( writer );
writer.Write( (int)0 );
}
public override void Deserialize( GenericReader reader )
{
base.Deserialize( reader );
int version = reader.ReadInt();
}
public override int InitMinHits { get { return 255; } }
public override int InitMaxHits { get { return 255; } }
}
public class PilferedDancerFans : Tessen
{
public override int LabelNumber { get { return 1070916; } } // Pilfered Dancer Fans
[Constructable]
public PilferedDancerFans() : base()
{
Attributes.WeaponDamage = 20;
Attributes.WeaponSpeed = 20;
Attributes.CastRecovery = 2;
Attributes.DefendChance = 5;
Attributes.SpellChanneling = 1;
}
public PilferedDancerFans( Serial serial ) : base( serial )
{
}
public override void Serialize( GenericWriter writer )
{
base.Serialize( writer );
writer.Write( (int)0 );
}
public override void Deserialize( GenericReader reader )
{
base.Deserialize( reader );
int version = reader.ReadInt();
}
public override int InitMinHits { get { return 255; } }
public override int InitMaxHits { get { return 255; } }
}
public class TheDestroyer : NoDachi
{
public override int LabelNumber { get { return 1070915; } } // The Destroyer
[Constructable]
public TheDestroyer() : base()
{
WeaponAttributes.HitLeechStam = 40;
Attributes.BonusStr = 6;
Attributes.AttackChance = 10;
Attributes.WeaponDamage = 50;
}
public TheDestroyer( Serial serial ) : base( serial )
{
}
public override void Serialize( GenericWriter writer )
{
base.Serialize( writer );
writer.Write( (int)0 );
}
public override void Deserialize( GenericReader reader )
{
base.Deserialize( reader );
int version = reader.ReadInt();
}
public override int InitMinHits { get { return 255; } }
public override int InitMaxHits { get { return 255; } }
}
public class TomeOfEnlightenment : Spellbook
{
public override int LabelNumber { get { return 1070934; } } // Tome of Enlightenment
[Constructable]
public TomeOfEnlightenment() : base()
{
LootType = LootType.Regular;
Hue = 0x455;
Attributes.BonusInt = 5;
Attributes.SpellDamage = 10;
Attributes.CastSpeed = 1;
}
public TomeOfEnlightenment( Serial serial ) : base( serial )
{
}
public override void Serialize( GenericWriter writer )
{
base.Serialize( writer );
writer.Write( (int)0 );
}
public override void Deserialize( GenericReader reader )
{
base.Deserialize( reader );
int version = reader.ReadInt();
}
}
//Non weapon/armor ones:
public class AncientUrn : Item
{
private static string[] m_Names = new string[]
{
"Akira",
"Avaniaga",
"Aya",
"Chie",
"Emiko",
"Fumiyo",
"Gennai",
"Gennosuke",
"Genjo",
"Hamato",
"Harumi",
"Ikuyo",
"Juri",
"Kaori",
"Kaoru",
"Kiyomori",
"Mayako",
"Motoki",
"Musashi",
"Nami",
"Nobukazu",
"Roku",
"Romi",
"Ryo",
"Sanzo",
"Sakamae",
"Satoshi",
"Takamori",
"Takuro",
"Teruyo",
"Toshiro",
"Yago",
"Yeijiro",
"Yoshi",
"Zeshin"
};
public static string[] Names { get { return m_Names; } }
private string m_UrnName;
[CommandProperty( AccessLevel.GameMaster )]
public string UrnName
{
get { return m_UrnName; }
set { m_UrnName = value; }
}
public override int LabelNumber { get { return 1071014; } } // Ancient Urn
[Constructable]
public AncientUrn( string urnName ) : base( 0x241D )
{
m_UrnName = urnName;
Weight = 1.0;
}
[Constructable]
public AncientUrn() : this( m_Names[Utility.Random( m_Names.Length )] )
{
}
public AncientUrn( Serial serial ) : base( serial )
{
}
public override void Serialize( GenericWriter writer )
{
base.Serialize( writer );
writer.Write( (int)0 );
writer.Write( m_UrnName );
}
public override void Deserialize( GenericReader reader )
{
base.Deserialize( reader );
int version = reader.ReadInt();
m_UrnName = reader.ReadString();
Utility.Intern( ref m_UrnName );
}
public override void AddNameProperty( ObjectPropertyList list )
{
list.Add( 1070935, m_UrnName ); // Ancient Urn of ~1_name~
}
public override void OnSingleClick( Mobile from )
{
LabelTo( from, 1070935, m_UrnName ); // Ancient Urn of ~1_name~
}
}
public class HonorableSwords : Item
{
private string m_SwordsName;
[CommandProperty( AccessLevel.GameMaster )]
public string SwordsName
{
get { return m_SwordsName; }
set { m_SwordsName = value; }
}
public override int LabelNumber { get { return 1071015; } } // Honorable Swords
[Constructable]
public HonorableSwords( string swordsName ) : base( 0x2853 )
{
m_SwordsName = swordsName;
Weight = 5.0;
}
[Constructable]
public HonorableSwords() : this( AncientUrn.Names[Utility.Random( AncientUrn.Names.Length )] )
{
}
public HonorableSwords( Serial serial ) : base( serial )
{
}
public override void Serialize( GenericWriter writer )
{
base.Serialize( writer );
writer.Write( (int)0 );
writer.Write( m_SwordsName );
}
public override void Deserialize( GenericReader reader )
{
base.Deserialize( reader );
int version = reader.ReadInt();
m_SwordsName = reader.ReadString();
Utility.Intern( ref m_SwordsName );
}
public override void AddNameProperty( ObjectPropertyList list )
{
list.Add( 1070936, m_SwordsName ); // Honorable Swords of ~1_name~
}
public override void OnSingleClick( Mobile from )
{
LabelTo( from, 1070936, m_SwordsName ); // Honorable Swords of ~1_name~
}
//TODO: the Chest of Heirlooms
}
public class FluteOfRenewal : BambooFlute
{
public override int LabelNumber { get { return 1070927; } } // Flute of Renewal
[Constructable]
public FluteOfRenewal() : base()
{
Slayer = SlayerGroup.Groups[Utility.Random( SlayerGroup.Groups.Length - 1 )].Super.Name; //-1 to exclude Fey slayer. Try to confrim no fey slayer on this on OSI
ReplenishesCharges = true;
}
public override int InitMinUses { get { return 300; } }
public override int InitMaxUses { get { return 300; } }
public FluteOfRenewal( Serial serial ) : base( serial )
{
}
public override void Serialize( GenericWriter writer )
{
base.Serialize( writer );
writer.Write( (int) 1 ); // version
}
public override void Deserialize( GenericReader reader )
{
base.Deserialize( reader );
int version = reader.ReadInt();
if( version == 0 && Slayer == SlayerName.Fey )
Slayer = SlayerGroup.Groups[Utility.Random( SlayerGroup.Groups.Length - 1 )].Super.Name;
}
}
}

View file

@ -0,0 +1,506 @@
using System;
using Server;
using Server.Network;
using System.Collections;
using Server.Items;
using Server.Gumps;
using Server.Misc;
using Server.Mobiles;
namespace Server.Misc
{
public class TreasuresOfTokuno
{
private static bool m_Enabled = (Core.Expansion == Expansion.SE);
public static bool Enabled { get { return m_Enabled; } }
public const int ItemsPerReward = 10;
private static Type[] m_LesserArtifacts = new Type[]
{
typeof( AncientFarmersKasa ), typeof( AncientSamuraiDo ), typeof( ArmsOfTacticalExcellence ), typeof( BlackLotusHood ),
typeof( DaimyosHelm ), typeof( DemonForks ), typeof( DragonNunchaku ), typeof( Exiler ), typeof( GlovesOfTheSun ),
typeof( HanzosBow ), typeof( LegsOfStability ), typeof( PeasantsBokuto ), typeof( PilferedDancerFans ), typeof( TheDestroyer ),
typeof( TomeOfEnlightenment ), typeof( AncientUrn ), typeof( HonorableSwords ), typeof( PigmentsOfTokuno ), typeof( FluteOfRenewal ) //TODO: Chest of heirlooms
};
public static Type[] LesserArtifacts { get { return m_LesserArtifacts; } }
private static Type[] m_GreaterArtifacts = null;
public static Type[] GreaterArtifacts
{
get
{
if( m_GreaterArtifacts == null )
{
m_GreaterArtifacts = new Type[ToTRedeemGump.NormalRewards.Length];
for( int i = 0; i < m_GreaterArtifacts.Length; i++ )
{
m_GreaterArtifacts[i] = ToTRedeemGump.NormalRewards[i].Type;
}
}
return m_GreaterArtifacts;
}
}
private static bool CheckLocation( Mobile m )
{
Region r = m.Region;
if( r.IsPartOf( typeof( Server.Regions.HouseRegion ) ) || Server.Multis.BaseBoat.FindBoatAt( m, m.Map ) != null )
return false;
//TODO: a CanReach of something check as opposed to above?
if( r.IsPartOf( "Yomotsu Mines" ) || r.IsPartOf( "Fan Dancer's Dojo" ) )
return true;
return (m.Map == Map.Tokuno);
}
public static void HandleKill( Mobile victim, Mobile killer )
{
PlayerMobile pm = killer as PlayerMobile;
BaseCreature bc = victim as BaseCreature;
if( !Enabled || pm == null || bc == null || !CheckLocation( bc ) || !CheckLocation( pm )|| !killer.InRange( victim, 18 ))
return;
if( bc.Controlled || bc.Owners.Count > 0 || bc.Fame <= 0 )
return;
//25000 for 1/100 chance, 10 hyrus
//1500, 1/1000 chance, 20 lizard men for that chance.
pm.ToTTotalMonsterFame += (int)(bc.Fame * (1 + Math.Sqrt( pm.Luck ) / 100));
//This is the Exponentional regression with only 2 datapoints.
//A log. func would also work, but it didn't make as much sense.
//This function isn't OSI exact beign that I don't know OSI's func they used ;p
int x = pm.ToTTotalMonsterFame;
//const double A = 8.63316841 * Math.Pow( 10, -4 );
const double A = 0.000863316841;
//const double B = 4.25531915 * Math.Pow( 10, -6 );
const double B = 0.00000425531915;
double chance = A * Math.Pow( 10, B * x );
if( chance > Utility.RandomDouble() )
{
Item i = null;
try
{
i = Activator.CreateInstance( m_LesserArtifacts[Utility.Random( m_LesserArtifacts.Length )] ) as Item;
}
catch
{ }
if( i != null )
{
if( pm.AddToBackpack( i ) )
{
pm.SendLocalizedMessage( 1062317 ); // For your valor in combating the fallen beast, a special artifact has been bestowed on you.
pm.ToTTotalMonsterFame = 0;
}
else
{
//Place in bank possibly?
i.Delete();
}
}
}
}
}
}
namespace Server.Mobiles
{
public class IharaSoko : BaseVendor
{
public override bool IsActiveVendor { get { return false; } }
public override bool IsInvulnerable { get { return true; } }
public override bool DisallowAllMoves { get { return true; } }
public override bool ClickTitle { get { return true; } }
public override bool CanTeach { get { return false; } }
protected ArrayList m_SBInfos = new ArrayList();
protected override ArrayList SBInfos { get { return m_SBInfos; } }
public override void InitSBInfo()
{
}
public override void InitOutfit()
{
AddItem( new Waraji( 0x711 ) );
AddItem( new Backpack() );
AddItem( new Kamishimo( 0x483 ) );
Item item = new LightPlateJingasa();
item.Hue = 0x711;
AddItem( item );
}
[Constructable]
public IharaSoko() : base( "the Imperial Minister of Trade" )
{
Name = "Ihara Soko";
Female = false;
Body = 0x190;
Hue = 0x8403;
}
public IharaSoko( Serial serial ) : base( serial )
{
}
public override void Serialize( GenericWriter writer )
{
base.Serialize( writer );
writer.Write( (int) 0 );
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize( reader );
int version = reader.ReadInt();
}
public override bool CanBeDamaged()
{
return false;
}
public override void OnMovement( Mobile m, Point3D oldLocation )
{
//if( !TreasuresOfTokuno.Enabled ) //He still accepts items even if ToTs are turned off.
// return;
if( m.Alive && m is PlayerMobile )
{
PlayerMobile pm = (PlayerMobile)m;
int range = 3;
if( m.Alive && Math.Abs( Z - m.Z ) < 16 && InRange( m, range ) && !InRange( oldLocation, range ) )
{
if( pm.ToTItemsTurnedIn >= TreasuresOfTokuno.ItemsPerReward )
{
SayTo( pm, 1070980 ); // Congratulations! You have turned in enough minor treasures to earn a greater reward.
pm.CloseGump( typeof( ToTTurnInGump ) ); //Sanity
if( !pm.HasGump( typeof( ToTRedeemGump ) ) )
pm.SendGump( new ToTRedeemGump( this, false ) );
}
else
{
if( pm.ToTItemsTurnedIn == 0 )
SayTo( pm, 1071013 ); // Bring me 10 of the lost treasures of Tokuno and I will reward you with a valuable item.
else
SayTo( pm, 1070981, String.Format( "{0}\t{1}", pm.ToTItemsTurnedIn, TreasuresOfTokuno.ItemsPerReward ) ); // You have turned in ~1_COUNT~ minor artifacts. Turn in ~2_NUM~ to receive a reward.
ArrayList buttons = ToTTurnInGump.FindRedeemableItems( pm );
if( buttons.Count > 0 && !pm.HasGump( typeof( ToTTurnInGump ) ) )
pm.SendGump( new ToTTurnInGump( this, buttons ) );
}
}
int leaveRange = 7;
if( !InRange( m, leaveRange ) && InRange( oldLocation, leaveRange ) )
{
pm.CloseGump( typeof( ToTRedeemGump ) );
pm.CloseGump( typeof( ToTTurnInGump ) );
}
}
}
public override void TurnToTokuno(){}
}
}
namespace Server.Gumps
{
public class ItemTileButtonInfo : ImageTileButtonInfo
{
private Item m_Item;
public Item Item
{
get { return m_Item; }
set { m_Item = value; }
}
public ItemTileButtonInfo( Item i ) : base( i.ItemID, i.Hue, ((i.Name == null || i.Name.Length <= 0)? (TextDefinition)i.LabelNumber : (TextDefinition)i.Name ) )
{
m_Item = i;
}
}
public class ToTTurnInGump : BaseImageTileButtonsGump
{
public static ArrayList FindRedeemableItems( Mobile m )
{
Backpack pack = (Backpack)m.Backpack;
if( pack == null )
return new ArrayList();
ArrayList items = new ArrayList( pack.FindItemsByType( TreasuresOfTokuno.LesserArtifacts ) );
ArrayList buttons = new ArrayList();
for( int i = 0; i < items.Count; i++ )
{
Item item = (Item)items[i];
//bool acceptable = true;
/* TODO:
if( item is ChestOfHeirlooms )
*/
if( item is PigmentsOfTokuno && ((PigmentsOfTokuno)item).Type != PigmentType.None )
continue;
buttons.Add( new ItemTileButtonInfo( item ) );
}
return buttons;
}
Mobile m_Collector;
public ToTTurnInGump( Mobile collector, ArrayList buttons ) : base( 1071012, buttons ) // Click a minor artifact to give it to Ihara Soko.
{
m_Collector = collector;
}
public ToTTurnInGump( Mobile collector, ItemTileButtonInfo[] buttons ) : base( 1071012, buttons ) // Click a minor artifact to give it to Ihara Soko.
{
m_Collector = collector;
}
public override void HandleButtonResponse( NetState sender, int adjustedButton, ImageTileButtonInfo buttonInfo )
{
PlayerMobile pm = sender.Mobile as PlayerMobile;
Item item = ((ItemTileButtonInfo)buttonInfo).Item;
if( !( pm != null && item.IsChildOf( pm.Backpack ) && pm.InRange( m_Collector.Location, 7 )) )
return;
item.Delete();
if( ++pm.ToTItemsTurnedIn >= TreasuresOfTokuno.ItemsPerReward )
{
m_Collector.SayTo( pm, 1070980 ); // Congratulations! You have turned in enough minor treasures to earn a greater reward.
pm.CloseGump( typeof( ToTTurnInGump ) ); //SAnity
if( !pm.HasGump( typeof( ToTRedeemGump ) ) )
pm.SendGump( new ToTRedeemGump( m_Collector, false ) );
}
else
{
m_Collector.SayTo( pm, 1070981, String.Format( "{0}\t{1}", pm.ToTItemsTurnedIn, TreasuresOfTokuno.ItemsPerReward ) ); // You have turned in ~1_COUNT~ minor artifacts. Turn in ~2_NUM~ to receive a reward.
ArrayList buttons = FindRedeemableItems( pm );
pm.CloseGump( typeof( ToTTurnInGump ) ); //Sanity
if( buttons.Count > 0 )
pm.SendGump( new ToTTurnInGump( m_Collector, buttons ) );
}
}
public override void HandleCancel( NetState sender )
{
PlayerMobile pm = sender.Mobile as PlayerMobile;
if( pm == null || !pm.InRange( m_Collector.Location, 7 ) )
return;
if( pm.ToTItemsTurnedIn == 0 )
m_Collector.SayTo( pm, 1071013 ); // Bring me 10 of the lost treasures of Tokuno and I will reward you with a valuable item.
else if( pm.ToTItemsTurnedIn < TreasuresOfTokuno.ItemsPerReward ) //This case should ALWAYS be true with this gump, jsut a sanity check
m_Collector.SayTo( pm, 1070981, String.Format( "{0}\t{1}", pm.ToTItemsTurnedIn, TreasuresOfTokuno.ItemsPerReward ) ); // You have turned in ~1_COUNT~ minor artifacts. Turn in ~2_NUM~ to receive a reward.
else
m_Collector.SayTo( pm, 1070982 ); // When you wish to choose your reward, you have but to approach me again.
}
}
}
namespace Server.Gumps
{
public class ToTRedeemGump : BaseImageTileButtonsGump
{
public class TypeTileButtonInfo : ImageTileButtonInfo
{
private Type m_Type;
public Type Type { get { return m_Type; } }
public TypeTileButtonInfo( Type type, int itemID, int hue, TextDefinition label, int localizedToolTip ) : base( itemID, hue, label, localizedToolTip )
{
m_Type = type;
}
public TypeTileButtonInfo( Type type, int itemID, TextDefinition label ) : this( type, itemID, 0, label, -1 )
{
}
public TypeTileButtonInfo( Type type, int itemID, TextDefinition label, int localizedToolTip ) : this( type, itemID, 0, label, localizedToolTip )
{
}
}
public class PigmentsTileButtonInfo : ImageTileButtonInfo
{
private PigmentType m_Pigment;
public PigmentType Pigment
{
get
{
return m_Pigment;
}
set
{
m_Pigment = value;
}
}
public PigmentsTileButtonInfo( PigmentType p ) : base( 0xEFF, PigmentsOfTokuno.PigmentInfo.GetInfo( p ).Hue, PigmentsOfTokuno.PigmentInfo.GetInfo( p ).Label )
{
m_Pigment = p;
}
}
private static TypeTileButtonInfo[] m_NormalRewards = new TypeTileButtonInfo[]
{
new TypeTileButtonInfo( typeof( SwordsOfProsperity ), 0x27A9, 1070963, 1071002 ),
new TypeTileButtonInfo( typeof( SwordOfTheStampede ), 0x27A2, 1070964, 1070978 ),
new TypeTileButtonInfo( typeof( WindsEdge ), 0x27A3, 1070965, 1071003 ),
new TypeTileButtonInfo( typeof( DarkenedSky ), 0x27AD, 1070966, 1071004 ),
new TypeTileButtonInfo( typeof( TheHorselord ), 0x27A5, 1070967, 1071005 ),
new TypeTileButtonInfo( typeof( RuneBeetleCarapace ), 0x277D, 1070968, 1071006 ),
new TypeTileButtonInfo( typeof( KasaOfTheRajin ), 0x2798, 1070969, 1071007 ),
new TypeTileButtonInfo( typeof( Stormgrip ), 0x2792, 1070970, 1071008 ),
new TypeTileButtonInfo( typeof( TomeOfLostKnowledge ), 0xEFA, 0x530, 1070971, 1071009 ),
new TypeTileButtonInfo( typeof( PigmentsOfTokuno ), 0xEFF, 1070933, 1071011 )
};
public static TypeTileButtonInfo[] NormalRewards { get { return m_NormalRewards; } }
private static PigmentsTileButtonInfo[] m_PigmentRewards = new PigmentsTileButtonInfo[]
{
new PigmentsTileButtonInfo( PigmentType.ParagonGold ),
new PigmentsTileButtonInfo( PigmentType.VioletCouragePurple ),
new PigmentsTileButtonInfo( PigmentType.InvulnerabilityBlue ),
new PigmentsTileButtonInfo( PigmentType.LunaWhite ),
new PigmentsTileButtonInfo( PigmentType.DryadGreen ),
new PigmentsTileButtonInfo( PigmentType.ShadowDancerBlack ),
new PigmentsTileButtonInfo( PigmentType.BerserkerRed ),
new PigmentsTileButtonInfo( PigmentType.NoxGreen ),
new PigmentsTileButtonInfo( PigmentType.RumRed ),
new PigmentsTileButtonInfo( PigmentType.FireOrange )
};
public static PigmentsTileButtonInfo[] PigmentRewards { get { return m_PigmentRewards; } }
private Mobile m_Collector;
public ToTRedeemGump( Mobile collector, bool pigments ) : base( pigments ? 1070986 : 1070985, pigments ? (ImageTileButtonInfo[])m_PigmentRewards : (ImageTileButtonInfo[])m_NormalRewards )
{
m_Collector = collector;
}
public override void HandleButtonResponse( NetState sender, int adjustedButton, ImageTileButtonInfo buttonInfo )
{
PlayerMobile pm = sender.Mobile as PlayerMobile;
if( pm == null || !pm.InRange( m_Collector.Location, 7 ) || !(pm.ToTItemsTurnedIn >= TreasuresOfTokuno.ItemsPerReward) )
return;
bool pigments = (buttonInfo is PigmentsTileButtonInfo);
Item item = null;
if( pigments )
{
PigmentsTileButtonInfo p = buttonInfo as PigmentsTileButtonInfo;
item = new PigmentsOfTokuno( p.Pigment );
}
else
{
TypeTileButtonInfo t = buttonInfo as TypeTileButtonInfo;
if( t.Type == typeof( PigmentsOfTokuno ) ) //Special case of course.
{
pm.CloseGump( typeof( ToTTurnInGump ) ); //Sanity
pm.CloseGump( typeof( ToTRedeemGump ) );
pm.SendGump( new ToTRedeemGump( m_Collector, true ) );
return;
}
try
{
item = (Item)Activator.CreateInstance( t.Type );
}
catch { }
}
if( item == null )
return; //Sanity
if( pm.AddToBackpack( item ) )
{
pm.ToTItemsTurnedIn -= TreasuresOfTokuno.ItemsPerReward;
m_Collector.SayTo( pm, 1070984, (item.Name == null || item.Name.Length <= 0)? String.Format( "#{0}", item.LabelNumber ) : item.Name ); // You have earned the gratitude of the Empire. I have placed the ~1_OBJTYPE~ in your backpack.
}
else
{
item.Delete();
m_Collector.SayTo( pm, 500722 ); // You don't have enough room in your backpack!
m_Collector.SayTo( pm, 1070982 ); // When you wish to choose your reward, you have but to approach me again.
}
}
public override void HandleCancel( NetState sender )
{
PlayerMobile pm = sender.Mobile as PlayerMobile;
if( pm == null || !pm.InRange( m_Collector.Location, 7 ) )
return;
if( pm.ToTItemsTurnedIn == 0 )
m_Collector.SayTo( pm, 1071013 ); // Bring me 10 of the lost treasures of Tokuno and I will reward you with a valuable item.
else if( pm.ToTItemsTurnedIn < TreasuresOfTokuno.ItemsPerReward ) //This and above case should ALWAYS be FALSE with this gump, jsut a sanity check
m_Collector.SayTo( pm, 1070981, String.Format( "{0}\t{1}", pm.ToTItemsTurnedIn, TreasuresOfTokuno.ItemsPerReward ) ); // You have turned in ~1_COUNT~ minor artifacts. Turn in ~2_NUM~ to receive a reward.
else
m_Collector.SayTo( pm, 1070982 ); // When you wish to choose your reward, you have but to approach me again.
}
}
}
/* Notes
Pigments of tokuno do NOT check for if item is already hued 0; APPARENTLY he still accepts it if it's < 10 charges.
Chest of Heirlooms don't show if unlocked.
Chest of heirlooms, locked, HARD to pick at 100 lock picking but not impossible. had 95 health to 0, cause it's trapped >< (explosion i think)
*/