コード例 #1
0
        private static void AddStatToDict(Dictionary <SkillStatType, float> bonusDict,
                                          SkillStatType targetStatType,
                                          PersonRuleLevel level,
                                          PersonRuleDirection direction)
        {
            bonusDict.TryGetValue(targetStatType, out var value);
            var q = level switch
            {
                PersonRuleLevel.Lesser => 0.1f,
                PersonRuleLevel.Normal => 0.3f,
                PersonRuleLevel.Grand => 0.5f,
                PersonRuleLevel.None => throw new NotSupportedException(),
                      PersonRuleLevel.Absolute => throw new NotSupportedException(),
                            _ => throw new NotSupportedException($"Неизветный уровень угрозы выживания {level}.")
            };

            switch (direction)
            {
            case PersonRuleDirection.Positive:
                // Бонус изначально расчитывается, как положительный. Ничего не делаем.
                break;

            case PersonRuleDirection.Negative:
                q *= -1;
                break;

            default:
                throw new NotSupportedException($"Неизветный уровень угрозы выживания {direction}.");
            }

            value += q;

            bonusDict[targetStatType] = value;
        }
コード例 #2
0
        private void ProcessPositiveRule(ConsumeCommonRuleType type, PersonRuleLevel ruleLevel)
        {
            switch (type)
            {
            case ConsumeCommonRuleType.Satiety:
                RestoreStat(SurvivalStatType.Satiety, ruleLevel);
                break;

            case ConsumeCommonRuleType.Thirst:
                RestoreStat(SurvivalStatType.Hydration, ruleLevel);
                break;

            case ConsumeCommonRuleType.Health:
                RestoreStat(SurvivalStatType.Health, ruleLevel);
                break;

            case ConsumeCommonRuleType.Intoxication:
                RiseStat(SurvivalStatType.Intoxication, ruleLevel);
                break;

            case ConsumeCommonRuleType.Undefined:
            default:
                throw new ArgumentOutOfRangeException(nameof(type), $"Значение {type} не поддерживается.");
            }
        }
コード例 #3
0
        private void BonusToHealth(PersonRuleLevel level, PersonRuleDirection direction)
        {
            var hpStat = Survival.Stats.SingleOrDefault(x => x.Type == SurvivalStatType.Health);

            if (hpStat != null)
            {
                var bonus = 0;
                switch (level)
                {
                case PersonRuleLevel.Lesser:
                    bonus = 1;
                    break;

                case PersonRuleLevel.Normal:
                    bonus = 3;
                    break;

                case PersonRuleLevel.Grand:
                    bonus = 5;
                    break;

                case PersonRuleLevel.Absolute:
                    bonus = 10;
                    break;
                }

                if (direction == PersonRuleDirection.Negative)
                {
                    bonus *= -1;
                }

                hpStat.ChangeStatRange(hpStat.Range.Min, hpStat.Range.Max + bonus);
            }
        }
コード例 #4
0
        /// <summary>
        /// Помещает в список бонус на ХП.
        /// </summary>
        /// <param name="level"> Уровень бонуса. </param>
        /// <param name="direction"> Направление бонуса. </param>
        /// <param name="bonuses">
        /// Аккумулирующий список бонусов.
        /// Отмечен ref, чтобы показать, что изменяется внутри метода.
        /// </param>
        private void BonusToHealth(PersonRuleLevel level, PersonRuleDirection direction,
                                   ref List <SurvivalStatBonus> bonuses)
        {
            const SurvivalStatType HP_STAT_TYPE = SurvivalStatType.Health;
            var hpStat = Stats.SingleOrDefault(x => x.Type == HP_STAT_TYPE);

            if (hpStat != null)
            {
                var bonus = 0;
                bonus = GetBonusByLevel(level);

                if (direction == PersonRuleDirection.Negative)
                {
                    bonus *= -1;
                }

                var currentBonus = bonuses.SingleOrDefault(x => x.SurvivalStatType == HP_STAT_TYPE);
                if (currentBonus == null)
                {
                    currentBonus = new SurvivalStatBonus(HP_STAT_TYPE);
                    bonuses.Add(currentBonus);
                }

                currentBonus.ValueBonus += bonus;
            }
        }
