<snapdata remixID="9679149"><project name="networking" app="Snap! 6, https://snap.berkeley.edu" version="1"><notes>Example of multiplayer game. Uses Websockets&#xD;&#xD;Use arrow keys to control your player. If you are alone, you can simulate another player by opening a new tab on this project.&#xD;&#xD;Also for some reason it seems to run faster in the editor.&#xD;&#xD;Server code: https://repl.it/@phazrlazr/snapnet</notes><thumbnail>data:image/png;base64,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</thumbnail><stage name="Stage" width="480" height="360" costume="0" color="255,255,255,1" tempo="60" threadsafe="false" penlog="false" volume="100" pan="0" lines="round" ternary="false" hyperops="true" codify="false" inheritance="true" sublistIDs="false" scheduled="false" id="1"><pentrails>data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAeAAAAFoCAYAAACPNyggAAAOhUlEQVR4Xu3VwQkAAAjEMN1/abewn7jAQRC64wgQIECAAIF3gX1fNEiAAAECBAiMAHsCAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQIHLFxAWmhEwHPAAAAAElFTkSuQmCC</pentrails><costumes><list struct="atomic" id="2"></list></costumes><sounds><list struct="atomic" id="3"></list></sounds><variables></variables><blocks></blocks><scripts></scripts><sprites><sprite name="player" idx="1" x="-208.31952602349156" y="65.44213627678005" heading="359" scale="0.5" volume="100" pan="0" rotation="1" draggable="false" costume="0" color="80,80,80,1" pen="middle" id="8"><costumes><list struct="atomic" id="9"></list></costumes><sounds><list struct="atomic" id="10"></list></sounds><blocks></blocks><variables><variable name="xv"><l>1.7600263320282494</l></variable><variable name="yv"><l>1.3195813778321386</l></variable><variable name="accel"><l>0.01</l></variable><variable name="id"><l>45489768</l></variable><variable name="desiredDir"><l>0</l></variable></variables><scripts><script x="148.9999999999999" y="30.00000000000003"><block s="receiveGo"></block><block s="doSetVar"><l>xv</l><l>0</l></block><block s="doSetVar"><l>yv</l><l>0</l></block><block s="doSetVar"><l>accel</l><l>0.01</l></block><block s="doGotoObject"><l><option>random position</option></l></block><block s="setScale"><l>50</l></block><block s="doForever"><script><block s="turn"><block s="reportProduct"><block s="reportDifference"><block s="reportKeyPressed"><l><option>right arrow</option></l></block><block s="reportKeyPressed"><l><option>left arrow</option></l></block></block><l>2</l></block></block><block s="doIf"><block s="reportKeyPressed"><l><option>up arrow</option></l></block><script><block s="doChangeVar"><l>xv</l><block s="reportProduct"><block s="reportMonadic"><l><option>sin</option></l><block s="direction"></block></block><block var="accel"/></block></block><block s="doChangeVar"><l>yv</l><block s="reportProduct"><block s="reportMonadic"><l><option>cos</option></l><block s="direction"></block></block><block var="accel"/></block></block></script></block><block s="doIf"><block s="reportLessThan"><block s="xPosition"></block><l>-240</l></block><script><block s="doSetVar"><l>xv</l><block s="reportDifference"><l></l><block var="xv"/></block></block><block s="setXPosition"><l>-240</l></block></script></block><block s="doIf"><block s="reportGreaterThan"><block s="xPosition"></block><l>240</l></block><script><block s="doSetVar"><l>xv</l><block s="reportDifference"><l></l><block var="xv"/></block></block><block s="setXPosition"><l>240</l></block></script></block><block s="doIf"><block s="reportLessThan"><block s="yPosition"></block><l>-180</l></block><script><block s="doSetVar"><l>yv</l><block s="reportDifference"><l></l><block var="yv"/></block></block><block s="setYPosition"><l>-180</l></block></script></block><block s="doIf"><block s="reportGreaterThan"><block s="yPosition"></block><l>180</l></block><script><block s="doSetVar"><l>yv</l><block s="reportDifference"><l></l><block var="yv"/></block></block><block s="setYPosition"><l>180</l></block></script></block><block s="changeXPosition"><block var="xv"/></block><block s="changeYPosition"><block var="yv"/></block></script></block></script><script x="448.9999999999999" y="416.00000000000034"><block s="reportDifference"><l></l><l></l></block></script><script x="575.3212890625" y="482.83333333333303"><block s="reportAttributeOf"><l>id</l><l></l></block></script><script x="468.3212890625" y="744.8333333333331"><block s="reportListItem"><l>123</l><block var="otherPlayers"/></block></script></scripts></sprite><sprite name="connection" idx="2" x="-44" y="-141" heading="0" scale="1" volume="100" pan="0" rotation="1" draggable="true" hidden="true" costume="0" color="168.3,0,80.78399999999992,1" pen="tip" id="146"><costumes><list struct="atomic" id="147"></list></costumes><sounds><list struct="atomic" id="148"></list></sounds><blocks><block-definition s="handle request %&apos;req&apos;" type="command" category="other"><comment x="0" y="0" w="90" collapsed="true">Uh-oh, a misnomer. Uh... the &quot;req&quot; variable contains the message</comment><header></header><code></code><translations></translations><inputs><input type="%s"></input></inputs><script><block s="doDeclareVariables"><list><l>player</l><l>data</l></list></block><block s="doIf"><block s="reportEquals"><custom-block s="value at key %s of %l"><l>message</l><block var="req"/></custom-block><l>player-connected</l></block><script><block s="doSetVar"><l>player</l><block s="newClone"><l>player</l></block></block><block s="doTellTo"><block var="player"/><block s="reifyScript"><script><block s="doSetVar"><l>id</l><l></l></block><block s="gotoXY"><l></l><l></l></block><block s="setHeading"><l></l></block></script><list></list></block><list><custom-block s="value at key %s of %l"><l>id</l><block var="req"/></custom-block><custom-block s="value at key %s of %l"><l>x</l><block var="req"/></custom-block><custom-block s="value at key %s of %l"><l>y</l><block var="req"/></custom-block><custom-block s="value at key %s of %l"><l>dir</l><block var="req"/></custom-block></list></block><block s="doAddToList"><block var="player"/><block var="otherPlayers"/></block></script></block><block s="doIf"><block s="reportEquals"><custom-block s="value at key %s of %l"><l>message</l><block var="req"/></custom-block><l>player-disconnected</l></block><script><block s="doSetVar"><l>player</l><custom-block s="get player with id %txt"><custom-block s="value at key %s of %l"><l>id</l><block var="req"/></custom-block></custom-block></block><block s="doSetVar"><l>otherPlayers</l><block s="reportKeep"><block s="reifyPredicate"><autolambda><block s="reportNot"><block s="reportEquals"><block var="player"/><l></l></block></block></autolambda><list></list></block><block var="otherPlayers"/></block></block><block s="doTellTo"><block var="player"/><block s="reifyScript"><script><block s="removeClone"></block></script><list></list></block><list></list></block></script></block><block s="doIf"><block s="reportEquals"><custom-block s="value at key %s of %l"><l>message</l><block var="req"/></custom-block><l>connection-success</l></block><script><block s="doTellTo"><l>player</l><block s="reifyScript"><script><block s="doSetVar"><l>id</l><l></l></block></script><list></list></block><list><custom-block s="value at key %s of %l"><l>id</l><block var="req"/></custom-block></list></block><block s="doForEach"><l>other</l><custom-block s="value at key %s of %l"><l>otherPlayers</l><block var="req"/></custom-block><script><block s="doSetVar"><l>player</l><block s="newClone"><l>player</l></block></block><block s="doTellTo"><block var="player"/><block s="reifyScript"><script><block s="doSetVar"><l>id</l><l></l></block><block s="gotoXY"><l></l><l></l></block><block s="setHeading"><l></l></block></script><list></list></block><list><custom-block s="value at key %s of %l"><l>id</l><block var="other"/></custom-block><custom-block s="value at key %s of %l"><l>x</l><block var="other"/></custom-block><custom-block s="value at key %s of %l"><l>y</l><block var="other"/></custom-block><custom-block s="value at key %s of %l"><l>dir</l><block var="other"/></custom-block></list></block><block s="doAddToList"><block var="player"/><block var="otherPlayers"/></block></script></block></script></block><block s="doIf"><block s="reportEquals"><custom-block s="value at key %s of %l"><l>message</l><block var="req"/></custom-block><l>update-players</l></block><script><block s="doForEach"><l>playerData</l><custom-block s="value at key %s of %l"><l>data</l><block var="req"/></custom-block><script><block s="bubble"><custom-block s="value at key %s of %l"><l>timestep</l><block var="req"/></custom-block></block><block s="doSetVar"><l>player</l><custom-block s="get player with id %txt"><custom-block s="value at key %s of %l"><l>id</l><block var="playerData"/></custom-block></custom-block></block><block s="doIf"><block s="reportIsA"><block var="player"/><l><option>sprite</option></l></block><script><block s="doTellTo"><block var="player"/><block s="reifyScript"><script><block s="doGlide"><block s="reportQuotient"><l></l><l>1000</l></block><l></l><l></l></block><block s="setHeading"><l></l></block></script><list></list></block><list><custom-block s="value at key %s of %l"><l>timestep</l><block var="req"/></custom-block><custom-block s="value at key %s of %l"><l>x</l><block var="playerData"/></custom-block><custom-block s="value at key %s of %l"><l>y</l><block var="playerData"/></custom-block><custom-block s="value at key %s of %l"><l>dir</l><block var="playerData"/></custom-block></list></block></script></block></script></block></script></block></script><scripts><script x="386.9999999999998" y="711.1666666666647"><custom-block s="get player with id %txt"><l>123</l></custom-block></script><script x="505.7011718749998" y="772.1666666666654"><custom-block s="value at key %s of %l"><l>id</l><block var="playerData"/></custom-block></script><script x="487.9999999999998" y="654.6666666666647"><block s="reportQuotient"><l></l><l></l></block></script><script x="492.9999999999998" y="963.4999999999984"><block s="doWarp"><script></script></block></script><script x="81" y="1019.3333333333312"><block s="doRun"><block s="reportJSFunction"><list><l>v</l></list><l>console.log(v);</l></block><list><custom-block s="value at key %s of %l"><l>timestep</l><block var="req"/></custom-block></list></block></script><script x="635.9999999999998" y="506.00000000000006"><block s="doIf"><block s="reportNot"><block s="reportEquals"><block s="reportAttributeOf"><l>id</l><l>player</l></block><custom-block s="value at key %s of %l"><l>id</l><block var="other"/></custom-block></block></block><script></script></block></script><script x="455.2978515625" y="865.5000000000002"><block s="reportNot"><block s="reportEquals"><block var="player"/><block s="reportObject"><l>player</l></block></block></block></script><script x="463.6416015625" y="602.5"><block s="reportAnd"><l/><l/></block></script></scripts></block-definition></blocks><variables><variable name="status"><l>Connected!</l></variable></variables><scripts><script x="20" y="20"><block s="receiveGo"></block><block s="doIf"><block s="reportAnd"><custom-block s="%obj is a socket?"><block var="connection"/></custom-block><custom-block s="socket %obj is %s"><block var="connection"/><l>open</l></custom-block></block><script><custom-block s="close socket %obj"><block var="connection"/></custom-block></script></block><block s="doSetVar"><l>status</l><l>Connecting...</l></block><block s="doSetVar"><l>otherPlayers</l><block s="reportNewList"><list></list></block></block><block s="doSetVar"><l>connection</l><custom-block s="new websocket at %txt"><l>wss://snapnet.phazrlazr.repl.co</l></custom-block></block><block s="doSetVar"><l>status</l><l>Connected!</l></block><custom-block s="bind %cmdRing to %s of socket %obj"><block s="reifyScript"><script><custom-block s="handle request %s" scope="local"><custom-block s="listify %mlt"><l></l></custom-block></custom-block></script><list></list></block><l>message</l><block var="connection"/></custom-block><custom-block s="bind %cmdRing to %s of socket %obj"><block s="reifyScript"><script><block s="doSetVar"><l>status</l><l>Disconnected</l></block></script><list></list></block><l>close</l><block var="connection"/></custom-block><custom-block s="send %s to socket %obj"><custom-block s="jsonify %l"><block s="reportNewList"><list><block s="reportAttributeOf"><l><option>x position</option></l><l>player</l></block><block s="reportAttributeOf"><l><option>y position</option></l><l>player</l></block><block s="reportAttributeOf"><l><option>direction</option></l><l>player</l></block></list></block></custom-block><block var="connection"/></custom-block><block s="doForever"><script><block s="doWait"><l>0.1</l></block><custom-block s="send %s to socket %obj"><custom-block s="jsonify %l"><block s="reportNewList"><list><l>update</l><block s="reportAttributeOf"><l><option>x position</option></l><l>player</l></block><block s="reportAttributeOf"><l><option>y position</option></l><l>player</l></block><block s="reportAttributeOf"><l><option>direction</option></l><l>player</l></block></list></block></custom-block><block var="connection"/></custom-block></script></block></script><script x="512" y="26.500000000000256"><block s="receiveInteraction"><l><option>stopped</option></l></block><block s="doIf"><block s="reportAnd"><custom-block s="%obj is a socket?"><block var="connection"/></custom-block><custom-block s="socket %obj is %s"><block var="connection"/><l>open</l></custom-block></block><script><custom-block s="close socket %obj"><block var="connection"/></custom-block><block s="doSetVar"><l>connection</l><l>0</l></block><block s="doSetVar"><l>status</l><l>Disconnected</l></block></script></block></script></scripts></sprite><watcher scope="player" var="xv" style="normal" x="10" y="31.000001999999995" color="243,118,29" hidden="true"/><watcher scope="player" var="yv" style="normal" x="10" y="52.000003999999976" color="243,118,29" hidden="true"/><watcher scope="player" var="accel" style="normal" x="10" y="73.00000599999998" color="243,118,29" hidden="true"/><watcher var="otherPlayers" style="normal" x="10" y="94.00000799999995" color="243,118,29" hidden="true"/><watcher scope="player" var="id" style="normal" x="10" y="115.00000999999997" color="243,118,29" hidden="true"/><watcher scope="connection" var="status" style="normal" x="3" y="334.00001199999974" color="243,118,29"/><watcher scope="player" var="desiredDir" style="normal" x="10" y="136.00001199999997" color="243,118,29" hidden="true"/></sprites></stage><hidden></hidden><headers></headers><code></code><blocks><block-definition s="listify %&apos;jsonString&apos;" type="reporter" category="operators"><header></header><code></code><translations>pt:os dados JSON _ em formato de lista&#xD;</translations><inputs><input type="%mlt"></input></inputs><script><block s="doReport"><block s="evaluate"><block s="reportJSFunction"><list><l>jsonString</l></list><l>return listify(JSON.parse(jsonString));&#xD;&#xD;function listify(jsonObject) {&#xD;  if (jsonObject instanceof Array) {&#xD;    return new List(jsonObject.map(function(eachElement) { return listify(eachElement)}));&#xD;  } else if (jsonObject instanceof Object) {&#xD;    return new List(Object.keys(jsonObject).map(function(eachKey) { return new List([eachKey,listify(jsonObject[eachKey])])} ))&#xD;  } else {&#xD;    return jsonObject&#xD;  }&#xD;}</l></block><list><block var="jsonString"/></list></block></block></script></block-definition><block-definition s="value at key %&apos;key&apos; of %&apos;lst&apos;" type="reporter" category="operators"><header></header><code></code><translations>pt:o valor com chave _ em _&#xD;</translations><inputs><input type="%s"></input><input type="%l"></input></inputs><script><block s="doWarp"><script><block s="doForEach"><l>each item</l><block var="lst"/><script><block s="doIf"><block s="reportEquals"><block s="reportListItem"><l>1</l><block var="each item"/></block><block var="key"/></block><script><block s="doReport"><block s="reportListItem"><l>2</l><block var="each item"/></block></block></script></block></script></block></script></block><block s="doReport"><l></l></block></script></block-definition><block-definition s="%&apos;method&apos; url: %&apos;url&apos; send: %&apos;payload&apos; headers: %&apos;headers&apos;" type="reporter" category="sensing"><header></header><code></code><translations>pt:a resposta a _ de _ enviando _ e cabeçalhos _&#xD;</translations><inputs><input type="%s" readonly="true">GET<options>GET&#xD;POST&#xD;PUT&#xD;DELETE</options></input><input type="%s">https://snap.berkeley.edu</input><input type="%s"></input><input type="%mult%l" readonly="true"></input></inputs><script><block s="doReport"><block s="evaluate"><block s="reportJSFunction"><list><l>method</l><l>url</l><l>data</l><l>headers</l><l>proc</l></list><l>var response, i, header;&#xD;if (!proc.httpRequest) {&#xD;  proc.httpRequest = new XMLHttpRequest();&#xD;  proc.httpRequest.open(method, url, true);&#xD;  proc.assertType(headers, &apos;list&apos;);&#xD;  for (i = 1; i &lt;= headers.length(); i += 1) {&#xD;    header = headers.at(i);&#xD;    proc.assertType(header, &apos;list&apos;);&#xD;    proc.httpRequest.setRequestHeader(&#xD;      header.at(1),&#xD;      header.at(2)&#xD;    );&#xD;  }&#xD;  proc.httpRequest.send(data || null);&#xD;} else if (proc.httpRequest.readyState === 4) {&#xD;  response = proc.httpRequest.responseText;&#xD;  proc.httpRequest = null;&#xD;  return response;&#xD;}&#xD;proc.pushContext(&apos;doYield&apos;);&#xD;proc.pushContext();</l></block><list><block var="method"/><block var="url"/><block var="payload"/><block var="headers"/></list></block></block></script></block-definition><block-definition s="key: %&apos;key&apos; value: %&apos;value&apos;" type="reporter" category="operators"><header></header><code></code><translations>pt:um par (chave: _ , valor: _ )&#xD;</translations><inputs><input type="%s"></input><input type="%s"></input></inputs><script><block s="doReport"><block s="reportNewList"><list><block var="key"/><block var="value"/></list></block></block></script></block-definition><block-definition s="new websocket at %&apos;url&apos;" type="reporter" category="sensing"><header></header><code></code><translations></translations><inputs><input type="%txt"></input></inputs><script><block s="doDeclareVariables"><list><l>socket</l><l>done</l></list></block><block s="doSetVar"><l>done</l><block s="reportBoolean"><l><bool>false</bool></l></block></block><block s="doRun"><block s="reportJSFunction"><list><l>url</l><l>proc</l></list><l>var socket = new WebSocket(url);&#xD;&#xD;socket.onerror = function() {&#xD;  socket.onerror = function() { };&#xD;  throw new Error("Problem connecting");&#xD;}&#xD;&#xD;socket.onopen = function(event) {&#xD;  console.log("Socket opened");&#xD;  socket.onerror = function() { };&#xD;&#xD;  //console.log(proc.context);&#xD;&#xD;  proc.context.variables.parentFrame.setVar("socket", socket);&#xD;  proc.context.variables.parentFrame.setVar("done", true);&#xD;  proc.resume();&#xD;}&#xD;&#xD;proc.pause();</l></block><list><block var="url"/></list></block><block s="doWaitUntil"><block var="done"/></block><block s="doReport"><block var="socket"/></block></script></block-definition><block-definition s="bind %&apos;f&apos; to %&apos;ev&apos; of socket %&apos;socket&apos;" type="command" category="sensing"><header></header><code></code><translations></translations><inputs><input type="%cmdRing"></input><input type="%s" readonly="true">message<options>message&#xD;close</options></input><input type="%obj"></input></inputs><script><block s="doRun"><block s="reportJSFunction"><list><l>f</l><l>evName</l><l>socket</l><l>proc</l></list><l>if (!(socket instanceof WebSocket)) throw new Error("Not a socket");&#xD;&#xD;var receiver = proc.receiver;&#xD;&#xD;if (evName === "message") {&#xD;  socket.onmessage = function(msg) {&#xD;    //console.log(msg.data);&#xD;    proc.fork(f, new List([msg.data])); &#xD;  }&#xD;} else if (evName === "close") {&#xD;  socket.onclose = function() {&#xD;    proc.fork(f, new List());&#xD;  }&#xD;} else {&#xD;  throw new Error("Event does not exist");&#xD;}</l></block><list><block var="f"/><block var="ev"/><block var="socket"/></list></block></script></block-definition><block-definition s="close socket %&apos;socket&apos;" type="command" category="sensing"><header></header><code></code><translations></translations><inputs><input type="%obj"></input></inputs><script><block s="doRun"><block s="reportJSFunction"><list><l>socket</l></list><l>if (!(socket instanceof WebSocket)) throw new Error("Not a socket");&#xD;&#xD;socket.close();</l></block><list><block var="socket"/></list></block></script></block-definition><block-definition s="send %&apos;msg&apos; to socket %&apos;socket&apos;" type="command" category="sensing"><header></header><code></code><translations></translations><inputs><input type="%s"></input><input type="%obj"></input></inputs><script><block s="doRun"><block s="reportJSFunction"><list><l>socket</l><l>msg</l></list><l>if (!(socket instanceof WebSocket)) throw new Error("Not a socket");&#xD;&#xD;socket.send(msg.toString());</l></block><list><block var="socket"/><block var="msg"/></list></block></script></block-definition><block-definition s="jsonify %&apos;list&apos;" type="reporter" category="operators"><header></header><code></code><translations></translations><inputs><input type="%l"></input></inputs><script><block s="doReport"><block s="evaluate"><block s="reportJSFunction"><list><l>list</l></list><l>function f(arr) {&#xD;  return arr.map(function(v) {&#xD;    if (v instanceof List) {&#xD;      return f(v.contents);&#xD;    }&#xD;    if (typeof v === "object") {&#xD;      return v.toString();&#xD;    }&#xD;    return v;&#xD;  }) &#xD;}&#xD;&#xD;return JSON.stringify(f(list.contents));</l></block><list><block var="list"/></list></block></block></script></block-definition><block-definition s="socket %&apos;socket&apos; is %&apos;state&apos;" type="predicate" category="sensing"><header></header><code></code><translations></translations><inputs><input type="%obj"></input><input type="%s" readonly="true">open<options>connecting&#xD;open&#xD;closing&#xD;closed</options></input></inputs><script><block s="doReport"><block s="evaluate"><block s="reportJSFunction"><list><l>socket</l><l>state</l></list><l>if (!(socket instanceof WebSocket)) throw new Error("Not a socket");&#xD;&#xD;return socket.readyState === WebSocket[state.toString().toUpperCase()];</l></block><list><block var="socket"/><block var="state"/></list></block></block></script></block-definition><block-definition s="%&apos;socket&apos; is a socket?" type="predicate" category="sensing"><header></header><code></code><translations></translations><inputs><input type="%obj"></input></inputs><script><block s="doReport"><block s="evaluate"><block s="reportJSFunction"><list><l>obj</l></list><l>return obj instanceof WebSocket;</l></block><list><block var="socket"/></list></block></block></script></block-definition><block-definition s="get player with id %&apos;id&apos;" type="reporter" category="other"><header></header><code></code><translations></translations><inputs><input type="%txt"></input></inputs><script><block s="doReport"><block s="reportFindFirst"><block s="reifyPredicate"><autolambda><block s="reportEquals"><block s="reportAttributeOf"><l>id</l><l></l></block><block var="id"/></block></autolambda><list></list></block><block var="otherPlayers"/></block></block></script></block-definition><block-definition s="timestamp" type="reporter" category="sensing"><header></header><code></code><translations></translations><inputs></inputs><script><block s="doReport"><block s="evaluate"><block s="reportJSFunction"><list></list><l>return Date.now();</l></block><list></list></block></block></script></block-definition></blocks><variables><variable name="connection"></variable><variable name="otherPlayers"><list id="802"><item></item></list></variable></variables></project><media name="networking" app="Snap! 6, https://snap.berkeley.edu" version="1"></media></snapdata>