summary refs log tree commit diff stats
path: root/Classes
diff options
context:
space:
mode:
Diffstat (limited to 'Classes')
-rwxr-xr-xClasses/Cart_CollectAppDelegate.m44
-rwxr-xr-xClasses/CocosOverlayScrollView.h19
-rwxr-xr-xClasses/CocosOverlayScrollView.m110
-rw-r--r--Classes/GameMode.h5
-rw-r--r--Classes/GameMode.m39
-rw-r--r--Classes/GameModeSelection.h30
-rw-r--r--Classes/GameModeSelection.m219
-rw-r--r--Classes/GameModeSelectionDelegate.h17
-rw-r--r--Classes/GameModeSelectionLayer.h25
-rw-r--r--Classes/GameModeSelectionLayer.m132
-rwxr-xr-xClasses/GameOverScene.m6
-rwxr-xr-xClasses/Highscore.h2
-rwxr-xr-xClasses/Highscore.m53
-rwxr-xr-xClasses/HighscoreListController.m37
-rwxr-xr-xClasses/MainMenuLayer.h3
-rwxr-xr-xClasses/MainMenuLayer.m31
-rwxr-xr-xClasses/NMPanelMenu.h14
-rwxr-xr-xClasses/NMPanelMenu.m37
-rwxr-xr-xClasses/TouchDelegatingView.h18
-rwxr-xr-xClasses/TouchDelegatingView.m26
-rw-r--r--Classes/TutorialMode.m58
-rw-r--r--Classes/UIImage+ColorMasking.h15
-rw-r--r--Classes/UIImage+ColorMasking.m77
23 files changed, 922 insertions, 95 deletions
diff --git a/Classes/Cart_CollectAppDelegate.m b/Classes/Cart_CollectAppDelegate.m index 158f660..ba9d60b 100755 --- a/Classes/Cart_CollectAppDelegate.m +++ b/Classes/Cart_CollectAppDelegate.m
@@ -13,6 +13,7 @@
13#import "GameMode.h" 13#import "GameMode.h"
14#import "RootViewController.h" 14#import "RootViewController.h"
15#import "MainMenuLayer.h" 15#import "MainMenuLayer.h"
16#import "TestFlight.h"
16 17
17@implementation Cart_CollectAppDelegate 18@implementation Cart_CollectAppDelegate
18 19
@@ -42,6 +43,9 @@
42 43
43- (void) applicationDidFinishLaunching:(UIApplication*)application 44- (void) applicationDidFinishLaunching:(UIApplication*)application
44{ 45{
46 // REMOVE THIS LINE FOR RELEASE BUILDS
47 [TestFlight takeOff:@"66a3925c85c93e7628c14d167ff6c1b7_MjM4MTEyMDExLTA4LTE3IDEzOjEyOjQ4Ljg2NDE2OQ"];
48
45 [[UIApplication sharedApplication] setIdleTimerDisabled:YES]; 49 [[UIApplication sharedApplication] setIdleTimerDisabled:YES];
46 50
47 NSMutableDictionary* registerDefaults = [NSMutableDictionary dictionaryWithObjectsAndKeys: 51 NSMutableDictionary* registerDefaults = [NSMutableDictionary dictionaryWithObjectsAndKeys:
@@ -138,6 +142,8 @@
138 142
139-(void) applicationDidEnterBackground:(UIApplication*)application { 143-(void) applicationDidEnterBackground:(UIApplication*)application {
140 [[CCDirector sharedDirector] stopAnimation]; 144 [[CCDirector sharedDirector] stopAnimation];
145
146 [[NSUserDefaults standardUserDefaults] synchronize];
141 147
142 if ([[CCDirector sharedDirector] runningScene].tag == GAME_SCENE) 148 if ([[CCDirector sharedDirector] runningScene].tag == GAME_SCENE)
143 { 149 {
@@ -190,20 +196,48 @@
190 { 196 {
191 NSString* databasePathFromApp = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:databaseName]; 197 NSString* databasePathFromApp = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:databaseName];
192 [fileManager copyItemAtPath:databasePathFromApp toPath:databasePath error:nil]; 198 [fileManager copyItemAtPath:databasePathFromApp toPath:databasePath error:nil];
193 //[fileManager release];
194 199
195 [userDefaults setInteger:1 forKey:@"databaseVersion"]; 200 [userDefaults setInteger:2 forKey:@"databaseVersion"];
201 }
202
203 if (sqlite3_open([databasePath UTF8String], &database) != SQLITE_OK)
204 {
205 NSLog(@"Failed to open database");
196 } 206 }
197 207
208 // Database migrations!
198 if ([userDefaults integerForKey:@"databaseVersion"] < 1) 209 if ([userDefaults integerForKey:@"databaseVersion"] < 1)
199 { 210 {
200 // Upgrade the database to version 1, which is completely unnecessary as no prior version exists 211 // Upgrade the database to version 1, which is completely unnecessary as no prior version exists
201 } 212 }
202 213
203 if (sqlite3_open([databasePath UTF8String], &database) != SQLITE_OK) 214 if ([userDefaults integerForKey:@"databaseVersion"] < 2)
204 { 215 {
205 NSLog(@"Failed to open database"); 216 // Database version 2 adds a "gameMode" column to highscores to allow for multiple highscore lists
217 const char* sqlQuery = "ALTER TABLE highscores ADD gameMode varchar(255)";
218 sqlite3_stmt* compiled_statement;
219
220 if (sqlite3_prepare_v2(database, sqlQuery, -1, &compiled_statement, NULL) == SQLITE_OK)
221 {
222 sqlite3_step(compiled_statement);
223
224 sqlQuery = "UPDATE highscores SET gameMode = \"Collect\"";
225 if (sqlite3_prepare_v2(database, sqlQuery, -1, &compiled_statement, NULL) == SQLITE_OK)
226 {
227 sqlite3_step(compiled_statement);
228
229 NSLog(@"Updated database to version 2.");
230 [userDefaults setInteger:2 forKey:@"databaseVersion"];
231 } else {
232 NSLog(@"Error while updating database to version 2. '%s'", sqlite3_errmsg(database));
233 }
234 } else {
235 NSLog(@"Error while updating database to version 2. '%s'", sqlite3_errmsg(database));
236 }
206 } 237 }
238
239 // It's rather important that the database version gets saved
240 [userDefaults synchronize];
207 } 241 }
208 242
209 return database; 243 return database;
diff --git a/Classes/CocosOverlayScrollView.h b/Classes/CocosOverlayScrollView.h new file mode 100755 index 0000000..ad8e83f --- /dev/null +++ b/Classes/CocosOverlayScrollView.h
@@ -0,0 +1,19 @@
1//
2// CocosOverlayScrollView.h
3// shapes
4//
5// Created by Nate Murray on 8/23/10.
6// Copyright 2010 LittleHiccup. All rights reserved.
7//
8
9#import <Foundation/Foundation.h>
10#import "cocos2d.h"
11
12@interface CocosOverlayScrollView : UIScrollView <UIScrollViewDelegate>
13{
14 CCNode* targetLayer;
15 UIPageControl* pageControl;
16}
17@property(nonatomic, retain) CCNode* targetLayer;
18-(id) initWithFrame: (CGRect) frameRect numPages: (int) numPages width: (float) width layer: (CCNode*) layer pageControl:(UIPageControl*)pageControl;
19@end
diff --git a/Classes/CocosOverlayScrollView.m b/Classes/CocosOverlayScrollView.m new file mode 100755 index 0000000..9db0575 --- /dev/null +++ b/Classes/CocosOverlayScrollView.m
@@ -0,0 +1,110 @@
1//
2// CocosOverlayScrollView.m
3// shapes
4//
5// Created by Nate Murray on 8/23/10.
6// Copyright 2010 LittleHiccup. All rights reserved.
7//
8
9#import "CocosOverlayScrollView.h"
10
11@implementation CocosOverlayScrollView
12@synthesize targetLayer;
13
14// Configure your favorite UIScrollView options here
15-(id) initWithFrame: (CGRect) frameRect numPages: (int) numPages width: (float) width layer: (CCNode*) layer pageControl:(UIPageControl *)m_pageControl{
16 if ((self = [super initWithFrame: frameRect])){
17 self.contentSize = CGSizeMake(width*numPages, 320);
18 self.bounces = YES;
19 self.delaysContentTouches = NO;
20 self.delegate = self;
21 self.pagingEnabled = YES;
22 self.scrollsToTop = NO;
23 self.showsVerticalScrollIndicator = NO;
24 self.showsHorizontalScrollIndicator = NO;
25 [self setUserInteractionEnabled:TRUE];
26 [self setScrollEnabled:TRUE];
27 self.targetLayer = layer;
28 // self.canCancelContentTouches = YES;
29 pageControl = m_pageControl;
30 }
31 return self;
32}
33
34-(void) touchesBegan: (NSSet *) touches withEvent: (UIEvent *) event
35{
36 if (!self.dragging)
37 {
38 // UITouch* touch = [[touches allObjects] objectAtIndex:0];
39 // CGPoint location = [touch locationInView: [[touch view] superview]];
40 // CCLOG(@"touch at l.x:%f l.y:%f", location.x, location.y);
41
42 [self.nextResponder touchesBegan: touches withEvent:event];
43 [[[CCDirector sharedDirector] openGLView] touchesBegan:touches withEvent:event];
44 }
45
46 [super touchesBegan: touches withEvent: event];
47}
48
49-(void) touchesEnded: (NSSet *) touches withEvent: (UIEvent *) event
50{
51 if (!self.dragging)
52 {
53 [self.nextResponder touchesEnded: touches withEvent:event];
54 [[[CCDirector sharedDirector] openGLView] touchesEnded:touches withEvent:event];
55 }
56
57 [super touchesEnded: touches withEvent: event];
58}
59
60-(void) touchesCancelled: (NSSet *) touches withEvent: (UIEvent *) event
61{
62 // if (!self.dragging)
63 // {
64 // CCLOG(@"CocosOverlayScrollView touchesEnded not dragging");
65 [self.nextResponder touchesCancelled: touches withEvent:event];
66 [[[CCDirector sharedDirector] openGLView] touchesCancelled:touches withEvent:event];
67 // }
68 [super touchesCancelled: touches withEvent: event];
69}
70
71
72- (void)scrollViewWillBeginDecelerating:(UIScrollView *)scrollView
73{
74 // TODO - Custom code for handling deceleration of the scroll view
75}
76
77- (void)scrollViewDidScroll:(UIScrollView *)scrollView
78{
79 CGPoint dragPt = [scrollView contentOffset];
80 dragPt = [[CCDirector sharedDirector] convertToGL:dragPt];
81
82 dragPt.y = dragPt.y * -1;
83 dragPt.x = dragPt.x * -1;
84
85 CGPoint newLayerPosition = CGPointMake(dragPt.x, dragPt.y);
86
87 [targetLayer setPosition:newLayerPosition];
88}
89
90- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
91{
92 // CGPoint dragPt = [scrollView contentOffset];
93 // etc.
94}
95
96-(void) dealloc {
97 self.targetLayer = nil;
98 [super dealloc];
99}
100
101- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
102{
103 int currentPage = (NSUInteger)(scrollView.contentOffset.x / scrollView.frame.size.width);
104 NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults];
105 [defaults setInteger:currentPage forKey:@"lastSelectedMode"];
106
107 [pageControl setCurrentPage:currentPage];
108}
109
110@end \ No newline at end of file
diff --git a/Classes/GameMode.h b/Classes/GameMode.h index 370550c..53ed9fc 100644 --- a/Classes/GameMode.h +++ b/Classes/GameMode.h
@@ -12,7 +12,7 @@
12#define GAME_SCENE 436 12#define GAME_SCENE 436
13#define GAME_LAYER 437 13#define GAME_LAYER 437
14 14
15@interface GameMode : CCLayer { 15@interface GameMode : CCLayer <UIAlertViewDelegate> {
16 NSMutableSet* objects; 16 NSMutableSet* objects;
17 int score; 17 int score;
18 int lives; 18 int lives;
@@ -25,11 +25,14 @@
25 CCLabelBMFont* livesLabel; 25 CCLabelBMFont* livesLabel;
26 26
27 void (^delayedAction)(void); 27 void (^delayedAction)(void);
28
29 BOOL isPaused;
28} 30}
29 31
30@property (readonly) Cart* cart; 32@property (readonly) Cart* cart;
31@property (nonatomic,assign) int score; 33@property (nonatomic,assign) int score;
32@property (nonatomic,assign) int lives; 34@property (nonatomic,assign) int lives;
35@property (readonly) BOOL isPaused;
33+ (CCScene*)scene; 36+ (CCScene*)scene;
34- (void)tick:(ccTime)dt; 37- (void)tick:(ccTime)dt;
35- (BOOL)canPause; 38- (BOOL)canPause;
diff --git a/Classes/GameMode.m b/Classes/GameMode.m index 7afbf20..8f695d1 100644 --- a/Classes/GameMode.m +++ b/Classes/GameMode.m
@@ -12,7 +12,7 @@
12 12
13@implementation GameMode 13@implementation GameMode
14 14
15@synthesize cart, score, lives; 15@synthesize cart, score, lives, isPaused;
16 16
17+ (CCScene*)scene 17+ (CCScene*)scene
18{ 18{
@@ -60,6 +60,8 @@
60 [pauseMenu setPosition:ccp(480-8-16, 320-8-16)]; 60 [pauseMenu setPosition:ccp(480-8-16, 320-8-16)];
61 [self addChild:pauseMenu]; 61 [self addChild:pauseMenu];
62 } 62 }
63
64 isPaused = NO;
63 } 65 }
64 66
65 return self; 67 return self;
@@ -98,8 +100,10 @@
98 100
99- (void)pause 101- (void)pause
100{ 102{
101 if ([self canPause]) 103 if (([self canPause]) && (!isPaused))
102 { 104 {
105 isPaused = YES;
106
103 [self pauseSchedulerAndActions]; 107 [self pauseSchedulerAndActions];
104 108
105 shadedLayer = [CCLayerColor layerWithColor:ccc4(0, 0, 0, 127)]; 109 shadedLayer = [CCLayerColor layerWithColor:ccc4(0, 0, 0, 127)];
@@ -126,18 +130,25 @@
126 130
127- (void)unpause 131- (void)unpause
128{ 132{
129 [[[CCDirector sharedDirector] runningScene] removeChild:shadedLayer cleanup:YES]; 133 if (isPaused)
130 [[[CCDirector sharedDirector] runningScene] removeChild:pauseLayer cleanup:YES]; 134 {
131 135 [[[CCDirector sharedDirector] runningScene] removeChild:shadedLayer cleanup:YES];
132 shadedLayer = nil; 136 [[[CCDirector sharedDirector] runningScene] removeChild:pauseLayer cleanup:YES];
133 pauseLayer = nil; 137
134 138 shadedLayer = nil;
135 [self resumeSchedulerAndActions]; 139 pauseLayer = nil;
140
141 [self resumeSchedulerAndActions];
142
143 isPaused = NO;
144 }
136} 145}
137 146
138- (void)mainmenu 147- (void)mainmenu
139{ 148{
140 [[CCDirector sharedDirector] replaceScene:[MainMenuLayer scene]]; 149 UIAlertView* alert = [[UIAlertView alloc] initWithTitle:@"Cartographic" message:@"Are you sure you want to quit the currently playing game?" delegate:self cancelButtonTitle:@"Yes" otherButtonTitles:@"No", nil];
150 [alert show];
151 [alert release];
141} 152}
142 153
143- (void)setScore:(int)m_score 154- (void)setScore:(int)m_score
@@ -170,6 +181,14 @@
170 delayedAction = nil; 181 delayedAction = nil;
171} 182}
172 183
184- (void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex
185{
186 if (buttonIndex == 0)
187 {
188 [[CCDirector sharedDirector] replaceScene:[MainMenuLayer scene]];
189 }
190}
191
173- (void)dealloc 192- (void)dealloc
174{ 193{
175 [objects release]; 194 [objects release];
diff --git a/Classes/GameModeSelection.h b/Classes/GameModeSelection.h new file mode 100644 index 0000000..bdb38fb --- /dev/null +++ b/Classes/GameModeSelection.h
@@ -0,0 +1,30 @@
1//
2// GameModeSelection.h
3// Cartographic
4//
5// Created by Starla Insigna on 8/18/11.
6// Copyright 2011 Four Island. All rights reserved.
7//
8
9#import "cocos2d.h"
10#import "GameModeSelectionDelegate.h"
11
12@interface GameModeSelection : CCMenuItem {
13 NSString* name;
14 NSString* location;
15 BOOL unlocked;
16 NSString* unlockCondition;
17 id<GameModeSelectionDelegate> delegate;
18}
19
20@property (readonly) NSString* name;
21@property (readonly) NSString* location;
22@property (readonly) BOOL unlocked;
23@property (nonatomic,retain) id<GameModeSelectionDelegate> delegate;
24+ (id)selectionWithName:(NSString*)name location:(NSString*)location filename:(NSString*)filename unlocked:(BOOL)unlocked;
25+ (id)selectionWithName:(NSString *)name location:(NSString *)location filename:(NSString *)filename unlockCondition:(NSString*)unlockCondition;
26- (id)initWithName:(NSString*)name location:(NSString*)location filename:(NSString*)filename unlocked:(BOOL)unlocked;
27- (id)initWithName:(NSString *)name location:(NSString *)location filename:(NSString *)filename unlockCondition:(NSString*)unlockCondition;
28- (void)buttonTapped;
29
30@end
diff --git a/Classes/GameModeSelection.m b/Classes/GameModeSelection.m new file mode 100644 index 0000000..69f1ddb --- /dev/null +++ b/Classes/GameModeSelection.m
@@ -0,0 +1,219 @@
1//
2// GameModeSelection.m
3// Cartographic
4//
5// Created by Starla Insigna on 8/18/11.
6// Copyright 2011 Four Island. All rights reserved.
7//
8
9#import "GameModeSelection.h"
10#import "UIImage+ColorMasking.h"
11#import "NMPanelMenu.h"
12#import "Highscore.h"
13
14@implementation GameModeSelection
15
16@synthesize name, location, unlocked, delegate;
17
18+ (id)selectionWithName:(NSString*)name location:(NSString*)location filename:(NSString*)filename unlocked:(BOOL)unlocked
19{
20 return [[[GameModeSelection alloc] initWithName:name location:location filename:filename unlocked:unlocked] autorelease];
21}
22
23+ (id)selectionWithName:(NSString *)name location:(NSString *)location filename:(NSString *)filename unlockCondition:(NSString*)unlockCondition
24{
25 return [[[GameModeSelection alloc] initWithName:name location:location filename:filename unlockCondition:unlockCondition] autorelease];
26}
27
28- (id)initWithName:(NSString*)m_name location:(NSString*)m_location filename:(NSString*)filename unlocked:(BOOL)m_unlocked;
29{
30 self = [super initWithTarget:nil selector:nil];
31
32 if (nil != self)
33 {
34 self.anchorPoint = CGPointMake(0.5f, 0.5f);
35
36 name = m_name;
37 location = m_location;
38 unlocked = m_unlocked;
39
40 contentSize_ = CGSizeMake(128, 320);
41
42 NSString* filenameMod;
43
44 if (unlocked)
45 {
46 filenameMod = [NSString stringWithFormat:@"%@-unlocked", filename];
47 } else {
48 filenameMod = [NSString stringWithFormat:@"%@-locked", filename];
49 name = [@"" stringByPaddingToLength:name.length withString:@"?" startingAtIndex:0];
50 location = [@"" stringByPaddingToLength:location.length withString:@"?" startingAtIndex:0];
51 }
52
53 // First, create the frame that we will put the level picture inside
54 CGImageRef framestuff = [[UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"framestuff" ofType:@"png"]] CGImage];
55 CGImageRef topLeftRef = CGImageCreateWithImageInRect(framestuff, CGRectMake(0, 0, 8, 8));
56 CGImageRef topRightRef = CGImageCreateWithImageInRect(framestuff, CGRectMake(8, 0, 8, 8));
57 CGImageRef bottomLeftRef = CGImageCreateWithImageInRect(framestuff, CGRectMake(0, 8, 8, 8));
58 CGImageRef bottomRightRef = CGImageCreateWithImageInRect(framestuff, CGRectMake(8, 8, 8, 8));
59 CGImageRef topBorderRef = CGImageCreateWithImageInRect(framestuff, CGRectMake(0, 16, 8, 8));
60 CGImageRef leftBorderRef = CGImageCreateWithImageInRect(framestuff, CGRectMake(8, 16, 8, 8));
61 CGImageRef rightBorderRef = CGImageCreateWithImageInRect(framestuff, CGRectMake(0, 24, 8, 8));
62 CGImageRef bottomBorderRef = CGImageCreateWithImageInRect(framestuff, CGRectMake(8, 24, 8, 8));
63 UIImage* topLeft = [UIImage imageWithCGImage:topLeftRef];
64 UIImage* topRight = [UIImage imageWithCGImage:topRightRef];
65 UIImage* bottomLeft = [UIImage imageWithCGImage:bottomLeftRef];
66 UIImage* bottomRight = [UIImage imageWithCGImage:bottomRightRef];
67 UIImage* topBorder = [UIImage imageWithCGImage:topBorderRef];
68 UIImage* leftBorder = [UIImage imageWithCGImage:leftBorderRef];
69 UIImage* rightBorder = [UIImage imageWithCGImage:rightBorderRef];
70 UIImage* bottomBorder = [UIImage imageWithCGImage:bottomBorderRef];
71 CGImageRelease(topLeftRef);
72 CGImageRelease(topRightRef);
73 CGImageRelease(bottomLeftRef);
74 CGImageRelease(bottomRightRef);
75 CGImageRelease(topBorderRef);
76 CGImageRelease(leftBorderRef);
77 CGImageRelease(rightBorderRef);
78 CGImageRelease(bottomBorderRef);
79
80 CGSize boxSize = CGSizeMake(128+12, 128+12);
81 UIGraphicsBeginImageContext(boxSize);
82 CGContextRef context = UIGraphicsGetCurrentContext();
83 [topLeft drawInRect:CGRectMake(0, 0, 8, 8)];
84 [topBorder drawInRect:CGRectMake(8, 0, boxSize.width-16, 8)];
85 [topRight drawInRect:CGRectMake(8+boxSize.width-16, 0, 8, 8)];
86 [rightBorder drawInRect:CGRectMake(8+boxSize.width-16, 8, 8, boxSize.height-16)];
87 [bottomRight drawInRect:CGRectMake(8+boxSize.width-16, 8+boxSize.height-16, 8, 8)];
88 [bottomBorder drawInRect:CGRectMake(8, 8+boxSize.height-16, boxSize.width-16, 8)];
89 [bottomLeft drawInRect:CGRectMake(0, 8+boxSize.height-16, 8, 8)];
90 [leftBorder drawInRect:CGRectMake(0, 8, 8, boxSize.height-16)];
91 CGContextSetFillColorWithColor(context, [[UIColor whiteColor] CGColor]);
92 CGContextFillRect(context, CGRectMake(8, 8, boxSize.width-16, boxSize.height-16));
93 UIImage* selectionBackground = UIGraphicsGetImageFromCurrentImageContext();
94
95 // Now we want to put the level image inside the frame without messing up the frame itself
96 UIImage* innerPicture = [UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:filename ofType:@"png"]];
97 CGContextClipToMask(context, CGRectMake(0, 0, boxSize.width, boxSize.height), [[selectionBackground opaqueMaskFromWhiteImage] CGImage]);
98 [innerPicture drawInRect:CGRectMake(6, 6, 128, 128)];
99 selectionBackground = UIGraphicsGetImageFromCurrentImageContext();
100 UIGraphicsEndImageContext();
101
102 // The frame needs a shadow, so let's redraw it in a new context
103 UIGraphicsBeginImageContext(CGSizeMake(boxSize.width+10, boxSize.height+10));
104 context = UIGraphicsGetCurrentContext();
105 CGContextSaveGState(context);
106
107 if (unlocked)
108 {
109 CGContextSetShadow(context, CGSizeMake(-6, 6), 4.0f);
110 [selectionBackground drawInRect:CGRectMake(10, 0, boxSize.width, boxSize.height)];
111 } else {
112 // Draw the picture in grayscale if the level has not yet been unlocked
113 CGContextClipToMask(context, CGRectMake(10, 0, boxSize.width, boxSize.height), [selectionBackground CGImage]);
114 CGContextSetFillColorWithColor(context, [[UIColor whiteColor] CGColor]);
115 CGContextFillRect(context, CGRectMake(10, 0, boxSize.width, boxSize.height));
116 CGContextRestoreGState(context);
117
118 CGContextSaveGState(context);
119 CGContextSetShadow(context, CGSizeMake(-6, 6), 4.0f);
120 [selectionBackground drawInRect:CGRectMake(10, 0, boxSize.width, boxSize.height) blendMode:kCGBlendModeLuminosity alpha:1.0];
121 }
122
123 CGContextRestoreGState(context);
124 CGImageRef pictureRef = [UIGraphicsGetImageFromCurrentImageContext() CGImage];
125
126 CCSprite* picture = [CCSprite spriteWithCGImage:pictureRef key:[NSString stringWithFormat:@"gms-%@", filenameMod]];
127
128 // We're also going to need a "selected" image state for the button
129 CGContextSaveGState(context);
130 CGContextClipToMask(context, CGRectMake(10, 0, boxSize.width, boxSize.height), [selectionBackground CGImage]);
131 CGContextSetFillColorWithColor(context, [[UIColor colorWithRed:0 green:0 blue:0 alpha:0.5] CGColor]);
132 CGContextFillRect(context, CGRectMake(10, 0, boxSize.width, boxSize.height));
133 CGContextRestoreGState(context);
134 CGImageRef selectedButtonRef = [UIGraphicsGetImageFromCurrentImageContext() CGImage];
135 UIGraphicsEndImageContext();
136 CCSprite* selectedButton = [CCSprite spriteWithCGImage:selectedButtonRef key:[NSString stringWithFormat:@"gms-%@-selected", filenameMod]];
137
138 CCMenuItemSprite* pictureMenuItem = [CCMenuItemSprite itemFromNormalSprite:picture selectedSprite:selectedButton target:self selector:@selector(buttonTapped)];
139 NMPanelMenu* theMenu = [NMPanelMenu menuWithItems:pictureMenuItem, nil];
140 theMenu.position = ccp(-5, 0);
141 [self addChild:theMenu];
142
143 // Render the titles
144 UIFont* titleFont = [UIFont fontWithName:@"AmericanTypewriter-Bold" size:18.0f];
145 CGSize titleSize = [location sizeWithFont:titleFont constrainedToSize:CGSizeMake(128, 0)];
146 UIFont* subtitleFont = [UIFont fontWithName:@"AmericanTypewriter" size:18.0f];
147 CGSize subtitleSize = [name sizeWithFont:subtitleFont constrainedToSize:CGSizeMake(128, 0)];
148 CGSize combinedTitleSize = CGSizeMake(128, titleSize.height + 10 + subtitleSize.height + 10);
149
150 UIGraphicsBeginImageContext(combinedTitleSize);
151 context = UIGraphicsGetCurrentContext();
152 CGContextSetShadow(context, CGSizeMake(-6, 6), 4.0f);
153 [location drawInRect:CGRectMake(10, 0, 128, titleSize.height) withFont:titleFont lineBreakMode:UILineBreakModeWordWrap alignment:UITextAlignmentCenter];
154 [name drawInRect:CGRectMake(10, titleSize.height, 128, subtitleSize.height) withFont:subtitleFont lineBreakMode:UILineBreakModeWordWrap alignment:UITextAlignmentCenter];
155
156 CGImageRef titleImage = [UIGraphicsGetImageFromCurrentImageContext() CGImage];
157 UIGraphicsEndImageContext();
158 CCSprite* titleSprite = [CCSprite spriteWithCGImage:titleImage key:[NSString stringWithFormat:@"gms-%@-title", filenameMod]];
159 titleSprite.position = ccp(-10, (boxSize.height)/2+(combinedTitleSize.height)/2);
160 [self addChild:titleSprite];
161
162 if (unlocked)
163 {
164 Highscore* localHighscore = [Highscore localHighscoreForGameMode:name];
165
166 if (localHighscore != nil)
167 {
168 // Render the highscore label
169 NSString* highscoreString = [NSString stringWithFormat:@"Highscore: %d", localHighscore.score];
170 UIFont* highscoreFont = [UIFont fontWithName:@"AmericanTypewriter" size:16.0f];
171 CGSize highscoreSize = [highscoreString sizeWithFont:highscoreFont];
172
173 UIGraphicsBeginImageContext(CGSizeMake(highscoreSize.width+10, highscoreSize.height+10));
174 CGContextRef context = UIGraphicsGetCurrentContext();
175 CGContextSetShadow(context, CGSizeMake(-6, 6), 4.0f);
176 [highscoreString drawInRect:CGRectMake(10, 0, highscoreSize.width, highscoreSize.height) withFont:highscoreFont];
177
178 CGImageRef highscoreImage = [UIGraphicsGetImageFromCurrentImageContext() CGImage];
179 UIGraphicsEndImageContext();
180 CCSprite* highscoreSprite = [CCSprite spriteWithCGImage:highscoreImage key:[NSString stringWithFormat:@"gms-%@-highscore", filename]];
181 highscoreSprite.position = ccp(-5, 0-64-(highscoreSize.height)/2-10);
182 [self addChild:highscoreSprite];
183 }
184 }
185 }
186
187 return self;
188}
189
190- (id)initWithName:(NSString *)m_name location:(NSString *)m_location filename:(NSString *)m_filename unlockCondition:(NSString*)m_unlockCondition
191{
192 self = [self initWithName:m_name location:m_location filename:m_filename unlocked:NO];
193
194 if (nil != self)
195 {
196 unlockCondition = m_unlockCondition;
197 }
198
199 return self;
200}
201
202- (void)buttonTapped
203{
204 if (unlocked)
205 {
206 if (delegate != nil)
207 {
208 [delegate didSelectGameMode:self];
209 } else {
210 NSLog(@"I don't have a GameModeSelectionDelegate to call for some reason...");
211 }
212 } else {
213 UIAlertView* alertView = [[UIAlertView alloc] initWithTitle:@"To unlock this game mode:" message:unlockCondition delegate:nil cancelButtonTitle:@"Cancel" otherButtonTitles:nil];
214 [alertView show];
215 [alertView release];
216 }
217}
218
219@end
diff --git a/Classes/GameModeSelectionDelegate.h b/Classes/GameModeSelectionDelegate.h new file mode 100644 index 0000000..854a980 --- /dev/null +++ b/Classes/GameModeSelectionDelegate.h
@@ -0,0 +1,17 @@
1//
2// GameModeSelectionDelegate.h
3// Cartographic
4//
5// Created by Starla Insigna on 8/23/11.
6// Copyright 2011 Four Island. All rights reserved.
7//
8
9#import <Foundation/Foundation.h>
10
11@class GameModeSelection;
12
13@protocol GameModeSelectionDelegate <NSObject>
14
15- (void)didSelectGameMode:(GameModeSelection*)gameMode;
16
17@end
diff --git a/Classes/GameModeSelectionLayer.h b/Classes/GameModeSelectionLayer.h new file mode 100644 index 0000000..478a173 --- /dev/null +++ b/Classes/GameModeSelectionLayer.h
@@ -0,0 +1,25 @@
1//
2// GameModeSelectionLayer.h
3// Cartographic
4//
5// Created by Starla Insigna on 8/18/11.
6// Copyright 2011 Four Island. All rights reserved.
7//
8
9#import "cocos2d.h"
10#import "TouchDelegatingView.h"
11#import "CocosOverlayScrollView.h"
12#import "GameModeSelectionDelegate.h"
13
14@interface GameModeSelectionLayer : CCLayer <GameModeSelectionDelegate> {
15 NSMutableArray* gameModes;
16 TouchDelegatingView* touchDelegatingView;
17 CocosOverlayScrollView* scrollView;
18 UIPageControl* pageControl;
19}
20
21+ (CCScene*)scene;
22- (id)init;
23- (void)mainmenu;
24
25@end
diff --git a/Classes/GameModeSelectionLayer.m b/Classes/GameModeSelectionLayer.m new file mode 100644 index 0000000..db08146 --- /dev/null +++ b/Classes/GameModeSelectionLayer.m
@@ -0,0 +1,132 @@
1//
2// GameModeSelectionLayer.m
3// Cartographic
4//
5// Created by Starla Insigna on 8/18/11.
6// Copyright 2011 Four Island. All rights reserved.
7//
8
9#import "GameModeSelectionLayer.h"
10#import "GameModeSelection.h"
11#import <sqlite3.h>
12#import "Cart_CollectAppDelegate.h"
13#import "MainMenuLayer.h"
14#import "TutorialMode.h"
15#import "ClassicGameMode.h"
16#import "NMPanelMenu.h"
17
18@implementation GameModeSelectionLayer
19
20+ (CCScene*)scene
21{
22 CCScene* scene = [CCScene node];
23
24 CCLayer* backgroundLayer = [[[CCLayer alloc] init] autorelease];
25 CCSprite* backgroundImage = [CCSprite spriteWithFile:@"paintdaubs.png"];
26 backgroundImage.position = ccp(240,160);
27 [backgroundLayer addChild:backgroundImage];
28 [scene addChild:backgroundLayer];
29
30 GameModeSelectionLayer* layer = [GameModeSelectionLayer node];
31 [scene addChild:layer];
32
33 return scene;
34}
35
36- (id)init
37{
38 self = [super init];
39
40 if (nil != self)
41 {
42 NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults];
43 gameModes = [[NSMutableArray alloc] init];
44
45 GameModeSelection* tutorialSelection = [GameModeSelection selectionWithName:@"Tutorial" location:@"Florence" filename:@"florence" unlocked:YES];
46 [gameModes addObject:tutorialSelection];
47
48 GameModeSelection* collectSelection;
49
50 if ([defaults boolForKey:@"hasDoneTutorial"])
51 {
52 collectSelection = [GameModeSelection selectionWithName:@"Collect" location:@"Paris" filename:@"paris" unlocked:YES];
53 } else {
54 collectSelection = [GameModeSelection selectionWithName:@"Collect" location:@"Paris" filename:@"paris" unlockCondition:@"Beat the tutorial!"];
55 }
56
57 [gameModes addObject:collectSelection];
58
59 CCMenu* menu = [CCMenu menuWithItems:nil];
60 float onePanelWide = 128;
61 float padding = 15;
62 float totalPanelWidth = onePanelWide + padding*2;
63 float numberOfPanels = [gameModes count];
64 float totalWidth = numberOfPanels * totalPanelWidth;
65 int currentWorldOffset = [defaults integerForKey:@"lastSelectedMode"];
66 CCLayer* panels = [CCLayer node];
67
68 for (GameModeSelection* gameMode in gameModes)
69 {
70 [gameMode setDelegate:self];
71 [menu addChild:gameMode];
72 }
73
74 [menu alignItemsHorizontallyWithPadding:padding*2];
75 [panels addChild:menu];
76 [self addChild:panels];
77
78 pageControl = [[UIPageControl alloc] init];
79 pageControl.numberOfPages = numberOfPanels;
80 pageControl.currentPage = currentWorldOffset;
81 pageControl.frame = CGRectMake(0, 250, 480, 20);
82
83 menu.position = ccpAdd(menu.position, ccp(totalWidth/2 - totalPanelWidth/2, 320));
84 touchDelegatingView = [[TouchDelegatingView alloc] initWithFrame:CGRectMake(0, 0, 480, 320)];
85 scrollView = [[CocosOverlayScrollView alloc] initWithFrame:CGRectMake(0, 0, totalPanelWidth, 320) numPages:numberOfPanels width:totalPanelWidth layer:panels pageControl:pageControl];
86 touchDelegatingView.scrollView = scrollView;
87 [scrollView setContentOffset:CGPointMake(currentWorldOffset*totalPanelWidth+1,0) animated:NO];
88
89 CCMenuItemImage* newgameMenuItem = [CCMenuItemImage itemFromNormalImage:@"back.png" selectedImage:@"back2.png" target:self selector:@selector(mainmenu)];
90 NMPanelMenu* myMenu = [NMPanelMenu menuWithItems:newgameMenuItem, nil];
91 myMenu.position = ccp(240, 30);
92 [self addChild:myMenu];
93 }
94
95 return self;
96}
97
98- (void)onEnterTransitionDidFinish
99{
100 [super onEnterTransitionDidFinish];
101
102 [[[CCDirector sharedDirector] openGLView] addSubview:pageControl];
103 [[[CCDirector sharedDirector] openGLView] addSubview:touchDelegatingView];
104 [[[CCDirector sharedDirector] openGLView] addSubview:scrollView];
105}
106
107- (void)onExit
108{
109 [super onExit];
110
111 [touchDelegatingView removeFromSuperview];
112 [scrollView removeFromSuperview];
113 [pageControl removeFromSuperview];
114}
115
116- (void)mainmenu
117{
118 [[CCDirector sharedDirector] replaceScene:[MainMenuLayer scene]];
119}
120
121- (void)didSelectGameMode:(GameModeSelection *)gameMode
122{
123 if ([gameMode.name isEqual:@"Tutorial"])
124 {
125 [[CCDirector sharedDirector] replaceScene:[TutorialMode scene]];
126 } else if ([gameMode.name isEqual:@"Collect"])
127 {
128 [[CCDirector sharedDirector] replaceScene:[ClassicGameMode scene]];
129 }
130}
131
132@end
diff --git a/Classes/GameOverScene.m b/Classes/GameOverScene.m index bc081ff..94236ff 100755 --- a/Classes/GameOverScene.m +++ b/Classes/GameOverScene.m
@@ -88,15 +88,15 @@
88 textField.enabled = NO; 88 textField.enabled = NO;
89 submitSwitch.enabled = NO; 89 submitSwitch.enabled = NO;
90 90
91 const char* sqlQuery = [[NSString stringWithFormat:@"INSERT INTO highscores (name, score) VALUES (\"%@\",%d)", [textField text], score] UTF8String]; 91 const char* sqlQuery = [[NSString stringWithFormat:@"INSERT INTO highscores (name, score, gameMode) VALUES (\"%@\",%d,\"Collect\")", [textField text], score] UTF8String];
92 sqlite3_stmt* compiled_statement; 92 sqlite3_stmt* compiled_statement;
93 93
94 if (sqlite3_prepare_v2([Cart_CollectAppDelegate database], sqlQuery, -1, &compiled_statement, NULL) == SQLITE_OK) 94 if (sqlite3_prepare_v2([Cart_CollectAppDelegate database], sqlQuery, -1, &compiled_statement, NULL) == SQLITE_OK)
95 { 95 {
96 sqlite3_step(compiled_statement); 96 sqlite3_step(compiled_statement);
97 NSLog(@"awesome, %@", [textField text]); 97 NSLog(@"awesome, %@, %d", [textField text], score);
98 } else { 98 } else {
99 NSAssert1(0, @"Error while creating add statement. '%s'", sqlite3_errmsg([Cart_CollectAppDelegate database])); 99 NSLog(@"Error while adding highscore to local highscore list. '%s'", sqlite3_errmsg([Cart_CollectAppDelegate database]));
100 } 100 }
101 101
102 if (submitSwitch.on) 102 if (submitSwitch.on)
diff --git a/Classes/Highscore.h b/Classes/Highscore.h index bc6a8fb..fa2ea71 100755 --- a/Classes/Highscore.h +++ b/Classes/Highscore.h
@@ -17,6 +17,8 @@
17@property (readonly) NSString* name; 17@property (readonly) NSString* name;
18@property (readonly) int score; 18@property (readonly) int score;
19@property (readonly) NSDate* date; 19@property (readonly) NSDate* date;
20+ (NSArray*)localHighscoreListForGameMode:(NSString*)gameMode;
21+ (Highscore*)localHighscoreForGameMode:(NSString*)gameMode;
20- (id)initWithName:(NSString*)name score:(int)score date:(NSDate*)date; 22- (id)initWithName:(NSString*)name score:(int)score date:(NSDate*)date;
21 23
22@end 24@end
diff --git a/Classes/Highscore.m b/Classes/Highscore.m index 20ce56f..546cbfe 100755 --- a/Classes/Highscore.m +++ b/Classes/Highscore.m
@@ -7,11 +7,64 @@
7// 7//
8 8
9#import "Highscore.h" 9#import "Highscore.h"
10#import <sqlite3.h>
11#import "Cart_CollectAppDelegate.h"
10 12
11@implementation Highscore 13@implementation Highscore
12 14
13@synthesize name, score, date; 15@synthesize name, score, date;
14 16
17+ (NSArray*)localHighscoreListForGameMode:(NSString*)gameMode
18{
19 NSMutableArray* highscores = [NSMutableArray arrayWithCapacity:15];
20 const char* sqlQuery = [[NSString stringWithFormat:@"SELECT * FROM highscores WHERE gameMode = \"%@\" ORDER BY score DESC LIMIT 15", gameMode] UTF8String];
21 sqlite3_stmt* compiled_statement;
22
23 if (sqlite3_prepare_v2([Cart_CollectAppDelegate database], sqlQuery, -1, &compiled_statement, NULL) == SQLITE_OK)
24 {
25 while (sqlite3_step(compiled_statement) == SQLITE_ROW)
26 {
27 NSString* name = [NSString stringWithUTF8String:(char*)sqlite3_column_text(compiled_statement, 1)];
28 int score = sqlite3_column_int(compiled_statement, 2);
29
30 NSDate* date = nil;
31 char* dateStr = (char*)sqlite3_column_text(compiled_statement, 3);
32 if (dateStr != NULL)
33 {
34 NSString* theDate = [NSString stringWithUTF8String:dateStr];
35 NSDateComponents* comps = [[NSDateComponents alloc] init];
36 [comps setYear:[[theDate substringToIndex:4] intValue]];
37 [comps setMonth:[[theDate substringWithRange:NSMakeRange(5, 2)] intValue]];
38 [comps setDay:[[theDate substringWithRange:NSMakeRange(8, 2)] intValue]];
39 [comps setHour:[[theDate substringWithRange:NSMakeRange(11, 2)] intValue]];
40 [comps setMinute:[[theDate substringWithRange:NSMakeRange(14, 2)] intValue]];
41 [comps setSecond:[[theDate substringWithRange:NSMakeRange(17, 2)] intValue]];
42 date = [[NSCalendar currentCalendar] dateFromComponents:comps];
43 date = [date dateByAddingTimeInterval:[[NSTimeZone localTimeZone] secondsFromGMT]];
44 [comps release];
45 }
46
47 Highscore* highscore = [[Highscore alloc] initWithName:name score:score date:date];
48 [highscores addObject:highscore];
49 [highscore release];
50 }
51 }
52
53 return [highscores copy];
54}
55
56+ (Highscore*)localHighscoreForGameMode:(NSString*)gameMode
57{
58 NSArray* localHighscores = [Highscore localHighscoreListForGameMode:gameMode];
59
60 if ([localHighscores count] > 0)
61 {
62 return [localHighscores objectAtIndex:0];
63 } else {
64 return nil;
65 }
66}
67
15- (id)initWithName:(NSString*)m_name score:(int)m_score date:(NSDate*)m_date 68- (id)initWithName:(NSString*)m_name score:(int)m_score date:(NSDate*)m_date
16{ 69{
17 self = [super init]; 70 self = [super init];
diff --git a/Classes/HighscoreListController.m b/Classes/HighscoreListController.m index 932b147..d7bffcb 100755 --- a/Classes/HighscoreListController.m +++ b/Classes/HighscoreListController.m
@@ -10,7 +10,6 @@
10#import "Highscore.h" 10#import "Highscore.h"
11#import "RootViewController.h" 11#import "RootViewController.h"
12#import "cocoslive.h" 12#import "cocoslive.h"
13#import <sqlite3.h>
14#import "Cart_CollectAppDelegate.h" 13#import "Cart_CollectAppDelegate.h"
15 14
16@implementation HighscoreListController 15@implementation HighscoreListController
@@ -23,41 +22,7 @@
23 // Override initWithStyle: if you create the controller programmatically and want to perform customization that is not appropriate for viewDidLoad. 22 // Override initWithStyle: if you create the controller programmatically and want to perform customization that is not appropriate for viewDidLoad.
24 self = [super initWithStyle:style]; 23 self = [super initWithStyle:style];
25 if (self) { 24 if (self) {
26 NSMutableArray* highscores = [NSMutableArray arrayWithCapacity:15]; 25 localHighscores = [Highscore localHighscoreListForGameMode:@"Collect"];
27 const char* sqlQuery = "SELECT * FROM highscores ORDER BY score DESC LIMIT 15";
28 sqlite3_stmt* compiled_statement;
29
30 if (sqlite3_prepare_v2([Cart_CollectAppDelegate database], sqlQuery, -1, &compiled_statement, NULL) == SQLITE_OK)
31 {
32 while (sqlite3_step(compiled_statement) == SQLITE_ROW)
33 {
34 NSString* name = [NSString stringWithUTF8String:(char*)sqlite3_column_text(compiled_statement, 1)];
35 int score = sqlite3_column_int(compiled_statement, 2);
36
37 NSDate* date = nil;
38 char* dateStr = (char*)sqlite3_column_text(compiled_statement, 3);
39 if (dateStr != NULL)
40 {
41 NSString* theDate = [NSString stringWithUTF8String:dateStr];
42 NSDateComponents* comps = [[NSDateComponents alloc] init];
43 [comps setYear:[[theDate substringToIndex:4] intValue]];
44 [comps setMonth:[[theDate substringWithRange:NSMakeRange(5, 2)] intValue]];
45 [comps setDay:[[theDate substringWithRange:NSMakeRange(8, 2)] intValue]];
46 [comps setHour:[[theDate substringWithRange:NSMakeRange(11, 2)] intValue]];
47 [comps setMinute:[[theDate substringWithRange:NSMakeRange(14, 2)] intValue]];
48 [comps setSecond:[[theDate substringWithRange:NSMakeRange(17, 2)] intValue]];
49 date = [[NSCalendar currentCalendar] dateFromComponents:comps];
50 date = [date dateByAddingTimeInterval:[[NSTimeZone localTimeZone] secondsFromGMT]];
51 [comps release];
52 }
53
54 Highscore* highscore = [[Highscore alloc] initWithName:name score:score date:date];
55 [highscores addObject:highscore];
56 [highscore release];
57 }
58 }
59
60 localHighscores = [highscores copy];
61 26
62 navigationBar = [[UINavigationBar alloc] initWithFrame:CGRectMake(0, 0, 320, 44)]; 27 navigationBar = [[UINavigationBar alloc] initWithFrame:CGRectMake(0, 0, 320, 44)];
63 myNavigationItem = [[UINavigationItem alloc] initWithTitle:@"Highscores"]; 28 myNavigationItem = [[UINavigationItem alloc] initWithTitle:@"Highscores"];
diff --git a/Classes/MainMenuLayer.h b/Classes/MainMenuLayer.h index c7e3348..439056c 100755 --- a/Classes/MainMenuLayer.h +++ b/Classes/MainMenuLayer.h
@@ -16,8 +16,7 @@
16+ (CCScene*)scene; 16+ (CCScene*)scene;
17- (id)init; 17- (id)init;
18- (void)newgame; 18- (void)newgame;
19- (void)tutorial;
20- (void)jump;
21- (void)highscores; 19- (void)highscores;
20- (void)feedback;
22 21
23@end 22@end
diff --git a/Classes/MainMenuLayer.m b/Classes/MainMenuLayer.m index cf4b8cf..d4a6331 100755 --- a/Classes/MainMenuLayer.m +++ b/Classes/MainMenuLayer.m
@@ -8,10 +8,9 @@
8 8
9#import "MainMenuLayer.h" 9#import "MainMenuLayer.h"
10#import "HighscoreListController.h" 10#import "HighscoreListController.h"
11#import "ClassicGameMode.h" 11#import "GameModeSelectionLayer.h"
12#import "TutorialMode.h"
13#import "Cart_CollectAppDelegate.h" 12#import "Cart_CollectAppDelegate.h"
14#import "JumpGameMode.h" 13#import "TestFlight.h"
15 14
16@implementation MainMenuLayer 15@implementation MainMenuLayer
17 16
@@ -35,7 +34,7 @@
35 backgroundImage.position = ccp(240,160); 34 backgroundImage.position = ccp(240,160);
36 [self addChild:backgroundImage]; 35 [self addChild:backgroundImage];
37 36
38 CCLabelBMFont* titleText = [CCLabelBMFont labelWithString:@"Cart Collect - The Game!" fntFile:@"getoffthatboatrightnowyounglady.fnt"]; 37 CCLabelBMFont* titleText = [CCLabelBMFont labelWithString:@"Cartographic - The Game!" fntFile:@"getoffthatboatrightnowyounglady.fnt"];
39 titleText.position = ccp(240, 320-64); 38 titleText.position = ccp(240, 320-64);
40 [self addChild:titleText]; 39 [self addChild:titleText];
41 40
@@ -46,11 +45,10 @@
46 //CCMenuItemLabel* menuItem2 = [CCMenuItemLabel itemWithLabel:menuItemLabel2 target:self selector:@selector(highscores)]; 45 //CCMenuItemLabel* menuItem2 = [CCMenuItemLabel itemWithLabel:menuItemLabel2 target:self selector:@selector(highscores)];
47 46
48 CCMenuItemImage* newgameMenuItem = [CCMenuItemImage itemFromNormalImage:@"newgame.png" selectedImage:@"newgame2.png" target:self selector:@selector(newgame)]; 47 CCMenuItemImage* newgameMenuItem = [CCMenuItemImage itemFromNormalImage:@"newgame.png" selectedImage:@"newgame2.png" target:self selector:@selector(newgame)];
49 CCMenuItemImage* tutorialMenuItem = [CCMenuItemImage itemFromNormalImage:@"tutorial.png" selectedImage:@"tutorial2.png" target:self selector:@selector(tutorial)];
50 CCMenuItemImage* jumpMenuItem = [CCMenuItemImage itemFromNormalImage:@"jump.png" selectedImage:@"jump2.png" target:self selector:@selector(jump)];
51 CCMenuItemImage* highscoresMenuItem = [CCMenuItemImage itemFromNormalImage:@"highscores.png" selectedImage:@"highscores2.png" target:self selector:@selector(highscores)]; 48 CCMenuItemImage* highscoresMenuItem = [CCMenuItemImage itemFromNormalImage:@"highscores.png" selectedImage:@"highscores2.png" target:self selector:@selector(highscores)];
52 49 CCMenuItemImage* feedbackMenuItem = [CCMenuItemImage itemFromNormalImage:@"feedback.png" selectedImage:@"feedback2.png" target:self selector:@selector(feedback)];
53 CCMenu* menu = [CCMenu menuWithItems:newgameMenuItem, tutorialMenuItem, jumpMenuItem, highscoresMenuItem, nil]; 50
51 CCMenu* menu = [CCMenu menuWithItems:newgameMenuItem, highscoresMenuItem, feedbackMenuItem, nil];
54 [menu alignItemsVertically]; 52 [menu alignItemsVertically];
55 menu.position = ccp(240, 100); 53 menu.position = ccp(240, 100);
56 [self addChild:menu]; 54 [self addChild:menu];
@@ -61,17 +59,7 @@
61 59
62- (void)newgame 60- (void)newgame
63{ 61{
64 [[CCDirector sharedDirector] replaceScene:[ClassicGameMode scene]]; 62 [[CCDirector sharedDirector] replaceScene:[GameModeSelectionLayer scene]];
65}
66
67- (void)tutorial
68{
69 [[CCDirector sharedDirector] replaceScene:[TutorialMode scene]];
70}
71
72- (void)jump
73{
74 [[CCDirector sharedDirector] replaceScene:[JumpGameMode scene]];
75} 63}
76 64
77- (void)highscores 65- (void)highscores
@@ -82,4 +70,9 @@
82 [listController release]; 70 [listController release];
83} 71}
84 72
73- (void)feedback
74{
75 [TestFlight openFeedbackView];
76}
77
85@end 78@end
diff --git a/Classes/NMPanelMenu.h b/Classes/NMPanelMenu.h new file mode 100755 index 0000000..3487849 --- /dev/null +++ b/Classes/NMPanelMenu.h
@@ -0,0 +1,14 @@
1/*
2 * NMPanelMenu.h
3 * shapes
4 *
5 * Created by Nate Murray on 7/29/10.
6 * Copyright 2010 YetiApps. All rights reserved.
7 *
8 */
9
10#import "cocos2d.h"
11@interface NMPanelMenu : CCMenu {
12}
13-(CCMenuItem *) itemForTouch: (UITouch *) touch;
14@end
diff --git a/Classes/NMPanelMenu.m b/Classes/NMPanelMenu.m new file mode 100755 index 0000000..ee24279 --- /dev/null +++ b/Classes/NMPanelMenu.m
@@ -0,0 +1,37 @@
1/*
2 * NMPanelMenu.m
3 * shapes
4 *
5 * Created by Nate Murray on 7/29/10.
6 * Copyright 2010 YetiApps. All rights reserved.
7 *
8 */
9
10#import "NMPanelMenu.h"
11
12@implementation NMPanelMenu
13
14-(CCMenuItem *) itemForTouch: (UITouch *) touch
15{
16 CGPoint touchLocation = [touch locationInView: [[touch view] superview]];
17 touchLocation = [[CCDirector sharedDirector] convertToGL: touchLocation];
18
19 CCMenuItem* item;
20 CCARRAY_FOREACH(children_, item){
21 // ignore invisible and disabled items: issue #779, #866
22 if ( [item visible] && [item isEnabled] ) {
23
24 CGPoint local = [item convertToNodeSpace:touchLocation];
25
26 CGRect r = [item rect];
27 r.origin = CGPointZero;
28
29 if( CGRectContainsPoint( r, local ) ) {
30 return item;
31 }
32 }
33 }
34 return nil;
35}
36
37@end
diff --git a/Classes/TouchDelegatingView.h b/Classes/TouchDelegatingView.h new file mode 100755 index 0000000..5ed6884 --- /dev/null +++ b/Classes/TouchDelegatingView.h
@@ -0,0 +1,18 @@
1//
2// TouchDelegatingView.h
3// shapes
4//
5// Created by Nate Murray on 8/23/10.
6// Copyright 2010 LittleHiccup. All rights reserved.
7//
8
9#import <Foundation/Foundation.h>
10#import "CocosOverLayScrollView.h"
11
12@interface TouchDelegatingView : UIView {
13 // UIPageControl* pageControl;
14 CocosOverlayScrollView* scrollView;
15}
16@property(nonatomic, retain) CocosOverlayScrollView* scrollView;
17
18@end
diff --git a/Classes/TouchDelegatingView.m b/Classes/TouchDelegatingView.m new file mode 100755 index 0000000..83bda73 --- /dev/null +++ b/Classes/TouchDelegatingView.m
@@ -0,0 +1,26 @@
1//
2// TouchDelegatingView.m
3// Jacob's Shapes
4//
5// Created by Nate Murray on 8/23/10.
6// Copyright 2010 LittleHiccup. All rights reserved.
7//
8
9#import "TouchDelegatingView.h"
10
11@implementation TouchDelegatingView
12@synthesize scrollView;
13
14- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
15 if ([self pointInside:point withEvent:event]) {
16 return self.scrollView;
17 }
18 return nil;
19}
20
21-(void) dealloc {
22 self.scrollView = nil;
23 [super dealloc];
24}
25
26@end
diff --git a/Classes/TutorialMode.m b/Classes/TutorialMode.m index ed51648..3c70a46 100644 --- a/Classes/TutorialMode.m +++ b/Classes/TutorialMode.m
@@ -12,7 +12,7 @@
12#import "Bottle.h" 12#import "Bottle.h"
13#import "OneUp.h" 13#import "OneUp.h"
14#import "Rock.h" 14#import "Rock.h"
15#import "MainMenuLayer.h" 15#import "GameModeSelectionLayer.h"
16 16
17// Item tags: 17// Item tags:
18// 2000 - first dropped item 18// 2000 - first dropped item
@@ -20,6 +20,7 @@
20// 2002 - items that are dropped after you miss first dropped item to demonstrate what happens when you catch 20// 2002 - items that are dropped after you miss first dropped item to demonstrate what happens when you catch
21// 2003 - 1-Up 21// 2003 - 1-Up
22// 2009 - rock 22// 2009 - rock
23// 2010 - random item dropped after death from first rock
23 24
24@implementation TutorialMode 25@implementation TutorialMode
25 26
@@ -47,7 +48,7 @@
47 [super onEnterTransitionDidFinish]; 48 [super onEnterTransitionDidFinish];
48 49
49 [self scheduleDelayedAction:^{ 50 [self scheduleDelayedAction:^{
50 TutorialBubble* bubble = [[TutorialBubble alloc] initWithText:@"Welcome to Cart Collect. This is a tutorial designed to help you get started playing the game. Below this bubble is a cart. Tilt your device to move it." name:@"cart" spriteReference:cart.sprite]; 51 TutorialBubble* bubble = [[TutorialBubble alloc] initWithText:@"Welcome to Cartographic. This is a tutorial designed to help you get started playing the game. Below this bubble is a cart. Tilt your device to move it." name:@"cart" spriteReference:cart.sprite];
51 self.currentTutorial = bubble; 52 self.currentTutorial = bubble;
52 [bubble release]; 53 [bubble release];
53 } delay:2.0f]; 54 } delay:2.0f];
@@ -122,7 +123,30 @@
122 [self schedule:@selector(randomlyAddObject:) interval:2.5f]; 123 [self schedule:@selector(randomlyAddObject:) interval:2.5f];
123 } else if (item.sprite.tag == 2009) 124 } else if (item.sprite.tag == 2009)
124 { 125 {
125 TutorialBubble* bubble = [[TutorialBubble alloc] initWithText:@"As you play, Cart Collect gets progressively more intense. Watch what happens when rocks are added to the mix and the speed is turned up." name:@"intense"]; 126 if ((lives < 1) && (!showedDeathBubble))
127 {
128 showedDeathBubble = YES;
129
130 TutorialBubble* bubble = [[TutorialBubble alloc] initWithText:@"You lost all your lives! Normally, you'd be taken to a game over screen where you could submit your score to the highscore list, but we're a bit more forgiving in tutorial mode." name:@"gameover-rock"];
131 self.currentTutorial = bubble;
132 [bubble release];
133 } else {
134 TutorialBubble* bubble = [[TutorialBubble alloc] initWithText:@"As you play, Cartographic gets progressively more intense. Watch what happens when rocks are added to the mix and the speed is turned up." name:@"intense"];
135 self.currentTutorial = bubble;
136 [bubble release];
137 }
138 } else if (item.sprite.tag == 2010)
139 {
140 TutorialBubble* bubble = [[TutorialBubble alloc] initWithText:@"As you play, Cartographic gets progressively more intense. Watch what happens when rocks are added to the mix and the speed is turned up." name:@"intense"];
141 self.currentTutorial = bubble;
142 [bubble release];
143 }
144
145 if ((lives < 1) && (!showedDeathBubble))
146 {
147 showedDeathBubble = YES;
148
149 TutorialBubble* bubble = [[TutorialBubble alloc] initWithText:@"You lost all your lives! Normally, you'd be taken to a game over screen where you could submit your score to the highscore list, but we're a bit more forgiving in tutorial mode." name:@"gameover"];
126 self.currentTutorial = bubble; 150 self.currentTutorial = bubble;
127 [bubble release]; 151 [bubble release];
128 } 152 }
@@ -191,12 +215,19 @@
191 object.sprite.tag = 2003; 215 object.sprite.tag = 2003;
192 [object release]; 216 [object release];
193 } delay:2.0f]; 217 } delay:2.0f];
218 } else if ([currentTutorial.name isEqual:@"gameover-rock"])
219 {
220 [self scheduleDelayedAction:^{
221 FallingObject* object = [self dropRandomItem];
222 object.sprite.tag = 2010;
223 [object release];
224 } delay:1.0f];
194 } else if ([currentTutorial.name isEqual:@"intense"]) 225 } else if ([currentTutorial.name isEqual:@"intense"])
195 { 226 {
196 [self schedule:@selector(randomlyAddObject:) interval:1.0f]; 227 [self schedule:@selector(randomlyAddObject:) interval:1.0f];
197 } else if ([currentTutorial.name isEqual:@"end"]) 228 } else if ([currentTutorial.name isEqual:@"end"])
198 { 229 {
199 [[CCDirector sharedDirector] replaceScene:[CCTransitionFade transitionWithDuration:3.0f scene:[MainMenuLayer scene] withColor:ccc3(0,0,0)]]; 230 [[CCDirector sharedDirector] replaceScene:[CCTransitionFade transitionWithDuration:3.0f scene:[GameModeSelectionLayer scene] withColor:ccc3(0,0,0)]];
200 } 231 }
201 232
202 self.currentTutorial = nil; 233 self.currentTutorial = nil;
@@ -252,20 +283,6 @@
252 return [self dropSpecificItem:object]; 283 return [self dropSpecificItem:object];
253} 284}
254 285
255- (void)setLives:(int)m_lives
256{
257 [super setLives:m_lives];
258
259 if ((lives < 1) && (!showedDeathBubble))
260 {
261 showedDeathBubble = YES;
262
263 TutorialBubble* bubble = [[TutorialBubble alloc] initWithText:@"You lost all your lives! Normally, you'd be taken to a game over screen where you could submit your score to the highscore list, but we're a bit more forgiving in tutorial mode." name:@"gameover"];
264 self.currentTutorial = bubble;
265 [bubble release];
266 }
267}
268
269- (void)randomlyAddObject:(ccTime)dt 286- (void)randomlyAddObject:(ccTime)dt
270{ 287{
271 FallingObject* object; 288 FallingObject* object;
@@ -307,13 +324,16 @@
307 } else if (randomItemsDropped == 15) 324 } else if (randomItemsDropped == 15)
308 { 325 {
309 [self scheduleDelayedAction:^{ 326 [self scheduleDelayedAction:^{
310 TutorialBubble* bubble = [[TutorialBubble alloc] initWithText:@"That's pretty much it! You've completed the tutorial, so now it's time to play an actual game of Cart Collect!" name:@"end"]; 327 TutorialBubble* bubble = [[TutorialBubble alloc] initWithText:@"That's pretty much it! You've completed the tutorial, so now it's time to play an actual game of Cartographic!" name:@"end"];
311 self.currentTutorial = bubble; 328 self.currentTutorial = bubble;
312 [bubble release]; 329 [bubble release];
313 } delay:2.0f]; 330 } delay:2.0f];
314 331
315 [self unschedule:@selector(randomlyAddObject:)]; 332 [self unschedule:@selector(randomlyAddObject:)];
316 333
334 NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults];
335 [defaults setBool:YES forKey:@"hasDoneTutorial"];
336
317 return; 337 return;
318 } else { 338 } else {
319 NSLog(@"randomItemsDropped in TutorialMode is greater than 15--this should never happen."); 339 NSLog(@"randomItemsDropped in TutorialMode is greater than 15--this should never happen.");
diff --git a/Classes/UIImage+ColorMasking.h b/Classes/UIImage+ColorMasking.h new file mode 100644 index 0000000..d25fafb --- /dev/null +++ b/Classes/UIImage+ColorMasking.h
@@ -0,0 +1,15 @@
1//
2// UIImage+ColorMasking.h
3// Cartographic
4//
5// Created by Starla Insigna on 8/22/11.
6// Copyright 2011 Four Island. All rights reserved.
7//
8
9#import <UIKit/UIKit.h>
10
11@interface UIImage (ColorMasking)
12
13- (UIImage *)opaqueMaskFromWhiteImage;
14
15@end
diff --git a/Classes/UIImage+ColorMasking.m b/Classes/UIImage+ColorMasking.m new file mode 100644 index 0000000..e4da8c8 --- /dev/null +++ b/Classes/UIImage+ColorMasking.m
@@ -0,0 +1,77 @@
1//
2// UIImage+ColorMasking.m
3// Cartographic
4//
5// Created by Starla Insigna on 8/22/11.
6// Copyright 2011 Four Island. All rights reserved.
7//
8
9#import "UIImage+ColorMasking.h"
10
11@implementation UIImage (ColorMasking)
12
13typedef enum {
14 ALPHA = 0,
15 BLUE = 1,
16 GREEN = 2,
17 RED = 3
18} PIXELS;
19
20- (UIImage *)opaqueMaskFromWhiteImage
21{
22 CGSize size = [self size];
23 int width = size.width;
24 int height = size.height;
25
26 // the pixels will be painted to this array
27 uint32_t *pixels = (uint32_t *) malloc(width * height * sizeof(uint32_t));
28
29 // clear the pixels so any transparency is preserved
30 memset(pixels, 0, width * height * sizeof(uint32_t));
31
32 CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
33
34 // create a context with RGBA pixels
35 CGContextRef context = CGBitmapContextCreate(pixels, width, height, 8, width * sizeof(uint32_t), colorSpace,
36 kCGBitmapByteOrder32Little | kCGImageAlphaPremultipliedLast);
37
38 // paint the bitmap to our context which will fill in the pixels array
39 CGContextDrawImage(context, CGRectMake(0, 0, width, height), [self CGImage]);
40
41 for(int y = 0; y < height; y++) {
42 for(int x = 0; x < width; x++) {
43 uint8_t *rgbaPixel = (uint8_t *) &pixels[y * width + x];
44
45 if ((rgbaPixel[RED] == 255) && (rgbaPixel[GREEN] == 255) && (rgbaPixel[BLUE] == 255) && (rgbaPixel[ALPHA] == 255))
46 {
47 rgbaPixel[RED] = 255;
48 rgbaPixel[GREEN] = 255;
49 rgbaPixel[BLUE] = 255;
50 rgbaPixel[ALPHA] = 255;
51 } else {
52 rgbaPixel[RED] = 0;
53 rgbaPixel[GREEN] = 0;
54 rgbaPixel[BLUE] = 0;
55 rgbaPixel[ALPHA] = 0;
56 }
57 }
58 }
59
60 // create a new CGImageRef from our context with the modified pixels
61 CGImageRef image = CGBitmapContextCreateImage(context);
62
63 // we're done with the context, color space, and pixels
64 CGContextRelease(context);
65 CGColorSpaceRelease(colorSpace);
66 free(pixels);
67
68 // make a new UIImage to return
69 UIImage *resultUIImage = [UIImage imageWithCGImage:image];
70
71 // we're done with image now too
72 CGImageRelease(image);
73
74 return resultUIImage;
75}
76
77@end