/// <summary> /// Reports the progress of an achievement (reveal, unlock or increment). This method attempts /// to implement the expected behavior of ISocialPlatform.ReportProgress as closely as possible, /// as described below. Although this method works with incremental achievements for compatibility /// purposes, calling this method for incremental achievements is not recommended, /// since the Play Games API exposes incremental achievements in a very different way /// than the interface presented by ISocialPlatform.ReportProgress. The implementation of this /// method for incremental achievements attempts to produce the correct result, but may be /// imprecise. If possible, call <see cref="IncrementAchievement" /> instead. /// </summary> /// <param name='achievementID'> /// The ID of the achievement to unlock, reveal or increment. This can be a raw Google Play /// Games achievement ID (alphanumeric string), or an alias that was previously configured /// by a call to <see cref="AddIdMapping" />. /// </param> /// <param name='progress'> /// Progress of the achievement. If the achievement is standard (not incremental), then /// a progress of 0.0 will reveal the achievement and 100.0 will unlock it. Behavior of other /// values is undefined. If the achievement is incremental, then this value is interpreted /// as the total percentage of the achievement's progress that the player should have /// as a result of this call (regardless of the progress they had before). So if the /// player's previous progress was 30% and this call specifies 50.0, the new progress will /// be 50% (not 80%). /// </param> /// <param name='callback'> /// Callback that will be called to report the result of the operation: <c>true</c> on /// success, <c>false</c> otherwise. /// </param> public void ReportProgress(string achievementID, double progress, Action <bool> callback) { if (!IsAuthenticated()) { Logger.e("ReportProgress can only be called after authentication."); if (callback != null) { callback.Invoke(false); } return; } // map ID, if it's in the dictionary Logger.d("ReportProgress, " + achievementID + ", " + progress); achievementID = MapId(achievementID); // if progress is 0.0, we just want to reveal it if (progress < 0.000001) { Logger.d("Progress 0.00 interpreted as request to reveal."); mClient.RevealAchievement(achievementID, callback); return; } // figure out if it's a standard or incremental achievement bool isIncremental = false; int curSteps = 0, totalSteps = 0; Achievement ach = mClient.GetAchievement(achievementID); if (ach == null) { Logger.w("Unable to locate achievement " + achievementID); Logger.w("As a quick fix, assuming it's standard."); isIncremental = false; } else { isIncremental = ach.IsIncremental; curSteps = ach.CurrentSteps; totalSteps = ach.TotalSteps; Logger.d("Achievement is " + (isIncremental ? "INCREMENTAL" : "STANDARD")); if (isIncremental) { Logger.d("Current steps: " + curSteps + "/" + totalSteps); } } // do the right thing depending on the achievement type if (isIncremental) { // increment it to the target percentage (approximate) Logger.d("Progress " + progress + " interpreted as incremental target (approximate)."); int targetSteps = (int)(progress * totalSteps); int numSteps = targetSteps - curSteps; Logger.d("Target steps: " + targetSteps + ", cur steps:" + curSteps); Logger.d("Steps to increment: " + numSteps); if (numSteps > 0) { mClient.IncrementAchievement(achievementID, numSteps, callback); } } else { // unlock it! Logger.d("Progress " + progress + " interpreted as UNLOCK."); mClient.UnlockAchievement(achievementID, callback); } }
/// <summary> /// Reports the progress of an achievement (reveal, unlock or increment). This method attempts /// to implement the expected behavior of ISocialPlatform.ReportProgress as closely as possible, /// as described below. Although this method works with incremental achievements for compatibility /// purposes, calling this method for incremental achievements is not recommended, /// since the Play Games API exposes incremental achievements in a very different way /// than the interface presented by ISocialPlatform.ReportProgress. The implementation of this /// method for incremental achievements attempts to produce the correct result, but may be /// imprecise. If possible, call <see cref="IncrementAchievement" /> instead. /// </summary> /// <param name='achievementID'> /// The ID of the achievement to unlock, reveal or increment. This can be a raw Google Play /// Games achievement ID (alphanumeric string), or an alias that was previously configured /// by a call to <see cref="AddIdMapping" />. /// </param> /// <param name='progress'> /// Progress of the achievement. If the achievement is standard (not incremental), then /// a progress of 0.0 will reveal the achievement and 100.0 will unlock it. Behavior of other /// values is undefined. If the achievement is incremental, then this value is interpreted /// as the total percentage of the achievement's progress that the player should have /// as a result of this call (regardless of the progress they had before). So if the /// player's previous progress was 30% and this call specifies 50.0, the new progress will /// be 50% (not 80%). /// </param> /// <param name='callback'> /// Callback that will be called to report the result of the operation: <c>true</c> on /// success, <c>false</c> otherwise. /// </param> public void ReportProgress(string achievementID, double progress, Action <bool> callback) { if (!IsAuthenticated()) { Logger.e("ReportProgress can only be called after authentication."); if (callback != null) { callback.Invoke(false); } return; } // map ID, if it's in the dictionary Logger.d("ReportProgress, " + achievementID + ", " + progress); achievementID = MapId(achievementID); // if progress is 0.0, we just want to reveal it if (progress < 0.000001) { Logger.d("Progress 0.00 interpreted as request to reveal."); mClient.RevealAchievement(achievementID, callback); return; } // figure out if it's a standard or incremental achievement bool isIncremental = false; int curSteps = 0, totalSteps = 0; Achievement ach = mClient.GetAchievement(achievementID); if (ach == null) { Logger.w("Unable to locate achievement " + achievementID); Logger.w("As a quick fix, assuming it's standard."); isIncremental = false; } else { isIncremental = ach.IsIncremental; curSteps = ach.CurrentSteps; totalSteps = ach.TotalSteps; Logger.d("Achievement is " + (isIncremental ? "INCREMENTAL" : "STANDARD")); if (isIncremental) { Logger.d("Current steps: " + curSteps + "/" + totalSteps); } } // do the right thing depending on the achievement type if (isIncremental) { // increment it to the target percentage (approximate) Logger.d("Progress " + progress + " interpreted as incremental target (approximate)."); if (progress >= 0.0 && progress <= 1.0) { // in a previous version, incremental progress was reported by using the range [0-1] Logger.w("Progress " + progress + " is less than or equal to 1. You might be trying to use values in the range of [0,1], while values are expected to be within the range [0,100]. If you are using the latter, you can safely ignore this message."); } int targetSteps = (int)((progress / 100) * totalSteps); int numSteps = targetSteps - curSteps; Logger.d("Target steps: " + targetSteps + ", cur steps:" + curSteps); Logger.d("Steps to increment: " + numSteps); if (numSteps > 0) { mClient.IncrementAchievement(achievementID, numSteps, callback); } } else if (progress >= 100) { // unlock it! Logger.d("Progress " + progress + " interpreted as UNLOCK."); mClient.UnlockAchievement(achievementID, callback); } else { // not enough to unlock Logger.d("Progress " + progress + " not enough to unlock non-incremental achievement."); } }
public void ReportProgress(string achievementID, double progress, Action <bool> callback) { if (!IsAuthenticated()) { Logger.e("ReportProgress can only be called after authentication."); callback?.Invoke(false); } else { Logger.d("ReportProgress, " + achievementID + ", " + progress); achievementID = MapId(achievementID); if (progress < 1E-06) { Logger.d("Progress 0.00 interpreted as request to reveal."); mClient.RevealAchievement(achievementID, callback); } else { bool flag = false; int num = 0; int num2 = 0; Achievement achievement = mClient.GetAchievement(achievementID); if (achievement == null) { Logger.w("Unable to locate achievement " + achievementID); Logger.w("As a quick fix, assuming it's standard."); flag = false; } else { flag = achievement.IsIncremental; num = achievement.CurrentSteps; num2 = achievement.TotalSteps; Logger.d("Achievement is " + ((!flag) ? "STANDARD" : "INCREMENTAL")); if (flag) { Logger.d("Current steps: " + num + "/" + num2); } } if (flag) { Logger.d("Progress " + progress + " interpreted as incremental target (approximate)."); if (progress >= 0.0 && progress <= 1.0) { Logger.w("Progress " + progress + " is less than or equal to 1. You might be trying to use values in the range of [0,1], while values are expected to be within the range [0,100]. If you are using the latter, you can safely ignore this message."); } int num3 = (int)Math.Round(progress / 100.0 * (double)num2); int num4 = num3 - num; Logger.d("Target steps: " + num3 + ", cur steps:" + num); Logger.d("Steps to increment: " + num4); if (num4 >= 0) { mClient.IncrementAchievement(achievementID, num4, callback); } } else if (progress >= 100.0) { Logger.d("Progress " + progress + " interpreted as UNLOCK."); mClient.UnlockAchievement(achievementID, callback); } else { Logger.d("Progress " + progress + " not enough to unlock non-incremental achievement."); } } } }