コード例 #5
0
        /// <summary>
        /// Расчёт нового модификатора эффективности в зависимости от правила.
        /// </summary>
        /// <param name="currentModifierValue"> Текущие значение модификатора. </param>
        /// <param name="level"> Уровень правила. </param>
        /// <returns> Возвращает новое значение модификатора эффективности. </returns>
        public static int CalcEfficientByRuleLevel(int currentModifierValue, PersonRuleLevel level)
        {
            switch (level)
            {
            case PersonRuleLevel.Lesser:
                currentModifierValue++;
                break;

            case PersonRuleLevel.Normal:
                currentModifierValue += 3;
                break;

            case PersonRuleLevel.Grand:
                currentModifierValue += 5;
                break;

            case PersonRuleLevel.Absolute:
                currentModifierValue += 10;
                break;

            default:
                throw new NotSupportedException("Этот уровень правила не обрабатывается.");
            }

            return(currentModifierValue);
        }
コード例 #6
0
 public PersonRule(EquipCommonRuleType type, PersonRuleLevel level,
                   PersonRuleDirection direction = PersonRuleDirection.Positive)
 {
     Type      = type;
     Level     = level;
     Direction = direction;
 }
コード例 #7
0
        private void RiseIntoxicationLevel(PersonRuleLevel level)
        {
            var survivalModule = Person.GetModuleSafe <ISurvivalModule>();

            if (survivalModule is null)
            {
                return;
            }

            switch (level)
            {
            case PersonRuleLevel.Lesser:
                survivalModule.RestoreStat(SurvivalStatType.Intoxication,
                                           PropMetrics.INTOXICATION_RISE_LESSER_VALUE + 1);
                break;

            case PersonRuleLevel.Normal:
                survivalModule.RestoreStat(SurvivalStatType.Intoxication,
                                           PropMetrics.INTOXICATION_RISE_NORMAL_VALUE + 1);
                break;

            case PersonRuleLevel.Grand:
                survivalModule.RestoreStat(SurvivalStatType.Intoxication,
                                           PropMetrics.INTOXICATION_RISE_GRAND_VALUE + 1);
                break;

            default:
                throw new InvalidOperationException($"Неизвестный уровень влияния правила {level}.");
            }
        }
コード例 #8
0
        private void DecreaseSurvivalStatInner(SurvivalStatType statType, PersonRuleLevel level)
        {
            switch (level)
            {
            case PersonRuleLevel.Lesser:
                Person.Survival.DecreaseStat(statType,
                                             PropMetrics.SurvivalLesserRestoreValue - 1);
                break;

            case PersonRuleLevel.Normal:
                Person.Survival.DecreaseStat(statType,
                                             PropMetrics.SurvivalNormalRestoreValue - 1);
                break;

            case PersonRuleLevel.Grand:
                Person.Survival.DecreaseStat(statType,
                                             PropMetrics.SurvivalGrandRestoreValue - 1);
                break;

            case PersonRuleLevel.None:
                throw new NotSupportedException();

            case PersonRuleLevel.Absolute:
                throw new NotSupportedException();

            default:
                throw new InvalidOperationException($"Неизвестный уровень влияния правила {level}.");
            }
        }
コード例 #9
0
        private static int GetLevelDiff(PersonRuleLevel level, PersonRuleLevel baseLevel)
        {
            var a = GetArmorModifierByLevel(level);
            var b = GetArmorModifierByLevel(baseLevel);

            return(a - b);
        }
コード例 #10
0
        private void RestoreHp(PersonRuleLevel level)
        {
            var survivalModule = Person.GetModuleSafe <ISurvivalModule>();

            if (survivalModule is null)
            {
                return;
            }

            switch (level)
            {
            case PersonRuleLevel.Lesser:
                survivalModule.RestoreStat(SurvivalStatType.Health, PropMetrics.HpLesserRestoreValue);
                break;

            case PersonRuleLevel.Normal:
                survivalModule.RestoreStat(SurvivalStatType.Health, PropMetrics.HpNormalRestoreValue);
                break;

            case PersonRuleLevel.Grand:
                survivalModule.RestoreStat(SurvivalStatType.Health, PropMetrics.HpGrandRestoreValue);
                break;

            default:
                throw new InvalidOperationException($"Неизвестный уровень влияния правила {level}.");
            }
        }
