Merge branch 'main' of https://github.com/R74nCom/sandboxels
This commit is contained in:
commit
589ca5fb5d
|
|
@ -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"],
|
||||
}
|
||||
|
|
@ -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",
|
||||
};
|
||||
|
||||
|
|
@ -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()<chance){
|
||||
changePixel(pixel, "hardened_gypsum");
|
||||
}
|
||||
}
|
||||
}
|
||||
elements.gallium_chloride = {
|
||||
category: "salts",
|
||||
alas: "GaCl₃",
|
||||
behavior: behaviors.POWDER,
|
||||
state: "solid",
|
||||
color: ["#ffffff", "#fcfcfc", "#ffffff", "#ededed"],
|
||||
density: 2470,
|
||||
reactions: {
|
||||
water: {elem1: "gallium", elem2: "acid"},
|
||||
steam: {elem1: "gallium", elem2: "acid_gas"},
|
||||
salt_water: {elem1: "gallium", elem2: ["acid", "salt"]},
|
||||
seltzer: {elem1: "gallium", elem2: ["acid", "acid", "acid", "carbon_dioxide"]},
|
||||
dirty_water: {elem1: "gallium", elem2: ["acid", "acid", "dirt"]},
|
||||
sugar_water: {elem1: "gallium", elem2: ["acid", "sugar"]},
|
||||
aluminum: {elem1: "gallium", elem2: "aluminum_chloride"},
|
||||
sodium: {elem1: "gallium", elem2: "salt"},
|
||||
potassium: {elem1: "gallium", elem2: "potassium_salt"},
|
||||
magnesium: {elem1: "gallium", elem2: "magnesium_chloride"},
|
||||
},
|
||||
tick: 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.0015){
|
||||
createPixel("acid",x,y);
|
||||
changePixel(pixel, "gallium");
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
elements.aluminum_chloride = {
|
||||
category: "salts",
|
||||
color: ["#fcd732", "#fad42d", "#f5d133", "#fad83e"],
|
||||
alias: "AlCl₃",
|
||||
behavior: behaviors.POWDER,
|
||||
state: "solid",
|
||||
density: 2480,
|
||||
|
||||
|
||||
}
|
||||
elements.acid.reactions.aluminum = {elem1: "hydrogen", elem2: "aluminum_chloride"};
|
||||
elements.acid.reactions.purple_gold = {elem1: ["aluminum_chloride", "aluminum_chloride", "hydrogen"], elem2: "gold"};
|
||||
elements.acid.reactions.blue_gold = {elem1: ["gallium_chloride", "gallium_chloride", "hydrogen"], elem2: "gold"};
|
||||
elements.portal_in.keyInput = "channel", elements.portal_out.keyInput = "channel";
|
||||
elements.target_portal_in = {
|
||||
keyInput: "channel",
|
||||
category: "machines",
|
||||
state: "solid",
|
||||
behavior: behaviors.WALL,
|
||||
channel: 0,
|
||||
movable: false,
|
||||
hardness: 1,
|
||||
checkAdjacent: function(pixel){
|
||||
let adjacent = [];
|
||||
for(let coords of adjacentCoords){
|
||||
let x = pixel.x+coords[0], y = pixel.y+coords[1];
|
||||
if(isEmpty(x,y) && !outOfBounds(x,y)){
|
||||
adjacent.push([x,y]);
|
||||
}
|
||||
}
|
||||
return (adjacent.length == 0) ? false : adjacent;
|
||||
},
|
||||
color: ["#f7ab05", "#fab011", "#faaf0c", "#f5aa0a", "#ffaf03"],
|
||||
properties: {clickCd: 0, targetElems: [], channel: null, out: null},
|
||||
onClicked: function(pixel, elem){
|
||||
if(pixel.clickCd == 0){
|
||||
if(elem != null){
|
||||
if(pixel.targetElems.includes(elem)){
|
||||
pixel.targetElems.splice(pixel.targetElems.indexOf(elem), 1);
|
||||
} else {
|
||||
pixel.targetElems.push(elem);
|
||||
}
|
||||
}
|
||||
pixel.clickCd = 20;
|
||||
}
|
||||
},
|
||||
onSelect: function(){
|
||||
promptInput("Enter channel for the portal: ", (input)=>{
|
||||
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]);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue