diff options
| -rwxr-xr-x | Classes/ClassicGameMode.m | 6 | ||||
| -rw-r--r-- | Classes/GameModeInfo.h | 5 | ||||
| -rw-r--r-- | Classes/GameModeInfo.m | 6 | ||||
| -rw-r--r-- | Classes/GameModeManager.m | 8 | ||||
| -rw-r--r-- | Classes/GameModeSelection.m | 90 | ||||
| -rw-r--r-- | Classes/GameModeSelectionLayer.m | 7 | ||||
| -rw-r--r-- | Classes/JumpGameMode.m | 6 | ||||
| -rw-r--r-- | Classes/TutorialMode.m | 6 |
8 files changed, 48 insertions, 86 deletions
| diff --git a/Classes/ClassicGameMode.m b/Classes/ClassicGameMode.m index 9356fea..00bf049 100755 --- a/Classes/ClassicGameMode.m +++ b/Classes/ClassicGameMode.m | |||
| @@ -30,11 +30,9 @@ static GameModeInfo* info; | |||
| 30 | location:@"Paris" | 30 | location:@"Paris" |
| 31 | numOfStars:3 | 31 | numOfStars:3 |
| 32 | imageFilename:[[NSBundle mainBundle] pathForResource:@"paris" ofType:@"png"] | 32 | imageFilename:[[NSBundle mainBundle] pathForResource:@"paris" ofType:@"png"] |
| 33 | unlocked:NO | 33 | unlocked:YES |
| 34 | unlockCondition:@"Beat the tutorial!" | ||
| 35 | gameClass:[ClassicGameMode class] | 34 | gameClass:[ClassicGameMode class] |
| 36 | globalHighscoreKey:@"Classic" | 35 | globalHighscoreKey:@"Classic"]; |
| 37 | starsToUnlock:0]; | ||
| 38 | } | 36 | } |
| 39 | 37 | ||
| 40 | return info; | 38 | return info; |
| diff --git a/Classes/GameModeInfo.h b/Classes/GameModeInfo.h index 2262526..7d60645 100644 --- a/Classes/GameModeInfo.h +++ b/Classes/GameModeInfo.h | |||
| @@ -19,7 +19,6 @@ | |||
| 19 | NSString* unlockCondition; | 19 | NSString* unlockCondition; |
| 20 | Class gameClass; | 20 | Class gameClass; |
| 21 | NSString* globalHighscoreKey; | 21 | NSString* globalHighscoreKey; |
| 22 | int starsToUnlock; | ||
| 23 | } | 22 | } |
| 24 | 23 | ||
| 25 | @property (readonly) NSString* name; | 24 | @property (readonly) NSString* name; |
| @@ -27,10 +26,8 @@ | |||
| 27 | @property (readonly) int numOfStars; | 26 | @property (readonly) int numOfStars; |
| 28 | @property (readonly) UIImage* image; | 27 | @property (readonly) UIImage* image; |
| 29 | @property (readonly) BOOL unlocked; | 28 | @property (readonly) BOOL unlocked; |
| 30 | @property (readonly) NSString* unlockCondition; | ||
| 31 | @property (readonly) NSString* globalHighscoreKey; | 29 | @property (readonly) NSString* globalHighscoreKey; |
| 32 | @property (readonly) int starsToUnlock; | 30 | - (id)initWithName:(NSString*)m_name location:(NSString*)m_location numOfStars:(int)m_numOfStars imageFilename:(NSString*)m_imageFilename unlocked:(BOOL)m_unlocked gameClass:(Class)m_gameClass globalHighscoreKey:(NSString*)m_globalHighscoreKey; |
| 33 | - (id)initWithName:(NSString*)m_name location:(NSString*)m_location numOfStars:(int)m_numOfStars imageFilename:(NSString*)m_imageFilename unlocked:(BOOL)m_unlocked unlockCondition:(NSString*)m_unlockCondition gameClass:(Class)m_gameClass globalHighscoreKey:(NSString*)m_globalHighscoreKey starsToUnlock:(int)m_starsToUnlock; | ||
| 34 | - (void)setStar:(int)star_id withMessage:(NSString*)message; | 31 | - (void)setStar:(int)star_id withMessage:(NSString*)message; |
| 35 | - (BOOL)star:(int)star_id; | 32 | - (BOOL)star:(int)star_id; |
| 36 | - (int)starsCollected; | 33 | - (int)starsCollected; |
| diff --git a/Classes/GameModeInfo.m b/Classes/GameModeInfo.m index 8b33fd8..1f85978 100644 --- a/Classes/GameModeInfo.m +++ b/Classes/GameModeInfo.m | |||
| @@ -14,9 +14,9 @@ | |||
| 14 | 14 | ||
| 15 | @implementation GameModeInfo | 15 | @implementation GameModeInfo |
| 16 | 16 | ||
| 17 | @synthesize name, location, numOfStars, image, unlocked, unlockCondition, globalHighscoreKey, starsToUnlock; | 17 | @synthesize name, location, numOfStars, image, unlocked, globalHighscoreKey; |
| 18 | 18 | ||
| 19 | - (id)initWithName:(NSString*)m_name location:(NSString*)m_location numOfStars:(int)m_numOfStars imageFilename:(NSString*)m_imageFilename unlocked:(BOOL)m_unlocked unlockCondition:(NSString*)m_unlockCondition gameClass:(Class)m_gameClass globalHighscoreKey:(NSString*)m_globalHighscoreKey starsToUnlock:(int)m_starsToUnlock | 19 | - (id)initWithName:(NSString*)m_name location:(NSString*)m_location numOfStars:(int)m_numOfStars imageFilename:(NSString*)m_imageFilename unlocked:(BOOL)m_unlocked gameClass:(Class)m_gameClass globalHighscoreKey:(NSString*)m_globalHighscoreKey |
| 20 | { | 20 | { |
| 21 | self = [super init]; | 21 | self = [super init]; |
| 22 | 22 | ||
| @@ -26,9 +26,7 @@ | |||
| 26 | location = m_location; | 26 | location = m_location; |
| 27 | numOfStars = m_numOfStars; | 27 | numOfStars = m_numOfStars; |
| 28 | image = [[UIImage alloc] initWithContentsOfFile:m_imageFilename]; | 28 | image = [[UIImage alloc] initWithContentsOfFile:m_imageFilename]; |
| 29 | unlockCondition = m_unlockCondition; | ||
| 30 | globalHighscoreKey = m_globalHighscoreKey; | 29 | globalHighscoreKey = m_globalHighscoreKey; |
| 31 | starsToUnlock = m_starsToUnlock; | ||
| 32 | 30 | ||
| 33 | NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults]; | 31 | NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults]; |
| 34 | unlocked = [defaults boolForKey:[NSString stringWithFormat:@"gameModeUnlocked-%@", name]]; | 32 | unlocked = [defaults boolForKey:[NSString stringWithFormat:@"gameModeUnlocked-%@", name]]; |
| diff --git a/Classes/GameModeManager.m b/Classes/GameModeManager.m index 5a6e109..d7cd21e 100644 --- a/Classes/GameModeManager.m +++ b/Classes/GameModeManager.m | |||
| @@ -56,13 +56,7 @@ static GameModeManager* sharedInstance = nil; | |||
| 56 | NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults]; | 56 | NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults]; |
| 57 | [defaults setInteger:m_stars forKey:@"stars"]; | 57 | [defaults setInteger:m_stars forKey:@"stars"]; |
| 58 | 58 | ||
| 59 | for (GameModeInfo* gameMode in gameModes) | 59 | // Here, unlock game modes that have reached enough stars |
| 60 | { | ||
| 61 | if ((!gameMode.unlocked) && (stars >= gameMode.starsToUnlock)) | ||
| 62 | { | ||
| 63 | [gameMode unlock]; | ||
| 64 | } | ||
| 65 | } | ||
| 66 | } | 60 | } |
| 67 | } | 61 | } |
| 68 | 62 | ||
| diff --git a/Classes/GameModeSelection.m b/Classes/GameModeSelection.m index 61004fa..ea5f45b 100644 --- a/Classes/GameModeSelection.m +++ b/Classes/GameModeSelection.m | |||
| @@ -26,6 +26,13 @@ | |||
| 26 | 26 | ||
| 27 | if (nil != self) | 27 | if (nil != self) |
| 28 | { | 28 | { |
| 29 | if (!m_gameMode.unlocked) | ||
| 30 | { | ||
| 31 | @throw [NSException exceptionWithName:NSInvalidArgumentException | ||
| 32 | reason:@"Game mode must be unlocked to appear on selection screen" | ||
| 33 | userInfo:nil]; | ||
| 34 | } | ||
| 35 | |||
| 29 | self.anchorPoint = CGPointMake(0.5f, 0.5f); | 36 | self.anchorPoint = CGPointMake(0.5f, 0.5f); |
| 30 | 37 | ||
| 31 | gameMode = m_gameMode; | 38 | gameMode = m_gameMode; |
| @@ -34,16 +41,6 @@ | |||
| 34 | 41 | ||
| 35 | NSString* name = gameMode.name; | 42 | NSString* name = gameMode.name; |
| 36 | NSString* location = gameMode.location; | 43 | NSString* location = gameMode.location; |
| 37 | NSString* filenameMod; | ||
| 38 | |||
| 39 | if (gameMode.unlocked) | ||
| 40 | { | ||
| 41 | filenameMod = [NSString stringWithFormat:@"%@-unlocked", name]; | ||
| 42 | } else { | ||
| 43 | filenameMod = [NSString stringWithFormat:@"%@-locked", name]; | ||
| 44 | name = [@"" stringByPaddingToLength:name.length withString:@"?" startingAtIndex:0]; | ||
| 45 | location = [@"" stringByPaddingToLength:location.length withString:@"?" startingAtIndex:0]; | ||
| 46 | } | ||
| 47 | 44 | ||
| 48 | // First, create the frame that we will put the level picture inside | 45 | // First, create the frame that we will put the level picture inside |
| 49 | CGImageRef framestuff = [[UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"framestuff" ofType:@"png"]] CGImage]; | 46 | CGImageRef framestuff = [[UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"framestuff" ofType:@"png"]] CGImage]; |
| @@ -99,26 +96,13 @@ | |||
| 99 | context = UIGraphicsGetCurrentContext(); | 96 | context = UIGraphicsGetCurrentContext(); |
| 100 | CGContextSaveGState(context); | 97 | CGContextSaveGState(context); |
| 101 | 98 | ||
| 102 | if (gameMode.unlocked) | 99 | CGContextSetShadow(context, CGSizeMake(-6, 6), 4.0f); |
| 103 | { | 100 | [selectionBackground drawInRect:CGRectMake(10, 0, boxSize.width, boxSize.height)]; |
| 104 | CGContextSetShadow(context, CGSizeMake(-6, 6), 4.0f); | ||
| 105 | [selectionBackground drawInRect:CGRectMake(10, 0, boxSize.width, boxSize.height)]; | ||
| 106 | } else { | ||
| 107 | // Draw the picture in grayscale if the level has not yet been unlocked | ||
| 108 | CGContextClipToMask(context, CGRectMake(10, 0, boxSize.width, boxSize.height), [selectionBackground CGImage]); | ||
| 109 | CGContextSetFillColorWithColor(context, [[UIColor whiteColor] CGColor]); | ||
| 110 | CGContextFillRect(context, CGRectMake(10, 0, boxSize.width, boxSize.height)); | ||
| 111 | CGContextRestoreGState(context); | ||
| 112 | |||
| 113 | CGContextSaveGState(context); | ||
| 114 | CGContextSetShadow(context, CGSizeMake(-6, 6), 4.0f); | ||
| 115 | [selectionBackground drawInRect:CGRectMake(10, 0, boxSize.width, boxSize.height) blendMode:kCGBlendModeLuminosity alpha:1.0]; | ||
| 116 | } | ||
| 117 | 101 | ||
| 118 | CGContextRestoreGState(context); | 102 | CGContextRestoreGState(context); |
| 119 | CGImageRef pictureRef = [UIGraphicsGetImageFromCurrentImageContext() CGImage]; | 103 | CGImageRef pictureRef = [UIGraphicsGetImageFromCurrentImageContext() CGImage]; |
| 120 | 104 | ||
| 121 | CCSprite* picture = [CCSprite spriteWithCGImage:pictureRef key:[NSString stringWithFormat:@"gms-%@", filenameMod]]; | 105 | CCSprite* picture = [CCSprite spriteWithCGImage:pictureRef key:[NSString stringWithFormat:@"gms-%@", name]]; |
| 122 | 106 | ||
| 123 | // We're also going to need a "selected" image state for the button | 107 | // We're also going to need a "selected" image state for the button |
| 124 | CGContextSaveGState(context); | 108 | CGContextSaveGState(context); |
| @@ -128,7 +112,7 @@ | |||
| 128 | CGContextRestoreGState(context); | 112 | CGContextRestoreGState(context); |
| 129 | CGImageRef selectedButtonRef = [UIGraphicsGetImageFromCurrentImageContext() CGImage]; | 113 | CGImageRef selectedButtonRef = [UIGraphicsGetImageFromCurrentImageContext() CGImage]; |
| 130 | UIGraphicsEndImageContext(); | 114 | UIGraphicsEndImageContext(); |
| 131 | CCSprite* selectedButton = [CCSprite spriteWithCGImage:selectedButtonRef key:[NSString stringWithFormat:@"gms-%@-selected", filenameMod]]; | 115 | CCSprite* selectedButton = [CCSprite spriteWithCGImage:selectedButtonRef key:[NSString stringWithFormat:@"gms-%@-selected", name]]; |
| 132 | 116 | ||
| 133 | CCMenuItemSprite* pictureMenuItem = [CCMenuItemSprite itemFromNormalSprite:picture selectedSprite:selectedButton target:self selector:@selector(buttonTapped)]; | 117 | CCMenuItemSprite* pictureMenuItem = [CCMenuItemSprite itemFromNormalSprite:picture selectedSprite:selectedButton target:self selector:@selector(buttonTapped)]; |
| 134 | NMPanelMenu* theMenu = [NMPanelMenu menuWithItems:pictureMenuItem, nil]; | 118 | NMPanelMenu* theMenu = [NMPanelMenu menuWithItems:pictureMenuItem, nil]; |
| @@ -150,32 +134,29 @@ | |||
| 150 | 134 | ||
| 151 | CGImageRef titleImage = [UIGraphicsGetImageFromCurrentImageContext() CGImage]; | 135 | CGImageRef titleImage = [UIGraphicsGetImageFromCurrentImageContext() CGImage]; |
| 152 | UIGraphicsEndImageContext(); | 136 | UIGraphicsEndImageContext(); |
| 153 | CCSprite* titleSprite = [CCSprite spriteWithCGImage:titleImage key:[NSString stringWithFormat:@"gms-%@-title", filenameMod]]; | 137 | CCSprite* titleSprite = [CCSprite spriteWithCGImage:titleImage key:[NSString stringWithFormat:@"gms-%@-title", name]]; |
| 154 | titleSprite.position = ccp(-10, (boxSize.height)/2+(combinedTitleSize.height)/2); | 138 | titleSprite.position = ccp(-10, (boxSize.height)/2+(combinedTitleSize.height)/2); |
| 155 | [self addChild:titleSprite]; | 139 | [self addChild:titleSprite]; |
| 156 | 140 | ||
| 157 | if (gameMode.unlocked) | 141 | Highscore* localHighscore = [Highscore localHighscoreForGameMode:name]; |
| 142 | |||
| 143 | if (localHighscore != nil) | ||
| 158 | { | 144 | { |
| 159 | Highscore* localHighscore = [Highscore localHighscoreForGameMode:name]; | 145 | // Render the highscore label |
| 146 | NSString* highscoreString = [NSString stringWithFormat:@"Highscore: %d", localHighscore.score]; | ||
| 147 | UIFont* highscoreFont = [UIFont fontWithName:@"AmericanTypewriter" size:16.0f]; | ||
| 148 | CGSize highscoreSize = [highscoreString sizeWithFont:highscoreFont]; | ||
| 160 | 149 | ||
| 161 | if (localHighscore != nil) | 150 | UIGraphicsBeginImageContext(CGSizeMake(highscoreSize.width+10, highscoreSize.height+10)); |
| 162 | { | 151 | CGContextRef context = UIGraphicsGetCurrentContext(); |
| 163 | // Render the highscore label | 152 | CGContextSetShadow(context, CGSizeMake(-6, 6), 4.0f); |
| 164 | NSString* highscoreString = [NSString stringWithFormat:@"Highscore: %d", localHighscore.score]; | 153 | [highscoreString drawInRect:CGRectMake(10, 0, highscoreSize.width, highscoreSize.height) withFont:highscoreFont]; |
| 165 | UIFont* highscoreFont = [UIFont fontWithName:@"AmericanTypewriter" size:16.0f]; | 154 | |
| 166 | CGSize highscoreSize = [highscoreString sizeWithFont:highscoreFont]; | 155 | CGImageRef highscoreImage = [UIGraphicsGetImageFromCurrentImageContext() CGImage]; |
| 167 | 156 | UIGraphicsEndImageContext(); | |
| 168 | UIGraphicsBeginImageContext(CGSizeMake(highscoreSize.width+10, highscoreSize.height+10)); | 157 | CCSprite* highscoreSprite = [CCSprite spriteWithCGImage:highscoreImage key:[NSString stringWithFormat:@"gms-%@-highscore-%d", name, localHighscore.score]]; |
| 169 | CGContextRef context = UIGraphicsGetCurrentContext(); | 158 | highscoreSprite.position = ccp(-5, 0-64-(highscoreSize.height)/2-10); |
| 170 | CGContextSetShadow(context, CGSizeMake(-6, 6), 4.0f); | 159 | [self addChild:highscoreSprite]; |
| 171 | [highscoreString drawInRect:CGRectMake(10, 0, highscoreSize.width, highscoreSize.height) withFont:highscoreFont]; | ||
| 172 | |||
| 173 | CGImageRef highscoreImage = [UIGraphicsGetImageFromCurrentImageContext() CGImage]; | ||
| 174 | UIGraphicsEndImageContext(); | ||
| 175 | CCSprite* highscoreSprite = [CCSprite spriteWithCGImage:highscoreImage key:[NSString stringWithFormat:@"gms-%@-highscore-%d", name, localHighscore.score]]; | ||
| 176 | highscoreSprite.position = ccp(-5, 0-64-(highscoreSize.height)/2-10); | ||
| 177 | [self addChild:highscoreSprite]; | ||
| 178 | } | ||
| 179 | } | 160 | } |
| 180 | } | 161 | } |
| 181 | 162 | ||
| @@ -184,18 +165,11 @@ | |||
| 184 | 165 | ||
| 185 | - (void)buttonTapped | 166 | - (void)buttonTapped |
| 186 | { | 167 | { |
| 187 | if (gameMode.unlocked) | 168 | if (delegate != nil) |
| 188 | { | 169 | { |
| 189 | if (delegate != nil) | 170 | [delegate didSelectGameMode:self]; |
| 190 | { | ||
| 191 | [delegate didSelectGameMode:self]; | ||
| 192 | } else { | ||
| 193 | NSLog(@"I don't have a GameModeSelectionDelegate to call for some reason..."); | ||
| 194 | } | ||
| 195 | } else { | 171 | } else { |
| 196 | UIAlertView* alertView = [[UIAlertView alloc] initWithTitle:@"To unlock this game mode:" message:gameMode.unlockCondition delegate:nil cancelButtonTitle:@"Cancel" otherButtonTitles:nil]; | 172 | NSLog(@"I don't have a GameModeSelectionDelegate to call for some reason..."); |
| 197 | [alertView show]; | ||
| 198 | [alertView release]; | ||
| 199 | } | 173 | } |
| 200 | } | 174 | } |
| 201 | 175 | ||
| diff --git a/Classes/GameModeSelectionLayer.m b/Classes/GameModeSelectionLayer.m index e5a83f1..4e51357 100644 --- a/Classes/GameModeSelectionLayer.m +++ b/Classes/GameModeSelectionLayer.m | |||
| @@ -45,8 +45,11 @@ | |||
| 45 | 45 | ||
| 46 | for (GameModeInfo* info in [[GameModeManager sharedInstance] gameModes]) | 46 | for (GameModeInfo* info in [[GameModeManager sharedInstance] gameModes]) |
| 47 | { | 47 | { |
| 48 | GameModeSelection* selection = [GameModeSelection selectionWithGameModeInfo:info]; | 48 | if (info.unlocked) |
| 49 | [gameModes addObject:selection]; | 49 | { |
| 50 | GameModeSelection* selection = [GameModeSelection selectionWithGameModeInfo:info]; | ||
| 51 | [gameModes addObject:selection]; | ||
| 52 | } | ||
| 50 | } | 53 | } |
| 51 | 54 | ||
| 52 | CCMenu* menu = [CCMenu menuWithItems:nil]; | 55 | CCMenu* menu = [CCMenu menuWithItems:nil]; |
| diff --git a/Classes/JumpGameMode.m b/Classes/JumpGameMode.m index b1c5989..3788c97 100644 --- a/Classes/JumpGameMode.m +++ b/Classes/JumpGameMode.m | |||
| @@ -45,11 +45,9 @@ static GameModeInfo* info; | |||
| 45 | location:@"Venice" | 45 | location:@"Venice" |
| 46 | numOfStars:3 | 46 | numOfStars:3 |
| 47 | imageFilename:[[NSBundle mainBundle] pathForResource:@"venice" ofType:@"png"] | 47 | imageFilename:[[NSBundle mainBundle] pathForResource:@"venice" ofType:@"png"] |
| 48 | unlocked:NO | 48 | unlocked:YES |
| 49 | unlockCondition:@"Get 2000 points in Collect!" | ||
| 50 | gameClass:[JumpGameMode class] | 49 | gameClass:[JumpGameMode class] |
| 51 | globalHighscoreKey:@"Jump" | 50 | globalHighscoreKey:@"Jump"]; |
| 52 | starsToUnlock:2]; | ||
| 53 | } | 51 | } |
| 54 | 52 | ||
| 55 | return info; | 53 | return info; |
| diff --git a/Classes/TutorialMode.m b/Classes/TutorialMode.m index 54f4e16..3f37505 100644 --- a/Classes/TutorialMode.m +++ b/Classes/TutorialMode.m | |||
| @@ -11,6 +11,7 @@ | |||
| 11 | #import "GameModeSelectionLayer.h" | 11 | #import "GameModeSelectionLayer.h" |
| 12 | #import "SimpleAudioEngine.h" | 12 | #import "SimpleAudioEngine.h" |
| 13 | #import "ClassicGameMode.h" | 13 | #import "ClassicGameMode.h" |
| 14 | #import "JumpGameMode.h" | ||
| 14 | 15 | ||
| 15 | // Item tags: | 16 | // Item tags: |
| 16 | // 2000 - first dropped item | 17 | // 2000 - first dropped item |
| @@ -42,10 +43,8 @@ static GameModeInfo* info; | |||
| 42 | numOfStars:0 | 43 | numOfStars:0 |
| 43 | imageFilename:[[NSBundle mainBundle] pathForResource:@"florence" ofType:@"png"] | 44 | imageFilename:[[NSBundle mainBundle] pathForResource:@"florence" ofType:@"png"] |
| 44 | unlocked:YES | 45 | unlocked:YES |
| 45 | unlockCondition:nil | ||
| 46 | gameClass:[TutorialMode class] | 46 | gameClass:[TutorialMode class] |
| 47 | globalHighscoreKey:nil | 47 | globalHighscoreKey:nil]; |
| 48 | starsToUnlock:0]; | ||
| 49 | } | 48 | } |
| 50 | 49 | ||
| 51 | return info; | 50 | return info; |
| @@ -379,6 +378,7 @@ static GameModeInfo* info; | |||
| 379 | [self unschedule:@selector(randomlyAddObject:)]; | 378 | [self unschedule:@selector(randomlyAddObject:)]; |
| 380 | 379 | ||
| 381 | [[ClassicGameMode info] unlock]; | 380 | [[ClassicGameMode info] unlock]; |
| 381 | [[JumpGameMode info] unlock]; | ||
| 382 | 382 | ||
| 383 | return; | 383 | return; |
| 384 | } else { | 384 | } else { |