コード例 #11
0
 private static int GetBonusByLevel(PersonRuleLevel level)
 {
     return(level switch
     {
         PersonRuleLevel.Lesser => 1,
         PersonRuleLevel.Normal => 3,
         PersonRuleLevel.Grand => 5,
         PersonRuleLevel.Absolute => 10,
         PersonRuleLevel.None => throw new InvalidOperationException("Unknown rule level."),
         _ => throw new InvalidOperationException($"The rule level {level} is not supported.")
     });
コード例 #12
0
 /// <summary>
 /// Рассчитывает минимальное значение броска D6, необходимого для пробития указанной обороны.
 /// </summary>
 /// <param name="level"> Уровень обороны, для которой вычисляется нижный порог броска D6. </param>
 /// <returns> Минимальный погод броска D6. </returns>
 private static int CalcSuccessToHitRollInner(PersonRuleLevel level)
 {
     return(level switch
     {
         PersonRuleLevel.None => 2,
         PersonRuleLevel.Lesser => 4,
         PersonRuleLevel.Normal => 5,
         PersonRuleLevel.Grand => 6,
         PersonRuleLevel.Absolute => 8,
         _ => throw new ArgumentException($"Неизвестное значение {level}.", nameof(level))
     });
コード例 #13
0
 private static int GetArmorModifierByLevel(PersonRuleLevel level)
 {
     return(level switch
     {
         PersonRuleLevel.None => 0,
         PersonRuleLevel.Lesser => 1,
         PersonRuleLevel.Normal => 2,
         PersonRuleLevel.Grand => 3,
         PersonRuleLevel.Absolute => 5,
         _ => throw new ArgumentException($"Неизвестное значение уровня {level}.", nameof(level))
     });
コード例 #14
0
        public void CalcEfficientByRuleLevel_AllKnownLevels_NotThrowException(int currentModifier,
                                                                              PersonRuleLevel level)
        {
            // ACT
            Action act = () =>
            {
                var _ = RuleCalculations.CalcEfficientByRuleLevel(currentModifier, level);
            };

            // ASSERT
            act.Should().NotThrow <NotSupportedException>();
        }
コード例 #15
0
        public ConsumeCommonRule(ConsumeCommonRuleType type,
                                 PersonRuleLevel level,
                                 PersonRuleDirection direction = PersonRuleDirection.Positive)
        {
            Type      = type;
            Level     = level;
            Direction = direction;

            if (Direction == 0)
            {
                Direction = PersonRuleDirection.Positive;
            }
        }
コード例 #16
0
        /// <summary>
        /// Помещает в список бонус на ХП.
        /// </summary>
        /// <param name="level"> Уровень бонуса. </param>
        /// <param name="direction"> Направление бонуса. </param>
        /// <param name="bonuses">
        /// Аккумулирующий список бонусов.
        /// Отмечен ref, чтобы показать, что изменяется внутри метода.
        /// </param>
        private void BonusToHealth(PersonRuleLevel level, PersonRuleDirection direction,
                                   ref List <SurvivalStatBonus> bonuses)
        {
            const SurvivalStatType HP_STAT_TYPE = SurvivalStatType.Health;
            var hpStat = Stats.SingleOrDefault(x => x.Type == HP_STAT_TYPE);

            if (hpStat != null)
            {
                var bonus = 0;
                switch (level)
                {
                case PersonRuleLevel.Lesser:
                    bonus = 1;
                    break;

                case PersonRuleLevel.Normal:
                    bonus = 3;
                    break;

                case PersonRuleLevel.Grand:
                    bonus = 5;
                    break;

                case PersonRuleLevel.Absolute:
                    bonus = 10;
                    break;

                case PersonRuleLevel.None:
                    throw new InvalidOperationException("Неопределённое правило.");

                default:
                    throw new InvalidOperationException($"Правило {level} не обрабатывается.");
                }

                if (direction == PersonRuleDirection.Negative)
                {
                    bonus *= -1;
                }

                var currentBonus = bonuses.SingleOrDefault(x => x.SurvivalStatType == HP_STAT_TYPE);
                if (currentBonus == null)
                {
                    currentBonus = new SurvivalStatBonus(HP_STAT_TYPE);
                    bonuses.Add(currentBonus);
                }

                currentBonus.ValueBonus += bonus;
            }
        }
コード例 #17
0
        private void DecreaseStat(SurvivalStatType statType, PersonRuleLevel level)
        {
            switch (statType)
            {
            case SurvivalStatType.Satiety:
            case SurvivalStatType.Hydration:
            case SurvivalStatType.Intoxication:
                DecreaseSurvivalStatInner(statType, level);
                break;

            case SurvivalStatType.Health:
                DecreaseHp(level);
                break;
            }
        }
コード例 #18
0
        private void DecreaseStat(SurvivalStatType statType, PersonRuleLevel level)
        {
            switch (statType)
            {
            case SurvivalStatType.Satiety:
                DecreaseSurvivalStatInner(SurvivalStatType.Satiety, level);
                break;

            case SurvivalStatType.Water:
                DecreaseSurvivalStatInner(SurvivalStatType.Water, level);
                break;

            case SurvivalStatType.Health:
                DecreaseHp(level);
                break;
            }
        }
コード例 #19
0
ファイル: HumanPerson.cs プロジェクト: tgspn/Zilon
        private static void AddStatToDict(Dictionary <CombatStatType, float> bonusDict,
                                          CombatStatType targetStatType,
                                          PersonRuleLevel level,
                                          PersonRuleDirection direction)
        {
            bonusDict.TryGetValue(targetStatType, out float value);

            float q;

            switch (level)
            {
            case PersonRuleLevel.Lesser:
                q = 0.1f;
                break;

            case PersonRuleLevel.Normal:
                q = 0.3f;
                break;

            case PersonRuleLevel.Grand:
                q = 0.5f;
                break;

            default:
                throw new NotSupportedException($"Неизветный уровень угрозы выживания {level}.");
            }

            switch (direction)
            {
            case PersonRuleDirection.Positive:
                // Бонус изначально расчитывается, как положительный. Ничего не делаем.
                break;

            case PersonRuleDirection.Negative:
                q *= -1;
                break;

            default:
                throw new NotSupportedException($"Неизветный уровень угрозы выживания {direction}.");
            }

            value += q;

            bonusDict[targetStatType] = value;
        }
コード例 #20
0
        private static void BonusToDownPass(
            SurvivalStatType statType,
            PersonRuleLevel level,
            PersonRuleDirection direction,
            ref List <SurvivalStatBonus> bonuses)
        {
            var currentBonusValue = 0;
            var directionQuaff    = direction == PersonRuleDirection.Negative ? -1 : 1;

            switch (level)
            {
            case PersonRuleLevel.Lesser:
                currentBonusValue = 1 * directionQuaff;
                break;

            case PersonRuleLevel.Normal:
                currentBonusValue = 2 * directionQuaff;
                break;

            case PersonRuleLevel.Grand:
                currentBonusValue = 5 * directionQuaff;
                break;

            case PersonRuleLevel.Absolute:
                currentBonusValue = 10 * directionQuaff;
                break;

            case PersonRuleLevel.None:
                Debug.Fail("Предположительно, это ошибка.");
                break;

            default:
                Debug.Fail("Предположительно, это ошибка.");
                break;
            }

            var currentBonus = new SurvivalStatBonus(statType)
            {
                DownPassBonus = currentBonusValue
            };

            bonuses.Add(currentBonus);
        }
コード例 #21
0
        /// <summary>
        /// Помещает в список бонус на ХП.
        /// </summary>
        /// <param name="level"> Уровень бонуса. </param>
        /// <param name="direction"> Направление бонуса. </param>
        /// <param name="bonuses"> Аккумулирующий список бонусов.
        /// Отмечен ref, чтобы показать, что изменяется внутри метода. </param>
        private void BonusToHealth(PersonRuleLevel level, PersonRuleDirection direction,
                                   ref List <SurvivalStatBonus> bonuses)
        {
            const SurvivalStatType hpStatType = SurvivalStatType.Health;
            var hpStat = Survival.Stats.SingleOrDefault(x => x.Type == hpStatType);

            if (hpStat != null)
            {
                var bonus = 0;
                switch (level)
                {
                case PersonRuleLevel.Lesser:
                    bonus = 1;
                    break;

                case PersonRuleLevel.Normal:
                    bonus = 3;
                    break;

                case PersonRuleLevel.Grand:
                    bonus = 5;
                    break;

                case PersonRuleLevel.Absolute:
                    bonus = 10;
                    break;
                }

                if (direction == PersonRuleDirection.Negative)
                {
                    bonus *= -1;
                }

                var currentBonus = bonuses.SingleOrDefault(x => x.SurvivalStatType == hpStatType);
                if (currentBonus == null)
                {
                    currentBonus = new SurvivalStatBonus(hpStatType);
                    bonuses.Add(currentBonus);
                }
                currentBonus.ValueBonus += bonus;
            }
        }
コード例 #22
0
ファイル: Actor.cs プロジェクト: luisvita/Zilon_Roguelike
        private void RiseIntoxicationLevel(PersonRuleLevel level)
        {
            switch (level)
            {
            case PersonRuleLevel.Lesser:
                Person.Survival?.RestoreStat(SurvivalStatType.Intoxication,
                                             PropMetrics.INTOXICATION_RISE_LESSER_VALUE + 1);
                break;

            case PersonRuleLevel.Normal:
                Person.Survival?.RestoreStat(SurvivalStatType.Intoxication,
                                             PropMetrics.INTOXICATION_RISE_NORMAL_VALUE + 1);
                break;

            case PersonRuleLevel.Grand:
                Person.Survival?.RestoreStat(SurvivalStatType.Intoxication,
                                             PropMetrics.INTOXICATION_RISE_GRAND_VALUE + 1);
                break;

            default:
                throw new InvalidOperationException($"Неизвестный уровень влияния правила {level}.");
            }
        }
コード例 #23
0
        private static int GetArmorModifierByLevel(PersonRuleLevel level)
        {
            switch (level)
            {
            case PersonRuleLevel.None:
                return(0);

            case PersonRuleLevel.Lesser:
                return(1);

            case PersonRuleLevel.Normal:
                return(2);

            case PersonRuleLevel.Grand:
                return(3);

            case PersonRuleLevel.Absolute:
                return(5);

            default:
                throw new ArgumentException($"Неизвестное значение уровня {level}.", nameof(level));
            }
        }
コード例 #24
0
        /// <summary>
        /// Рассчитывает минимальное значение броска D6, необходимого для пробития указанной обороны.
        /// </summary>
        /// <param name="level"> Уровень обороны, для которой вычисляется нижный порог броска D6. </param>
        /// <returns> Минимальный погод броска D6. </returns>
        private static int CalcSuccessToHitRollInner(PersonRuleLevel level)
        {
            switch (level)
            {
            case PersonRuleLevel.None:
                return(2);

            case PersonRuleLevel.Lesser:
                return(4);

            case PersonRuleLevel.Normal:
                return(5);

            case PersonRuleLevel.Grand:
                return(6);

            case PersonRuleLevel.Absolute:
                return(8);

            default:
                throw new ArgumentException($"Неизвестное значение {level}.", nameof(level));
            }
        }
コード例 #25
0
        private void DecreaseHp(PersonRuleLevel level)
        {
            switch (level)
            {
            case PersonRuleLevel.Lesser:
                Person.Survival.DecreaseStat(SurvivalStatType.Health,
                                             PropMetrics.HpLesserRestoreValue);
                break;

            case PersonRuleLevel.Normal:
                Person.Survival.DecreaseStat(SurvivalStatType.Health,
                                             PropMetrics.HpNormalRestoreValue);
                break;

            case PersonRuleLevel.Grand:
                Person.Survival.DecreaseStat(SurvivalStatType.Health,
                                             PropMetrics.HpGrandRestoreValue);
                break;

            default:
                throw new InvalidOperationException($"Неизвестный уровень влияния правила {level}.");
            }
        }
コード例 #26
0
 public PersonDefenceItem(DefenceType type, PersonRuleLevel level)
 {
     Type  = type;
     Level = level;
 }
コード例 #27
0
 public MonsterDefenceItemSubScheme(DefenceType type, PersonRuleLevel level)
 {
     Type  = type;
     Level = level;
 }
コード例 #28
0
 public EffectRule(RollEffectType?rollType, PersonRuleLevel level)
 {
     RollType = rollType;
     Level    = level;
 }
コード例 #29
0
 public PersonArmorItem(ImpactType impact, PersonRuleLevel absorbtionLevel, int armorRank)
 {
     Impact          = impact;
     AbsorbtionLevel = absorbtionLevel;
     ArmorRank       = armorRank;
 }
コード例 #30
0
 /// <summary>
 /// Метод введён специально для повышения уровня интоксикации.
 /// Так как глупо выглядит ResToreStat для повышения интоксикации.
 /// Просто семантически более удобная обёртка.
 /// </summary>
 /// <param name="statType"> Характеристика, повышаемая методом. </param>
 /// <param name="level"> Уровень увеличения. </param>
 private void RiseStat(SurvivalStatType statType, PersonRuleLevel level)
 {
     RestoreStat(statType, level);
 }