sandboxels/mods/morechemistry.js

383 lines
14 KiB
JavaScript

/*
Version 2.0.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();
}
let xDown = false;
elements.copper_sulfate = {
behavior: behaviors.POWDER,
color: ["#4391fd","#004cfe"],
reactions: {
ant: {"elem2": "dead_bug"},
fly: {"elem2": "dead_bug"},
firefly: {"elem2": "dead_bug"},
stink_bug: {"elem2": "dead_bug"},
bee: {"elem2": "dead_bug"},
termite: {"elem2": "dead_bug"},
spider: {"elem2": "dead_bug"},
plant: {"elem2": "dead_plant"},
grass: {"elem2": "dead_plant"},
algae: {"elem2": null},
kelp: {"elem2": "water"},
coral: {"elem2": "water"},
mushroom_cap: {"elem2": null},
mushroom_stalk: {"elem2": null},
mushroom_gill: {"elem2": null},
mushroom_spore: {"elem2": null},
zinc: {"stain2": "#2A1210"},
fire: {"elem1": null,"elem2": "poison_gas","chance": 0.1},
sugar: {"elem1": "oxidized_copper","elem2": null,"color1": ["#CB3D3D","#A6292B","#6E1B1B"]}
},
tempHigh: 110,
fireColor: [
"#91d106",
"#feff97",
"#248e01"
],
state: "solid",
density: 3600,
hidden: true,
category: "powders",
id: 509,
movable: true,
properties: {
anhydrous: false
},
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 multi = (pixel.temp-70)/100;
multi = (multi < 0) ? 0 : ((multi > 1) ? 1 : multi);
if(Math.random() < 0.05*multi){
pixel.anhydrous = true;
}
if(pixel.anhydrous){
let neighbors = [];
for(let coords of squareCoords){
let x = pixel.x+coords[0], y = pixel.y+coords[1];
neighbors[neighbors.length] = (isEmpty(x,y) && !outOfBounds(x,y)) ? "air" : (!outOfBounds(x,y)) ? pixelMap[x][y].element : undefined;
}
if(neighbors.includes("air") && pixel.temp < 50 && Math.random() < 0.00035){
pixel.anhydrous = false;
} 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;
}
}
}
}
document.addEventListener("keydown", (e)=>{xDown = (e.key.toLowerCase() == "x") ? true : xDown;});
document.addEventListener("keyup", (e)=>{xDown = (e.key.toLowerCase() == "x") ? false : xDown;});
elements.toggle_cloner = {
category: "machines",
active: "#fbff03",
inactive: "#333300",
color: "#333300",
name: "ToggleableCloner",
keyInput: "chance",
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"],
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.toggle = !pixel.toggle;
if(pixel.toggle){
let rgb = hexToRGB(elements.toggle_cloner.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.toggle_cloner.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(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.");
},
tick: function(pixel){
if(pixel.clickCd > 0){pixel.clickCd--;}
if(![null, undefined].includes(pixel.clone) && pixel.toggle == true && Math.random() < pixel.chance){
for(let coords of adjacentCoords){
let x = pixel.x+coords[0], y = pixel.y+coords[1];
if(isEmpty(x,y) && !outOfBounds(x,y)){
createPixel(pixel.clone, x, y);
}
}
}
for(let coords of adjacentCoords){
let x = pixel.x+coords[0], y = pixel.y+coords[1];
let p2 = getPixel(x,y);
if(p2 != null && p2.element == pixel.element && (p2.clone == null && pixel.clone != null)){
p2.clone = pixel.clone;
}
}
}
};
elements.toggle = {
category: "machines",
active: "#b8b8b8",
inactive: "#2b2b2b",
color: "#2b2b2b",
properties: {
toggle: false,
clickCd: 0,
},
onClicked: function(pixel){
if(pixel.clickCd == 0 && dragStart == null){
pixel.toggle = !pixel.toggle;
pixel.clickCd = 20;
if(pixel.toggle){
let rgb = hexToRGB(elements.toggle.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.toggle.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})`;
}
};
},
tick: function(pixel){
if(pixel.clickCd != 0){pixel.clickCd--;}
for(let coords of adjacentCoords){
let x = pixel.x+coords[0], y = pixel.y+coords[1];
let p2 = getPixel(x,y);
if(p2 != null && elements[p2.element].conduct == 1 && pixel.toggle){
p2.charge = 1;
}
}
}
}
elements.toggle_temper = {
active: "#ff7b00",
inactive: "#261200",
color: "#261200",
category: "machines",
targetTemp: 25,
keyInput: "targetTemp",
properties: {
toggle: false,
clickCd: 0,
targetTemp: null,
},
onClicked: function(pixel){
if(pixel.clickCd == 0 && dragStart == null){
pixel.toggle = !pixel.toggle;
pixel.clickCd = 20;
if(pixel.toggle){
let rgb = hexToRGB(elements.toggle_temper.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.toggle_temper.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})`;
}
};
},
onSelect: function(){
promptInput("Enter the target temperature:", (In)=>{
this.targetTemp = parseInt(In) || this.targetTemp;
}, "Temperature Selector", this.targetTemp);
},
tick: function(pixel){
if(pixel.targetTemp == null){
pixel.targetTemp = this.targetTemp;
}
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.toggle){
let difference = pixel.targetTemp-p2.temp;
p2.temp += difference/4;
}
}
if(pixel.clickCd > 0){pixel.clickCd--;};
},
}
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;
}, "Multitool Input", this.input);
},
tool: function(pixel){
pixel[elements[pixel.element].keyInput] = this.input;
},
canPlace: false,
}
class rangeTool {
constructor(color, func, properties = false, onSelect = false, onClicked = false){
this.category = "machines";
this.properties = (properties == false) ? { range: null } : properties;
this.color = color;
this.range = 0;
this.onSelect = (onSelect == false) ? ()=>{promptInput("Enter the range for this tool: ", (range)=>{this.range = parseInt(range);}, "Tool Range", this.range)} : onSelect;
this.onClicked = (onClicked == false) ? undefined : onClicked;
this.func = func;
}
tick = function(pixel){
if(pixel.range == null){
pixel.range = elements[pixel.element].range;
} else {
let pixelRange = mouseRange(pixel.x, pixel.y, pixel.range);
for(let coords of pixelRange){
let p2 = getPixel(coords[0], coords[1]);
if(p2 != null){
elements[pixel.element].func(p2);
}
}
}
}
}
elements.toggle_mixer = new rangeTool("#212420", (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){
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}, false, (pixel)=>{
if(pixel.clickCd == 0 && dragStart == null){
pixel.toggle = !pixel.toggle;
pixel.clickCd = 20;
if(pixel.toggle){
let rgb = hexToRGB(elements.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.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})`;
}
};
});
elements.toggle_mixer.inactive = "#212420", elements.toggle_mixer.active = "#93a390", elements.toggle_mixer.movable = false, elements.toggle_mixer.keyInput = "chance";
elements.toggle_smasher = new rangeTool("#2e2726", (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){
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}, false, (pixel)=>{
if(pixel.clickCd == 0 && dragStart == null){
pixel.toggle = !pixel.toggle;
pixel.clickCd = 20;
if(pixel.toggle){
let rgb = hexToRGB(elements.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.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})`;
}
};
});
elements.toggle_smasher.inactive = "#2e2726", elements.toggle_smasher.active = "#bf9e9b", elements.toggle_smasher.movable = false, elements.toggle_smasher.keyInput = "chance";