<room name="{project_name}" app="NetsBlox 1.27.2, http://netsblox.org">
<role name="myRole">
<media name="myRole" app="NetsBlox 1.27.2, http://netsblox.org" version="1.27.2"></media>
<project name="myRole" app="NetsBlox 1.27.2, http://netsblox.org" version="1.27.2">
<stage name="Stage" width="{stage_size}" height="{stage_size}" costume="0" color="0,0,0,1" tempo="60" threadsafe="false" penlog="false" volume="100" pan="0" lines="round" ternary="false" hyperops="true" codify="false" inheritance="false" sublistIDs="false" scheduled="false" id="1">
<variables>
</variables>
<blocks>
<block-definition s="initialize" type="command" category="control"><inputs></inputs><script><block s="doWarp"><script><block s="doBroadcastAndWait"><l>delete patches</l></block><block s="doDeclareVariables"><list><l>w</l><l>scale</l><l>temp</l></list></block><block s="doSetVar"><l>w</l><l>{patches_radius}</l></block><block s="doSetVar"><l>scale</l><l>{patches_scale}</l></block><block s="doSetVar"><l>patches</l><block s="reportNewList"><list></list></block></block><block s="doFor"><l>r</l><block s="reportMonadic"><l><option>neg</option></l><block var="w"/></block><block var="w"/><script><block s="doFor"><l>c</l><block s="reportMonadic"><l><option>neg</option></l><block var="w"/></block><block var="w"/><script><block s="doSetVar"><l>temp</l><block s="newClone"><l>patches</l></block></block><block s="doTellTo"><block var="temp"/><block s="reifyScript"><script><block s="gotoXY"><block s="reportProduct"><block var="c"/><block var="scale"/></block><block s="reportProduct"><block var="r"/><block var="scale"/></block></block><block s="setColor"><color>0,0,0,1</color></block></script><list></list></block><list></list></block><block s="doAddToList"><block var="temp"/><block var="patches"/></block></script></block></script></block><block s="doResetTimer"></block></script></block></script></block-definition>
</blocks>
<scripts>
<script x="20" y="20"><block s="receiveGo"></block><custom-block s="initialize" scope="local"></custom-block><custom-block s="setup"></custom-block><block s="doForever"><script><custom-block s="go"></custom-block><custom-block s="update background"></custom-block></script></block></script>
</scripts>
<sprites>
{breed_sprites}
<sprite name="patches" x="0" y="0" heading="0" hidden="true" color="0,0,0,1" pen="middle" scale="{base_sprite_scale}">
<blocks>
</blocks>
<variables>
{patches_props}
</variables>
<scripts>
<script x="20" y="20"><block s="receiveMessage"><l>delete patches</l></block><block s="removeClone"></block></script>
<script x="20" y="100"><custom-block s="tell %l to %cs"><block var="patches"/><script></script></custom-block><custom-block s="update background"></custom-block></script>
</scripts>
</sprite>
</sprites>
</stage>
<hidden>


 bounceOffEdge doGlide doGotoObject changeXPosition setXPosition changeYPosition setYPosition xPosition yPosition forward doFaceTowards gotoXY 



 doFor receiveGo receiveKey receiveInteraction receiveCondition receiveMessage doBroadcast doBroadcastAndWait doSend getLastMessage doWarp doWait doWaitUntil doRun fork evaluate doTellTo reportAskFor doCallCC reportCallCC receiveOnClone createClone newClone doPauseAll doStopThis 



 doSwitchToCostume doWearNextCostume getCostumeIdx doSayFor doThinkFor bubble doThink reportGetImageAttribute reportNewCostumeStretched reportNewCostume changeEffect setEffect clearEffects getEffect changeScale setScale getScale goToLayer goBack 



 reportTouchingObject reportTouchingColor reportColorIsTouchingColor doAsk getLastAnswer reportMouseX reportMouseY reportAspect reportRelationTo reportAttributeOf reportGet reportObject reportURL reportAudio reportVideo doSetVideoTransparency reportGlobalFlag doSetGlobalFlag reportUsername reportLatitude reportLongitude reportImageOfObject reportDate reportStageHeight reportStageWidth reportKeyPressed 



 playSound doPlaySoundUntilDone doPlaySoundAtRate doStopAllSounds reportGetSoundAttribute reportNewSoundFromSamples doRest doPlayNote doPlayFrequency doSetInstrument doChangeTempo doSetTempo getTempo changeVolume setVolume getVolume changePan setPan getPan playFreq stopFreq reportSounds 



 write reportPenTrailsAsCostume doPasteOn getPenAttribute setPenHSVA changePenHSVA 



 doRunRPC getJSFromRPC getJSFromRPCDropdown getJSFromRPCStruct getCostumeFromRPC reportRPCError doSocketRequest doSocketResponse doSocketMessage receiveSocketMessage getProjectId getProjectIds 

