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