コード例 #1
0
        private static void GetRuleModifierValue(PerkRuleSubScheme rule, Equipment equipment,
                                                 ref int toHitModifierValue, ref int efficientModifierValue)
        {
            switch (rule.Type)
            {
            case PersonRuleType.Damage:
                efficientModifierValue = GetRollModifierByPerkRule(equipment, efficientModifierValue, rule);
                break;

            case PersonRuleType.ToHit:
                toHitModifierValue = GetRollModifierByPerkRule(equipment, toHitModifierValue, rule);
                break;

            case PersonRuleType.Undefined:
                throw new InvalidOperationException("Rule is not defined.");

            case PersonRuleType.Health:
            case PersonRuleType.HealthIfNoBody:
            case PersonRuleType.HungerResistance:
            case PersonRuleType.ThristResistance:
                // This perk rule is not influence to combat.
                break;

            default:
                throw new InvalidOperationException($"Rule {rule.Type} unknown.");
            }
        }
コード例 #2
0
        private static int GetRollModifierByPerkRule(Equipment equipment, int efficientModifierValue,
                                                     PerkRuleSubScheme rule)
        {
            if (string.IsNullOrWhiteSpace(rule.Params))
            {
                efficientModifierValue = RuleCalculations.CalcEfficientByRuleLevel(efficientModifierValue, rule.Level);
            }
            else
            {
                var damagePerkParams = JsonConvert.DeserializeObject <DamagePerkParams>(rule.Params);
                if (damagePerkParams.WeaponTags != null && equipment != null)
                {
                    var hasAllTags = true;
                    foreach (var requiredTag in damagePerkParams.WeaponTags)
                    {
                        if (equipment.Scheme.Tags?.Contains(requiredTag) != true)
                        {
                            hasAllTags = false;
                            break;
                        }
                    }

                    if (hasAllTags)
                    {
                        efficientModifierValue =
                            RuleCalculations.CalcEfficientByRuleLevel(efficientModifierValue, rule.Level);
                    }
                }
            }

            return(efficientModifierValue);
        }
コード例 #3
0
 private static int GetRollModifierByPerkRule(Equipment?equipment, int efficientModifierValue,
                                              PerkRuleSubScheme rule)
 {
     if (rule.Params is null || string.IsNullOrWhiteSpace(rule.Params))
     {
         efficientModifierValue = RuleCalculations.CalcEfficientByRuleLevel(efficientModifierValue, rule.Level);
     }
コード例 #4
0
        /// <summary>
        /// Расчёт бонуса, который даёт правило перка.
        /// </summary>
        /// <param name="rule"> Правило перка. </param>
        /// <param name="bonusDict"> Текущее состояние бонусов. </param>
        private static void CalcRuleBonuses(PerkRuleSubScheme rule, Dictionary <SkillStatType, float> bonusDict)
        {
            switch (rule.Type)
            {
            case PersonRuleType.Melee:
                AddStatToDict(bonusDict, SkillStatType.Melee, rule.Level, PersonRuleDirection.Positive);
                break;

            case PersonRuleType.Ballistic:
                AddStatToDict(bonusDict, SkillStatType.Ballistic, rule.Level, PersonRuleDirection.Positive);
                break;

            case PersonRuleType.Health:
            case PersonRuleType.Damage:
            case PersonRuleType.ToHit:
            case PersonRuleType.HealthIfNoBody:
            case PersonRuleType.HungerResistance:
            case PersonRuleType.ThristResistance:
                // This perk rule is not impact to combat stats.
                break;

            case PersonRuleType.Undefined:
                throw new InvalidOperationException("Undefined rule");

            default:
                throw new InvalidOperationException($"Rule {rule.Type} unknown");
            }
        }
コード例 #5
0
        /// <summary>
        /// Расчёт бонуса, который даёт правило перка.
        /// </summary>
        /// <param name="rule"> Правило перка. </param>
        /// <param name="bonusDict"> Текущее состояние бонусов. </param>
        private static void CalcRuleBonuses(PerkRuleSubScheme rule, Dictionary <SkillStatType, float> bonusDict)
        {
            switch (rule.Type)
            {
            case PersonRuleType.Melee:
                AddStatToDict(bonusDict, SkillStatType.Melee, rule.Level, PersonRuleDirection.Positive);
                break;

            case PersonRuleType.Ballistic:
                AddStatToDict(bonusDict, SkillStatType.Ballistic, rule.Level, PersonRuleDirection.Positive);
                break;

            case PersonRuleType.Undefined:
            default:
                throw new ArgumentOutOfRangeException($"Тип правила перка {rule.Type} не поддерживается.");
            }
        }
コード例 #6
0
        private List <SurvivalStatBonus> ProcessRule(List <SurvivalStatBonus> bonusList, PerkRuleSubScheme rule)
        {
            switch (rule.Type)
            {
            case PersonRuleType.Health:
                BonusToHealth(rule.Level, PersonRuleDirection.Positive, ref bonusList);
                break;

            case PersonRuleType.HealthIfNoBody:

                var equipmentModule = _equipmentModule;

                var requirementsCompleted = true;

                if (equipmentModule != null)
                {
                    // it is logically. If person can not have equipment, he has no body armor.

                    for (var slotIndex = 0; slotIndex < equipmentModule.Count(); slotIndex++)
                    {
                        if ((equipmentModule.Slots[slotIndex].Types & EquipmentSlotTypes.Body) > 0 &&
                            equipmentModule[slotIndex] != null)
                        {
                            requirementsCompleted = false;
                            break;
                        }
                    }
                }

                if (requirementsCompleted)
                {
                    BonusToHealth(rule.Level, rule.Direction, ref bonusList);
                }

                break;

            case PersonRuleType.HungerResistance:
                BonusToDownPass(SurvivalStatType.Satiety, rule.Level, rule.Direction, ref bonusList);
                break;

            case PersonRuleType.ThristResistance:
                BonusToDownPass(SurvivalStatType.Hydration, rule.Level, rule.Direction, ref bonusList);
                break;

            case PersonRuleType.Undefined:
                // Look like error.
                throw new InvalidOperationException($"{PersonRuleType.Undefined} is not valid.");

            case PersonRuleType.Melee:
            case PersonRuleType.Ballistic:
            case PersonRuleType.Damage:
            case PersonRuleType.ToHit:
                // This perk rules not implemented yet.
                break;

            default:
                // Look like forgotten functiollity.
                throw new InvalidOperationException($"{rule.Type} is not known type.");
            }

            return(bonusList);
        }