/// <summary> /// Обновление эффекта модуля выживания. /// </summary> /// <param name="currentCondition"> Текущий список условий. </param> /// <param name="stat"> Характеристика, на которую влияет эффект. </param> /// <param name="keySegments"> /// Ключевые сегменты, которые были пересечены при изменении характеристики. /// <param name="survivalRandomSource"> Источник рандома выживания. </param> public static void UpdateSurvivalСondition( [NotNull] IConditionsModule currentCondition, [NotNull] SurvivalStat stat, [NotNull] SurvivalStatKeySegment[] keySegments, [NotNull] ISurvivalRandomSource survivalRandomSource, [MaybeNull] IPlayerEventLogService?playerEventLogService) { ThrowExceptionIfArgumentsInvalid(currentCondition, stat, keySegments, survivalRandomSource); // Эффект выставляем на основе текущего ключевого сегмента, в которое попадает значение характеристики выживания. // Если текущее значение не попадает ни в один сегмент, то эффект сбрасывается. var currentSegments = keySegments.CalcIntersectedSegments(stat.ValueShare); // Если попадаем на стык с двумя сегментами, просто берём первый. // Иногда это будет давать более сильный штрафной эффект, // но пока не понятно, как по другому сделать отрезки. var currentSegment = currentSegments.FirstOrDefault(); var statType = stat.Type; var currentTypeСondition = GetCurrentСondition(currentCondition, statType); if (currentTypeСondition != null) { // Эффект уже существует. Изменим его уровень. // Или удалим, если текущее значение не попадает ни в один из сегментов. if (currentSegment == null) { currentCondition.Remove(currentTypeСondition); } else { currentTypeСondition.Level = currentSegment.Level; } } else { if (currentSegment != null) { // Создаём эффект var newEffect = new SurvivalStatHazardCondition( statType, currentSegment.Level, survivalRandomSource) { PlayerEventLogService = playerEventLogService }; currentCondition.Add(newEffect); } } }
private static void RemoveDiseaseEffectForSimptom( IConditionsModule сonditionModule, IDisease disease, DiseaseSymptom symptom) { var currentSymptomEffect = сonditionModule.Items.OfType <DiseaseSymptomCondition>() .SingleOrDefault(x => x.Symptom == symptom); if (currentSymptomEffect is null) { // Просто игнорируем этот эффект. // Ткущий метод может вызываться несколько раз и для симптомов, которые ушли в предыдущих итерациях. return; } currentSymptomEffect.ReleaseDisease(disease); if (!currentSymptomEffect.Diseases.Any()) { сonditionModule.Remove(currentSymptomEffect); } }