public SkillLevel(Skill skill, int level) { skill.ThrowIfNull(nameof(skill)); if (level < 0 || level > MAX_LEVEL) { throw new ArgumentOutOfRangeException("level"); } BaseSkill = skill; Level = level; }
public TrainedSkill(Skill baseSkill, int confirmedLevel, int sp) { baseSkill.ThrowIfNull(nameof(baseSkill)); if (sp < 0) { throw new ArgumentOutOfRangeException("sp"); } BaseSkill = baseSkill; LastConfirmedLevel = new SkillLevel(baseSkill, confirmedLevel); SkillPoints = sp; }
/// <summary> /// Calculates the skill level which is effective given the number of skill points /// trained in this skill. /// </summary> /// <param name="skill">The skill which has been trained.</param> /// <param name="sp">The number of skill points in this skill.</param> /// <returns>The skill level which has been acquired.</returns> public static SkillLevel FromSkillPoints(Skill skill, int sp) { int level = MAX_LEVEL; skill.ThrowIfNull(nameof(skill)); if (sp < 0) { throw new ArgumentOutOfRangeException("sp"); } double mult = skill.TrainingTimeMultiplier; for (int i = 0; i <= MAX_LEVEL; i++) { int spRequired = (int)Math.Ceiling(mult * BASE_SP[i]); if (sp < spRequired) { // Skill is not trained to this level level = i; break; } } return(new SkillLevel(skill, level)); }
/// <summary> /// Returns an operation to set the planned level to the given one, lowering it if it's higher than the targetted one. /// The returned object allows an extended control, to automatically remove dependencies and prerequisites. /// </summary> /// <param name="skill">The skill we want to plan</param> /// <param name="level">The level we want to train to</param> /// <returns></returns> /// <exception cref="System.ArgumentNullException">skill</exception> public IPlanOperation TryPlanTo(Skill skill, long level) { skill.ThrowIfNull(nameof(skill)); return(TryPlanTo(skill, level, skill.Name)); }