Skip to content

Instantly share code, notes, and snippets.

@sdabet
Last active December 14, 2015 05:59
Show Gist options
  • Save sdabet/5039145 to your computer and use it in GitHub Desktop.
Save sdabet/5039145 to your computer and use it in GitHub Desktop.
Achievement manager
@interface AchievementManager : NSObject
+(AchievementManager*) sharedManager;
/** Local copy of current achievements progress */
@property(nonatomic, retain) NSMutableDictionary *achievementsDictionary;
/** Must be called right after Game Center authentication */
-(void) loadAchievements;
/** Report an achievement if necessary (i.E if better than current progress) */
-(void) reportAchievementIdentifier:(NSString*) identifier percentComplete:(float) percent;
/** Increment an achievement if necessary (i.e if current is < 100%) */
-(void) incrementAchievementIdentifier:(NSString*) identifier percentIncrement:(float) percent;
@end
@implementation AchievementManager
static AchievementManager* _sharedManager = nil;
+(AchievementManager*) sharedManager {
@synchronized([AchievementManager class])
{
if (!_sharedManager)
_sharedManager = [[self alloc] init];
return _sharedManager;
}
return nil;
}
@synthesize achievementsDictionary;
-(id) init {
if(self = [super init]) {
achievementsDictionary = [[NSMutableDictionary alloc] init];
}
return self;
}
- (void) loadAchievements
{
CCLOG(@"[ACHIEVEMENT] loadAchievements");
[GKAchievement loadAchievementsWithCompletionHandler:^(NSArray *achievements, NSError *error)
{
if (error == nil)
{
for (GKAchievement* achievement in achievements)
[achievementsDictionary setObject: achievement forKey: achievement.identifier];
}
}];
}
- (GKAchievement*) getAchievementForIdentifier: (NSString*) identifier
{
GKAchievement *achievement = [achievementsDictionary objectForKey:identifier];
if (achievement == nil)
{
achievement = [[GKAchievement alloc] initWithIdentifier:identifier];
[achievementsDictionary setObject:achievement forKey:achievement.identifier];
}
return achievement;
}
-(void) reportAchievementIdentifier: (NSString*) identifier percentComplete: (float) percent {
GKAchievement *achievement = [self getAchievementForIdentifier:identifier];
if (achievement && percent > achievement.percentComplete)
{
CCLOG(@"[ACHIEVEMENT] reportAchievementIdentifier: '%@' percentComplete: %f", identifier, percent);
achievement.percentComplete = percent;
achievement.showsCompletionBanner = YES;
[achievement reportAchievementWithCompletionHandler:^(NSError *error) {
if (error != nil)
{
CCLOGERROR(@"[ACHIEVEMENT] Error in reporting achievements: %@", error);
}
}];
}
}
-(void) incrementAchievementIdentifier: (NSString*) identifier percentIncrement: (float) percent {
GKAchievement *achievement = [self getAchievementForIdentifier:identifier];
if(achievement.percentComplete < 100) {
CCLOG(@"[ACHIEVEMENT] incrementAchievementIdentifier: '%@' percentIncrement: %f", identifier, percent);
achievement.percentComplete += percent;
achievement.showsCompletionBanner = YES;
[achievement reportAchievementWithCompletionHandler:^(NSError *error) {
if (error != nil)
{
CCLOGERROR(@"[ACHIEVEMENT] Error in reporting achievements: %@", error);
}
}];
}
}
@end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment