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 { |