/// <summary>
        /// Progresses an achievement
        /// </summary>
        /// <param name="id"></param>
        private Boolean Progress(Achievement.Identifier id,
                                 DataPea sender = null,
                                 Func <Object, Boolean> completion  = null,
                                 Func <Object, Object> modification = null)
        {
            var achievement = _activeSingle[id];
            var pea         = sender as DataPea;

            // Get correct achievement and cancel if disabled
            switch (achievement.Scope)
            {
            case Achievement.Times.Single:
                if (_activeSingle[id].IsCompleted)
                {
                    return(true);
                }
                break;

            case Achievement.Times.SinglePea:
                if (_peaDisabled[pea].Contains(achievement))
                {
                    return(true);
                }
                achievement = _activePea[id][pea];
                break;

            case Achievement.Times.SingleJump:
                if (_jumpDisabled[pea].Contains(achievement))
                {
                    return(true);
                }
                achievement = _activePea[id][pea];
                break;

            case Achievement.Times.SingleSession:
                if (_sessionDisabled.Contains(achievement))
                {
                    return(true);
                }
                break;

            case Achievement.Times.MultiplePea:
                achievement = _activePea[id][pea];
                break;
            }

            // Process
            switch (achievement.Type)
            {
            case Achievement.ProgressType.Event:
                achievement.IsCompleted = true;
                break;

            case Achievement.ProgressType.Condition:
                achievement.IsCompleted = completion.Invoke(null);
                break;

            case Achievement.ProgressType.Accumulation:
                if (modification != null)     // null if check only
                {
                    achievement.Progress = modification.Invoke(achievement.Progress);
                }
                if (completion != null)     // null if update only
                {
                    achievement.IsCompleted = completion.Invoke(achievement.Progress);
                }
                break;
            }

            // Determine recreating
            if (achievement.IsCompleted)
            {
                _completed.Add(achievement);
                OnCompletedAchievement.Invoke(achievement);

                System.Diagnostics.Debug.WriteLine("Achievement {0} completed [{1} - {2}]", achievement.Id, achievement.Name, achievement.Description);

                switch (achievement.Scope)
                {
                case Achievement.Times.Multiple:
                    _activeSingle[id] = achievement.GenerateNew();
                    break;

                case Achievement.Times.MultiplePea:
                    _activePea[id][pea] = achievement.GenerateNew();
                    break;

                case Achievement.Times.SingleJump:
                    _activePea[id][pea] = achievement.GenerateNew();
                    _jumpDisabled[pea].Add(_activePea[id][pea]);
                    break;

                case Achievement.Times.SingleSession:
                    _activeSingle[id] = achievement.GenerateNew();
                    _sessionDisabled.Add(_activeSingle[id]);
                    break;

                case Achievement.Times.SinglePea:
                    _activePea[id][pea] = achievement.GenerateNew();
                    _peaDisabled[pea].Add(_activePea[id][pea]);
                    break;
                }
            }

            return(achievement.IsCompleted);
        }
 /// <summary>
 ///
 /// </summary>
 /// <param name="id"></param>
 /// <param name="modification"></param>
 private Boolean Check(Achievement.Identifier id,
                       Func <Object, Boolean> completion = null,
                       DataPea sender = null)
 {
     return(Progress(id, sender, completion));
 }
 /// <summary>
 ///
 /// </summary>
 /// <param name="id"></param>
 /// <param name="completion"></param>
 /// <param name="modification"></param>
 private Boolean Progress(Achievement.Identifier id,
                          Func <Object, Boolean> completion,
                          Func <Object, Object> modification)
 {
     return(Progress(id, null, completion, modification));
 }
 /// <summary>
 ///
 /// </summary>
 /// <param name="id"></param>
 /// <param name="modification"></param>
 private void Modify(Achievement.Identifier id,
                     Func <Object, Object> modification,
                     DataPea sender = null)
 {
     Progress(id, sender, null, modification);
 }