From ac4036dfc81b0589c29d0d97c71620c3fbeef68e Mon Sep 17 00:00:00 2001 From: Jeena Paradies Date: Sun, 6 Mar 2011 05:25:35 +0100 Subject: [PATCH] added sound to pong and fixed some bugs --- games/Pong/Classes/GGSNetwork.m | 6 +- games/Pong/Classes/PongAppDelegate.m | 1 + games/Pong/Classes/PongViewController.h | 8 + games/Pong/Classes/PongViewController.m | 114 +- games/Pong/Pong.xcodeproj/jeena.mode1v3 | 50 +- games/Pong/Pong.xcodeproj/jeena.pbxuser | 1169 ++++++++++++++++++++- games/Pong/Pong.xcodeproj/project.pbxproj | 16 + games/Pong/lost.wav | Bin 0 -> 34278 bytes games/Pong/ping.wav | Bin 0 -> 13066 bytes games/Pong/pong.wav | Bin 0 -> 15542 bytes src/ggs_coordinator.erl | 1 - src/ggs_gamevm_p.erl | 86 +- src/ggs_player.erl | 5 - src/ggs_table.erl | 2 - tests/tick.erl | 26 + 15 files changed, 1373 insertions(+), 111 deletions(-) create mode 100644 games/Pong/lost.wav create mode 100644 games/Pong/ping.wav create mode 100644 games/Pong/pong.wav create mode 100644 tests/tick.erl diff --git a/games/Pong/Classes/GGSNetwork.m b/games/Pong/Classes/GGSNetwork.m index fbf635f..932a734 100644 --- a/games/Pong/Classes/GGSNetwork.m +++ b/games/Pong/Classes/GGSNetwork.m @@ -11,7 +11,7 @@ @implementation GGSNetwork -#define GGS_HOST @"localhost" +#define GGS_HOST @"home.jeena.net" #define GGS_PORT 9000 #define NO_TIMEOUT -1 @@ -37,6 +37,7 @@ asyncSocket = [[AsyncSocket alloc] initWithDelegate:self]; [asyncSocket connectToHost:GGS_HOST onPort:GGS_PORT error:nil]; + [asyncSocket readDataToData:HEADER_DELIMITER withTimeout:NO_TIMEOUT tag:HEAD]; } @@ -61,12 +62,11 @@ } - (void)onSocket:(AsyncSocket *)sock didConnectToHost:(NSString *)host port:(UInt16)port { - + } - (void)onSocket:(AsyncSocket *)sender didReadData:(NSData *)data withTag:(long)tag { - if (tag == HEAD) { [self parseAndSetHeader:data]; diff --git a/games/Pong/Classes/PongAppDelegate.m b/games/Pong/Classes/PongAppDelegate.m index 968396f..7ca5983 100644 --- a/games/Pong/Classes/PongAppDelegate.m +++ b/games/Pong/Classes/PongAppDelegate.m @@ -57,6 +57,7 @@ /* Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. */ + [(PongViewController *)viewController restart]; } diff --git a/games/Pong/Classes/PongViewController.h b/games/Pong/Classes/PongViewController.h index c62572d..0f8dbfb 100644 --- a/games/Pong/Classes/PongViewController.h +++ b/games/Pong/Classes/PongViewController.h @@ -9,6 +9,7 @@ #import #import "GGSDelegate.h" #import "GGSNetwork.h" +#import enum GameType { kGameTypeSinglePlayer = 0, @@ -28,6 +29,11 @@ enum GameType { IBOutlet UILabel *pointsP2; GGSNetwork *ggsNetwork; + + AVAudioPlayer *pingSound; + AVAudioPlayer *pongSound; + AVAudioPlayer *lostSound; + } @property (nonatomic, retain) IBOutlet UIView *ballView; @@ -40,6 +46,8 @@ enum GameType { @property (nonatomic, retain) GGSNetwork *ggsNetwork; +- (void)restart; + - (void)startPositions; - (void)zeroPoints; diff --git a/games/Pong/Classes/PongViewController.m b/games/Pong/Classes/PongViewController.m index 4f7a3d2..adfdc0c 100644 --- a/games/Pong/Classes/PongViewController.m +++ b/games/Pong/Classes/PongViewController.m @@ -7,7 +7,6 @@ // #import "PongViewController.h" -#import "GGSNetwork.h" @implementation PongViewController @@ -18,8 +17,8 @@ #define WIDTH 480 #define HEIGHT 320 -#define TOX(x) ( WIDTH / 100 * (x)) -#define TOY(y) ( HEIGHT / 100 * (y)) +#define TOX(x) ( 4.8 * x ) +#define TOY(y) ( 3.2 * y ) @synthesize ballView, player1View, player2View, tapToBegin, pointsP1, pointsP2, ggsNetwork; @@ -49,32 +48,90 @@ #pragma mark GGSNetwork Delegate - (void)GGSNetwork:(GGSNetwork *)_ggsNetwork ready:(BOOL)ready { - [ggsNetwork define:@"function playerCommand(user, command, args) { user.sendCommand(command, args); }"]; + [ggsNetwork sendCommand:@"ready" withArgs:@""]; } - (void)GGSNetwork:(GGSNetwork *)_ggsNetwork defined:(BOOL)defined { - if (defined) { - [ggsNetwork sendCommand:@"ready" withArgs:@""]; - } else { - NSLog(@"Not defined"); - } - + // do nothing. } - (void)GGSNetwork:(GGSNetwork *)_ggsNetwork receivedCommand:(NSString *)command withArgs:(NSString *)args { - NSLog(@"Command: %@; Args: %@", command, args); if ([command isEqualToString:@"ball"]) { NSArray *ball = [args componentsSeparatedByString:@","]; - ballView.center = CGPointMake([[ball objectAtIndex:0] intValue], [[ball objectAtIndex:1] intValue]); + [UIView beginAnimations:NULL context:NULL]; + CGFloat x = [[ball objectAtIndex:0] floatValue]; + CGFloat y = [[ball objectAtIndex:1] floatValue]; + ballView.center = CGPointMake(TOX(x), TOY(y)); + [UIView commitAnimations]; + } else if ([command isEqualToString:@"player1_y"]) { - player1View.center = CGPointMake(20, TOY([args intValue])); + + [UIView beginAnimations:NULL context:NULL]; + player1View.center = CGPointMake(25, TOY([args floatValue])); + [UIView commitAnimations]; + } else if ([command isEqualToString:@"player2_y"]) { - player2View.center = CGPointMake(WIDTH - 40, TOY([args intValue])); + + [UIView beginAnimations:NULL context:NULL]; + player2View.center = CGPointMake(WIDTH - 35, TOY([args floatValue])); + [UIView commitAnimations]; + } else if ([command isEqualToString:@"player1_points"]) { + pointsP1.text = args; + gamePaused = YES; + [lostSound play]; + } else if ([command isEqualToString:@"player2_points"]) { + pointsP2.text = args; + gamePaused = YES; + [lostSound play]; + + } else if ([command isEqualToString:@"game"]) { + + if ([args isEqualToString:@"wait"]) { + + NSLog(@"Other ready"); + + } else if ([args isEqualToString:@"start"]) { + + gamePaused = NO; + + } + } else if ([command isEqualToString:@"welcome"]) { + if ([args isEqualToString:@"1"]) { + player1View.backgroundColor = [UIColor redColor]; + } else { + player2View.backgroundColor = [UIColor redColor]; + } + + } else if ([command isEqualToString:@"sound"]) { + if ([args isEqualToString:@"ping"]) { + [pingSound play]; + } else { + [pongSound play]; + } + + } +} + +#pragma mark - +#pragma mark Input + +- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { + if (gamePaused) { + [ggsNetwork sendCommand:@"start" withArgs:@""]; + tapToBegin.hidden = YES; + } else { + CGPoint point = [[[touches allObjects] objectAtIndex:0] locationInView:self.view]; + if (point.y > (HEIGHT / 2)) { + [ggsNetwork sendCommand:@"down" withArgs:@""]; + } else { + [ggsNetwork sendCommand:@"up" withArgs:@""]; + } + } } @@ -82,12 +139,35 @@ #pragma mark - #pragma mark View +- (void)restart { + player1View.backgroundColor = [UIColor whiteColor]; + player2View.backgroundColor = [UIColor whiteColor]; + pointsP1.text = @"0"; + pointsP2.text = @"0"; + self.ggsNetwork = [[GGSNetwork alloc] initWithDelegate:self]; + gamePaused = YES; + tapToBegin.hidden = NO; +} + // Implement viewDidLoad to do additional setup after loading the view, typically from a nib. - (void)viewDidLoad { [super viewDidLoad]; - ggsNetwork = [[GGSNetwork alloc] initWithDelegate:self]; + NSString *path = [[NSBundle mainBundle] pathForResource:@"ping" ofType:@"wav"]; + pingSound = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:path] error:NULL]; + [pingSound play]; + path = [[NSBundle mainBundle] pathForResource:@"pong" ofType:@"wav"]; + pongSound = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:path] error:NULL]; + [pongSound play]; + + path = [[NSBundle mainBundle] pathForResource:@"lost" ofType:@"wav"]; + lostSound = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:path] error:NULL]; + [lostSound play]; + + + //ggsNetwork = [[GGSNetwork alloc] initWithDelegate:self]; + gamePaused = YES; //[self startPositions]; //[NSTimer scheduledTimerWithTimeInterval:0.05 target:self selector:@selector(moveBall) userInfo:nil repeats:YES]; @@ -254,6 +334,10 @@ [pointsP2 release]; [ggsNetwork release]; + [pingSound release]; + [pongSound release]; + [lostSound release]; + [super dealloc]; } diff --git a/games/Pong/Pong.xcodeproj/jeena.mode1v3 b/games/Pong/Pong.xcodeproj/jeena.mode1v3 index 99db5bd..e793482 100644 --- a/games/Pong/Pong.xcodeproj/jeena.mode1v3 +++ b/games/Pong/Pong.xcodeproj/jeena.mode1v3 @@ -326,19 +326,19 @@ _historyCapacity 0 bookmark - 1F369E7B1323081C004E7A99 + 1F36A0221323417E004E7A99 history 1FBEBF151319F5C1006D5497 1FBEC001131AA71C006D5497 1FBEC002131AA71C006D5497 1FBEC05C131B085D006D5497 - 1FBEC05D131B085D006D5497 - 1F369E761323081C004E7A99 - 1F369E771323081C004E7A99 - 1F369E781323081C004E7A99 - 1F369E791323081C004E7A99 - 1F369E7A1323081C004E7A99 + 1F369ED81323101D004E7A99 + 1F369F33132317A8004E7A99 + 1F369F6C13232750004E7A99 + 1F369FE61323395B004E7A99 + 1F36A0201323417E004E7A99 + 1F36A0211323417E004E7A99 SplitCount @@ -536,7 +536,7 @@ 5 WindowOrderList - 1F369E861323081C004E7A99 + 1F369E8E13230953004E7A99 1F369E871323081C004E7A99 1CD10A99069EF8BA00B06720 1FA056A412F0B540003F1373 @@ -665,8 +665,8 @@ yes sizes - {{0, 0}, {316, 201}} - {{316, 0}, {378, 201}} + {{0, 0}, {357, 449}} + {{357, 0}, {428, 449}} VerticalSplitView @@ -681,8 +681,8 @@ yes sizes - {{0, 0}, {694, 201}} - {{0, 201}, {694, 180}} + {{0, 0}, {785, 449}} + {{0, 449}, {785, 403}} @@ -702,7 +702,7 @@ DebugSTDIOWindowFrame {{200, 200}, {500, 300}} Frame - {{0, 0}, {694, 381}} + {{0, 0}, {785, 852}} PBXDebugSessionStackFrameViewKey DebugVariablesTableConfiguration @@ -712,24 +712,24 @@ Value 85 Summary - 148 + 198 Frame - {{316, 0}, {378, 201}} + {{357, 0}, {428, 449}} RubberWindowFrame - 108 977 694 422 0 0 2560 1418 + 108 506 785 893 0 0 2560 1418 RubberWindowFrame - 108 977 694 422 0 0 2560 1418 + 108 506 785 893 0 0 2560 1418 Module PBXDebugSessionModule Proportion - 381pt + 852pt Proportion - 381pt + 852pt Name @@ -754,7 +754,7 @@ ToolbarConfiguration xcode.toolbar.config.debugV3 WindowString - 108 977 694 422 0 0 2560 1418 + 108 506 785 893 0 0 2560 1418 WindowToolGUID 1CD10A99069EF8BA00B06720 WindowToolIsVisible @@ -880,18 +880,18 @@ GeometryConfiguration Frame - {{0, 0}, {673, 481}} + {{0, 0}, {724, 358}} RubberWindowFrame - 3600 653 673 522 2560 0 1920 1200 + 3598 801 724 399 2560 0 1920 1200 Module PBXDebugCLIModule Proportion - 481pt + 358pt Proportion - 481pt + 358pt Name @@ -911,7 +911,7 @@ ToolbarConfiguration xcode.toolbar.config.consoleV3 WindowString - 3600 653 673 522 2560 0 1920 1200 + 3598 801 724 399 2560 0 1920 1200 WindowToolGUID 1C78EAAD065D492600B07095 WindowToolIsVisible diff --git a/games/Pong/Pong.xcodeproj/jeena.pbxuser b/games/Pong/Pong.xcodeproj/jeena.pbxuser index f609c15..c33f163 100644 --- a/games/Pong/Pong.xcodeproj/jeena.pbxuser +++ b/games/Pong/Pong.xcodeproj/jeena.pbxuser @@ -9,9 +9,9 @@ }; 1D3623250D0F684500981E51 /* PongAppDelegate.m */ = { uiCtxt = { - sepNavIntBoundsRect = "{{0, 0}, {1965, 1215}}"; - sepNavSelRange = "{629, 0}"; - sepNavVisRange = "{448, 307}"; + sepNavIntBoundsRect = "{{0, 0}, {1965, 1350}}"; + sepNavSelRange = "{2181, 0}"; + sepNavVisRange = "{0, 2635}"; }; }; 1D6058900D05DD3D006BFB54 /* Pong */ = { @@ -45,7 +45,7 @@ fRef = 1FBEBFEE131A97F8006D5497 /* GGSNetwork.m */; name = "GGSNetwork.m: 60"; rLen = 0; - rLoc = 1529; + rLoc = 1537; rType = 0; vrLen = 2676; vrLoc = 860; @@ -55,7 +55,7 @@ fRef = 28D7ACF60DDB3853001CB0EB /* PongViewController.h */; name = "PongViewController.h: 11"; rLen = 0; - rLoc = 207; + rLoc = 246; rType = 0; vrLen = 1144; vrLoc = 0; @@ -65,7 +65,7 @@ fRef = 28D7ACF70DDB3853001CB0EB /* PongViewController.m */; name = "PongViewController.m: 24"; rLen = 0; - rLoc = 522; + rLoc = 480; rType = 0; vrLen = 1968; vrLoc = 37; @@ -75,11 +75,1031 @@ fRef = 28D7ACF70DDB3853001CB0EB /* PongViewController.m */; name = "PongViewController.m: 40"; rLen = 0; - rLoc = 989; + rLoc = 947; rType = 0; vrLen = 2275; vrLoc = 799; }; + 1F369E8A13230953004E7A99 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 28D7ACF70DDB3853001CB0EB /* PongViewController.m */; + name = "PongViewController.m: 40"; + rLen = 0; + rLoc = 947; + rType = 0; + vrLen = 2223; + vrLoc = 0; + }; + 1F369E8B13230953004E7A99 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 1FBEBFED131A97F8006D5497 /* GGSNetwork.h */; + name = "GGSNetwork.h: 28"; + rLen = 0; + rLoc = 748; + rType = 0; + vrLen = 910; + vrLoc = 0; + }; + 1F369E8C13230953004E7A99 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 1FBEBFEE131A97F8006D5497 /* GGSNetwork.m */; + name = "GGSNetwork.m: 14"; + rLen = 0; + rLoc = 212; + rType = 0; + vrLen = 2278; + vrLoc = 0; + }; + 1F369E9313230981004E7A99 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 1FBEBFEE131A97F8006D5497 /* GGSNetwork.m */; + name = "GGSNetwork.m: 17"; + rLen = 0; + rLoc = 258; + rType = 0; + vrLen = 2268; + vrLoc = 26; + }; + 1F369E961323099B004E7A99 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 1FBEBFEE131A97F8006D5497 /* GGSNetwork.m */; + name = "GGSNetwork.m: 39"; + rLen = 0; + rLoc = 828; + rType = 0; + vrLen = 2358; + vrLoc = 29; + }; + 1F369E99132309E0004E7A99 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 1FBEBFEE131A97F8006D5497 /* GGSNetwork.m */; + name = "GGSNetwork.m: 39"; + rLen = 0; + rLoc = 828; + rType = 0; + vrLen = 2358; + vrLoc = 29; + }; + 1F369E9A132309E0004E7A99 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 28D7ACF70DDB3853001CB0EB /* PongViewController.m */; + name = "PongViewController.m: 40"; + rLen = 0; + rLoc = 947; + rType = 0; + vrLen = 2223; + vrLoc = 0; + }; + 1F369E9B132309E0004E7A99 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 28D7ACF70DDB3853001CB0EB /* PongViewController.m */; + name = "PongViewController.m: 56"; + rLen = 0; + rLoc = 1256; + rType = 0; + vrLen = 2288; + vrLoc = 191; + }; + 1F369E9E13230A0F004E7A99 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 28D7ACF70DDB3853001CB0EB /* PongViewController.m */; + name = "PongViewController.m: 52"; + rLen = 0; + rLoc = 1168; + rType = 0; + vrLen = 2288; + vrLoc = 191; + }; + 1F369E9F13230A0F004E7A99 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 1FBEBFED131A97F8006D5497 /* GGSNetwork.h */; + name = "GGSNetwork.h: 28"; + rLen = 0; + rLoc = 748; + rType = 0; + vrLen = 910; + vrLoc = 0; + }; + 1F369EA013230A0F004E7A99 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 1FBEBFEE131A97F8006D5497 /* GGSNetwork.m */; + name = "GGSNetwork.m: 64"; + rLen = 0; + rLoc = 1755; + rType = 0; + vrLen = 2447; + vrLoc = 328; + }; + 1F369EA513230A35004E7A99 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 1FBEBFEE131A97F8006D5497 /* GGSNetwork.m */; + name = "GGSNetwork.m: 64"; + rLen = 0; + rLoc = 1755; + rType = 0; + vrLen = 2447; + vrLoc = 328; + }; + 1F369EA613230A35004E7A99 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 28D7ACF70DDB3853001CB0EB /* PongViewController.m */; + name = "PongViewController.m: 52"; + rLen = 0; + rLoc = 1168; + rType = 0; + vrLen = 2288; + vrLoc = 191; + }; + 1F369EA713230A35004E7A99 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 28D7ACF70DDB3853001CB0EB /* PongViewController.m */; + name = "PongViewController.m: 85"; + rLen = 0; + rLoc = 4498; + rType = 0; + vrLen = 2296; + vrLoc = 431; + }; + 1F369EAA13230A56004E7A99 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 28D7ACF70DDB3853001CB0EB /* PongViewController.m */; + name = "PongViewController.m: 86"; + rLen = 0; + rLoc = 4500; + rType = 0; + vrLen = 2280; + vrLoc = 431; + }; + 1F369EAB13230A56004E7A99 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 1FBEBFEE131A97F8006D5497 /* GGSNetwork.m */; + name = "GGSNetwork.m: 64"; + rLen = 0; + rLoc = 1755; + rType = 0; + vrLen = 2447; + vrLoc = 328; + }; + 1F369EAC13230A56004E7A99 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 1FBEBFEE131A97F8006D5497 /* GGSNetwork.m */; + name = "GGSNetwork.m: 39"; + rLen = 0; + rLoc = 799; + rType = 0; + vrLen = 2464; + vrLoc = 329; + }; + 1F369EAF13230A6B004E7A99 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 1FBEBFEE131A97F8006D5497 /* GGSNetwork.m */; + name = "GGSNetwork.m: 69"; + rLen = 0; + rLoc = 1845; + rType = 0; + vrLen = 2490; + vrLoc = 369; + }; + 1F369EB413230AAC004E7A99 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 1FBEBFEE131A97F8006D5497 /* GGSNetwork.m */; + name = "GGSNetwork.m: 40"; + rLen = 0; + rLoc = 799; + rType = 0; + vrLen = 2021; + vrLoc = 3; + }; + 1F369EB513230ADE004E7A99 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 1FBEBFEE131A97F8006D5497 /* GGSNetwork.m */; + name = "GGSNetwork.m: 41"; + rLen = 0; + rLoc = 828; + rType = 0; + vrLen = 2021; + vrLoc = 3; + }; + 1F369EB613230B1D004E7A99 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 1FBEBFEE131A97F8006D5497 /* GGSNetwork.m */; + name = "GGSNetwork.m: 43"; + rLen = 0; + rLoc = 865; + rType = 0; + vrLen = 2028; + vrLoc = 3; + }; + 1F369EBB13230B53004E7A99 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 1FBEBFEE131A97F8006D5497 /* GGSNetwork.m */; + name = "GGSNetwork.m: 43"; + rLen = 0; + rLoc = 865; + rType = 0; + vrLen = 2174; + vrLoc = 29; + }; + 1F369EBF13230B6E004E7A99 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 1FBEBFEE131A97F8006D5497 /* GGSNetwork.m */; + name = "GGSNetwork.m: 43"; + rLen = 0; + rLoc = 865; + rType = 0; + vrLen = 2205; + vrLoc = 122; + }; + 1F369EC013230BF3004E7A99 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 1FBEBFEE131A97F8006D5497 /* GGSNetwork.m */; + name = "GGSNetwork.m: 43"; + rLen = 0; + rLoc = 865; + rType = 0; + vrLen = 2271; + vrLoc = 1750; + }; + 1F369EC113230BF3004E7A99 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 28D7ACF70DDB3853001CB0EB /* PongViewController.m */; + name = "PongViewController.m: 106"; + rLen = 0; + rLoc = 4500; + rType = 0; + vrLen = 2255; + vrLoc = 952; + }; + 1F369EC413230DCA004E7A99 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 28D7ACF70DDB3853001CB0EB /* PongViewController.m */; + name = "PongViewController.m: 93"; + rLen = 0; + rLoc = 3351; + rType = 0; + vrLen = 2412; + vrLoc = 1563; + }; + 1F369EC613230DE0004E7A99 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 28D7ACF70DDB3853001CB0EB /* PongViewController.m */; + name = "PongViewController.m: 93"; + rLen = 0; + rLoc = 3351; + rType = 0; + vrLen = 2416; + vrLoc = 1563; + }; + 1F369ECB13230E71004E7A99 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 28D7ACF70DDB3853001CB0EB /* PongViewController.m */; + name = "PongViewController.m: 93"; + rLen = 0; + rLoc = 3351; + rType = 0; + vrLen = 2259; + vrLoc = 1720; + }; + 1F369ECC13230E71004E7A99 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 1FBEBFED131A97F8006D5497 /* GGSNetwork.h */; + name = "GGSNetwork.h: 28"; + rLen = 0; + rLoc = 748; + rType = 0; + vrLen = 910; + vrLoc = 0; + }; + 1F369ECD13230E71004E7A99 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 1FBEBFEE131A97F8006D5497 /* GGSNetwork.m */; + name = "GGSNetwork.m: 14"; + rLen = 0; + rLoc = 203; + rType = 0; + vrLen = 2036; + vrLoc = 0; + }; + 1F369ED013230E9E004E7A99 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 1FBEBFEE131A97F8006D5497 /* GGSNetwork.m */; + name = "GGSNetwork.m: 14"; + rLen = 0; + rLoc = 203; + rType = 0; + vrLen = 2133; + vrLoc = 3; + }; + 1F369ED313230EAD004E7A99 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 1FBEBFEE131A97F8006D5497 /* GGSNetwork.m */; + name = "GGSNetwork.m: 14"; + rLen = 0; + rLoc = 203; + rType = 0; + vrLen = 2110; + vrLoc = 26; + }; + 1F369ED413230F2A004E7A99 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 1FBEBFEE131A97F8006D5497 /* GGSNetwork.m */; + name = "GGSNetwork.m: 20"; + rLen = 0; + rLoc = 534; + rType = 0; + vrLen = 2271; + vrLoc = 1571; + }; + 1F369ED71323101D004E7A99 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 1FBEBFEE131A97F8006D5497 /* GGSNetwork.m */; + name = "GGSNetwork.m: 20"; + rLen = 0; + rLoc = 534; + rType = 0; + vrLen = 2271; + vrLoc = 1571; + }; + 1F369ED81323101D004E7A99 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 1D3623250D0F684500981E51 /* PongAppDelegate.m */; + name = "PongAppDelegate.m: 60"; + rLen = 0; + rLoc = 2181; + rType = 0; + vrLen = 2635; + vrLoc = 0; + }; + 1F369ED91323101D004E7A99 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 28D7ACF60DDB3853001CB0EB /* PongViewController.h */; + name = "PongViewController.h: 43"; + rLen = 0; + rLoc = 1173; + rType = 0; + vrLen = 1162; + vrLoc = 0; + }; + 1F369EDA1323101D004E7A99 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 28D7ACF70DDB3853001CB0EB /* PongViewController.m */; + name = "PongViewController.m: 104"; + rLen = 0; + rLoc = 3589; + rType = 0; + vrLen = 2119; + vrLoc = 2266; + }; + 1F369EDD1323104E004E7A99 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 28D7ACF70DDB3853001CB0EB /* PongViewController.m */; + name = "PongViewController.m: 121"; + rLen = 1; + rLoc = 4771; + rType = 0; + vrLen = 2160; + vrLoc = 2266; + }; + 1F369EDE1323104E004E7A99 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 1FBEBFEE131A97F8006D5497 /* GGSNetwork.m */; + name = "GGSNetwork.m: 20"; + rLen = 0; + rLoc = 534; + rType = 0; + vrLen = 2273; + vrLoc = 1569; + }; + 1F369EDF1323104E004E7A99 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 1FBEBFEE131A97F8006D5497 /* GGSNetwork.m */; + name = "GGSNetwork.m: 35"; + rLen = 0; + rLoc = 865; + rType = 0; + vrLen = 2277; + vrLoc = 3; + }; + 1F369EE21323105F004E7A99 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 1FBEBFEE131A97F8006D5497 /* GGSNetwork.m */; + name = "GGSNetwork.m: 33"; + rLen = 0; + rLoc = 862; + rType = 0; + vrLen = 2264; + vrLoc = 26; + }; + 1F369EE513231076004E7A99 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 1FBEBFEE131A97F8006D5497 /* GGSNetwork.m */; + name = "GGSNetwork.m: 20"; + rLen = 0; + rLoc = 534; + rType = 0; + vrLen = 2312; + vrLoc = 29; + }; + 1F369EF413231106004E7A99 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 1FBEBFEE131A97F8006D5497 /* GGSNetwork.m */; + name = "GGSNetwork.m: 34"; + rLen = 0; + rLoc = 865; + rType = 0; + vrLen = 2234; + vrLoc = 3; + }; + 1F369EF91323111F004E7A99 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 1FBEBFEE131A97F8006D5497 /* GGSNetwork.m */; + name = "GGSNetwork.m: 14"; + rLen = 0; + rLoc = 203; + rType = 0; + vrLen = 2099; + vrLoc = 26; + }; + 1F369EFC1323113B004E7A99 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 1FBEBFEE131A97F8006D5497 /* GGSNetwork.m */; + name = "GGSNetwork.m: 14"; + rLen = 0; + rLoc = 203; + rType = 0; + vrLen = 2171; + vrLoc = 26; + }; + 1F369EFD1323113B004E7A99 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 28D7ACF70DDB3853001CB0EB /* PongViewController.m */; + name = "PongViewController.m: 105"; + rLen = 0; + rLoc = 3690; + rType = 0; + vrLen = 2161; + vrLoc = 2282; + }; + 1F369F011323115B004E7A99 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 28D7ACF70DDB3853001CB0EB /* PongViewController.m */; + name = "PongViewController.m: 105"; + rLen = 0; + rLoc = 3690; + rType = 0; + vrLen = 2317; + vrLoc = 2302; + }; + 1F369F0413231163004E7A99 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 28D7ACF70DDB3853001CB0EB /* PongViewController.m */; + name = "PongViewController.m: 105"; + rLen = 0; + rLoc = 3690; + rType = 0; + vrLen = 2231; + vrLoc = 2388; + }; + 1F369F0B1323128E004E7A99 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 28D7ACF60DDB3853001CB0EB /* PongViewController.h */; + name = "PongViewController.h: 43"; + rLen = 0; + rLoc = 1173; + rType = 0; + vrLen = 1162; + vrLoc = 0; + }; + 1F369F0C1323128E004E7A99 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 28D7ACF70DDB3853001CB0EB /* PongViewController.m */; + name = "PongViewController.m: 105"; + rLen = 0; + rLoc = 3690; + rType = 0; + vrLen = 2167; + vrLoc = 2533; + }; + 1F369F0D1323128E004E7A99 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 28D7ACF70DDB3853001CB0EB /* PongViewController.m */; + name = "PongViewController.m: 75"; + rLen = 0; + rLoc = 2465; + rType = 0; + vrLen = 2212; + vrLoc = 861; + }; + 1F369F101323129A004E7A99 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 28D7ACF70DDB3853001CB0EB /* PongViewController.m */; + name = "PongViewController.m: 75"; + rLen = 0; + rLoc = 2465; + rType = 0; + vrLen = 2239; + vrLoc = 952; + }; + 1F369F16132312C3004E7A99 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 28D7ACF70DDB3853001CB0EB /* PongViewController.m */; + name = "PongViewController.m: 75"; + rLen = 0; + rLoc = 2465; + rType = 0; + vrLen = 2274; + vrLoc = 992; + }; + 1F369F1F1323136F004E7A99 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 28D7ACF70DDB3853001CB0EB /* PongViewController.m */; + name = "PongViewController.m: 76"; + rLen = 0; + rLoc = 2503; + rType = 0; + vrLen = 2313; + vrLoc = 1029; + }; + 1F369F241323151F004E7A99 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 28D7ACF70DDB3853001CB0EB /* PongViewController.m */; + name = "PongViewController.m: 103"; + rLen = 0; + rLoc = 2770; + rType = 0; + vrLen = 2121; + vrLoc = 971; + }; + 1F369F2913231563004E7A99 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 28D7ACF70DDB3853001CB0EB /* PongViewController.m */; + name = "PongViewController.m: 61"; + rLen = 0; + rLoc = 1370; + rType = 0; + vrLen = 2209; + vrLoc = 524; + }; + 1F369F2D13231572004E7A99 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 28D7ACF70DDB3853001CB0EB /* PongViewController.m */; + name = "PongViewController.m: 61"; + rLen = 0; + rLoc = 1370; + rType = 0; + vrLen = 2210; + vrLoc = 528; + }; + 1F369F2E1323158B004E7A99 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 28D7ACF70DDB3853001CB0EB /* PongViewController.m */; + name = "PongViewController.m: 77"; + rLen = 0; + rLoc = 2044; + rType = 0; + vrLen = 2210; + vrLoc = 528; + }; + 1F369F33132317A8004E7A99 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 1FBEBFED131A97F8006D5497 /* GGSNetwork.h */; + name = "GGSNetwork.h: 28"; + rLen = 0; + rLoc = 748; + rType = 0; + vrLen = 910; + vrLoc = 0; + }; + 1F369F34132317A8004E7A99 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 1FBEBFEE131A97F8006D5497 /* GGSNetwork.m */; + name = "GGSNetwork.m: 14"; + rLen = 0; + rLoc = 203; + rType = 0; + vrLen = 2403; + vrLoc = 236; + }; + 1F369F35132317A8004E7A99 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 28D7ACF70DDB3853001CB0EB /* PongViewController.m */; + name = "PongViewController.m: 45"; + rLen = 0; + rLoc = 1002; + rType = 0; + vrLen = 2210; + vrLoc = 528; + }; + 1F369F36132317A8004E7A99 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 28D7ACF70DDB3853001CB0EB /* PongViewController.m */; + name = "PongViewController.m: 66"; + rLen = 0; + rLoc = 1619; + rType = 0; + vrLen = 2074; + vrLoc = 712; + }; + 1F369F631323270D004E7A99 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 28D7ACF70DDB3853001CB0EB /* PongViewController.m */; + name = "PongViewController.m: 66"; + rLen = 0; + rLoc = 1619; + rType = 0; + vrLen = 2047; + vrLoc = 1504; + }; + 1F369F641323270D004E7A99 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 1FBEBFEE131A97F8006D5497 /* GGSNetwork.m */; + name = "GGSNetwork.m: 14"; + rLen = 0; + rLoc = 203; + rType = 0; + vrLen = 2403; + vrLoc = 236; + }; + 1F369F651323270D004E7A99 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 1FBEBFEE131A97F8006D5497 /* GGSNetwork.m */; + name = "GGSNetwork.m: 69"; + rLen = 0; + rLoc = 1845; + rType = 0; + vrLen = 2623; + vrLoc = 1240; + }; + 1F369F6C13232750004E7A99 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 1FBEBFEE131A97F8006D5497 /* GGSNetwork.m */; + name = "GGSNetwork.m: 69"; + rLen = 0; + rLoc = 1845; + rType = 0; + vrLen = 2571; + vrLoc = 1292; + }; + 1F369F6D13232750004E7A99 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 28D7ACF70DDB3853001CB0EB /* PongViewController.m */; + name = "PongViewController.m: 66"; + rLen = 0; + rLoc = 1619; + rType = 0; + vrLen = 2047; + vrLoc = 1504; + }; + 1F369F6E13232750004E7A99 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 28D7ACF70DDB3853001CB0EB /* PongViewController.m */; + name = "PongViewController.m: 105"; + rLen = 0; + rLoc = 2728; + rType = 0; + vrLen = 2055; + vrLoc = 1660; + }; + 1F369F711323276C004E7A99 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 28D7ACF70DDB3853001CB0EB /* PongViewController.m */; + name = "PongViewController.m: 105"; + rLen = 0; + rLoc = 2768; + rType = 0; + vrLen = 2002; + vrLoc = 1711; + }; + 1F369F76132327A3004E7A99 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 28D7ACF70DDB3853001CB0EB /* PongViewController.m */; + name = "PongViewController.m: 105"; + rLen = 0; + rLoc = 2768; + rType = 0; + vrLen = 1962; + vrLoc = 1792; + }; + 1F369F78132327B7004E7A99 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 28D7ACF70DDB3853001CB0EB /* PongViewController.m */; + name = "PongViewController.m: 105"; + rLen = 0; + rLoc = 2768; + rType = 0; + vrLen = 2031; + vrLoc = 1792; + }; + 1F369F8913232BEE004E7A99 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 28D7ACF70DDB3853001CB0EB /* PongViewController.m */; + name = "PongViewController.m: 135"; + rLen = 0; + rLoc = 3582; + rType = 0; + vrLen = 1976; + vrLoc = 1846; + }; + 1F369F8C13232BF6004E7A99 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 28D7ACF70DDB3853001CB0EB /* PongViewController.m */; + name = "PongViewController.m: 135"; + rLen = 0; + rLoc = 3582; + rType = 0; + vrLen = 2013; + vrLoc = 1847; + }; + 1F369F9013232C36004E7A99 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 28D7ACF70DDB3853001CB0EB /* PongViewController.m */; + name = "PongViewController.m: 137"; + rLen = 0; + rLoc = 3569; + rType = 0; + vrLen = 1951; + vrLoc = 1955; + }; + 1F369F9213232C3B004E7A99 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 28D7ACF70DDB3853001CB0EB /* PongViewController.m */; + name = "PongViewController.m: 137"; + rLen = 0; + rLoc = 3569; + rType = 0; + vrLen = 2020; + vrLoc = 1955; + }; + 1F369F9713232C58004E7A99 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 28D7ACF70DDB3853001CB0EB /* PongViewController.m */; + name = "PongViewController.m: 133"; + rLen = 0; + rLoc = 3431; + rType = 0; + vrLen = 1936; + vrLoc = 2041; + }; + 1F369F9813232C66004E7A99 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 28D7ACF70DDB3853001CB0EB /* PongViewController.m */; + name = "PongViewController.m: 139"; + rLen = 0; + rLoc = 3690; + rType = 0; + vrLen = 1936; + vrLoc = 2041; + }; + 1F369FAB13233178004E7A99 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 28D7ACF70DDB3853001CB0EB /* PongViewController.m */; + name = "PongViewController.m: 91"; + rLen = 0; + rLoc = 2356; + rType = 0; + vrLen = 2153; + vrLoc = 1097; + }; + 1F369FAE132331BB004E7A99 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 28D7ACF70DDB3853001CB0EB /* PongViewController.m */; + name = "PongViewController.m: 91"; + rLen = 0; + rLoc = 2356; + rType = 0; + vrLen = 2073; + vrLoc = 1211; + }; + 1F369FBB1323344E004E7A99 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 28D7ACF70DDB3853001CB0EB /* PongViewController.m */; + name = "PongViewController.m: 69"; + rLen = 0; + rLoc = 1698; + rType = 0; + vrLen = 2080; + vrLoc = 996; + }; + 1F369FBE132334E1004E7A99 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 28D7ACF70DDB3853001CB0EB /* PongViewController.m */; + name = "PongViewController.m: 21"; + rLen = 0; + rLoc = 358; + rType = 0; + vrLen = 2202; + vrLoc = 136; + }; + 1F369FC313233530004E7A99 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 28D7ACF70DDB3853001CB0EB /* PongViewController.m */; + name = "PongViewController.m: 69"; + rLen = 0; + rLoc = 1698; + rType = 0; + vrLen = 2209; + vrLoc = 191; + }; + 1F369FCA132335A2004E7A99 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 28D7ACF70DDB3853001CB0EB /* PongViewController.m */; + name = "PongViewController.m: 69"; + rLen = 0; + rLoc = 1698; + rType = 0; + vrLen = 2234; + vrLoc = 252; + }; + 1F369FCD132335E1004E7A99 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 28D7ACF70DDB3853001CB0EB /* PongViewController.m */; + name = "PongViewController.m: 69"; + rLen = 0; + rLoc = 1698; + rType = 0; + vrLen = 2245; + vrLoc = 298; + }; + 1F369FD2132336DF004E7A99 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 28D7ACF70DDB3853001CB0EB /* PongViewController.m */; + name = "PongViewController.m: 69"; + rLen = 0; + rLoc = 1698; + rType = 0; + vrLen = 2216; + vrLoc = 357; + }; + 1F369FD313233721004E7A99 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 28D7ACF70DDB3853001CB0EB /* PongViewController.m */; + name = "PongViewController.m: 22"; + rLen = 0; + rLoc = 386; + rType = 0; + vrLen = 2225; + vrLoc = 40; + }; + 1F369FDA13233780004E7A99 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 28D7ACF70DDB3853001CB0EB /* PongViewController.m */; + name = "PongViewController.m: 69"; + rLen = 0; + rLoc = 1698; + rType = 0; + vrLen = 2113; + vrLoc = 693; + }; + 1F369FE1132338AC004E7A99 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 28D7ACF70DDB3853001CB0EB /* PongViewController.m */; + name = "PongViewController.m: 69"; + rLen = 0; + rLoc = 1698; + rType = 0; + vrLen = 1981; + vrLoc = 836; + }; + 1F369FE3132338C0004E7A99 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 28D7ACF70DDB3853001CB0EB /* PongViewController.m */; + name = "PongViewController.m: 69"; + rLen = 0; + rLoc = 1698; + rType = 0; + vrLen = 1996; + vrLoc = 836; + }; + 1F369FE61323395B004E7A99 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 1FBEC030131AF83B006D5497 /* GGSDelegate.h */; + name = "GGSDelegate.h: 16"; + rLen = 0; + rLoc = 283; + rType = 0; + vrLen = 531; + vrLoc = 0; + }; + 1F369FE71323395B004E7A99 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 28D7ACF70DDB3853001CB0EB /* PongViewController.m */; + name = "PongViewController.m: 69"; + rLen = 0; + rLoc = 1698; + rType = 0; + vrLen = 1994; + vrLoc = 838; + }; + 1F369FE81323395B004E7A99 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 28D7ACF70DDB3853001CB0EB /* PongViewController.m */; + name = "PongViewController.m: 60"; + rLen = 0; + rLoc = 1369; + rType = 0; + vrLen = 1964; + vrLoc = 838; + }; + 1F36A00A13233D92004E7A99 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 28D7ACF60DDB3853001CB0EB /* PongViewController.h */; + name = "PongViewController.h: 35"; + rLen = 0; + rLoc = 744; + rType = 0; + vrLen = 1245; + vrLoc = 0; + }; + 1F36A00B13233D92004E7A99 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 28D7ACF70DDB3853001CB0EB /* PongViewController.m */; + name = "PongViewController.m: 73"; + rLen = 0; + rLoc = 1894; + rType = 0; + vrLen = 2005; + vrLoc = 971; + }; + 1F36A00C13233D92004E7A99 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 28D7ACF70DDB3853001CB0EB /* PongViewController.m */; + name = "PongViewController.m: 328"; + rLen = 0; + rLoc = 8674; + rType = 0; + vrLen = 2044; + vrLoc = 845; + }; + 1F36A00F13233EE7004E7A99 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 28D7ACF60DDB3853001CB0EB /* PongViewController.h */; + name = "PongViewController.h: 12"; + rLen = 0; + rLoc = 246; + rType = 0; + vrLen = 1284; + vrLoc = 0; + }; + 1F36A01013233EE7004E7A99 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 28D7ACF70DDB3853001CB0EB /* PongViewController.m */; + name = "PongViewController.m: 11"; + rLen = 0; + rLoc = 168; + rType = 0; + vrLen = 2123; + vrLoc = 0; + }; + 1F36A01113233EE7004E7A99 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 28D7ACF70DDB3853001CB0EB /* PongViewController.m */; + name = "PongViewController.m: 1"; + rLen = 0; + rLoc = 0; + rType = 0; + vrLen = 2159; + vrLoc = 3; + }; + 1F36A01713233F1E004E7A99 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 28D7ACF70DDB3853001CB0EB /* PongViewController.m */; + name = "PongViewController.m: 1"; + rLen = 0; + rLoc = 0; + rType = 0; + vrLen = 2167; + vrLoc = 40; + }; + 1F36A0201323417E004E7A99 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 28D7ACF60DDB3853001CB0EB /* PongViewController.h */; + name = "PongViewController.h: 12"; + rLen = 0; + rLoc = 246; + rType = 0; + vrLen = 1284; + vrLoc = 0; + }; + 1F36A0211323417E004E7A99 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 28D7ACF70DDB3853001CB0EB /* PongViewController.m */; + name = "PongViewController.m: 1"; + rLen = 0; + rLoc = 0; + rType = 0; + vrLen = 2167; + vrLoc = 169; + }; + 1F36A0221323417E004E7A99 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 28D7ACF70DDB3853001CB0EB /* PongViewController.m */; + name = "PongViewController.m: 166"; + rLen = 0; + rLoc = 4434; + rType = 0; + vrLen = 2239; + vrLoc = 2533; + }; 1FA0569112F0B513003F1373 /* Pong */ = { isa = PBXExecutable; activeArgIndices = ( @@ -146,9 +1166,9 @@ }; 1FBEBF4C1319FCDE006D5497 /* AsyncSocket.m */ = { uiCtxt = { - sepNavIntBoundsRect = "{{0, 0}, {900, 63840}}"; - sepNavSelRange = "{0, 0}"; - sepNavVisRange = "{0, 2997}"; + sepNavIntBoundsRect = "{{0, 0}, {852, 64080}}"; + sepNavSelRange = "{69038, 0}"; + sepNavVisRange = "{20925, 796}"; }; }; 1FBEBFED131A97F8006D5497 /* GGSNetwork.h */ = { @@ -160,9 +1180,9 @@ }; 1FBEBFEE131A97F8006D5497 /* GGSNetwork.m */ = { uiCtxt = { - sepNavIntBoundsRect = "{{0, 0}, {998, 1920}}"; - sepNavSelRange = "{1529, 0}"; - sepNavVisRange = "{860, 2676}"; + sepNavIntBoundsRect = "{{0, 0}, {998, 2055}}"; + sepNavSelRange = "{1845, 0}"; + sepNavVisRange = "{1292, 2571}"; }; }; 1FBEC001131AA71C006D5497 /* PBXTextBookmark */ = { @@ -217,7 +1237,7 @@ fRef = 28D7ACF60DDB3853001CB0EB /* PongViewController.h */; name = "PongViewController.h: 11"; rLen = 0; - rLoc = 207; + rLoc = 246; rType = 0; vrLen = 1144; vrLoc = 0; @@ -237,7 +1257,7 @@ fRef = 1FBEBFEE131A97F8006D5497 /* GGSNetwork.m */; name = "GGSNetwork.m: 44"; rLen = 108; - rLoc = 963; + rLoc = 971; rType = 0; vrLen = 2551; vrLoc = 369; @@ -257,7 +1277,7 @@ fRef = 28D7ACF70DDB3853001CB0EB /* PongViewController.m */; name = "PongViewController.m: 48"; rLen = 0; - rLoc = 1280; + rLoc = 1181; rType = 0; vrLen = 2007; vrLoc = 0; @@ -267,7 +1287,7 @@ fRef = 28D7ACF70DDB3853001CB0EB /* PongViewController.m */; name = "PongViewController.m: 85"; rLen = 0; - rLoc = 2811; + rLoc = 4848; rType = 0; vrLen = 2258; vrLoc = 1218; @@ -275,23 +1295,24 @@ 28D7ACF60DDB3853001CB0EB /* PongViewController.h */ = { uiCtxt = { sepNavIntBoundsRect = "{{0, 0}, {998, 1171}}"; - sepNavSelRange = "{207, 0}"; - sepNavVisRange = "{0, 1144}"; + sepNavSelRange = "{246, 0}"; + sepNavVisRange = "{0, 1284}"; }; }; 28D7ACF70DDB3853001CB0EB /* PongViewController.m */ = { uiCtxt = { - sepNavIntBoundsRect = "{{0, 0}, {998, 3810}}"; - sepNavSelRange = "{989, 0}"; - sepNavVisRange = "{799, 2275}"; + sepNavIntBoundsRect = "{{0, 0}, {998, 5070}}"; + sepNavSelRange = "{4434, 0}"; + sepNavVisRange = "{2533, 2239}"; }; }; 29B97313FDCFA39411CA2CEA /* Project object */ = { activeBuildConfigurationName = Debug; activeExecutable = 1FA0569112F0B513003F1373 /* Pong */; - activeSDKPreference = iphoneos4.2; + activeSDKPreference = iphonesimulator4.2; activeTarget = 1D6058900D05DD3D006BFB54 /* Pong */; addToTargets = ( + 1D6058900D05DD3D006BFB54 /* Pong */, ); codeSenseManager = 1FA0569E12F0B528003F1373 /* Code sense */; executables = ( @@ -330,6 +1351,108 @@ 1F369E791323081C004E7A99 /* PBXTextBookmark */ = 1F369E791323081C004E7A99 /* PBXTextBookmark */; 1F369E7A1323081C004E7A99 /* PBXTextBookmark */ = 1F369E7A1323081C004E7A99 /* PBXTextBookmark */; 1F369E7B1323081C004E7A99 /* PBXTextBookmark */ = 1F369E7B1323081C004E7A99 /* PBXTextBookmark */; + 1F369E8A13230953004E7A99 /* PBXTextBookmark */ = 1F369E8A13230953004E7A99 /* PBXTextBookmark */; + 1F369E8B13230953004E7A99 /* PBXTextBookmark */ = 1F369E8B13230953004E7A99 /* PBXTextBookmark */; + 1F369E8C13230953004E7A99 /* PBXTextBookmark */ = 1F369E8C13230953004E7A99 /* PBXTextBookmark */; + 1F369E9313230981004E7A99 /* PBXTextBookmark */ = 1F369E9313230981004E7A99 /* PBXTextBookmark */; + 1F369E961323099B004E7A99 /* PBXTextBookmark */ = 1F369E961323099B004E7A99 /* PBXTextBookmark */; + 1F369E99132309E0004E7A99 /* PBXTextBookmark */ = 1F369E99132309E0004E7A99 /* PBXTextBookmark */; + 1F369E9A132309E0004E7A99 /* PBXTextBookmark */ = 1F369E9A132309E0004E7A99 /* PBXTextBookmark */; + 1F369E9B132309E0004E7A99 /* PBXTextBookmark */ = 1F369E9B132309E0004E7A99 /* PBXTextBookmark */; + 1F369E9E13230A0F004E7A99 /* PBXTextBookmark */ = 1F369E9E13230A0F004E7A99 /* PBXTextBookmark */; + 1F369E9F13230A0F004E7A99 /* PBXTextBookmark */ = 1F369E9F13230A0F004E7A99 /* PBXTextBookmark */; + 1F369EA013230A0F004E7A99 /* PBXTextBookmark */ = 1F369EA013230A0F004E7A99 /* PBXTextBookmark */; + 1F369EA513230A35004E7A99 /* PBXTextBookmark */ = 1F369EA513230A35004E7A99 /* PBXTextBookmark */; + 1F369EA613230A35004E7A99 /* PBXTextBookmark */ = 1F369EA613230A35004E7A99 /* PBXTextBookmark */; + 1F369EA713230A35004E7A99 /* PBXTextBookmark */ = 1F369EA713230A35004E7A99 /* PBXTextBookmark */; + 1F369EAA13230A56004E7A99 /* PBXTextBookmark */ = 1F369EAA13230A56004E7A99 /* PBXTextBookmark */; + 1F369EAB13230A56004E7A99 /* PBXTextBookmark */ = 1F369EAB13230A56004E7A99 /* PBXTextBookmark */; + 1F369EAC13230A56004E7A99 /* PBXTextBookmark */ = 1F369EAC13230A56004E7A99 /* PBXTextBookmark */; + 1F369EAF13230A6B004E7A99 /* PBXTextBookmark */ = 1F369EAF13230A6B004E7A99 /* PBXTextBookmark */; + 1F369EB413230AAC004E7A99 /* PBXTextBookmark */ = 1F369EB413230AAC004E7A99 /* PBXTextBookmark */; + 1F369EB513230ADE004E7A99 /* PBXTextBookmark */ = 1F369EB513230ADE004E7A99 /* PBXTextBookmark */; + 1F369EB613230B1D004E7A99 /* PBXTextBookmark */ = 1F369EB613230B1D004E7A99 /* PBXTextBookmark */; + 1F369EBB13230B53004E7A99 /* PBXTextBookmark */ = 1F369EBB13230B53004E7A99 /* PBXTextBookmark */; + 1F369EBF13230B6E004E7A99 /* PBXTextBookmark */ = 1F369EBF13230B6E004E7A99 /* PBXTextBookmark */; + 1F369EC013230BF3004E7A99 /* PBXTextBookmark */ = 1F369EC013230BF3004E7A99 /* PBXTextBookmark */; + 1F369EC113230BF3004E7A99 /* PBXTextBookmark */ = 1F369EC113230BF3004E7A99 /* PBXTextBookmark */; + 1F369EC413230DCA004E7A99 /* PBXTextBookmark */ = 1F369EC413230DCA004E7A99 /* PBXTextBookmark */; + 1F369EC613230DE0004E7A99 /* PBXTextBookmark */ = 1F369EC613230DE0004E7A99 /* PBXTextBookmark */; + 1F369ECB13230E71004E7A99 /* PBXTextBookmark */ = 1F369ECB13230E71004E7A99 /* PBXTextBookmark */; + 1F369ECC13230E71004E7A99 /* PBXTextBookmark */ = 1F369ECC13230E71004E7A99 /* PBXTextBookmark */; + 1F369ECD13230E71004E7A99 /* PBXTextBookmark */ = 1F369ECD13230E71004E7A99 /* PBXTextBookmark */; + 1F369ED013230E9E004E7A99 /* PBXTextBookmark */ = 1F369ED013230E9E004E7A99 /* PBXTextBookmark */; + 1F369ED313230EAD004E7A99 /* PBXTextBookmark */ = 1F369ED313230EAD004E7A99 /* PBXTextBookmark */; + 1F369ED413230F2A004E7A99 /* PBXTextBookmark */ = 1F369ED413230F2A004E7A99 /* PBXTextBookmark */; + 1F369ED71323101D004E7A99 /* PBXTextBookmark */ = 1F369ED71323101D004E7A99 /* PBXTextBookmark */; + 1F369ED81323101D004E7A99 /* PBXTextBookmark */ = 1F369ED81323101D004E7A99 /* PBXTextBookmark */; + 1F369ED91323101D004E7A99 /* PBXTextBookmark */ = 1F369ED91323101D004E7A99 /* PBXTextBookmark */; + 1F369EDA1323101D004E7A99 /* PBXTextBookmark */ = 1F369EDA1323101D004E7A99 /* PBXTextBookmark */; + 1F369EDD1323104E004E7A99 /* PBXTextBookmark */ = 1F369EDD1323104E004E7A99 /* PBXTextBookmark */; + 1F369EDE1323104E004E7A99 /* PBXTextBookmark */ = 1F369EDE1323104E004E7A99 /* PBXTextBookmark */; + 1F369EDF1323104E004E7A99 /* PBXTextBookmark */ = 1F369EDF1323104E004E7A99 /* PBXTextBookmark */; + 1F369EE21323105F004E7A99 /* PBXTextBookmark */ = 1F369EE21323105F004E7A99 /* PBXTextBookmark */; + 1F369EE513231076004E7A99 /* PBXTextBookmark */ = 1F369EE513231076004E7A99 /* PBXTextBookmark */; + 1F369EF413231106004E7A99 /* PBXTextBookmark */ = 1F369EF413231106004E7A99 /* PBXTextBookmark */; + 1F369EF91323111F004E7A99 /* PBXTextBookmark */ = 1F369EF91323111F004E7A99 /* PBXTextBookmark */; + 1F369EFC1323113B004E7A99 /* PBXTextBookmark */ = 1F369EFC1323113B004E7A99 /* PBXTextBookmark */; + 1F369EFD1323113B004E7A99 /* PBXTextBookmark */ = 1F369EFD1323113B004E7A99 /* PBXTextBookmark */; + 1F369F011323115B004E7A99 /* PBXTextBookmark */ = 1F369F011323115B004E7A99 /* PBXTextBookmark */; + 1F369F0413231163004E7A99 /* PBXTextBookmark */ = 1F369F0413231163004E7A99 /* PBXTextBookmark */; + 1F369F0B1323128E004E7A99 /* PBXTextBookmark */ = 1F369F0B1323128E004E7A99 /* PBXTextBookmark */; + 1F369F0C1323128E004E7A99 /* PBXTextBookmark */ = 1F369F0C1323128E004E7A99 /* PBXTextBookmark */; + 1F369F0D1323128E004E7A99 /* PBXTextBookmark */ = 1F369F0D1323128E004E7A99 /* PBXTextBookmark */; + 1F369F101323129A004E7A99 /* PBXTextBookmark */ = 1F369F101323129A004E7A99 /* PBXTextBookmark */; + 1F369F16132312C3004E7A99 /* PBXTextBookmark */ = 1F369F16132312C3004E7A99 /* PBXTextBookmark */; + 1F369F1F1323136F004E7A99 /* PBXTextBookmark */ = 1F369F1F1323136F004E7A99 /* PBXTextBookmark */; + 1F369F241323151F004E7A99 /* PBXTextBookmark */ = 1F369F241323151F004E7A99 /* PBXTextBookmark */; + 1F369F2913231563004E7A99 /* PBXTextBookmark */ = 1F369F2913231563004E7A99 /* PBXTextBookmark */; + 1F369F2D13231572004E7A99 /* PBXTextBookmark */ = 1F369F2D13231572004E7A99 /* PBXTextBookmark */; + 1F369F2E1323158B004E7A99 /* PBXTextBookmark */ = 1F369F2E1323158B004E7A99 /* PBXTextBookmark */; + 1F369F33132317A8004E7A99 /* PBXTextBookmark */ = 1F369F33132317A8004E7A99 /* PBXTextBookmark */; + 1F369F34132317A8004E7A99 /* PBXTextBookmark */ = 1F369F34132317A8004E7A99 /* PBXTextBookmark */; + 1F369F35132317A8004E7A99 /* PBXTextBookmark */ = 1F369F35132317A8004E7A99 /* PBXTextBookmark */; + 1F369F36132317A8004E7A99 /* PBXTextBookmark */ = 1F369F36132317A8004E7A99 /* PBXTextBookmark */; + 1F369F631323270D004E7A99 /* PBXTextBookmark */ = 1F369F631323270D004E7A99 /* PBXTextBookmark */; + 1F369F641323270D004E7A99 /* PBXTextBookmark */ = 1F369F641323270D004E7A99 /* PBXTextBookmark */; + 1F369F651323270D004E7A99 /* PBXTextBookmark */ = 1F369F651323270D004E7A99 /* PBXTextBookmark */; + 1F369F6C13232750004E7A99 /* PBXTextBookmark */ = 1F369F6C13232750004E7A99 /* PBXTextBookmark */; + 1F369F6D13232750004E7A99 /* PBXTextBookmark */ = 1F369F6D13232750004E7A99 /* PBXTextBookmark */; + 1F369F6E13232750004E7A99 /* PBXTextBookmark */ = 1F369F6E13232750004E7A99 /* PBXTextBookmark */; + 1F369F711323276C004E7A99 /* PBXTextBookmark */ = 1F369F711323276C004E7A99 /* PBXTextBookmark */; + 1F369F76132327A3004E7A99 /* PBXTextBookmark */ = 1F369F76132327A3004E7A99 /* PBXTextBookmark */; + 1F369F78132327B7004E7A99 /* PBXTextBookmark */ = 1F369F78132327B7004E7A99 /* PBXTextBookmark */; + 1F369F8913232BEE004E7A99 /* PBXTextBookmark */ = 1F369F8913232BEE004E7A99 /* PBXTextBookmark */; + 1F369F8C13232BF6004E7A99 /* PBXTextBookmark */ = 1F369F8C13232BF6004E7A99 /* PBXTextBookmark */; + 1F369F9013232C36004E7A99 /* PBXTextBookmark */ = 1F369F9013232C36004E7A99 /* PBXTextBookmark */; + 1F369F9213232C3B004E7A99 /* PBXTextBookmark */ = 1F369F9213232C3B004E7A99 /* PBXTextBookmark */; + 1F369F9713232C58004E7A99 /* PBXTextBookmark */ = 1F369F9713232C58004E7A99 /* PBXTextBookmark */; + 1F369F9813232C66004E7A99 /* PBXTextBookmark */ = 1F369F9813232C66004E7A99 /* PBXTextBookmark */; + 1F369FAB13233178004E7A99 /* PBXTextBookmark */ = 1F369FAB13233178004E7A99 /* PBXTextBookmark */; + 1F369FAE132331BB004E7A99 /* PBXTextBookmark */ = 1F369FAE132331BB004E7A99 /* PBXTextBookmark */; + 1F369FBB1323344E004E7A99 /* PBXTextBookmark */ = 1F369FBB1323344E004E7A99 /* PBXTextBookmark */; + 1F369FBE132334E1004E7A99 /* PBXTextBookmark */ = 1F369FBE132334E1004E7A99 /* PBXTextBookmark */; + 1F369FC313233530004E7A99 /* PBXTextBookmark */ = 1F369FC313233530004E7A99 /* PBXTextBookmark */; + 1F369FCA132335A2004E7A99 /* PBXTextBookmark */ = 1F369FCA132335A2004E7A99 /* PBXTextBookmark */; + 1F369FCD132335E1004E7A99 /* PBXTextBookmark */ = 1F369FCD132335E1004E7A99 /* PBXTextBookmark */; + 1F369FD2132336DF004E7A99 /* PBXTextBookmark */ = 1F369FD2132336DF004E7A99 /* PBXTextBookmark */; + 1F369FD313233721004E7A99 /* PBXTextBookmark */ = 1F369FD313233721004E7A99 /* PBXTextBookmark */; + 1F369FDA13233780004E7A99 /* PBXTextBookmark */ = 1F369FDA13233780004E7A99 /* PBXTextBookmark */; + 1F369FE1132338AC004E7A99 /* PBXTextBookmark */ = 1F369FE1132338AC004E7A99 /* PBXTextBookmark */; + 1F369FE3132338C0004E7A99 /* PBXTextBookmark */ = 1F369FE3132338C0004E7A99 /* PBXTextBookmark */; + 1F369FE61323395B004E7A99 /* PBXTextBookmark */ = 1F369FE61323395B004E7A99 /* PBXTextBookmark */; + 1F369FE71323395B004E7A99 /* PBXTextBookmark */ = 1F369FE71323395B004E7A99 /* PBXTextBookmark */; + 1F369FE81323395B004E7A99 /* PBXTextBookmark */ = 1F369FE81323395B004E7A99 /* PBXTextBookmark */; + 1F36A00A13233D92004E7A99 /* PBXTextBookmark */ = 1F36A00A13233D92004E7A99 /* PBXTextBookmark */; + 1F36A00B13233D92004E7A99 /* PBXTextBookmark */ = 1F36A00B13233D92004E7A99 /* PBXTextBookmark */; + 1F36A00C13233D92004E7A99 /* PBXTextBookmark */ = 1F36A00C13233D92004E7A99 /* PBXTextBookmark */; + 1F36A00F13233EE7004E7A99 /* PBXTextBookmark */ = 1F36A00F13233EE7004E7A99 /* PBXTextBookmark */; + 1F36A01013233EE7004E7A99 /* PBXTextBookmark */ = 1F36A01013233EE7004E7A99 /* PBXTextBookmark */; + 1F36A01113233EE7004E7A99 /* PBXTextBookmark */ = 1F36A01113233EE7004E7A99 /* PBXTextBookmark */; + 1F36A01713233F1E004E7A99 /* PBXTextBookmark */ = 1F36A01713233F1E004E7A99 /* PBXTextBookmark */; + 1F36A0201323417E004E7A99 /* PBXTextBookmark */ = 1F36A0201323417E004E7A99 /* PBXTextBookmark */; + 1F36A0211323417E004E7A99 /* PBXTextBookmark */ = 1F36A0211323417E004E7A99 /* PBXTextBookmark */; + 1F36A0221323417E004E7A99 /* PBXTextBookmark */ = 1F36A0221323417E004E7A99 /* PBXTextBookmark */; 1FBEBF151319F5C1006D5497 = 1FBEBF151319F5C1006D5497 /* PlistBookmark */; 1FBEC001131AA71C006D5497 = 1FBEC001131AA71C006D5497 /* PBXTextBookmark */; 1FBEC002131AA71C006D5497 = 1FBEC002131AA71C006D5497 /* PBXTextBookmark */; diff --git a/games/Pong/Pong.xcodeproj/project.pbxproj b/games/Pong/Pong.xcodeproj/project.pbxproj index de1410d..2e77be5 100755 --- a/games/Pong/Pong.xcodeproj/project.pbxproj +++ b/games/Pong/Pong.xcodeproj/project.pbxproj @@ -11,6 +11,10 @@ 1D60589B0D05DD56006BFB54 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 29B97316FDCFA39411CA2CEA /* main.m */; }; 1D60589F0D05DD5A006BFB54 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1D30AB110D05D00D00671497 /* Foundation.framework */; }; 1DF5F4E00D08C38300B7A737 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1DF5F4DF0D08C38300B7A737 /* UIKit.framework */; }; + 1F369FF813233C1E004E7A99 /* lost.wav in Resources */ = {isa = PBXBuildFile; fileRef = 1F369FF513233C1E004E7A99 /* lost.wav */; }; + 1F369FF913233C1E004E7A99 /* ping.wav in Resources */ = {isa = PBXBuildFile; fileRef = 1F369FF613233C1E004E7A99 /* ping.wav */; }; + 1F369FFA13233C1E004E7A99 /* pong.wav in Resources */ = {isa = PBXBuildFile; fileRef = 1F369FF713233C1E004E7A99 /* pong.wav */; }; + 1F36A00713233CCC004E7A99 /* AVFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1F36A00613233CCC004E7A99 /* AVFoundation.framework */; }; 1FBEBF481319FC56006D5497 /* CFNetwork.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1FBEBF471319FC56006D5497 /* CFNetwork.framework */; }; 1FBEBF4D1319FCDE006D5497 /* AsyncSocket.m in Sources */ = {isa = PBXBuildFile; fileRef = 1FBEBF4C1319FCDE006D5497 /* AsyncSocket.m */; }; 1FBEBFEF131A97F8006D5497 /* GGSNetwork.m in Sources */ = {isa = PBXBuildFile; fileRef = 1FBEBFEE131A97F8006D5497 /* GGSNetwork.m */; }; @@ -26,6 +30,10 @@ 1D3623250D0F684500981E51 /* PongAppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PongAppDelegate.m; sourceTree = ""; }; 1D6058910D05DD3D006BFB54 /* Pong.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Pong.app; sourceTree = BUILT_PRODUCTS_DIR; }; 1DF5F4DF0D08C38300B7A737 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; + 1F369FF513233C1E004E7A99 /* lost.wav */ = {isa = PBXFileReference; lastKnownFileType = audio.wav; path = lost.wav; sourceTree = ""; }; + 1F369FF613233C1E004E7A99 /* ping.wav */ = {isa = PBXFileReference; lastKnownFileType = audio.wav; path = ping.wav; sourceTree = ""; }; + 1F369FF713233C1E004E7A99 /* pong.wav */ = {isa = PBXFileReference; lastKnownFileType = audio.wav; path = pong.wav; sourceTree = ""; }; + 1F36A00613233CCC004E7A99 /* AVFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AVFoundation.framework; path = System/Library/Frameworks/AVFoundation.framework; sourceTree = SDKROOT; }; 1FBEBF471319FC56006D5497 /* CFNetwork.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CFNetwork.framework; path = System/Library/Frameworks/CFNetwork.framework; sourceTree = SDKROOT; }; 1FBEBF4B1319FCDE006D5497 /* AsyncSocket.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AsyncSocket.h; sourceTree = ""; }; 1FBEBF4C1319FCDE006D5497 /* AsyncSocket.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AsyncSocket.m; sourceTree = ""; }; @@ -51,6 +59,7 @@ 1DF5F4E00D08C38300B7A737 /* UIKit.framework in Frameworks */, 288765A50DF7441C002DB57D /* CoreGraphics.framework in Frameworks */, 1FBEBF481319FC56006D5497 /* CFNetwork.framework in Frameworks */, + 1F36A00713233CCC004E7A99 /* AVFoundation.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -115,6 +124,9 @@ children = ( 2899E5210DE3E06400AC0155 /* PongViewController.xib */, 28AD733E0D9D9553002E5188 /* MainWindow.xib */, + 1F369FF513233C1E004E7A99 /* lost.wav */, + 1F369FF613233C1E004E7A99 /* ping.wav */, + 1F369FF713233C1E004E7A99 /* pong.wav */, 8D1107310486CEB800E47090 /* Pong-Info.plist */, ); name = Resources; @@ -127,6 +139,7 @@ 1D30AB110D05D00D00671497 /* Foundation.framework */, 288765A40DF7441C002DB57D /* CoreGraphics.framework */, 1FBEBF471319FC56006D5497 /* CFNetwork.framework */, + 1F36A00613233CCC004E7A99 /* AVFoundation.framework */, ); name = Frameworks; sourceTree = ""; @@ -182,6 +195,9 @@ files = ( 28AD733F0D9D9553002E5188 /* MainWindow.xib in Resources */, 2899E5220DE3E06400AC0155 /* PongViewController.xib in Resources */, + 1F369FF813233C1E004E7A99 /* lost.wav in Resources */, + 1F369FF913233C1E004E7A99 /* ping.wav in Resources */, + 1F369FFA13233C1E004E7A99 /* pong.wav in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/games/Pong/lost.wav b/games/Pong/lost.wav new file mode 100644 index 0000000000000000000000000000000000000000..0ca32c66db29064a13961bb692524c27cb049cf8 GIT binary patch literal 34278 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 handle_call(join_lobby, From, State) -> Token = helpers:get_new_token(), Players = State#co_state.players, - io:format("join_lobby from: ~p~n", [From]), {Pid, _Sock} = From, NewState = State#co_state{players = [{Pid, Token} | Players]}, back_up(NewState), diff --git a/src/ggs_gamevm_p.erl b/src/ggs_gamevm_p.erl index bd1beb3..4d4cd67 100644 --- a/src/ggs_gamevm_p.erl +++ b/src/ggs_gamevm_p.erl @@ -191,8 +191,9 @@ intern_start(Table, Player) -> true -> ggs_table:notify_all_players(Table, {"game", "start"}), ggs_db:setItem(Table, local_storage, ball, {50,50,1,1}), - spawn(fun() -> game_loop([Table]) end); - false -> + Pid = spawn(fun() -> game_loop([Table]) end), + Pid ! tick; + _Other -> ggs_table:send_command(Table, Player, {"game", "wait"}) end; player2 -> @@ -202,8 +203,9 @@ intern_start(Table, Player) -> true -> ggs_table:notify_all_players(Table, {"game", "start"}), ggs_db:setItem(Table, local_storage, ball, {50,50,-1,-1}), - spawn(fun() -> game_loop([Table]) end); - false -> + GameLoop = spawn(fun() -> game_loop([Table]) end), + GameLoop ! tick; + _Other -> ggs_table:send_command(Table, Player, {"game", "wait"}) end end. @@ -215,18 +217,19 @@ game_loop([Table]) -> Ball = {BX, BY, SX, SY}, ggs_db:setItem(Table, local_storage, ball, Ball), ggs_table:notify_all_players(Table, {"ball", int2str(BX) ++ "," ++ int2str(BY)}), - check_ball(Table, Ball); + check_ball(Table, Ball), + timer:send_after(50, tick), + game_loop([Table]); 'EXIT' -> exit(normal) - after 5000 -> - self() ! tick end. int2str(Int) -> lists:flatten(io_lib:format("~p", [Int])). step_ball({BX, BY, SX, SY}) -> - {BX + SX, BY + SY, SX, BY}. + Ball = {BX + SX, BY + SY, SX, SY}, + Ball. check_ball(Table, {BX, BY, SX, SY}) -> % check up and down bounds @@ -237,43 +240,52 @@ check_ball(Table, {BX, BY, SX, SY}) -> NewSY = SY end, - % check intersection with player1 + % check intersection with a player P1Y = ggs_db:getItem(Table, local_storage, player1_y), - case check_intersect({0, P1Y, 10, 30}, {BX, BY, 10, 10}) of - true -> - SX1 = -SX; - false -> - SX1 = SX - end, - - % check intersection with player2 P2Y = ggs_db:getItem(Table, local_storage, player2_y), - case check_intersect({90, P2Y, 10, 30}, {BX, BY, 10, 10}) of + case (check_intersect({0, P1Y, 10, 30}, {BX, BY, 10, 10}) or check_intersect({99, P2Y, 10, 30}, {BX, BY, 10, 10})) of true -> - SX2 = - SX1; + NewSX = -SX, + case NewSX of + -1 -> + ggs_table:notify_all_players(Table, {"sound", "ping"}); + 1 -> + ggs_table:notify_all_players(Table, {"sound", "pong"}) + end; false -> - SX2 = SX1 + NewSX = SX end, - ggs_db:setItem(Table, local_storage, ball, {BX, BY , SX2, NewSY}), + ggs_db:setItem(Table, local_storage, ball, {BX, BY , NewSX, NewSY}), + % check for point player1 - if BX > 90 -> - Player1Points = ggs_db:getItem(Table, local_storage, player1_points), - NewPlayer1Points = Player1Points + 1, - ggs_db:setItem(Table, local_storage, player1_points, NewPlayer1Points), - ggs_table:notify_all_players(Table, {"player1_points", int2str(NewPlayer1Points)}), - exit(normal) + case BX > 100 of + true -> + Player1Points = ggs_db:getItem(Table, local_storage, player1_points), + NewPlayer1Points = Player1Points + 1, + ggs_db:setItem(Table, local_storage, player1_points, NewPlayer1Points), + ggs_table:notify_all_players(Table, {"player1_points", int2str(NewPlayer1Points)}), + exit(normal); + false -> + ok end, % check for point player2 - if BX < 0 -> - Player2Points = ggs_db:getItem(Table, local_storage, player2_points), - NewPlayer2Points = Player2Points + 1, - ggs_db:setItem(Table, local_storage, player2_points, NewPlayer2Points), - ggs_table:notify_all_players(Table, {"player2_points", int2str(NewPlayer2Points)}), - exit(normal) + case BX < 0 of + true -> + Player2Points = ggs_db:getItem(Table, local_storage, player2_points), + NewPlayer2Points = Player2Points + 1, + ggs_db:setItem(Table, local_storage, player2_points, NewPlayer2Points), + ggs_table:notify_all_players(Table, {"player2_points", int2str(NewPlayer2Points)}), + exit(normal); + false -> + ok end. - - -check_intersect({AX, AY, AW, AH}, {BX, BY, BW, BH}) -> - not (BX > (AX + AW)) or ((BX + BW) < AX) or (BY > (AY + AH)) or ((BY + BH) < AY). + + +check_intersect({AX1, AY1, AW, AH}, {BX1, BY1, BW, BH}) -> + AX2 = AX1 + AW, + AY2 = AY1 + AH, + BX2 = BX1 + BW, + BY2 = BY1 + BH, + (AX1 < BX2) and (AX2 > BX1) and (AY1 < BY2) and (AY2 > BY1). diff --git a/src/ggs_player.erl b/src/ggs_player.erl index 9146799..d6e939e 100644 --- a/src/ggs_player.erl +++ b/src/ggs_player.erl @@ -40,7 +40,6 @@ start_link(Socket) -> %% @spec notify(Player::Pid(), From::Pid(), %% {Command::String(), Message::string()}) -> ok notify(Player, From, Message) -> - erlang:display(Message), {Cmd, Data} = Message, Parsed = ggs_protocol:create_message(Cmd, "text","text", Data), Player ! {notify, From, Parsed}. @@ -62,14 +61,10 @@ stop(_Player,_Table) -> loop(#pl_state{token = _Token, socket = Socket, table = Table} = State) -> receive {tcp, Socket, Data} -> % Just echo for now.. - io:format("Parsing via protocol module..~n"), - erlang:display(Data), Parsed = ggs_protocol:parse(Data), - erlang:display(Parsed), self() ! Parsed, loop(State); {notify, _From, Message} -> - erlang:display(Message), gen_tcp:send(Socket, Message), loop(State); % Below are messages generated by the parser diff --git a/src/ggs_table.erl b/src/ggs_table.erl index 57785e8..909f789 100644 --- a/src/ggs_table.erl +++ b/src/ggs_table.erl @@ -44,7 +44,6 @@ remove_player(Table, Player) -> %% @doc Get a list of all player processes attached to this table get_player_list(TableToken) -> TablePid = ggs_coordinator:table_token_to_pid(TableToken), - erlang:display(TablePid), gen_server:call(TablePid, get_player_list). % @doc stops the table process @@ -88,7 +87,6 @@ handle_call({remove_player, Player}, _From, #state { players = Players } = State {reply, ok, State#state { players = Players -- [Player] }}; handle_call(get_player_list, _From, #state { players = Players } = State) -> - io:format("Players: ~p~n", [Players]), TokenPlayers = lists:map( fun (Pid) -> ggs_coordinator:player_pid_to_token(Pid) end, Players), {reply, {ok, TokenPlayers}, State}; diff --git a/tests/tick.erl b/tests/tick.erl new file mode 100644 index 0000000..0d21220 --- /dev/null +++ b/tests/tick.erl @@ -0,0 +1,26 @@ +-module(tick). +-export([start/0]). + +start() -> + spawn(fun() -> loop() end). + +loop() -> + receive + tick -> + erlang:display("tick!"), + timer:send_after(500, tick), + loop(); + 'EXIT' -> + exit(normal) + end. + +% 1> c(tick). +% {ok,tick} +% 2> Pid = tick:start(). +% <0.38.0> +% % Nothing happens :-( + +% When I send it myself then it responds +% 3> Pid ! tick. +% tick +% 5>