Hi Everyone!

I am looking for an mechanic that, once a person hits gm in a skill they can choose to either reset to 0 with the skill cap increased by X% or stay at their current cap.

I figure someone has probably already created a system like that but I have no idea what it would be called.

Do you know where I can find this?

Thanks!
 
Do you mean the soul stone? You can store any skill you have on it. It is a 30 vet reward SoulStone.cs should be in your shard
Post automatically merged:

Do you mean the soul stone? You can store any skill you have on it. It is a 30 vet reward SoulStone.cs should be in your shard
lol I meant to say 30 day vet reward
 
Last edited:
From what I get the wants to have a skill ascension system, you reach the skill cap, now you can use the scroll / item / quest and get it back down to 0%, at the same time the cap rises by 5% or whatever cap raise you want. Rinse and repeat until you reach the max
 
I personally have never seen a custom system like that. Not sure I would be as optimistic as you in thinking someone else has built it for you.
 
never heard of it in my 20 years of free shards. but that seems to be a very popular trend in modern games.

that game mechanic - ascending - always comes with a sweet bonus though. i personally wouldnt be thrilled as a player unless it came with an additional bonus like gold bonus drops on mobs, etc. something that made it super easy to get back to the point i was already at within less than a day.
 
You can make this quick and dirty by editing the "Use" secton of powerscrolls to check for 100% in a skill, apply the cap modifier and then revert your skill to the desired level.. You can use power scrollsas an example to see how this is done then make your own item. Or you can on skill gain, check to see if they have hit 100%, launch a gump with a choice(One time?).. Also you could add a command to launch a gump, choices to check selected skills, then apply it from there. If you go with the item it could become part of your server economy, the second option could be a pain, the third would take the economy out of the equation.

Powerscroll.cs around line 215:
        public override void Use(Mobile from)
        {
            if (!this.CanUse(from))
                return;

            from.SendLocalizedMessage(1049513, this.GetNameLocalized()); // You feel a surge of magic as the scroll enhances your ~1_type~!

            //CHANGED FROM

            //from.Skills[this.Skill].Cap = this.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);

            //this.Delete();


            //TO 
            if (from.Skills[this.Skill].Value >= 1000) //check for GM+ Skill (1000 or 100?)
            {
                //APPLY CAP - SET SKILL TO 0
                from.Skills[this.Skill].Cap = this.Value;
                from.Skills[this.Skill].Base = 0;
                
                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);

                this.Delete();
            }

        }

Have not tested this, but should put you on the path. This would take place of your powerscrolls.
 
Ok, got bored and decided to make this AscensionScroll.cs pretty much copy + paste Powerscroll.cs with edits and checks to display the correct information to the user as we cannot use localized messages for this.

Also I made it so that it removes the amount from the users skill that the Cap in that skill increases. So if a person has 100 Magery and 100 Cap. They eat a 150 cap scroll they will drop to 50, if they eat a 105 they will only drop to 95. So you will only ever lose as many points as you want your cap increased... 120 cap to 125 cap equals 5% magery skill cost for that increase..ect.

You can change this in the script, in the OnDoubleClick section, lines are commented. Anyhow tested it a bit, seems to work fine on this end. Here ya go...