</hidden>
<variables>
<variable name="__context"><list struct="atomic"></list></variable>
<variable name="ticks"><l>0</l></variable>
<variable name="turtles"><list struct="atomic"></list></variable>
<variable name="patches"><list struct="atomic"></list></variable>
{variables}
</variables>
<blocks>
<block-definition s="__meta" type="reporter" category="variables"><inputs></inputs><script><block s="doReport"><block s="evaluate"><block s="reportJSFunction"><list></list><l>return {metadata_json};</l></block><list></list></block></block></script></block-definition>
<block-definition s="script variable %'a' = %'value'" type="command" category="other"><inputs><input type="%upvar"></input><input type="%s"></input></inputs><script><block s="doSetVar"><l>a</l><block var="value"/></block></script></block-definition>
<block-definition s="%'a' xor %'b'" type="predicate" category="operators"><inputs><input type="%b"></input><input type="%b"></input></inputs><script><block s="doReport"><block s="reportEquals"><block s="reportNot"><block s="reportNot"><block var="a"/></block></block><block s="reportNot"><block var="b"/></block></block></block></script></block-definition>
<block-definition s="pick random float %'max'" type="reporter" category="operators"><inputs><input type="%n"></input></inputs><script><block s="doDeclareVariables"><list><l>a</l></list></block><block s="doSetVar"><l>a</l><l>10000000000</l></block><block s="doReport"><block s="reportProduct"><block var="max"/><block s="reportQuotient"><custom-block s="pick random 0 up to %n"><block var="a"/></custom-block><block var="a"/></block></block></block></script></block-definition>
<block-definition s="pick random 0 up to %'val'" type="reporter" category="operators"><inputs><input type="%n"></input></inputs><script><block s="doReport"><block s="reportIfElse"><block s="reportLessThan"><block var="val"/><l>0</l></block><block s="reportMonadic"><l><option>neg</option></l><custom-block s="pick random 0 up to %n"><block s="reportMonadic"><l><option>neg</option></l><block var="val"/></block></custom-block></block><block s="reportRandom"><l>0</l><block s="reportDifference"><block var="val"/><l>1</l></block></block></block></block></script></block-definition>
<block-definition s="is %'sprite' alive?" type="predicate" category="operators"><inputs><input type="%obj"></input></inputs><script><block s="doReport"><block s="evaluate"><block s="reportJSFunction"><list><l>sprite</l></list><l>return !sprite.isCorpse;</l></block><list><block var="sprite"/></list></block></block></script></block-definition>
<block-definition s="atan x: %'x' y: %'y'" type="reporter" category="operators"><inputs><input type="%n"></input><input type="%n"></input></inputs><script><block s="doIf"><block s="reportEquals"><block var="y"/><l>0</l></block><script><block s="doReport"><block s="reportIfElse"><block s="reportLessThan"><block var="x"/><l>0</l></block><l>270</l><l>90</l></block></block></script></block><custom-block s="script variable %upvar = %s"><l>a</l><block s="reportMonadic"><l><option>atan</option></l><block s="reportQuotient"><block var="x"/><block var="y"/></block></block></custom-block><block s="doReport"><block s="reportIfElse"><block s="reportLessThan"><block var="y"/><l>0</l></block><block s="reportSum"><block var="a"/><l>180</l></block><block s="reportIfElse"><block s="reportLessThan"><block var="x"/><l>0</l></block><block s="reportSum"><block var="a"/><l>360</l></block><block var="a"/></block></block></block></script></block-definition>
<block-definition s="color %'name'" type="reporter" category="pen"><inputs><input type="%s" readonly="true"><options>black
gray
white
red
orange
brown
yellow
green
lime
turquoise
cyan
sky
blue
violet
magenta
pink</options></input></inputs><script><block s="doReport"><block s="evaluate"><block s="reportJSFunction"><list><l>name</l></list><l>switch (name) {{
case 'black': return new List([0, 0, 0]);
case 'gray': return new List([141, 141, 141]);
case 'white': return new List([255, 255, 255]);
case 'red': return new List([215, 50, 41]);
case 'orange': return new List([241, 106, 21]);
case 'brown': return new List([157, 110, 72]);
case 'yellow': return new List([237, 237, 49]);
case 'green': return new List([89, 176, 60]);
case 'lime': return new List([44, 209, 59]);
case 'turquoise': return new List([29, 159, 120]);
case 'cyan': return new List([84, 196, 196]);
case 'sky': return new List([45, 141, 190]);
case 'blue': return new List([52, 93, 169]);
case 'violet': return new List([124, 80, 164]);
case 'magenta': return new List([167, 27, 106]);
case 'pink': return new List([224, 127, 150]);
}}</l></block><list><block var="name"/></list></block></block></script></block-definition>
<block-definition s="set pen color to %'color'" type="command" category="pen"><inputs><input type="%l"></input></inputs><script><block s="doRun"><block s="reportJSFunction"><list><l>sprite</l><l>co</l></list><l>const [r,g,b] = co.contents;
sprite.setColor(new Color(r,g,b));</l></block><list><block s="reportObject"><l><option>myself</option></l></block><block var="color"/></list></block></script></block-definition>
<block-definition s="pen color" type="reporter" category="pen"><inputs></inputs><script><block s="doReport"><block s="evaluate"><block s="reportJSFunction"><list><l>sprite</l></list><l>const c = sprite.color; return new List([c.r, c.g, c.b]);</l></block><list><block s="reportObject"><l><option>myself</option></l></block></list></block></block></script></block-definition>
<block-definition s="pen mode" type="reporter" category="pen"><inputs></inputs><script><block s="doReport"><block s="reportIfElse"><block s="getPenDown"></block><l>down</l><l>up</l></block></block></script></block-definition>
<block-definition s="update background" type="command" category="looks"><inputs></inputs><script><block s="doWarp"><script><block s="doDeclareVariables"><list><l>temp</l></list></block><block s="doSetVar"><l>temp</l><block s="evaluate"><block s="reportJSFunction"><list><l>patches</l></list><l>const w = {patches_dim};
const scale = {patches_scale};
const raw = new Array(w * w * scale * scale);
const row = new Array(w * scale);
let rawp = 0;
for (let r = w - 1; r >= 0; --r) {{
 let rowp = 0;
 for (let c = 0; c < w; ++c) {{
 const color = patches.contents[r * w + c].color;
 const co = new List([color.r, color.g, color.b, 255]);
 for (let i = 0; i < scale; ++i) row[rowp++] = co;
 }}
 for (let i = 0; i < scale; ++i) {{
 for (let j = 0; j < row.length; ++j) raw[rawp++] = row[j];
 }}
}}
return new List([new List(raw), w * scale]);</l></block><list><block var="patches"/></list></block></block><block s="doTellTo"><l>Stage</l><block s="reifyScript"><script><block s="doSwitchToCostume"><block s="reportNewCostume"><block s="reportListItem"><l>1</l><block var="temp"/></block><block s="reportListItem"><l>2</l><block var="temp"/></block><block s="reportListItem"><l>2</l><block var="temp"/></block></block></block></script><list></list></block><list></list></block></script></block></script></block-definition>
<block-definition s="set scale to %'scale' x" type="command" category="looks"><inputs><input type="%n">1</input></inputs><script><block s="setScale"><block s="reportProduct"><block var="scale"/><block s="reportProduct"><l>{base_sprite_scale}</l><l>100</l></block></block></block></script></block-definition>
<block-definition s="scale" type="reporter" category="looks"><inputs></inputs><script><block s="doReport"><block s="reportQuotient"><block s="getScale"></block><block s="reportProduct"><l>{base_sprite_scale}</l><l>100</l></block></block></block></script></block-definition>
<block-definition s="%'count' clones" type="reporter" category="control"><inputs><input type="%n"></input></inputs><script><block s="doWarp"><script><block s="doIf"><block s="reportLessThan"><block var="count"/><l>1</l></block><script><block s="doReport"><block s="reportNewList"><list></list></block></block></script></block><custom-block s="script variable %upvar = %s"><l>breed</l><block s="evaluate"><block s="reportJSFunction"><list><l>stage</l><l>obj</l></list><l>const name = obj.name || obj.cloneOriginName;
return stage.variables.parentFrame.vars[name].value;</l></block><list><block s="reportObject"><l>Stage</l></block><block s="reportGet"><l><option>self</option></l></block></list></block></custom-block><custom-block s="script variable %upvar = %s"><l>res</l><block s="reportNewList"><list></list></block></custom-block><block s="doFor"><l>i</l><l>1</l><block var="count"/><script><custom-block s="script variable %upvar = %s"><l>temp</l><block s="newClone"><l><option>myself</option></l></block></custom-block><block s="doAddToList"><block var="temp"/><block var="turtles"/></block><block s="doAddToList"><block var="temp"/><block var="breed"/></block><block s="doAddToList"><block var="temp"/><block var="res"/></block></script></block><block s="doReport"><block var="res"/></block></script></block></script></block-definition>
<block-definition s="%'count' new %'breed-name'" type="reporter" category="control"><inputs><input type="%n"></input><input type="%s" readonly="true"><options>{plural_breed_names}</options></input></inputs><script><custom-block s="script variable %upvar = %s"><l>res</l><block s="reportAskFor"><block var="breed-name"/><block s="reifyReporter"><autolambda><custom-block s="%n clones"><block var="count"/></custom-block></autolambda><list></list></block><list></list></block></custom-block><custom-block s="tell %l to %cs"><block var="res"/><script><block s="gotoXY"><l>0</l><l>0</l></block><block s="setHeading"><l><option>random</option></l></block><block s="show"></block></script></custom-block><block s="doReport"><block var="res"/></block></script></block-definition>
<block-definition s="%'count' new %'breed-name' (ordered)" type="reporter" category="control"><inputs><input type="%n"></input><input type="%s" readonly="true"><options>{plural_breed_names}</options></input></inputs><script><custom-block s="script variable %upvar = %s"><l>res</l><block s="reportAskFor"><block var="breed-name"/><block s="reifyReporter"><autolambda><custom-block s="%n clones"><block var="count"/></custom-block></autolambda><list></list></block><list></list></block></custom-block><block s="doWarp"><script><custom-block s="script variable %upvar = %s"><l>ang</l><l>0</l></custom-block><custom-block s="script variable %upvar = %s"><l>dtheta</l><block s="reportQuotient"><l>360</l><block var="count"/></block></custom-block><block s="doForEach"><l>sprite</l><block var="res"/><script><block s="doTellTo"><block var="sprite"/><block s="reifyScript"><script><block s="gotoXY"><l>0</l><l>0</l></block><block s="setHeading"><block var="ang"/></block><block s="show"></block></script><list></list></block><list></list></block><block s="doChangeVar"><l>ang</l><block var="dtheta"/></block></script></block><block s="doReport"><block var="res"/></block></script></block></script></block-definition>
<block-definition s="tell %'sprites' to %'action'" type="command" category="control"><inputs><input type="%l"></input><input type="%cs"></input></inputs><script><block s="doWarp"><script><block s="doAddToList"><block s="reportObject"><l><option>myself</option></l></block><block var="__context"/></block><block s="doForEach"><l>sprite</l><block s="reportIfElse"><block s="reportIsA"><block var="sprites"/><l><option>list</option></l></block><block s="reportKeep"><block s="reifyPredicate"><autolambda><block s="reportBoolean"><l><bool>true</bool></l></block></autolambda><list></list></block><block var="sprites"/></block><block s="reportNewList"><list><block var="sprites"/></list></block></block><script><block s="doIf"><custom-block s="is %obj alive?"><block var="sprite"/></custom-block><script><block s="doTellTo"><block var="sprite"/><block var="action"/><list></list></block></script></block></script></block><block s="doDeleteFromList"><l><option>last</option></l><block var="__context"/></block></script></block></script></block-definition>
<block-definition s="ask %'sprite' for its %'val'" type="reporter" category="control"><inputs><input type="%obj"></input><input type="%repRing"></input></inputs><script><block s="doAddToList"><block s="reportObject"><l><option>myself</option></l></block><block var="__context"/></block><custom-block s="script variable %upvar = %s"><l>res</l><block s="reportIfElse"><block s="reportIsA"><block var="sprite"/><l><option>list</option></l></block><block s="reportMap"><block s="reifyReporter"><autolambda><block s="reportAskFor"><l></l><block var="val"/><list></list></block></autolambda><list></list></block><block s="reportKeep"><block s="reifyPredicate"><autolambda><custom-block s="is %obj alive?"><l/></custom-block></autolambda><list></list></block><block var="sprite"/></block></block><block s="reportAskFor"><block var="sprite"/><block var="val"/><list></list></block></block></custom-block><block s="doDeleteFromList"><l><option>last</option></l><block var="__context"/></block><block s="doReport"><block var="res"/></block></script></block-definition>
<block-definition s="delete all clones" type="command" category="control"><inputs></inputs><script><block s="doBroadcastAndWait"><l>delete</l></block><block s="doWarp"><script><block s="doDeclareVariables"><list><l>breed-names</l></list></block><block s="doSetVar"><l>breed-names</l><block s="reportTextSplit"><block s="evaluate"><block s="reportJSFunction"><list><l>stage</l></list><l>return stage.parent.sprites.contents.map(s => s.name).toString();</l></block><list><block s="reportObject"><l>Stage</l></block></list></block><l>,</l></block></block><block s="doAddToList"><l>turtles</l><block var="breed-names"/></block><block s="doForEach"><l>breed-name</l><block var="breed-names"/><script><block s="doIf"><block s="reportNot"><block s="reportEquals"><block var="breed-name"/><l>patches</l></block></block><script><block s="doRun"><block s="reportJSFunction"><list><l>stage</l><l>name</l></list><l>stage.variables.parentFrame.vars[name].value = new List();</l></block><list><block s="reportObject"><l>Stage</l></block><block var="breed-name"/></list></block></script></block></script></block></script></block></script></block-definition>
<block-definition s="reset patches" type="command" category="control"><inputs></inputs><script><custom-block s="tell %l to %cs"><block var="patches"/><script><block s="setColor"><color>0,0,0,1</color></block><block s="doRun"><block s="reportJSFunction"><list><l>obj</l></list><l>const vars = obj.variables.vars;
for (const v in vars) vars[v].value = 0;</l></block><list><block s="reportObject"><l><option>myself</option></l></block></list></block></script></custom-block></script></block-definition>
<block-definition s="reset global variables" type="command" category="control"><inputs></inputs><script><block s="doRun"><block s="reportJSFunction"><list><l>stage</l><l>meta</l></list><l>const sprites = stage.parent.sprites.contents.map(s => s.name);
const vars = stage.variables.parentFrame.vars;
for (const v in vars) {{
 if (sprites.includes(v)) continue;
 if (v === 'turtles' || v === 'ticks' || v.startsWith('__')) continue;
 if (meta.gui_vars.includes(v)) continue;
 vars[v].value = 0;
}}</l></block><list><block s="reportObject"><l>Stage</l></block><custom-block s="__meta"></custom-block></list></block></script></block-definition>
<block-definition s="reset everything" type="command" category="control"><inputs></inputs><script><custom-block s="delete all clones"></custom-block><custom-block s="reset patches"></custom-block><custom-block s="reset global variables"></custom-block><block s="doSetVar"><l>ticks</l><l>0</l></block></script></block-definition>
<block-definition s="ask %'q' and wait" type="reporter" category="sensing"><inputs><input type="%s"></input></inputs><script><block s="doAsk"><block var="q"/></block><block s="doReport"><block s="getLastAnswer"></block></block></script></block-definition>
<block-definition s="self" type="reporter" category="sensing"><inputs></inputs><script><block s="doReport"><block s="reportObject"><l><option>myself</option></l></block></block></script></block-definition>
<block-definition s="asker" type="reporter" category="sensing"><inputs></inputs><script><block s="doReport"><block s="reportListItem"><l><option>last</option></l><block var="__context"/></block></block></script></block-definition>
<block-definition s="current patch" type="reporter" category="sensing"><inputs></inputs><script><block s="doReport"><block s="reportListItem"><block s="evaluate"><block s="reportJSFunction"><list><l>x</l><l>y</l></list><l>let j = Math.floor((x + {stage_size} / 2) / {patches_scale});
let i = Math.floor((y + {stage_size} / 2) / {patches_scale});
j = j < 0 ? 0 : j < {patches_dim} ? j : {patches_dim} - 1;
i = i < 0 ? 0 : i < {patches_dim} ? i : {patches_dim} - 1;
return i * {patches_dim} + j + 1</l></block><list><block s="xPosition"></block><block s="yPosition"></block></list></block><block var="patches"/></block></block></script></block-definition>
<block-definition s="distance from x: %'x' y: %'y'" type="reporter" category="sensing"><inputs><input type="%n">0</input><input type="%n">0</input></inputs><script><block s="doReport"><block s="evaluate"><block s="reportJSFunction"><list><l>x</l><l>y</l><l>myX</l><l>myY</l></list><l>x = (x + {patches_dim}/2) % {patches_dim};
if (x < 0) x += {patches_dim};
x -= {patches_dim}/2;
y = (y + {patches_dim}/2) % {patches_dim};
if (y < 0) y += {patches_dim};
y -= {patches_dim}/2;

