383 lines
14 KiB
JavaScript
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";
|