[add AscensionScroll (SKILLNAME) (VALUE) example : [add AscensionScroll Magery 140


AscensionScroll.cs:
using System;
using System.Collections.Generic;

namespace Server.Items
{
    public class AscensionScroll : SpecialScroll
    {
        private static readonly SkillName[] m_Skills = new SkillName[]
        {
            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 readonly SkillName[] m_AOSSkills = new SkillName[]
        {
            SkillName.Chivalry,
            SkillName.Focus,
            SkillName.Necromancy,
            SkillName.Stealing,
            SkillName.Stealth,
            SkillName.SpiritSpeak
        };
        private static readonly SkillName[] m_SESkills = new SkillName[]
        {
            SkillName.Ninjitsu,
            SkillName.Bushido
        };
        private static readonly SkillName[] m_MLSkills = new SkillName[]
        {
            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 readonly List<SkillName> _Skills = new List<SkillName>();
        public AscensionScroll()
            : this(SkillName.Alchemy, 0.0)
        {
        }

        [Constructable]
        public AscensionScroll(SkillName skill, double value)
            : base(skill, value)
        {
            this.Hue = 0x481;

            if (this.Value == 105.0 || skill == Server.SkillName.Blacksmith || skill == Server.SkillName.Tailoring)
                this.LootType = LootType.Regular;
        }

        public AscensionScroll(Serial serial)
            : base(serial)
        {
        }

        public static List<SkillName> 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 override int Message
        {
            get
            {
              return 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 = (this.Value - 105.0) / 5.0;

                if (level >= 0.0 && level <= 3.0 && this.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
        {
            get
            {
                return String.Format("<basefont color=#FFFFFF>Ascension Scroll ({0} Skill):</basefont>", this.Value);
            }
        }
        public static AscensionScroll CreateRandom(int min, int max)
        {
            min /= 5;
            max /= 5;

            return new AscensionScroll(Skills[Utility.Random(Skills.Count)], 100 + (Utility.RandomMinMax(min, max) * 5));
        }

        public static AscensionScroll 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  || skillName == SkillName.Imbuing);

            return new AscensionScroll(skillName, 100 + (Utility.RandomMinMax(min, max) * 5));
        }

        public override void AddNameProperty(ObjectPropertyList list)
        {
            double level = (this.Value - 105.0) / 5.0;

            if (level >= 0.0 && level <= 3.0 && this.Value % 5.0 == 0.0)
                list.Add(1049639 + (int)level, this.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("an ascension scroll of {0} ({1} Skill)", this.GetName(), this.Value);
        }

        public override void OnSingleClick(Mobile from)
        {
            double level = (this.Value - 105.0) / 5.0;

            if (level >= 0.0 && level <= 3.0 && this.Value % 5.0 == 0.0)
                base.LabelTo(from, 1049639 + (int)level, this.GetNameLocalized());
            else
                base.LabelTo(from, "a ascension scroll of {0} ({1} Skill)", this.GetName(), this.Value);
        }

        public override bool CanUse(Mobile from)
        {
            if (!base.CanUse(from))
                return false;

            Skill skill = from.Skills[this.Skill];

            if (skill == null)
                return false;

            if (skill.Cap >= this.Value)
            {              
                from.SendMessage("Your skillcap in {0} is too high to use this scroll!", this.GetName());
                return false;
            }

            return true;
        }

        public override void OnDoubleClick(Mobile from)
        {
            if (from.Skills[this.Skill].Value >= 100) //check for minimum amount of skill to use (GM+?)
            {
                if (!this.CanUse(from)) //Already used a scroll of this strength?
                    return;

                //APPLY CAP - SET SKILL TO 0 or -the amount the cap increases.

                //from.Skills[this.Skill].Base = 0; //Set the Skill to Zero.
                from.Skills[this.Skill].Base -= (this.Value - from.Skills[this.Skill].Cap); // Remove as much skill as the Cap increases.
                from.Skills[this.Skill].Cap = this.Value; //Increase the Cap of the skill


                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);

                this.Delete();
            }
            else
            {
                from.SendMessage("Your current skill is too low to use that!");
                return;
            }

            

            from.SendLocalizedMessage(1049513, this.GetNameLocalized()); // You feel a surge of magic as the scroll enhances your ~1_type~!

        }
        public override void Use(Mobile from)
        {
           //Place logic here if you want the powerscroll gump instead of OnDoubleCLick           

        }

        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 = (this.InheritsItem ? 0 : reader.ReadInt()); // Required for SpecialScroll insertion

            if (this.Value == 105.0 || this.Skill == SkillName.Blacksmith || this.Skill == SkillName.Tailoring)
            {
                this.LootType = LootType.Regular;
            }
            else
            {
                this.LootType = LootType.Cursed;
                this.Insured = false;
            }
        }
    }
}
 
Back