Exemplo n.º 1
0
        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;
        }
Exemplo n.º 2
0
 public HumanPerson(IPersonScheme scheme,
                    [NotNull] ITacticalActScheme defaultScheme,
                    [NotNull] IEvolutionData evolutionData,
                    [NotNull] ISurvivalRandomSource survivalRandomSource,
                    [NotNull] Inventory inventory) :
     this(scheme, defaultScheme, evolutionData, survivalRandomSource)
 {
     Inventory = inventory;
 }
Exemplo n.º 3
0
        /// <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);
        }
Exemplo n.º 4
0
        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);
                }
            }
        }
Exemplo n.º 5
0
        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;
        }
Exemplo n.º 6
0
 public HumanPerson(PersonScheme scheme, TacticalActScheme defaultScheme, IEvolutionData evolutionData, Inventory inventory) :
     this(scheme, defaultScheme, evolutionData)
 {
     Inventory = inventory;
 }
Exemplo n.º 7
0
        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);
            }
        }