public HumanPerson([NotNull] IPersonScheme scheme, [NotNull] ITacticalActScheme defaultActScheme, [NotNull] IEvolutionData evolutionData, [NotNull] ISurvivalRandomSource survivalRandomSource) { _defaultActScheme = defaultActScheme ?? throw new ArgumentNullException(nameof(defaultActScheme)); Scheme = scheme ?? throw new ArgumentNullException(nameof(scheme)); EvolutionData = evolutionData ?? throw new ArgumentNullException(nameof(evolutionData)); _survivalRandomSource = survivalRandomSource ?? throw new ArgumentNullException(nameof(survivalRandomSource)); Name = scheme.Sid; Effects = new EffectCollection(); Effects.Added += Effects_CollectionChanged; Effects.Removed += Effects_CollectionChanged; Effects.Changed += Effects_CollectionChanged; EquipmentCarrier = new EquipmentCarrier(Scheme.Slots); EquipmentCarrier.EquipmentChanged += EquipmentCarrier_EquipmentChanged; TacticalActCarrier = new TacticalActCarrier(); EvolutionData.PerkLeveledUp += EvolutionData_PerkLeveledUp; CombatStats = new CombatStats(); ClearCalculatedStats(); CalcCombatStats(); TacticalActCarrier.Acts = CalcActs(EquipmentCarrier); Survival = new HumanSurvivalData(scheme, survivalRandomSource); Survival.StatCrossKeyValue += Survival_StatCrossKeyValue; }
public HumanPerson(IPersonScheme scheme, [NotNull] ITacticalActScheme defaultScheme, [NotNull] IEvolutionData evolutionData, [NotNull] ISurvivalRandomSource survivalRandomSource, [NotNull] Inventory inventory) : this(scheme, defaultScheme, evolutionData, survivalRandomSource) { Inventory = inventory; }
/// <summary> /// Возвращает все развитиые перки персонажа. /// </summary> /// <param name="evolutionData"> Модуль эволюции. </param> /// <returns> Коллекция прокаченных перков или пустая коллекция, если перки модуля эволюции равны null. </returns> /// <remarks> /// Полученными перками считаются перки, которые прокачены хотя бы на один уровень. /// </remarks> public static IEnumerable <IPerk> GetArchievedPerks([NotNull] this IEvolutionData evolutionData) { if (evolutionData == null) { throw new ArgumentNullException(nameof(evolutionData)); } var archievedPerks = evolutionData.Perks?.Where(x => x.CurrentLevel != null); if (archievedPerks == null) { archievedPerks = new IPerk[0]; } return(archievedPerks); }
public void ApplyProgress(IJobProgress progress, IEvolutionData evolutionData) { if (evolutionData == null) { return; } foreach (var perk in evolutionData.Perks) { var isPerkLevelCap = CheckLevelCap(perk); if (isPerkLevelCap) { continue; } var affectedJobs = progress.ApplyToJobs(perk.CurrentJobs); foreach (var job in affectedJobs) { // Опеределяем, какие из прогрессировавших работ завершены. // И фиксируем их состояние завершения. if (job.Progress >= job.Scheme.Value) { job.IsComplete = true; } } // Опеределяем, все ли работы выполнены. var allJobsAreComplete = perk.CurrentJobs.All(x => x.IsComplete); if (allJobsAreComplete) { evolutionData.PerkLevelUp(perk); } } }
public HumanPerson(PersonScheme scheme, TacticalActScheme defaultActScheme, IEvolutionData evolutionData) { Scheme = scheme ?? throw new ArgumentNullException(nameof(scheme)); _defaultActScheme = defaultActScheme ?? throw new ArgumentNullException(nameof(defaultActScheme)); Name = scheme.Sid; Effects = new EffectCollection(); Effects.Added += Effects_CollectionChanged; Effects.Removed += Effects_CollectionChanged; Effects.Changed += Effects_CollectionChanged; EquipmentCarrier = new EquipmentCarrier(Scheme.Slots); EquipmentCarrier.EquipmentChanged += EquipmentCarrier_EquipmentChanged; TacticalActCarrier = new TacticalActCarrier(); EvolutionData = evolutionData; if (EvolutionData != null) { EvolutionData.PerkLeveledUp += EvolutionData_PerkLeveledUp; } CombatStats = new CombatStats(); ClearCombatStats((CombatStats)CombatStats); if (EvolutionData != null) { CalcCombatStats(CombatStats, EvolutionData, Effects); } TacticalActCarrier.Acts = CalcActs(EquipmentCarrier.Equipments, CombatStats); Survival = new SurvivalData(); Survival.StatCrossKeyValue += Survival_StatCrossKeyValue; }
public HumanPerson(PersonScheme scheme, TacticalActScheme defaultScheme, IEvolutionData evolutionData, Inventory inventory) : this(scheme, defaultScheme, evolutionData) { Inventory = inventory; }
private static void CalcCombatStats(ICombatStats combatStats, IEvolutionData evolutionData, EffectCollection effects) { var bonusDict = new Dictionary <CombatStatType, float>(); var archievedPerks = evolutionData.Perks.Where(x => x.CurrentLevel != null).ToArray(); foreach (var archievedPerk in archievedPerks) { var currentLevel = archievedPerk.CurrentLevel; var currentLevelScheme = archievedPerk.Scheme.Levels[currentLevel.Primary]; if (currentLevelScheme.Rules == null) { continue; } for (var i = 0; i <= currentLevel.Sub; i++) { foreach (var rule in currentLevelScheme.Rules) { var ruleType = rule.Type; switch (ruleType) { case PersonRuleType.Melee: AddStatToDict(bonusDict, CombatStatType.Melee, PersonRuleLevel.Lesser, PersonRuleDirection.Positive); break; case PersonRuleType.Ballistic: AddStatToDict(bonusDict, CombatStatType.Ballistic, PersonRuleLevel.Lesser, PersonRuleDirection.Positive); break; } } } } foreach (var effect in effects.Items) { foreach (var rule in effect.Rules) { AddStatToDict(bonusDict, rule.StatType, rule.Level, PersonRuleDirection.Negative); } } foreach (var bonusItem in bonusDict) { var stat = combatStats.Stats.SingleOrDefault(x => x.Stat == bonusItem.Key); if (stat != null) { stat.Value += stat.Value * bonusItem.Value; if (stat.Value <= 1) { stat.Value = 1; } } } foreach (var statItem in combatStats.Stats) { statItem.Value = (float)Math.Round(statItem.Value, 1); } }