nb2nl 0.2.0

A small crate for translating NetsBlox code into Netlogo source.
Documentation
<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>
&#xD;&#xD; bounceOffEdge doGlide doGotoObject changeXPosition setXPosition changeYPosition setYPosition xPosition yPosition forward doFaceTowards gotoXY &#xD;&#xD;
&#xD;&#xD; 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 &#xD;&#xD;
&#xD;&#xD; doSwitchToCostume doWearNextCostume getCostumeIdx doSayFor doThinkFor bubble doThink reportGetImageAttribute reportNewCostumeStretched reportNewCostume changeEffect setEffect clearEffects getEffect changeScale setScale getScale goToLayer goBack &#xD;&#xD;
&#xD;&#xD; 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 &#xD;&#xD;
&#xD;&#xD; playSound doPlaySoundUntilDone doPlaySoundAtRate doStopAllSounds reportGetSoundAttribute reportNewSoundFromSamples doRest doPlayNote doPlayFrequency doSetInstrument doChangeTempo doSetTempo getTempo changeVolume setVolume getVolume changePan setPan getPan playFreq stopFreq reportSounds &#xD;&#xD;
&#xD;&#xD; write reportPenTrailsAsCostume doPasteOn getPenAttribute setPenHSVA changePenHSVA &#xD;&#xD;
&#xD;&#xD; doRunRPC getJSFromRPC getJSFromRPCDropdown getJSFromRPCStruct getCostumeFromRPC reportRPCError doSocketRequest doSocketResponse doSocketMessage receiveSocketMessage getProjectId getProjectIds &#xD;&#xD;
            </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 %&apos;a&apos; = %&apos;value&apos;" 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="%&apos;a&apos; xor %&apos;b&apos;" 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 %&apos;max&apos;" 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 %&apos;val&apos;" 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 %&apos;sprite&apos; 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: %&apos;x&apos; y: %&apos;y&apos;" 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 %&apos;name&apos;" type="reporter" category="pen"><inputs><input type="%s" readonly="true"><options>black&#xD;gray&#xD;white&#xD;red&#xD;orange&#xD;brown&#xD;yellow&#xD;green&#xD;lime&#xD;turquoise&#xD;cyan&#xD;sky&#xD;blue&#xD;violet&#xD;magenta&#xD;pink</options></input></inputs><script><block s="doReport"><block s="evaluate"><block s="reportJSFunction"><list><l>name</l></list><l>switch (name) {{&#xD;case &apos;black&apos;: return new List([0, 0, 0]);&#xD;case &apos;gray&apos;: return new List([141, 141, 141]);&#xD;case &apos;white&apos;: return new List([255, 255, 255]);&#xD;case &apos;red&apos;: return new List([215, 50, 41]);&#xD;case &apos;orange&apos;: return new List([241, 106, 21]);&#xD;case &apos;brown&apos;: return new List([157, 110, 72]);&#xD;case &apos;yellow&apos;: return new List([237, 237, 49]);&#xD;case &apos;green&apos;: return new List([89, 176, 60]);&#xD;case &apos;lime&apos;: return new List([44, 209, 59]);&#xD;case &apos;turquoise&apos;: return new List([29, 159, 120]);&#xD;case &apos;cyan&apos;: return new List([84, 196, 196]);&#xD;case &apos;sky&apos;: return new List([45, 141, 190]);&#xD;case &apos;blue&apos;: return new List([52, 93, 169]);&#xD;case &apos;violet&apos;: return new List([124, 80, 164]);&#xD;case &apos;magenta&apos;: return new List([167, 27, 106]);&#xD;case &apos;pink&apos;: return new List([224, 127, 150]);&#xD;}}</l></block><list><block var="name"/></list></block></block></script></block-definition>
