/// <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 string GetSurvivalConditionTitle(SurvivalStatHazardCondition statCondition) { var typeString = GetStatHazardConditionTypeClientString(statCondition.Type); var levelString = GetStatHazardConditionLevelClientString(statCondition); var conditionTitle = UiResources.ResourceManager.GetString($"{typeString}{levelString}ConditionTitle"); if (string.IsNullOrWhiteSpace(conditionTitle)) { Debug.Fail("All person conditions must have localized titles." + $" Unknown person effect: {statCondition.Type} {statCondition.Level}."); return($"{typeString}{levelString}"); } return(conditionTitle); }
private static string GetStatHazardConditionLevelClientString(SurvivalStatHazardCondition statCondition) { return(statCondition.Level == SurvivalStatHazardLevel.Max ? "Critical" : statCondition.Level.ToString()); }