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; } }