|
|
//
// TutorialMode.m
// Cart Collect
//
// Created by Starla Insigna on 8/10/11.
// Copyright 2011 Four Island. All rights reserved.
//
#import "TutorialMode.h"
#import "FallingObject.h"
#import "Cherry.h"
#import "Bottle.h"
#import "OneUp.h"
#import "Rock.h"
#import "GameModeSelectionLayer.h"
// Item tags:
// 2000 - first dropped item
// 2001 - item that is dropped after you catch first dropped item to demonstrate what happens when you miss
// 2002 - items that are dropped after you miss first dropped item to demonstrate what happens when you catch
// 2003 - 1-Up
// 2009 - rock
// 2010 - random item dropped after death from first rock
@implementation TutorialMode
@synthesize currentTutorial;
- (id)init
{
self = [super init];
if (nil != self)
{
CCSprite* backgroundImage = [CCSprite spriteWithFile:@"SeaBeach.png"];
backgroundImage.position = ccp(240, 160);
[self addChild:backgroundImage z:-1];
showedDeathBubble = NO;
randomItemsDropped = 0;
}
return self;
}
- (void)onEnterTransitionDidFinish
{
[super onEnterTransitionDidFinish];
[self scheduleDelayedAction:^{
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];
self.currentTutorial = bubble;
[bubble release];
} delay:2.0f];
}
- (void)tick:(ccTime)dt
{
[super tick:dt];
FallingObject* object = [objects anyObject];
if ((object.sprite.tag == 2000) && (object.sprite.position.y == 360-object.weight*14))
{
TutorialBubble* bubble = [[TutorialBubble alloc] initWithText:@"This is an item. Try to catch it with your cart." name:@"item" spriteReference:object.sprite];
self.currentTutorial = bubble;
[bubble release];
} else if ((object.sprite.tag == 2003) && (object.sprite.position.y == 360-object.weight*8))
{
TutorialBubble* bubble = [[TutorialBubble alloc] initWithText:@"This is a 1-Up. Catch it to gain an extra life. There's no penalty for not catching it, though." name:@"oneup" spriteReference:object.sprite];
self.currentTutorial = bubble;
[bubble release];
} else if ((object.sprite.tag == 2009) && (object.sprite.position.y == 360-object.weight*14))
{
TutorialBubble* bubble = [[TutorialBubble alloc] initWithText:@"This is a rock. It would be better for your health if you did not catch this item." name:@"rock" spriteReference:object.sprite];
self.currentTutorial = bubble;
[bubble release];
}
}
- (void)didCatchItem:(FallingObject *)item
{
if (item.sprite.tag == 2000)
{
TutorialBubble* bubble = [[TutorialBubble alloc] initWithText:@"Congratulations! If you look at your score, you'll see it increased. Catching items is good. Now, let's see what happens when you don't catch an item." name:@"caught-first"];
self.currentTutorial = bubble;
[bubble release];
} else if (item.sprite.tag == 2002)
{
TutorialBubble* bubble = [[TutorialBubble alloc] initWithText:@"There you go! If you look at your score, you'll see it increased. Catching items is good." name:@"caught-second"];
self.currentTutorial = bubble;
[bubble release];
}
}
- (void)didMissItem:(FallingObject *)item
{
if (item.sprite.tag == 2000)
{
TutorialBubble* bubble = [[TutorialBubble alloc] initWithText:@"Whoops, you missed it! Look at your lives counter--you lost one! If you lose all of your lives, you lose the game. Try catching the item again." name:@"missed-first"];
self.currentTutorial = bubble;
[bubble release];
} else if (item.sprite.tag == 2001)
{
[cart setImmobile:NO];
TutorialBubble* bubble = [[TutorialBubble alloc] initWithText:@"You lost a life! You only have three lives, so try not to miss any items! However..." name:@"missed-second"];
self.currentTutorial = bubble;
[bubble release];
} else if (item.sprite.tag == 2002)
{
[self scheduleDelayedAction:^{
FallingObject* object = [self dropRandomItem];
object.sprite.tag = 2002;
[object release];
} delay:1.0f];
}
}
- (void)didDestroyItem:(FallingObject *)item
{
if (item.sprite.tag == 2003)
{
[self schedule:@selector(randomlyAddObject:) interval:2.5f];
} else if (item.sprite.tag == 2009)
{
if ((lives < 1) && (!showedDeathBubble))
{
showedDeathBubble = YES;
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"];
self.currentTutorial = bubble;
[bubble release];
} else {
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"];
self.currentTutorial = bubble;
[bubble release];
}
} else if (item.sprite.tag == 2010)
{
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"];
self.currentTutorial = bubble;
[bubble release];
}
if ((lives < 1) && (!showedDeathBubble))
{
showedDeathBubble = YES;
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"];
self.currentTutorial = bubble;
[bubble release];
}
}
- (void)setCurrentTutorial:(TutorialBubble *)m_currentTutorial
{
@synchronized(self)
{
if (currentTutorial != m_currentTutorial)
{
[currentTutorial removeFromSuperview];
[currentTutorial release];
currentTutorial = [m_currentTutorial retain];
}
}
if (currentTutorial != nil)
{
[currentTutorial setTarget:self action:@selector(endTutorial)];
[[[CCDirector sharedDirector] openGLView] addSubview:currentTutorial];
[self pauseSchedulerAndActions];
}
}
- (void)endTutorial
{
[self resumeSchedulerAndActions];
if ([currentTutorial.name isEqual:@"cart"])
{
[self scheduleDelayedAction:^{
FallingObject* object = [self dropRandomItem];
object.sprite.tag = 2000;
[object release];
} delay:3.0f];
} else if ([currentTutorial.name isEqual:@"caught-first"])
{
[cart setImmobile:YES];
[self scheduleDelayedAction:^{
FallingObject* object = [self dropRandomItem];
if (cart.sprite.position.x > 240)
{
object.sprite.position = ccp(20, 360);
} else {
object.sprite.position = ccp(460, 360);
}
object.sprite.tag = 2001;
[object release];
} delay:1.0f];
} else if ([currentTutorial.name isEqual:@"missed-first"])
{
[self scheduleDelayedAction:^{
FallingObject* object = [self dropRandomItem];
object.sprite.tag = 2002;
[object release];
} delay:1.0f];
} else if (([currentTutorial.name isEqual:@"caught-second"]) || ([currentTutorial.name isEqual:@"missed-second"]))
{
[self scheduleDelayedAction:^{
FallingObject* object = [self dropSpecificItem:[[OneUp alloc] init]];
object.sprite.tag = 2003;
[object release];
} delay:2.0f];
} else if ([currentTutorial.name isEqual:@"gameover-rock"])
{
[self scheduleDelayedAction:^{
FallingObject* object = [self dropRandomItem];
object.sprite.tag = 2010;
[object release];
} delay:1.0f];
} else if ([currentTutorial.name isEqual:@"intense"])
{
[self schedule:@selector(randomlyAddObject:) interval:1.0f];
} else if ([currentTutorial.name isEqual:@"end"])
{
[[CCDirector sharedDirector] replaceScene:[CCTransitionFade transitionWithDuration:3.0f scene:[GameModeSelectionLayer scene] withColor:ccc3(0,0,0)]];
}
self.currentTutorial = nil;
}
- (void)pause
{
if (self.currentTutorial != nil)
{
[self.currentTutorial removeFromSuperview];
}
[super pause];
}
- (void)unpause
{
[super unpause];
if (self.currentTutorial != nil)
{
[self pauseSchedulerAndActions];
[[[CCDirector sharedDirector] openGLView] addSubview:self.currentTutorial];
}
}
- (FallingObject*)dropSpecificItem:(FallingObject*)object
{
int objectX = arc4random()%448+16;
object.sprite.position = ccp(objectX, 360);
object.sprite.scale = 1;
[self addChild:object.sprite];
object.delegate = self;
[objects addObject:object];
return object;
}
- (FallingObject*)dropRandomItem
{
FallingObject* object;
int randomval = arc4random()%100;
if (randomval < 65)
{
object = [[Cherry alloc] init];
} else {
object = [[Bottle alloc] init];
}
return [self dropSpecificItem:object];
}
- (void)randomlyAddObject:(ccTime)dt
{
FallingObject* object;
if (randomItemsDropped < 5)
{
int randomval = arc4random()%100;
if (randomval < 65)
{
object = [[Cherry alloc] init];
} else if (randomval < 98)
{
object = [[Bottle alloc] init];
} else {
object = [[OneUp alloc] init];
}
} else if (randomItemsDropped == 5)
{
object = [[Rock alloc] init];
object.sprite.tag = 2009;
[self unschedule:@selector(randomlyAddObject:)];
} else if (randomItemsDropped < 15) {
int randomval = arc4random()%100;
if (randomval < 40)
{
object = [[Cherry alloc] init];
} else if (randomval < 70)
{
object = [[Rock alloc] init];
} else if (randomval < 98)
{
object = [[Bottle alloc] init];
} else {
object = [[OneUp alloc] init];
}
} else if (randomItemsDropped == 15)
{
[self scheduleDelayedAction:^{
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"];
self.currentTutorial = bubble;
[bubble release];
} delay:2.0f];
[self unschedule:@selector(randomlyAddObject:)];
NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults];
[defaults setBool:YES forKey:@"hasDoneTutorial"];
return;
} else {
NSLog(@"randomItemsDropped in TutorialMode is greater than 15--this should never happen.");
return;
}
[self dropSpecificItem:object];
[object release];
randomItemsDropped++;
}
@end
|