示例#1
0
        /// <summary>
        /// Returns the XP required to go between skill level A and skill level B
        /// </summary>
        public ulong?GetXPBetweenSkillLevels(SkillAdvancementClass status, int levelA, int levelB)
        {
            var xpTable = GetXPTable(status);

            if (xpTable == null)
            {
                return(null);
            }
            return(xpTable[levelB + 1] - xpTable[levelA + 1]);
        }
示例#2
0
        /// <summary>
        /// Returns the skill XP required to go between fromRank and toRank
        /// </summary>
        public ulong?GetXPBetweenSkillLevels(SkillAdvancementClass status, int fromRank, int toRank)
        {
            var skillXPTable = GetSkillXPTable(status);

            if (skillXPTable == null)
            {
                return(null);
            }

            return(skillXPTable[toRank] - skillXPTable[fromRank]);
        }
示例#3
0
        /// <summary>
        /// Returns the maximum rank that can be purchased with an xp amount
        /// </summary>
        /// <param name="sac">Trained or specialized skill</param>
        /// <param name="xpAmount">The amount of xp used to make the purchase</param>
        public static int CalcSkillRank(SkillAdvancementClass sac, uint xpAmount)
        {
            var rankXpTable = GetSkillXPTable(sac);

            for (var i = rankXpTable.Count - 1; i >= 0; i--)
            {
                var rankAmount = rankXpTable[i];
                if (xpAmount >= rankAmount)
                {
                    return(i);
                }
            }
            return(-1);
        }
示例#4
0
        /// <summary>
        /// Returns the XP curve table based on trained or specialized skill
        /// </summary>
        public static List <uint> GetXPTable(SkillAdvancementClass status)
        {
            var xpTable = DatManager.PortalDat.XpTable;

            if (status == SkillAdvancementClass.Trained)
            {
                return(xpTable.TrainedSkillXpList);
            }
            if (status == SkillAdvancementClass.Specialized)
            {
                return(xpTable.SpecializedSkillXpList);
            }
            return(null);
        }
示例#5
0
        /// <summary>
        /// Check a rank against the skill charts too determine if the skill is at max
        /// </summary>
        /// <returns>Returns true if skill is max rank; false if skill is below max rank</returns>
        private bool IsSkillMaxRank(uint rank, SkillAdvancementClass status)
        {
            var xpList = GetXPTable(status);

            if (xpList == null)
            {
                throw new Exception();  // return false?
            }
            if (rank == (xpList.Count - 1))
            {
                return(true);
            }

            return(false);
        }
示例#6
0
        /// <summary>
        /// Returns the XP curve table based on trained or specialized skill
        /// </summary>
        public static List <uint> GetSkillXPTable(SkillAdvancementClass status)
        {
            var xpTable = DatManager.PortalDat.XpTable;

            switch (status)
            {
            case SkillAdvancementClass.Trained:
                return(xpTable.TrainedSkillXpList);

            case SkillAdvancementClass.Specialized:
                return(xpTable.SpecializedSkillXpList);

            default:
                return(null);
            }
        }
示例#7
0
        public void UpdateSkill(WorldObject worldObject, Skill skill, SkillAdvancementClass status, uint ranks, uint bonus, uint totalInvestment)
        {
            Writer.Write(worldObject.Sequences.GetNextSequence(Sequence.SequenceType.UpdateSkill, skill));

            ushort adjustPP = 1;              // If this is not 0, it appears to trigger the initLevel to be treated as extra XP applied to the skill
            uint   resistanceOfLastCheck = 0; // last use difficulty;
            double lastUsedTime          = 0; // time skill was last used;

            Writer.Write((uint)skill);
            Writer.Write(Convert.ToUInt16(ranks));
            Writer.Write(adjustPP);
            Writer.Write((uint)status);
            Writer.Write(totalInvestment);

            Writer.Write(bonus);            // starting point for advancement of the skill (eg bonus points)
            Writer.Write(resistanceOfLastCheck);
            Writer.Write(lastUsedTime);
        }
