/// <summary>
 /// Called when [meter score changed].
 /// </summary>
 /// <param name="meterScoreData">The meter score data.</param>
 private void OnScoreChanged(GameEngineEvents.ScoreChanged e)
 {
     using (ReaderWriterLockMgr lockMgr = new ReaderWriterLockMgr(_dataLog.Scores.Lock))
     {
         lockMgr.EnterWriteLock();
         _dataLog.Scores.AddScoresRow(
             DateTime.Now,                           // Current datetime stamp
             e.SensorId,                             // Sensor ID
             _game.GameNumber,                       // Game number
             _game.RoundNumber,                      // Round number
             DateTime.Now - _countdownStartedTime,   // Elapsed time
             (_meterNames.ContainsKey(e.SensorId) ? _meterNames[e.SensorId] : string.Empty), // Meter Name
             _config.RequiredImpactLevel,             // required impact level
             e.ImpactLevel,                          // Actual impact level
             (int)(e.NewScore - e.OldScore),         // Number of points
             e.NewScore
         );
     }
 }
 /// <summary>
 /// Called when [sensor hit].
 /// </summary>
 /// <param name="e">The e.</param>
 private void OnScoreChanged(GameEngineEvents.ScoreChanged e)
 {
     if (_config.MeterSoundsEnabled && e.NewScore > e.OldScore)
         PlaySoundResource(PUNCH_SOUNDS[_random.Next(PUNCH_SOUNDS.Length)]);
 }