diff --git a/base64/delete.png.64 b/base64/delete.png.64
new file mode 100644
index 0000000..58e3684
--- /dev/null
+++ b/base64/delete.png.64
@@ -0,0 +1 @@
+iVBORw0KGgoAAAANSUhEUgAAABUAAAAgCAYAAAD9oDOIAAAACXBIWXMAAADGAAAAxgGwdJvFAAAAGXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAAA0BJREFUSIntlV9oW1Ucxz/n3DviTYO9NrFlTToQ2j5YyqIIa1YK4theSsEw5gJ9EP9QweoQFCllreCGdb5UfEspWEFwIAPtQx+a0ILifKjo8uBmpY6aVEi70lwTcps/N/f4sC5aUBJkj/2+HDi/3/nw/Z0fv3MEgILLwBWrre2VL65e/U7TtLvA++VyeebNS5ds4HugDQgLKNBA+sH6ITDiKxQ+8dn2I7bPlxVCBD0ezxPAL8DTwLPNAAEkgAAHeFGAd+D6dU0IEdzc3MSfyVx0pZz+9fTpn+fi8aFmgAB6PB4/AbwcV+qlcCIhTt24wWe2zcfr69z1+9kLBsU3o6P9SqnfmoVKKeXjwHuFQuHElWKRtWPHGL99m49qNR67d49Pz5zB1XWUUs/Nzc29oJQSDaGapqWVUramaSRWVhitVmkF3gAmlOLdhQWWlpaQUj6qlLoohFANodVq9XMhhLelpYWBgQEcoHYQNAHDMIhEIriumwdea6Z83XGcVzVN+1oI8VRnRwcfABngW2ASKEYimKaJlPKHsbGx3Wagcnx8PGPb9iCgnl9f5xTwumHwthD8DryTSkGpRK1We7KZ+wSoJ305OVmLXrsmfzp7lh+jUSzLorK8zOWVFW6dO8fa+fNF4A+lVEkI4bquW5FS2kAe+FMptV8vH0CBJ7ewgHX8OLdGRgBobW2FCxe4U61ycnmZdH9/S7anpxdAKYUQAqX+7pnrukgpFSDEAXTWlfKtryYmyAaDpNNpVldXsSyLno4O4jdvUq7VOAkUhcAwDHRdx+/3EwgECAaDDA0N4fP5Dpcfj8czQAggm82SzWbZ3d0ln8+zv7+P4ziUy+U60DAMTNMkEAgQCoUwTfOB2/rsA2xvbW2FUqkUfX199Pb2Eg6HGzbFcRw2NjZIJBJ0dnYyODh4f/YfqFwus7i4SDKZxOv1AjA7O8v09DTJZBKAvb09pqammJmZud8UXWd+fp5kMkmpVAI4DP035XI5tre3yeVydWc7OztYlvWfZxpC/4+OoEfQI+gR9KHpn480gUCAWCxGe3t7fW94eBjbtunq6gLA5/MRi8XweDz1nGg0SqVSobu7Gzj8nawBzzwMp38BxWJHOyltKE0AAAAASUVORK5CYII=
\ No newline at end of file
diff --git a/base64/pause.png.64 b/base64/pause.png.64
new file mode 100644
index 0000000..4b516c6
--- /dev/null
+++ b/base64/pause.png.64
@@ -0,0 +1 @@
+iVBORw0KGgoAAAANSUhEUgAAABIAAAAbCAYAAABxwd+fAAAACXBIWXMAAADGAAAAxgGwdJvFAAAAGXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAAALxJREFUOI3t1TGKwzAQQNE/JoXQGQTGpbFP5HJhXfsoKo0XUupCSWpj0BmMKk8KJ2QXglnYcvXLQfNQNzKO40VEWl5tIvLZ9/2ZN03T9KGqX0DxnKnq9SQi7bquLMuCMYaqqgqgeYc8aoBinmdSSpRlibW2LQBijHjvCSEc7P8shID3nhgjfP/eX8tQhjKUoQz9Q+gE4JxjGAaMMb9e7LqOlBLOuR1S1au1tq3r+vlmA24Hxg3YHocU2C/tHUseO6D31KjVAAAAAElFTkSuQmCC
\ No newline at end of file
diff --git a/base64/play.png.64 b/base64/play.png.64
new file mode 100644
index 0000000..5adac51
--- /dev/null
+++ b/base64/play.png.64
@@ -0,0 +1 @@
+iVBORw0KGgoAAAANSUhEUgAAABkAAAAgCAYAAADnnNMGAAAACXBIWXMAAACbAAAAmwEPcaP1AAAAGXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAAAj9JREFUSIm11rtrFVkcB/DPmdwbbx7GRK+IQbbQVQwIK0RIYSciguBa6RaKCxa+UCu1EDvZXaxstBAr8Q/QwifIrgirLrusq2ChyD6qKCJ41U2MuXMsJiM+gibm5FtNcc7vM2f48ZsDD3ASVdOYiCi4jgXTh8yrRi2hKXiKddODrOyMdtSj2ZUmchxDLRWQvX2aV2V7PbO8PWCf4HcsS4tAa+DbWWzsYUbWJ/gDBz9aNyWkTF+NnfXMV61V/IQr6E2LQFcLW+cEa7vIrBLcxfq0CAQMdLCtHvRUunEWx9GWDinTWy0+30BHwC7BbfSnRaASWNvFph5q2deCmziElnRImaU1ds/NLKlVcERwA4vTItCR8V0PG7qphH7BHexLi5T5po1dczMLWlsVU+IS5qdFoLuF7+dkVs8ks2bsVO+1+tSRssrKzrLVZ+McTqMzHVKmt8qOemZFO2wR/IWBtAhUA+tm0d9OtBAXKsmRR6+52Ij+HQmCh6Ld6ZDhnF9e8NvLiGEcFf2IV1NHIu4McbmRG8oDzuAABsslU0P+GeHis9zj0Wxsnu3Brx8u+zKk0eTq8+IEwRMcFp1S/Lo/yuSQ0citl1x7kRuNOU6IDqPxqW0TR+4Pc6GRe9bM8DP24t5Etn4eGRxryf9GguBvxSA8P+GX+yQylHNt/JacDDA+kuPP/7n6vGkozxQtuR+PJlt8fGT8lrzxpcXfTbSsLeqrFXfizCA2K64RyVJeuEfwg7HxnDbBA8VVZ1H64kXeAM9RoeriawdYAAAAAElFTkSuQmCC
\ No newline at end of file
diff --git a/base64/reset.png.64 b/base64/reset.png.64
new file mode 100644
index 0000000..958ab8a
--- /dev/null
+++ b/base64/reset.png.64
@@ -0,0 +1 @@
+iVBORw0KGgoAAAANSUhEUgAAAB4AAAAgCAYAAAAFQMh/AAAACXBIWXMAAACIAAAAiAHr3JJSAAAAGXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAAAltJREFUSImt18tvTVEUx/HP1WiiRNVE1YCItJWiBiIxMRADA21MxCPxiAQTI/+AgUc8ykRUhH9AJQy8JiVmJhJpQkSISBRtJQZarRZlsM9N9729r3N7f8ka3HPWWt+799l7rb1Jpzrsw0MMYQrv0IO1KXNVrM14jX9FbApnUV9L6JEkcTFobE+xqBbQkxUCY+vH/FJJ68pAD6IXmejZXzzBLdzBABrRHPmsxlI8KjusAurEuNyR3Ed7Ad8MDmEsz78rLXQJ3kcJJnGsgritGI3ivmBxGvC9KHgc21PE7pU76guVBu6KgqawMwU0q74oxwRaygU04GMUdKAKqAQ0EeW5VC7gXOR8o0poVtejXD/QFL+Mt9MqXMNvvBK+1Z+UsGWJNeETtiXQX8IMjCTvUi24StSJb8oXmBO1BhOaxdcS0MvFAjvQOkd4u7CH86EPFKmWzcKqHkr+wFzUhs8R9AUWFnJcgOeR4zDWzRHeisHEVhRymIe7Zk/NMNbXAF509q4UgGZtBBvmCC+ooyWgWfuOTbWEZrDSzErrFho/MyVzMPn9U5j6NGrAM6wROtwWYfHOUpNQabIj7U0JytfNKNeZcs49kfMEllcJPRzl+SDsmpJqEWprNuh2FdBuoeZnc1TcWi/KXVx7UkB3yG2JfSliNcoteaPCsaaUMkLxj0f6VhWdqEvuqMeE75Yp4Nsh3C7y/auufFfN3tMDwoHhOE4JB/i/eT7T2F8tlHAo7y8AL2XTatRvG/C4QuikcAmomepxWun700tsrCU0VhvO441QvweFM/huocNVrP+6PgXaCh5PhAAAAABJRU5ErkJggg==
\ No newline at end of file
diff --git a/base64/rotation_clockwise.png.64 b/base64/rotation_clockwise.png.64
new file mode 100644
index 0000000..feb796d
--- /dev/null
+++ b/base64/rotation_clockwise.png.64
@@ -0,0 +1 @@
+iVBORw0KGgoAAAANSUhEUgAAACAAAAAYCAYAAACbU/80AAAACXBIWXMAAADbAAAA2wHwUOacAAAAGXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAAAXRJREFUSInF1r9OFFEUgPHfriawu1ESCdgZGkIhWkJhYYQHoLDRxNLwACQklDwAFQ3lJhI6okJB3AcwsbIhtFpBhf8SIya6QHF3ks3A7t47MnKSU8095/vmzp0zw9XHMm7FLq6WIPAIb2MlyhCAObyJkShLAOaxg5HrEoAneI3bvRZUCjSt4SEmMYV7wlYPda5NYyxX8w5P8asAD4ziJbbxHWcFcg/1VPA4VvGlIDSfLTRi4S9wfEXgJIkhvCoB3J27wnm5EDXh/S0TnuXOZRIb/wme5VY3/BlO/6HZET7jR8TaNjYxkcEb+JQI/IYmFnC360bWB9R9wOP81i8lgP92IOP5JgMEDrGIG/mCCvYj4T+FidYv8gInWMOdXgWzkfA2ng+A5wV2cX9QwUqkQDMCngkcCGcjKjYj4CfCRycmZjAcC4f3EQLbKQ1ToqrrXewTrbIEiBscD65T4I/EZ5oSN/FRGCr1DrAi/OFkA+MrfpclcA5HFShV5l7kTwAAAABJRU5ErkJggg==
\ No newline at end of file
diff --git a/base64/rotation_counterclockwise.png.64 b/base64/rotation_counterclockwise.png.64
new file mode 100644
index 0000000..a7e2468
--- /dev/null
+++ b/base64/rotation_counterclockwise.png.64
@@ -0,0 +1 @@
+iVBORw0KGgoAAAANSUhEUgAAACAAAAAYCAYAAACbU/80AAAACXBIWXMAAADbAAAA2wHwUOacAAAAGXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAAAXRJREFUSInF1r1LHFEUxuEnLgRdVoJpFKuktg02KdJaCEkhWKRTsLXSvyGFlaZWRNJEAhqCWlslnUhsNCSk0CKLSAh+gR8pZhfGDZs5szrrCweGO+fe98c9nMshrm5M5cgPqSOYV8Z7PL9rgKj5Gq6x0m7zCjZq5m0HqGA9ZV4IwIMm62V8wFDDehVfcYpz/MFP7GIP27V/t1K65nnjCMsYw+NWzDvxqUXzxjjEG/Tfh3k6qhjPMu/CxwLM0zGPh83MVws2r8dy7aZv6F2bzOsx1wjwBEu4DGz+jR84uAXAFUYaIeAFPmdsnk3l9+EVFiTtlwfim6Td/1EJE9gPAKTVi7fBW6zHZJOzkDwiM5JXLQJQ1yiOgwBbGWeBATfbMwsAXkvqHIF4FoGAl9gJAsBiEGA6CkDSv4PB3Kc4CwAs5gHIq5UAwGapQIBHGM7IKUVnwlb0JZBTKdBfGRf+X4KjZhPRXek7emrfl5IJ6loyiZ3g119x6S+ogBYJVgAAAABJRU5ErkJggg==
\ No newline at end of file
diff --git a/convertAll.sh b/convertAll.sh
new file mode 100644
index 0000000..99faa89
--- /dev/null
+++ b/convertAll.sh
@@ -0,0 +1 @@
+find *.png -type f -exec ./convertto64.sh {} +
\ No newline at end of file
diff --git a/convertto64.sh b/convertto64.sh
new file mode 100644
index 0000000..fd232f5
--- /dev/null
+++ b/convertto64.sh
@@ -0,0 +1,5 @@
+rm *.64
+for i in "$@"; do
+ echo "Converting $i to base 64."
+ base64 $i > $i.64
+done
\ No newline at end of file
diff --git a/delete.png b/delete.png
new file mode 100644
index 0000000..81d4ce9
Binary files /dev/null and b/delete.png differ
diff --git a/delete_cursor.png b/delete_cursor.png
new file mode 100644
index 0000000..c41a135
Binary files /dev/null and b/delete_cursor.png differ
diff --git a/dot.svg b/dot.svg
index 2038606..2e890f8 100644
--- a/dot.svg
+++ b/dot.svg
@@ -26,11 +26,11 @@
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
- inkscape:zoom="1.4"
- inkscape:cx="566.11657"
- inkscape:cy="502.60366"
+ inkscape:zoom="0.49497475"
+ inkscape:cx="343.44105"
+ inkscape:cy="757.79528"
inkscape:document-units="mm"
- inkscape:current-layer="layer2"
+ inkscape:current-layer="layer8"
inkscape:document-rotation="0"
showgrid="false"
inkscape:window-width="1274"
@@ -54,7 +54,7 @@
inkscape:groupmode="layer"
id="layer2"
inkscape:label="Writer"
- style="display:inline">
+ style="display:none">
+ style="fill:#206476;fill-opacity:1;stroke:#999999;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
@@ -93,7 +93,7 @@
inkscape:label="Dot"
inkscape:groupmode="layer"
id="layer1"
- style="display:inline">
+ style="display:none">
+
+
+
+
+
+
+
+
+
+
+
+
+
+ X
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
0) {
+ BOT_TAPE=BOT_QUEUE[0]
+ } else {
+ BOT_TAPE="BR"
+ }
+ BOT_STATE=ALIVE
+ gameState=WAITING
+ BOT_X=gameStage.start.x
+ BOT_Y=gameStage.start.y
+ BOT_DIR=RIGHT
+ gameState=RUNNING
+ for (var i=0;i{
+ if (tape.length===0) {
+ return false;
+ }
for (var i=0;i0) {
- BUTTON_SELECTED=button;
- SUBMENU.visible=true;
- SUBMENU.buttons=[]
- var index = 0;
- for (var button2 of BUTTON_SELECTED.submenu_buttons) {
- var buttonX = ((index%3)*48)+16
- var buttonY = canvas.height*0.8-(Math.floor(index/3)*48)-40
- SUBMENU.buttons.push({def:button2,img:button2.img,x:buttonX,y:buttonY,w:32,h:32})
- index++;
+ if (button.cb!==undefined) {
+ button.cb()
+ return;
+ } else {
+ DELETEMODE=false
+ document.body.style.cursor="url('cursor.png') 8 8,auto"
+ if (button.submenu_buttons&&button.submenu_buttons.length>0) {
+ BUTTON_SELECTED=button;
+ SUBMENU.visible=true;
+ SUBMENU.buttons=[]
+ var index = 0;
+ for (var button2 of BUTTON_SELECTED.submenu_buttons) {
+ var buttonX = ((index%3)*48)+16
+ var buttonY = canvas.height*0.8-(Math.floor(index/3)*48)-40
+ SUBMENU.buttons.push({def:button2,img:button2.img,x:buttonX,y:buttonY,w:32,h:32})
+ index++;
+ }
}
+ ITEM_SELECTED=button.lastselected
+ //console.log(button)
+ return
}
- ITEM_SELECTED=button.lastselected
- //console.log(button)
- return
}
}
}
//console.log(getGridCoords(getMousePos(e)))
- if (ITEM_SELECTED!==undefined) {
+ if (ITEM_SELECTED!==undefined||DELETEMODE) {
var clickCoords = getGridCoords(getMousePos(e))
if (clickCoords.x>=0&&clickCoords.y>=0&&clickCoords.ywidth-24) {
+ xOffset=0;
+ yOffset+=24;
+ }
+ }
+}
+
+function createVerticalGradient(x,y,up,ctx) {
+ var gradient = ctx.createLinearGradient(x, y+32*((up)?1:0), x, y+32*((up)?0:1));
+ gradient.addColorStop(0,"rgb(124,162,157)")
+ gradient.addColorStop(0.31,"black")
+ gradient.addColorStop(0.6,"rgb(124,162,157)")
+ gradient.addColorStop(0.61,"black")
+ gradient.addColorStop(0.9,"rgb(124,162,157)")
+ gradient.addColorStop(0.91,"white")
+ gradient.addColorStop(1,"white")
+ return gradient
+}
+
+function createHorizontalGradient(x,y,right,ctx) {
+ var gradient = ctx.createLinearGradient(x+32*((right)?0:1), y, x+32*((right)?1:0), y);
+ gradient.addColorStop(0,"rgb(124,162,157)")
+ gradient.addColorStop(0.31,"black")
+ gradient.addColorStop(0.6,"rgb(124,162,157)")
+ gradient.addColorStop(0.61,"black")
+ gradient.addColorStop(0.9,"rgb(124,162,157)")
+ gradient.addColorStop(0.91,"white")
+ gradient.addColorStop(1,"white")
+ return gradient
+}
+
+function DrawSingleConveyor(x,y,dir,ctx) {
+ ctx.lineWidth = 16;
+ ctx.lineCap = "square"
+ ctx.strokeStyle="rgb(124,162,157)"
+ ctx.setLineDash([])
+ if (dir===LEFT||dir===RIGHT) {
+ ctx.beginPath()
+ ctx.moveTo(x+8,y+16)
+ ctx.lineTo(x+24,y+16)
+ ctx.stroke()
+ ctx.setLineDash([5,5])
+ ctx.lineDashOffset = -dashOffset*((dir===LEFT)?-1:1);
+ ctx.strokeStyle=createHorizontalGradient(x,y,dir===RIGHT,ctx)
+ ctx.lineWidth = 3.5;
+ ctx.beginPath()
+ ctx.moveTo(x+2,y+16)
+ ctx.lineTo(x+30,y+16)
+ ctx.stroke()
+ } else {
+ ctx.beginPath()
+ ctx.moveTo(x+16,y+8)
+ ctx.lineTo(x+16,y+24)
+ ctx.stroke()
+ ctx.strokeStyle="rgb(34,62,57)"
+ ctx.setLineDash([5,5])
+ ctx.lineDashOffset = -dashOffset*((dir===DOWN)?1:-1);
+ ctx.strokeStyle=createVerticalGradient(x,y,dir===UP,ctx)
+ ctx.lineWidth = 3.5;
+ ctx.beginPath()
+ ctx.moveTo(x+16,y+2)
+ ctx.lineTo(x+16,y+30)
+ ctx.stroke()
+ }
+}
+
+function GetOppositeDirection(dir) {
+ switch (dir) {
+ case UP:{return DOWN}
+ case DOWN:{return UP}
+ case LEFT:{return RIGHT}
+ case RIGHT:{return LEFT}
+ }
+}
+
+function DrawConnectedConveyor(x,y,ctx,connections,dir,pass=0) {
+ ctx.lineWidth = 15;
+ ctx.lineCap = "round"
+ ctx.strokeStyle="rgb(124,162,157)"
+ switch (Object.keys(connections).length) {
+ case 0:{
+ DrawSingleConveyor(x,y,dir,ctx)
+ }break;
+ default:{
+ ctx.lineWidth = 15;
+ ctx.lineCap = "square"
+ ctx.strokeStyle="rgb(124,162,157)"
+ ctx.setLineDash([])
+ ctx.beginPath()
+ ctx.moveTo(x+16,y+16)
+ var endingPoint={x:0,y:0}
+ switch (dir) {
+ case UP:{startingPoint={x:0,y:-12};endingPoint={x:0,y:-14}}break;
+ case DOWN:{startingPoint={x:0,y:12};endingPoint={x:0,y:14}}break;
+ case RIGHT:{startingPoint={x:12,y:0};endingPoint={x:14,y:0}}break;
+ case LEFT:{startingPoint={x:-12,y:0};endingPoint={x:-14,y:0}}break;
+ }
+ ctx.moveTo(x+16+startingPoint.x,y+16+startingPoint.y)
+ ctx.lineTo(x+16+endingPoint.x,y+16+endingPoint.y)
+ if (pass===0) {ctx.stroke();}
+ for (var connection of Object.keys(connections)) {
+ var startingPoint={x:x,y:y}
+ switch (Number(connection)) {
+ case UP:{startingPoint={x:x+16,y:y+8}}break;
+ case DOWN:{startingPoint={x:x+16,y:y+24}}break;
+ case RIGHT:{startingPoint={x:x+24,y:y+16}}break;
+ case LEFT:{startingPoint={x:x+8,y:y+16}}break;
+ }
+ ctx.lineWidth = 16;
+ ctx.lineCap = "square"
+ ctx.strokeStyle="rgb(124,162,157)"
+ ctx.setLineDash([])
+ ctx.beginPath()
+ ctx.moveTo(startingPoint.x,startingPoint.y)
+ ctx.lineTo(x+16,y+16)
+ if (pass===0) {ctx.stroke()}
+ ctx.setLineDash([5,5])
+ ctx.lineDashOffset = -dashOffset*1;
+ if (Number(connection)===RIGHT||Number(connection)===LEFT) {
+ ctx.strokeStyle=createHorizontalGradient(x,y,Number(connection)===LEFT,ctx)
+ } else {
+ ctx.strokeStyle=createVerticalGradient(x,y,Number(connection)===UP,ctx)
+ }
+ ctx.lineWidth = 3.5;
+ ctx.beginPath()
+ startingPoint={x:x,y:y}
+ switch (Number(connection)) {
+ case UP:{startingPoint={x:x+16,y:y+2}}break;
+ case DOWN:{startingPoint={x:x+16,y:y+30}}break;
+ case RIGHT:{startingPoint={x:x+30,y:y+16}}break;
+ case LEFT:{startingPoint={x:x+2,y:y+16}}break;
+ }
+ ctx.moveTo(startingPoint.x,startingPoint.y)
+ ctx.lineTo(x+16,y+16)
+ if (pass===1) {ctx.stroke()}
+ }
+
+ if (dir===RIGHT||dir===LEFT) {
+ ctx.strokeStyle=createHorizontalGradient(x,y,dir===LEFT,ctx)
+ } else {
+ ctx.strokeStyle=createVerticalGradient(x,y,dir===UP,ctx)
+ }
+ ctx.setLineDash([5,5])
+ ctx.lineWidth = 3.5;
+ ctx.beginPath()
+ switch (dir) {
+ case UP:{startingPoint={x:0,y:-14}}break;
+ case DOWN:{startingPoint={x:0,y:14}}break;
+ case RIGHT:{startingPoint={x:14,y:0}}break;
+ case LEFT:{startingPoint={x:-14,y:0}}break;
+ }
+ ctx.moveTo(x+16,y+16)
+ ctx.lineTo(x+16+startingPoint.x,y+16+startingPoint.y)
+ if (pass===1) {ctx.stroke();}
+ }break;
+ }
+}
+
+function RenderConveyor(x,y,ctx,icon_definition,dir=0,background=undefined,grid=undefined) {
+ if (grid===undefined) {
+ DrawSingleConveyor(x,y,dir,ctx)
+ } else {
+ var connections = {}
+ if (grid.x>0) {if (gameGrid[grid.y][grid.x-1].direction===RIGHT){connections[LEFT]=true}}
+ if (grid.x0) {if (gameGrid[grid.y-1][grid.x].direction===DOWN){connections[UP]=true}}
+ if (grid.y=buttonX&&LAST_MOUSE_X<=buttonX+32&&LAST_MOUSE_Y>=buttonY&&LAST_MOUSE_Y<=buttonY+32)?"#555555":"#b5b5b5")
+ RenderIcon(buttonX,buttonY,ctx,button,ITEM_DIRECTION,(LAST_MOUSE_X>=buttonX&&LAST_MOUSE_X<=buttonX+32&&LAST_MOUSE_Y>=buttonY&&LAST_MOUSE_Y<=buttonY+32)?"#555555":"#b5b5b5")
index++;
}
}
@@ -655,9 +1030,9 @@ function RenderMenu(ctx) {
var buttonY = canvas.height*0.8+16
for (var button of MENU.buttons) {
if (button.lastselected) {
- RenderIcon(buttonX,buttonY,ctx,button.lastselected,0,"#b5b5b5")
+ RenderIcon(buttonX,buttonY,ctx,button.lastselected,(button.cb===undefined)?ITEM_DIRECTION:0,"#b5b5b5")
} else {
- AddButton(button.img,buttonX,buttonY,ctx,button,0)
+ AddButton(button.img,buttonX,buttonY,ctx,button,(button.cb===undefined)?ITEM_DIRECTION:0)
}
button.x=buttonX
button.y=buttonY
@@ -668,10 +1043,14 @@ function RenderMenu(ctx) {
}
}
-function AddButton(img,x,y,ctx,button,rot=0) {
+function AddButton(img,x,y,ctx,button,dir=0) {
ctx.fillStyle="#b5b5b5"
ctx.fillRect(x,y,32,32)
- drawImage(x+16,y+16,img,ctx,rot)
+ if (img===IMAGE_WRITER) {
+ drawImage(x+16,y+16,img,ctx,dir*90-90)
+ } else {
+ drawImage(x+16,y+16,img,ctx,dir*90)
+ }
}
function ConsumeTape() {
diff --git a/game.test.js b/game.test.js
index f85e408..6eb08b4 100644
--- a/game.test.js
+++ b/game.test.js
@@ -442,9 +442,9 @@ function runTests() {
.it("Run a TESTING state to see if an acceptable player-built level has no bots in queue.",()=>{
loadStage(STAGE2)
gameGrid=[
- [{},{},{},{},{},],
- [{},{...BELTDOWN},{},{},{},],
- [{},{...BRANCHRIGHT},{...BELTRIGHT},{...BELTRIGHT},{type:"EXIT"},],
+ [{},{...BELTRIGHT},{...BELTRIGHT},{...BELTDOWN},{},],
+ [{...BELTRIGHT},{...BRANCHUP},{},{...BELTDOWN},{},],
+ [{},{...BRANCHRIGHT},{},{...BELTRIGHT},{type:"EXIT"},],
[{},{},{},{},{},],
[{},{},{},{},{},],
]
@@ -469,13 +469,15 @@ function runTests() {
console.log("ALL TESTS: "+totalTestsPassed+" passed, "+(totalTests-totalTestsPassed)+" failed, "+totalTests+" total")
if (testsPass===undefined) {
testsPass=true
- }
+ }
+ resetGame();
}
function runGame() {
+ resetGame();
setupGame();
- loadLevel(LEVEL2,0,2)
+ //loadLevel(LEVEL2,0,2)
setInterval(()=>{
step()
draw()
diff --git a/image_data.js b/image_data.js
index 923efc4..ec9a2f1 100644
--- a/image_data.js
+++ b/image_data.js
@@ -41,4 +41,16 @@ IMAGE_DOT_P.src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8
const IMAGE_DOT_R = new Image();
IMAGE_DOT_R.src="data:image/png;base64,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"
const IMAGE_DOT_Y = new Image();
-IMAGE_DOT_Y.src="data:image/png;base64,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"
\ No newline at end of file
+IMAGE_DOT_Y.src="data:image/png;base64,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"
+const IMAGE_ROTATE_CLOCKWISE = new Image();
+IMAGE_ROTATE_CLOCKWISE.src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAYCAYAAACbU/80AAAACXBIWXMAAADbAAAA2wHwUOacAAAAGXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAAAXRJREFUSInF1r9OFFEUgPHfriawu1ESCdgZGkIhWkJhYYQHoLDRxNLwACQklDwAFQ3lJhI6okJB3AcwsbIhtFpBhf8SIya6QHF3ks3A7t47MnKSU8095/vmzp0zw9XHMm7FLq6WIPAIb2MlyhCAObyJkShLAOaxg5HrEoAneI3bvRZUCjSt4SEmMYV7wlYPda5NYyxX8w5P8asAD4ziJbbxHWcFcg/1VPA4VvGlIDSfLTRi4S9wfEXgJIkhvCoB3J27wnm5EDXh/S0TnuXOZRIb/wme5VY3/BlO/6HZET7jR8TaNjYxkcEb+JQI/IYmFnC360bWB9R9wOP81i8lgP92IOP5JgMEDrGIG/mCCvYj4T+FidYv8gInWMOdXgWzkfA2ng+A5wV2cX9QwUqkQDMCngkcCGcjKjYj4CfCRycmZjAcC4f3EQLbKQ1ToqrrXewTrbIEiBscD65T4I/EZ5oSN/FRGCr1DrAi/OFkA+MrfpclcA5HFShV5l7kTwAAAABJRU5ErkJggg=="
+const IMAGE_ROTATE_COUNTERCLOCKWISE = new Image();
+IMAGE_ROTATE_COUNTERCLOCKWISE.src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAYCAYAAACbU/80AAAACXBIWXMAAADbAAAA2wHwUOacAAAAGXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAAAXRJREFUSInF1r1LHFEUxuEnLgRdVoJpFKuktg02KdJaCEkhWKRTsLXSvyGFlaZWRNJEAhqCWlslnUhsNCSk0CKLSAh+gR8pZhfGDZs5szrrCweGO+fe98c9nMshrm5M5cgPqSOYV8Z7PL9rgKj5Gq6x0m7zCjZq5m0HqGA9ZV4IwIMm62V8wFDDehVfcYpz/MFP7GIP27V/t1K65nnjCMsYw+NWzDvxqUXzxjjEG/Tfh3k6qhjPMu/CxwLM0zGPh83MVws2r8dy7aZv6F2bzOsx1wjwBEu4DGz+jR84uAXAFUYaIeAFPmdsnk3l9+EVFiTtlwfim6Td/1EJE9gPAKTVi7fBW6zHZJOzkDwiM5JXLQJQ1yiOgwBbGWeBATfbMwsAXkvqHIF4FoGAl9gJAsBiEGA6CkDSv4PB3Kc4CwAs5gHIq5UAwGapQIBHGM7IKUVnwlb0JZBTKdBfGRf+X4KjZhPRXek7emrfl5IJ6loyiZ3g119x6S+ogBYJVgAAAABJRU5ErkJggg=="
+const IMAGE_DELETE = new Image();
+IMAGE_DELETE.src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABUAAAAgCAYAAAD9oDOIAAAACXBIWXMAAADGAAAAxgGwdJvFAAAAGXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAAA0BJREFUSIntlV9oW1Ucxz/n3DviTYO9NrFlTToQ2j5YyqIIa1YK4theSsEw5gJ9EP9QweoQFCllreCGdb5UfEspWEFwIAPtQx+a0ILifKjo8uBmpY6aVEi70lwTcps/N/f4sC5aUBJkj/2+HDi/3/nw/Z0fv3MEgILLwBWrre2VL65e/U7TtLvA++VyeebNS5ds4HugDQgLKNBA+sH6ITDiKxQ+8dn2I7bPlxVCBD0ezxPAL8DTwLPNAAEkgAAHeFGAd+D6dU0IEdzc3MSfyVx0pZz+9fTpn+fi8aFmgAB6PB4/AbwcV+qlcCIhTt24wWe2zcfr69z1+9kLBsU3o6P9SqnfmoVKKeXjwHuFQuHElWKRtWPHGL99m49qNR67d49Pz5zB1XWUUs/Nzc29oJQSDaGapqWVUramaSRWVhitVmkF3gAmlOLdhQWWlpaQUj6qlLoohFANodVq9XMhhLelpYWBgQEcoHYQNAHDMIhEIriumwdea6Z83XGcVzVN+1oI8VRnRwcfABngW2ASKEYimKaJlPKHsbGx3Wagcnx8PGPb9iCgnl9f5xTwumHwthD8DryTSkGpRK1We7KZ+wSoJ305OVmLXrsmfzp7lh+jUSzLorK8zOWVFW6dO8fa+fNF4A+lVEkI4bquW5FS2kAe+FMptV8vH0CBJ7ewgHX8OLdGRgBobW2FCxe4U61ycnmZdH9/S7anpxdAKYUQAqX+7pnrukgpFSDEAXTWlfKtryYmyAaDpNNpVldXsSyLno4O4jdvUq7VOAkUhcAwDHRdx+/3EwgECAaDDA0N4fP5Dpcfj8czQAggm82SzWbZ3d0ln8+zv7+P4ziUy+U60DAMTNMkEAgQCoUwTfOB2/rsA2xvbW2FUqkUfX199Pb2Eg6HGzbFcRw2NjZIJBJ0dnYyODh4f/YfqFwus7i4SDKZxOv1AjA7O8v09DTJZBKAvb09pqammJmZud8UXWd+fp5kMkmpVAI4DP035XI5tre3yeVydWc7OztYlvWfZxpC/4+OoEfQI+gR9KHpn480gUCAWCxGe3t7fW94eBjbtunq6gLA5/MRi8XweDz1nGg0SqVSobu7Gzj8nawBzzwMp38BxWJHOyltKE0AAAAASUVORK5CYII="
+const IMAGE_RESET = new Image();
+IMAGE_RESET.src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAgCAYAAAAFQMh/AAAACXBIWXMAAACIAAAAiAHr3JJSAAAAGXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAAAltJREFUSImt18tvTVEUx/HP1WiiRNVE1YCItJWiBiIxMRADA21MxCPxiAQTI/+AgUc8ykRUhH9AJQy8JiVmJhJpQkSISBRtJQZarRZlsM9N9729r3N7f8ka3HPWWt+799l7rb1Jpzrsw0MMYQrv0IO1KXNVrM14jX9FbApnUV9L6JEkcTFobE+xqBbQkxUCY+vH/FJJ68pAD6IXmejZXzzBLdzBABrRHPmsxlI8KjusAurEuNyR3Ed7Ad8MDmEsz78rLXQJ3kcJJnGsgritGI3ivmBxGvC9KHgc21PE7pU76guVBu6KgqawMwU0q74oxwRaygU04GMUdKAKqAQ0EeW5VC7gXOR8o0poVtejXD/QFL+Mt9MqXMNvvBK+1Z+UsGWJNeETtiXQX8IMjCTvUi24StSJb8oXmBO1BhOaxdcS0MvFAjvQOkd4u7CH86EPFKmWzcKqHkr+wFzUhs8R9AUWFnJcgOeR4zDWzRHeisHEVhRymIe7Zk/NMNbXAF509q4UgGZtBBvmCC+ooyWgWfuOTbWEZrDSzErrFho/MyVzMPn9U5j6NGrAM6wROtwWYfHOUpNQabIj7U0JytfNKNeZcs49kfMEllcJPRzl+SDsmpJqEWprNuh2FdBuoeZnc1TcWi/KXVx7UkB3yG2JfSliNcoteaPCsaaUMkLxj0f6VhWdqEvuqMeE75Yp4Nsh3C7y/auufFfN3tMDwoHhOE4JB/i/eT7T2F8tlHAo7y8AL2XTatRvG/C4QuikcAmomepxWun700tsrCU0VhvO441QvweFM/huocNVrP+6PgXaCh5PhAAAAABJRU5ErkJggg=="
+const IMAGE_PLAY = new Image();
+IMAGE_PLAY.src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAAAgCAYAAADnnNMGAAAACXBIWXMAAACbAAAAmwEPcaP1AAAAGXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAAAj9JREFUSIm11rtrFVkcB/DPmdwbbx7GRK+IQbbQVQwIK0RIYSciguBa6RaKCxa+UCu1EDvZXaxstBAr8Q/QwifIrgirLrusq2ChyD6qKCJ41U2MuXMsJiM+gibm5FtNcc7vM2f48ZsDD3ASVdOYiCi4jgXTh8yrRi2hKXiKddODrOyMdtSj2ZUmchxDLRWQvX2aV2V7PbO8PWCf4HcsS4tAa+DbWWzsYUbWJ/gDBz9aNyWkTF+NnfXMV61V/IQr6E2LQFcLW+cEa7vIrBLcxfq0CAQMdLCtHvRUunEWx9GWDinTWy0+30BHwC7BbfSnRaASWNvFph5q2deCmziElnRImaU1ds/NLKlVcERwA4vTItCR8V0PG7qphH7BHexLi5T5po1dczMLWlsVU+IS5qdFoLuF7+dkVs8ks2bsVO+1+tSRssrKzrLVZ+McTqMzHVKmt8qOemZFO2wR/IWBtAhUA+tm0d9OtBAXKsmRR6+52Ij+HQmCh6Ld6ZDhnF9e8NvLiGEcFf2IV1NHIu4McbmRG8oDzuAABsslU0P+GeHis9zj0Wxsnu3Brx8u+zKk0eTq8+IEwRMcFp1S/Lo/yuSQ0citl1x7kRuNOU6IDqPxqW0TR+4Pc6GRe9bM8DP24t5Etn4eGRxryf9GguBvxSA8P+GX+yQylHNt/JacDDA+kuPP/7n6vGkozxQtuR+PJlt8fGT8lrzxpcXfTbSsLeqrFXfizCA2K64RyVJeuEfwg7HxnDbBA8VVZ1H64kXeAM9RoeriawdYAAAAAElFTkSuQmCC"
+const IMAGE_PAUSE = new Image();
+IMAGE_PAUSE.src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAAbCAYAAABxwd+fAAAACXBIWXMAAADGAAAAxgGwdJvFAAAAGXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAAALxJREFUOI3t1TGKwzAQQNE/JoXQGQTGpbFP5HJhXfsoKo0XUupCSWpj0BmMKk8KJ2QXglnYcvXLQfNQNzKO40VEWl5tIvLZ9/2ZN03T9KGqX0DxnKnq9SQi7bquLMuCMYaqqgqgeYc8aoBinmdSSpRlibW2LQBijHjvCSEc7P8shID3nhgjfP/eX8tQhjKUoQz9Q+gE4JxjGAaMMb9e7LqOlBLOuR1S1au1tq3r+vlmA24Hxg3YHocU2C/tHUseO6D31KjVAAAAAElFTkSuQmCC"
\ No newline at end of file
diff --git a/pause.png b/pause.png
new file mode 100644
index 0000000..44b7aaf
Binary files /dev/null and b/pause.png differ
diff --git a/play.png b/play.png
new file mode 100644
index 0000000..5ee66b9
Binary files /dev/null and b/play.png differ
diff --git a/reset.png b/reset.png
new file mode 100644
index 0000000..b4f1fed
Binary files /dev/null and b/reset.png differ
diff --git a/rotation_clockwise.png b/rotation_clockwise.png
new file mode 100644
index 0000000..02d0a75
Binary files /dev/null and b/rotation_clockwise.png differ
diff --git a/rotation_counterclockwise.png b/rotation_counterclockwise.png
new file mode 100644
index 0000000..e391e92
Binary files /dev/null and b/rotation_counterclockwise.png differ