diff --git a/mods/boompaste.js b/mods/boompaste.js new file mode 100644 index 00000000..b2f8bd2f --- /dev/null +++ b/mods/boompaste.js @@ -0,0 +1,76 @@ +activated_meltpasteBlacklist = ["activated_meltpaste"] +let v = -1.797693134862315E+308; +let w = v * 1.001; +let x = 1.797693134862315E+308; +let y = x * 1.001; +elements.boompaste = { + temp: y, + color: "#008009", + behavior: behaviors.MOLTEN, + burn:300, + category: "Boom", + state: "solid", + burnTime: 10000, + reactions:{ + "boompaste": { elem1:"boompaste" , elem2: "boompaste"}, + "fire": { elem1: "boompaste" , elem2:"boompaste" }, + "plasma": { elem1: "boompaste" , elem2:"boompaste" }, + "flash":{ elem1: "boompaste" , elem2:"flash" }, + "water":{ elem1: "flash" , elem2:"flash" }, + }, +} + +//i stole this from the alkest mod (duh) please steal from me -g +elements.meltpaste = { + density:y, + temp: y, + color: "#755858", + behavior: behaviors.POWDER, + burn:300, + category: "Boom", + state: "solid", + burnTime: 10000, + lowtemp:-1, + lowstate:"plasma", + tick: function(pixel) { + for(i = 0; i < adjacentCoords.length; i++) { + if(Math.random() < 0.1) { + var pX = pixel.x + var pY = pixel.y + var oX = adjacentCoords[i][0]; + var oY = adjacentCoords[i][1]; + var checkPosX = pX+oX; + var checkPosY = pY+oY; + if(!isEmpty(checkPosX,checkPosY,true)) { + var newPixel = pixelMap[checkPosX][checkPosY]; + var newElement = newPixel.element; + if(!activated_meltpasteBlacklist.includes(newElement)) { //unless someone's willing to implement dragon parts + if(typeof(pixel[newElement]) === "undefined") { + pixel[newElement] = 0; + }; + pixel[newElement]++; + deletePixel(checkPosX,checkPosY); + }; + }; + }; + }; + }, +} + +elements.gasoline = { + color: "#008000", + behavior: behaviors.LIQUID, + category: "Boom", + state: "liquid", + burn:300, + burnTime:999 , +} +elements.afterburn = { + color: "#c8d600", + behavior: behaviors.LIQUID, + category: "Boom", + state: "liquid", + burn:y, + burnTime:30, + burnInto:["gasoline","afterburn"], +} diff --git a/mods/graphite.js b/mods/graphite.js new file mode 100644 index 00000000..ceb5ec6c --- /dev/null +++ b/mods/graphite.js @@ -0,0 +1,460 @@ +elements.graphite = { + color: "#4d4f4f", + behavior: behaviors.POWDER, + category: "GraphiteMod", + state: "solid", + density: 2.26, + tempHigh: 3600, + stateHigh: "carbon_gas", + flammable: false, + reactions: { + "oxygen": { elem1: "carbon_dioxide", elem2: null, tempMin: 700 }, + "fire": { elem1: "carbon_monoxide", elem2: null, tempMin: 700 }, + "fluorine": { elem1: "carbon_tetrafluoride", elem2: null }, + "silicon_dioxide": { elem1: "silicon", elem2: "carbon_monoxide", tempMin: 1700 } + } +}; + +/* Carbon (solid) */ +elements.carbon = { + color: "#7a7d7d", + behavior: behaviors.POWDER, + category: "GraphiteMod", + state: "solid", + density: 2.2, + tempHigh: 3600, + stateHigh: "carbon_gas", + flammable: false, + reactions: { + "oxygen": { elem1: "carbon_dioxide", elem2: null, tempMin: 700 }, + "fire": { elem1: "carbon_monoxide", elem2: null, tempMin: 700 }, + "fluorine": { elem1: "carbon_tetrafluoride", elem2: null }, + "silicon_dioxide": { elem1: "silicon", elem2: "carbon_monoxide", tempMin: 1700 } + } +}; + +/* Carbon gas (vapor) */ +elements.carbon_gas = { + color: "#666666", + behavior: behaviors.GAS, + category: "GraphiteMod", + state: "gas", + density: 0.0018, + reactions: { + "oxygen": { elem1: "carbon_monoxide", elem2: null }, + "fluorine": { elem1: "carbon_tetrafluoride", elem2: null }, + "hydrogen": { elem1: "hydrocarbon_gas", elem2: null, tempMin: 1200 }, + "silicon": { elem1: "silicon_carbide", elem2: null, tempMin: 1400 } + } +}; + +/* Hydrocarbon gas (generic hydrocarbon product placeholder) */ +elements.hydrocarbon_gas = { + color: "#ffdca3", + behavior: behaviors.GAS, + category: "GraphiteMod", + state: "gas", + density: 0.7, + reactions: { + "oxygen": { elem1: "carbon_dioxide", elem2: "water" }, + "fire": { elem1: "carbon_dioxide", elem2: "water" }, + "fluorine": { elem1: "carbon_tetrafluoride", elem2: "hydrogen_fluoride" }, + "water": { elem1: "water", elem2: null } + } +}; + +/* Carbon monoxide */ +elements.carbon_monoxide = { + color: "#bfbfbf", + behavior: behaviors.GAS, + category: "GraphiteMod", + state: "gas", + density: 1.145, + reactions: { + "oxygen": { elem1: "carbon_dioxide", elem2: null }, + "fire": { elem1: "carbon_dioxide", elem2: null }, + "iron_oxide": { elem1: "iron", elem2: "carbon_dioxide", tempMin: 800 }, + "fluorine": { elem1: "carbonyl_fluoride", elem2: null } + } +}; + +/* Carbonyl fluoride (COF2) */ +elements.carbonyl_fluoride = { + color: "#cfeef0", + behavior: behaviors.GAS, + category: "GraphiteMod", + state: "gas", + density: 2.5, + reactions: { + "water": { elem1: "carbon_dioxide", elem2: "hydrogen_fluoride" }, + "fire": { elem1: "carbon_dioxide", elem2: "fluorine" }, + "hydrofluoric_acid": { elem1: "hydrogen_fluoride", elem2: "carbon_dioxide" }, + "oxygen": { elem1: "carbon_dioxide", elem2: "fluorine" } + } +}; + +/* Fluorine */ +elements.fluorine = { + color: "#b5e61d", + behavior: behaviors.GAS, + category: "GraphiteMod", + state: "gas", + density: 1.696, + temp: 25, + flammable: false, + reactions: { + "graphite": { elem1: "carbon_tetrafluoride", elem2: null }, + "carbon": { elem1: "carbon_tetrafluoride", elem2: null }, + "hydrogen": { elem1: "hydrogen_fluoride", elem2: null }, + "water": { elem1: "hydrogen_fluoride", elem2: "oxygen" }, + "silicon": { elem1: "silicon_tetrafluoride", elem2: null } + } +}; + +/* Carbon tetrafluoride (CF4) */ +elements.carbon_tetrafluoride = { + color: "#ccffff", + behavior: behaviors.GAS, + category: "GraphiteMod", + state: "gas", + density: 3.72, + flammable: false, + reactions: { + "fire": { elem1: "carbon_dioxide", elem2: "fluorine", tempMin: 2000 }, + "silicon": { elem1: "silicon_tetrafluoride", elem2: "carbon", tempMin: 900 }, + "molten_silicon": { elem1: "silicon_tetrafluoride", elem2: "carbon", tempMin: 900 }, + "silicon_dioxide": { elem1: "silicon_tetrafluoride", elem2: "carbon_monoxide", tempMin: 1500 } + } +}; + +/* Hydrogen fluoride (gas) */ +elements.hydrogen_fluoride = { + color: "#e0ffff", + behavior: behaviors.GAS, + category: "GraphiteMod", + state: "gas", + density: 0.98, + temp: 25, + flammable: false, + reactions: { + "water": { elem1: "hydrofluoric_acid", elem2: null }, + "silicon_dioxide": { elem1: "silicon_tetrafluoride", elem2: "water" }, + "calcium_carbonate": { elem1: "calcium_fluoride", elem2: "carbon_dioxide" }, + "calcium_hydroxide": { elem1: "calcium_fluoride", elem2: "water" } + } +}; + +/* Hydrofluoric acid (aqueous HF) */ +elements.hydrofluoric_acid = { + color: "#66ccff", + behavior: behaviors.LIQUID, + category: "GraphiteMod", + state: "liquid", + density: 1.15, + tempLow: -83, + stain: "#99ddff", + reactions: { + "glass": { elem1: "silicon_tetrafluoride", elem2: "water" }, + "sand": { elem1: "silicon_tetrafluoride", elem2: "water" }, + "silicon_dioxide": { elem1: "silicon_tetrafluoride", elem2: "water" }, + "calcium_carbonate": { elem1: "calcium_fluoride", elem2: "carbon_dioxide" }, + "calcium_hydroxide": { elem1: "calcium_fluoride", elem2: "water" } + } +}; + +/* Silicon tetrafluoride */ +elements.silicon_tetrafluoride = { + color: "#e6ffff", + behavior: behaviors.GAS, + category: "GraphiteMod", + state: "gas", + density: 1.66, + flammable: false, + reactions: { + "water": { elem1: "hydrofluoric_acid", elem2: "silicon_dioxide" }, + "sand": { elem1: "hydrofluoric_acid", elem2: "silicon_dioxide" }, + "glass": { elem1: "hydrofluoric_acid", elem2: "silicon_dioxide" }, + "calcium_hydroxide": { elem1: "calcium_fluoride", elem2: "hydrofluoric_acid" } + } +}; + +/* Silicon (solid) */ +elements.silicon = { + color: "#9a9a9a", + behavior: behaviors.SOLID, + category: "GraphiteMod", + state: "solid", + density: 2.33, + tempHigh: 1414, + stateHigh: "molten_silicon", + flammable: false, + reactions: { + "oxygen": { elem1: "silicon_dioxide", elem2: null, tempMin: 500 }, + "fluorine": { elem1: "silicon_tetrafluoride", elem2: null }, + "hydrofluoric_acid": { elem1: "silicon_tetrafluoride", elem2: null }, + "carbon_tetrafluoride": { elem1: "silicon_tetrafluoride", elem2: "carbon", tempMin: 900 } + } +}; + +elements.molten_silicon = { + color: "#ffb366", + behavior: behaviors.LIQUID, + category: "GraphiteMod", + state: "liquid", + density: 2.5, + temp: 1414, + stateLow: "silicon", + reactions: { + "oxygen": { elem1: "silicon_dioxide", elem2: null }, + "fluorine": { elem1: "silicon_tetrafluoride", elem2: null }, + "carbon_tetrafluoride": { elem1: "silicon_tetrafluoride", elem2: "carbon" }, + "graphite": { elem1: "silicon_carbide", elem2: null, tempMin: 1500 } + } +}; + +/* Silicon dioxide (quartz / sand) */ +elements.silicon_dioxide = { + color: "#f2f2f2", + behavior: behaviors.SOLID, + category: "GraphiteMod", + state: "solid", + density: 2.65, + tempHigh: 1710, + stateHigh: "molten_silicon_dioxide", + flammable: false, + reactions: { + "hydrofluoric_acid": { elem1: "silicon_tetrafluoride", elem2: "water" }, + "hydrogen_fluoride": { elem1: "silicon_tetrafluoride", elem2: "water" }, + "graphite": { elem1: "silicon", elem2: "carbon_monoxide", tempMin: 1700 }, + "carbon": { elem1: "silicon", elem2: "carbon_monoxide", tempMin: 1700 } + } +}; + +elements.molten_silicon_dioxide = { + color: "#ffcc99", + behavior: behaviors.LIQUID, + category: "GraphiteMod", + state: "liquid", + density: 2.3, + temp: 1710, + stateLow: "silicon_dioxide", + flammable: false, + reactions: { + "hydrofluoric_acid": { elem1: "silicon_tetrafluoride", elem2: "water" }, + "hydrogen_fluoride": { elem1: "silicon_tetrafluoride", elem2: "water" }, + "graphite": { elem1: "silicon", elem2: "carbon_monoxide", tempMin: 1700 }, + "carbon": { elem1: "silicon", elem2: "carbon_monoxide", tempMin: 1700 } + } +}; + +/* Calcium carbonate (limestone) */ +elements.calcium_carbonate = { + color: "#fffccc", + behavior: behaviors.SOLID, + category: "GraphiteMod", + state: "solid", + density: 2.71, + flammable: false, + reactions: { + "acid": { elem1: "carbon_dioxide", elem2: "water" }, + "hydrofluoric_acid": { elem1: "calcium_fluoride", elem2: "carbon_dioxide" }, + "hydrogen_fluoride": { elem1: "calcium_fluoride", elem2: "carbon_dioxide" }, + "fire": { elem1: "calcium_oxide", elem2: "carbon_dioxide", tempMin: 850 } + } +}; + +/* Calcium oxide (quicklime) */ +elements.calcium_oxide = { + color: "#fafafa", + behavior: behaviors.SOLID, + category: "GraphiteMod", + state: "solid", + density: 3.34, + tempHigh: 2572, + stateHigh: "molten_calcium_oxide", + reactions: { + "water": { elem1: "calcium_hydroxide", elem2: null }, + "carbon_dioxide": { elem1: "calcium_carbonate", elem2: null }, + "hydrogen_fluoride": { elem1: "calcium_fluoride", elem2: "water" }, + "hydrofluoric_acid": { elem1: "calcium_fluoride", elem2: "water" } + } +}; + +elements.molten_calcium_oxide = { + color: "#f0e6cc", + behavior: behaviors.LIQUID, + category: "GraphiteMod", + state: "liquid", + density: 3.0, + temp: 2572, + stateLow: "calcium_oxide", + reactions: { + "water": { elem1: "calcium_hydroxide", elem2: null }, + "carbon_dioxide": { elem1: "calcium_carbonate", elem2: null }, + "hydrogen_fluoride": { elem1: "calcium_fluoride", elem2: "water" }, + "hydrofluoric_acid": { elem1: "calcium_fluoride", elem2: "water" } + } +}; + +/* Calcium hydroxide (slaked lime) */ +elements.calcium_hydroxide = { + color: "#f9fff9", + behavior: behaviors.SOLID, + category: "GraphiteMod", + state: "solid", + density: 2.21, + flammable: false, + reactions: { + "carbon_dioxide": { elem1: "calcium_carbonate", elem2: "water" }, + "hydrofluoric_acid": { elem1: "calcium_fluoride", elem2: "water" }, + "hydrogen_fluoride": { elem1: "calcium_fluoride", elem2: "water" }, + "silicon_tetrafluoride": { elem1: "calcium_fluoride", elem2: "hydrofluoric_acid" } + } +}; + +/* Calcium fluoride (fluorspar) */ +elements.calcium_fluoride = { + color: "#ccccff", + behavior: behaviors.SOLID, + category: "GraphiteMod", + state: "solid", + density: 3.18, + flammable: false, + reactions: { + "acid": { elem1: "hydrofluoric_acid", elem2: "calcium_sulfate" }, + "hydrofluoric_acid": { elem1: "calcium_fluoride", elem2: null }, + "hydrogen_fluoride": { elem1: "calcium_fluoride", elem2: null }, + "molten_silicon_dioxide": { elem1: "calcium_silicate", elem2: null } + } +}; + +/* Calcium silicate (simple placeholder for Ca-silicates) */ +elements.calcium_silicate = { + color: "#ddd8cc", + behavior: behaviors.SOLID, + category: "GraphiteMod", + state: "solid", + density: 2.9, + flammable: false, + reactions: { + "acid": { elem1: "calcium_fluoride", elem2: "silicon_tetrafluoride" }, + "water": { elem1: "calcium_hydroxide", elem2: "silicon_dioxide" }, + "fire": { elem1: "molten_calcium_silicate", elem2: null, tempMin: 1400 }, + "hydrofluoric_acid": { elem1: "calcium_fluoride", elem2: "silicon_tetrafluoride" } + } +}; + +elements.molten_calcium_silicate = { + color: "#f0e6cc", + behavior: behaviors.LIQUID, + category: "GraphiteMod", + state: "liquid", + density: 2.9, + temp: 1400, + stateLow: "calcium_silicate", + flammable: false +}; + +/* Calcium sulfate (gypsum/anhydrite) */ +elements.calcium_sulfate = { + color: "#e6e6e6", + behavior: behaviors.SOLID, + category: "GraphiteMod", + state: "solid", + density: 2.96, + flammable: false, + reactions: { + "water": { elem1: "gypsum", elem2: null }, + "carbon": { elem1: "calcium_sulfide", elem2: "carbon_dioxide", tempMin: 1200 }, + "hydrofluoric_acid": { elem1: "calcium_fluoride", elem2: "acid" }, + "hydrogen_fluoride": { elem1: "calcium_fluoride", elem2: "acid" } + } +}; + +/* Gypsum (hydrated CaSO4) */ +elements.gypsum = { + color: "#f3f3f3", + behavior: behaviors.SOLID, + category: "GraphiteMod", + state: "solid", + density: 2.32, + flammable: false, + reactions: { + "fire": { elem1: "calcium_sulfate", elem2: "water", tempMin: 250 }, + "acid": { elem1: "calcium_sulfate", elem2: "acid" }, + "carbon": { elem1: "calcium_sulfide", elem2: "carbon_dioxide", tempMin: 1200 }, + "water": { elem1: "gypsum", elem2: null } + } +}; + +/* Calcium sulfide (product of high-T reduction) */ +elements.calcium_sulfide = { + color: "#cfa76f", + behavior: behaviors.SOLID, + category: "GraphiteMod", + state: "solid", + density: 2.8, + flammable: false, + reactions: { + "water": { elem1: "hydrogen_sulfide", elem2: null }, + "acid": { elem1: "hydrogen_sulfide", elem2: "calcium_fluoride" }, + "fire": { elem1: "calcium_sulfide", elem2: null }, + "carbon_dioxide": { elem1: "calcium_carbonate", elem2: "sulfur_dioxide" } + } +}; + + +elements.silicon_carbide = { + color: "#2e2e2e", + behavior: behaviors.SOLID, + category: "GraphiteMod", + state: "solid", + density: 3.21, + tempHigh: 2730, + stateHigh: "molten_silicon_carbide", + reactions: { + "oxygen": { elem1: "silicon_dioxide", elem2: "carbon_dioxide", tempMin: 1000 }, + "fluorine": { elem1: "silicon_tetrafluoride", elem2: "carbon_tetrafluoride", tempMin: 500 }, + "hydrofluoric_acid": { elem1: "silicon_tetrafluoride", elem2: "carbon_tetrafluoride" }, + "hydrogen_fluoride": { elem1: "silicon_tetrafluoride", elem2: "carbon_tetrafluoride" } + } +}; + +elements.molten_silicon_carbide = { + color: "#443f3f", + behavior: behaviors.LIQUID, + category: "GraphiteMod", + state: "liquid", + density: 3.2, + temp: 2730, + stateLow: "silicon_carbide", + flammable: false +}; + +/* Paper with graphite (drawing) */ +elements.paper_with_graphite = { + color: "#888888", + behavior: behaviors.SOLID, + category: "GraphiteMod", + state: "solid", + density: 0.8, + flammable: true, + reactions: { + "fire": { elem1: "ash", elem2: "smoke" }, + "oxygen": { elem1: "ash", elem2: "smoke", tempMin: 300 }, + "water": { elem1: "paper", elem2: null }, + "hydrofluoric_acid": { elem1: "ash", elem2: "acid" } + } +}; + +elements.eraser = { + color: "#ffffff", + tool: function(pixel) { + if (pixel.element == "paper_with_graphite") { + pixel.element = "paper" + pixel.color = "#ffffff" + } + }, + category: "tools", +}; + diff --git a/mods/morechemistry.js b/mods/morechemistry.js index 8576022b..25221c1b 100644 --- a/mods/morechemistry.js +++ b/mods/morechemistry.js @@ -1,19 +1,36 @@ /* -Version 2.0.0 +Version 2.1.0 */ -function multiChoice(text, handler, title) { - let pause = false; - if (promptState) { pause = promptState.wasPaused } - else if (paused) { pause = true } - promptState = { - type: "confirm", - text: text, - handler: handler, - title: title || "Are you sure?", - wasPaused: pause - } - showPromptScreen(); - } + +function pixelToggle(pixel, multi = {r:1,g:1,b:1}){ + if(pixel.toggle != undefined){ + pixel.toggle = !pixel.toggle; + let rgb; + if(Array.isArray(elements[pixel.element].color)){ + let elemColor = elements[pixel.element].color[Math.round(Math.random()*elements[pixel.element].color.length)]; + rgb = hexToRGB(elemColor) || getRGB(elemColor); + } else { + let elemColor = elements[pixel.element].color; + rgb = hexToRGB(elemColor) || getRGB(elemColor); + } + let num = 5 - Math.round(Math.random()*10); + if(pixel.toggle){ + for(let key in rgb){ + rgb[key] += (100*multi[key]); + rgb[key] = Math.round(Math.max(Math.min(rgb[key], 255), 0)); + } + pixel.color = `rgb(${rgb.r+num},${rgb.g+num},${rgb.b+num})`; + } + else { + pixel.color = `rgb(${rgb.r+num},${rgb.g+num},${rgb.b+num})`; + } + } +} +function getRGB(rgb){ + let rgb2 = rgb.replace(")", "").replace("rgb(", "").replace(/,/g, "r").split("r") + return { r: parseInt(rgb2[0]), g: parseInt(rgb2[1]), b: parseInt(rgb2[2]) }; +} +elements.cloner.keyInput = "str:clone", elements.ecloner.keyInput = "str:clone", elements.slow_cloner.keyInput = "str:clone", elements.floating_cloner.keyInput = "str:clone"; let xDown = false; elements.copper_sulfate = { behavior: behaviors.POWDER, @@ -57,18 +74,23 @@ elements.copper_sulfate = { tick: function(pixel){ if(pixelTicks-pixel.start == 2 && xDown){ pixel.anhydrous = true; - } - let colour; - let num = Math.round(Math.random()*2); - if(pixel.anhydrous && !["rgb(235,247,250)","rgb(242,248,250)"].includes(pixel.color)){ - pixel.color = ["rgb(235,247,250)","rgb(242,248,250)"][num]; - } else if (!pixel.anhydrous && !['rgb(67,145,253)', 'rgb(0,76,254)'].includes(pixel.color)){ - pixel.color = ['rgb(67,145,253)', 'rgb(0,76,254)'][num]; + let rgb = {r: 235, g: 247, b: 250}; + let num = 6 - (Math.round(Math.random()*12)); + for(let key in rgb){ + rgb[key] += num; + } + pixel.color = `rgb(${rgb.r},${rgb.g},${rgb.b})`; } let multi = (pixel.temp-70)/100; multi = (multi < 0) ? 0 : ((multi > 1) ? 1 : multi); if(Math.random() < 0.05*multi){ pixel.anhydrous = true; + let rgb = {r: 235, g: 247, b: 250}; + let num = 6 - (Math.round(Math.random()*12)); + for(let key in rgb){ + rgb[key] += num; + } + pixel.color = `rgb(${rgb.r},${rgb.g},${rgb.b})`; } if(pixel.anhydrous){ let neighbors = []; @@ -78,12 +100,26 @@ elements.copper_sulfate = { } if(neighbors.includes("air") && pixel.temp < 50 && Math.random() < 0.00035){ pixel.anhydrous = false; + let rgb = (Math.random() > 0.5) ? {r: 67, g: 145, b: 253} : {r: 0, g: 76, b: 254}; + let num = 6 - (Math.round(Math.random()*12)); + for(let key in rgb){ + rgb[key] += num; + } + pixel.color = `rgb(${rgb.r},${rgb.g},${rgb.b})`; + } else if (neighbors.includes("steam") || neighbors.includes("water") || neighbors.includes("salt_water") || neighbors.includes("sugar_water") || neighbors.includes("dirty_water") || neighbors.includes("seltzer") || neighbors.includes("pool_water") || neighbors.includes("slush")){ pixel.anhydrous = false; + let rgb = (Math.random() > 0.5) ? {r: 67, g: 145, b: 253} : {r: 0, g: 76, b: 254}; + let num = 6 - (Math.round(Math.random()*12)); + for(let key in rgb){ + rgb[key] += num; + } + pixel.color = `rgb(${rgb.r},${rgb.g},${rgb.b})`; } } } } +elements.water.ignore = ["copper_sulphate"], elements.steam.ignore = ["copper_sulphate"], elements.pool_water.ignore = ["copper_sulphate", 'pool_ice'], elements.salt_water.ignore = ["copper_sulphate", 'salt_ice'], elements.sugar_water.ignore = ["copper_sulphate", 'sugar_ice'], elements.seltzer.ignore = ["copper_sulphate", 'seltzer_ice'], document.addEventListener("keydown", (e)=>{xDown = (e.key.toLowerCase() == "x") ? true : xDown;}); document.addEventListener("keyup", (e)=>{xDown = (e.key.toLowerCase() == "x") ? false : xDown;}); @@ -94,18 +130,20 @@ elements.toggle_cloner = { color: "#333300", name: "ToggleableCloner", keyInput: "chance", + insulate: 1, properties: { clone: null, toggle: false, chance: 0.0166666667, clickCd: 0, }, - ignore: ["cloner", "toggle_cloner", "floating_cloner", "clone_powder", "slow_cloner", "ecloner", "destroyable_cloner", "destroyable_clone_powder", "ewall", "wall"], + hardness: 1, + ignore: ["drag","unknown", "cloner", "toggle_cloner", "floating_cloner", "clone_powder", "slow_cloner", "ecloner", "destroyable_cloner", "destroyable_clone_powder", "ewall", "wall"], onClicked: function(pixel,element){ if(pixel.clone == null && pixel.clickCd == 0 && dragStart == null){ - pixel.clone = (element == "unknown" || elements.toggle_cloner.ignore.includes(element)) ? pixel.clone : element; - } else if (pixel.clickCd == 0) { + pixel.clone = (elements.toggle_cloner.ignore.includes(element)) ? pixel.clone : element; + } else if (pixel.clickCd == 0 && !shiftDown) { pixel.toggle = !pixel.toggle; if(pixel.toggle){ let rgb = hexToRGB(elements.toggle_cloner.active); @@ -125,14 +163,16 @@ elements.toggle_cloner = { pixel.color = `rgb(${rgb.r},${rgb.g},${rgb.b})`; } } + if(shiftDown && !elements.toggle_cloner.ignore.includes(element)){ + pixel.clone = element; + } if(pixel.clickCd == 0 && dragStart == null){ pixel.clickCd = 20; - console.log(element); }; }, onSelect: function(){ - logMessage("Click on the pixel while adjacent to a clonable pixel to set clone, then click on it to toggle on or off."); + logMessage("Place cloner, select element to clone, click on the pixel to set the clone element, then click on it to toggle on or off. Hold shift when clicking to change the element to the selected element."); }, tick: function(pixel){ if(pixel.clickCd > 0){pixel.clickCd--;} @@ -141,6 +181,7 @@ elements.toggle_cloner = { let x = pixel.x+coords[0], y = pixel.y+coords[1]; if(isEmpty(x,y) && !outOfBounds(x,y)){ createPixel(pixel.clone, x, y); + pixelMap[x][y].temp = pixel.temp; } } } @@ -154,6 +195,48 @@ elements.toggle_cloner = { } }; +elements.multi_toggle_cloner = { + category: "machines", + color: "#283300", + keyInput: "chance", + ignore: ["unknown", "cloner", "toggle_cloner", "floating_cloner", "clone_powder", "slow_cloner", "ecloner", "destroyable_cloner", "destroyable_clone_powder", "ewall", "wall"], + properties: { + cloneElems: [], + toggle: false, + clickCd: 0, + chance: 0.45, + }, + hardness: 1, + insulate: 1, + onClicked: function(pixel, element){ + if(pixel.clickCd == 0 && !shiftDown && dragStart == null){ + pixelToggle(pixel, {r:1.5,g:1.5,b:0}); + pixel.clickCd = 20; + } + if(shiftDown && !elements.multi_toggle_cloner.ignore.includes(element)){ + if(pixel.cloneElems.includes(element)){ + pixel.cloneElems.splice(pixel.cloneElems.indexOf(element), 1); + } else { + pixel.cloneElems.push(element); + } + } + }, + tick: function(pixel){ + for(let coords of adjacentCoords){ + let x = pixel.x+coords[0], y = pixel.y+coords[1]; + if(isEmpty(x,y) && !outOfBounds(x,y) && Math.random() < pixel.chance && pixel.toggle && JSON.stringify(pixel.cloneElems) != "[]"){ + elem = pixel.cloneElems[Math.round(Math.random()*pixel.cloneElems.length)]; + createPixel(elem, x, y); + pixelMap[x][y].temp = pixel.temp; + } + } + pixel.clickCd -= (pixel.clickCd == 0) ? 0 : 1; + }, + onSelect: function(){ + logMessage("Place cloner, then add elements to the clone list by selecting the element and hold down shift while clicking in it, then click on it to toggle on or off. Shift clicking with an element already found in the list will remove it."); + } +} + elements.toggle = { category: "machines", active: "#b8b8b8", @@ -163,6 +246,7 @@ elements.toggle = { toggle: false, clickCd: 0, }, + hardness: 1, onClicked: function(pixel){ if(pixel.clickCd == 0 && dragStart == null){ pixel.toggle = !pixel.toggle; @@ -198,7 +282,37 @@ elements.toggle = { } } - +elements.e_temper = { + category: "machines", + color: "#ffb300", + conduct: 1, + targetTemp: 25, + hardness: 1, + onSelect: function(){ + promptInput("Enter the target temperature:", (In)=>{ + this.targetTemp = parseInt(In) || this.targetTemp; + }, "Temperature Selector", this.targetTemp); + }, + properties: { + targetTemp: null + }, + keyInput: "targetTemp", + tick: function(pixel){ + if(pixel.targetTemp == null){ + pixel.targetTemp = elements.e_temper.targetTemp; + } + + doElectricity(pixel, 1); + for(let coords of adjacentCoords){ + let x = pixel.x+coords[0], y = pixel.y+coords[1]; + let p2 = getPixel(x,y); + if(p2 != null && pixel.charge > 0){ + let difference = pixel.targetTemp-p2.temp; + p2.temp += difference/4; + } + } + } +} elements.toggle_temper = { active: "#ff7b00", @@ -207,6 +321,7 @@ elements.toggle_temper = { category: "machines", targetTemp: 25, keyInput: "targetTemp", + hardness: 1, properties: { toggle: false, clickCd: 0, @@ -260,12 +375,16 @@ elements.multitool = { category: "tools", input: 0, onSelect: function(){ - promptInput("Multitool for morechemistry.js, changes key values for different elements added in morechemistry.js, chance for toggleable cloner, and targetTemp for toggleable temper.", (In)=>{ - this.input = parseFloat(In) || 0; + promptInput("Multitool for morechemistry.js, changes key values for different elements added in morechemistry.js, chance for toggleable cloner, targetTemp for toggleable temper, clone for other cloners, and channel for portals.", (In)=>{ + this.input = In; }, "Multitool Input", this.input); }, tool: function(pixel){ - pixel[elements[pixel.element].keyInput] = this.input; + if(elements[pixel.element].keyInput != undefined){ + let type = (elements[pixel.element].keyInput.startsWith("int:")) ? "int" : (elements[pixel.element].keyInput.startsWith("str:")) ? "string" : "int"; + let In = elements[pixel.element].keyInput.slice(elements[pixel.element].keyInput.indexOf(":")+1, elements[pixel.element].keyInput.length); + pixel[In] = (type == "int") ? parseFloat(this.input) : this.input; + } }, canPlace: false, } @@ -295,6 +414,21 @@ class rangeTool { } } +elements.button = { + category: "machines", + color: "#c7c7c7", + hardness: 1, + onClicked: function(pixel){ + for(let coords of adjacentCoords){ + let x = pixel.x+coords[0], y = pixel.y+coords[1]; + let p = getPixel(x,y); + if(p != null && elements[p.element].conduct){ + p.charge = 1; + } + } + } +} + elements.toggle_mixer = new rangeTool("#212420", (pixel)=>{ let range = mouseRange(pixel.x, pixel.y, pixel.range); let pixels = []; @@ -343,6 +477,7 @@ elements.toggle_mixer = new rangeTool("#212420", (pixel)=>{ }; }); elements.toggle_mixer.inactive = "#212420", elements.toggle_mixer.active = "#93a390", elements.toggle_mixer.movable = false, elements.toggle_mixer.keyInput = "chance"; +elements.toggle_mixer.hardness = 1; elements.toggle_smasher = new rangeTool("#2e2726", (pixel)=>{ let range = mouseRange(pixel.x, pixel.y, pixel.range); @@ -380,3 +515,446 @@ elements.toggle_smasher = new rangeTool("#2e2726", (pixel)=>{ }; }); elements.toggle_smasher.inactive = "#2e2726", elements.toggle_smasher.active = "#bf9e9b", elements.toggle_smasher.movable = false, elements.toggle_smasher.keyInput = "chance"; +elements.toggle_smasher.hardness = 1; + +elements.target_toggle_smasher = new rangeTool("#332422", (pixel)=>{ + let range = mouseRange(pixel.x, pixel.y, pixel.range); + for(let coords of range){ + let p2 = getPixel(coords[0], coords[1]); + if(p2 != null && pixel.toggle && Math.random() < pixel.chance && elements[p2.element].breakInto != undefined && pixel.targetElems.includes(p2.element)){ + let elem = (Array.isArray(elements[p2.element].breakInto)) ? elements[p2.element].breakInto[Math.round(Math.random()*elements[p2.element].breakInto.length)] : elements[p2.element].breakInto; + if(elem != undefined){ + changePixel(p2, elem); + } + } + } + if(pixel.clickCd > 0){pixel.clickCd--;} +}, {range: null, toggle: false, clickCd: 0, chance: 0.35, targetElems: []}, ()=>{ + promptInput("Enter the range for this tool: ", (range)=>{ + console.log(range); + elements.target_toggle_smasher.range = parseInt(range); + logMessage("Place smasher, then add elements to the target list by selecting the element and hold down shift while clicking on the pixel, then click on it to toggle on or off. Shift clicking with an element already found in the list will remove it."); + }, "Enter range", elements.target_toggle_smasher.range); +}, (pixel, elem)=>{ + if(pixel.clickCd == 0 && dragStart == null && !shiftDown){ + pixel.toggle = !pixel.toggle; + pixel.clickCd = 20; + if(pixel.toggle){ + let rgb = hexToRGB(elements.target_toggle_smasher.active); + let num = 5 - (Math.random()*10); + for(let key in rgb){ + rgb[key] += num; + rgb[key] = Math.round(Math.max(Math.min(rgb[key], 255), 0)); + } + pixel.color = `rgb(${rgb.r},${rgb.g},${rgb.b})`; + } else { + let rgb = hexToRGB(elements.target_toggle_smasher.inactive); + let num = 5 - (Math.random()*10); + for(let key in rgb){ + rgb[key] += num; + rgb[key] = Math.round(Math.max(Math.min(rgb[key], 255), 0)); + } + pixel.color = `rgb(${rgb.r},${rgb.g},${rgb.b})`; + } + }; + if(shiftDown && elements[elem].breakInto != undefined){ + if(pixel.targetElems.includes(elem)){ + pixel.targetElems.splice(pixel.targetElems.indexOf(elem), 1); + } else { + pixel.targetElems.push(elem); + } + } +}); +elements.target_toggle_smasher.inactive = "#332422", elements.target_toggle_smasher.active = "#b57a72", elements.target_toggle_smasher.movable = false, elements.target_toggle_smasher.keyInput = "chance"; +elements.target_toggle_smasher.hardness = 1; + +elements.target_toggle_mixer = new rangeTool("#1f291b", (pixel)=>{ + + let range = mouseRange(pixel.x, pixel.y, pixel.range); + let pixels = []; + for(let coords of range){ + let p2 = getPixel(coords[0], coords[1]); + if(p2 != null && pixel.toggle){ + pixels.push(p2); + } + } + for(let p of pixels){ + if(Math.random() < pixel.chance){ + let p2 = pixels[Math.round(Math.random()*pixels.length)]; + if(p != undefined && p2 != undefined && elements[p.element].movable && elements[p2.element].movable && pixel.targetElems.includes(p.element) && pixel.targetElems.includes(p2.element)){ + swapPixels(p, p2); + if(elements[p.element].onMix != undefined){ + elements[p.element].onMix(p); + } + if(elements[p2.element].onMix != undefined){ + elements[p2.element].onMix(p2); + } + } + } + } + if(pixel.clickCd > 0){pixel.clickCd--;} +}, {range: null, toggle: false, clickCd: 0, chance: 0.35, targetElems: []}, ()=>{ + promptInput("Enter the range for this tool: ", (range)=>{ + console.log(range); + elements.target_toggle_mixer.range = parseInt(range); + logMessage("Place mixer, then add elements to the target list by selecting the element and hold down shift while clicking on the pixel, then click on it to toggle on or off. Shift clicking with an element already found in the list will remove it."); + }, "Enter range", elements.target_toggle_mixer.range); +}, (pixel, elem)=>{ + if(pixel.clickCd == 0 && dragStart == null && !shiftDown){ + pixel.toggle = !pixel.toggle; + pixel.clickCd = 20; + if(pixel.toggle){ + let rgb = hexToRGB(elements.target_toggle_mixer.active); + let num = 5 - (Math.random()*10); + for(let key in rgb){ + rgb[key] += num; + rgb[key] = Math.round(Math.max(Math.min(rgb[key], 255), 0)); + } + pixel.color = `rgb(${rgb.r},${rgb.g},${rgb.b})`; + } else { + let rgb = hexToRGB(elements.target_toggle_mixer.inactive); + let num = 5 - (Math.random()*10); + for(let key in rgb){ + rgb[key] += num; + rgb[key] = Math.round(Math.max(Math.min(rgb[key], 255), 0)); + } + pixel.color = `rgb(${rgb.r},${rgb.g},${rgb.b})`; + } + }; + if(shiftDown && elements[elem].movable){ + if(pixel.targetElems.includes(elem)){ + pixel.targetElems.splice(pixel.targetElems.indexOf(elem), 1); + } else { + pixel.targetElems.push(elem); + } + } +}); +elements.target_toggle_mixer.inactive = "#1f291b", elements.target_toggle_mixer.active = "#8cbf7a", elements.target_toggle_mixer.movable = false, elements.target_toggle_mixer.keyInput = "chance"; +elements.target_toggle_mixer.hardness = 1; +elements.target_sensor = { + color: "#afb08b", + conduct: 1, + category: "machines", + properties: { + targetElems: [], + clickCd: 0, + }, + hardness: 1, + onClicked: function(pixel, element){ + if(shiftDown && element != "unknown" && pixel.clickCd == 0){ + if(pixel.targetElems.includes(element)){ + pixel.targetElems.splice(pixel.targetElems.indexOf(element), 1); + pixel.clickCd = 20; + } else { + pixel.targetElems.push(element); + pixel.clickCd = 20; + } + } + }, + tick: function(pixel){ + for(let coords of adjacentCoords){ + let x = pixel.x+coords[0], y = pixel.y+coords[1]; + let p = getPixel(x,y); + if(p != null && pixel.targetElems.includes(p.element)){ + pixel.charge = 1; + doElectricity(pixel,1); + } + } + pixel.clickCd -= (pixel.clickCd > 0) ? 1 : 0; + } +} + +Pixel.prototype.inRange = function(range){ + res = false; + for(let coords of range){ + if(this.x == coords[0] && this.y == coords[1]){ + res = true; + } + } + return res; +} +elements.acid.ignore = elements.acid.ignore.concat(["nitric_acid", "aqua_regia", "chloroauric_acid", "nitrogen_dioxide", "nitric_acid_ice", "nitrogen_dioxide_ice", "acid", "chloroauric_acid", "magnesium_chloride", "magnesium_carbonate", "magnesium_hydroxide", "magnesium", "gallium", "gallium_chloride", "salt", "aluminum", "aluminum_chloride", "target_portal_in"]); +elements.nitric_acid = { + alias: "HNO₃", + behavior: [["XX","DB%5","XX"],["DB%5 AND M2","XX","DB%5 AND M2"],["DB%5 AND M2","DB%10 AND M1","DB%5 AND M2"]], + ignore: elements.acid.ignore, + state: "liquid", + color: ["#f5e7e1", "#f7e8e1", "#f7ebe6"], + tempLow: -42, + stateLow: "nitric_acid_ice", + reactions: { + acid: {elem1: null, elem2: "aqua_regia"}, + }, + density: 1510, + category: "liquids", + tick: function(pixel){ + for(let coords of squareCoords){ + let x = pixel.x+coords[0], y = pixel.y+coords[1]; + let p2 = getPixel(x,y); + if(p2 != null && ["light", "liquid_light", "laser"].includes(p2.element) || Math.random()<(pixel.temp-68)/53){ + let elems = ["nitrogen_dioxide","water", "oxygen"]; + let elem = elems[Math.round(Math.random()*elems.length)]; + while (elem == undefined){ + elem = elems[Math.round(Math.random()*elems.length)]; + } + changePixel(pixel, elem); + } + } + } +} +elements.nitrogen_dioxide = { + alias: "NO₂", + color: ["#6e361f", "#7d3d22", "#873f20", "#9c4935"], + behavior: behaviors.GAS, + state: "gas", + reactions: { + water: {elem1: null, elem2: "nitric_acid"}, + }, + category: "gases", + stateHigh: ["nitrogen", "oxygen"], + tempHigh: 150, + stateLow: "nitrogen_dioxide_ice", + tempLow: -11, +}; + +elements.nitrogen_dioxide_ice = { + color: ["#4f1607", "#4d1709", "#541606", "#471407"], + behavior: behaviors.WALL, + state: "solid", + category: "states", + stateHigh: "nitrogen_dioxide", + tempHigh: -10, +}; + +elements.nitric_acid_ice = { + behavior: behaviors.WALL, + color: ["#f5e7e4", "#f5efed", "#fcfafa"], + state: "solid", + category: "states", + stateHigh: "nitric_acid", + tempHigh: -41 +}; + +elements.aqua_regia = { + alias: "3HCl•HNO₃", + color:["#ffc766", "#f5c36e", "#f7c163", "#ffcd75"], + behavior: [["XX","DB%5","XX"],["DB%5 AND M2","XX","DB%5 AND M2"],["DB%5 AND M2","DB%10 AND M1","DB%5 AND M2"]], + ignore: elements.acid.ignore, + category: "liquids", + state: "liquid", + density: 1210, + reactions: { + gold: {elem1: "chloroauric_acid", elem2: null, chance: 0.15}, + gold_coin: {elem1: "chloroauric_acid", elem2: null, chance: 0.15}, + blue_gold: {elem1: ["chloroauric_acid", "gallium_chloride"], elem2: null, chance: 0.15}, + purple_gold: {elem1: ["chloroauric_acid", "chloroauric_acid", "chloroauric_acid", "aluminum_chloride"], elem2: null, chance: 0.15}, + } +}; +elements.chloroauric_acid = { + color: ["#f7bb2f", "#f5bb33", "#f5b727", "#e8ae25"], + alias: "H(AuCl₄)", + behavior: behaviors.POWDER, + category: "powders", + state: "solid", + density: 3900, + reactions: { + potassium: {elem1: "gold_coin", elem2: "potassium_salt", func: function(pixel){for(let coords of squareCoords){let x=pixel.x+coords[0],y=pixel.y+coords[1]; if(isEmpty(x,y) && !outOfBounds(x,y) && Math.random()<0.25){createPixel("hydrogen", x, y);}}}}, + sodium: {elem1: "gold_coin", elem2: "salt", func: function(pixel){for(let coords of squareCoords){let x=pixel.x+coords[0],y=pixel.y+coords[1]; if(isEmpty(x,y) && !outOfBounds(x,y) && Math.random()<0.25){createPixel("hydrogen", x, y);}}}}, + caustic_potash: {elem1: "gold_coin", elem2: "potassium_salt", func: function(pixel){for(let coords of squareCoords){let x=pixel.x+coords[0],y=pixel.y+coords[1]; if(isEmpty(x,y) && !outOfBounds(x,y) && Math.random()<0.25){createPixel("water", x, y);}}}}, + lye: {elem1: "gold_coin", elem2: "salt", func: function(pixel){for(let coords of squareCoords){let x=pixel.x+coords[0],y=pixel.y+coords[1]; if(isEmpty(x,y) && !outOfBounds(x,y) && Math.random()<0.25){createPixel("water", x, y);}}}}, + magnesium: {elem1: "gold_coin", elem2: "magnesium_chloride", func: function(pixel){for(let coords of squareCoords){let x=pixel.x+coords[0],y=pixel.y+coords[1]; if(isEmpty(x,y) && !outOfBounds(x,y) && Math.random()<0.25){createPixel("hydrogen", x, y);}}}}, + metal_scrap: {elem1: "gold_coin", elem2: "slag", func: function(pixel){for(let coords of squareCoords){let x=pixel.x+coords[0],y=pixel.y+coords[1]; if(isEmpty(x,y) && !outOfBounds(x,y) && Math.random()<0.25){createPixel("hydrogen", x, y);}}}}, + } +}; +elements.magnesium_chloride = { + alias: "MgCl₂", + category: "salts", + behavior: behaviors.POWDER, + state: "solid", + color: ["#f2f2f2", "#f5f5f5", "#ebebeb", "#e6e6e6"], + density: 2320, + reactions: { + baking_soda: {elem1: "magnesium_carbonate", elem2: "salt"}, + lye: {elem1: "magnesium_hydroxide", elem2: "salt"}, + caustic_potash: {elem1: "magnesium_hydroxide", elem2: "potassium_salt"}, + ash: {elem1: "magnesium_carbonate", elem2: ["dust","dust",null,"potassium_salt", "charcoal"]} + } +} +elements.calcium_chloride = { + alias: "CaCl₂", + category: "salts", + density: 2150, + behavior: behaviors.POWDER, + state: "solid", + color: ["#f2f2f2", "#f5f5f5", "#ebebeb", "#e6e6e6"], + density: 2320, + reactions: { + baking_soda: {elem1: "limestone", elem2: "salt"}, + lye: {elem1: "slaked_lime", elem2: "salt"}, + caustic_potash: {elem1: "slaked_lime", elem2: "potassium_salt"}, + ash: {elem1: "limestone", elem2: ["dust","dust",null,"potassium_salt", "charcoal"]}, + epsom_salt: {elem1: "hardened_gypsum", elem2: "magnesium_chloride"}, + carbon_dioxide: {elem1: "limestone", elem2: "chlorine", chance: 0.001, tempMin: 60} + } +} +elements.sodium.reactions.carbon_dioxide = {elem1: "baking_soda", elem2: null}, elements.magnesium.reactions.carbon_dioxide = {elem1: "magnesium_carbonate", elem2:null}; +elements.acid.reactions.magnesium = {elem1: "hydrogen", elem2: "magnesium_chloride"}; +elements.magnesium_carbonate = { + alias: "MgCO₃", + category: "salts", + behavior: behaviors.POWDER, + state: "solid", + color: ["#f2f2f2", "#f5f5f5", "#ebebeb", "#e6e6e6"], + density: 2960, + reactions: { + acid: {elem1: "magnesium_chloride", elem2: ["carbon_dioxide", "foam", "seltzer", "seltzer"]} + } +} +elements.magnesium_hydroxide = { + alias: "Mg(OH)₂", + category: "salts", + behavior: behaviors.POWDER, + state: "solid", + color: ["#f2f2f2", "#f5f5f5", "#ebebeb", "#e6e6e6"], + density: 2340, + reactions: { + acid: {elem1: "magnesium_chloride", elem2: "water"} + } +} +elements.hardened_gypsum = { + alias: "CaSO₄•2H₂O", + color: ["#f2f2f2", "#f5f5f5", "#ebebeb", "#e6e6e6"], + category: "solids", + state: "solid", + behavior: behaviors.WALL, + density: 2320, + breakInto: "gypsum", +} +elements.gypsum = { + alias: "CaSO₄•2H₂O", + color: ["#d1d1d1", "#d6d6d6", "#cccbca", "#cfcdca", "#bfbebb"], + category: "powders", + state: "solid", + behavior: behaviors.STURDYPOWDER, + density: 2420, + tick: function(pixel){ + let chance = (pixel.temp-18)/100*(pixel.temp/40)*((pixelTicks-pixel.start)/250); + if(Math.random(){ + elements.target_portal_in.channel = parseInt(input); + }, "Portal Channel", elements.target_portal_in.channel) + }, + tick: function(pixel){ + pixel.clickCd -= (pixel.clickCd == 0) ? 0 : 1; + if(pixel.channel == null){ + pixel.channel = elements.target_portal_in.channel; + } + if(pixel.out == null){ + for(p2 of currentPixels){ + if(p2.element == "portal_out" && p2.channel == pixel.channel){ + let adjacent = this.checkAdjacent(p2); + if(adjacent != false){ + pixel.out = p2; + break; + } + } + } + } + for(let coords of adjacentCoords){ + let x = pixel.x+coords[0], y = pixel.y+coords[1]; + if(!isEmpty(x,y) && !outOfBounds(x,y) && elements[pixelMap[x][y].element].movable && pixel.out != undefined){ + let pixel2 = getPixel(x,y); + let spots = this.checkAdjacent(pixel.out); + if(spots != false && Array.isArray(spots)){ + let num = Math.round(Math.random()*spots.length); + while(spots[num] == undefined){ + num = Math.round(Math.random()*spots.length); + } + if(pixel.targetElems.includes(pixel2.element)){ + movePixel(pixel2, spots[num][0], spots[num][1]); + } + } + } + } + } +}