From bbf26d6270d96d29bc6400f8d15633165e68cd48 Mon Sep 17 00:00:00 2001 From: gordoncchildress-maker Date: Wed, 20 Aug 2025 16:18:34 -0700 Subject: [PATCH 1/5] Create boompaste.js --- mods/boompaste.js | 76 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 76 insertions(+) create mode 100644 mods/boompaste.js 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"], +} From df5ac754259c3e4840aa781423924ec28135275d Mon Sep 17 00:00:00 2001 From: JustARandomPlayerInSandBoxels Date: Fri, 22 Aug 2025 11:45:48 +0800 Subject: [PATCH 2/5] A graphite mod! Graphite will oxidize (reacts with oxygen) to carbon dioxide! And, will reacts to Fluorine (In mod element). If Graphite reacts to fluorine it will get Carbon Tetrafluoride (In mod element.) --- Graphite.js | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 Graphite.js diff --git a/Graphite.js b/Graphite.js new file mode 100644 index 00000000..d185b346 --- /dev/null +++ b/Graphite.js @@ -0,0 +1,37 @@ +elements.graphite = { + color: "#030104", + behavior: behaviors.POWDER, + category: "land", + state: "solid", + tempHigh: 3600, + stateHigh: "charcoal", + reactions: { + "oxygen": { elem1: "carbon_dioxide", elem2: null, tempMin: 700 }, + "fluorine": { elem1: "carbon_tetrafluoride", elem2: null } + } +}; + +elements.fluorine = { + color: "#b5e61d", + behavior: behaviors.GAS, + category: "gas", + state: "gas", + density: 1.696, + reactions: { + "graphite": {elem1: "carbon_tetrafluoride", elem2: null } +}, + temp: 25, + flammable: false +}; + +elements.carbon_tetrafluoride = { + color: "#ccffff", + behavior: behaviors.GAS, + category: "gas", + density: 3.72, + flammable: false, + reactions: { + "fire": { elem1: "carbon_dioxide", elem2: "fluorine", tempMin: 2000 } + } +}; + \ No newline at end of file From 4064cddda5539056000400fd16af71009da75436 Mon Sep 17 00:00:00 2001 From: JustARandomPlayerInSandBoxels Date: Mon, 25 Aug 2025 14:16:51 +0800 Subject: [PATCH 3/5] Update Graphite.js So many NEW elements!! --- Graphite.js | 480 ++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 451 insertions(+), 29 deletions(-) diff --git a/Graphite.js b/Graphite.js index d185b346..6ef3a81e 100644 --- a/Graphite.js +++ b/Graphite.js @@ -1,37 +1,459 @@ elements.graphite = { - color: "#030104", - behavior: behaviors.POWDER, - category: "land", - state: "solid", - tempHigh: 3600, - stateHigh: "charcoal", - reactions: { - "oxygen": { elem1: "carbon_dioxide", elem2: null, tempMin: 700 }, - "fluorine": { elem1: "carbon_tetrafluoride", elem2: null } - } + 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: "gas", - state: "gas", - density: 1.696, - reactions: { - "graphite": {elem1: "carbon_tetrafluoride", elem2: null } -}, - temp: 25, - flammable: false + 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: "gas", - density: 3.72, - flammable: false, - reactions: { - "fire": { elem1: "carbon_dioxide", elem2: "fluorine", tempMin: 2000 } - } + 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", }; - \ No newline at end of file From 26e239c6492cb94c4e11c000246cc9062a2835a9 Mon Sep 17 00:00:00 2001 From: Alexthetransfem <124483815+theenchantedsword@users.noreply.github.com> Date: Sun, 31 Aug 2025 15:57:41 -0500 Subject: [PATCH 4/5] Update morechemistry.js --- mods/morechemistry.js | 638 ++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 608 insertions(+), 30 deletions(-) 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]); + } + } + } + } + } +} From 6c2d5e9c6623afb255f27efb7466645705c2c538 Mon Sep 17 00:00:00 2001 From: slweeb <91897291+slweeb@users.noreply.github.com> Date: Mon, 1 Sep 2025 16:51:07 -0400 Subject: [PATCH 5/5] Update and rename Graphite.js to mods/graphite.js --- Graphite.js => mods/graphite.js | 1 + 1 file changed, 1 insertion(+) rename Graphite.js => mods/graphite.js (96%) diff --git a/Graphite.js b/mods/graphite.js similarity index 96% rename from Graphite.js rename to mods/graphite.js index 6ef3a81e..ceb5ec6c 100644 --- a/Graphite.js +++ b/mods/graphite.js @@ -457,3 +457,4 @@ elements.eraser = { }, category: "tools", }; +