private static void GainExperienceFromSkill(SkillData skill, PlayerInstance ch, int mastery, int skillLevel)
        {
            var gain = ch.PlayerData.GetSkillMastery(skill.ID) == mastery
                ? GainMasteryOfSkill(skill, ch, skillLevel)
                : GainExperienceInSkill(ch, skillLevel);

            ch.GainXP(gain);
        }
Пример #2
0
        private static void LoseExperience(PlayerInstance ch)
        {
            var lostXp = (int)((ch.GetExperienceLevel(ch.Level + 1) - ch.GetExperienceLevel(ch.Level)) * 0.1f);

            comm.act(ATTypes.AT_FLEE, $"Curse the gods, you've lost {lostXp} experience!", ch, null,
                     null, ToTypes.Character);
            ch.GainXP(0 - lostXp);
        }
        public static void AbilityLearnFromSuccess(this SkillData skill, PlayerInstance ch)
        {
            var sn           = (int)skill.ID;
            var skillMastery = ch.PlayerData.GetSkillMastery(sn);

            if (ch.IsNpc() || skillMastery <= 0)
            {
                return;
            }

            var adept      = skill.RaceAdept.ToList()[(int)ch.CurrentRace];
            var skillLevel = skill.RaceLevel.ToList()[(int)ch.CurrentRace];

            if (skillLevel == 0)
            {
                skillLevel = ch.Level;
            }
            if (skillMastery < adept)
            {
                var schance = skillMastery + 5 * skill.difficulty;
                var percent = SmaugRandom.D100();

                var learn = 1;
                if (percent >= schance)
                {
                    learn = 2;
                }
                else if (schance - percent > 25)
                {
                    return;
                }

                ch.PlayerData.UpdateSkillMastery(sn, adept.GetLowestOfTwoNumbers(skillMastery + learn));

                int gain;
                if (ch.PlayerData.GetSkillMastery(sn) == adept)
                {
                    gain = 1000 * skillLevel;
                    ch.SetColor(ATTypes.AT_WHITE);
                    ch.Printf("You are now an adept of %s!  You gain %d bonus experience!", skill.Name,
                              gain);
                }
                else
                {
                    gain = 20 * skillLevel;
                    if (ch.CurrentFighting == null) // TODO: Check gsn_hide && gsn_sneak
                    {
                        ch.SetColor(ATTypes.AT_WHITE);
                        ch.Printf("You gain %d experience points from your success!", gain);
                    }
                }
                ch.GainXP(gain);
            }
        }