![]() |
00001 // 00002 // LemmingManager.m 00003 // Author: Thomas Taylor 00004 // 00005 // Manages the Lemmings in the game 00006 // 00007 // 15/12/2011: Created class 00008 // 00009 00010 #import "LemmingManager.h" 00011 00012 @implementation LemmingManager 00013 00014 @synthesize learningType; 00015 @synthesize learningEpisodes; 00016 @synthesize totalNumberOfLemmings; 00017 @synthesize sharedKnowledge; 00018 00019 static LemmingManager* _instance = nil; 00020 00021 #pragma mark - 00022 #pragma mark Memory Allocation 00023 00024 -(void)dealloc 00025 { 00026 [lemmings release]; 00027 [super dealloc]; 00028 } 00029 00034 +(id)alloc 00035 { 00036 @synchronized([LemmingManager class]) 00037 { 00038 // if the _instance already exists, stop 00039 NSAssert(_instance == nil, @"There should only ever be one instance of LemmingManager"); 00040 _instance = [super alloc]; 00041 return _instance; 00042 } 00043 00044 return nil; 00045 } 00046 00047 #pragma mark - 00048 #pragma mark Initialisation 00049 00054 -(id)init 00055 { 00056 self = [super init]; 00057 00058 if (self != nil) 00059 { 00060 [self reset]; 00061 } 00062 00063 return self; 00064 } 00065 00066 #pragma mark - 00067 00072 +(LemmingManager*)sharedLemmingManager 00073 { 00074 @synchronized([LemmingManager class]) 00075 { 00076 if(!_instance) [[self alloc] init]; 00077 return _instance; 00078 } 00079 00080 return nil; 00081 } 00082 00083 #pragma mark - 00084 00088 -(void)reset 00089 { 00090 lemmingsAdded = 0; 00091 lemmingsKilled = 0; 00092 lemmingsSaved = 0; 00093 lemmings = [[CCArray alloc] init]; 00094 } 00095 00096 #pragma mark - 00097 00102 -(void)addLemming:(Lemming*)_lemmingToAdd 00103 { 00104 @synchronized(lemmings) { [lemmings addObject:_lemmingToAdd]; } 00105 lemmingsAdded++; 00106 } 00107 00112 -(void)removeLemming:(Lemming*)_lemmingToRemove 00113 { 00114 if(_lemmingToRemove.state == kStateDead) lemmingsKilled++; 00115 else 00116 { 00117 lemmingsSaved++; 00118 spawnsRemaining += [_lemmingToRemove respawns]; 00119 } 00120 00121 @synchronized(lemmings) { [lemmings removeObject:_lemmingToRemove]; } 00122 [_lemmingToRemove removeAllChildrenWithCleanup:YES]; 00123 [_lemmingToRemove removeFromParentAndCleanup:YES]; 00124 00125 if([self lemmingCount] == 0) 00126 { 00127 [[DataManager sharedDataManager] addCurrentGameData]; 00128 [[KnowledgeBase sharedKnowledgeBase] exportKnowledgeBase]; 00129 [[GameManager sharedGameManager] runSceneWithID:kGameOverScene]; 00130 } 00131 } 00132 00133 #pragma mark - 00134 00140 -(GameRating)calculateGameRating 00141 { 00142 // calcuate the base score 00143 float baseScore = ((float)lemmingsSaved/(float)totalNumberOfLemmings)*100; 00144 00145 // calculate penalties 00146 float deathPenalty = (float)lemmingsKilled/(float)totalNumberOfLemmings*50; 00147 float timePenalty = (float)[[GameManager sharedGameManager] getGameTimeInSecs]/60; 00148 float totalPenalty = timePenalty + deathPenalty; 00149 00150 // calculate the score 00151 float score = baseScore - totalPenalty; 00152 00153 CCLOG(@"LemmingManager.calculateGameRating: base: %f penalty: %f score: %f", baseScore, totalPenalty, score); 00154 00155 // convert score into rating 00156 if(score >= kRatingAScore) return kRatingA; 00157 if(score >= kRatingBScore) return kRatingB; 00158 if(score >= kRatingCScore) return kRatingC; 00159 if(score >= kRatingDScore) return kRatingD; 00160 else return kRatingF; 00161 } 00162 00163 #pragma mark - 00164 #pragma mark Getters/setters 00165 00170 -(int)learningEpisodes 00171 { 00172 return learningEpisodes; 00173 } 00174 00179 -(void)setLearningEpisodes:(int)_learningEpisodes 00180 { 00181 learningEpisodes = _learningEpisodes; 00182 } 00183 00188 -(CCArray*)lemmings 00189 { 00190 return lemmings; 00191 } 00192 00198 -(BOOL)lemmingsMaxed 00199 { 00200 return lemmingsAdded == totalNumberOfLemmings; 00201 } 00202 00208 -(int)lemmingCount 00209 { 00210 return [lemmings count]; 00211 } 00212 00218 -(int)lemmingsAdded 00219 { 00220 return lemmingsAdded; 00221 } 00222 00227 -(int)lemmingsSaved 00228 { 00229 return lemmingsSaved; 00230 } 00231 00236 -(int)lemmingsKilled 00237 { 00238 return lemmingsKilled; 00239 } 00240 00241 @end