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