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."); } }
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); }
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); }
/// <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"); } }
/// <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} не поддерживается."); } }
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); }