<block-definition s="set pen color to %&apos;color&apos;" 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;&#xD;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};&#xD;const scale = {patches_scale};&#xD;const raw = new Array(w * w * scale * scale);&#xD;const row = new Array(w * scale);&#xD;let rawp = 0;&#xD;for (let r = w - 1; r &gt;= 0; --r) {{&#xD;    let rowp = 0;&#xD;    for (let c = 0; c &lt; w; ++c) {{&#xD;        const color = patches.contents[r * w + c].color;&#xD;        const co = new List([color.r, color.g, color.b, 255]);&#xD;        for (let i = 0; i &lt; scale; ++i) row[rowp++] = co;&#xD;    }}&#xD;    for (let i = 0; i &lt; scale; ++i) {{&#xD;        for (let j = 0; j &lt; row.length; ++j) raw[rawp++] = row[j];&#xD;    }}&#xD;}}&#xD;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 %&apos;scale&apos; 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="%&apos;count&apos; 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;&#xD;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="%&apos;count&apos; new %&apos;breed-name&apos;" 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="%&apos;count&apos; new %&apos;breed-name&apos; (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 %&apos;sprites&apos; to %&apos;action&apos;" 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 %&apos;sprite&apos; for its %&apos;val&apos;" 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 =&gt; 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;&#xD;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 =&gt; s.name);&#xD;const vars = stage.variables.parentFrame.vars;&#xD;for (const v in vars) {{&#xD;    if (sprites.includes(v)) continue;&#xD;    if (v === &apos;turtles&apos; || v === &apos;ticks&apos; || v.startsWith(&apos;__&apos;)) continue;&#xD;    if (meta.gui_vars.includes(v)) continue;&#xD;    vars[v].value = 0;&#xD;}}</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 %&apos;q&apos; 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});&#xD;let i = Math.floor((y + {stage_size} / 2) / {patches_scale});&#xD;j = j &lt; 0 ? 0 : j &lt; {patches_dim} ? j : {patches_dim} - 1;&#xD;i = i &lt; 0 ? 0 : i &lt; {patches_dim} ? i : {patches_dim} - 1;&#xD;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: %&apos;x&apos; y: %&apos;y&apos;" 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};&#xD;if (x &lt; 0) x += {patches_dim};&#xD;x -= {patches_dim}/2;&#xD;y = (y + {patches_dim}/2) % {patches_dim};&#xD;if (y &lt; 0) y += {patches_dim};&#xD;y -= {patches_dim}/2;&#xD;&#xD;let bestDist = Infinity;&#xD;for (let i = -1; i &lt;= 1; ++i) {{&#xD;    for (let j = -1; j &lt;= 1; ++j) {{&#xD;        const dx = (x + i*{patches_dim}) - myX;&#xD;        const dy = (y + j*{patches_dim}) - myY;&#xD;        const d = dx*dx + dy*dy;&#xD;        if (d &lt; bestDist) bestDist = d;&#xD;    }}&#xD;}}&#xD;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 %&apos;sprite&apos;" 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: %&apos;x&apos; y: %&apos;y&apos;" 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};&#xD;if (x &lt; 0) x += {patches_dim};&#xD;x -= {patches_dim}/2;&#xD;y = (y + {patches_dim}/2) % {patches_dim};&#xD;if (y &lt; 0) y += {patches_dim};&#xD;y -= {patches_dim}/2;&#xD;&#xD;let bestDelta = undefined;&#xD;let bestDist = Infinity;&#xD;for (let i = -1; i &lt;= 1; ++i) {{&#xD;    for (let j = -1; j &lt;= 1; ++j) {{&#xD;        const dx = (x + i*{patches_dim}) - myX;&#xD;        const dy = (y + j*{patches_dim}) - myY;&#xD;        const d = dx*dx + dy*dy;&#xD;        if (d &lt; bestDist) {{&#xD;            bestDist = d;&#xD;            bestDelta = [dx, dy];&#xD;        }}&#xD;    }}&#xD;}}&#xD;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 %&apos;sprite&apos;" 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 %&apos;name&apos; to %&apos;value&apos;" 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 === &apos;color&apos;) {{&#xD;    const [r, g, b] = value.contents;&#xD;    const c = patch.color;&#xD;    c.r = r; c.g = g; c.b = b; &#xD;}}&#xD;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 %&apos;name&apos; by %&apos;value&apos;" 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 %&apos;name&apos;" 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 === &apos;color&apos;) {{&#xD;    const c = patch.color;&#xD;    return new List([c.r, c.g, c.b]);&#xD;}} 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 %&apos;count&apos; 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: %&apos;x&apos; y: %&apos;y&apos;" 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 %&apos;val&apos;" 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 %&apos;val&apos;" 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 %&apos;val&apos;" 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 %&apos;val&apos;" 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 %&apos;a&apos; to %&apos;b&apos;" 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;&#xD;if (d &lt;= -180) d += 360;&#xD;else if (d &gt; 180) d -= 360;&#xD;return d;</l></block><list><block var="a"/><block var="b"/></list></block></block></script></block-definition>

<block-definition s="turtle set %&apos;items&apos;" 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 %&apos;set&apos; 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 %&apos;set&apos; (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 %&apos;set&apos; within distance %&apos;d&apos;" 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 %&apos;objs&apos;" 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 %&apos;list&apos;" 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 %&apos;list&apos;" 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 %&apos;objs&apos; with min %&apos;expr&apos;" 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 %&apos;objs&apos; with max %&apos;expr&apos;" 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 %&apos;list&apos;" 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 %&apos;list&apos;" 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>