using System; using System.Collections.Generic; namespace Server.Items { public class PowerScroll : SpecialScroll { public override int Message => 1049469; /* Using a scroll increases the maximum amount of a specific skill or your maximum statistics. * When used, the effect is not immediately seen without a gain of points with that skill or statistics. * You can view your maximum skill values in your skills window. * You can view your maximum statistic value in your statistics window. */ public override int Title { get { double level = ( Value - 105.0 ) / 5.0; if ( level >= 0.0 && level <= 3.0 && Value % 5.0 == 0.0 ) return 1049635 + (int)level; /* Wonderous Scroll (105 Skill): OR * Exalted Scroll (110 Skill): OR * Mythical Scroll (115 Skill): OR * Legendary Scroll (120 Skill): */ return 0; } } public override string DefaultTitle => $"Power Scroll ({Value} Skill):"; private static SkillName[] m_Skills = { SkillName.Blacksmith, SkillName.Tailoring, SkillName.Swords, SkillName.Fencing, SkillName.Macing, SkillName.Archery, SkillName.Wrestling, SkillName.Parry, SkillName.Tactics, SkillName.Anatomy, SkillName.Healing, SkillName.Magery, SkillName.Meditation, SkillName.EvalInt, SkillName.MagicResist, SkillName.AnimalTaming, SkillName.AnimalLore, SkillName.Veterinary, SkillName.Musicianship, SkillName.Provocation, SkillName.Discordance, SkillName.Peacemaking }; private static SkillName[] m_AOSSkills = { SkillName.Chivalry, SkillName.Focus, SkillName.Necromancy, SkillName.Stealing, SkillName.Stealth, SkillName.SpiritSpeak }; private static SkillName[] m_SESkills = { SkillName.Ninjitsu, SkillName.Bushido }; private static SkillName[] m_MLSkills = { SkillName.Spellweaving }; /* private static SkillName[] m_SASkills = new SkillName[] { SkillName.Throwing, SkillName.Mysticism, SkillName.Imbuing }; private static SkillName[] m_HSSkills = new SkillName[] { SkillName.Fishing }; */ private static List _Skills = new List(); public static List Skills { get { if ( _Skills.Count == 0 ) { _Skills.AddRange( m_Skills ); if (Core.AOS) { _Skills.AddRange( m_AOSSkills ); if (Core.SE) { _Skills.AddRange( m_SESkills ); if (Core.ML) { _Skills.AddRange( m_MLSkills ); /* if (Core.SA) { _Skills.AddRange( m_SASkills ); if (Core.HS) _Skills.AddRange( m_HSSkills ); } */ } } } } return _Skills; } } public static PowerScroll CreateRandom( int min, int max ) { min /= 5; max /= 5; return new PowerScroll( Skills[Utility.Random( Skills.Count )], 100 + ( Utility.RandomMinMax( min, max ) * 5 ) ); } public static PowerScroll CreateRandomNoCraft( int min, int max ) { min /= 5; max /= 5; SkillName skillName; do { skillName = Skills[Utility.Random( Skills.Count )]; } while ( skillName == SkillName.Blacksmith || skillName == SkillName.Tailoring ); return new PowerScroll( skillName, 100 + (Utility.RandomMinMax( min, max ) * 5)); } public PowerScroll() : this( SkillName.Alchemy, 0.0 ) { } [Constructible] public PowerScroll( SkillName skill, double value ) : base( skill, value ) { Hue = 0x481; if ( Value == 105.0 || skill == SkillName.Blacksmith || skill == SkillName.Tailoring ) LootType = LootType.Regular; } public PowerScroll( Serial serial ) : base( serial ) { } public override void AddNameProperty( ObjectPropertyList list ) { double level = ( Value - 105.0 ) / 5.0; if ( level >= 0.0 && level <= 3.0 && Value % 5.0 == 0.0 ) list.Add( 1049639 + (int)level, GetNameLocalized() ); /* a wonderous scroll of ~1_type~ (105 Skill) OR * an exalted scroll of ~1_type~ (110 Skill) OR * a mythical scroll of ~1_type~ (115 Skill) OR * a legendary scroll of ~1_type~ (120 Skill) */ else list.Add( "a power scroll of {0} ({1} Skill)", GetName(), Value ); } public override void OnSingleClick( Mobile from ) { double level = ( Value - 105.0 ) / 5.0; if ( level >= 0.0 && level <= 3.0 && Value % 5.0 == 0.0 ) LabelTo( from, 1049639 + (int)level, GetNameLocalized() ); else LabelTo( from, "a power scroll of {0} ({1} Skill)", GetName(), Value ); } public override bool CanUse( Mobile from ) { if ( !base.CanUse( from ) ) return false; Skill skill = from.Skills[Skill]; if ( skill == null ) return false; if ( skill.Cap >= Value ) { from.SendLocalizedMessage( 1049511, GetNameLocalized() ); // Your ~1_type~ is too high for this power scroll. return false; } return true; } public override void Use( Mobile from ) { if ( !CanUse( from ) ) return; from.SendLocalizedMessage( 1049513, GetNameLocalized() ); // You feel a surge of magic as the scroll enhances your ~1_type~! from.Skills[Skill].Cap = Value; Effects.SendLocationParticles( EffectItem.Create( from.Location, from.Map, EffectItem.DefaultDuration ), 0, 0, 0, 0, 0, 5060, 0 ); Effects.PlaySound( from.Location, from.Map, 0x243 ); Effects.SendMovingParticles( new Entity( Serial.Zero, new Point3D( from.X - 6, from.Y - 6, from.Z + 15 ), from.Map ), from, 0x36D4, 7, 0, false, true, 0x497, 0, 9502, 1, 0, (EffectLayer)255, 0x100 ); Effects.SendMovingParticles( new Entity( Serial.Zero, new Point3D( from.X - 4, from.Y - 6, from.Z + 15 ), from.Map ), from, 0x36D4, 7, 0, false, true, 0x497, 0, 9502, 1, 0, (EffectLayer)255, 0x100 ); Effects.SendMovingParticles( new Entity( Serial.Zero, new Point3D( from.X - 6, from.Y - 4, from.Z + 15 ), from.Map ), from, 0x36D4, 7, 0, false, true, 0x497, 0, 9502, 1, 0, (EffectLayer)255, 0x100 ); Effects.SendTargetParticles( from, 0x375A, 35, 90, 0x00, 0x00, 9502, (EffectLayer)255, 0x100 ); Delete(); } public override void Serialize( GenericWriter writer ) { base.Serialize( writer ); writer.Write( (int) 0 ); // version } public override void Deserialize( GenericReader reader ) { base.Deserialize( reader ); int version = ( InheritsItem ? 0 : reader.ReadInt() ); // Required for SpecialScroll insertion if ( Value == 105.0 || Skill == SkillName.Blacksmith || Skill == SkillName.Tailoring ) { LootType = LootType.Regular; } else { LootType = LootType.Cursed; Insured = false; } } } }