diff --git a/doc/report b/doc/report
index aad268d..0031285 160000
--- a/doc/report
+++ b/doc/report
@@ -1 +1 @@
-Subproject commit aad268d03a3c23de917cfecf767d583d3cb32633
+Subproject commit 00312859714bef6e9a4fdb9931a41fef56eeb89a
diff --git a/games/Pong/Pong.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/games/Pong/Pong.xcodeproj/project.xcworkspace/contents.xcworkspacedata
new file mode 100644
index 0000000..2c44ce8
--- /dev/null
+++ b/games/Pong/Pong.xcodeproj/project.xcworkspace/contents.xcworkspacedata
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/games/Pong/Pong.xcodeproj/project.xcworkspace/xcuserdata/jeena.xcuserdatad/UserInterfaceState.xcuserstate b/games/Pong/Pong.xcodeproj/project.xcworkspace/xcuserdata/jeena.xcuserdatad/UserInterfaceState.xcuserstate
new file mode 100644
index 0000000..7578947
--- /dev/null
+++ b/games/Pong/Pong.xcodeproj/project.xcworkspace/xcuserdata/jeena.xcuserdatad/UserInterfaceState.xcuserstate
@@ -0,0 +1,2937 @@
+
+
+
+
+ $archiver
+ NSKeyedArchiver
+ $objects
+
+ $null
+
+ $class
+
+ CF$UID
+ 126
+
+ NS.keys
+
+
+ CF$UID
+ 2
+
+
+ CF$UID
+ 3
+
+
+ NS.objects
+
+
+ CF$UID
+ 4
+
+
+ CF$UID
+ 100
+
+
+
+ IDEWorkspaceDocument
+ C791B696-0817-4083-8D95-684ACD41BA88
+
+ $class
+
+ CF$UID
+ 37
+
+ NS.keys
+
+
+ CF$UID
+ 5
+
+
+ CF$UID
+ 6
+
+
+ CF$UID
+ 7
+
+
+ CF$UID
+ 8
+
+
+ CF$UID
+ 9
+
+
+ CF$UID
+ 10
+
+
+ CF$UID
+ 11
+
+
+ CF$UID
+ 12
+
+
+ CF$UID
+ 13
+
+
+ CF$UID
+ 14
+
+
+ NS.objects
+
+
+ CF$UID
+ 15
+
+
+ CF$UID
+ 16
+
+
+ CF$UID
+ 48
+
+
+ CF$UID
+ 49
+
+
+ CF$UID
+ 54
+
+
+ CF$UID
+ 57
+
+
+ CF$UID
+ 90
+
+
+ CF$UID
+ 91
+
+
+ CF$UID
+ 15
+
+
+ CF$UID
+ 15
+
+
+
+ BreakpointsActivated
+ DefaultEditorStatesForURLs
+ DebuggingWindowBehavior
+ ActiveRunDestination
+ ActiveScheme
+ LastCompletedPersistentSchemeBasedActivityReport
+ DocumentWindows
+ RecentEditorDocumentURLs
+ AppFocusInMiniDebugging
+ MiniDebuggingConsole
+
+
+ $class
+
+ CF$UID
+ 37
+
+ NS.keys
+
+
+ CF$UID
+ 17
+
+
+ NS.objects
+
+
+ CF$UID
+ 18
+
+
+
+ Xcode.IDEKit.EditorDocument.SourceCode
+
+ $class
+
+ CF$UID
+ 37
+
+ NS.keys
+
+
+ CF$UID
+ 19
+
+
+ CF$UID
+ 23
+
+
+ CF$UID
+ 25
+
+
+ CF$UID
+ 27
+
+
+ NS.objects
+
+
+ CF$UID
+ 29
+
+
+ CF$UID
+ 38
+
+
+ CF$UID
+ 42
+
+
+ CF$UID
+ 45
+
+
+
+
+ $class
+
+ CF$UID
+ 22
+
+ NS.base
+
+ CF$UID
+ 0
+
+ NS.relative
+
+ CF$UID
+ 20
+
+
+
+ $class
+
+ CF$UID
+ 21
+
+ NS.string
+ file://localhost/Users/jeena/Student/GGS/games/Pong/Classes/GGSNetwork.h
+
+
+ $classes
+
+ NSMutableString
+ NSString
+ NSObject
+
+ $classname
+ NSMutableString
+
+
+ $classes
+
+ NSURL
+ NSObject
+
+ $classname
+ NSURL
+
+
+ $class
+
+ CF$UID
+ 22
+
+ NS.base
+
+ CF$UID
+ 0
+
+ NS.relative
+
+ CF$UID
+ 24
+
+
+
+ $class
+
+ CF$UID
+ 21
+
+ NS.string
+ file://localhost/Users/jeena/Student/GGS/games/Pong/Classes/GGSNetwork.m
+
+
+ $class
+
+ CF$UID
+ 22
+
+ NS.base
+
+ CF$UID
+ 0
+
+ NS.relative
+
+ CF$UID
+ 26
+
+
+
+ $class
+
+ CF$UID
+ 21
+
+ NS.string
+ file://localhost/Users/jeena/Student/GGS/games/Pong/Classes/PongAppDelegate.m
+
+
+ $class
+
+ CF$UID
+ 22
+
+ NS.base
+
+ CF$UID
+ 0
+
+ NS.relative
+
+ CF$UID
+ 28
+
+
+
+ $class
+
+ CF$UID
+ 21
+
+ NS.string
+ file://localhost/Users/jeena/Student/GGS/games/Pong/Classes/PongAppDelegate.h
+
+
+ $class
+
+ CF$UID
+ 37
+
+ NS.keys
+
+
+ CF$UID
+ 30
+
+
+ CF$UID
+ 31
+
+
+ CF$UID
+ 32
+
+
+ CF$UID
+ 33
+
+
+ NS.objects
+
+
+ CF$UID
+ 34
+
+
+ CF$UID
+ 35
+
+
+ CF$UID
+ 15
+
+
+ CF$UID
+ 36
+
+
+
+ PrimaryDocumentTimestamp
+ PrimaryDocumentVisibleCharacterRange
+ HideAllIssues
+ PrimaryDocumentSelectedCharacterRange
+ 322646167.29056698
+ {0, 910}
+ {0, 0}
+
+ $classes
+
+ NSMutableDictionary
+ NSDictionary
+ NSObject
+
+ $classname
+ NSMutableDictionary
+
+
+ $class
+
+ CF$UID
+ 37
+
+ NS.keys
+
+
+ CF$UID
+ 30
+
+
+ CF$UID
+ 31
+
+
+ CF$UID
+ 32
+
+
+ CF$UID
+ 33
+
+
+ NS.objects
+
+
+ CF$UID
+ 39
+
+
+ CF$UID
+ 40
+
+
+ CF$UID
+ 15
+
+
+ CF$UID
+ 41
+
+
+
+ 322690356.257366
+ {369, 1381}
+ {207, 0}
+
+ $class
+
+ CF$UID
+ 37
+
+ NS.keys
+
+
+ CF$UID
+ 30
+
+
+ CF$UID
+ 31
+
+
+ CF$UID
+ 32
+
+
+ CF$UID
+ 33
+
+
+ NS.objects
+
+
+ CF$UID
+ 43
+
+
+ CF$UID
+ 44
+
+
+ CF$UID
+ 15
+
+
+ CF$UID
+ 36
+
+
+
+ 322646166.07745898
+ {1704, 1033}
+
+ $class
+
+ CF$UID
+ 37
+
+ NS.keys
+
+
+ CF$UID
+ 30
+
+
+ CF$UID
+ 31
+
+
+ CF$UID
+ 32
+
+
+ CF$UID
+ 33
+
+
+ NS.objects
+
+
+ CF$UID
+ 46
+
+
+ CF$UID
+ 47
+
+
+ CF$UID
+ 15
+
+
+ CF$UID
+ 36
+
+
+
+ 322646160.93821901
+ {0, 455}
+ 0
+
+ $class
+
+ CF$UID
+ 37
+
+ NS.keys
+
+
+ CF$UID
+ 50
+
+
+ CF$UID
+ 51
+
+
+ NS.objects
+
+
+ CF$UID
+ 52
+
+
+ CF$UID
+ 53
+
+
+
+ IDEDeviceLocation
+ IDEDeviceArchitecture
+ dvtdevice-iphonesimulator:/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator4.0.sdk-iPhone
+ i386
+
+ $class
+
+ CF$UID
+ 37
+
+ NS.keys
+
+
+ CF$UID
+ 55
+
+
+ NS.objects
+
+
+ CF$UID
+ 56
+
+
+
+ IDENameString
+ Pong
+
+ $class
+
+ CF$UID
+ 37
+
+ NS.keys
+
+
+ CF$UID
+ 58
+
+
+ CF$UID
+ 59
+
+
+ CF$UID
+ 60
+
+
+ NS.objects
+
+
+ CF$UID
+ 61
+
+
+ CF$UID
+ 89
+
+
+ CF$UID
+ 68
+
+
+
+ IDEActivityReportCompletionSummaryStringSegments
+ IDEActivityReportOptions
+ IDEActivityReportTitle
+
+ $class
+
+ CF$UID
+ 88
+
+ NS.objects
+
+
+ CF$UID
+ 62
+
+
+ CF$UID
+ 69
+
+
+ CF$UID
+ 73
+
+
+ CF$UID
+ 78
+
+
+
+
+ $class
+
+ CF$UID
+ 37
+
+ NS.keys
+
+
+ CF$UID
+ 63
+
+
+ CF$UID
+ 64
+
+
+ CF$UID
+ 65
+
+
+ NS.objects
+
+
+ CF$UID
+ 66
+
+
+ CF$UID
+ 67
+
+
+ CF$UID
+ 68
+
+
+
+ IDEActivityReportStringSegmentPriority
+ IDEActivityReportStringSegmentBackSeparator
+ IDEActivityReportStringSegmentStringValue
+ 2
+
+ Build
+
+ $class
+
+ CF$UID
+ 37
+
+ NS.keys
+
+
+ CF$UID
+ 63
+
+
+ CF$UID
+ 64
+
+
+ CF$UID
+ 65
+
+
+ NS.objects
+
+
+ CF$UID
+ 70
+
+
+ CF$UID
+ 71
+
+
+ CF$UID
+ 72
+
+
+
+ 4
+ :
+ Pong
+
+ $class
+
+ CF$UID
+ 37
+
+ NS.keys
+
+
+ CF$UID
+ 63
+
+
+ CF$UID
+ 64
+
+
+ CF$UID
+ 65
+
+
+ NS.objects
+
+
+ CF$UID
+ 74
+
+
+ CF$UID
+ 75
+
+
+ CF$UID
+ 76
+
+
+
+ 1
+ │
+
+ $class
+
+ CF$UID
+ 77
+
+ NS.data
+
+ YnBsaXN0MDDUAQIDBAUGOzxYJHZlcnNpb25YJG9iamVjdHNZJGFy
+ Y2hpdmVyVCR0b3ASAAGGoK0HCA8QGhscJCUrMTQ3VSRudWxs0wkK
+ CwwNDlxOU0F0dHJpYnV0ZXNWJGNsYXNzWE5TU3RyaW5ngAOADIAC
+ WVN1Y2NlZWRlZNMKERITFBdXTlMua2V5c1pOUy5vYmplY3RzgAui
+ FRaABIAFohgZgAaACVZOU0ZvbnRXTlNDb2xvctQKHR4fICEiI1ZO
+ U05hbWVWTlNTaXplWE5TZkZsYWdzgAiAByNAJgAAAAAAABENEF8Q
+ EUx1Y2lkYUdyYW5kZS1Cb2xk0iYnKClaJGNsYXNzbmFtZVgkY2xh
+ c3Nlc1ZOU0ZvbnSiKCpYTlNPYmplY3TTCiwtLi8wXE5TQ29sb3JT
+ cGFjZVdOU1doaXRlgAoQA0IwANImJzIzV05TQ29sb3KiMirSJic1
+ NlxOU0RpY3Rpb25hcnmiNSrSJic4OV8QEk5TQXR0cmlidXRlZFN0
+ cmluZ6I6Kl8QEk5TQXR0cmlidXRlZFN0cmluZ18QD05TS2V5ZWRB
+ cmNoaXZlctE9PlRyb290gAEACAARABoAIwAtADIANwBFAEsAUgBf
+ AGYAbwBxAHMAdQB/AIYAjgCZAJsAngCgAKIApQCnAKkAsAC4AMEA
+ yADPANgA2gDcAOUA6AD8AQEBDAEVARwBHwEoAS8BPAFEAUYBSAFL
+ AVABWAFbAWABbQFwAXUBigGNAaIBtAG3AbwAAAAAAAACAQAAAAAA
+ AAA/AAAAAAAAAAAAAAAAAAABvg==
+
+
+
+ $classes
+
+ NSMutableData
+ NSData
+ NSObject
+
+ $classname
+ NSMutableData
+
+
+ $class
+
+ CF$UID
+ 37
+
+ NS.keys
+
+
+ CF$UID
+ 63
+
+
+ CF$UID
+ 79
+
+
+ CF$UID
+ 80
+
+
+ CF$UID
+ 65
+
+
+ CF$UID
+ 81
+
+
+ CF$UID
+ 82
+
+
+ NS.objects
+
+
+ CF$UID
+ 83
+
+
+ CF$UID
+ 84
+
+
+ CF$UID
+ 85
+
+
+ CF$UID
+ 87
+
+
+ CF$UID
+ 84
+
+
+ CF$UID
+ 84
+
+
+
+ IDEActivityReportStringSegmentType
+ IDEActivityReportStringSegmentDate
+ IDEActivityReportStringSegmentDateStyle
+ IDEActivityReportStringSegmentTimeStyle
+ 3
+ 1
+
+ $class
+
+ CF$UID
+ 86
+
+ NS.time
+ 322656379.44809198
+
+
+ $classes
+
+ NSDate
+ NSObject
+
+ $classname
+ NSDate
+
+ Today at 11:46
+
+ $classes
+
+ NSMutableArray
+ NSArray
+ NSObject
+
+ $classname
+ NSMutableArray
+
+ 106
+
+ $class
+
+ CF$UID
+ 88
+
+ NS.objects
+
+
+ CF$UID
+ 3
+
+
+
+
+ $class
+
+ CF$UID
+ 88
+
+ NS.objects
+
+
+ CF$UID
+ 92
+
+
+ CF$UID
+ 94
+
+
+ CF$UID
+ 96
+
+
+ CF$UID
+ 98
+
+
+
+
+ $class
+
+ CF$UID
+ 22
+
+ NS.base
+
+ CF$UID
+ 0
+
+ NS.relative
+
+ CF$UID
+ 93
+
+
+ file://localhost/Users/jeena/Student/GGS/games/Pong/Classes/GGSNetwork.m
+
+ $class
+
+ CF$UID
+ 22
+
+ NS.base
+
+ CF$UID
+ 0
+
+ NS.relative
+
+ CF$UID
+ 95
+
+
+ file://localhost/Users/jeena/Student/GGS/games/Pong/Classes/GGSNetwork.h
+
+ $class
+
+ CF$UID
+ 22
+
+ NS.base
+
+ CF$UID
+ 0
+
+ NS.relative
+
+ CF$UID
+ 97
+
+
+ file://localhost/Users/jeena/Student/GGS/games/Pong/Classes/PongAppDelegate.m
+
+ $class
+
+ CF$UID
+ 22
+
+ NS.base
+
+ CF$UID
+ 0
+
+ NS.relative
+
+ CF$UID
+ 99
+
+
+ file://localhost/Users/jeena/Student/GGS/games/Pong/Classes/PongAppDelegate.h
+
+ $class
+
+ CF$UID
+ 37
+
+ NS.keys
+
+
+ CF$UID
+ 101
+
+
+ CF$UID
+ 102
+
+
+ CF$UID
+ 103
+
+
+ CF$UID
+ 104
+
+
+ CF$UID
+ 105
+
+
+ CF$UID
+ 106
+
+
+ NS.objects
+
+
+ CF$UID
+ 107
+
+
+ CF$UID
+ 274
+
+
+ CF$UID
+ 116
+
+
+ CF$UID
+ 101
+
+
+ CF$UID
+ 275
+
+
+ CF$UID
+ 3
+
+
+
+ IDEWorkspaceTabController_C37A21B0-D59C-4189-B137-7086EEE960F1
+ IDEOrderedWorkspaceTabControllers
+ IDEWindowToolbarIsVisible
+ IDEActiveWorkspaceTabController
+ IDEWindowFrame
+ IDEWorkspaceWindowControllerUniqueIdentifier
+
+ $class
+
+ CF$UID
+ 37
+
+ NS.keys
+
+
+ CF$UID
+ 108
+
+
+ CF$UID
+ 109
+
+
+ CF$UID
+ 110
+
+
+ CF$UID
+ 111
+
+
+ CF$UID
+ 112
+
+
+ CF$UID
+ 113
+
+
+ CF$UID
+ 114
+
+
+ CF$UID
+ 115
+
+
+ NS.objects
+
+
+ CF$UID
+ 48
+
+
+ CF$UID
+ 116
+
+
+ CF$UID
+ 117
+
+
+ CF$UID
+ 118
+
+
+ CF$UID
+ 129
+
+
+ CF$UID
+ 171
+
+
+ CF$UID
+ 15
+
+
+ CF$UID
+ 180
+
+
+
+ AssistantEditorsLayout
+ IDEShowNavigator
+ IDETabLabel
+ IDEWorkspaceTabControllerUtilityAreaSplitView
+ IDENavigatorArea
+ IDEWorkspaceTabControllerDesignAreaSplitView
+ IDEShowUtilities
+ IDEEditorArea
+
+ GGSNetwork.m
+
+ $class
+
+ CF$UID
+ 37
+
+ NS.keys
+
+
+ CF$UID
+ 119
+
+
+ NS.objects
+
+
+ CF$UID
+ 120
+
+
+
+ DVTSplitViewItems
+
+ $class
+
+ CF$UID
+ 88
+
+ NS.objects
+
+
+ CF$UID
+ 121
+
+
+ CF$UID
+ 127
+
+
+
+
+ $class
+
+ CF$UID
+ 126
+
+ NS.keys
+
+
+ CF$UID
+ 122
+
+
+ CF$UID
+ 123
+
+
+ NS.objects
+
+
+ CF$UID
+ 124
+
+
+ CF$UID
+ 125
+
+
+
+ DVTIdentifier
+ DVTViewMagnitude
+
+ 478
+
+ $classes
+
+ NSDictionary
+ NSObject
+
+ $classname
+ NSDictionary
+
+
+ $class
+
+ CF$UID
+ 126
+
+ NS.keys
+
+
+ CF$UID
+ 122
+
+
+ CF$UID
+ 123
+
+
+ NS.objects
+
+
+ CF$UID
+ 124
+
+
+ CF$UID
+ 128
+
+
+
+ 224
+
+ $class
+
+ CF$UID
+ 37
+
+ NS.keys
+
+
+ CF$UID
+ 130
+
+
+ CF$UID
+ 131
+
+
+ CF$UID
+ 132
+
+
+ NS.objects
+
+
+ CF$UID
+ 133
+
+
+ CF$UID
+ 132
+
+
+ CF$UID
+ 151
+
+
+
+ Xcode.IDEKit.Navigator.Issues
+ SelectedNavigator
+ Xcode.IDEKit.Navigator.Structure
+
+ $class
+
+ CF$UID
+ 37
+
+ NS.keys
+
+
+ CF$UID
+ 134
+
+
+ CF$UID
+ 135
+
+
+ CF$UID
+ 136
+
+
+ CF$UID
+ 137
+
+
+ CF$UID
+ 138
+
+
+ CF$UID
+ 139
+
+
+ CF$UID
+ 140
+
+
+ CF$UID
+ 141
+
+
+ CF$UID
+ 142
+
+
+ CF$UID
+ 143
+
+
+ NS.objects
+
+
+ CF$UID
+ 15
+
+
+ CF$UID
+ 144
+
+
+ CF$UID
+ 145
+
+
+ CF$UID
+ 147
+
+
+ CF$UID
+ 148
+
+
+ CF$UID
+ 15
+
+
+ CF$UID
+ 15
+
+
+ CF$UID
+ 149
+
+
+ CF$UID
+ 15
+
+
+ CF$UID
+ 150
+
+
+
+ IDEErrorFilteringEnabled
+ IDEVisibleRect
+ IDECollapsedFiles
+ IDEExpandedIssues
+ IDESelectedNavigables
+ IDEShowsByType
+ IDESchemeFilteringEnabled
+ IDECollapsedTypes
+ IDERecentFilteringEnabled
+ IDECollapsedGroups
+ {{0, 0}, {259, 636}}
+
+ $class
+
+ CF$UID
+ 146
+
+ NS.objects
+
+
+
+ $classes
+
+ NSMutableSet
+ NSSet
+ NSObject
+
+ $classname
+ NSMutableSet
+
+
+ $class
+
+ CF$UID
+ 146
+
+ NS.objects
+
+
+
+ $class
+
+ CF$UID
+ 88
+
+ NS.objects
+
+
+
+ $class
+
+ CF$UID
+ 146
+
+ NS.objects
+
+
+
+ $class
+
+ CF$UID
+ 146
+
+ NS.objects
+
+
+
+ $class
+
+ CF$UID
+ 37
+
+ NS.keys
+
+
+ CF$UID
+ 152
+
+
+ CF$UID
+ 153
+
+
+ CF$UID
+ 154
+
+
+ CF$UID
+ 155
+
+
+ CF$UID
+ 156
+
+
+ CF$UID
+ 157
+
+
+ CF$UID
+ 158
+
+
+ NS.objects
+
+
+ CF$UID
+ 159
+
+
+ CF$UID
+ 15
+
+
+ CF$UID
+ 160
+
+
+ CF$UID
+ 15
+
+
+ CF$UID
+ 15
+
+
+ CF$UID
+ 162
+
+
+ CF$UID
+ 168
+
+
+
+ IDEVisibleRect
+ IDEUnsavedDocumentFilteringEnabled
+ IDENavigatorExpandedItemsBeforeFilteringSet
+ IDERecentDocumentFilteringEnabled
+ IDESCMStatusFilteringEnabled
+ IDESelectedObjects
+ IDEExpandedItemsSet
+ {{0, 0}, {259, 658}}
+
+ $class
+
+ CF$UID
+ 161
+
+ NS.objects
+
+
+
+ $classes
+
+ NSSet
+ NSObject
+
+ $classname
+ NSSet
+
+
+ $class
+
+ CF$UID
+ 167
+
+ NS.objects
+
+
+ CF$UID
+ 163
+
+
+
+
+ $class
+
+ CF$UID
+ 88
+
+ NS.objects
+
+
+ CF$UID
+ 164
+
+
+ CF$UID
+ 165
+
+
+ CF$UID
+ 166
+
+
+
+ Pong
+ Classes
+ GGSNetwork.m
+
+ $classes
+
+ NSArray
+ NSObject
+
+ $classname
+ NSArray
+
+
+ $class
+
+ CF$UID
+ 161
+
+ NS.objects
+
+
+ CF$UID
+ 169
+
+
+ CF$UID
+ 170
+
+
+
+
+ $class
+
+ CF$UID
+ 88
+
+ NS.objects
+
+
+ CF$UID
+ 164
+
+
+
+
+ $class
+
+ CF$UID
+ 88
+
+ NS.objects
+
+
+ CF$UID
+ 164
+
+
+ CF$UID
+ 165
+
+
+
+
+ $class
+
+ CF$UID
+ 37
+
+ NS.keys
+
+
+ CF$UID
+ 119
+
+
+ NS.objects
+
+
+ CF$UID
+ 172
+
+
+
+
+ $class
+
+ CF$UID
+ 88
+
+ NS.objects
+
+
+ CF$UID
+ 173
+
+
+ CF$UID
+ 175
+
+
+ CF$UID
+ 177
+
+
+
+
+ $class
+
+ CF$UID
+ 126
+
+ NS.keys
+
+
+ CF$UID
+ 122
+
+
+ CF$UID
+ 123
+
+
+ NS.objects
+
+
+ CF$UID
+ 112
+
+
+ CF$UID
+ 174
+
+
+
+ 260
+
+ $class
+
+ CF$UID
+ 126
+
+ NS.keys
+
+
+ CF$UID
+ 122
+
+
+ CF$UID
+ 123
+
+
+ NS.objects
+
+
+ CF$UID
+ 115
+
+
+ CF$UID
+ 176
+
+
+
+ 1016
+
+ $class
+
+ CF$UID
+ 126
+
+ NS.keys
+
+
+ CF$UID
+ 122
+
+
+ CF$UID
+ 123
+
+
+ NS.objects
+
+
+ CF$UID
+ 178
+
+
+ CF$UID
+ 179
+
+
+
+ IDEUtilitiesArea
+ 260
+
+ $class
+
+ CF$UID
+ 37
+
+ NS.keys
+
+
+ CF$UID
+ 181
+
+
+ CF$UID
+ 182
+
+
+ CF$UID
+ 183
+
+
+ CF$UID
+ 184
+
+
+ CF$UID
+ 185
+
+
+ CF$UID
+ 186
+
+
+ CF$UID
+ 187
+
+
+ CF$UID
+ 188
+
+
+ NS.objects
+
+
+ CF$UID
+ 189
+
+
+ CF$UID
+ 206
+
+
+ CF$UID
+ 239
+
+
+ CF$UID
+ 116
+
+
+ CF$UID
+ 48
+
+
+ CF$UID
+ 265
+
+
+ CF$UID
+ 273
+
+
+ CF$UID
+ 116
+
+
+
+ layoutTree
+ IDEEditorMode_Standard
+ IDEEDitorArea_DebugArea
+ IDEShowEditor
+ EditorMode
+ DebuggerSplitView
+ DefaultPersistentRepresentations
+ ShowDebuggerArea
+
+ $class
+
+ CF$UID
+ 205
+
+ geniusEditorContextNode
+
+ CF$UID
+ 0
+
+ primaryEditorContextNode
+
+ CF$UID
+ 190
+
+ rootLayoutTreeNode
+
+ CF$UID
+ 202
+
+
+
+ $class
+
+ CF$UID
+ 204
+
+ children
+
+ CF$UID
+ 0
+
+ contentType
+ 1
+ documentArchivableRepresentation
+
+ CF$UID
+ 191
+
+ orientation
+ 0
+ parent
+
+ CF$UID
+ 202
+
+
+
+ $class
+
+ CF$UID
+ 201
+
+ DocumentLocation
+
+ CF$UID
+ 199
+
+ DomainIdentifier
+
+ CF$UID
+ 192
+
+ IdentifierPath
+
+ CF$UID
+ 193
+
+ IndexOfDocumentIdentifier
+
+ CF$UID
+ 48
+
+
+ Xcode.IDENavigableItemDomain.WorkspaceStructure
+
+ $class
+
+ CF$UID
+ 167
+
+ NS.objects
+
+
+ CF$UID
+ 194
+
+
+ CF$UID
+ 196
+
+
+ CF$UID
+ 197
+
+
+
+
+ $class
+
+ CF$UID
+ 195
+
+ Identifier
+
+ CF$UID
+ 166
+
+
+
+ $classes
+
+ IDEArchivableStringIndexPair
+ NSObject
+
+ $classname
+ IDEArchivableStringIndexPair
+
+
+ $class
+
+ CF$UID
+ 195
+
+ Identifier
+
+ CF$UID
+ 165
+
+
+
+ $class
+
+ CF$UID
+ 195
+
+ Identifier
+
+ CF$UID
+ 198
+
+
+ Pong
+
+ $class
+
+ CF$UID
+ 200
+
+ documentURL
+
+ CF$UID
+ 24
+
+ timestamp
+
+ CF$UID
+ 0
+
+
+
+ $classes
+
+ DVTDocumentLocation
+ NSObject
+
+ $classname
+ DVTDocumentLocation
+
+
+ $classes
+
+ IDENavigableItemArchivableRepresentation
+ NSObject
+
+ $classname
+ IDENavigableItemArchivableRepresentation
+
+
+ $class
+
+ CF$UID
+ 204
+
+ children
+
+ CF$UID
+ 203
+
+ contentType
+ 0
+ documentArchivableRepresentation
+
+ CF$UID
+ 0
+
+ orientation
+ 0
+ parent
+
+ CF$UID
+ 0
+
+
+
+ $class
+
+ CF$UID
+ 167
+
+ NS.objects
+
+
+ CF$UID
+ 190
+
+
+
+
+ $classes
+
+ IDEWorkspaceTabControllerLayoutTreeNode
+ NSObject
+
+ $classname
+ IDEWorkspaceTabControllerLayoutTreeNode
+
+
+ $classes
+
+ IDEWorkspaceTabControllerLayoutTree
+ NSObject
+
+ $classname
+ IDEWorkspaceTabControllerLayoutTree
+
+
+ $class
+
+ CF$UID
+ 37
+
+ NS.keys
+
+
+ CF$UID
+ 207
+
+
+ NS.objects
+
+
+ CF$UID
+ 208
+
+
+
+ EditorLayout_PersistentRepresentation
+
+ $class
+
+ CF$UID
+ 37
+
+ NS.keys
+
+
+ CF$UID
+ 209
+
+
+ NS.objects
+
+
+ CF$UID
+ 210
+
+
+
+ Main
+
+ $class
+
+ CF$UID
+ 126
+
+ NS.keys
+
+
+ CF$UID
+ 211
+
+
+ CF$UID
+ 212
+
+
+ CF$UID
+ 213
+
+
+ NS.objects
+
+
+ CF$UID
+ 214
+
+
+ CF$UID
+ 48
+
+
+ CF$UID
+ 237
+
+
+
+ EditorLayout_StateSavingStateDictionaries
+ EditorLayout_Selected
+ EditorLayout_Geometry
+
+ $class
+
+ CF$UID
+ 167
+
+ NS.objects
+
+
+ CF$UID
+ 215
+
+
+
+
+ $class
+
+ CF$UID
+ 37
+
+ NS.keys
+
+
+ CF$UID
+ 216
+
+
+ CF$UID
+ 217
+
+
+ CF$UID
+ 218
+
+
+ CF$UID
+ 219
+
+
+ CF$UID
+ 220
+
+
+ CF$UID
+ 221
+
+
+ CF$UID
+ 222
+
+
+ NS.objects
+
+
+ CF$UID
+ 223
+
+
+ CF$UID
+ 224
+
+
+ CF$UID
+ 230
+
+
+ CF$UID
+ 234
+
+
+ CF$UID
+ 166
+
+
+ CF$UID
+ 17
+
+
+ CF$UID
+ 235
+
+
+
+ FileDataType
+ ArchivableRepresentation
+ EditorState
+ NavigableItemName
+ DocumentNavigableItemName
+ DocumentExtensionIdentifier
+ DocumentURL
+ public.objective-c-source
+
+ $class
+
+ CF$UID
+ 201
+
+ DocumentLocation
+
+ CF$UID
+ 199
+
+ DomainIdentifier
+
+ CF$UID
+ 192
+
+ IdentifierPath
+
+ CF$UID
+ 225
+
+ IndexOfDocumentIdentifier
+
+ CF$UID
+ 48
+
+
+
+ $class
+
+ CF$UID
+ 167
+
+ NS.objects
+
+
+ CF$UID
+ 226
+
+
+ CF$UID
+ 227
+
+
+ CF$UID
+ 228
+
+
+
+
+ $class
+
+ CF$UID
+ 195
+
+ Identifier
+
+ CF$UID
+ 166
+
+
+
+ $class
+
+ CF$UID
+ 195
+
+ Identifier
+
+ CF$UID
+ 165
+
+
+
+ $class
+
+ CF$UID
+ 195
+
+ Identifier
+
+ CF$UID
+ 229
+
+
+ Pong
+
+ $class
+
+ CF$UID
+ 126
+
+ NS.keys
+
+
+ CF$UID
+ 30
+
+
+ CF$UID
+ 31
+
+
+ CF$UID
+ 32
+
+
+ CF$UID
+ 33
+
+
+ NS.objects
+
+
+ CF$UID
+ 231
+
+
+ CF$UID
+ 232
+
+
+ CF$UID
+ 15
+
+
+ CF$UID
+ 233
+
+
+
+ 322690356.25804502
+ {369, 1381}
+ {207, 0}
+ @implementation GGSNetwork
+
+ $class
+
+ CF$UID
+ 22
+
+ NS.base
+
+ CF$UID
+ 0
+
+ NS.relative
+
+ CF$UID
+ 236
+
+
+ file://localhost/Users/jeena/Student/GGS/games/Pong/Classes/GGSNetwork.m
+
+ $class
+
+ CF$UID
+ 167
+
+ NS.objects
+
+
+ CF$UID
+ 238
+
+
+
+ {{0, 0}, {1016, 565}}
+
+ $class
+
+ CF$UID
+ 37
+
+ NS.keys
+
+
+ CF$UID
+ 240
+
+
+ CF$UID
+ 241
+
+
+ CF$UID
+ 242
+
+
+ CF$UID
+ 243
+
+
+ CF$UID
+ 244
+
+
+ CF$UID
+ 245
+
+
+ NS.objects
+
+
+ CF$UID
+ 84
+
+
+ CF$UID
+ 246
+
+
+ CF$UID
+ 248
+
+
+ CF$UID
+ 84
+
+
+ CF$UID
+ 251
+
+
+ CF$UID
+ 259
+
+
+
+ LayoutFocusMode
+ console
+ variables
+ LayoutMode
+ IDEDebugArea_SplitView
+ IDEDebuggerAreaSplitView
+
+ $class
+
+ CF$UID
+ 37
+
+ NS.keys
+
+
+ CF$UID
+ 247
+
+
+ NS.objects
+
+
+ CF$UID
+ 48
+
+
+
+ ConsoleFilterMode
+
+ $class
+
+ CF$UID
+ 37
+
+ NS.keys
+
+
+ CF$UID
+ 249
+
+
+ NS.objects
+
+
+ CF$UID
+ 250
+
+
+
+ DBGVariablesViewFilterMode
+ 2
+
+ $class
+
+ CF$UID
+ 37
+
+ NS.keys
+
+
+ CF$UID
+ 119
+
+
+ NS.objects
+
+
+ CF$UID
+ 252
+
+
+
+
+ $class
+
+ CF$UID
+ 88
+
+ NS.objects
+
+
+ CF$UID
+ 253
+
+
+ CF$UID
+ 256
+
+
+
+
+ $class
+
+ CF$UID
+ 126
+
+ NS.keys
+
+
+ CF$UID
+ 122
+
+
+ CF$UID
+ 123
+
+
+ NS.objects
+
+
+ CF$UID
+ 254
+
+
+ CF$UID
+ 255
+
+
+
+ VariablesView
+ 298
+
+ $class
+
+ CF$UID
+ 126
+
+ NS.keys
+
+
+ CF$UID
+ 122
+
+
+ CF$UID
+ 123
+
+
+ NS.objects
+
+
+ CF$UID
+ 257
+
+
+ CF$UID
+ 258
+
+
+
+ ConsoleArea
+ 717
+
+ $class
+
+ CF$UID
+ 37
+
+ NS.keys
+
+
+ CF$UID
+ 119
+
+
+ NS.objects
+
+
+ CF$UID
+ 260
+
+
+
+
+ $class
+
+ CF$UID
+ 88
+
+ NS.objects
+
+
+ CF$UID
+ 261
+
+
+ CF$UID
+ 263
+
+
+
+
+ $class
+
+ CF$UID
+ 126
+
+ NS.keys
+
+
+ CF$UID
+ 122
+
+
+ CF$UID
+ 123
+
+
+ NS.objects
+
+
+ CF$UID
+ 254
+
+
+ CF$UID
+ 262
+
+
+
+ 298
+
+ $class
+
+ CF$UID
+ 126
+
+ NS.keys
+
+
+ CF$UID
+ 122
+
+
+ CF$UID
+ 123
+
+
+ NS.objects
+
+
+ CF$UID
+ 257
+
+
+ CF$UID
+ 264
+
+
+
+ 717
+
+ $class
+
+ CF$UID
+ 37
+
+ NS.keys
+
+
+ CF$UID
+ 119
+
+
+ NS.objects
+
+
+ CF$UID
+ 266
+
+
+
+
+ $class
+
+ CF$UID
+ 88
+
+ NS.objects
+
+
+ CF$UID
+ 267
+
+
+ CF$UID
+ 270
+
+
+
+
+ $class
+
+ CF$UID
+ 126
+
+ NS.keys
+
+
+ CF$UID
+ 122
+
+
+ CF$UID
+ 123
+
+
+ NS.objects
+
+
+ CF$UID
+ 268
+
+
+ CF$UID
+ 269
+
+
+
+ IDEEditor
+ 587
+
+ $class
+
+ CF$UID
+ 126
+
+ NS.keys
+
+
+ CF$UID
+ 122
+
+
+ CF$UID
+ 123
+
+
+ NS.objects
+
+
+ CF$UID
+ 271
+
+
+ CF$UID
+ 272
+
+
+
+ IDEDebuggerArea
+ 115
+
+ $class
+
+ CF$UID
+ 37
+
+ NS.keys
+
+ NS.objects
+
+
+
+ $class
+
+ CF$UID
+ 167
+
+ NS.objects
+
+
+ CF$UID
+ 101
+
+
+
+ {{0, 0}, {1276, 778}}
+
+ $top
+
+ State
+
+ CF$UID
+ 1
+
+
+ $version
+ 100000
+
+
diff --git a/games/Pong/Pong.xcodeproj/xcuserdata/jeena.xcuserdatad/xcschemes/Pong.xcscheme b/games/Pong/Pong.xcodeproj/xcuserdata/jeena.xcuserdatad/xcschemes/Pong.xcscheme
new file mode 100644
index 0000000..5ff41ee
--- /dev/null
+++ b/games/Pong/Pong.xcodeproj/xcuserdata/jeena.xcuserdatad/xcschemes/Pong.xcscheme
@@ -0,0 +1,76 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/games/Pong/Pong.xcodeproj/xcuserdata/jeena.xcuserdatad/xcschemes/xcschememanagement.plist b/games/Pong/Pong.xcodeproj/xcuserdata/jeena.xcuserdatad/xcschemes/xcschememanagement.plist
new file mode 100644
index 0000000..5bd0d76
--- /dev/null
+++ b/games/Pong/Pong.xcodeproj/xcuserdata/jeena.xcuserdatad/xcschemes/xcschememanagement.plist
@@ -0,0 +1,22 @@
+
+
+
+
+ SchemeUserState
+
+ Pong.xcscheme
+
+ orderHint
+ 0
+
+
+ SuppressBuildableAutocreation
+
+ 1D6058900D05DD3D006BFB54
+
+ primary
+
+
+
+
+
diff --git a/python_client b/python_client
index 10feefd..50e8dbd 100755
--- a/python_client
+++ b/python_client
@@ -60,7 +60,8 @@ while True:
s.close()
-"""
+time.sleep(2)
+
HOST = 'localhost' # The remote host
PORT = int(sys.argv[1]) # The same port as used by the server
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
@@ -81,4 +82,3 @@ print "Token:", token
print "Data: ", ' '.join(data.split(" ")[1:])
s.close()
-"""
diff --git a/python_client_reconnect b/python_client_reconnect
new file mode 100755
index 0000000..2a41b70
--- /dev/null
+++ b/python_client_reconnect
@@ -0,0 +1,23 @@
+#!/usr/bin/env python
+
+import sys, time, socket
+
+HOST = 'localhost' # The remote host
+PORT = int(sys.argv[1]) # The same port as used by the server
+s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
+s.connect((HOST, PORT))
+# Call that function!
+
+print "Calling myFun"
+s.send(
+"Token: %s\n\
+Server-Command: call\n\
+Content-Type: text\n\
+Content-Length: 6\n\
+\n\
+myFun" % raw_input("Token >> "))
+fs = s.makefile()
+data = fs.readline()
+print "Data: ", ' '.join(data.split(" ")[1:])
+
+s.close()
diff --git a/src/ggs_protocol.erl b/src/ggs_protocol.erl
index d61dfc0..11cb2d0 100644
--- a/src/ggs_protocol.erl
+++ b/src/ggs_protocol.erl
@@ -25,7 +25,6 @@ create_message(Cmd, Enc, Acc, Data) ->
Data,
Msg.
-
%% Internal helpers
do_parse(Data, ParsedMessage) ->
NewLinePos = string:chr(Data, $\n),
diff --git a/src/ggs_server.erl b/src/ggs_server.erl
new file mode 100644
index 0000000..833feac
--- /dev/null
+++ b/src/ggs_server.erl
@@ -0,0 +1,141 @@
+-module(ggs_server).
+-behaviour(gen_server).
+
+%% API
+-export([start_link/1,
+ start_link/0,
+ stop/0
+ ]).
+
+%% gen_server callbacks
+-export([init/1, handle_call/3, handle_cast/2,
+ handle_info/2, terminate/2, code_change/3]).
+
+
+-define(SERVER, ?MODULE).
+-define(DEFAULT_PORT, 1055).
+
+-record(state, {port, lsock, client_vm_map = []}).
+
+%%%====================================================
+%%% API
+%%%====================================================
+
+%%-----------------------------------------------------
+%% @doc Starts the server
+%% @end
+%%-----------------------------------------------------
+start_link(Port) ->
+ gen_server:start_link({local, ?SERVER}, ?MODULE, [Port], []).
+
+start_link() ->
+ start_link(?DEFAULT_PORT).
+
+%%-----------------------------------------------------
+%% @doc Stops the server.
+%% @spec stop() -> ok
+%% @end
+%%-----------------------------------------------------
+stop() ->
+ gen_server:cast(?SERVER, stop).
+
+%%-----------------------------------------------------
+%% gen_server callbacks
+%%-----------------------------------------------------
+
+init([Port]) ->
+ case gen_server:call(ggs_backup, get_backup) of
+ {backup_state, not_initialized} ->
+ {ok, LSock} = gen_tcp:listen(Port, [{active, true},
+ {reuseaddr, true}]),
+ {ok, #state{port = Port, lsock = LSock}, 0};
+ {backup_state, State} ->
+ {ok, LSock} = gen_tcp:listen(Port, [{active, true},
+ {reuseaddr, true}]),
+ {ok, State#state{lsock = LSock}, 0}
+ end.
+
+handle_call({backup_state, OldState}, _From, State) ->
+ io:format("Received old state from backup~n"),
+ {noreply, OldState}.
+
+
+handle_info({tcp, Socket, RawData}, State) ->
+ ggs_protocol:parse(RawData),
+ {noreply, State#state{lsock = Socket}};
+
+handle_info({tcp_closed, Socket}, State) ->
+ gen_tcp:close(Socket),
+ {stop, "Client closed socket", State};
+
+handle_info(timeout, #state{lsock = LSock} = State) ->
+ {ok, _Sock} = gen_tcp:accept(LSock),
+ {noreply, State};
+
+handle_info(Other, State) ->
+ erlang:display(Other).
+
+terminate(_Reason, _State) ->
+ ok.
+
+code_change(_OldVsn, State, _Extra) ->
+ {ok, State}.
+
+%%-----------------------------------------------------
+%% Internal functions
+%%-----------------------------------------------------
+handle_cast(stop, State) ->
+ {stop, normal, State};
+
+% Handle javascript defines
+handle_cast({srv_cmd, "define", Headers, Data}, State) ->
+ Token = ggs_protocol:getToken(Headers),
+ GameVM = getJSVM(Token, State),
+ ggs_vm_runner:define(GameVM, Data),
+ send(State#state.lsock, "Token", "Okay, defined that for you!"),
+ {noreply, State};
+
+% Handle javascript calls
+handle_cast({srv_cmd, "call", Headers, Data}, State) ->
+ Token = ggs_protocol:getToken(Headers),
+ io:format("Got call request: ~p~n", [Data]),
+ GameVM = getJSVM(Token, State),
+ Ret = ggs_vm_runner:user_command(GameVM, "User", Data, []),
+ send(State#state.lsock, Token, "JS says:", binary_to_list(Ret)),
+ {noreply, State};
+
+% Set the new state to the reference generated, and JSVM associated
+%handle_cast({server, hello, Headers}, State) ->
+handle_cast({srv_cmd, "hello", Headers, Data}, State) ->
+ GameToken = case proplist:get_value(game_token, Headers) of ->
+ undefined -> getNewToken();
+ GT -> GT;
+ end,
+ ClientToken = getNewToken(),
+ OldMap = State#state.client_vm_map,
+ NewState = State#state{client_vm_map = OldMap ++ [{ClientToken, GameVM, GameToken}]},
+ gen_server:cast(ggs_backup, {set_backup, NewState}),
+ {noreply, NewState}.
+
+
+%%-----------------------------------------------------
+%% Helpers
+%%-----------------------------------------------------
+getNewToken() ->
+ string:strip(os:cmd("uuidgen"), right, $\n ).
+
+getJSVM(ClientToken, State) ->
+ VMs = State#state.client_vm_map,
+ {value, {_,VM}} = lists:keysearch(ClientToken, 1, VMs),
+ VM.
+
+getGameVMByGameToken(GameToken, State) ->
+ VMs = State#state.client_vm_map,
+ {value, {_,VM}} = lists:keysearch(GameToken, 3, VMs),
+ VM.
+
+send(Socket, RefID, String) ->
+ gen_tcp:send(Socket, string:join([RefID,String,"\n"], " ")).
+
+send(Socket, RefID, String1, String2) ->
+ gen_tcp:send(Socket, string:join([RefID,String1, String2,"\n"], " ")).
diff --git a/src/ggs_vm_runner.erl b/src/ggs_vm_runner.erl
new file mode 100644
index 0000000..e149c51
--- /dev/null
+++ b/src/ggs_vm_runner.erl
@@ -0,0 +1,42 @@
+-module(ggs_vm_runner).
+-export([start_link/0, define/2, user_command/4]).
+
+%Mattias
+start_link() ->
+ erlang_js:start(),
+ PortPid = spawn_link( fun() ->
+ process_flag(trap_exit, true),
+ {ok, Port} = js_driver:new(),
+ js:define(Port, <<"function userCommand(user, command, args){return 'Hello world';}">>),
+ loop(Port)
+ end ),
+ PortPid.
+
+
+loop(Port) ->
+ receive
+ {define, SourceCode} ->
+ ok = js:define(Port, list_to_binary(SourceCode)),
+ loop(Port);
+ {user_command, User, Command, Args, From, Ref} ->
+ {ok, Ret} = js:call(Port, <<"userCommand">>,
+ [ list_to_binary(User),
+ list_to_binary(Command),
+ list_to_binary(Args)
+ ]),
+ From ! {Ref, Ret},
+ loop(Port)
+ end.
+
+
+define(GameVM, SourceCode) ->
+ GameVM ! {define,SourceCode}.
+
+user_command(GameVM, User, Command, Args) ->
+ Ref = make_ref(),
+ GameVM ! {user_command, User, Command, Args, self(), Ref},
+ receive
+ {Ref, RetVal} ->
+ RetVal;
+ Other -> Other
+ end.