let bestDist = Infinity;
for (let i = -1; i <= 1; ++i) {{
 for (let j = -1; j <= 1; ++j) {{
 const dx = (x + i*{patches_dim}) - myX;
 const dy = (y + j*{patches_dim}) - myY;
 const d = dx*dx + dy*dy;
 if (d < bestDist) bestDist = d;
 }}
}}
return Math.sqrt(bestDist);</l></block><list><block var="x"/><block var="y"/><custom-block s="x position"></custom-block><custom-block s="y position"></custom-block></list></block></block></script></block-definition>
<block-definition s="distance from %'sprite'" type="reporter" category="sensing"><inputs><input type="%obj"></input></inputs><script><custom-block s="script variable %upvar = %s"><l>p</l><block s="reportAskFor"><block var="sprite"/><block s="reifyReporter"><autolambda><block s="reportNewList"><list><custom-block s="x position"></custom-block><custom-block s="y position"></custom-block></list></block></autolambda><list></list></block><list></list></block></custom-block><block s="doReport"><custom-block s="distance from x: %n y: %n"><block s="reportListItem"><l>1</l><block var="p"/></block><block s="reportListItem"><l>2</l><block var="p"/></block></custom-block></block></script></block-definition>
<block-definition s="direction towards x: %'x' y: %'y'" type="reporter" category="sensing"><inputs><input type="%n">0</input><input type="%n">0</input></inputs><script><custom-block s="script variable %upvar = %s"><l>delta</l><block s="evaluate"><block s="reportJSFunction"><list><l>x</l><l>y</l><l>myX</l><l>myY</l></list><l>x = (x + {patches_dim}/2) % {patches_dim};
if (x < 0) x += {patches_dim};
x -= {patches_dim}/2;
y = (y + {patches_dim}/2) % {patches_dim};
if (y < 0) y += {patches_dim};
y -= {patches_dim}/2;

