diff --git a/mod-list.html b/mod-list.html
index 754017b0..6777ef38 100644
--- a/mod-list.html
+++ b/mod-list.html
@@ -217,10 +217,10 @@
| clf3.js | Chlorine Trifluoride | Alice |
| cmur.js | CharsonsModUno (???) | CharsonBurensen |
| debrisable.js | Expands the number of breakable elements, changes erosion, and adds way to craft certain elements from breaking other elements | Nekonico |
+| eklegems.js | Large amouunt of gemstones and other crystals | ekle24 |
| fire_extinguisher.js | Fire extinguisher blocks and realistic firefighting foam to put out nearly anything | Dr_Lego |
| fire_mod.js | Various properties to change fire behavior and radioactive fire | Alice |
| fire_slime.js | Pyrogenic version of slime | Alice |
-| Gemstones.js | Gemstones | Schweeny |
| glenn_gases.js | Most gases from the Glenn's Gases mod into Sandboxels | Alice |
| grav_mudstones.js | Various forms of mudstone with different gravities | Alice |
| halogen.js | The missing halogens | nousernamefound |
@@ -335,6 +335,7 @@
| colonies.js | Rockets that contain settlers to terraform a planet | Nekonico |
| crimson.js | Elements relating to the Crimson from Terraria | Alice |
| dogs.js | Simple dog and dog food | hedera-ivy |
+| eklegems.js | Large amouunt of gemstones and other crystals | ekle24 |
| fairy_chain.js | Way too many fairies to fey_and_more.js | Alice |
| fantastic_creatures.js | Various animals | Melecie |
| fantasy_elements.js | Fantasy creatures and substances | pixelegend4 |
diff --git a/mods/PRNGworldgenlib.js b/mods/PRNGworldgenlib.js
index 39aa13d3..14b110ab 100644
--- a/mods/PRNGworldgenlib.js
+++ b/mods/PRNGworldgenlib.js
@@ -1,11 +1,7 @@
-/*Version 1.0.0 Pseudorandom world generator*/
-function pseudorandom(key, max = 10){
- let num = max;
- for(let i = 0; i < key; i++){
- num = ((num+(max*0.6))**1.8312312-2) % (max+1);
- }
- return num;
-}
+/*Version 1.1.0 Pseudorandom world generator*/
+function pseudorandom(key, num, max = 1){
+ return (Math.log(key)*(num*Math.log(1625.4986772154357))) % max;
+};
eLists.STONEELEMS = ["rock", "gravel", "tuff", "basalt", "rock_wall"];
let oreChances = {
diamond: 0.045,
@@ -31,13 +27,17 @@ class biome {
if(!paused){togglePause();}
let fraction = seed/(2**32);
for(let level of this.yLevels){
- for(let x = 0; x <= width; x++){
- let heightIncrease = (fraction < 0.5) ? -3*(pseudorandom(((1-fraction)*x)*100)/11) : 3*(pseudorandom((fraction*x)*100)/11);
+ for(let x = 0; x <= width+2; x++){
+ //console.log(x);
+ let heightIncrease = (fraction < 0.5) ? -3*pseudorandom(((1-fraction)*(x+1))*(100*pseudorandom(x, 1241, 500)), 1) : 3*pseudorandom(((fraction)*(x+1))*(100*pseudorandom(x, 1241, 500)), 1);
let h = level + heightIncrease;
for(let y = 0; y <= h; y++){
+ //console.log(x,y);
let elementsArr = this.layers[this.yLevels.indexOf(level)];
- let elem = elementsArr[Math.floor(((fraction < 0.5) ? elementsArr.length*pseudorandom(((1-fraction)*((x*y)*13))/11) : elementsArr.length*(pseudorandom((fraction*(x*y*17)))/11))%elementsArr.length)];
- let placed = tryCreate(elem, x, height-y);
+ let elem = elementsArr[Math.floor(elementsArr.length*pseudorandom((1-fraction)*pseudorandom((x+15)*(y+5), 65343, 500), 2) % elementsArr.length)] || elementsArr[0];
+ //if(x == 0 || x == 1){console.log(elem);};
+ let placed = tryCreate(elem, x-2, height-y);
+
if(placed != null && this.temp != null){
placed.temp = this.temp;
}
@@ -75,9 +75,9 @@ class biome {
generateOreVeins(seed, multi = 1){
for(let x = 0; x <= width; x++){
for(let y = 0; y <= height; y++){
- let c = pseudorandom((seed/2**32)*x*y)/11;
+ let c = pseudorandom((seed/2**32)*pseudorandom(x*y, 657345, 600), 3);
if(c <= 0.3){
- let c2 = pseudorandom((seed/2**32)*(x*y)*3)/11;
+ let c2 = pseudorandom((seed/2**32)*pseudorandom(x*y, 98755, 750), 4);
let ore;
for(let e in oreChances){
if(c2 <= oreChances[e]){
@@ -96,11 +96,11 @@ class biome {
x2 += coords[0];
y2 += coords[1];
let p2 = getPixel(x2,y2);
- if(p2 != null && eLists.STONEELEMS.includes(p2.element) && (pseudorandom((seed/2**32)*x2*y2)/11) < (0.35*multi)){
+ if(p2 != null && eLists.STONEELEMS.includes(p2.element) && (pseudorandom((seed/2**32)*pseudorandom(x2,y2, 350), x2*y2) < (0.35*multi))){
hasStone = true;
tryCreate(ore, x2, y2, true);
}
- if((pseudorandom((seed/2**32)*(x2*y2)*8)/11) < 0.15){
+ if(pseudorandom((seed/2**32)*x2*y2, 6) < 0.15){
a = false;
break;
}
@@ -118,9 +118,9 @@ class biome {
}
let biomes = {
plains: new biome([["rock", "rock", "rock", "gravel"], ["dirt", "dirt", "dirt", "dirt", "mud", "gravel"], ["grass","flower_seed","grass","grass","grass","grass","sapling","grass","grass","grass","grass","grass","grass","grass","grass"]], [25, 38, 40]),
- desert: new biome([["rock", "rock", "rock", "gravel"], ["rock", "packed_sand","rock", "packed_sand", "sand"], ["sand"], [null, null, null, null, null, null, null, null, null, "cactus"]], [17, 26, 40, 42]),
- savanna: new biome([["rock", "rock", "rock", "gravel"], ["dirt", "dirt", "clay_soil", "dirt", "dirt"], ["grass",null,null, null, null, null, "sapling",null,null,null,null]], [25, 38, 40], {lc: ["#6fde26", "#8eed34", "#8cdb42", "#7bd12a", "#96e81c", "#a9e64e", "#a0d94c", "#a9d63e"], wc: ["#bdab7e", "#b09c6a", "#ab996d", "#998a63", "#917959", "#877051"]}),
- tundra: new biome([["rock", "rock", "rock", "gravel"], ["dirt", "dirt", "rock", "permafrost"], ["permafrost", "permafrost", "permafrost", "permafrost", "permafrost", "permafrost", "ice", "snow"], [null,null,null,null,null,"pinecone",null,null,null,null,null,null]], [25, 30, 38, 40], {temp: -15}),
+ desert: new biome([["rock", "rock", "rock", "gravel"], ["rock", "packed_sand","rock", "packed_sand", "sand"], ["sand"], [null, null, null, null, null, null, null, null, null, "cactus"]], [17, 26, 40, 42], {vMulti: 1.2}),
+ savanna: new biome([["rock", "rock", "rock", "gravel"], ["dirt", "dirt", "clay_soil", "dirt", "dirt"], ["grass",null,null, null, null, null, "sapling",null,null,null,null]], [25, 38, 40], {lc: ["#6fde26", "#8eed34", "#8cdb42", "#7bd12a", "#96e81c", "#a9e64e", "#a0d94c", "#a9d63e"], wc: ["#bdab7e", "#b09c6a", "#ab996d", "#998a63", "#917959", "#877051"], vMulti: 1.5}),
+ tundra: new biome([["rock", "rock", "rock", "gravel"], ["dirt", "dirt", "rock", "permafrost"], ["permafrost", "permafrost", "permafrost", "permafrost", "permafrost", "permafrost", "ice", "snow"], [null,null,null,null,null,"pinecone",null,null,null,null,null,null]], [25, 30, 38, 40], {temp: -15, vMulti: 2}),
}
let seed = Math.random()*(2**32);
enabledMods.forEach((item)=>{
@@ -128,7 +128,7 @@ enabledMods.forEach((item)=>{
biomes.orchard = new biome([["rock","rock","rock","gravel"], ["dirt", "dirt", "dirt", "rock", "gravel"], ["dirt", "dirt", "dirt", "dirt", "mud", "clay_soil", "gravel"]], [25, 30, 38], {afterFunc: (seed)=>{
for(let i = 0; i < width; i++){
console.log(i, width);
- let elem = ((pseudorandom((seed/2**32)*i)/11) < 0.15) ? plants.tree[(Math.round(Math.random()*plants.tree.length)) % plants.tree.length] : "grass";
+ let elem = (pseudorandom((seed/2**32)*pseudorandom(i, 6544, 500), 7) < 0.15) ? plants.tree[(Math.round(Math.random()*plants.tree.length)) % plants.tree.length] : "grass";
if(elem != undefined && elem != "grass"){elem += "_seed"};
elem = (elem == undefined) ? "apple_seed" : elem;
tryCreate(elem, i, 42);
@@ -140,15 +140,34 @@ elements.PRNGgenerate = {
category: "tools",
onSelect: function(){
let arr = [];
- Object.keys(biomes).forEach(function(b){arr.push(b);})
+ let txt = shiftDown;
+ Object.keys(biomes).forEach(function(b){arr.push(b);});
+ txt = (arr.length >= 7) ? true : txt;
promptInput("Leave blank to generate new seed. Your current seed is: " + seed, function(i){
- seed = parseInt(i) || Math.random()*(2**32);
+ seed = (i != null && i.toLowerCase() == "c") ? seed : parseFloat(i) || Math.random()*(2**32);
seed = seed % (2**32);
- promptChoose("", arr, (choice)=>{
- biomes[choice].generate(seed);
- promptText("World generation complete.");
- selectElement('dirt');
- }, "Select a biome to generate: ");
+ if(!txt){
+ promptChoose("", arr, (choice)=>{
+ biomes[choice].generate(seed);
+ promptText("World generation complete.");
+ selectElement('dirt');
+ }, "Select a biome to generate: ");
+ } else {
+ let str = "";
+ for(let key in biomes){
+ str += `${key},`;
+ }
+ str = str.replace(/^,|,$/g, '');
+ promptInput("Enter the name of a biome (caps-insensetive) \nBiomes Available: " + str, function(inp){
+ if(!arr.includes(inp.toLowerCase())){
+ promptText("Invalid selection.");
+ }else {
+ biomes[inp.toLowerCase()].generate(seed);
+ promptText("World generation complete.");
+ selectElement('dirt');
+ }
+ }, "Enter Biome")
+ }
}, "Enter seed:");
}
}
diff --git a/mods/black_hole.js b/mods/black_hole.js
new file mode 100644
index 00000000..dd64dc6c
--- /dev/null
+++ b/mods/black_hole.js
@@ -0,0 +1,43 @@
+elements.black_hole = {
+ color: "#000000",
+ tick: function(pixel) {
+ // Attract other pixels within a 9-pixel radius
+ for (let dx = -9; dx <= 9; dx++) {
+ for (let dy = -9; dy <= 9; dy++) {
+ let x = pixel.x + dx;
+ let y = pixel.y + dy;
+
+ // Ignore out-of-bounds
+ if (!isEmpty(x, y, true)) {
+ let other = pixelMap[x]?.[y];
+ if (other && other.element !== "black_hole") {
+ // Attraction: move other pixel towards the black hole
+ let stepX = Math.sign(pixel.x - other.x);
+ let stepY = Math.sign(pixel.y - other.y);
+ tryMove(other, other.x + stepX, other.y + stepY);
+ }
+ }
+ }
+ }
+
+ // Convert touching pixels into black holes
+ const dirs = [
+ [1, 0], [-1, 0], [0, 1], [0, -1],
+ [1, 1], [-1, -1], [1, -1], [-1, 1]
+ ];
+ for (let d of dirs) {
+ let nx = pixel.x + d[0];
+ let ny = pixel.y + d[1];
+ if (isEmpty(nx, ny, true)) continue;
+
+ let touching = pixelMap[nx]?.[ny];
+ if (touching && touching.element !== "black_hole") {
+ changePixel(touching, "black_hole");
+ }
+ }
+ },
+ category: "special",
+ state: "solid",
+ density: 99999, // Very dense (optional)
+ hardness: 1, // Can't be destroyed easily
+};
diff --git a/mods/cubesstuff.js b/mods/cubesstuff.js
index ccf3b56f..f623c65e 100644
--- a/mods/cubesstuff.js
+++ b/mods/cubesstuff.js
@@ -3231,7 +3231,7 @@ elements.element_line = {
}
}
if (pixel.dir === 1) {
- if (!tryMove(pixel, pixel.x, pixel.y - 1, pixel.clone)) {
+ if (!tryMove(pixel, pixel.x, pixel.y + 1, pixel.clone)) {
changePixel(pixel, pixel.clone, true)
}
}
@@ -3241,7 +3241,7 @@ elements.element_line = {
}
}
if (pixel.dir === 3) {
- if (!tryMove(pixel, pixel.x, pixel.y + 1, pixel.clone)) {
+ if (!tryMove(pixel, pixel.x, pixel.y - 1, pixel.clone)) {
changePixel(pixel, pixel.clone, true)
}
}
@@ -3326,3 +3326,4 @@ elements.replace_all_of_element = {
}
+
diff --git a/mods/daybreak.js b/mods/daybreak.js
deleted file mode 100644
index fb85815c..00000000
--- a/mods/daybreak.js
+++ /dev/null
@@ -1,426 +0,0 @@
-elements.beautiful_sun = {
- color: "#c12600",
- tick: function(pixel) {
- // minimum 1726
- // maximum 7726
- if (pixel.eclipse) { pixel.color = pixelColorPick(pixel,"#f68656"); var c=0.01}
- else if (pixel.temp < 1500) { pixel.color = pixelColorPick(pixel,"#7a4e43"); }
- else if (pixel.temp < 3600) { pixel.color = pixelColorPick(pixel,"#ffbdbd"); var c=0.05 }
- else if (pixel.temp < 7000) { pixel.color = pixelColorPick(pixel,"#c12600"); var c=0.1 }
- else if (pixel.temp < 11000) { pixel.color = pixelColorPick(pixel,"#ffb09c"); var c=0.25 }
- else if (pixel.temp < 28000) { pixel.color = pixelColorPick(pixel,"#f7fff5"); var c=0.5 }
- else { pixel.color = pixelColorPick(pixel,"#c3bdff"); var c=0.4 }
- if (pixel.temp < 1500) { var c=0 }
- for (var i = 0; i < adjacentCoords.length; i++) {
- var x = pixel.x+adjacentCoords[i][0];
- var y = pixel.y+adjacentCoords[i][1];
- if (isEmpty(x,y)) {
- if (Math.random() > c) {continue}
- createPixel("beautiful_light", x, y);
- pixelMap[x][y].color = pixel.color;
- }
- else if (!outOfBounds(x,y)) {
- var newPixel = pixelMap[x][y];
- if (elements[newPixel.element].id === elements.beautiful_sun.id) {
- if (pixel.eclipse) { newPixel.eclipse = true }
- if (pixel.temp!==newPixel.temp) {
- var avg = (pixel.temp + newPixel.temp)/2;
- pixel.temp = avg;
- newPixel.temp = avg;
- pixelTempCheck(pixel);
- pixelTempCheck(newPixel);
- }
- }
- else if (elements[newPixel.element].id === elements.sun.id) {
- changePixel(newPixel, "beautiful_sun");
- }
- }
- }
- },
- tool: function(pixel) {
- if (pixel.element === "light") {
- deletePixel(pixel.x,pixel.y);
- }
- if (pixel.element === "beautiful_light") {
- deletePixel(pixel.x,pixel.y);
- }
- },
- canPlace: true,
- reactions: {
- "hydrogen": { elem2:"helium", temp1:5 },
- "helium": { elem2:"carbon_dioxide", temp1:5, tempMax:3600 },
- "carbon_dioxide": { elem2:"neon", temp1:5, tempMax:1800 },
- "sun": { elem2:"beautiful_sun", },
- "light": { elem2:"beautiful_light" },
- },
- temp: 5504,
- tempLow: -100,
- stateLow: "supernova",
- category: "brokenday",
- state: "gas",
- //density: 1408,
- insulate: true,
- noMix: true,
- alias: "hateful_star",
- movable: false
-},
-
-elements.beautiful_light = {
- hidden: true,
- name: "light",
- color: "#c12600",
- tick: function(pixel) {
- if (Math.random() < 0.01) {
- deletePixel(pixel.x,pixel.y);
- return;
- }
- if (pixel.bx===undefined) {
- // choose 1, 0, or -1
- pixel.bx = Math.random() < 0.5 ? 1 : Math.random() < 0.5 ? 0 : -1;
- pixel.by = Math.random() < 0.5 ? 1 : Math.random() < 0.5 ? 0 : -1;
- // if both are 0, make one of them 1 or -1
- if (pixel.bx===0 && pixel.by===0) {
- if (Math.random() < 0.5) { pixel.bx = Math.random() < 0.5 ? 1 : -1; }
- else { pixel.by = Math.random() < 0.5 ? 1 : -1; }
- }
- }
- // move and invert direction if hit
- if (pixel.bx && !tryMove(pixel, pixel.x+pixel.bx, pixel.y)) {
- var newX = pixel.x + pixel.bx;
- if (!isEmpty(newX, pixel.y, true)) {
- var newPixel = pixelMap[pixel.x+pixel.bx][pixel.y];
- if (!elements[newPixel.element].insulate) {
- newPixel.temp += 1;
- pixelTempCheck(newPixel);
- }
- if (!elements.light.reactions[newPixel.element]) {
- pixel.color = newPixel.color;
- }
- else if (!elements.beautiful_light.reactions[newPixel.element]) {
- pixel.color = newPixel.color;
- }
- }
- pixel.bx = -pixel.bx;
- }
- if (pixel.by && !tryMove(pixel, pixel.x, pixel.y+pixel.by)) {
- var newY = pixel.y + pixel.by;
- if (!isEmpty(pixel.x, newY, true)) {
- var newPixel = pixelMap[pixel.x][pixel.y+pixel.by];
- if (!elements[newPixel.element].insulate) {
- newPixel.temp += 0.05;
- pixelTempCheck(newPixel);
- }
- if (!elements.light.reactions[newPixel.element]) {
- pixel.color = newPixel.color;
- }
- else if (!elements.beautiful_light.reactions[newPixel.element]) {
- pixel.color = newPixel.color;
- }
- }
- pixel.by = -pixel.by;
- }
- },
- reactions: {
- "glass": { "color1":["#ff0000","#ff8800","#ffff00","#00ff00","#00ffff","#0000ff","#ff00ff"] },
- "glass_shard": { "color1":["#ff0000","#ff8800","#ffff00","#00ff00","#00ffff","#0000ff","#ff00ff"] },
- "rad_glass": { "color1":["#9f6060","#9f8260","#9f9f60","#609f60","#609f9f","#60609f","#9f609f"] },
- "rad_shard": { "color1":["#9f6060","#9f8260","#9f9f60","#609f60","#609f9f","#60609f","#9f609f"] },
- "steam": { "color1":["#ff0000","#ff8800","#ffff00","#00ff00","#00ffff","#0000ff","#ff00ff"] },
- "rain_cloud": { "color1":["#ff0000","#ff8800","#ffff00","#00ff00","#00ffff","#0000ff","#ff00ff"] },
- "cloud": { "color1":["#ff0000","#ff8800","#ffff00","#00ff00","#00ffff","#0000ff","#ff00ff"] },
- "smog": { "color1":["#9f6060","#9f8260","#9f9f60","#609f60","#609f9f","#60609f","#9f609f"] },
- "ice": { "color1":"#c2fff9" },
- "rime": { "color1":"#c2fff9" },
- "water": { "color1":"#a1bac9" },
- "salt_water": { "color1":"#a1bac9" },
- "sugar_water": { "color1":"#a1bac9" },
- "dirty_water": { "color1":"#a1c9a8" },
- "seltzer": { "color1":"#c2fff9" },
- "diamond": { "color1":["#c2c5ff","#c2d9ff"] },
- "rainbow": { "color1":["#ff0000","#ff8800","#ffff00","#00ff00","#00ffff","#0000ff","#ff00ff"] },
- "static": { "color1":["#ffffff","#bdbdbd","#808080","#424242","#1c1c1c"] },
- "sun": { elem2:"beautiful_sun", },
- "light": { elem2:"beautiful_light" },
- "meat": { elem2:"fused_organism" },
- "head": { elem2:"melted_human" },
- "body": { elem2:"melted_human" },
- "dead_bug": { elem2:"melted_insect" },
- "worm": { elem2:"melted_insect" },
- "ant": { color2:"#5E0B04", elem2:"melted_insect" },
- "bee": { elem2:"melted_insect" },
- "fly": { elem2:"melted_insect" },
- "firefly": { elem2:"melted_insect" },
- "stinkbug": { elem2:"melted_insect" },
- "slug": { color2:["#997e12","#997e12","#997e12","#997e12","#997e12","#997e12","#403314","#403314","#403314","#403314","#403314","#403314","#124a44"], elem2:"melted_insect" },
- "snail": { color2:"#5c3104", elem2:"melted_insect", chance:0.5 },
- "tree_branch": { elem2:"wood" },
- "plant": { elem2:"melted_plant" },
- "grass": { elem2:"melted_plant" },
- "evergreen": { color2:"#006300", elem2:"melted_plant" },
- "pistil": { elem2:"melted_plant" },
- "petal": { color2:["#ff0000","#ff8800","#ffff00","#88ff00","#00ff00","#00ff88","#00ffff","#0088ff","#0000ff","#8800ff","#ff00ff"], elem2:"melted_plant" },
- "bamboo": { elem2:"melted_plant" },
- "bamboo_plant": { elem2:"melted_plant" },
- "cactus": { elem2:"melted_plant" },
- "corn": { color2:["#f8d223","#d6ba2a","#f7f5ba","#dbd281","#cdb12d"], elem2:"melted_plant" },
- "wheat": { color2:["#f1b569","#edb864","#de9c45","#c2853d"], elem2:"melted_plant" },
- "dead_plant": { elem2:"melted_plant" },
- "sapling": { elem2:"melted_plant" },
- "pinecone": { color2:["#5c3e33","#472f27","#31211b"], elem2:"melted_plant" },
- "bird": { color2:"#997457", elem2:"melted_animal" },
- "rat": { color2:["#a698a9","#8c7d82","#ccc3cf"], elem2:"melted_animal" },
- "fish": { elem2:"melted_fish", chance:0.2 },
- "tadpole": { color2:"#87b574", elem2:"melted_fish", chance:0.2 },
- "frog": { color2:"#607300", elem2:"melted_fish", chance:0.2 },
- },
- temp: 35,
- tempLow: -273,
- stateLow: ["liquid_light",null],
- stateLowColorMultiplier: 0.8,
- category: "brokenday",
- state: "gas",
- density: 0.00001,
- ignoreAir: true,
- insulate: true
-},
-
-elements.melted_human = {
- color: ["#f3e7db","#eadaba","#d7bd96","#a07e56"],
- behavior: behaviors.LIQUID,
- viscosity: 7500,
- reactions: {
- "oxygen": { elem2:"carbon_dioxide", chance:0.5 },
- "meat": { elem2:null, chance:0.1 },
- "cooked_meat": { elem2:null, chance:0.1 },
- "sun": { elem2:"beautiful_sun", elem1:"cooked_meat" },
- "light": { elem2:"beautiful_light" },
- "dead_bug": { color2:"#CEC5B9", elem2:"fused_organism", chance:0.1 },
- "ant": { color2:"#D2B6AB", elem2:"fused_organism", chance:0.2 },
- "bee": { color2:"#E9DBAA", elem2:"fused_organism", chance:0.2 },
- "fly": { color2:"#CEC5B9", elem2:"fused_organism", chance:0.2 },
- "firefly": { color2:"#CEC5B9", elem2:"fused_organism", chance:0.2 },
- "stinkbug": { color2:"#CEC5B9", elem2:"fused_organism", chance:0.2 },
- "slug": { color2:["#DFD0AE","#E5D6C7"], elem2:"fused_organism", chance:0.2 },
- "snail": { color2:"#E5D6C7", elem2:"fused_organism", chance:0.15 },
- "head": { elem2:"melted_human", chance:0.1 },
- "body": { elem2:"melted_human", chance:0.1 },
- "bird": { color2:"#DAC8B7", elem2:"fused_organism", chance:0.1 },
- "rat": { color2:["#E2D5D0","#EADFD8"], elem2:"fused_organism", chance:0.1 },
- "fish": { color2:"#E3D1BC", elem2:"fused_organism", chance:0.2 },
- "tadpole": { color2:"#DBDCC4", elem2:"fused_organism", chance:0.2 },
- "frog": { color2:"#D2CDAA", elem2:"fused_organism", chance:0.2 },
- "melted_fish": { color2:"#E3D1BC",elem2:"fused_organism", chance:0.1 },
- "melted_animal": { color2:["#E2D5D0","#EADFD8","#DAC8B7"], elem2:"fused_organism", chance:0.1 },
- "melted_insect": { color2:"#CEC5B9", elem2:"fused_organism", chance:0.1 },
- },
- tempHigh: 300,
- stateHigh: "cooked_meat",
- tempLow: -20,
- stateLow: "frozen_meat",
- burn: 10,
- burnTime: 300,
- burnInto: "cooked_meat",
- state: "liquid",
- density: 1900,
- category: "brokenday",
-},
-
-elements.melted_animal = {
- color: ["#997457","#a698a9"],
- behavior: behaviors.LIQUID,
- viscosity: 7500,
- reactions: {
- "oxygen": { elem2:"carbon_dioxide", chance:0.5 },
- "meat": { elem2:"fused_organism", chance:0.1 },
- "sun": { elem2:"beautiful_sun", elem1:"cooked_meat" },
- "light": { elem2:"beautiful_light" },
- "dead_bug": { color2:"#CEC5B9", elem2:"fused_organism", chance:0.1 },
- "ant": { color2:"#D2B6AB", elem2:"fused_organism", chance:0.2 },
- "bee": { color2:"#E9DBAA", elem2:"fused_organism", chance:0.2 },
- "fly": { color2:"#CEC5B9", elem2:"fused_organism", chance:0.2 },
- "firefly": { color2:"#CEC5B9", elem2:"fused_organism", chance:0.2 },
- "stinkbug": { color2:"#CEC5B9", elem2:"fused_organism", chance:0.2 },
- "slug": { color2:["#DFD0AE","#E5D6C7"], elem2:"fused_organism", chance:0.2 },
- "snail": { color2:"#E5D6C7", elem2:"fused_organism", chance:0.15 },
- "head": { color2:["#F1E4D4","#EDDECC"], elem2:"fused_organism", chance:0.1 },
- "body": { color2:["#F1E4D4","#EDDECC"], elem2:"fused_organism", chance:0.1 },
- "bird": { color2:"#997457", elem2:"melted_animal", chance:0.2 },
- "rat": { color2:["#a698a9","#8c7d82","#ccc3cf"], elem2:"melted_animal", chance:0.2 },
- "fish": { color2:"#E3D1BC", elem2:"fused_organism", chance:0.2 },
- "tadpole": { color2:"#DBDCC4", elem2:"fused_organism", chance:0.2 },
- "frog": { color2:"#D2CDAA", elem2:"fused_organism", chance:0.2 },
- "melted_fish": { color2:"#E3D1BC",elem2:"fused_organism", chance:0.1 },
- "melted_human": { color2:["#F1E4D4","#EDDECC"], elem2:"fused_organism", chance:0.1 },
- "melted_insect": { color2:"#CEC5B9", elem2:"fused_organism", chance:0.1 },
- },
- tempHigh: 275,
- stateHigh: "cooked_meat",
- tempLow: -20,
- stateLow: "frozen_meat",
- burn: 10,
- burnTime: 300,
- burnInto: "cooked_meat",
- state: "liquid",
- density: 900,
- category: "brokenday",
-},
-
-elements.melted_fish = {
- color: "#ac8650",
- behavior: [
- "XX|XX|SW:water,salt_water,sugar_water,dirty_water,seltzer,pool_water,primordial_soup%5",
- "M2%0.5|FX%0.5|M2%0.5 AND BO",
- "M2%10|M1|M2%10 AND SW:water,salt_water,sugar_water,dirty_water,seltzer,pool_water,primordial_soup%14",
- ],
- reactions: {
- "oxygen": { elem2:"carbon_dioxide", chance:0.5 },
- "sun": { elem2:"beautiful_sun", elem1:"cooked_meat" },
- "light": { elem2:"beautiful_light" },
- "dead_bug": { color2:"#CEC5B9", elem2:"fused_organism", chance:0.1 },
- "ant": { color2:"#D2B6AB", elem2:"fused_organism", chance:0.2 },
- "bee": { color2:"#E9DBAA", elem2:"fused_organism", chance:0.2 },
- "fly": { color2:"#CEC5B9", elem2:"fused_organism", chance:0.2 },
- "firefly": { color2:"#CEC5B9", elem2:"fused_organism", chance:0.2 },
- "stinkbug": { color2:"#CEC5B9", elem2:"fused_organism", chance:0.2 },
- "head": { color2:["#F1E4D4","#EDDECC"], elem2:"fused_organism", chance:0.1 },
- "body": { color2:["#F1E4D4","#EDDECC"], elem2:"fused_organism", chance:0.1 },
- "bird": { color2:"#DAC8B7", elem2:"fused_organism", chance:0.2 },
- "rat": { color2:["#E2D5D0","#EADFD8"], elem2:"fused_organism", chance:0.2 },
- "slug": { color2:["#DFD0AE","#E5D6C7"], elem2:"fused_organism", chance:0.2 },
- "snail": { color2:"#E5D6C7", elem2:"fused_organism", chance:0.15 },
- "fish": { elem2:"melted_fish", chance:0.2 },
- "tadpole": { color2:"#87b574", elem2:"melted_fish", chance:0.2 },
- "frog": { color2:"#607300", elem2:"melted_fish", chance:0.2 },
- "melted_animal": { color2:["#E2D5D0","#EADFD8","#DAC8B7"], elem2:"fused_organism", chance:0.1 },
- "melted_human": { color2:["#F1E4D4","#EDDECC"], elem2:"fused_organism", chance:0.1 },
- "melted_insect": { color2:"#CEC5B9", elem2:"fused_organism", chance:0.1 },
- },
- tempHigh: 275,
- stateHigh: "cooked_meat",
- tempLow: -20,
- stateLow: "frozen_meat",
- burn: 10,
- burnTime: 300,
- burnInto: "cooked_meat",
- state: "liquid",
- density: 800,
- category: "brokenday",
-},
-
-elements.melted_insect = {
- color: ["#4c4e42","#5e0b04","#4c4e42","#5e0b04","#56482d","#52472c","#635443"],
- behavior: behaviors.LIQUID,
- viscosity: 4500,
- reactions: {
- "meat": { elem2:"fused_organism", chance:0.1 },
- "cooked_meat": { elem2:"fused_organism", chance:0.1 },
- "sun": { elem2:"beautiful_sun", elem1:"cooked_meat" },
- "light": { elem2:"beautiful_light" },
- "dead_bug": { elem2:"melted_insect", chance:0.1 },
- "ant": { color2:"#5E0B04", elem2:"melted_insect", chance:0.2 },
- "bee": { color2:"#c4b100", elem2:"melted_insect", chance:0.2 },
- "fly": { elem2:"melted_insect", chance:0.2 },
- "firefly": { elem2:"melted_insect", chance:0.2 },
- "stinkbug": { elem2:"melted_insect", chance:0.2 },
- "slug": { color2:["#997e12","#997e12","#997e12","#997e12","#997e12","#997e12","#403314","#403314","#403314","#403314","#403314","#403314","#124a44"], elem2:"melted_insect", chance:0.2 },
- "snail": { color2:"#5c3104", elem2:"melted_insect", chance:0.15 },
- "fish": { color2:"#E3D1BC", elem2:"fused_organism", chance:0.2 },
- "tadpole": { color2:"#DBDCC4", elem2:"fused_organism", chance:0.2 },
- "frog": { color2:"#D2CDAA", elem2:"fused_organism", chance:0.2 },
- "head": { color2:["#F1E4D4","#EDDECC"], elem2:"fused_organism", chance:0.1 },
- "body": { color2:["#F1E4D4","#EDDECC"], elem2:"fused_organism", chance:0.1 },
- "melted_human": { color2:["#F1E4D4","#EDDECC"], elem2:"fused_organism", chance:0.1 },
- "bird": { color2:"#DAC8B7", elem2:"fused_organism", chance:0.1 },
- "rat": { color2:["#E2D5D0","#EADFD8"], elem2:"fused_organism", chance:0.1 },
- "melted_animal": { color2:["#E2D5D0","#EADFD8","#DAC8B7"], elem2:"fused_organism", chance:0.1 },
- "melted_fish": { color2:"#E3D1BC",elem2:"fused_organism", chance:0.1 },
- },
- tempHigh: 100,
- stateHigh: "dead_bug",
- tempLow: -20,
- stateLow: "dead_bug",
- burn: 10,
- burnTime: 150,
- burnInto: "ash",
- state: "liquid",
- density: 500,
- category: "brokenday",
-},
-
-elements.melted_plant = {
- color: ["#00bf00","#439809","#258b08","#118511","#127b12","#136d14"],
- behavior: behaviors.LIQUID,
- viscosity: 50000,
- reactions: {
- "sun": { elem2:"beautiful_sun", elem1:"dead_plant" },
- "light": { elem2:"beautiful_light" },
- "carbon_dioxide": { elem2:"oxygen" },
- "tree_branch": { elem2:"wood" },
- "plant": { elem2:"melted_plant", chance:0.2 },
- "grass": { elem2:"melted_plant", chance:0.2 },
- "evergreen": { color2:"#006300", elem2:"melted_plant", chance:0.2 },
- "pistil": { elem2:"melted_plant", chance:0.2 },
- "petal": { color2:["#CC9978","#CD8C6F","#BE785E","#CC9978","#CD8C6F","#BE785E","#A9D475","#5AF353","#8E5FA5"], elem2:"melted_plant", chance:0.1 },
- "bamboo": { elem2:"melted_plant", chance:0.1 },
- "bamboo_plant": { elem2:"melted_plant", chance:0.1 },
- "cactus": { elem2:"melted_plant", chance:0.1 },
- "corn": { color2:["#f8d223","#d6ba2a","#f7f5ba","#dbd281","#cdb12d"], elem2:"melted_plant", chance:0.1 },
- "wheat": { color2:["#f1b569","#edb864","#de9c45","#c2853d"], elem2:"melted_plant", chance:0.1 },
- "dead_plant": { elem2:"melted_plant", chance:0.1 },
- "sapling": { elem2:"melted_plant", chance:0.05 },
- "pinecone": { color2:["#5c3e33","#472f27","#31211b"], elem2:"melted_plant", chance:0.05 },
- },
- tempHigh: 250,
- stateHigh: "dead_plant",
- tempLow: -20,
- stateLow: "frozen_plant",
- burn: 10,
- burnTime: 200,
- burnInto: ["dead_plant","fire","fire","fire","ash"],
- state: "liquid",
- density: 1200,
- category: "brokenday",
-};
-
-elements.fused_organism = {
- color: ["#E5D6C7","#f7ead0"],
- behavior: behaviors.LIQUID,
- viscosity: 6000,
- reactions: {
- "meat": { elem2:"fused_organism", chance:0.1 },
- "cooked_meat": { elem2:"fused_organism", chance:0.1 },
- "sun": { elem2:"beautiful_sun", elem1:"cooked_meat" },
- "light": { elem2:"beautiful_light" },
- "dead_bug": { color2:"#CEC5B9", elem2:"fused_organism", chance:0.1 },
- "ant": { color2:"#D2B6AB", elem2:"fused_organism", chance:0.2 },
- "bee": { color2:"#E9DBAA", elem2:"fused_organism", chance:0.2 },
- "fly": { color2:"#CEC5B9", elem2:"fused_organism", chance:0.2 },
- "firefly": { color2:"#CEC5B9", elem2:"fused_organism", chance:0.2 },
- "stinkbug": { color2:"#CEC5B9", elem2:"fused_organism", chance:0.2 },
- "slug": { color2:["#DFD0AE","#E5D6C7"], elem2:"fused_organism", chance:0.2 },
- "snail": { color2:"#E5D6C7", elem2:"fused_organism", chance:0.15 },
- "head": { color2:["#F1E4D4","#EDDECC"], elem2:"fused_organism", chance:0.1 },
- "body": { color2:["#F1E4D4","#EDDECC"], elem2:"fused_organism", chance:0.1 },
- "melted_human": { color2:["#F1E4D4","#EDDECC"], elem2:"fused_organism", chance:0.1 },
- "melted_insect": { color2:"#CEC5B9", elem2:"fused_organism", chance:0.1 },
- "bird": { color2:"#DAC8B7", elem2:"fused_organism", chance:0.1 },
- "rat": { color2:["#E2D5D0","#EADFD8"], elem2:"fused_organism", chance:0.1 },
- "fish": { color2:"#E3D1BC", elem2:"fused_organism", chance:0.2 },
- "tadpole": { color2:"#DBDCC4", elem2:"fused_organism", chance:0.2 },
- "frog": { color2:"#D2CDAA", elem2:"fused_organism", chance:0.2 },
- "melted_animal": { color2:["#E2D5D0","#EADFD8","#DAC8B7"], elem2:"fused_organism", chance:0.1 },
- "melted_fish": { color2:"#E3D1BC", elem2:"fused_organism", chance:0.1 },
- },
- tempHigh: 300,
- stateHigh: "cooked_meat",
- tempLow: -20,
- stateLow: "frozen_meat",
- burn: 10,
- burnTime: 400,
- burnInto: "cooked_meat",
- state: "liquid",
- density: 2000,
- category: "brokenday",
-};
-
-HighNumber = "36 41 20 36 46 20 36 41 20 36 46 20 32 30 20 33 44 20 32 30 20 36 37 20 36 31 20 37 39"
diff --git a/mods/elementsManager.js b/mods/elementsManager.js
index 064f2df3..e118628e 100644
--- a/mods/elementsManager.js
+++ b/mods/elementsManager.js
@@ -1,4 +1,4 @@
-if (enabledMods.includes("mods/betterMenuScreens.js")) {
+dependOn("betterMenuScreens.js", () => {
const properties = {
meta: [
{name: "name", type: "string", viewOnly: true, required: true},
@@ -1209,8 +1209,4 @@ if (enabledMods.includes("mods/betterMenuScreens.js")) {
}
runAfterLoadList.push(cssInject, loadChanges);
-} else {
- enabledMods.unshift("mods/betterMenuScreens.js");
- localStorage.setItem("enabledMods", JSON.stringify(enabledMods));
- window.location.reload();
-}
+}, true);
\ No newline at end of file
diff --git a/mods/morechemistry.js b/mods/morechemistry.js
index 5008b2e5..bedb5260 100644
--- a/mods/morechemistry.js
+++ b/mods/morechemistry.js
@@ -1,5 +1,5 @@
/*
-*Version 2.2.1
+*Version 2.2.2
*/
dependOn("orchidslibrary.js", ()=>{
@@ -683,23 +683,38 @@ dependOn("orchidslibrary.js", ()=>{
for(let coords of adjacentCoords){
let x = pixel.x+coords[0], y = pixel.y+coords[1];
let p2 = getPixel(x,y);
- let ignore = false;
- for(let item of elements[pixel.element].ignore){
+ //let ignore = false;
+ /*for(let item of elements[pixel.element].ignore){
if(p2 != null && item.startsWith("*")&&p2.element.endsWith(item.split("*")[1])){
ignore = true;
} else if (p2 != null && item.endsWith("*")&&p2.element.startsWith(item.split("*")[0])){
ignore = true;
+ } else if(p2 != null){
+ ignore = (elements[pixel.element].ignore.includes(p2.element)) ? true : ignore;
+ }
+ }*/
+ if(p2 != null){
+ let ignore = elements[pixel.element].ignore.some(item=>{
+ let res = false;
+ if(p2.element === item){
+ res = true;
+ } else if(item.startsWith("*") && p2.element.endsWith(item.slice(1))) {
+ res = true;
+ } else if(item.endsWith("*") && p2.element.startsWith(item.slice(0,-1))){
+ res = true;
}
+ return res;
+ });
+ if(!ignore){
+ deletePixel(x,y);
+ deletePixel(pixel.x, pixel.y);
}
- if(p2 != null && !(elements[pixel.element].ignore.includes(p2.element) || ignore || p2.element == pixel.element)){
- deletePixel(x,y);
- deletePixel(pixel.x, pixel.y);
}
}
}
elements.acid.behavior = behaviors.LIQUID;
elements.acid.tick = acidTick;
- elements.acid.ignore = elements.acid.ignore.concat(["nitric_acid", "aqua_regia", "nitrogen_dioxide", "nitric_acid_ice", "nitrogen_dioxide_ice", "acid", "chloroauric_acid", "*chloride", "*carbonate", "*acetate", "*sulfate", "*gallium", "*hydroxide", "salt", "*aluminum", "target_portal_in", "*magnesium", "*copper", "*iron", "*calcium", "sulfuric_acid", "*vinegar", "*gypsum", "*wall", "epsom_salt", "*platinum", "chloroplatinic_acid", "*sulfur*"]);
+ elements.acid.ignore = elements.acid.ignore.concat(["nitric_acid", "aqua_regia", "nitrogen_dioxide", "nitric_acid_ice", "nitrogen_dioxide_ice", "acid", "chloroauric_acid", "*chloride", "*carbonate", "*acetate", "*sulfate", "*gallium", "*hydroxide", "salt", "*aluminum", "target_portal_in", "*magnesium", "*copper*", "*iron", "*calcium", "sulfuric_acid", "*vinegar", "*gypsum", "*wall", "epsom_salt", "platinum", "chloroplatinic_acid", "*sulfur*", "wall", "porcelain", "plastic", "glass", "*sulfate", "*nitrate"]);
elements.nitric_acid = {
alias: "HNO₃",
behavior: behaviors.LIQUID,
@@ -710,6 +725,12 @@ dependOn("orchidslibrary.js", ()=>{
stateLow: "nitric_acid_ice",
reactions: {
acid: {elem1: null, elem2: "aqua_regia"},
+ copper: {elem1: "hydrogen", elem2: "copper_nitrate"},
+ sodium: {elem1: "hydrogen", elem2: "sodium_nitrate"},
+ aluminum: {elem1: "hydrogen", elem2: "aluminum_nitrate"},
+ potassium: {elem1: "hydrogen", elem2: "potassium_nitrate"},
+ calcium: {elem1: "hydrogen", elem2: "calcium_nitrate"},
+ magnesium: {elem1: "hydrogen", elem2: "magnesium_nitrate"},
},
density: 1510,
category: "liquids",
@@ -873,6 +894,8 @@ dependOn("orchidslibrary.js", ()=>{
density: 2960,
reactions: {
acid: {elem1: "magnesium_chloride", elem2: ["carbon_dioxide", "foam", "seltzer", "seltzer"]},
+ sulfuric_acid: {elem1: "epsom_salt", elem2: ["carbon_dioxide", "foam", "seltzer", "seltzer"]},
+ nitric_acid: {elem1: "magnesium_nitrate", elem2: ["carbon_dioxide", "foam", "seltzer", "seltzer"]},
vinegar: {elem1: "magnesium_acetate", elem2: ["carbon_dioxide", "foam", "seltzer", "seltzer"]}
}
}
@@ -1140,11 +1163,11 @@ dependOn("orchidslibrary.js", ()=>{
alias: "CuCl₂",
solubility: {water: 0.743},
reactions: {
- sodium: {elem1: "copper", elem2: "sodium_acetate"},
- potassium: {elem1: "copper", elem2: "potassium_acetate"},
- magnesium: {elem1: "copper", elem2: "magnesium_acetate"},
- calcium: {elem1: "copper", elem2: "calcium_acetate"},
- aluminum: {elem1: "copper", elem2: "aluminum_acetate"},
+ sodium: {elem1: "copper", elem2: "salt"},
+ potassium: {elem1: "copper", elem2: "potassium_salt"},
+ magnesium: {elem1: "copper", elem2: "magnesium_chloride"},
+ calcium: {elem1: "copper", elem2: "calcium_chloride"},
+ aluminum: {elem1: "copper", elem2: "aluminum_chloride"},
wood: {stain2: "#043023"},
},
properties: {
@@ -1554,4 +1577,188 @@ dependOn("orchidslibrary.js", ()=>{
stateLow: "bismuth",
temp: 270,
};
+
+ elements.copper_nitrate = {
+ density: 3050,
+ tempHigh: 145,
+ stateHigh: ["oxidized_copper", "nitrogen_dioxide", "nitrogen_dioxide"],
+ color: ["#1717ff", "#2121ff", "#1b1bf5", "#0f0ff2", "#0707f7"],
+ behavior: behaviors.POWDER,
+ state: "solid",
+ category: "salts",
+ alias: "Cu(NO₃)₂",
+ solubility: {water: 1.25},
+ reactions: {
+ sodium: {elem1: "copper", elem2: "sodium_nitrate"},
+ potassium: {elem1: "copper", elem2: "potassium_nitrate"},
+ calcium: {elem1: "copper", elem2: "calcium_nitrate"},
+ aluminum: {elem1: "copper", elem2: "aluminum_nitrate"},
+ wood: {stain2: "#043023"},
+ ash: {elem1: "copper_carbonate", elem2: "potassium_nitrate"},
+ baking_soda: {elem1: "copper_carbonate", elem2: "sodium_nitrate"},
+ acid: {elem1: "copper_chloride", elem2: "nitric_acid"},
+ sulfuric_acid: {elem1: "copper_sulfate", elem2: "nitric_acid"},
+ },
+ properties: {
+ anhydrous: false
+ },
+ fireColor: "#19abff",
+ tick: function(pixel){
+ if(pixelTicks-pixel.start == 2 && xDown){
+ pixel.anhydrous = true;
+ let rgb = {r: 51, g: 158, b: 61};
+ 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: 51, g: 158, b: 61};
+ 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 = [];
+ 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;
+ let rgb = (Math.random() > 0.5) ? {r: 7, g: 7, b: 247} : {r: 26, g: 26, b: 240};
+ 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: 7, g: 7, b: 247} : {r: 26, g: 26, b: 240};
+ 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.sodium_nitrate = {
+ color: ["#f5f5f5", "#e8e8e8", "#ededed", "#e3e3e3"],
+ density: 2260,
+ category: "salts",
+ tempHigh: 650,
+ stateHigh: ["sodium", "nitrogen_dioxide"],
+ reactions: {
+ ash: {elem1: "baking_soda", elem2: "potassium_nitrate"},
+ potassium: {elem1: "sodium", elem2: "potassium_nitrate"},
+ //sulfuric_acid: {elem1: "sodium_sulfate", elem2: "nitric_acid"},
+ acid: {elem1: "salt", elem2: "nitric_acid"},
+ },
+ solubility: {water: 0.86},
+ alias: "NaNO₃",
+ behavior: behaviors.POWDER
+ };
+
+ elements.potassium_nitrate = {
+ color: ["#f5f5f5", "#e8e8e8", "#ededed", "#e3e3e3"],
+ density: 2106,
+ category: "salts",
+ tempHigh: 800,
+ stateHigh: ["potassium", "nitrogen_dioxide"],
+ reactions: {
+ //sulfuric_acid: {elem1: "potassium_sulfate", elem2: "nitric_acid"},
+ acid: {elem1: "potassium_salt", elem2: "nitric_acid"},
+ },
+ solubility: {water: 0.316},
+ alias: "KNO₃",
+ behavior: behaviors.POWDER
+ };
+ elements.magnesium_nitrate = {
+ color: ["#f5f5f5", "#e8e8e8", "#ededed", "#e3e3e3"],
+ density: 2300,
+ category: "salts",
+ tempHigh: 290,
+ stateHigh: ["magnesium", "nitrogen_dioxide"],
+ reactions: {
+ potassium: {elem1: "magnesium", elem2: "potassium_nitrate"},
+ sodium: {elem1: "magnesium", elem2: "sodium_nitrate"},
+ sulfuric_acid: {elem1: "epsom_salt", elem2: "nitric_acid"},
+ acid: {elem1: "magnesium_chloride", elem2: "nitric_acid"},
+ },
+ solubility: {water: 0.42},
+ alias: "Mg(NO₃)₂",
+ behavior: behaviors.POWDER
+ };
+ elements.calcium_nitrate = {
+ color: ["#f5f5f5", "#e8e8e8", "#ededed", "#e3e3e3"],
+ density: 2504,
+ category: "salts",
+ tempHigh: 650,
+ stateHigh: ["calcium", "nitrogen_dioxide"],
+ reactions: {
+ potassium: {elem1: "calcium", elem2: "potassium_nitrate"},
+ sodium: {elem1: "calcium", elem2: "sodium_nitrate"},
+ magnesium: {elem1: "calcium", elem2: "magnesium_nitrate"},
+ sulfuric_acid: {elem1: "gypsum", elem2: "nitric_acid"},
+ acid: {elem1: "calcium_chloride", elem2: "nitric_acid"},
+ },
+ solubility: {water: 1.21},
+ alias: "Ca(NO₃)₂",
+ behavior: behaviors.POWDER
+ };
+ elements.aluminum_nitrate = {
+ color: ["#f5f5f5", "#e8e8e8", "#ededed", "#e3e3e3"],
+ density: 1720,
+ category: "salts",
+ tempHigh: 150,
+ stateHigh: ["aluminum", "nitrogen_dioxide"],
+ reactions: {
+ sodium: {elem1: "aluminum", elem2: "sodium_nitrate"},
+ potassium: {elem1: "aluminum", elem2: "potassium_nitrate"},
+ calcium: {elem1: "aluminum", elem2: "calcium_nitrate"},
+ magnesium: {elem1: "aluminum", elem2: "magnesium_nitrate"},
+ //sulfuric_acid: {elem1: "aluminum_sulfate", elem2: "nitric_acid"},
+ acid: {elem1: "aluminum_chloride", elem2: "nitric_acid"},
+ },
+ solubility: {water: 0.739},
+ alias: "Al(NO₃)₃",
+ behavior: behaviors.POWDER
+ };
+ elements.limestone.reactions.sulfuric_acid = {elem1: "gypsum", elem2: ["carbon_dioxide", "foam", "seltzer", "seltzer"]};
+ elements.slaked_lime.reactions.sulfuric_acid = {elem1: "gypsum", elem2: "water"};
+ elements.quicklime.reactions.sulfuric_acid = {elem1: "gypsum", elem2: "oxygen"};
+ elements.limestone.reactions.nitric_acid = {elem1: "calcium_nitrate", elem2: ["carbon_dioxide", "foam", "seltzer", "seltzer"]};
+ elements.slaked_lime.reactions.nitric_acid = {elem1: "calcium_nitrate", elem2: "water"};
+ elements.quicklime.reactions.nitric_acid = {elem1: "calcium_nitrate", elem2: "oxygen"};
+ elements.copper_carbonate = {
+ color: ["#5ee092", "#54d186", "#52de8a", "#44c97a"],
+ category: "salts",
+ alias: "CuCO₃",
+ behavior: behaviors.POWDER,
+ reactions: {
+ vinegar: {elem1: "copper_acetate", elem2: ["carbon_dioxide", "foam", "seltzer", "seltzer"]},
+ acid: {elem1: "copper_chloride", elem2: ["carbon_dioxide", "foam", "seltzer", "seltzer"]},
+ sulfuric_acid: {elem1: "copper_sulfate", elem2: ["carbon_dioxide", "foam", "seltzer", "seltzer"]},
+ nitric_acid: {elem1: "copper_nitrate", elem2: ["carbon_dioxide", "foam", "seltzer", "seltzer"]},
+ aqua_regia: {elem1: ["copper_nitrate", "copper_chloride"], elem2: ["carbon_dioxide", "foam", "seltzer", "seltzer"]},
+ },
+ density: 4000,
+ tempHigh: 290,
+ stateHigh: ["oxidized_copper", "carbon_dioxide"],
+ };
+ elements.aqua_regia.solubility = {water: 1};
+ elements.acid.solubility = {water: 1};
+ elements.vinegar.solubility = {water: 1};
+ elements.nitric_acid.solubility = {water: 1};
+ elements.sulfuric_acid.solubility = {water: 1};
}, true);
diff --git a/mods/scp.js b/mods/scp.js
index 8c6b2aba..8b9a6a7d 100644
--- a/mods/scp.js
+++ b/mods/scp.js
@@ -1,6 +1,12 @@
/* by nekonico */
window.addEventListener("load", () => {
+ document.getElementById("elementButton-scp_001_light")?.remove()
+ document.getElementById("elementButton-melted_head")?.remove()
+ document.getElementById("elementButton-melted_body")?.remove()
+ document.getElementById("elementButton-melted_animal")?.remove()
+ document.getElementById("elementButton-melted_plant")?.remove()
+ document.getElementById("elementButton-fused_organism")?.remove()
document.getElementById("elementButton-head_008")?.remove()
document.getElementById("elementButton-body_008")?.remove()
document.getElementById("elementButton-head_012_1")?.remove()
@@ -15,6 +21,8 @@ window.addEventListener("load", () => {
document.getElementById("elementButton-head_173")?.remove()
document.getElementById("elementButton-body_173")?.remove()
document.getElementById("elementButton-scp_229")?.remove()
+ document.getElementById("elementButton-packet")?.remove()
+ document.getElementById("elementButton-can")?.remove()
document.getElementById("elementButton-head_457")?.remove()
document.getElementById("elementButton-body_457")?.remove()
document.getElementById("elementButton-head_1000")?.remove()
@@ -34,9 +42,25 @@ window.addEventListener("load", () => {
document.getElementById("elementButton-scp_009_plant")?.remove()
document.getElementById("elementButton-red_cloud")?.remove()
document.getElementById("elementButton-red_rain")?.remove()
- document.getElementById("elementButton-shy_head")?.remove()
- document.getElementById("elementButton-shy_body")?.remove()
+ document.getElementById("elementButton-head_096")?.remove()
+ document.getElementById("elementButton-body_096")?.remove()
document.getElementById("elementButton-REDACTED")?.remove()
+
+vendingNormD = Object.keys(elements).filter(function(e) {
+ return elements[e].state == "liquid" && elements[e].movable == true && elements[e].category != "scp" && (elements[e].category == "food" || (elements[e].id == elements.water.id || elements[e].id == elements.sugar_water.id || elements[e].id == elements.seltzer.id || elements[e].id == elements.dirty_water.id || elements[e].id == elements.slime.id || elements[e].id == elements.neutral_acid.id || elements[e].id == elements.blood.id || elements[e].id == elements.sap.id || elements[e].id == elements.dye.id) || elements[e].isFood) && !elements[e].tool;
+});
+
+vendingNormF = Object.keys(elements).filter(function(e) {
+ return (elements[e].state != "liquid" && elements[e].state != "gas") && elements[e].category != "scp" && elements[e].movable == true && (elements[e].category == "food" || elements[e].isFood) && !elements[e].tool;
+});
+
+vendingWeirdD = Object.keys(elements).filter(function(e) {
+ return (elements[e].state == "liquid" || elements[e].state == "gas") && elements[e].movable == true && (elements[e].category == "food" || elements[e].category == "liquids" || elements[e].category == "life" || elements[e].category == "gases" || elements[e].category == "energy") && !elements[e].tool;
+});
+
+vendingWeirdF = Object.keys(elements).filter(function(e) {
+ return elements[e].state != "gas" && elements[e].movable == true && (elements[e].id != elements.armageddon.id && elements[e].id != elements.blaster.id && elements[e].id != elements.false_vacuum_decay_bomb.id && elements[e].id != elements.earthquake.id && elements[e].id != elements.tsunami.id && elements[e].id != elements.volcano.id && elements[e].id != elements.sinkhole.id) && (elements[e].category == "food" || elements[e].category == "life" || elements[e].category == "land" || elements[e].category == "weapons" || elements[e].category == "energy" || elements[e].isFood) && !elements[e].tool;
+});
})
async function _scpAskPrompt(message, defaultValue = "") {
@@ -229,7 +253,7 @@ elements.access_door = {
if (!isEmpty(pixel.x-1, pixel.y, true) && !outOfBounds(pixel.x-1, pixel.y) && Math.random() > 0.9){
let neighbor = pixelMap[pixel.x-1][pixel.y]
if (pixel.levelReq && elements[neighbor.element].level < pixel.levelReq) {}
- else if (neighbor.level >= pixel.levelReq && (neighbor.element == "body" || neighbor.element == "body_1000" || neighbor.element == "body_008" || neighbor.element == "body_1015" || neighbor.element == "body_035" || neighbor.element == "body_012_1")) {
+ else if (neighbor.level >= pixel.levelReq && (neighbor.element == "body" || neighbor.element == "melted_body" || neighbor.element == "fused_organism" && Math.random() > 0.75 || neighbor.element == "body_1000" || neighbor.element == "body_008" || neighbor.element == "body_1015" || neighbor.element == "body_035" || neighbor.element == "body_012_1")) {
if (neighbor.dir == 1 && !isEmpty(neighbor.x,neighbor.y-1) && !outOfBounds(neighbor.x,neighbor.y-1)) {
if (isEmpty(pixel.x+1,pixel.y) && isEmpty(pixel.x+1,pixel.y-1)) {
if (tryMove(pixelMap[neighbor.x][neighbor.y-1],pixel.x+1,pixel.y-1)) {
@@ -246,7 +270,7 @@ elements.access_door = {
movePixel(neighbor,pixel.x+1,pixel.y+1)
}
}
- else if (!isEmpty(pixel.x+1,pixel.y) && !isEmpty(pixel.x+1,pixel.y-1) && isEmpty(pixel.x+2,pixel.y+1) && isEmpty(pixel.x+2,pixel.y)) {
+ else if (!isEmpty(pixel.x+1,pixel.y) && !isEmpty(pixel.x+1,pixel.y-1) && isEmpty(pixel.x+2,pixel.y) && isEmpty(pixel.x+2,pixel.y-1)) {
let doorB = pixelMap[pixel.x+1][pixel.y]
let doorH = pixelMap[pixel.x+1][pixel.y-1]
if (doorB.levelReq <= pixel.levelReq && doorH.levelReq <= pixel.levelReq) {
@@ -257,6 +281,26 @@ elements.access_door = {
}
}
}
+ else if (neighbor.level >= pixel.levelReq && neighbor.element == "fused_organism" && Math.random() > 0.5) {
+ if (neighbor.dir == 1 && !isEmpty(neighbor.x,neighbor.y-1) && !outOfBounds(neighbor.x,neighbor.y-1)) {
+ if (isEmpty(pixel.x+1,pixel.y)) {
+ tryMove(pixelMap[neighbor.x][neighbor.y],pixel.x+1,pixel.y)
+ }
+ else if (isEmpty(pixel.x+1,pixel.y-1)) {
+ tryMove(pixelMap[neighbor.x][neighbor.y],pixel.x+1,pixel.y-1)
+ }
+ else if (isEmpty(pixel.x+1,pixel.y+1)) {
+ tryMove(pixelMap[neighbor.x][neighbor.y],pixel.x+1,pixel.y+1)
+ }
+ else if (!isEmpty(pixel.x+1,pixel.y) && isEmpty(pixel.x+2,pixel.y)) {
+ let doorB = pixelMap[pixel.x+1][pixel.y]
+ let doorH = pixelMap[pixel.x+1][pixel.y-1]
+ if (doorB.levelReq <= pixel.levelReq && doorH.levelReq <= pixel.levelReq) {
+ tryMove(pixelMap[neighbor.x][neighbor.y],pixel.x+2,pixel.y)
+ }
+ }
+ }
+ }
}
else if (!isEmpty(pixel.x+1, pixel.y, true) && !outOfBounds(pixel.x+1, pixel.y) && Math.random() > 0.9){
let neighbor = pixelMap[pixel.x+1][pixel.y]
@@ -307,6 +351,40 @@ elements.access_door = {
density: 7850,
}
+elements.alarm = {
+ color: "#ff2222",
+ buttonColor: "#660000",
+ behavior: behaviors.WALL,
+ renderer: renderPresets.LED,
+ properties: {
+ radius: 8,
+ },
+ tick: function(pixel) {
+ doDefaults(pixel)
+ if (!pixel.radius || pixel.radius != 8) {
+ pixel.radius = 8
+ }
+ if (pixel.radius > 0 && (pixel.charge || pixel.chargeCD)) {
+ var coords = circleCoords(pixel.x,pixel.y,pixel.radius);
+ for (var i = 0; i < coords.length; i++) {
+ if (!isEmpty(coords[i].x,coords[i].y) && !outOfBounds(coords[i].x,coords[i].y)) {
+ var panic = pixelMap[coords[i].x][coords[i].y]
+ if (panic.panic != undefined && (panic.element == "body" || panic.element == "body_1000" || panic.element == "body_1015")) {
+ panic.panic += 0.025
+ }
+ }
+ }
+ }
+ },
+ category: "scp",
+ tempHigh: 1500,
+ stateHigh: ["molten_glass","molten_glass","molten_glass","molten_gallium","molten_aluminum","molten_copper","molten_plastic","molten_plastic"],
+ conduct: 1,
+ breakInto: ["glass_shard","bead","glass_shard","bead","copper"],
+ breakIntoColorMultiplier: [1.1,1,0.86],
+ forceSaveColor: true
+}
+
elements.level_0 = {
color: ["#635957","#AB9D9C","#D3CCCC"],
name: "Level 0 Keycard",
@@ -496,6 +574,61 @@ elements.d_class = {
forceSaveColor: true,
}
+elements.maintenance = {
+ // color: ["#f5eac6","#d4c594","#a89160","#7a5733","#523018","#361e0e"],
+ color: ["#f3e7db","#f7ead0","#eadaba","#d7bd96","#a07e56","#825c43","#604134","#3a312a"],
+ buttonColor: ["#111188","#1111dd","#047e99"],
+ name: "Technician",
+ category: "scp",
+ properties: {
+ dead: false,
+ dir: 1,
+ panic: 0
+ },
+ onPlace: function(pixel) {
+ if (isEmpty(pixel.x, pixel.y+1)) {
+ createPixel("body", pixel.x, pixel.y+1);
+ pixelMap[pixel.x][pixel.y+1].color = pixelColorPick(pixelMap[pixel.x][pixel.y+1], elements.maintenance.buttonColor)
+ pixelMap[pixel.x][pixel.y+1].level = 1
+ var color = pixel.color;
+ changePixel(pixel,"head");
+ pixel.color = color;
+ }
+ else if (isEmpty(pixel.x, pixel.y-1)) {
+ createPixel("head", pixel.x, pixel.y-1);
+ pixelMap[pixel.x][pixel.y-1].color = pixel.color;
+ changePixel(pixel,"body");
+ pixel.color = pixelColorPick(pixel, elements.maintenance.buttonColor);
+ pixel.level = 1
+ }
+ else {
+ deletePixel(pixel.x, pixel.y);
+ }
+ },
+ reactions: {
+ "fire": { attr1:{panic:5} },
+ "plasma": { attr1:{panic:5} },
+ "cold_fire": { attr1:{panic:5} },
+ "electric": { attr1:{panic:5} },
+ "blood": { attr1:{panic:1} },
+ "infection": { attr1:{panic:2} },
+ "cancer": { attr1:{panic:3} },
+ "plague": { attr1:{panic:5} },
+ "radiation": { attr1:{panic:5} },
+ "tnt": { attr1:{panic:5} },
+ "dynamite": { attr1:{panic:5} },
+ "c4": { attr1:{panic:5} },
+ "grenade": { attr1:{panic:5} },
+ "gunpowder": { attr1:{panic:5} },
+ "acid": { attr1:{panic:5} },
+ "acid_gas": { attr1:{panic:5} },
+ "stench": { attr1:{panic:2} }
+ },
+ related: ["body","head"],
+ cooldown: defaultCooldown,
+ forceSaveColor: true,
+}
+
elements.scientist = {
// color: ["#f5eac6","#d4c594","#a89160","#7a5733","#523018","#361e0e"],
color: ["#f3e7db","#f7ead0","#eadaba","#d7bd96","#a07e56","#825c43","#604134","#3a312a"],
@@ -661,6 +794,706 @@ elements.director = {
forceSaveColor: true,
}
+elements.scp_001_sdl = {
+ name: "SCP-001 CN: Locke",
+ color: "#c12600",
+ tick: function(pixel) {
+ // minimum 1726
+ // maximum 7726
+ if (pixel.eclipse) { pixel.color = pixelColorPick(pixel,"#f68656"); var c=0.01}
+ else if (pixel.temp < 1500) { pixel.color = pixelColorPick(pixel,"#7a4e43"); }
+ else if (pixel.temp < 3600) { pixel.color = pixelColorPick(pixel,"#ffbdbd"); var c=0.05 }
+ else if (pixel.temp < 7000) { pixel.color = pixelColorPick(pixel,"#c12600"); var c=0.1 }
+ else if (pixel.temp < 11000) { pixel.color = pixelColorPick(pixel,"#ffb09c"); var c=0.25 }
+ else if (pixel.temp < 28000) { pixel.color = pixelColorPick(pixel,"#f7fff5"); var c=0.5 }
+ else { pixel.color = pixelColorPick(pixel,"#c3bdff"); var c=0.4 }
+ if (pixel.temp < 1500) { var c=0 }
+ for (var i = 0; i < adjacentCoords.length; i++) {
+ var x = pixel.x+adjacentCoords[i][0];
+ var y = pixel.y+adjacentCoords[i][1];
+ if (isEmpty(x,y)) {
+ if (Math.random() > c) {continue}
+ createPixel("scp_001_light", x, y);
+ pixelMap[x][y].color = pixel.color;
+ }
+ else if (!outOfBounds(x,y)) {
+ var newPixel = pixelMap[x][y];
+ if (elements[newPixel.element].id === elements.scp_001_sdl.id) {
+ if (pixel.eclipse) { newPixel.eclipse = true }
+ if (pixel.temp!==newPixel.temp) {
+ var avg = (pixel.temp + newPixel.temp)/2;
+ pixel.temp = avg;
+ newPixel.temp = avg;
+ pixelTempCheck(pixel);
+ pixelTempCheck(newPixel);
+ }
+ }
+ else if (elements[newPixel.element].id === elements.sun.id) {
+ changePixel(newPixel, "scp_001_sdl");
+ }
+ }
+ }
+ },
+ tool: function(pixel) {
+ if (pixel.element === "light") {
+ deletePixel(pixel.x,pixel.y);
+ }
+ if (pixel.element === "scp_001_light") {
+ deletePixel(pixel.x,pixel.y);
+ }
+ },
+ canPlace: true,
+ reactions: {
+ "hydrogen": { elem2:"helium", temp1:5 },
+ "helium": { elem2:"carbon_dioxide", temp1:5, tempMax:3600 },
+ "carbon_dioxide": { elem2:"neon", temp1:5, tempMax:1800 },
+ "sun": { elem2:"scp_001_sdl", },
+ "light": { elem2:"scp_001_light" },
+ },
+ temp: 5504,
+ tempLow: -100,
+ stateLow: "supernova",
+ category: "scp",
+ state: "gas",
+ //density: 1408,
+ insulate: true,
+ noMix: true,
+ movable: false
+}
+
+elements.scp_001_light = {
+ hidden: true,
+ name: "light",
+ color: "#c12600",
+ tick: function(pixel) {
+ if (Math.random() < 0.01) {
+ deletePixel(pixel.x,pixel.y);
+ return;
+ }
+ if (pixel.bx===undefined) {
+ // choose 1, 0, or -1
+ pixel.bx = Math.random() < 0.5 ? 1 : Math.random() < 0.5 ? 0 : -1;
+ pixel.by = Math.random() < 0.5 ? 1 : Math.random() < 0.5 ? 0 : -1;
+ // if both are 0, make one of them 1 or -1
+ if (pixel.bx===0 && pixel.by===0) {
+ if (Math.random() < 0.5) { pixel.bx = Math.random() < 0.5 ? 1 : -1; }
+ else { pixel.by = Math.random() < 0.5 ? 1 : -1; }
+ }
+ }
+ // move and invert direction if hit
+ if (pixel.bx && !tryMove(pixel, pixel.x+pixel.bx, pixel.y)) {
+ var newX = pixel.x + pixel.bx;
+ if (!isEmpty(newX, pixel.y, true)) {
+ var newPixel = pixelMap[pixel.x+pixel.bx][pixel.y];
+ if (!elements[newPixel.element].insulate) {
+ newPixel.temp += 1;
+ pixelTempCheck(newPixel);
+ }
+ if (!elements.light.reactions[newPixel.element]) {
+ pixel.color = newPixel.color;
+ }
+ else if (!elements.scp_001_light.reactions[newPixel.element]) {
+ pixel.color = newPixel.color;
+ }
+ }
+ pixel.bx = -pixel.bx;
+ }
+ if (pixel.by && !tryMove(pixel, pixel.x, pixel.y+pixel.by)) {
+ var newY = pixel.y + pixel.by;
+ if (!isEmpty(pixel.x, newY, true)) {
+ var newPixel = pixelMap[pixel.x][pixel.y+pixel.by];
+ if (!elements[newPixel.element].insulate && newPixel.temp < 200) {
+ newPixel.temp += 0.1;
+ pixelTempCheck(newPixel);
+ }
+ if (!elements.light.reactions[newPixel.element]) {
+ pixel.color = newPixel.color;
+ }
+ else if (!elements.scp_001_light.reactions[newPixel.element]) {
+ pixel.color = newPixel.color;
+ }
+ }
+ pixel.by = -pixel.by;
+ }
+ },
+ onCollide: function(pixel1,pixel2) {
+ if (pixel2.element == "head") {
+ pixel2.origElem = pixel2.element
+ pixel2.element = "melted_head"
+ }
+ else if (pixel2.element == "body") {
+ pixel2.origElem = pixel2.element
+ pixel2.element = "melted_body"
+ }
+ else if (pixel2.element == "plant" || pixel2.element == "grass" || pixel2.element == "lichen" || pixel2.element == "kelp" || pixel2.element == "evergreen" || pixel2.element == "pistil" || pixel2.element == "petal" || pixel2.element == "bamboo" || pixel2.element == "bamboo_plant" || pixel2.element == "cactus" || pixel2.element == "corn" || pixel2.element == "wheat" || pixel2.element == "dead_plant" || pixel2.element == "sapling" || pixel2.element == "pinecone") {
+ pixel2.origElem = pixel2.element
+ pixel2.element = "melted_plant"
+ }
+ else if (pixel2.element == "tree_branch") {
+ pixel2.element = "wood"
+ }
+ else if (pixel2.element == "cell" || pixel2.element == "cancer" || pixel2.element == "worm" || pixel2.element == "flea" || pixel2.element == "termite" || pixel2.element == "ant" || pixel2.element == "spider" || pixel2.element == "fly" || pixel2.element == "firefly" || pixel2.element == "bee" || pixel2.element == "stink_bug" || pixel2.element == "dead_bug" || pixel2.element == "bird" || pixel2.element == "rat" || pixel2.element == "frog" || pixel2.element == "tadpole" || pixel2.element == "fish" || pixel2.element == "slug" || pixel2.element == "snail" || pixel2.element == "coral") {
+ pixel2.origElem = pixel2.element
+ pixel2.element = "melted_animal"
+ }
+ else if (pixel2.element == "head_008" || pixel2.element == "head_012_1" || pixel2.element == "head_035" || pixel2.element == "head_049" || pixel2.element == "head_096" || pixel2.element == "head_1000" || pixel2.element == "head_1015") {
+ pixel2.origElem = pixel2.element
+ pixel2.element = "melted_head"
+ }
+ else if (pixel2.element == "body_008" || pixel2.element == "body_012_1" || pixel2.element == "body_035" || pixel2.element == "body_049" || pixel2.element == "body_096" || pixel2.element == "body_1000" || pixel2.element == "body_1015") {
+ pixel2.origElem = pixel2.element
+ pixel2.element = "melted_body"
+ }
+ else if (pixel2.element == "scp_236" || pixel2.element == "scp_391" || pixel2.element == "scp_1424") {
+ pixel2.origElem = pixel2.element
+ pixel2.element = "melted_animal"
+ }
+ else if (pixel2.element == "skin" || pixel2.element == "meat" || pixel2.element == "cured_meat" || pixel2.element == "rotten_meat" || pixel2.element == "cooked_meat") {
+ pixel2.origElem = pixel2.element
+ pixel2.element = "fused_organism"
+ }
+ else if (pixel2.element == "dust" || pixel2.element == "cloth" || pixel2.element == "cloth_scrap" || pixel2.element == "hair" || pixel2.element == "loose_hair") {
+ deletePixel(pixel2.x,pixel2.y)
+ }
+ if (elements[pixel2.element].isBio) {
+ pixel2.origElem = pixel2.element
+ if (pixel2.con) {
+ delete pixel2.con
+ }
+ pixel2.element = "melted_animal"
+ }
+ else if (elements[pixel2.element].isHair || pixel2.element == "loose_hair" || pixel2.element == "gaseous_material" || pixel2.element == "digested_material" || pixel2.element == "urine" || pixel2.element == "excrement" || pixel2.element == "brain_jar_juice") {
+ deletePixel(pixel2.x,pixel2.y)
+ }
+ },
+ reactions: {
+ "glass": { "color1":["#ff0000","#ff0000","#ff0000","#ff8800","#ffff00","#00ff00","#00ffff","#0000ff","#ff00ff"] },
+ "glass_shard": { "color1":["#ff0000","#ff0000","#ff0000","#ff8800","#ffff00","#00ff00","#00ffff","#0000ff","#ff00ff"] },
+ "rad_glass": { "color1":["#ff0000","#ff0000","#9f6060","#9f8260","#9f9f60","#609f60","#609f9f","#60609f","#9f609f"] },
+ "rad_shard": { "color1":["#ff0000","#ff0000","#9f6060","#9f8260","#9f9f60","#609f60","#609f9f","#60609f","#9f609f"] },
+ "steam": { "color1":["#ff0000","#ff0000","#ff0000","#ff8800","#ffff00","#00ff00","#00ffff","#0000ff","#ff00ff"] },
+ "rain_cloud": { "color1":["#ff0000","#ff0000","#ff0000","#ff8800","#ffff00","#00ff00","#00ffff","#0000ff","#ff00ff"] },
+ "cloud": { "color1":["#ff0000","#ff0000","#ff0000","#ff8800","#ffff00","#00ff00","#00ffff","#0000ff","#ff00ff"] },
+ "smog": { "color1":["#ff0000","#ff0000","#9f6060","#9f8260","#9f9f60","#609f60","#609f9f","#60609f","#9f609f"] },
+ "ice": { "color1":["#ff0000","#c2fff9"] },
+ "rime": { "color1":["#ff0000","#c2fff9"] },
+ "water": { "color1":["#ff0000","#a1bac9"] },
+ "salt_water": { "color1":["#ff0000","#a1bac9"] },
+ "sugar_water": { "color1":["#ff0000","#a1bac9"] },
+ "dirty_water": { "color1":["#ff0000","#a1c9a8"] },
+ "seltzer": { "color1":["#ff0000","#c2fff9"] },
+ "diamond": { "color1":["#ff0000","#c2c5ff","#c2d9ff"] },
+ "rainbow": { "color1":["#ff0000","#ff0000","#ff8800","#ffff00","#00ff00","#00ffff","#0000ff","#ff00ff"] },
+ "static": { "color1":["#ff0000","#ffffff","#bdbdbd","#808080","#424242","#1c1c1c"] },
+ "light": { elem2:"scp_001_light" },
+ },
+ temp: 35,
+ tempLow: -273,
+ stateLow: ["liquid_light",null],
+ stateLowColorMultiplier: 0.8,
+ category: "scp",
+ state: "gas",
+ density: 0.00001,
+ ignoreAir: true,
+ insulate: true
+}
+
+elements.melted_body = {
+ color: ["#f3e7db","#f7ead0","#eadaba","#d7bd96","#a07e56","#825c43","#604134","#3a312a"],
+ name: "SCP-001-A",
+ category: "scp",
+ hidden: true,
+ density: 1500,
+ state: "solid",
+ conduct: .05,
+ temp: 37,
+ tempHigh: 150,
+ stateHigh: "cooked_meat",
+ tempLow: -30,
+ stateLow: "frozen_meat",
+ burn: 10,
+ burnTime: 250,
+ burnInto: "cooked_meat",
+ breakInto: ["blood","meat","bone"],
+ forceSaveColor: true,
+ pickElement: "human",
+ onCollide: function(pixel1,pixel2) {
+ if (elements[pixel2.element].melteda && pixel2.element != "melted_head" && Math.random() > 0.9 && pixel2.origElem != pixel1.origElem) {
+ pixel2.element = "fused_organism"
+ pixel1.element = "fused_organism"
+ }
+ },
+ melteda: true,
+ stain: 0.01875,
+ stainSelf: true,
+ reactions: {
+ "cancer": { elem1:"cancer", chance:0.005 },
+ "radiation": { elem1:["ash","meat","rotten_meat","cooked_meat"], chance:0.4 },
+ "neutron": { elem1:["ash","meat","rotten_meat","cooked_meat"], chance:0.01 },
+ "fallout": { elem1:["ash","meat","rotten_meat","cooked_meat"], chance:0.01 },
+ "plague": { elem1:"plague", chance:0.05 },
+ "egg": { elem2:"yolk", chance:0.5, oneway:true },
+ "grape": { elem2:"juice", chance:0.5, color2:"#291824", oneway:true },
+ "ant": { elem2:"dead_bug", chance:0.05, oneway:true },
+ "spider": { elem2:"dead_bug", oneway:true },
+ "fly": { elem2:"dead_bug", oneway:true },
+ "firefly": { elem2:"dead_bug", oneway:true },
+ "bee": { elem2:"dead_bug", oneway:true },
+ "flea": { elem2:"dead_bug", oneway:true },
+ "termite": { elem2:"dead_bug", oneway:true },
+ "worm": { elem2:"slime", chance:0.05, oneway:true },
+ "stink_bug": { elem2:"stench", oneway:true },
+ "grass_seed": { elem2:null, chance:0.05 },
+ "sun": { elem1:"cooked_meat" },
+ "alcohol": { chance:0.2, attr1:{"panic":0} },
+ "anesthesia": { attr1:{"panic":0} },
+ "alcohol_gas": { chance:0.2, attr1:{"panic":0} },
+ },
+ properties: {
+ dead: false,
+ dir: 1,
+ panic: 0,
+ },
+ tick: function(pixel) {
+ if (tryMove(pixel, pixel.x, pixel.y+1)) { // Fall
+ if (!isEmpty(pixel.x, pixel.y-2, true)) { // Drag head down
+ var headpixel = pixelMap[pixel.x][pixel.y-2];
+ if (headpixel.element === "melted_head") {
+ if (isEmpty(pixel.x, pixel.y-1)) {
+ movePixel(pixelMap[pixel.x][pixel.y-2], pixel.x, pixel.y-1);
+ }
+ else {
+ swapPixels(pixelMap[pixel.x][pixel.y-2], pixelMap[pixel.x][pixel.y-1]);
+ }
+ }
+ }
+ }
+ doHeat(pixel);
+ doBurning(pixel);
+ doElectricity(pixel);
+ if (pixel.dead) {
+ // Turn into rotten_meat if pixelTicks-dead > 500
+ if (pixelTicks-pixel.dead > 200 && Math.random() < 0.1) {
+ pixel.element = "rotten_meat"
+ }
+ return
+ }
+
+ // Find the head
+ if (!isEmpty(pixel.x, pixel.y-1, true) && pixelMap[pixel.x][pixel.y-1].element == "melted_head") {
+ var head = pixelMap[pixel.x][pixel.y-1];
+ if (pixel.color != head.color) {
+ pixel.color = head.color
+ pixel.shirtless = true
+ }
+ else {
+ pixel.shirtless = true
+ }
+ if (head.dead) { // If head is dead, kill body
+ pixel.dead = head.dead;
+ }
+ else if (head.panic > 0) {
+ delete head.panic;
+ }
+ }
+ else if (!isEmpty(pixel.x, pixel.y-1, true) && (pixelMap[pixel.x][pixel.y-1].element == "head" || pixelMap[pixel.x][pixel.y-1].element == "head_008" || pixelMap[pixel.x][pixel.y-1].element == "head_012_1" || pixelMap[pixel.x][pixel.y-1].element == "head_035" || pixelMap[pixel.x][pixel.y-1].element == "head_049" || pixelMap[pixel.x][pixel.y-1].element == "head_1000" || pixelMap[pixel.x][pixel.y-1].element == "head_1015")) {
+ var head = pixelMap[pixel.x][pixel.y-1];
+ if (pixel.color != head.color) {
+ pixel.color = head.color
+ }
+ head.element = "melted_head"
+ }
+ else { var head = null }
+
+ if (isEmpty(pixel.x, pixel.y-1)) {
+ // create blood if decapitated 10% chance
+ if (Math.random() < 0.05 && !pixel.charge) {
+ createPixel("blood", pixel.x, pixel.y-1);
+ }
+ if (Math.random() < 0.15) {
+ pixel.dead = pixelTicks;
+ }
+ }
+ else if (head === null) { return }
+ else if (Math.random() < 0.1*(isEmpty(pixel.x, pixel.y+1) ? 1 : pixel.panic+1)) { // Move 10% chance
+ var movesToTry = [
+ [1*pixel.dir,0],
+ [1*pixel.dir,-1],
+ ];
+ let moved = false;
+ // While movesToTry is not empty, tryMove(pixel, x, y) with a random move, then remove it. if tryMove returns true, break.
+ while (movesToTry.length > 0) {
+ var move = movesToTry.splice(Math.floor(Math.random() * movesToTry.length), 1)[0];
+ if (isEmpty(pixel.x+move[0], pixel.y+move[1]-1)) {
+ var origx = pixel.x+move[0];
+ var origy = pixel.y+move[1];
+ if (tryMove(pixel, pixel.x+move[0], pixel.y+move[1]) && pixel.x===origx && pixel.y===origy) {
+ movePixel(head, head.x+move[0], head.y+move[1]);
+ moved = true;
+ break;
+ }
+ }
+ else if (!isEmpty(pixel.x+move[0], pixel.y+move[1], true)) {
+ var hitPixel = pixelMap[pixel.x+move[0]][pixel.y+move[1]];
+ if (elements[hitPixel.element].melteda == true) {
+ hitPixel.element == "fused_organism"
+ pixel.element == "fused_organism"
+ }
+ }
+ }
+ // 15% chance to change direction
+ if (Math.random() < 0.2 || !moved) {
+ pixel.dir *= -1;
+ }
+ }
+
+ }
+}
+
+elements.melted_head = {
+ color: ["#f3e7db","#f7ead0","#eadaba","#d7bd96","#a07e56","#825c43","#604134","#3a312a"],
+ name: "SCP-001-A",
+ category: "scp",
+ hidden: true,
+ density: 1080,
+ state: "solid",
+ conduct: .05,
+ temp: 37,
+ tempHigh: 150,
+ stateHigh: "cooked_meat",
+ tempLow: -30,
+ stateLow: "frozen_meat",
+ burn: 10,
+ burnTime: 250,
+ burnInto: "cooked_meat",
+ breakInto: ["blood","meat","bone"],
+ forceSaveColor: true,
+ pickElement: "human",
+ onCollide: function(pixel1,pixel2) {
+ if (elements[pixel2.element].melteda && pixel2.element != "melted_body" && Math.random() > 0.9 && pixel2.origElem != pixel1.origElem) {
+ pixel2.element = "fused_organism"
+ pixel1.element = "fused_organism"
+ }
+ },
+ melteda: true,
+ stain: 0.0375,
+ stainSelf: true,
+ reactions: {
+ "cancer": { elem1:"cancer", chance:0.005 },
+ "radiation": { elem1:["ash","meat","rotten_meat","cooked_meat"], chance:0.4 },
+ "neutron": { elem1:["ash","meat","rotten_meat","cooked_meat"], chance:0.03 },
+ "fallout": { elem1:["ash","meat","rotten_meat","cooked_meat"], chance:0.03 },
+ "plague": { elem1:"plague", chance:0.05 },
+ "oxygen": { elem2:"carbon_dioxide", chance:0.5 },
+ "beans": { elem2:[null,null,null,null,null,null,null,null,"stench"], chance:0.2 },
+ "sun": { elem1:"cooked_meat" },
+ "light": { stain1:"#825043" },
+ "bee": { stain1:"#cc564b", chance:0.2 },
+ "water": { elem2:"bubble", attr2:{"clone":"water"}, chance:0.001 },
+ "salt_water": { elem2:"bubble", attr2:{"clone":"salt_water"}, chance:0.001 },
+ "pool_water": { elem2:"bubble", attr2:{"clone":"pool_water"}, chance:0.001 },
+ "alcohol": { chance:0.2, attr1:{"panic":0} },
+ "anesthesia": { attr1:{"panic":0} },
+ "alcohol_gas": { chance:0.2, attr1:{"panic":0} }
+ },
+ properties: {
+ dead: false,
+ },
+ tick: function(pixel) {
+ doHeat(pixel);
+ doBurning(pixel);
+ doElectricity(pixel);
+ if (pixel.dead) {
+ // Turn into rotten_meat if pixelTicks-dead > 500
+ if (pixelTicks-pixel.dead > 200 && Math.random() < 0.1) {
+ pixel.element = "rotten_meat"
+ return
+ }
+ }
+
+ // Find the body
+ if (!isEmpty(pixel.x, pixel.y+1, true) && pixelMap[pixel.x][pixel.y+1].element == "melted_body") {
+ var body = pixelMap[pixel.x][pixel.y+1];
+ if (body.dead) { // If body is dead, kill head
+ pixel.dead = body.dead;
+ }
+ }
+ else if (!isEmpty(pixel.x, pixel.y+1, true) && (pixelMap[pixel.x][pixel.y+1].element == "body" || pixelMap[pixel.x][pixel.y+1].element == "body_008" || pixelMap[pixel.x][pixel.y+1].element == "body_012_1" || pixelMap[pixel.x][pixel.y+1].element == "body_035" || pixelMap[pixel.x][pixel.y+1].element == "body_049" || pixelMap[pixel.x][pixel.y+1].element == "body_1000" || pixelMap[pixel.x][pixel.y+1].element == "body_1015")) {
+ var body = pixelMap[pixel.x][pixel.y+1];
+ body.element = "melted_body"
+ }
+ else { var body = null }
+
+ // check for eating food
+ if (body && !pixel.dead && Math.random() < 0.1) {
+ shuffleArray(interactCoordsShuffle);
+ for (var i = 0; i < interactCoordsShuffle.length; i++) {
+ var x = pixel.x+interactCoordsShuffle[i][0];
+ var y = pixel.y+interactCoordsShuffle[i][1];
+ if (!isEmpty(x,y,true) && elements[pixelMap[x][y].element].isFood && pixelMap[x][y].panic === undefined) {
+ deletePixel(x,y);
+ break;
+ }
+ if (!isEmpty(x,y,true) && elements[pixelMap[x][y].element].melteda == true && pixelMap[pixel.x][pixel.y+1] != pixelMap[x][y] && Math.random() > 0.9) {
+ pixelMap[x][y].element = "fused_organism"
+ break;
+ }
+ }
+ }
+
+ if (tryMove(pixel, pixel.x, pixel.y+1)) {
+ // create blood if severed 10% chance
+ if (isEmpty(pixel.x, pixel.y+1) && !pixel.dead && Math.random() < 0.5 && !pixel.charge) {
+ // set dead to true 15% chance
+ if (Math.random() < 0.15) {
+ pixel.dead = pixelTicks;
+ }
+ }
+ }
+ },
+}
+
+elements.melted_animal = {
+ color: ["#997457","#a698a9","#ac8650","#997457","#a698a9","#ac8650","#997457","#a698a9","#ac8650","#4c4e42","#5e0b04","#4c4e42","#5e0b04","#56482d","#52472c","#635443"],
+ name: "SCP-001-A",
+ behavior: [
+ "XX|M2%0.5|M2%2.5",
+ "XX|FX%2|M2%25 AND BO",
+ "XX|M1|M2",
+ ],
+ tick: function(pixel) {
+ if (pixel.r != undefined) {
+ delete pixel.r
+ }
+ },
+ reactions: {
+ "oxygen": { elem2:"carbon_dioxide", chance:0.5 },
+ "meat": { color2: ["#9e4839","#ba6449","#d2856c","#a14940"], elem2:"melted_animal", chance:0.1 },
+ "sun": { elem2:"scp_001_sdl", elem1:"cooked_meat" },
+ },
+ onCollide: function(pixel1,pixel2) {
+ if (elements[pixel2.element].melteda || pixel1.origElem != pixel2.origElem) {
+ pixel1.element = "fused_organism"
+ pixel2.element = "fused_organism"
+ }
+ },
+ melteda: true,
+ stain: 0.04,
+ stainSelf: true,
+ tempHigh: 275,
+ stateHigh: "cooked_meat",
+ tempLow: -20,
+ stateLow: "frozen_meat",
+ burn: 10,
+ burnTime: 300,
+ burnInto: "cooked_meat",
+ state: "liquid",
+ density: 900,
+ category: "scp",
+}
+
+elements.melted_plant = {
+ color: ["#00bf00","#439809","#258b08","#118511","#127b12","#136d14"],
+ name: "SCP-001-A",
+ behavior: [
+ "XX|ST|XX",
+ "SP|XX|SP",
+ "M2%0.1|M1|M2%0.1",
+ ],
+ reactions: {
+ "sun": { elem2:"scp_001_sdl", elem1:"dead_plant" },
+ "light": { elem2:"scp_001_light" },
+ "carbon_dioxide": { elem2:"oxygen" },
+ "tree_branch": { elem2:"wood" },
+ },
+ onCollide: function(pixel1,pixel2) {
+ if (elements[pixel2.element].melteda && pixel2.element != "melted_plant" && pixel2.origElem != pixel1.origElem) {
+ pixel2.element = "fused_organism"
+ pixel1.element = "fused_organism"
+ }
+ },
+ melteda: true,
+ stain: 0.025,
+ stainSelf: true,
+ tempHigh: 250,
+ stateHigh: "dead_plant",
+ tempLow: -20,
+ stateLow: "frozen_plant",
+ burn: 10,
+ burnTime: 200,
+ burnInto: ["dead_plant","fire","fire","fire","ash"],
+ state: "liquid",
+ density: 1200,
+ category: "scp",
+ isFood: true,
+}
+
+elements.fused_organism = {
+ color: ["#E5D6C7","#f7ead0"],
+ name: "SCP-001-A",
+ behavior: behaviors.LIQUID,
+ viscosity: 6000,
+ reactions: {
+ "meat": { color2: ["#9e4839","#ba6449","#d2856c","#a14940"], elem2:"fused_organism", chance:0.1 },
+ "blood": { color2: ["#9e4839","#ba6449","#d2856c","#a14940"], elem2:"fused_organism", chance:0.1 },
+ "infection": { color2: ["#9e4839","#ba6449","#d2856c","#a14940"], elem2:"fused_organism", chance:0.1 },
+ "cooked_meat": { color2: ["#9e4839","#ba6449","#d2856c","#a14940"], elem2:"fused_organism", chance:0.1 },
+ "sun": { elem2:"scp_001_sdl", elem1:"cooked_meat" },
+ "light": { elem2:"scp_001_light" },
+ },
+ tick: function(pixel) {
+ if (Math.random() < 0.45) {
+ let y = Math.random() < 0.5 ? 0 : -1;
+ let xDir = Math.random() < 0.5 ? 1 : -1;
+ for (let x = 1; x < 20; x++) {
+ let x2 = pixel.x+(x*xDir);
+ let y2 = pixel.y+y;
+ if (!isEmpty(x2,y2,true)) {
+ let seenPixel = pixelMap[x2][y2];
+ if (elements[seenPixel.element].category == "life") {
+ if (pixel.dir != 1 && pixelMap[x2][y2].x > pixel.x) {
+ pixel.dir = 1
+ }
+ else if (pixel.dir != -1 && pixelMap[x2][y2].x < pixel.x) {
+ pixel.dir = -1
+ }
+ }
+ if (elements[seenPixel.element].id != elements.glass.id && elements[seenPixel.element].id != elements.stained_glass.id && elements[seenPixel.element].id != elements.glass_shard.id) {
+ break;
+ }
+ }
+ }
+ }
+
+ if (!pixel.dir || pixel.dir == undefined) {
+ pixel.dir = 0;
+ }
+
+ if (pixel.panic > 0 || !pixel.panic || pixel.panic == undefined) {
+ pixel.panic = 0;
+ }
+ if (Math.random() < 0.05) { // Move 5% chance
+ var movesToTry = [
+ [1*pixel.dir,0],
+ [1*pixel.dir,-1],
+ ];
+ let moved = false;
+ // While movesToTry is not empty, tryMove(pixel, x, y) with a random move, then remove it. if tryMove returns true, break.
+ while (movesToTry.length > 0) {
+ var move = movesToTry.splice(Math.floor(Math.random() * movesToTry.length), 1)[0];
+ if (isEmpty(pixel.x+move[0], pixel.y+move[1]-1)) {
+ var origx = pixel.x+move[0];
+ var origy = pixel.y+move[1];
+ tryMove(pixel, pixel.x+move[0], pixel.y+move[1]) && pixel.x===origx && pixel.y===origy
+ }
+ if (!isEmpty(pixel.x+move[0], pixel.y+move[1], true)) {
+ var hitPixel = pixelMap[pixel.x+move[0]][pixel.y+move[1]];
+ if (hitPixel.element == "fused_organism" && hitPixel.dir != pixel.dir) {
+ hitPixel.dir = pixel.dir;
+ }
+ if (hitPixel.element == "fused_organism" && pixel.level && (hitPixel.level < pixel.level || !hitPixel.level )) {
+ hitPixel.level = pixel.level;
+ }
+ }
+ }
+ // 5% chance to change direction
+ if (Math.random() < 0.05 || !moved) {
+ pixel.dir *= -1;
+ }
+ }
+ // homeostasis
+ if (pixel.temp > 47) { pixel.temp -= 1; }
+ else if (pixel.temp < 20) { pixel.temp += 1; }
+ for (var i = 0; i < adjacentCoords.length; i++) {
+ var coords = adjacentCoords[i];
+ var x = pixel.x + coords[0];
+ var y = pixel.y + coords[1];
+ if (!isEmpty(x,y) && !outOfBounds(x,y) && Math.random() > 0.05) {
+ var shatter = pixelMap[x][y]
+ let old = shatter.element;
+ if (shatter.element == "glass" || shatter.element == "rad_glass" || shatter.element == "stained_glass") {
+ breakPixel(shatter)
+ }
+ }
+ }
+ },
+ onCollide: function(pixel1,pixel2) {
+ if (elements[pixel2.element].category == "life") {
+ if (pixel2.element == "head") {
+ pixel2.origElem = pixel2.element
+ pixel2.element = "melted_head"
+ }
+ else if (pixel2.element == "body") {
+ pixel2.origElem = pixel2.element
+ pixel2.element = "melted_body"
+ }
+ else if (pixel2.element == "plant" || pixel2.element == "grass" || pixel2.element == "kelp" || pixel2.element == "coral" || pixel2.element == "evergreen" || pixel2.element == "pistil" || pixel2.element == "petal" || pixel2.element == "bamboo" || pixel2.element == "bamboo_plant" || pixel2.element == "cactus" || pixel2.element == "corn" || pixel2.element == "wheat" || pixel2.element == "dead_plant" || pixel2.element == "sapling" || pixel2.element == "pinecone") {
+ pixel2.origElem = pixel2.element
+ pixel2.element = "melted_plant"
+ }
+ else if (pixel2.element == "tree_branch") {
+ pixel2.element = "wood"
+ }
+ else {
+ pixel2.element = "fused_organism"
+ }
+ }
+ if (elements[pixel2.element].category == "food") {
+ if (pixel2.element != "salt" && pixel2.element != "sugar" && pixel2.element != "broth" && pixel2.element != "hard_yolk" && pixel2.element != "sauce" && pixel2.element != "popcorn" && pixel2.element != "baked_potato" && pixel2.element != "mashed_potato" && pixel2.element != "bread" && pixel2.element != "toast" && pixel2.element != "gingerbread" && pixel2.element != "crumb" && pixel2.element != "baked_batter" && pixel2.element != "candy" && pixel2.element != "coffee_ground" && pixel2.element != "nut_oil" && pixel2.element != "baking_soda" && pixel2.element != "yogurt" && pixel2.element != "frozen_yogurt" && pixel2.element != "ice_cream" && pixel2.element != "ramen" && pixel2.element != "frosting" && pixel2.element != "soy_sauce" && pixel2.element != "corn_starch" && pixel2.element != "boba" && pixel2.element != "curry_powder" && pixel2.element != "olive_oil" && pixel2.element != "tatorade" && pixel2.element != "plain_cookie" && pixel2.element != "cookie") {
+ pixel2.element = "fused_organism"
+ }
+ }
+ if (pixel2.element == "paper" || pixel2.element == "confetti") {
+ pixel2.origElem = pixel2.element
+ pixel2.element = "melted_plant"
+ }
+ if (pixel2.element == "head_008" || pixel2.element == "head_012_1" || pixel2.element == "head_035" || pixel2.element == "head_1000" || pixel2.element == "head_1015") {
+ pixel2.origElem = pixel2.element
+ pixel2.element = "melted_head"
+ }
+ else if (pixel2.element == "body_008" || pixel2.element == "body_012_1" || pixel2.element == "body_035" || pixel2.element == "body_1000" || pixel2.element == "body_1015") {
+ pixel2.origElem = pixel2.element
+ pixel2.element = "melted_body"
+ }
+ else if (pixel2.element == "scp_236" || pixel2.element == "scp_391" || pixel2.element == "scp_1424") {
+ pixel2.origElem = pixel2.element
+ pixel2.element = "melted_animal"
+ }
+ else if (pixel2.element == "skin" || pixel2.element == "meat" || pixel2.element == "cured_meat" || pixel2.element == "rotten_meat" || pixel2.element == "cooked_meat" ) {
+ pixel2.element = "fused_organism"
+ }
+ else if (pixel2.element == "dust" || pixel2.element == "cloth" || pixel2.element == "cloth_scrap" || pixel2.element == "hair" || pixel2.element == "loose_hair") {
+ deletePixel(pixel2.x,pixel2.y)
+ }
+ if (elements[pixel2.element].melteda && (pixel2.element != "melted_body" || pixel2.shirtless == true && Math.random() > 0.5) && pixel2.element != "fused_organism") {
+ pixel2.element = "fused_organism"
+ }
+ else if (elements[pixel2.element].isBio == true) {
+ pixel2.origElem = pixel2.element
+ if (pixel2.con) {
+ delete pixel2.con
+ }
+ pixel2.element = "melted_animal"
+ }
+ else if (elements[pixel2.element].isHair == true || pixel2.element == "gaseous_material" || pixel2.element == "digested_material" || pixel2.element == "urine" || pixel2.element == "excrement" || pixel2.element == "brain_jar_juice") {
+ deletePixel(pixel2.x,pixel2.y)
+ }
+ },
+ melteda: true,
+ stain: 0.125,
+ stainSelf: true,
+ tempHigh: 300,
+ stateHigh: "cooked_meat",
+ tempLow: -15,
+ stateLow: "frozen_meat",
+ burn: 5,
+ burnTime: 400,
+ burnInto: "cooked_meat",
+ state: "liquid",
+ density: 2000,
+ category: "scp",
+}
+
elements.scp_008 = {
name: "SCP-008",
color: "#11111f",
@@ -741,7 +1574,7 @@ elements.frozen_008 = {
elements.body_008 = {
name: "SCP-008-1",
color: ["#069469","#047e99","#7f5fb0"],
- category: "life",
+ category: "scp",
hidden: true,
density: 1500,
state: "solid",
@@ -915,7 +1748,7 @@ elements.body_008 = {
elements.head_008 = {
color: ["#75816B","#4D6B53"],
name: "SCP-008-1",
- category: "life",
+ category: "scp",
hidden: true,
density: 1080,
state: "solid",
@@ -2174,7 +3007,7 @@ elements.scp_035 = {
color: ["#f7ead0","#faf9f6","#e9e6db"],
buttonColor: ["#11111f","#f7ead0","#f7ead0","#f7ead0","#f7ead0","#11111f","#faf9f6","#faf9f6","#faf9f6","#faf9f6","#11111f","#e9e6db","#e9e6db","#e9e6db","#e9e6db","#11111f"],
name: "SCP-035",
- hardness: 0.9,
+ hardness: 0.98,
category: "scp",
behavior: [
"CR:black_acid%0.05|CR:black_acid%0.25|CR:black_acid%0.05",
@@ -2215,7 +3048,7 @@ elements.scp_035 = {
elements.body_035 = {
color: ["#069469","#047e99","#7f5fb0"],
- name: "SCP-035-1",
+ name: "SCP-035",
category: "life",
hidden: true,
density: 1500,
@@ -2377,7 +3210,7 @@ elements.body_035 = {
}
elements.head_035 = {
- name: "SCP-035-1",
+ name: "SCP-035",
color: ["#f7ead0","#faf9f6","#e9e6db"],
category: "life",
hidden: true,
@@ -2483,7 +3316,7 @@ elements.black_acid = {
"DB%3 AND M2%10|DL%1|DB%3 AND M2%10",
"DB%3 AND M2%10|DB%5.5 AND M1|DB%3 AND M2%10",
],
- ignore: [/*"scp_804"*/"shy_head","shy_body","scp_055","head","body","body_008","head_008","scp_035","body_035","head_035","glass_shard","porcelain_shard","rad_shard","color_sand","sand","iron","steel","glass","rad_glass","stained_glass","acid_gas","neutral_acid","acid_cloud","water","salt_water","sugar_water","dirty_water","copper","gold","porcelain","plastic","bead","microplastic","molten_plastic","pool_water","chlorine","hydrogen","oxygen","ozone","gold_coin","silver","nickel","calcium"],
+ ignore: [/*"scp_804"*/"head_096","body_096","scp_055","head","body","body_008","head_008","scp_035","body_035","head_035","glass_shard","porcelain_shard","rad_shard","color_sand","sand","iron","steel","glass","rad_glass","stained_glass","acid_gas","neutral_acid","acid_cloud","water","salt_water","sugar_water","dirty_water","copper","gold","porcelain","plastic","bead","microplastic","molten_plastic","pool_water","chlorine","hydrogen","oxygen","ozone","gold_coin","silver","nickel","calcium"],
reactions: {
"caustic_potash": { elem1:null, elem2:"potassium_salt" },
"water": { elem1:null, elem2:"dirty_water" },
@@ -3169,7 +4002,7 @@ elements.scp_063 = {
"DL|XX|DL",
"M2%80 AND DL|M1 AND DL|M2%80 AND DL",
],
- ignore: ["scp_063","head_049","body_049","shy_head","shy_body","head_049_1","body_049_1","head_008_1","body_008_1","head_012_1","body_012_1","scp_999","scp_682","head","body","plant","grass","algae","cell","cancer","worm","flea","termite","ant","spider","fly","firefly","bee","stink_bug","human","bird","rat","frog","tadpole","fish","slug","snail","sapling","evergreen","cactus","kelp","coral","pistil","tree_branch","vine","bamboo_plant","mushroom_stalk","mushroom_gill","mushroom_cap","lichen","homunculus","root","hyphae","skin","porcelain"],
+ ignore: ["scp_063","head_049","body_049","head_096","body_096","head_049_1","body_049_1","head_008","body_008","head_012_1","body_012_1","scp_999","scp_682","head","body","plant","grass","algae","cell","cancer","worm","flea","termite","ant","spider","fly","firefly","bee","stink_bug","human","bird","rat","frog","tadpole","fish","slug","snail","sapling","evergreen","cactus","kelp","coral","pistil","tree_branch","vine","bamboo_plant","mushroom_stalk","mushroom_gill","mushroom_cap","lichen","homunculus","root","hyphae","skin","porcelain"],
category: "scp",
tempHigh: 190,
stateHigh: ["molten_plastic","molten_plastic","fire","dioxin"],
@@ -3194,24 +4027,24 @@ elements.scp_096 = {
},
onPlace: function(pixel) {
if (isEmpty(pixel.x, pixel.y+1)) {
- createPixel("shy_body", pixel.x, pixel.y+1);
- pixel.element = "shy_head";
+ createPixel("body_096", pixel.x, pixel.y+1);
+ pixel.element = "head_096";
}
else if (isEmpty(pixel.x, pixel.y-1)) {
- createPixel("shy_head", pixel.x, pixel.y-1);
+ createPixel("head_096", pixel.x, pixel.y-1);
pixelMap[pixel.x][pixel.y-1].color = pixel.color;
- pixel.element = "shy_body";
+ pixel.element = "body_096";
pixel.color = pixelColorPick(pixel)
}
else {
deletePixel(pixel.x, pixel.y);
}
},
- related: ["shy_body","shy_head"],
+ related: ["body_096","head_096"],
cooldown: defaultCooldown
}
-elements.shy_head = {
+elements.head_096 = {
hidden: true,
name: "SCP-096",
color: ["#ddd2d6","#C9BCC2","#b6adb2"],
@@ -3234,7 +4067,7 @@ elements.shy_head = {
}
// Find the body
- if (!isEmpty(pixel.x, pixel.y+1, true) && pixelMap[pixel.x][pixel.y+1].element == "shy_body") {
+ if (!isEmpty(pixel.x, pixel.y+1, true) && pixelMap[pixel.x][pixel.y+1].element == "body_096") {
var body = pixelMap[pixel.x][pixel.y+1];
if (body.dead) { // If body is dead, kill head
pixel.dead = body.dead;
@@ -3294,7 +4127,7 @@ elements.shy_head = {
},
},
-elements.shy_body = {
+elements.body_096 = {
name: "SCP-096",
hidden: true,
color: ["#ddd2d6","#C9BCC2","#b6adb2"],
@@ -3311,7 +4144,7 @@ elements.shy_body = {
if (tryMove(pixel, pixel.x, pixel.y+1)) { // Fall
if (!isEmpty(pixel.x, pixel.y-2, true)) { // Drag head down
var headpixel = pixelMap[pixel.x][pixel.y-2];
- if (headpixel.element == "shy_head") {
+ if (headpixel.element == "head_096") {
if (isEmpty(pixel.x, pixel.y-1)) {
movePixel(pixelMap[pixel.x][pixel.y-2], pixel.x, pixel.y-1);
}
@@ -3326,7 +4159,7 @@ elements.shy_body = {
doElectricity(pixel);
// Find the head
- if (!isEmpty(pixel.x, pixel.y-1, true) && pixelMap[pixel.x][pixel.y-1].element == "shy_head") {
+ if (!isEmpty(pixel.x, pixel.y-1, true) && pixelMap[pixel.x][pixel.y-1].element == "head_096") {
var head = pixelMap[pixel.x][pixel.y-1];
}
else { var head = null }
@@ -3417,7 +4250,7 @@ elements.shy_body = {
if (seenPixel.y < pixel.y) {
if (!isEmpty(pixel.x, pixel.y-1, true)) {
var headpixel = pixelMap[pixel.x][pixel.y-1];
- if (headpixel.element == "shy_head") {
+ if (headpixel.element == "head_096") {
if (isEmpty(pixel.x, pixel.y-3)) {
tryMove(headpixel, pixel.x, pixel.y-3);
if (isEmpty(pixel.x, pixel.y-2)) {
@@ -3455,7 +4288,7 @@ elements.shy_body = {
if (seenPixel.y > pixel.y) {
if (!isEmpty(pixel.x, pixel.y-1, true)) {
var headpixel = pixelMap[pixel.x][pixel.y-1];
- if (headpixel.element == "shy_head") {
+ if (headpixel.element == "head_096") {
if (isEmpty(pixel.x, pixel.y+1)) {
tryMove(headpixel, pixel.x, pixel.y+1);
if (isEmpty(pixel.x, pixel.y+2)) {
@@ -3482,16 +4315,16 @@ elements.shy_body = {
}
}
}
- if (isEmpty(pixel.x, pixel.y-1) || !isEmpty(pixel.x,pixel.y-1) && pixelMap[pixel.x][pixel.y-1].element != "shy_head") {
+ if (isEmpty(pixel.x, pixel.y-1) || !isEmpty(pixel.x,pixel.y-1) && pixelMap[pixel.x][pixel.y-1].element != "head_096") {
// create blood if decapitated 5% chance
if (Math.random() < 0.05 && !pixel.charge) {
createPixel("blood", pixel.x, pixel.y-1);
}
if (Math.random() < 0.9 && isEmpty(pixel.x,pixel.y-1)) {
- createPixel("shy_head",pixel.x,pixel.y-1)
+ createPixel("head_096",pixel.x,pixel.y-1)
}
else if (Math.random() < 0.025 && !isEmpty(pixel.x,pixel.y-1,true) && !outOfBounds(pixel.x,pixel.y-1) ) {
- changePixel(pixelMap[pixel.x][pixel.y-1],"shy_head")
+ changePixel(pixelMap[pixel.x][pixel.y-1],"head_096")
}
}
else if (head == null) { return }
@@ -3577,7 +4410,7 @@ elements.shy_body = {
}
// if (Math.random() > ((1-(elements[pixel.element].hardness || 1)) * (shiftDown ? 0.5 : 1))) {
}
- else if (old === pixel2.element && elements[pixel2.element].movable && !isEmpty(pixel2.x,pixel2.y+1) && !paused && pixel2.element != "shy_head" && pixel2.element != "shy_body") {
+ else if (old === pixel2.element && elements[pixel2.element].movable && !isEmpty(pixel2.x,pixel2.y+1) && !paused && pixel2.element != "head_096" && pixel2.element != "body_096") {
let x = 0; let y = 0;
if (Math.random() < 0.66) x = Math.random() < 0.5 ? 1 : -1;
if (Math.random() < 0.66) y = Math.random() < 0.5 ? 1 : -1;
@@ -3587,16 +4420,16 @@ elements.shy_body = {
}
}
else {
- if (isEmpty(pixel.x, pixel.y-1) || !isEmpty(pixel.x,pixel.y-1) && pixelMap[pixel.x][pixel.y-1].element != "shy_head") {
+ if (isEmpty(pixel.x, pixel.y-1) || !isEmpty(pixel.x,pixel.y-1) && pixelMap[pixel.x][pixel.y-1].element != "head_096") {
// create blood if decapitated 5% chance
if (Math.random() < 0.05 && !pixel.charge) {
createPixel("blood", pixel.x, pixel.y-1);
}
if (Math.random() < 0.2 && isEmpty(pixel.x,pixel.y-1)) {
- createPixel("shy_head",pixel.x,pixel.y-1)
+ createPixel("head_096",pixel.x,pixel.y-1)
}
else if (!isEmpty(pixel.x,pixel.y-1,true) && !outOfBounds(pixel.x,pixel.y-1) && (Math.random() < 0.1 || elements[pixelMap[pixel.x][pixel.y].element].state != "solid")) {
- changePixel(pixelMap[pixel.x][pixel.y-1],"shy_head")
+ changePixel(pixelMap[pixel.x][pixel.y-1],"head_096")
}
}
else if (head == null) { return }
@@ -3719,7 +4552,6 @@ elements.body_173 = {
hidden: true,
density: 2400,
state: "solid",
- conduct: .025,
tempHigh: 15050,
hardness: 1,
stateHigh: ["magma","magma","magma","magma","rust","rust","rust","magma","magma","magma","magma","rust","rust","rust","spray_paint"],
@@ -3999,7 +4831,6 @@ elements.head_173 = {
hidden: true,
density: 2400,
state: "solid",
- conduct: .025,
tempHigh: 15050,
hardness: 1,
stateHigh: ["magma","magma","magma","magma","rust","rust","rust","magma","magma","magma","magma","rust","rust","rust","spray_paint"],
@@ -4163,7 +4994,7 @@ elements.scp_229 = {
for (var i = 0; i < coords.length; i++) {
if (!isEmpty(coords[i].x,coords[i].y) && !outOfBounds(coords[i].x,coords[i].y)) {
var electric = pixelMap[coords[i].x][coords[i].y]
- if (elements[electric.element].category == "nervous system" && Math.random() > 0.5 || electric.element == "thunder_cloud" || electric.charge || electric.element == "access_door" && Math.random() > 0.75 || electric.element == "keycard_terminal" || electric.element == "level_5" || electric.element == "scp_804" && electric.active == true || elements[electric.element].category == "logic" || electric.element == "brain" || electric.element == "fish" || electric.element == "frog" || electric.element == "rat" || electric.element == "bird" || electric.element == "head" || electric.element == "head_1000" || electric.element == "head_035" || electric.element == "head_008" || electric.element == "battery" || electric.element == "electric" || electric.element == "lightning" || electric.element == "malware" || electric.element == "gray_goo") {
+ if (elements[electric.element].category == "nervous system" && Math.random() > 0.5 || electric.element == "thunder_cloud" || electric.charge || electric.chargeCD || electric.element == "access_door" && Math.random() > 0.75 || electric.element == "keycard_terminal" || electric.element == "level_5" || electric.element == "scp_804" && electric.active == true || elements[electric.element].category == "logic" || electric.element == "brain" || electric.element == "fish" || electric.element == "frog" || electric.element == "rat" || electric.element == "bird" || electric.element == "head" || electric.element == "head_1000" || electric.element == "head_035" || electric.element == "head_008" || electric.element == "battery" || electric.element == "electric" || electric.element == "lightning" || electric.element == "malware" || electric.element == "gray_goo") {
if (electric.y > pixel.y && electric.x > pixel.x && isEmpty(pixel.x+1,pixel.y+1)) {
createPixel("scp_229",pixel.x+1,pixel.y+1)
var electric2 = pixelMap[pixel.x+1][pixel.y+1]
@@ -4267,7 +5098,7 @@ elements.scp_229 = {
explodeAt(electric.x,electric.y,300,["plasma","plasma","plasma","plasma","plasma","plasma","plasma","radiation","radiation","radiation","radiation","rad_steam","electric","electric"])
pixel.nCD = 2
}
- else if (electric.charge) {
+ else if (electric.charge || electric.chargeCD) {
deletePixel(electric.x,electric.y)
createPixel("scp_229",electric.x,electric.y)
electric = pixelMap[electric.x][electric.y]
@@ -4420,6 +5251,258 @@ elements.scp_236 = {
conduct: 0.2,
}
+elements.scp_261 = {
+ name: "SCP-261",
+ color: ["#2E312E","#252623","#120F10"],
+ properties: {
+ db: 0,
+ strange: 0,
+ },
+ tick: function(pixel) {
+ if (typeof pixel.db == "undefined"){pixel.db = 0}
+ for (var i = 0; i < adjacentCoords.length; i++) {
+ var coord = adjacentCoords[i];
+ var x = pixel.x+coord[0];
+ var y = pixel.y+coord[1];
+ if (!isEmpty(x, y, true)){
+ let newPixel = pixelMap[x][y]
+ if (newPixel.charge || newPixel.chargeCD){
+ pixel.db = 10
+ }
+ }
+ }
+ for (var i = 0; i < squareCoords.length; i++) {
+ var coord = squareCoords[i];
+ var x = pixel.x+coord[0];
+ var y = pixel.y+coord[1];
+ if (!isEmpty(x, y, true)){
+ let newPixel = pixelMap[x][y]
+ if ((newPixel.element == "gold_coin" || newPixel.element == "penny" || newPixel.element == "bronze_coin" || newPixel.element == "money") && Math.random() > 0.15) {
+ pixel.strange++
+ deletePixel(newPixel.x,newPixel.y)
+ if (pixel.strange > 25 && (Math.random() > (pixel.db*0.1))) {
+ let count = 1
+ for (var i = 0; i < squareCoords.length; i++) {
+ var coord = squareCoords[i];
+ var x = pixel.x+coord[0];
+ var y = pixel.y+coord[1];
+ if (isEmpty(x,y)) {
+ if (Math.random() < 0.3) {
+ createPixel("packet",x,y);
+ pixelMap[x][y].has = vendingWeirdF[Math.floor(Math.random() * vendingWeirdF.length)]
+ }
+ else if (Math.random() < 0.65) {
+ createPixel("can",x,y);
+ pixelMap[x][y].has = vendingWeirdD[Math.floor(Math.random() * vendingWeirdD.length)]
+ }
+ else if (Math.random() < 0.78) {
+ createPixel(vendingNormF[Math.floor(Math.random() * vendingNormF.length)],x,y);
+ }
+ else {
+ createPixel(vendingNormD[Math.floor(Math.random() * vendingNormD.length)],x,y);
+ }
+ count--;
+ if (count <= 0) {
+ return pixelMap[x][y];
+ }
+ }
+ else if (!isEmpty(x,y,true) && (elements[pixelMap[x][y].element].state === "liquid" || elements[pixelMap[x][y].element].state === "gas")) {
+ if (Math.random() < 0.3) {
+ changePixel(pixelMap[x][y],"packet");
+ pixelMap[x][y].has = vendingWeirdF[Math.floor(Math.random() * vendingWeirdF.length)]
+ }
+ else if (Math.random() < 0.65) {
+ changePixel(pixelMap[x][y],"can");
+ pixelMap[x][y].has = vendingWeirdD[Math.floor(Math.random() * vendingWeirdD.length)]
+ }
+ else if (Math.random() < 0.78) {
+ changePixel(pixelMap[x][y],vendingNormF[Math.floor(Math.random() * vendingNormF.length)]);
+ }
+ else {
+ changePixel(pixelMap[x][y],vendingNormD[Math.floor(Math.random() * vendingNormD.length)]);
+ }
+ count--;
+ if (count <= 0) {
+ return pixelMap[x][y];
+ }
+ }
+ }
+ }
+ else {
+ let count = 1
+ for (var i = 0; i < squareCoords.length; i++) {
+ var coord = squareCoords[i];
+ var x = pixel.x+coord[0];
+ var y = pixel.y+coord[1];
+ if (isEmpty(x,y)) {
+ if (Math.random() < 0.5) {
+ createPixel("packet",x,y);
+ if (Math.random() < 0.06666) {
+ pixelMap[x][y].has = "crumb"
+ }
+ else if (Math.random() < 0.23333) {
+ pixelMap[x][y].has = "toast"
+ }
+ else if (Math.random() < 0.4) {
+ pixelMap[x][y].has = "bread"
+ }
+ else if (Math.random() < 0.56666) {
+ pixelMap[x][y].has = "cooked_meat"
+ }
+ else if (Math.random() < 0.73333) {
+ pixelMap[x][y].has = "chocolate"
+ }
+ else {
+ pixelMap[x][y].has = vendingNormF[Math.floor(Math.random() * vendingNormF.length)]
+ }
+ }
+ else if (Math.random() < 0.9) {
+ createPixel("can",x,y);
+ if (Math.random() < 0.23333) {
+ pixelMap[x][y].has = "soda"
+ }
+ else if (Math.random() < 0.4) {
+ pixelMap[x][y].has = "seltzer"
+ }
+ else if (Math.random() < 0.56666) {
+ pixelMap[x][y].has = "juice"
+ }
+ else if (Math.random() < 0.73333) {
+ pixelMap[x][y].has = "poison"
+ }
+ else {
+ pixelMap[x][y].has = vendingNormD[Math.floor(Math.random() * vendingNormD.length)]
+ }
+ }
+ else {
+ createPixel(vendingNormF[Math.floor(Math.random() * vendingNormF.length)],x,y);
+ }
+ count--;
+ if (count <= 0) {
+ return pixelMap[x][y];
+ }
+ }
+ else if (!isEmpty(x,y,true) && (elements[pixelMap[x][y].element].state === "liquid" || elements[pixelMap[x][y].element].state === "gas")) {
+ if (Math.random() < 0.5) {
+ changePixel(pixelMap[x][y],"packet");
+ if (Math.random() < 0.06666) {
+ pixelMap[x][y].has = "crumb"
+ }
+ else if (Math.random() < 0.23333) {
+ pixelMap[x][y].has = "toast"
+ }
+ else if (Math.random() < 0.4) {
+ pixelMap[x][y].has = "bread"
+ }
+ else if (Math.random() < 0.56666) {
+ pixelMap[x][y].has = "cooked_meat"
+ }
+ else if (Math.random() < 0.73333) {
+ pixelMap[x][y].has = "chocolate"
+ }
+ else {
+ pixelMap[x][y].has = vendingNormF[Math.floor(Math.random() * vendingNormF.length)]
+ }
+ }
+ else if (Math.random() < 0.9) {
+ changePixel(pixelMap[x][y],"can");
+ if (Math.random() < 0.23333) {
+ pixelMap[x][y].has = "soda"
+ }
+ else if (Math.random() < 0.4) {
+ pixelMap[x][y].has = "seltzer"
+ }
+ else if (Math.random() < 0.56666) {
+ pixelMap[x][y].has = "juice"
+ }
+ else if (Math.random() < 0.73333) {
+ pixelMap[x][y].has = "poison"
+ }
+ else {
+ pixelMap[x][y].has = vendingNormD[Math.floor(Math.random() * vendingNormD.length)]
+ }
+ }
+ else {
+ changePixel(pixelMap[x][y],vendingNormF[Math.floor(Math.random() * vendingNormF.length)]);
+ }
+ count--;
+ if (count <= 0) {
+ return pixelMap[x][y];
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ if (pixel.db > 0) {
+ pixel.db--
+ }
+ if (Math.random() > 0.95 && pixel.strange > 0) {
+ pixel.strange--
+ }
+ tryMove(pixel, pixel.x, pixel.y+1);
+ doDefaults(pixel);
+ },
+ grain: 0.5,
+ behavior: behaviors.WALL,
+ tempHigh: 1200,
+ stateHigh: ["molten_galvanized_steel","molten_galvanized_steel","molten_galvanized_steel","molten_galvanized_steel","armageddon"],
+ stateHighColorMultiplier: 0.86,
+ hardness: 0.99,
+ breakInto: ["galvanized_steel","galvanized_steel","galvanized_steel","galvanized_steel","armageddon"],
+ breakIntoColorMultiplier: [1.1,1,0.86],
+ category: "scp",
+ state: "solid",
+ density: 7850,
+}
+
+elements.packet = {
+ behavior: behaviors.POWDER,
+ category: "powders",
+ hidden: true,
+ state: "solid",
+ color: ["#dc2c37","#edce66","#0dbf62","#0679ea","#7144b2","#d92097","#dc2c37","#edce66","#0dbf62","#0679ea","#7144b2","#d92097","#c5dede","#c5dede","#c5dede","#c5dede","#c5dede","#c5dede","#c5dede","#c5dede","#c5dede","#dbbfe3", "#cc95db","#c477d9","#b85cd1", "#8d5cd1","#9e77d9","#cc95db", "#95a4db","#7789d9","#5c68d1", "#c1bfe3"],
+ tempHigh: 250,
+ stateHigh: ["metal_scrap","metal_scrap","confetti","glitter","confetti","glitter","confetti","glitter","confetti","glitter","confetti","glitter","sawdust","dust","glass_shard","confetti","glitter","confetti","glitter","confetti","glitter","confetti","glitter","confetti","glitter","sawdust","dust","glass_shard"],
+ burn: 10,
+ burnTime: 200,
+ burnInto: ["metal_scrap","metal_scrap","confetti","glitter","confetti","glitter","confetti","glitter","confetti","glitter","confetti","glitter","sawdust","dust","glass_shard","confetti","glitter","confetti","glitter","confetti","glitter","confetti","glitter","confetti","glitter","sawdust","dust","glass_shard"],
+ breakInto: ["metal_scrap","metal_scrap","confetti","glitter","confetti","glitter","confetti","glitter","confetti","glitter","confetti","glitter","sawdust","dust","glass_shard","confetti","glitter","confetti","glitter","confetti","glitter","confetti","glitter","confetti","glitter","sawdust","dust","glass_shard"],
+ properties: {
+ has: "dust",
+ },
+ onChange: function(pixel) {
+ releaseElement(pixel,pixel.has,4,true)
+ },
+ onDelete: function(pixel) {
+ releaseElement(pixel,pixel.has,4,true)
+ },
+ breakIntoColorMultiplier: [1.1,1,0.86],
+}
+
+elements.can = {
+ behavior: behaviors.POWDER,
+ category: "powders",
+ hidden: true,
+ state: "solid",
+ color: ["#ff5e5e","#ffcc5e","#76ff5e","#5ed4ff","#5e61ff","#cf5eff","#d1c6be","#b5c0ad","#b9b8bc","#d1c6be","#b5c0ad","#b9b8bc","#ff5e5e","#ffcc5e","#76ff5e","#5ed4ff","#5e61ff","#cf5eff","#5e807d","#5e807d","#679e99","#5e807d","#5e807d"],
+ tempHigh: 250,
+ stateHigh: ["metal_scrap","metal_scrap","metal_scrap","metal_scrap","metal_scrap","rust","metal_scrap","rust","oxidized_copper","bead","glass_shard","glitter","glass_shard"],
+ breakInto: ["metal_scrap","metal_scrap","metal_scrap","metal_scrap","metal_scrap","rust","metal_scrap","rust","oxidized_copper","bead","glass_shard","glitter","glass_shard"],
+ hardness: 0.266,
+ properties: {
+ has: "foam",
+ },
+ onChange: function(pixel) {
+ releaseElement(pixel,pixel.has,4,true)
+ },
+ onDelete: function(pixel) {
+ releaseElement(pixel,pixel.has,4,true)
+ },
+ breakIntoColorMultiplier: [1.1,1,0.86],
+}
+
elements.scp_391 = {
name: "SCP-391",
color: ["#D7D0CA","#D7BFB5","#B49171","#986536","#B49171","#623613"],
@@ -6708,7 +7791,7 @@ elements.scp_1600 = {
pixel.color = "rgb("+avg.join(",")+")";
}
},
- ignore: ["scp_1600_1","gallium","brass","zinc","sulfur","body_173","head_173","shy_body","shy_head","body_049","head_049","scp_035","scp_1015","scp_999","scp_063","scp_055"],
+ ignore: ["scp_261","scp_1600_1","gallium","brass","zinc","sulfur","body_173","head_173","body_096","head_096","body_049","head_049","scp_035","scp_1015","scp_999","scp_063","scp_055"],
canPlace: true,
reactions: {
"scp_682":{ stain2:"#CA8E2F", chance:0.05,},
diff --git a/mods/solubility.js b/mods/solubility.js
index 28e8fc0e..64400bad 100644
--- a/mods/solubility.js
+++ b/mods/solubility.js
@@ -1,5 +1,5 @@
/*
-* Version 1.0.0
+* Version 1.1.0
*/
dependOn("orchidslibrary.js", ()=>{
@@ -46,15 +46,15 @@ dependOn("orchidslibrary.js", ()=>{
}
function aqueousReaction(p1, p2){
for(let elem in p1.elemsDissolved){
- if(elements[elem].reactions != null && p2.element != "water" && elements[elem].reactions[p2.element] != undefined){
+ if(elements[elem].reactions != null && p2.element != "water" && (elements[elem].reactions[p2.element] != undefined || (elements[p2.element].reactions != null && elements[p2.element].reactions[elem] != undefined))){
- let r = elements[elem].reactions[p2.element];
+ let r = elements[elem].reactions[p2.element] || elements[p2.element].reactions[elem];
if(r.tempMin && !((p1.temp >= r.tempMin) && (p2.temp >= r.tempMin))){
return false;
}
if(r.tempMax && !((p1.temp <= r.tempMax) && (p2.temp <= r.tempMax))){
return false;
- }
+ }
if(r.charged && !(p1.charge || p2.charge)){
return false;
}
@@ -253,13 +253,13 @@ dependOn("orchidslibrary.js", ()=>{
let num = Math.random();
if(elem === null){
for(let e in pixel.elemsDissolved){
- if(num <= ((pixel.elemsDissolved[e]/100)/elements[e].solubility.water)){
+ if(num <= ((pixel.elemsDissolved[e]/100)/elements[e].solubility.water)/4){
elem = e;
}
}
}
elem = (elem == null) ? "steam" : elem;
- changePixel(pixel, elem);
+ changePixel(pixel, elem, 110);
pixel.dissolvedElems = {};
}
}
@@ -282,5 +282,6 @@ dependOn("orchidslibrary.js", ()=>{
elements.water.tick = solventTick;
elements.water.behavior = behaviors.SOLVENT;
elements.water.tempHigh = undefined;
- elements.water.solventTempHigh = 100;
+ elements.water.solventTempHigh = 101;
+ elements.steam.tempLow = 99
}, true);
diff --git a/mods/war.js b/mods/war.js
new file mode 100644
index 00000000..967d5767
--- /dev/null
+++ b/mods/war.js
@@ -0,0 +1,51 @@
+elements.land = {
+color: "#096600",
+category: "war",
+behavior: behaviors.WALL,
+};
+elements.red = {
+name: "redville",
+color: "#880000",
+category: "war",
+behavior: [
+"XX|CH:land>red%50 AND CH:blu>land%25 AND CH:kerdly>suselle%5|XX",
+"CH:land>red%50 AND CH:blu>land%25 AND CH:kerdly>suselle%5|XX|CH:land>red%50 AND CH:blu>land%25 AND CH:kerdly>suselle%5",
+"XX|CH:land>red%50 AND CH:blu>land%25 AND CH:kerdly>suselle%5|XX",
+],
+};
+elements.blu = {
+name: "blue city",
+color: "#000088",
+category: "war",
+behavior: [
+"XX|CH:land>blu%50 AND CH:red>land%25 AND CH:kerdly>kralsei%5|XX",
+"CH:land>blu%50 AND CH:red>land%25 AND CH:kerdly>kralsei%5|XX|CH:land>blu%50 AND CH:red>land%25 AND CH:kerdly>kralsei%5",
+"XX|CH:land>blu%50 AND CH:red>land%25 AND CH:kerdly>kralsei%5|XX",
+],
+};
+elements.kerdly = {
+name: "water",
+category: "war",
+color: "#5599ff",
+behavior: behaviors.WALL,
+};
+elements.suselle = {
+name: "redville water",
+category: "war",
+color: "#7777dd",
+behavior: [
+"XX|CH:land>red%50 AND CH:blu>land%25 AND CH:kerdly>suselle%5 AND CH:kralsei>suselle%1|XX",
+"CH:land>red%50 AND CH:blu>land%25 AND CH:kerdly>suselle%5 AND CH:kralsei>suselle%1|XX|CH:land>red%50 AND CH:blu>land%25 AND CH:kerdly>suselle%5 AND CH:kralsei>suselle%1",
+"XX|CH:land>red%50 AND CH:blu>land%25 AND CH:kerdly>suselle%5 AND CH:kralsei>suselle%1|XX",
+],
+};
+elements.kralsei = {
+name: "blue city water",
+category: "war",
+color: "#3377ff",
+behavior: [
+"XX|CH:land>blu%50 AND CH:red>land%25 AND CH:kerdly>kralsei%5 AND CH:suselle>kralsei%1|XX",
+"CH:land>blu%50 AND CH:red>land%25 AND CH:kerdly>kralsei%5 AND CH:suselle>kralsei%1|XX|CH:land>blu%50 AND CH:red>land%25 AND CH:kerdly>kralsei%5 AND CH:suselle>kralsei%1",
+"XX|CH:land>blu%50 AND CH:red>land%25 AND CH:kerdly>kralsei%5 AND CH:suselle>kralsei%1|XX",
+],
+};
diff --git a/mods/zoom.js b/mods/zoom.js
new file mode 100644
index 00000000..a83fea4d
--- /dev/null
+++ b/mods/zoom.js
@@ -0,0 +1,148 @@
+// IIFE because paranoid
+(() => {
+ const zoom_levels = [
+ 0.5,
+ 1,
+ 2,
+ 3,
+ 6,
+ 12
+ ]
+
+ window.zoom_level = 1
+ window.zoom_panning = [0,0]
+
+ function handle_zoom(direction){
+ switch (direction){
+ case "in":
+ if (!(zoom_level+1 in zoom_levels)) { break; }
+ window.zoom_level += 1
+ break;
+ case "out":
+ if (!(zoom_level-1 in zoom_levels)) { break; }
+ window.zoom_level -= 1
+ break;
+ }
+ rescale()
+ }
+
+ function handle_pan(direction, speed){
+ switch (direction){
+ case "right":
+ zoom_panning[0] -= speed
+ break;
+ case "left":
+ zoom_panning[0] += speed
+ break;
+ case "up":
+ zoom_panning[1] += speed
+ break;
+ case "down":
+ zoom_panning[1] -= speed
+ break;
+ }
+ rescale()
+ }
+
+ function rescale(){
+ log_info()
+
+ const scale = zoom_levels[zoom_level]
+ const x = zoom_panning[0] * (pixelSize * scale)
+ const y = zoom_panning[1] * (pixelSize * scale)
+
+ gameCanvas.style.transform = `translate(${x}px,${y}px) scale(${scale})`
+ }
+
+ function log_info(){
+ // Values are negated to make them more intuitive
+ const x_pan = (-zoom_panning[0]).toString().padEnd(4)
+ const y_pan = (-zoom_panning[1]).toString().padEnd(4)
+
+ zoom_data_div.innerText = ""
+ zoom_data_div.innerText += `Scale: ${zoom_levels[zoom_level]}x\n`
+ zoom_data_div.innerText += `Pan : ${x_pan}, ${y_pan}`
+ }
+
+ function patch_keybinds(){
+ // Be more granular at higher zoom levels
+ const speed_a = () => zoom_level > 3 ? 5 : 10
+ const speed_b = () => zoom_level > 3 ? 10 : 20
+
+ keybinds["9"] = () => handle_zoom("in")
+ keybinds["0"] = () => handle_zoom("out")
+
+ keybinds["w"] = () => handle_pan("up", speed_a())
+ keybinds["a"] = () => handle_pan("left", speed_a())
+ keybinds["s"] = () => handle_pan("down", speed_a())
+ keybinds["d"] = () => handle_pan("right", speed_a())
+
+ keybinds["W"] = () => handle_pan("up", speed_b())
+ keybinds["A"] = () => handle_pan("left", speed_b())
+ keybinds["S"] = () => handle_pan("down", speed_b())
+ keybinds["D"] = () => handle_pan("right", speed_b())
+ }
+
+ function patch_ui(){
+ const zoom_data_div = document.createElement("div")
+ document.getElementById("logDiv").appendChild(zoom_data_div)
+
+ const controls_table = document.getElementById("controlsTable").lastElementChild
+ controls_table.insertAdjacentHTML("beforeBegin",`
+
+ | Zoom in/out |
+
+ 9/
+ 0
+ |
+
+
+ | Pan |
+
+ W
+ A
+ S
+ D
+ |
+
+
+ | Pan (fast) |
+
+ Shift +
+ W
+ A
+ S
+ D
+ |
+
+ `)
+ }
+
+ // Redefine to give correct numbers when zoomed
+ window.getMousePos = (canvas, evt) => {
+ if (evt.touches) {
+ evt.preventDefault();
+ evt = evt.touches[0];
+ isMobile = true;
+ }
+ const rect = canvas.getBoundingClientRect();
+
+ let x = (evt.clientX - rect.left) / zoom_levels[zoom_level];
+ let y = (evt.clientY - rect.top) / zoom_levels[zoom_level];
+
+ x = Math.floor((x / canvas.clientWidth) * (width+1));
+ y = Math.floor((y / canvas.clientHeight) * (height+1));
+
+ return {x:x, y:y};
+ }
+
+ runAfterReset(() => {
+ window.zoom_level = 1
+ rescale()
+ })
+
+ runAfterLoad(() => {
+ patch_keybinds()
+ patch_ui()
+ })
+})()