示例#8
0
        /// <summary>
        /// Will return true if the skill was added, or false if the skill already exists.
        /// </summary>
        public bool AddSkill(Skill skill, SkillAdvancementClass skillStatus)
        {
            var result = Biota.BiotaPropertiesSkill.FirstOrDefault(x => x.Type == (uint)skill);

            if (result == null)
            {
                result = new BiotaPropertiesSkill {
                    ObjectId = Biota.Id, Type = (ushort)skill, SAC = (uint)skillStatus
                };

                Biota.BiotaPropertiesSkill.Add(result);

                Skills[skill] = new CreatureSkill(this, skill);

                return(true);
            }

            return(false);
        }
示例#9
0
        public GameMessagePrivateUpdateSkill(WorldObject worldObject, Skill skill, SkillAdvancementClass status, uint ranks, uint bonus, uint totalInvestment)
            : base(GameMessageOpcode.PrivateUpdateSkill, GameMessageGroup.UIQueue)
        {
            // TODO Why is baseValue being passed to this function even though it's not used?

            switch (skill)
            {
            case Skill.Axe:
                Writer.Write(worldObject.Sequences.GetNextSequence(Sequence.SequenceType.PrivateUpdateSkillAxe));
                break;

            case Skill.Bow:
                Writer.Write(worldObject.Sequences.GetNextSequence(Sequence.SequenceType.PrivateUpdateSkillBow));
                break;

            case Skill.Crossbow:
                Writer.Write(worldObject.Sequences.GetNextSequence(Sequence.SequenceType.PrivateUpdateSkillCrossBow));
                break;

            case Skill.Dagger:
                Writer.Write(worldObject.Sequences.GetNextSequence(Sequence.SequenceType.PrivateUpdateSkillDagger));
                break;

            case Skill.Mace:
                Writer.Write(worldObject.Sequences.GetNextSequence(Sequence.SequenceType.PrivateUpdateSkillMace));
                break;

            case Skill.MeleeDefense:
                Writer.Write(worldObject.Sequences.GetNextSequence(Sequence.SequenceType.PrivateUpdateSkillMeleeDefense));
                break;

            case Skill.MissileDefense:
                Writer.Write(worldObject.Sequences.GetNextSequence(Sequence.SequenceType.PrivateUpdateSkillMissileDefense));
                break;

            case Skill.Sling:
                Writer.Write(worldObject.Sequences.GetNextSequence(Sequence.SequenceType.PrivateUpdateSkillSling));
                break;

            case Skill.Spear:
                Writer.Write(worldObject.Sequences.GetNextSequence(Sequence.SequenceType.PrivateUpdateSkillSpear));
                break;

            case Skill.Staff:
                Writer.Write(worldObject.Sequences.GetNextSequence(Sequence.SequenceType.PrivateUpdateSkillStaff));
                break;

            case Skill.Sword:
                Writer.Write(worldObject.Sequences.GetNextSequence(Sequence.SequenceType.PrivateUpdateSkillSword));
                break;

            case Skill.ThrownWeapon:
                Writer.Write(worldObject.Sequences.GetNextSequence(Sequence.SequenceType.PrivateUpdateSkillThrownWeapon));
                break;

            case Skill.UnarmedCombat:
                Writer.Write(worldObject.Sequences.GetNextSequence(Sequence.SequenceType.PrivateUpdateSkillUnarmedCombat));
                break;

            case Skill.ArcaneLore:
                Writer.Write(worldObject.Sequences.GetNextSequence(Sequence.SequenceType.PrivateUpdateSkillArcaneLore));
                break;

            case Skill.MagicDefense:
                Writer.Write(worldObject.Sequences.GetNextSequence(Sequence.SequenceType.PrivateUpdateSkillMagicDefense));
                break;

            case Skill.ManaConversion:
                Writer.Write(worldObject.Sequences.GetNextSequence(Sequence.SequenceType.PrivateUpdateSkillManaConversion));
                break;

            case Skill.Spellcraft:
                Writer.Write(worldObject.Sequences.GetNextSequence(Sequence.SequenceType.PrivateUpdateSkillSpellcraft));
                break;

            case Skill.AssessPerson:
                Writer.Write(worldObject.Sequences.GetNextSequence(Sequence.SequenceType.PrivateUpdateSkillPersonalAppraisal));
                break;

            case Skill.Deception:
                Writer.Write(worldObject.Sequences.GetNextSequence(Sequence.SequenceType.PrivateUpdateSkillDeception));
                break;

            case Skill.Healing:
                Writer.Write(worldObject.Sequences.GetNextSequence(Sequence.SequenceType.PrivateUpdateSkillHealing));
                break;

            case Skill.Jump:
                Writer.Write(worldObject.Sequences.GetNextSequence(Sequence.SequenceType.PrivateUpdateSkillJump));
                break;

            case Skill.Lockpick:
                Writer.Write(worldObject.Sequences.GetNextSequence(Sequence.SequenceType.PrivateUpdateSkillLockpick));
                break;

            case Skill.Run:
                Writer.Write(worldObject.Sequences.GetNextSequence(Sequence.SequenceType.PrivateUpdateSkillRun));
                break;

            case Skill.Awareness:
                Writer.Write(worldObject.Sequences.GetNextSequence(Sequence.SequenceType.PrivateUpdateSkillAwareness));
                break;

            case Skill.ArmsAndArmorRepair:
                Writer.Write(worldObject.Sequences.GetNextSequence(Sequence.SequenceType.PrivateUpdateSkillArmsAndArmorRepair));
                break;

            case Skill.AssessCreature:
                Writer.Write(worldObject.Sequences.GetNextSequence(Sequence.SequenceType.PrivateUpdateSkillCreatureAppraisal));
                break;

            case Skill.WeaponTinkering:
                Writer.Write(worldObject.Sequences.GetNextSequence(Sequence.SequenceType.PrivateUpdateSkillWeaponAppraisal));
                break;

            case Skill.ArmorTinkering:
                Writer.Write(worldObject.Sequences.GetNextSequence(Sequence.SequenceType.PrivateUpdateSkillArmorAppraisal));
                break;

            case Skill.MagicItemTinkering:
                Writer.Write(worldObject.Sequences.GetNextSequence(Sequence.SequenceType.PrivateUpdateSkillMagicItemAppraisal));
                break;

            case Skill.CreatureEnchantment:
                Writer.Write(worldObject.Sequences.GetNextSequence(Sequence.SequenceType.PrivateUpdateSkillCreatureEnchantment));
                break;

            case Skill.ItemEnchantment:
                Writer.Write(worldObject.Sequences.GetNextSequence(Sequence.SequenceType.PrivateUpdateSkillItemEnchantment));
                break;

            case Skill.LifeMagic:
                Writer.Write(worldObject.Sequences.GetNextSequence(Sequence.SequenceType.PrivateUpdateSkillLifeMagic));
                break;

            case Skill.WarMagic:
                Writer.Write(worldObject.Sequences.GetNextSequence(Sequence.SequenceType.PrivateUpdateSkillWarMagic));
                break;

            case Skill.Leadership:
                Writer.Write(worldObject.Sequences.GetNextSequence(Sequence.SequenceType.PrivateUpdateSkillLeadership));
                break;

            case Skill.Loyalty:
                Writer.Write(worldObject.Sequences.GetNextSequence(Sequence.SequenceType.PrivateUpdateSkillLoyalty));
                break;

            case Skill.Fletching:
                Writer.Write(worldObject.Sequences.GetNextSequence(Sequence.SequenceType.PrivateUpdateSkillFletching));
                break;

            case Skill.Alchemy:
                Writer.Write(worldObject.Sequences.GetNextSequence(Sequence.SequenceType.PrivateUpdateSkillAlchemy));
                break;

            case Skill.Cooking:
                Writer.Write(worldObject.Sequences.GetNextSequence(Sequence.SequenceType.PrivateUpdateSkillCooking));
                break;

            case Skill.Salvaging:
                Writer.Write(worldObject.Sequences.GetNextSequence(Sequence.SequenceType.PrivateUpdateSkillSalvaging));
                break;

            case Skill.TwoHandedCombat:
                Writer.Write(worldObject.Sequences.GetNextSequence(Sequence.SequenceType.PrivateUpdateSkillTwoHandedCombat));
                break;

            case Skill.Gearcraft:
                Writer.Write(worldObject.Sequences.GetNextSequence(Sequence.SequenceType.PrivateUpdateSkillGearcraft));
                break;

            case Skill.VoidMagic:
                Writer.Write(worldObject.Sequences.GetNextSequence(Sequence.SequenceType.PrivateUpdateSkillVoidMagic));
                break;

            case Skill.HeavyWeapons:
                Writer.Write(worldObject.Sequences.GetNextSequence(Sequence.SequenceType.PrivateUpdateSkillHeavyWeapons));
                break;

            case Skill.LightWeapons:
                Writer.Write(worldObject.Sequences.GetNextSequence(Sequence.SequenceType.PrivateUpdateSkillLightWeapons));
                break;

            case Skill.FinesseWeapons:
                Writer.Write(worldObject.Sequences.GetNextSequence(Sequence.SequenceType.PrivateUpdateSkillFinesseWeapons));
                break;

            case Skill.MissileWeapons:
                Writer.Write(worldObject.Sequences.GetNextSequence(Sequence.SequenceType.PrivateUpdateSkillMissileWeapons));
                break;

            case Skill.Shield:
                Writer.Write(worldObject.Sequences.GetNextSequence(Sequence.SequenceType.PrivateUpdateSkillShield));
                break;

            case Skill.DualWield:
                Writer.Write(worldObject.Sequences.GetNextSequence(Sequence.SequenceType.PrivateUpdateSkillDualWield));
                break;

            case Skill.Recklessness:
                Writer.Write(worldObject.Sequences.GetNextSequence(Sequence.SequenceType.PrivateUpdateSkillRecklessness));
                break;

            case Skill.SneakAttack:
                Writer.Write(worldObject.Sequences.GetNextSequence(Sequence.SequenceType.PrivateUpdateSkillSneakAttack));
                break;

            case Skill.DirtyFighting:
                Writer.Write(worldObject.Sequences.GetNextSequence(Sequence.SequenceType.PrivateUpdateSkillDirtyFighting));
                break;

            case Skill.Challenge:
                Writer.Write(worldObject.Sequences.GetNextSequence(Sequence.SequenceType.PrivateUpdateSkillChallenge));
                break;

            case Skill.Summoning:
                Writer.Write(worldObject.Sequences.GetNextSequence(Sequence.SequenceType.PrivateUpdateSkillSummoning));
                break;
            }

            ushort adjustPP = 1;              // If this is not 0, it appears to trigger the initLevel to be treated as extra XP applied to the skill
            uint   resistanceOfLastCheck = 0; // last use difficulty;
            double lastUsedTime          = 0; // time skill was last used;

            Writer.Write((uint)skill);
            Writer.Write(Convert.ToUInt16(ranks));
            Writer.Write(adjustPP);
            Writer.Write((uint)status);
            Writer.Write(totalInvestment);

            Writer.Write(bonus);            // starting point for advancement of the skill (eg bonus points)
            Writer.Write(resistanceOfLastCheck);
            Writer.Write(lastUsedTime);
        }
示例#10
0
 public GameMessagePrivateUpdateSkill(WorldObject worldObject, Skill skill, SkillAdvancementClass status, uint ranks, uint bonus, uint totalInvestment)
     : base(GameMessageOpcode.PrivateUpdateSkill, GameMessageGroup.UIQueue)
 {
     // TODO: deprecate
     UpdateSkill(worldObject, skill, status, ranks, bonus, totalInvestment);
 }