summary refs log tree commit diff stats
path: root/Classes/GameModeSelection.m
blob: 40981b1aa2666d6ca0423fa88ea88d68f4deb6e3 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
//
//  GameModeSelection.m
//  Cartographic
//
//  Created by Starla Insigna on 8/18/11.
//  Copyright 2011 Four Island. All rights reserved.
//

#import "GameModeSelection.h"
#import "UIImage+ColorMasking.h"
#import "NMPanelMenu.h"
#import "Highscore.h"

@implementation GameModeSelection

@synthesize name, location, unlocked, delegate;

+ (id)selectionWithName:(NSString*)name location:(NSString*)location filename:(NSString*)filename unlocked:(BOOL)unlocked
{
    return [[[GameModeSelection alloc] initWithName:name location:location filename:filename unlocked:unlocked] autorelease];
}

+ (id)selectionWithName:(NSString *)name location:(NSString *)location filename:(NSString *)filename unlockCondition:(NSString*)unlockCondition
{
    return [[[GameModeSelection alloc] initWithName:name location:location filename:filename unlockCondition:unlockCondition] autorelease];
}

- (id)initWithName:(NSString*)m_name location:(NSString*)m_location filename:(NSString*)filename unlocked:(BOOL)m_unlocked;
{
    self = [super initWithTarget:nil selector:nil];
    
    if (nil != self)
    {
        self.anchorPoint = CGPointMake(0.5f, 0.5f);
        
        name = m_name;
        location = m_location;
        unlocked = m_unlocked;
        
        contentSize_ = CGSizeMake(128, 320);
        
        NSString* filenameMod;
        
        if (unlocked)
        {
            filenameMod = [NSString stringWithFormat:@"%@-unlocked", filename];
        } else {
            filenameMod = [NSString stringWithFormat:@"%@-locked", filename];
            name = [@"" stringByPaddingToLength:name.length withString:@"?" startingAtIndex:0];
            location = [@"" stringByPaddingToLength:location.length withString:@"?" startingAtIndex:0];
        }
        
        // First, create the frame that we will put the level picture inside
        CGImageRef framestuff = [[UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"framestuff" ofType:@"png"]] CGImage];
        CGImageRef topLeftRef = CGImageCreateWithImageInRect(framestuff, CGRectMake(0, 0, 8, 8));
        CGImageRef topRightRef = CGImageCreateWithImageInRect(framestuff, CGRectMake(8, 0, 8, 8));
        CGImageRef bottomLeftRef = CGImageCreateWithImageInRect(framestuff, CGRectMake(0, 8, 8, 8));
        CGImageRef bottomRightRef = CGImageCreateWithImageInRect(framestuff, CGRectMake(8, 8, 8, 8));
        CGImageRef topBorderRef = CGImageCreateWithImageInRect(framestuff, CGRectMake(0, 16, 8, 8));
        CGImageRef leftBorderRef = CGImageCreateWithImageInRect(framestuff, CGRectMake(8, 16, 8, 8));
        CGImageRef rightBorderRef = CGImageCreateWithImageInRect(framestuff, CGRectMake(0, 24, 8, 8));
        CGImageRef bottomBorderRef = CGImageCreateWithImageInRect(framestuff, CGRectMake(8, 24, 8, 8));
        UIImage* topLeft = [UIImage imageWithCGImage:topLeftRef];
        UIImage* topRight = [UIImage imageWithCGImage:topRightRef];
        UIImage* bottomLeft = [UIImage imageWithCGImage:bottomLeftRef];
        UIImage* bottomRight = [UIImage imageWithCGImage:bottomRightRef];
        UIImage* topBorder = [UIImage imageWithCGImage:topBorderRef];
        UIImage* leftBorder = [UIImage imageWithCGImage:leftBorderRef];
        UIImage* rightBorder = [UIImage imageWithCGImage:rightBorderRef];
        UIImage* bottomBorder = [UIImage imageWithCGImage:bottomBorderRef];
        CGImageRelease(topLeftRef);
        CGImageRelease(topRightRef);
        CGImageRelease(bottomLeftRef);
        CGImageRelease(bottomRightRef);
        CGImageRelease(topBorderRef);
        CGImageRelease(leftBorderRef);
        CGImageRelease(rightBorderRef);
        CGImageRelease(bottomBorderRef);
        
        CGSize boxSize = CGSizeMake(128+12, 128+12);
        UIGraphicsBeginImageContext(boxSize);
        CGContextRef context = UIGraphicsGetCurrentContext();
        [topLeft drawInRect:CGRectMake(0, 0, 8, 8)];
        [topBorder drawInRect:CGRectMake(8, 0, boxSize.width-16, 8)];
        [topRight drawInRect:CGRectMake(8+boxSize.width-16, 0, 8, 8)];
        [rightBorder drawInRect:CGRectMake(8+boxSize.width-16, 8, 8, boxSize.height-16)];
        [bottomRight drawInRect:CGRectMake(8+boxSize.width-16, 8+boxSize.height-16, 8, 8)];
        [bottomBorder drawInRect:CGRectMake(8, 8+boxSize.height-16, boxSize.width-16, 8)];
        [bottomLeft drawInRect:CGRectMake(0, 8+boxSize.height-16, 8, 8)];
        [leftBorder drawInRect:CGRectMake(0, 8, 8, boxSize.height-16)];
        CGContextSetFillColorWithColor(context, [[UIColor whiteColor] CGColor]);
        CGContextFillRect(context, CGRectMake(8, 8, boxSize.width-16, boxSize.height-16));
        UIImage* selectionBackground = UIGraphicsGetImageFromCurrentImageContext();
        
        // Now we want to put the level image inside the frame without messing up the frame itself
        UIImage* innerPicture = [UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:filename ofType:@"png"]];
        CGContextClipToMask(context, CGRectMake(0, 0, boxSize.width, boxSize.height), [[selectionBackground opaqueMaskFromWhiteImage] CGImage]);
        [innerPicture drawInRect:CGRectMake(6, 6, 128, 128)];
        selectionBackground = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();
        
        // The frame needs a shadow, so let's redraw it in a new context
        UIGraphicsBeginImageContext(CGSizeMake(boxSize.width+10, boxSize.height+10));
        context = UIGraphicsGetCurrentContext();
        CGContextSaveGState(context);
        
        if (unlocked)
        {
            CGContextSetShadow(context, CGSizeMake(-6, 6), 4.0f);
            [selectionBackground drawInRect:CGRectMake(10, 0, boxSize.width, boxSize.height)];
        } else {
            // Draw the picture in grayscale if the level has not yet been unlocked
            CGContextClipToMask(context, CGRectMake(10, 0, boxSize.width, boxSize.height), [selectionBackground CGImage]);
            CGContextSetFillColorWithColor(context, [[UIColor whiteColor] CGColor]);
            CGContextFillRect(context, CGRectMake(10, 0, boxSize.width, boxSize.height));
            CGContextRestoreGState(context);
            
            CGContextSaveGState(context);
            CGContextSetShadow(context, CGSizeMake(-6, 6), 4.0f);
            [selectionBackground drawInRect:CGRectMake(10, 0, boxSize.width, boxSize.height) blendMode:kCGBlendModeLuminosity alpha:1.0];
        }
        
        CGContextRestoreGState(context);
        CGImageRef pictureRef = [UIGraphicsGetImageFromCurrentImageContext() CGImage];
        
        CCSprite* picture = [CCSprite spriteWithCGImage:pictureRef key:[NSString stringWithFormat:@"gms-%@", filenameMod]];
        
        // We're also going to need a "selected" image state for the button
        CGContextSaveGState(context);
        CGContextClipToMask(context, CGRectMake(10, 0, boxSize.width, boxSize.height), [selectionBackground CGImage]);
        CGContextSetFillColorWithColor(context, [[UIColor colorWithRed:0 green:0 blue:0 alpha:0.5] CGColor]);
        CGContextFillRect(context, CGRectMake(10, 0, boxSize.width, boxSize.height));
        CGContextRestoreGState(context);
        CGImageRef selectedButtonRef = [UIGraphicsGetImageFromCurrentImageContext() CGImage];
        UIGraphicsEndImageContext();
        CCSprite* selectedButton = [CCSprite spriteWithCGImage:selectedButtonRef key:[NSString stringWithFormat:@"gms-%@-selected", filenameMod]];
        
        CCMenuItemSprite* pictureMenuItem = [CCMenuItemSprite itemFromNormalSprite:picture selectedSprite:selectedButton target:self selector:@selector(buttonTapped)];
        NMPanelMenu* theMenu = [NMPanelMenu menuWithItems:pictureMenuItem, nil];
        theMenu.position = ccp(-5, 0);
        [self addChild:theMenu];
        
        // Render the titles
        UIFont* titleFont = [UIFont fontWithName:@"AmericanTypewriter-Bold" size:18.0f];
        CGSize titleSize = [location sizeWithFont:titleFont constrainedToSize:CGSizeMake(128, 0)];
        UIFont* subtitleFont = [UIFont fontWithName:@"AmericanTypewriter" size:18.0f];
        CGSize subtitleSize = [name sizeWithFont:subtitleFont constrainedToSize:CGSizeMake(128, 0)];
        CGSize combinedTitleSize = CGSizeMake(128, titleSize.height + 10 + subtitleSize.height + 10);
        
        UIGraphicsBeginImageContext(combinedTitleSize);
        context = UIGraphicsGetCurrentContext();
        CGContextSetShadow(context, CGSizeMake(-6, 6), 4.0f);
        [location drawInRect:CGRectMake(10, 0, 128, titleSize.height) withFont:titleFont lineBreakMode:UILineBreakModeWordWrap alignment:UITextAlignmentCenter];
        [name drawInRect:CGRectMake(10, titleSize.height, 128, subtitleSize.height) withFont:subtitleFont lineBreakMode:UILineBreakModeWordWrap alignment:UITextAlignmentCenter];
        
        CGImageRef titleImage = [UIGraphicsGetImageFromCurrentImageContext() CGImage];
        UIGraphicsEndImageContext();
        CCSprite* titleSprite = [CCSprite spriteWithCGImage:titleImage key:[NSString stringWithFormat:@"gms-%@-title", filenameMod]];
        titleSprite.position = ccp(-10, (boxSize.height)/2+(combinedTitleSize.height)/2);
        [self addChild:titleSprite];
        
        if (unlocked)
        {
            Highscore* localHighscore = [Highscore localHighscoreForGameMode:name];
            
            if (localHighscore != nil)
            {
                // Render the highscore label
                NSString* highscoreString = [NSString stringWithFormat:@"Highscore: %d", localHighscore.score];
                UIFont* highscoreFont = [UIFont fontWithName:@"AmericanTypewriter" size:16.0f];
                CGSize highscoreSize = [highscoreString sizeWithFont:highscoreFont];
                
                UIGraphicsBeginImageContext(CGSizeMake(highscoreSize.width+10, highscoreSize.height+10));
                CGContextRef context = UIGraphicsGetCurrentContext();
                CGContextSetShadow(context, CGSizeMake(-6, 6), 4.0f);
                [highscoreString drawInRect:CGRectMake(10, 0, highscoreSize.width, highscoreSize.height) withFont:highscoreFont];
                
                CGImageRef highscoreImage = [UIGraphicsGetImageFromCurrentImageContext() CGImage];
                UIGraphicsEndImageContext();
                CCSprite* highscoreSprite = [CCSprite spriteWithCGImage:highscoreImage key:[NSString stringWithFormat:@"gms-%@-highscore-%d", filename, localHighscore.score]];
                highscoreSprite.position = ccp(-5, 0-64-(highscoreSize.height)/2-10);
                [self addChild:highscoreSprite];
            }
        }
    }
    
    return self;
}

- (id)initWithName:(NSString *)m_name location:(NSString *)m_location filename:(NSString *)m_filename unlockCondition:(NSString*)m_unlockCondition
{
    self = [self initWithName:m_name location:m_location filename:m_filename unlocked:NO];
    
    if (nil != self)
    {
        unlockCondition = m_unlockCondition;
    }
    
    return self;
}

- (void)buttonTapped
{
    if (unlocked)
    {
        if (delegate != nil)
        {
            [delegate didSelectGameMode:self];
        } else {
            NSLog(@"I don't have a GameModeSelectionDelegate to call for some reason...");
        }
    } else {
        UIAlertView* alertView = [[UIAlertView alloc] initWithTitle:@"To unlock this game mode:" message:unlockCondition delegate:nil cancelButtonTitle:@"Cancel" otherButtonTitles:nil];
        [alertView show];
        [alertView release];
    }
}

@end