Exemple #1
0
        private void UpdateAlert(IConditionsModule conditionsModule, GameTime gameTime)
        {
            var conditionRectangles = conditionsModule.Items.Select((x, index) => new
            {
                UiRect = new Rectangle(index * (ICON_SIZE + ICON_SPACING) - ICON_SPACING + _screenX, _screenY,
                                       ICON_SIZE, ICON_SIZE),
                Condition = x,
                IconIndex = index
            });

            var criticalConditions = conditionRectangles
                                     .Where(x => x.Condition is SurvivalStatHazardCondition survivalStatHazardCondition &&
                                            survivalStatHazardCondition.Level == SurvivalStatHazardLevel.Max);

            _alertedConditions.Clear();

            const int ALERT_SOUND_COUNT = 3;

            if (_alertCounter < ALERT_DELAY_DURATION_SECONDS + ALERT_VISIBLE_DURATION_SECONDS)
            {
                _alertCounter += gameTime.ElapsedGameTime.TotalSeconds;

                if (_alertCounter < ALERT_VISIBLE_DURATION_SECONDS)
                {
                    var t = _alertCounter / ALERT_VISIBLE_DURATION_SECONDS;

                    var visiblilitySin = Math.Sin(t * Math.PI * 2 * 3);
                    if (visiblilitySin > 0)
                    {
                        foreach (var criticalCondition in criticalConditions)
                        {
                            _alertedConditions.Add(criticalCondition.Condition);
                        }
                    }

                    if (visiblilitySin > 0 && _alertedConditions.Any() &&
                        _alertSoundEffect.State != SoundState.Playing && _alertIterationIndex < ALERT_SOUND_COUNT)
                    {
                        _alertIterationIndex++;

                        _alertSoundEffect.Play();
                    }
                }
            }
            else
            {
                _alertCounter = 0;
            }

            if (criticalConditions.Any() && _alertIterationIndex < ALERT_SOUND_COUNT)
            {
                _soundtrackManager.PlaySilence();
            }
            else
            {
                _soundtrackManager.PlayBackgroundTrack();
            }

            if (!criticalConditions.Any())
            {
                _alertIterationIndex = 0;
            }
        }