Example #1
0
        /// <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);
                }
            }
        }
Example #2
0
        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);
        }
Example #3
0
 private static string GetStatHazardConditionLevelClientString(SurvivalStatHazardCondition statCondition)
 {
     return(statCondition.Level == SurvivalStatHazardLevel.Max
         ? "Critical"
         : statCondition.Level.ToString());
 }