All Data Structures Files Functions Variables Enumerations Enumerator Properties Defines
/Projects/Cogito/src/Singletons/LemmingManager.m
Go to the documentation of this file.
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