Ejemplo n.º 1
0
        public CombatActModule(
            ITacticalActScheme defaultActScheme,
            IEquipmentModule equipmentModule,
            IEffectsModule effectsModule,
            IEvolutionModule evolutionModule)
        {
            IsActive = true;

            _defaultActScheme = defaultActScheme;
            _equipmentModule  = equipmentModule;
            _effectsModule    = effectsModule;
            _evolutionModule  = evolutionModule;
        }
Ejemplo n.º 2
0
        private static IEnumerable <ITacticalAct> CalcActs(ITacticalActScheme defaultActScheme,
                                                           IEnumerable <Equipment> equipments,
                                                           IEffectsModule effects,
                                                           IEnumerable <IPerk> perks)
        {
            var defaultAct = CreateTacticalAct(defaultActScheme, null, effects, perks);

            yield return(defaultAct);

            var equipmentActs = CalcActsFromEquipments(equipments, effects, perks);

            foreach (var act in equipmentActs)
            {
                yield return(act);
            }
        }
Ejemplo n.º 3
0
        private static ITacticalAct CreateTacticalAct([NotNull] ITacticalActScheme scheme,
                                                      [NotNull] Equipment equipment,
                                                      [NotNull] IEffectsModule effects,
                                                      [NotNull][ItemNotNull] IEnumerable <IPerk> perks)
        {
            var toHitModifierValue      = 0;
            var efficientModifierValue  = 0;
            var efficientRollUnmodified = scheme.Stats.Efficient;

            CalcSurvivalHazardOnTacticalAct(effects, ref toHitModifierValue, ref efficientModifierValue);
            CalcPerksBonusesOnTacticalAct(perks, equipment, ref toHitModifierValue, ref efficientModifierValue);

            var toHitRoll     = CreateTacticalActRoll(6, 1, toHitModifierValue);
            var efficientRoll = CreateTacticalActRoll(efficientRollUnmodified.Dice,
                                                      efficientRollUnmodified.Count,
                                                      efficientModifierValue);

            return(new TacticalAct(scheme, efficientRoll, toHitRoll, equipment));
        }
Ejemplo n.º 4
0
        private static void AddDiseaseEffectForSymptom(
            IEffectsModule personEffects,
            IDisease disease,
            DiseaseSymptom symptom)
        {
            var currentSymptomEffect = personEffects.Items.OfType <DiseaseSymptomEffect>()
                                       .SingleOrDefault(x => x.Symptom == symptom);

            if (currentSymptomEffect is null)
            {
                // При создании эффекта уже фиксируется болезнь, которая его удерживает.
                currentSymptomEffect = new DiseaseSymptomEffect(disease, symptom);
                personEffects.Add(currentSymptomEffect);
            }
            else
            {
                currentSymptomEffect.HoldDisease(disease);
            }
        }
Ejemplo n.º 5
0
        private static void UpdatePowerDown(
            IEffectsModule personEffects,
            IDisease disease,
            DiseaseSymptom[] symptoms,
            float currentPower,
            float symptomPowerSegment)
        {
            var activeSymptomCount = (int)Math.Floor(currentPower / symptomPowerSegment);

            // Начинаем снимать все эффекты, которые за пределами количества.

            var symptomLowerIndex = activeSymptomCount;

            for (var i = symptomLowerIndex; i < symptoms.Length; i++)
            {
                var currentSymptom = symptoms[i];
                RemoveDiseaseEffectForSimptom(personEffects, disease, currentSymptom);
            }
        }
Ejemplo n.º 6
0
        private static void RemoveDiseaseEffectForSimptom(
            IEffectsModule personEffects,
            IDisease disease,
            DiseaseSymptom symptom)
        {
            var currentSymptomEffect = personEffects.Items.OfType <DiseaseSymptomEffect>()
                                       .SingleOrDefault(x => x.Symptom == symptom);

            if (currentSymptomEffect is null)
            {
                // Просто игнорируем этот эффект.
                // Ткущий метод может вызываться несколько раз и для симптомов, которые ушли в предыдущих итерациях.
                return;
            }

            currentSymptomEffect.ReleaseDisease(disease);

            if (!currentSymptomEffect.Diseases.Any())
            {
                personEffects.Remove(currentSymptomEffect);
            }
        }
Ejemplo n.º 7
0
        private static void UpdatePowerUp(IEffectsModule personEffects, IDisease disease, DiseaseSymptom[] symptoms,
                                          float currentPower, float symptomPowerSegment)
        {
            if (currentPower <= 0.25f)
            {
                // Симптомы начинаю проявляться после 25% силы болезни.
                return;
            }

            // Рассчитываем количество симптомов, которые должны быть при текущей силе болезни.

            var activeSymptomCount = (int)Math.Ceiling((currentPower - 0.25f) / symptomPowerSegment);

            // Начинаем проверять, есть ли эффекты на все эти симптомы
            // или добавлены ли болезни симптомов в список болезней эффектов.

            for (var i = 0; i < activeSymptomCount; i++)
            {
                var currentSymptom = symptoms[i];
                AddDiseaseEffectForSymptom(personEffects, disease, currentSymptom);
            }
        }
Ejemplo n.º 8
0
        public HumanSurvivalModule([NotNull] IPersonScheme personScheme,
                                   [NotNull] ISurvivalRandomSource randomSource,
                                   [NotNull] IAttributesModule attributesModule,
                                   IEffectsModule effectsModule,
                                   IEvolutionModule evolutionModule,
                                   IEquipmentModule equipmentModule) : base(GetStats(personScheme, attributesModule))
        {
            _personScheme     = personScheme ?? throw new ArgumentNullException(nameof(personScheme));
            _randomSource     = randomSource ?? throw new ArgumentNullException(nameof(randomSource));
            _attributesModule = attributesModule ?? throw new ArgumentNullException(nameof(attributesModule));
            _effectsModule    = effectsModule;
            _evolutionModule  = evolutionModule;
            _equipmentModule  = equipmentModule;

            RegisterModuleEventHandlers();

            foreach (var stat in Stats)
            {
                stat.Changed += Stat_Changed;
            }

            CalcSurvivalStats();
        }
Ejemplo n.º 9
0
 private static SurvivalStatHazardEffect GetCurrentEffect(IEffectsModule currentEffects, SurvivalStatType statType)
 {
     return(currentEffects.Items
            .OfType <SurvivalStatHazardEffect>()
            .SingleOrDefault(x => x.Type == statType));
 }
Ejemplo n.º 10
0
 public DiseaseModule(IEffectsModule personEffects)
 {
     _personEffects = personEffects ?? throw new ArgumentNullException(nameof(personEffects));
 }