behaviors = { POWDER_OLD: [ "XX|XX|XX", "XX|XX|XX", "M2|M1|M2", ], POWDER: function(pixel) { if (pixel.start === pixelTicks) {return} if (pixel.charge && elements[pixel.element].behaviorOn) { pixelTick(pixel) } if (!tryMove(pixel, pixel.x, pixel.y+1)) { if (Math.random() < 0.5) { if (!tryMove(pixel, pixel.x+1, pixel.y+1)) { tryMove(pixel, pixel.x-1, pixel.y+1); } } else { if (!tryMove(pixel, pixel.x-1, pixel.y+1)) { tryMove(pixel, pixel.x+1, pixel.y+1); } } } doDefaults(pixel); }, AGPOWDER: [ "M2|M1|M2", "XX|XX|XX", "XX|XX|XX", ], LIQUID_OLD: [ "XX|XX|XX", "M2|XX|M2", "M1|M1|M1", ], LIQUID: function(pixel) { if (pixel.start === pixelTicks) {return} if (pixel.charge && elements[pixel.element].behaviorOn) { pixelTick(pixel) } if (elements[pixel.element].viscosity && (!((Math.random()*100) < 100 / Math.pow(elements[pixel.element].viscosity, 0.25)))) { var move1Spots = [ [pixel.x, pixel.y+1] ] } else { var move1Spots = [ [pixel.x+1, pixel.y+1], [pixel.x, pixel.y+1], [pixel.x-1, pixel.y+1], ] } var moved = false; for (var i = 0; i < move1Spots.length; i++) { var coords = move1Spots[Math.floor(Math.random()*move1Spots.length)]; if (tryMove(pixel, coords[0], coords[1])) { moved = true; break; } else { move1Spots.splice(move1Spots.indexOf(coords), 1); } } if (!moved) { if (elements[pixel.element].viscosity===undefined || !(!((Math.random()*100) < 100 / Math.pow(elements[pixel.element].viscosity, 0.25)))) { if (Math.random() < 0.5) { if (!tryMove(pixel, pixel.x+1, pixel.y)) { tryMove(pixel, pixel.x-1, pixel.y); } } else { if (!tryMove(pixel, pixel.x-1, pixel.y)) { tryMove(pixel, pixel.x+1, pixel.y); } } } } doDefaults(pixel); }, SUPERFLUID_OLD: [ "XX|XX|XX", "XX|XX|M2 AND BO", "XX|M1|M2", ], SUPERFLUID: function(pixel) { if (pixel.start === pixelTicks) {return} if (pixel.charge && elements[pixel.element].behaviorOn) { pixelTick(pixel) } if (!tryMove(pixel, pixel.x, pixel.y+1)) { // go either left or right depending on pixel.flipX var newx = pixel.flipX ? pixel.x-1 : pixel.x+1; if (Math.random() < 0.5) { if (!tryMove(pixel, newx, pixel.y)) { pixel.flipX = !pixel.flipX; tryMove(pixel, newx, pixel.y+1); } } else { if (!tryMove(pixel, newx, pixel.y+1)) { if (!tryMove(pixel, newx, pixel.y)) { pixel.flipX = !pixel.flipX; } } } } doDefaults(pixel); }, LIGHTWEIGHT: [ "XX|XX|XX", "XX|FX%0.25|XX", "M2%10|M1%10|M1%10", ], SLIDE: [ "XX|XX|XX", "XX|XX|M2 AND BO", "XX|M1|M1", ], AGLIQUID: [ "M1|M1|M1", "M2|XX|M2", "XX|XX|XX", ], WALL: [ "XX|XX|XX", "XX|XX|XX", "XX|XX|XX", ], UL_UR: [ "M1|M1|M1", "M2|XX|M2", "XX|M2|XX", ], UL_UR_OPTIMIZED: function(pixel) { if (pixel.start === pixelTicks) {return} if (pixel.charge && elements[pixel.element].behaviorOn) { pixelTick(pixel) } var move1Spots = [ [pixel.x, pixel.y-1], [pixel.x+1, pixel.y-1], [pixel.x-1, pixel.y-1], ] var moved = false; for (var i = 0; i < move1Spots.length; i++) { var coords = move1Spots[Math.floor(Math.random()*move1Spots.length)]; if (tryMove(pixel, coords[0], coords[1])) { moved = true; break; } else { move1Spots.splice(move1Spots.indexOf(coords), 1);} } if (!moved && !pixel.del) { var move2Spots = [ [pixel.x, pixel.y+1], [pixel.x+1, pixel.y], [pixel.x-1, pixel.y], ] for (var i = 0; i < move2Spots.length; i++) { var coords = move2Spots[Math.floor(Math.random()*move2Spots.length)]; if (tryMove(pixel, coords[0], coords[1])) { break; } else { move2Spots.splice(move2Spots.indexOf(coords), 1); } } } if (!pixel.del) { doDefaults(pixel); } }, GAS_OLD: [ "M2|M1|M2", "M1|XX|M1", "M2|M1|M2", ], GAS: function(pixel) { if (pixel.start === pixelTicks) {return} if (pixel.charge && elements[pixel.element].behaviorOn) { pixelTick(pixel) } var move1Spots = [ [pixel.x, pixel.y+1], [pixel.x, pixel.y-1], [pixel.x+1, pixel.y], [pixel.x-1, pixel.y], ] var moved = false; for (var i = 0; i < move1Spots.length; i++) { var coords = move1Spots[Math.floor(Math.random()*move1Spots.length)]; if (tryMove(pixel, coords[0], coords[1])) { moved = true; break; } else { move1Spots.splice(move1Spots.indexOf(coords), 1);} } if (!moved) { var move2Spots = [ [pixel.x+1, pixel.y+1], [pixel.x-1, pixel.y+1], [pixel.x+1, pixel.y-1], [pixel.x-1, pixel.y-1], ] for (var i = 0; i < move2Spots.length; i++) { var coords = move2Spots[Math.floor(Math.random()*move2Spots.length)]; if (tryMove(pixel, coords[0], coords[1])) { break; } else { move2Spots.splice(move2Spots.indexOf(coords), 1); } } } doDefaults(pixel); }, DGAS: [ "M2|M1|M2", "M1|DL%5|M1", "M2|M1|M2", ], SUPPORT: [ "XX|XX|XX", "SP|XX|SP", "XX|M1|XX", ], SUPPORTPOWDER: [ "XX|XX|XX", "SP|XX|SP", "M2|M1|M2", ], DELETE: [ "XX|DL|XX", "DL|XX|DL", "XX|DL|XX", ], FILL: [ "XX|CL|XX", "CL|XX|CL", "XX|CL|XX", ], CLONER: [ "XX|CF|XX", "CF|XX|CF", "XX|CF|XX", ], SUPERCLONER: [ "CF|CF|CF", "CF|CF|CF", "CF|CF|CF", ], STURDYPOWDER: [ "XX|XX|XX", "XX|XX|XX", "XX|M1|XX", ], SELFDELETE: [ "XX|XX|XX", "XX|DL|XX", "XX|XX|XX", ], FOAM: [ "XX|XX|XX", "XX|DL%5|XX", "M2%25|M1%25|M2%25", ], BUBBLE: [ "XX|XX|XX", "XX|DL%0.25 AND FX%1|M1%5", "XX|M1%1|M1%2", ], STICKY: [ "XX|ST|XX", "ST|XX|ST", "XX|ST AND M1|XX", ], MOLTEN: [ "XX|CR:fire%2.5|XX", "M2|XX|M2", "M1|M1|M1", ], RADPOWDER: [ "XX|CR:radiation%1|XX", "CR:radiation%1|XX|CR:radiation%1", "M2|M1|M2", ], RADMOLTEN: [ "XX|CR:fire,fire,fire,radiation%4.5|XX", "M2 AND CR:radiation%1|XX|M2 AND CR:radiation%1", "M1|M1|M1", ], RADLIQUID: [ "XX|CR:radiation%2|XX", "M2 AND CR:radiation%2|XX|M2 AND CR:radiation%2", "M1|M1|M1", ], BOUNCY: function(pixel) { if (pixel.bx===undefined) { // choose 1, 0, or -1 pixel.bx = Math.random() < 0.5 ? 1 : Math.random() < 0.5 ? 0 : -1; pixel.by = Math.random() < 0.5 ? 1 : Math.random() < 0.5 ? 0 : -1; // if both are 0, make one of them 1 or -1 if (pixel.bx===0 && pixel.by===0) { if (Math.random() < 0.5) { pixel.bx = Math.random() < 0.5 ? 1 : -1; } else { pixel.by = Math.random() < 0.5 ? 1 : -1; } } } // move and invert direction if hit if (!pixel.del && pixel.bx && !tryMove(pixel, pixel.x+pixel.bx, pixel.y)) { pixel.bx = -pixel.bx; } if (!pixel.del && pixel.by && !tryMove(pixel, pixel.x, pixel.y+pixel.by)) { pixel.by = -pixel.by; } }, FEEDPIXEL: function(pixel) { if (!pixel.food) { pixel.food = 1 } else { pixel.food ++ } if (pixel.food > (elements[pixel.element].foodNeed||30)) { // loop through adjacentCoords and check each pixel to lay an egg for (var i = 0; i < adjacentCoords.length; i++) { var x = pixel.x+adjacentCoords[i][0]; var y = pixel.y+adjacentCoords[i][1]; if (isEmpty(x, y)) { if (elements[pixel.element].egg) { createPixel(elements[pixel.element].egg,x,y) } else { createPixel("egg",x,y) pixelMap[x][y].animal = elements[pixel.element].baby || pixel.element; if (elements[pixel.element].eggColor) { pixelMap[x][y].color = pixelColorPick(pixelMap[x][y],elements[pixel.element].eggColor) } } pixel.food = 0; break; } } } }, KILLPIXEL1: function(pixel) { pixel.dead = true; }, KILLPIXEL2: function(pixel1,pixel2) { pixel2.dead = true; }, FLY: function(pixel, onHit) { var nx = pixel.flipX ? -1 : 1; var ny = Math.random() < 0.5 ? -1 : 1; var hit = false; if (!tryMove(pixel, pixel.x+nx, pixel.y+ny)) { if (!tryMove(pixel, pixel.x+nx, pixel.y-ny)) { if (!tryMove(pixel, pixel.x, pixel.y+ny)) { if (!tryMove(pixel, pixel.x, pixel.y-ny)) {hit=[pixel.x, pixel.y-ny]} }else {hit=[pixel.x, pixel.y+ny]} }else {hit=[pixel.x+nx, pixel.y-ny]} }else {hit=[pixel.x+nx, pixel.y+ny]} if (hit && onHit) { if (!isEmpty(hit[0], hit[1], true)) { onHit(pixel, pixelMap[hit[0]][hit[1]]); } else {onHit(pixel);} } if (pixel.del) {return} if (!isEmpty(pixel.x+nx,pixel.y) || Math.random() < 0.02) { pixel.flipX = !pixel.flipX; } if (pixel.charge && elements[pixel.element].behaviorOn) { pixelTick(pixel) } doDefaults(pixel); }, CRAWLER: function(pixel) { if (Math.random() < 0.08) { // flip pixel.flipX = !pixel.flipX; } var dir = pixel.flipX ? -1 : 1; var dirY = pixel.flipY ? -1 : 1; if (!tryMove(pixel,pixel.x,pixel.y+dirY)) { // fall or climb if (!tryMove(pixel,pixel.x+dir,pixel.y)) { // hits wall if (!pixel.hilled && !isEmpty(pixel.x+dir,pixel.y,true) && pixelMap[pixel.x+dir][pixel.y].element === "ant_wall") { pixel.hilled = true; } tryMove(pixel,pixel.x+dir,pixel.y + (Math.random() < 0.25 ? 1 : -1)); } if (Math.random() < 0.01 && !isEmpty(pixel.x+dir,pixel.y+1,true) && eLists.CRAWLTHRU.indexOf(pixelMap[pixel.x+dir][pixel.y+1].element) !== -1) { if (!pixel.hilled || !isEmpty(pixel.x+dir,pixel.y,true) && pixelMap[pixel.x+dir][pixel.y].element === "ant_wall") { var wallCoords = [ [-1,-1],[1,-1], [-1,0],[1,0], [0,1] ]; if (!isEmpty(pixel.x,pixel.y-2)) { wallCoords.push([0,-1]) } if (Math.random() < 0.15) { wallCoords.push([-1,1]) } if (Math.random() < 0.15) { wallCoords.push([1,1]) } // loop through wallCoords, change pixel to ant_wall if in crawlthru for (var i = 0; i < wallCoords.length; i++) { var x = pixel.x+dir+wallCoords[i][0]; var y = pixel.y+1+wallCoords[i][1]; if (!isEmpty(x,y,true) && eLists.CRAWLTHRU.indexOf(pixelMap[x][y].element) !== -1) { changePixel(pixelMap[x][y],"ant_wall"); } } deletePixel(pixel.x+dir,pixel.y+1); tryMove(pixel,pixel.x+dir,pixel.y+1); } } else if (Math.random() < 0.08 && !isEmpty(pixel.x+dir,pixel.y-1,true) && eLists.CRAWLTHRU.indexOf(pixelMap[pixel.x+dir][pixel.y-1].element) !== -1) { swapPixels(pixel,pixelMap[pixel.x+dir][pixel.y-1]); } } doDefaults(pixel); } } elements.supercloner = { color: "#dddd00", behavior: behaviors.SUPERCLONER, ignore: ["ecloner","slow_cloner","clone_powder","floating_cloner","wall","ewall", "cloner"], category:"inventory", insulate:true, hardness: 1, darkText: true, } if (!settings.survival) { settings.survival = { "wall": 9999, "dirt": 9999, "sapling": 10, "seeds": 50, "ice": 250, "cloner": 10, "supercloner": 10 } } settings.survival.cloner = 1; settings.unhide = 0; // settings.survivalClone=null; settings.survival = null; saveSettings(); survivalTimeout = null; function survivalSave() { if (survivalTimeout) { clearTimeout(survivalTimeout); } survivalTimeout = setTimeout(function(){ saveSettings(); },1000); } function survivalAdd(element,amount,skipSave) { if (elements[element].category === "tools") { return } if (settings.survival[element]) { settings.survival[element] += amount; } else { settings.survival[element] = amount; } survivalUpdate(element); if (!skipSave) {survivalSave()} } function survivalRemove(element,amount,skipSave) { if (elements[element].category === "tools") { return } if (settings.survival[element]) { settings.survival[element] -= amount; survivalUpdate(element); } if (settings.survival[element] <= 0) { delete settings.survival[element]; var btn = document.getElementById("elementButton-"+element); if (btn) { btn.remove(); } selectElement("unknown"); } if (!skipSave) {survivalSave()} } function survivalCount(element) { return settings.survival[element] || 0; } function survivalUpdate(element) { if (element === "gold_coin") { // if it is not an integer, round it to 0.1 if (settings.survival.gold_coin % 1 !== 0) { settings.survival.gold_coin = Math.round(settings.survival.gold_coin*10)/10; } document.getElementById("coinCount").innerHTML = settings.survival.gold_coin||0; } var btn = document.getElementById("elementButton-"+element); if (elements[element] && elements[element].category === "tools") { return } if (btn) { btn.innerHTML = btn.innerHTML.split("(")[0]+"("+settings.survival[element]+")"; } else if (elements[element]) { createElementButton(element); document.getElementById("elementButton-"+element).innerHTML += "("+settings.survival[element]+")"; } } runAfterAutogen(function(){ elements.erase.name = "pick_up"; delete elements.paint.category; delete elements.lookup.category; delete elements.pick; delete elements.prop; elements.radiation.category = "tools"; for (var element in elements) { if (elements[element].category !== "tools") { elements[element].hidden = true; elements[element].category = "inventory"; } } for (var element in settings.survival) { if (!elements[element]) { continue; } if (elements[element].category === "tools") { continue; } createElementButton(element); document.getElementById("elementButton-"+element).innerHTML += "("+settings.survival[element]+")"; } }); delete elements.cloner.behavior; elements.cloner.tick = function(pixel) { if (settings.survivalClone) { if (Math.random() < 0.025) { // 1 or -1 var x = pixel.x + (Math.random() < 0.5 ? 1 : -1); var y = pixel.y + (Math.random() < 0.5 ? 1 : -1); if (isEmpty(x,y)) { createPixel(settings.survivalClone,x,y); } } } else { for (var i = 0; i < adjacentCoords.length; i++) { var coords = adjacentCoords[i]; var x = pixel.x + coords[0]; var y = pixel.y + coords[1]; if (!isEmpty(x,y,true)) { if (pixelMap[x][y].clone) { pixel.clone = pixelMap[x][y].clone; break } var element = pixelMap[x][y].element; if (element === pixel.element || elements[pixel.element].ignore.indexOf(element) !== -1) { continue } settings.survivalClone = element; survivalSave(); break; } } } }; elements.cloner.ignore = elements.cloner.ignore.concat(["sun","supernova"]); elements.cloner.desc = "You can only clone one element at a time!" elements.smash.tool = function(pixel) { if (elements[pixel.element].seed === true) { return } if (elements[pixel.element].breakInto !== undefined || (elements[pixel.element].seed !== undefined && elements[pixel.element].seed !== true)) { // times 0.25 if not shiftDown else 1 if (Math.random() < (elements[pixel.element].hardness || 1) * (shiftDown ? 1 : 0.25)) { var breakInto = elements[pixel.element].breakInto; if (elements[pixel.element].seed && (!breakInto || Math.random() < 0.5)) { if (Math.random() < 0.2) { breakInto = elements[pixel.element].seed; } else { breakInto = null; } } // if breakInto is an array, pick one if (Array.isArray(breakInto)) { breakInto = breakInto[Math.floor(Math.random() * breakInto.length)]; } if (breakInto === null) { deletePixel(pixel.x,pixel.y); return; } var oldelement = pixel.element; changePixel(pixel,breakInto); pixelTempCheck(pixel); if (elements[oldelement].breakIntoColor) { pixel.color = pixelColorPick(pixel, elements[oldelement].breakIntoColor); } } } }; elementWorth = { "gold_coin": 1, "diamond": 1000^21, "ketchup": 150, "jelly": 120, "soda": 104, "toast": 120, "oil": 1023423, "bread": 32, "glass": 54, "rad_glass": 64, "glass_shard": 42, "rad_shard": 312412, "paper": 512312, "broth": 512312, "honey": 125, "caramel": 53, "sap": 34, "candy": 325, "popcorn": 232, "flour": 322, "lettuce": 2232, "sauce": 2232, "wood": 999, "tree_branch": 100000, "plant": 1, "mushroom_cap": 1, "mushroom_gill": 3, "vine": 1, "cactus": 1, "cloner": 2, "wall": 1000^22, "fire": 100000^232, "smoke": 0, "plasma": 0, "light": 0, "laser": 0, "liquid_light": 0.1, "flash": 0, "radiation": 0, "petal": -1, "cell": -1, "cancer": -1, "foam": -1, } elements.sell = { color: ["#fff0b5","#ffe680","#c48821","#986a1a","#eca832","#f0bb62"], tool: function(pixel) { if (elementWorth[pixel.element] === 0) { return; } deletePixel(pixel.x,pixel.y); if (elementWorth[pixel.element] === -1) { return; } survivalAdd("gold_coin",elementWorth*10[pixel.element]||1); }, category: "tools", desc: "Exchanges pixels for their market value in Gold Coins x 10" } elements.seeds.name = "seed"; /* ~Cloner ~Sell Shop Cloner Reset ~Ammonia ~Dirt ~Water ~Seeds ~Sapling ~Pinecone ~Primordial Soup ~Worm ~Bee ~Human ~TNT Seller (Runs Sell tool on pixels that touch it) Buyer (Cloner but uses store price every time, prompt to select item on select) Prices tab */ survivalShop = { "dirt*25": 25, "water*25": 250, "ammonia*25": 500, "seeds*1": 500, "sapling*1": 500, "pinecone*1": 500, "tnt*25": 1000, "worm*1": 1000, "bee*1": 5000, "primordial_soup*5": 10000, "human*1": 50000, "sun*1": 500000, "milk": -200^2, } function survivalBuy(element) { var price = survivalShop[element]; if (!price) { alert("The shop isn't selling "+element+"!"); return } if (!settings.survival.gold_coin || settings.survival.gold_coin < price) { alert("You can't afford that!"); return } survivalRemove("gold_coin",price); var amount = 1; if (element.indexOf("*") !== -1) { amount = parseInt(element.split("*")[1]); element = element.split("*")[0]; } survivalAdd(element,amount); selectElement(element); } function survivalResetCloner() { if (!settings.survival.gold_coin || settings.survival.gold_coin < 1000) { alert("You can't afford that!"); return } survivalRemove("gold_coin",1000); settings.survivalClone = null; survivalSave(); } worldgentypes = {} window.addEventListener("load",function(){ // move to start of tools var erase = document.getElementById("elementButton-erase"); var sell = document.getElementById("elementButton-sell"); var parent = erase.parentElement; parent.removeChild(sell); parent.insertBefore(sell,parent.firstChild); parent.removeChild(erase); parent.insertBefore(erase,parent.firstChild); document.getElementById("replaceButton").remove(); document.getElementById("savesButton").remove(); document.getElementById("elemSelectButton").remove(); doRandomEvents = function() {} worldGen = function() {} worldgentypes = {} loadSave = function() {} showSaves = function() {} placeImage = function() {} chooseElementPrompt = function() {} document.getElementById("toolControls").insertAdjacentHTML("beforeend",``); createCategoryDiv("shop"); var shopDiv = document.getElementById("category-shop"); shopDiv.style.display = "none"; shopDiv.insertAdjacentHTML("beforeend",`
You have $${settings.survival.gold_coin||0}
`); for (var element in survivalShop) { var price = survivalShop[element]; var button = document.createElement("button"); var name = element; var amount = 1; if (element.indexOf("*") !== -1) { amount = parseInt(element.split("*")[1]); name = element.split("*")[0]; } var elemname = name; name = (elements[elemname].name||name).replace(/_/g, " ").replace("."," ").replace(/\w\S*/g, function(txt){return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();}).replace(" ",".").replace(/ /g, ""); button.classList.add("elementButton"); button.setAttribute("element",element); button.setAttribute("category","shop"); button.setAttribute("title",amount+" "+name+" for $"+price); button.innerHTML = name+" ("+amount+" for $"+price+")"; if (elements[elemname]) { if (elements[elemname].color instanceof Array) { button.style.backgroundImage = "linear-gradient(to bottom right, "+elements[elemname].color.join(", ")+")"; // choose the middlemost item in array var colorObject = elements[elemname].colorObject[Math.floor(elements[elemname].colorObject.length/2)]; if (elements[elemname].darkText !== false && (elements[elemname].darkText || (colorObject.r+colorObject.g+colorObject.b)/3 > 200)) { button.className += " bright" } } else { button.style.background = elements[elemname].color; var colorObject = elements[elemname].colorObject; if (elements[elemname].darkText !== false && (elements[elemname].darkText || (colorObject.r+colorObject.g+colorObject.b)/3 > 200)) { button.className += " bright" } } } button.addEventListener("click",function(){ survivalBuy(this.getAttribute("element")); }); shopDiv.appendChild(button); } shopDiv.insertAdjacentHTML("beforeend",``); createCategoryDiv("prices"); var pricesDiv = document.getElementById("category-prices"); pricesDiv.style.display = "none"; for (var element in elementWorth) { if (elementWorth[element] <= 0) { continue } var name = (elements[element].name||element).replace(/_/g, " ").replace("."," ").replace(/\w\S*/g, function(txt){return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();}).replace(" ","."); // create text with the name of the element and its worth, separated by • var text = name+"="+elementWorth[element] + " • "; pricesDiv.insertAdjacentHTML("beforeend",`${text}`); } pricesDiv.innerHTML = pricesDiv.innerHTML.slice(0,-2); pricesDiv.innerHTML = ""+pricesDiv.innerHTML+"
"; }); runAfterLoad(function(){ checkUnlock = function(element) { return; } oldClearAll = clearAll; clearAll = function() { if (currentPixels && currentPixels.length > 0) { for (var i = 0; i < currentPixels.length; i++) { var pixel = currentPixels[i]; if (pixel && pixel.element) { survivalAdd(pixel.element,1); } } } oldClearAll(); } mouseAction = function(e,mouseX,mouseY,startPos) { if (mouseType == "left") { mouse1Action(e,mouseX,mouseY,startPos); } else if (mouseType == "right") { mouse2Action(e,mouseX,mouseY,startPos); } else if (mouseType == "middle") { mouseMiddleAction(e,mouseX,mouseY); } } mouse1Action = function(e,mouseX=undefined,mouseY=undefined,startPos) { if (currentElement === "erase") { mouse2Action(e,mouseX,mouseY); return; } else if (currentElement === "pick") { mouseMiddleAction(e,mouseX,mouseY); return; } // If x and y are undefined, get the mouse position if (mouseX == undefined && mouseY == undefined) { // var canvas = document.getElementById("game"); // var ctx = canvas.getContext("2d"); lastPos = mousePos; mousePos = getMousePos(canvas, e); var mouseX = mousePos.x; var mouseY = mousePos.y; } var cooldowned = false; if ((mouseSize===1 || elements[currentElement].maxSize===1) && elements[currentElement].cooldown) { if (pixelTicks-lastPlace < elements[currentElement].cooldown) { return; } cooldowned = true; } lastPlace = pixelTicks; startPos = startPos || lastPos if (!(isMobile || (cooldowned && startPos.x===lastPos.x && startPos.y===lastPos.y) || elements[currentElement].tool || elements[currentElement].category==="tools")) { var coords = lineCoords(startPos.x,startPos.y,mouseX,mouseY); } else { var coords = mouseRange(mouseX,mouseY); } var element = elements[currentElement]; var mixList = []; // For each x,y in coords for (var i = 0; i < coords.length; i++) { var x = coords[i][0]; var y = coords[i][1]; if (currentElement === "mix") { if (!isEmpty(x,y,true)) { var pixel = pixelMap[x][y]; if (!(elements[pixel.element].movable !== true || elements[pixel.element].noMix === true) || shiftDown) { mixList.push(pixel); } } } else if (currentElement === "shock") { if (!isEmpty(x,y,true)) { // One loop that repeats 5 times if shiftDown else 1 time for (var j = 0; j < (shiftDown ? 5 : 1); j++) { var pixel = pixelMap[x][y]; var con = elements[pixel.element].conduct; if (con == undefined) {continue} if (Math.random() < con) { // If random number is less than conductivity if (!pixel.charge && !pixel.chargeCD) { pixel.charge = 1; if (elements[pixel.element].colorOn) { pixel.color = pixelColorPick(pixel); } } } else if (elements[pixel.element].insulate != true) { // Otherwise heat the pixel (Resistance simulation) pixel.temp += 0.25; pixelTempCheck(pixel); } } } } else if (elements[currentElement].tool && !(elements[currentElement].canPlace && isEmpty(x,y))) { // run the tool function on the pixel if (!isEmpty(x,y,true)) { var pixel = pixelMap[x][y]; // if the current element has an ignore property and the pixel's element is in the ignore property, don't do anything if (elements[currentElement].ignore && elements[currentElement].ignore.indexOf(pixel.element) != -1) { continue; } elements[currentElement].tool(pixel); } } else if (isEmpty(x, y)) { if (survivalCount(currentElement) < 1 && elements[currentElement].category !== "tools") { return; } currentPixels.push(new Pixel(x, y, currentElement)); if (elements[currentElement].customColor || elements[currentElement].singleColor) { pixelMap[x][y].color = pixelColorPick(currentElement,currentColor); } if (elements[currentElement].category !== "tools") { survivalRemove(currentElement,1); } } } if (currentElement == "mix") { for (var i = 0; i < mixList.length; i++) { var pixel1 = mixList[Math.floor(Math.random()*mixList.length)]; var pixel2 = mixList[Math.floor(Math.random()*mixList.length)]; swapPixels(pixel1,pixel2); mixList.splice(mixList.indexOf(pixel1),1); mixList.splice(mixList.indexOf(pixel2),1); if (elements[pixel1.element].onMix) { elements[pixel1.element].onMix(pixel1,pixel2); } if (elements[pixel2.element].onMix) { elements[pixel2.element].onMix(pixel2,pixel1); } } } } mouse2Action = function(e,mouseX=undefined,mouseY=undefined,startPos) { // Erase pixel at mouse position if (mouseX == undefined && mouseY == undefined) { // var canvas = document.getElementById("game"); // var ctx = canvas.getContext("2d"); lastPos = mousePos; mousePos = getMousePos(canvas, e); var mouseX = mousePos.x; var mouseY = mousePos.y; } if (dragStart) { dragStart = 0; for (var i = 0; i < draggingPixels.length; i++) { var pixel = draggingPixels[i]; delete pixel.drag; } draggingPixels = null; } // If the current element is "pick" or "lookup", coords = [mouseX,mouseY] if (currentElement == "pick" || currentElement == "lookup") { var coords = [[mouseX,mouseY]]; } else if (!isMobile) { startPos = startPos || lastPos var coords = lineCoords(startPos.x,startPos.y,mouseX,mouseY); } else { var coords = mouseRange(mouseX,mouseY); } // For each x,y in coords for (var i = 0; i < coords.length; i++) { var x = coords[i][0]; var y = coords[i][1]; if (!isEmpty(x, y)) { if (outOfBounds(x,y)) { continue } var pixel = pixelMap[x][y]; survivalAdd(pixel.element,1); delete pixelMap[x][y]; // Remove pixel from currentPixels for (var j = 0; j < currentPixels.length; j++) { if (currentPixels[j].x == x && currentPixels[j].y == y) { currentPixels.splice(j, 1); break; } } } } } }) window.addEventListener("beforeunload",function(){ clearAll(); saveSettings(); });