let bestDelta = undefined;
let bestDist = Infinity;
for (let i = -1; i <= 1; ++i) {{
 for (let j = -1; j <= 1; ++j) {{
 const dx = (x + i*{patches_dim}) - myX;
 const dy = (y + j*{patches_dim}) - myY;
 const d = dx*dx + dy*dy;
 if (d < bestDist) {{
 bestDist = d;
 bestDelta = [dx, dy];
 }}
 }}
}}
return new List(bestDelta);</l></block><list><block var="x"/><block var="y"/><custom-block s="x position"></custom-block><custom-block s="y position"></custom-block></list></block></custom-block><block s="doReport"><custom-block s="atan x: %n y: %n"><block s="reportListItem"><l>1</l><block var="delta"/></block><block s="reportListItem"><l>2</l><block var="delta"/></block></custom-block></block></script></block-definition>
<block-definition s="direction towards %'sprite'" type="reporter" category="sensing"><inputs><input type="%obj"></input></inputs><script><custom-block s="script variable %upvar = %s"><l>p</l><block s="reportAskFor"><block var="sprite"/><block s="reifyReporter"><autolambda><block s="reportNewList"><list><custom-block s="x position"></custom-block><custom-block s="y position"></custom-block></list></block></autolambda><list></list></block><list></list></block></custom-block><block s="doReport"><custom-block s="direction towards x: %n y: %n"><block s="reportListItem"><l>1</l><block var="p"/></block><block s="reportListItem"><l>2</l><block var="p"/></block></custom-block></block></script></block-definition>
<block-definition s="mouse x" type="reporter" category="sensing"><inputs></inputs><script><block s="doReport"><block s="reportQuotient"><block s="reportMouseX"></block><l>{patches_scale}</l></block></block></script></block-definition>
<block-definition s="mouse y" type="reporter" category="sensing"><inputs></inputs><script><block s="doReport"><block s="reportQuotient"><block s="reportMouseY"></block><l>{patches_scale}</l></block></block></script></block-definition>
<block-definition s="mouse in stage?" type="predicate" category="sensing"><inputs></inputs><script><block s="doReport"><block s="reportNot"><block s="reportOr"><block s="reportGreaterThan"><block s="reportMonadic"><l><option>abs</option></l><block s="reportRound"><custom-block s="mouse x"></custom-block></block></block><l>{patches_radius}</l></block><block s="reportGreaterThan"><block s="reportMonadic"><l><option>abs</option></l><block s="reportRound"><custom-block s="mouse y"></custom-block></block></block><l>{patches_radius}</l></block></block></block></block></script></block-definition>
<block-definition s="set patch %'name' to %'value'" type="command" category="variables"><inputs><input type="%s" readonly="true"><options>{patch_props}</options></input><input type="%s"></input></inputs><script><block s="doRun"><block s="reportJSFunction"><list><l>patch</l><l>name</l><l>value</l></list><l>if (name === 'color') {{
 const [r, g, b] = value.contents;
 const c = patch.color;
 c.r = r; c.g = g; c.b = b; 
}}
else patch.variables.vars[name].value = value;</l></block><list><custom-block s="current patch"></custom-block><block var="name"/><block var="value"/></list></block></script></block-definition>
<block-definition s="change patch %'name' by %'value'" type="command" category="variables"><inputs><input type="%s" readonly="true"><options>{patch_props}</options></input><input type="%s"></input></inputs><script><block s="doRun"><block s="reportJSFunction"><list><l>patch</l><l>name</l><l>value</l></list><l>const v = patch.variables.vars[name]; v.value = +v.value + +value;</l></block><list><custom-block s="current patch"></custom-block><block var="name"/><block var="value"/></list></block></script></block-definition>
<block-definition s="get patch %'name'" type="reporter" category="variables"><inputs><input type="%s" readonly="true"><options>{patch_props}</options></input></inputs><script><block s="doReport"><block s="evaluate"><block s="reportJSFunction"><list><l>patch</l><l>name</l></list><l>if (name === 'color') {{
 const c = patch.color;
 return new List([c.r, c.g, c.b]);
}} else return patch.variables.vars[name].value;</l></block><list><custom-block s="current patch"></custom-block><block var="name"/></list></block></block></script></block-definition>
<block-definition s="move %'count' steps" type="command" category="motion"><inputs><input type="%n">1</input></inputs><script><custom-block s="change x by %n"><block s="reportProduct"><block s="reportMonadic"><l><option>sin</option></l><block s="direction"></block></block><block var="count"/></block></custom-block><custom-block s="change y by %n"><block s="reportProduct"><block s="reportMonadic"><l><option>cos</option></l><block s="direction"></block></block><block var="count"/></block></custom-block></script></block-definition>
<block-definition s="go to x: %'x' y: %'y'" type="command" category="motion"><inputs><input type="%n">0</input><input type="%n">0</input></inputs><script><custom-block s="set x to %n"><block var="x"/></custom-block><custom-block s="set y to %n"><block var="y"/></custom-block></script></block-definition>
<block-definition s="change x by %'val'" type="command" category="motion"><inputs><input type="%n">1</input></inputs><script><custom-block s="set x to %n"><block s="reportSum"><custom-block s="x position"></custom-block><block var="val"/></block></custom-block></script></block-definition>
<block-definition s="set x to %'val'" type="command" category="motion"><inputs><input type="%n">0</input></inputs><script><block s="setXPosition"><block s="reportDifference"><block s="reportModulus"><block s="reportSum"><block s="reportProduct"><block var="val"/><l>{patches_scale}</l></block><block s="reportQuotient"><l>{stage_size}</l><l>2</l></block></block><l>{stage_size}</l></block><block s="reportQuotient"><l>{stage_size}</l><l>2</l></block></block></block></script></block-definition>
<block-definition s="change y by %'val'" type="command" category="motion"><inputs><input type="%n">1</input></inputs><script><custom-block s="set y to %n"><block s="reportSum"><custom-block s="y position"></custom-block><block var="val"/></block></custom-block></script></block-definition>
<block-definition s="set y to %'val'" type="command" category="motion"><inputs><input type="%n">0</input></inputs><script><block s="setYPosition"><block s="reportDifference"><block s="reportModulus"><block s="reportSum"><block s="reportProduct"><block var="val"/><l>{patches_scale}</l></block><block s="reportQuotient"><l>{stage_size}</l><l>2</l></block></block><l>{stage_size}</l></block><block s="reportQuotient"><l>{stage_size}</l><l>2</l></block></block></block></script></block-definition>
<block-definition s="x position" type="reporter" category="motion"><inputs></inputs><script><block s="doReport"><block s="reportQuotient"><block s="xPosition"></block><l>{patches_scale}</l></block></block></script></block-definition>
<block-definition s="y position" type="reporter" category="motion"><inputs></inputs><script><block s="doReport"><block s="reportQuotient"><block s="yPosition"></block><l>{patches_scale}</l></block></block></script></block-definition>
<block-definition s="random x position" type="reporter" category="motion"><inputs></inputs><script><block s="doReport"><block s="reportDifference"><custom-block s="pick random float %n"><l>{patches_dim}</l></custom-block><block s="reportQuotient"><l>{patches_dim}</l><l>2</l></block></block></block></script></block-definition>
<block-definition s="random y position" type="reporter" category="motion"><inputs></inputs><script><block s="doReport"><block s="reportDifference"><custom-block s="pick random float %n"><l>{patches_dim}</l></custom-block><block s="reportQuotient"><l>{patches_dim}</l><l>2</l></block></block></block></script></block-definition>
<block-definition s="dx of 1 step" type="reporter" category="motion"><inputs></inputs><script><block s="doReport"><block s="reportMonadic"><l><option>sin</option></l><block s="direction"></block></block></block></script></block-definition>
<block-definition s="dy of 1 step" type="reporter" category="motion"><inputs></inputs><script><block s="doReport"><block s="reportMonadic"><l><option>cos</option></l><block s="direction"></block></block></block></script></block-definition>
<block-definition s="angle change from %'a' to %'b'" type="reporter" category="motion"><inputs><input type="%n"></input><input type="%n"></input></inputs><script><block s="doReport"><block s="evaluate"><block s="reportJSFunction"><list><l>a</l><l>b</l></list><l>let d = (b - a) % 360;
if (d <= -180) d += 360;
else if (d > 180) d -= 360;
return d;</l></block><list><block var="a"/><block var="b"/></list></block></block></script></block-definition>
<block-definition s="turtle set %'items'" type="reporter" category="lists"><inputs><input type="%mult%obj"></input></inputs><script><block s="doReport"><block var="items"/></block></script></block-definition>
<block-definition s="is %'set' empty? (turtle set)" type="predicate" category="lists"><inputs><input type="%l"></input></inputs><script><block s="doReport"><block s="reportListIsEmpty"><block var="set"/></block></block></script></block-definition>
<block-definition s="random item %'set' (turtle set)" type="reporter" category="lists"><inputs><input type="%l"></input></inputs><script><block s="doReport"><block s="reportListItem"><l><option>any</option></l><block s="reportKeep"><block s="reifyPredicate"><autolambda><custom-block s="is %obj alive?"><l/></custom-block></autolambda><list></list></block><block var="set"/></block></block></block></script></block-definition>
<block-definition s="turtles %'set' within distance %'d'" type="reporter" category="lists"><inputs><input type="%l"></input><input type="%n">1</input></inputs><script><block s="doReport"><block s="reportKeep"><block s="reifyPredicate"><autolambda><block s="reportAnd"><custom-block s="is %obj alive?"><l/></custom-block><block s="reportNot"><block s="reportGreaterThan"><custom-block s="distance from %obj"><l/></custom-block><block var="d"/></block></block></block></autolambda><list></list></block><block var="set"/></block></block></script></block-definition>
<block-definition s="exclude myself %'objs'" type="reporter" category="lists"><inputs><input type="%l"></input></inputs><script><block s="doReport"><block s="reportKeep"><block s="reifyPredicate"><autolambda><block s="reportAnd"><custom-block s="is %obj alive?"><l/></custom-block><block s="reportNot"><block s="reportEquals"><l></l><block s="reportObject"><l><option>myself</option></l></block></block></block></block></autolambda><list></list></block><block var="objs"/></block></block></script></block-definition>
<block-definition s="nobody" type="reporter" category="lists"><inputs></inputs><script><block s="doReport"><l></l></block></script></block-definition>
<block-definition s="min %'list'" type="reporter" category="lists"><inputs><input type="%l"></input></inputs><script><block s="doWarp"><script><block s="doIf"><block s="reportListIsEmpty"><block var="list"/></block><script><block s="doReport"><l></l></block></script></block><custom-block s="script variable %upvar = %s"><l>best</l><block s="reportListItem"><l>1</l><block var="list"/></block></custom-block><block s="doForEach"><l>item</l><block s="reportCDR"><block var="list"/></block><script><block s="doIf"><block s="reportLessThan"><block var="item"/><block var="best"/></block><script><block s="doSetVar"><l>best</l><block var="item"/></block></script></block></script></block><block s="doReport"><block var="best"/></block></script></block></script></block-definition>
<block-definition s="max %'list'" type="reporter" category="lists"><inputs><input type="%l"></input></inputs><script><block s="doWarp"><script><block s="doIf"><block s="reportListIsEmpty"><block var="list"/></block><script><block s="doReport"><l></l></block></script></block><custom-block s="script variable %upvar = %s"><l>best</l><block s="reportListItem"><l>1</l><block var="list"/></block></custom-block><block s="doForEach"><l>item</l><block s="reportCDR"><block var="list"/></block><script><block s="doIf"><block s="reportGreaterThan"><block var="item"/><block var="best"/></block><script><block s="doSetVar"><l>best</l><block var="item"/></block></script></block></script></block><block s="doReport"><block var="best"/></block></script></block></script></block-definition>
<block-definition s="get one %'objs' with min %'expr'" type="reporter" category="lists"><inputs><input type="%l"></input><input type="%repRing"></input></inputs><script><block s="doWarp"><script><block s="doIf"><block s="reportListIsEmpty"><block var="objs"/></block><script><block s="doReport"><l></l></block></script></block><block s="doAddToList"><block s="reportObject"><l><option>myself</option></l></block><block var="__context"/></block><custom-block s="script variable %upvar = %s"><l>best-obj</l><block s="reportListItem"><l>1</l><block var="objs"/></block></custom-block><custom-block s="script variable %upvar = %s"><l>best</l><block s="reportAskFor"><block var="best-obj"/><block var="expr"/><list></list></block></custom-block><block s="doForEach"><l>item</l><block s="reportCDR"><block var="objs"/></block><script><custom-block s="script variable %upvar = %s"><l>val</l><block s="reportAskFor"><block var="item"/><block var="expr"/><list></list></block></custom-block><block s="doIf"><block s="reportLessThan"><block var="val"/><block var="best"/></block><script><block s="doSetVar"><l>best-obj</l><block var="item"/></block><block s="doSetVar"><l>best</l><block var="val"/></block></script></block></script></block><block s="doDeleteFromList"><l><option>last</option></l><block var="__context"/></block><block s="doReport"><block var="best-obj"/></block></script></block></script></block-definition>
<block-definition s="get one %'objs' with max %'expr'" type="reporter" category="lists"><inputs><input type="%l"></input><input type="%repRing"></input></inputs><script><block s="doWarp"><script><block s="doIf"><block s="reportListIsEmpty"><block var="objs"/></block><script><block s="doReport"><l></l></block></script></block><block s="doAddToList"><block s="reportObject"><l><option>myself</option></l></block><block var="__context"/></block><custom-block s="script variable %upvar = %s"><l>best-obj</l><block s="reportListItem"><l>1</l><block var="objs"/></block></custom-block><custom-block s="script variable %upvar = %s"><l>best</l><block s="reportAskFor"><block var="best-obj"/><block var="expr"/><list></list></block></custom-block><block s="doForEach"><l>item</l><block s="reportCDR"><block var="objs"/></block><script><custom-block s="script variable %upvar = %s"><l>val</l><block s="reportAskFor"><block var="item"/><block var="expr"/><list></list></block></custom-block><block s="doIf"><block s="reportGreaterThan"><block var="val"/><block var="best"/></block><script><block s="doSetVar"><l>best-obj</l><block var="item"/></block><block s="doSetVar"><l>best</l><block var="val"/></block></script></block></script></block><block s="doDeleteFromList"><l><option>last</option></l><block var="__context"/></block><block s="doReport"><block var="best-obj"/></block></script></block></script></block-definition>
<block-definition s="sum %'list'" type="reporter" category="lists"><inputs><input type="%l"></input></inputs><script><block s="doWarp"><script><custom-block s="script variable %upvar = %s"><l>sum</l><l>0</l></custom-block><block s="doForEach"><l>item</l><block var="list"/><script><block s="doChangeVar"><l>sum</l><block var="item"/></block></script></block><block s="doReport"><block var="sum"/></block></script></block></script></block-definition>
<block-definition s="average %'list'" type="reporter" category="lists"><inputs><input type="%l"></input></inputs><script><block s="doReport"><block s="reportQuotient"><custom-block s="sum %l"><block var="list"/></custom-block><block s="reportListLength"><block var="list"/></block></block></block></script></block-definition>
{custom_blocks}
</blocks>
</project>
</role>
</room>