diff --git a/mod-list.html b/mod-list.html
index 6f497af1..81272bed 100644
--- a/mod-list.html
+++ b/mod-list.html
@@ -196,7 +196,7 @@
| texturepack.js | Tools that let you create and share custom texture packs | nousernamefound |
| the_ground.js | Several rock types, worldgen settings, and gemstones | Alice |
| worldEdit.js | Selection and editing tools | RedBirdly |
-| worldgenlibrary.js | World generation library | Adora |
+| worldgenlibrary.js | World generation library | Orchid |
| Science & Chemistry |
| alcohol.js | Methanol, (iso-)propanol, and butanol | Alice |
@@ -234,7 +234,7 @@
| metals.js | Several metals | Alice |
| mixture.js | Many chemicals can be mixed | lllllllllwith10ls |
| more_gold.js | Green Gold | pixelegend4 |
-| morechemistry.js | New chemicals, compounds, and machines | Adora |
+| morechemistry.js | New chemicals, compounds, and machines | Orchid |
| moreliquids.js | Various liquids | te-agma-at |
| neutronium_compressor.js | Compressor from Minecraft's Avaritia mod that compresses 10,000 pixels of an element into a singularity | Alice |
| noblegas.js | The missing noble gases | nousernamefound |
@@ -253,6 +253,7 @@
| colored_lightbulbs.js | Light bulb that can be painted | guzzo86, ggod |
| combustion.js | Components necessary for combustion engines | uptzik |
| conveyance.js | Conveyors, operated with and without electricity | Melecie |
+| datawire.js | Adds a wire that transfers data and other operators and machines for it | Orchid |
| drill.js | Drills made out of several materials | Suss |
| ExtraMachines.js | Sensors, energy resources, materials, and more | Mecoolnotcool |
| fans.js | Fans | Cube14yt |
@@ -271,6 +272,7 @@
| pushers.js | Pixels that push elements away from them | Alice |
| sandboxels.js | Digital screen to play a mini version of Sandboxels | Nekonico |
| schematics.js | Schematics for logic gates | SquareScreamYT |
+| scp.js | Mod for the SCP Foundation, a secretive organization that contains anomalous objects away from the public, from a collaborative writing website. | Nekonico |
| spouts.js | Spouts for all liquids | kaeud |
| state_voids.js | Several elements that delete specific states of matter | Alice |
| switches.js | Electrical switches that can be toggled | Alice |
@@ -292,6 +294,7 @@
| more_breaking.js | More elements can be broken | Alice |
| rays.js | More Ray types | Alice |
| rays++.js | Couple more rays | uptzik |
+| scp.js | Creatures and items from the SCP Wiki | Nekonico |
| subspace.js | The Subspace Tripmine from Roblox | nousernamefound |
| war_crimes.js | Tear gas and more | voidapex11 |
| weapons.js | Variety of different weapons | Jayd |
@@ -350,8 +353,9 @@
| ocean.js | Marine life | SquareScreamYT |
| ores.js | Ore generation along with tools to mine them | nousernamefound |
| petal_dye.js | Boil petals to make dye | Suss |
-| plants.js | Wide variety of new plants and fruits | Adora |
+| plants.js | Wide variety of new plants and fruits | Orchid |
| primordial_birthpool.js | Cross between Primordial Soup and Birthpool. Requires fey_and_more.js | Alice |
+| scp.js | Creatures and items from the SCP Wiki | Nekonico |
| spring.js | Many nature elements, like sakura trees, butterflies, beehives, and more | R74n |
| the_ground_og.js | Simplified and more stable version of the_ground.js | Alice |
| the_ground.js | Several rock types, worldgen settings, and gemstones | Alice |
@@ -361,7 +365,7 @@
| Fun & Games |
| 10kelements.js | Customizable amount of randomly generated elements | nousernamefound |
| all_around_fillers.js | Directional Filler variants | idk73248 |
-| allliquids.js | Made all elements liquids | Adora |
+| allliquids.js | Made all elements liquids | Orchid |
| amogus.js | Small Among Us structure | Alice |
| bfdi.js | Several references to Battle for Dream Island | Taterbob |
| citybuilding.js | Seeds that create miniature buildings and other city-related items | SquareScreamYT |
@@ -391,6 +395,7 @@
| random_elems.js | Curated randomly generated elements | Alice |
| random_liquids.js | Randomly generates liquids on game load | Alice |
| sbmixup.js | Silly elements from a Mix-Up! game | stefanblox |
+
| scp.js | Creatures and items from the SCP Wiki | Nekonico |
| sports_beta.js | Several sports items | BluBun5193 |
| star_wars.js | Various items from Star Wars by Disney | SeaPickle754 |
| sus.js | Among Us crewmate | Nv7 |
@@ -440,7 +445,7 @@
| changeTempReactionParameter.js | The changeTemp property to modded reactions | Alice |
| code_library.js | Functions and variables common to some other mods | Alice |
| controllable_pixel_test.js | Pixel that can be controlled with the keyboard keys [More Info] [PC ONLY] | Alice |
-| customexplosion.js | Added a custom explosion element and interface for it. check out its source code for how modders can use it | Alex |
+| customexplosion.js | Added a custom explosion element and interface for it. | Orchid |
| date_test.js | K-pop idol birthday testing stuff | Alice |
| drawPixels_change_test.js | Test of altering drawPixels(). Gives burning pixels a red overlay similar to the yellow overlay for charged pixels | Alice |
| example_mod.js | Example mod for new modders | R74n |
@@ -455,7 +460,9 @@
| modlangs.js | Customisable property in an element to allow for translations in mods. See the file for instructions on how to implement | SquareScreamYT |
| nested_for_reaction_example.js | Example of using a nested for loop to add reactions. It makes various things kill plants | Alice |
| nv7.js | Giant Nv7 image [Large] | Nv7 |
+| orchidslibrary.js | Library used by morechemistry.js, plants.js, and datawire.js | Orchid |
| place_all_elements.js | Experimental function that places every pixel | Alice |
+| PRNGworldgenlib.js | World generation library with seeded randomness | Orchid |
| randomness_but_tick.js | Random experimental elements using the tick function feature | Alice |
| randomness_but_tool.js | Random experimental elements using the tool function feature | Alice |
| randomness.js | Random experimental elements | Alice |
@@ -464,7 +471,7 @@
| structure_test.js | Test for implementing structures into Sandboxels | Alice |
| test.js | Test that adds mayo :) | R74n |
| tool_pixel_behavior.js | Gives unique behaviors to tools if placed with cheats | Alice |
-| worldgenlibrary.js | World generation library | Adora |
+| worldgenlibrary.js | World generation library | Orchid |
| worldgen_test.js | Element that generates a save with a grass layer, dirt layer, rock layer, and a pond | Alice |
| Broken or Deprecated |
diff --git a/mods/PRNGworldgenlib.js b/mods/PRNGworldgenlib.js
new file mode 100644
index 00000000..39aa13d3
--- /dev/null
+++ b/mods/PRNGworldgenlib.js
@@ -0,0 +1,161 @@
+/*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;
+}
+eLists.STONEELEMS = ["rock", "gravel", "tuff", "basalt", "rock_wall"];
+let oreChances = {
+ diamond: 0.045,
+ gold: 0.1,
+ silver: 0.2,
+ tungsten: 0.3,
+ iron: 0.4,
+ copper: 0.6,
+ charcoal: 0.8,
+ uranium: 0.805,
+ aluminum: 1
+}
+class biome {
+ constructor(layersArr, yLevels, properties, afterFunc = false){
+ this.layers = layersArr;
+ this.yLevels = yLevels;
+ this.vMulti = 1;
+ for(let item in properties){
+ this[item] = properties[item];
+ }
+ this.generate = function(seed){
+ autoResizeCanvas();
+ 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);
+ let h = level + heightIncrease;
+ for(let y = 0; y <= h; 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);
+ if(placed != null && this.temp != null){
+ placed.temp = this.temp;
+ }
+ if(elem == "sapling" && placed){
+ if(this.wc != null){
+ if(Array.isArray(this.wc)){
+ let c = this.wc[Math.round(Math.random()*this.wc.length)];
+ while(c == undefined){
+ c = this.wc[Math.round(Math.random()*this.wc.length)];
+ }
+ placed.wc = c;
+ } else {
+ placed.wc = this.wc;
+ }
+ }
+ if(this.lc != null){
+ if(Array.isArray(this.lc)){
+ let c = this.lc[Math.round(Math.random()*this.lc.length)];
+ while(c == undefined){
+ c = this.lc[Math.round(Math.random()*this.lc.length)];
+ }
+ placed.lc = c;
+ } else {
+ placed.lc = this.lc;
+ }
+ }
+ }
+ }
+ }
+ }
+ this.generateOreVeins(seed, this.vMulti);
+ };
+ }
+
+ 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;
+ if(c <= 0.3){
+ let c2 = pseudorandom((seed/2**32)*(x*y)*3)/11;
+ let ore;
+ for(let e in oreChances){
+ if(c2 <= oreChances[e]){
+ ore = e;
+ break;
+ }
+ }
+ let p = getPixel(x,y);
+ if(p != null && eLists.STONEELEMS.includes(p.element)){
+ tryCreate(ore, x, y, true);
+ let a = true;
+ let x2 = x, y2 = y;
+ while(a){
+ let hasStone = false;
+ for(let coords of squareCoords){
+ 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)){
+ hasStone = true;
+ tryCreate(ore, x2, y2, true);
+ }
+ if((pseudorandom((seed/2**32)*(x2*y2)*8)/11) < 0.15){
+ a = false;
+ break;
+ }
+ }
+ a = (hasStone) ? a : false;
+ }
+ }
+ }
+ }
+ }
+ if(this.afterFunc != null){
+ this.afterFunc(seed);
+ }
+ }
+}
+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}),
+}
+let seed = Math.random()*(2**32);
+enabledMods.forEach((item)=>{
+ if(item.includes("plants.js")){
+ 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";
+ if(elem != undefined && elem != "grass"){elem += "_seed"};
+ elem = (elem == undefined) ? "apple_seed" : elem;
+ tryCreate(elem, i, 42);
+ }
+ }});
+ }
+});
+elements.PRNGgenerate = {
+ category: "tools",
+ onSelect: function(){
+ let arr = [];
+ Object.keys(biomes).forEach(function(b){arr.push(b);})
+ promptInput("Leave blank to generate new seed. Your current seed is: " + seed, function(i){
+ seed = parseInt(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: ");
+ }, "Enter seed:");
+ }
+}
+elements.view_seed = {
+ category: "tools",
+ onSelect: function(){
+ alert(seed);
+ selectElement("dirt");
+ }
+}
diff --git a/mods/bf.js b/mods/bf.js
new file mode 100644
index 00000000..830805ee
--- /dev/null
+++ b/mods/bf.js
@@ -0,0 +1,283 @@
+async function _modprompt(message, defaultValue = "") { // thanks to ggod for this prompt function. Taken from nousersthings.js
+ return new Promise(resolve => {
+ promptInput(message, (result) => {
+ resolve(result);
+ }, "bf.js is asking you...", defaultValue);
+ })
+}
+
+class Interpreter {
+ constructor() {
+ this.map = new Array(64).fill(0)
+ this.index = 0
+ this.ci = 0
+ this.loops = []
+ this.code = ""
+ this.tsay = ""
+ }
+
+ async run(px) {
+ while (this.ci < this.code.length) {
+ const token = this.code[this.ci]
+
+ switch (token) {
+ case ">":
+ if (this.index + 1 == this.map.length) {
+ this.map.push(0)
+ }
+ this.index++
+ break
+
+ case "<":
+ if (this.index - 1 != -1) {
+ this.index--
+ }
+ break
+
+ case "+":
+ this.map[this.index]++
+ break
+
+ case "-":
+ this.map[this.index]--
+ break
+
+ case ".":
+ this.tsay += String.fromCharCode(this.map[this.index])
+ break
+
+ case "!":
+ promptText(this.tsay, () => { }, "bf.js")
+ break
+
+ case "/":
+ this.tsay = ""
+ break
+
+ case ",":
+ const ans = await _modprompt("")
+ if (ans.trim().length > 0) {
+ this.map[this.index] = ans[0].charCodeAt(0)
+ }
+ break
+
+ case "[":
+ if (this.map[this.index] === 0) {
+ let open = 1
+ while (open > 0) {
+ this.ci++
+ if (this.code[this.ci] === "[") open++
+ else if (this.code[this.ci] === "]") open--
+ }
+ } else {
+ this.loops.push(this.ci)
+ }
+ break
+
+ case "]":
+ if (this.map[this.index] !== 0) {
+ this.ci = this.loops[this.loops.length - 1]
+ } else {
+ this.loops.pop()
+ }
+ break
+ }
+
+ this.ci++
+ }
+
+ px.running = false
+ }
+}
+
+const bftokens = {
+ bf_base: "#00ff00",
+ bf_remote_base: "#008600",
+ ">": "#ff7f00",
+ "<": "#ff00ff",
+ "+": "#00ffff",
+ "-": "#800080",
+ "[": "#ff1493",
+ "]": "#1e90ff",
+ ".": "#ffd700",
+ ",": "#ff4500",
+ "!": "#ff69b4",
+ "split": "#565656",
+ "act": "#ffc400",
+}
+const bftokenslist = Object.keys(bftokens)
+
+elements.bf_base = {
+ category: "bf",
+ color: "#00ff00",
+ state: "solid",
+ behavior: behaviors.WALL,
+ conduct: 1,
+ tick: (px) => {
+ if (pixelTicks == px.start) {
+ px.act = false
+ px.interpreter = new Interpreter()
+ px.base = [px.x, px.y]
+ px.running = false
+ }
+
+ if (!(px.interpreter instanceof Interpreter)) {
+ px.interpreter = new Interpreter()
+ }
+ },
+
+}
+
+let remotebase1 = undefined
+let bfreader = undefined
+let bfreader2 = undefined
+
+elements.bf_remote_base = {
+ category: "bf",
+ color: "#008600",
+ state: "solid",
+ behavior: behaviors.WALL,
+ onSelect: async function () {
+ var bfans1 = await _modprompt("Please input in the coordinates of the desired pixel. When it activates, this activates. (X,Y)", "0,0");
+ if (!bfans1) { return }
+ let [x, y] = bfans1.split(",")
+ remotebase1 = [Number(x), Number(y)]
+ },
+ tick: (px) => {
+ if (pixelTicks == px.start) {
+ px.act = false
+ px.base = pixelMap[remotebase1[0]][remotebase1[1]].base
+ if (!pixelMap[remotebase1[0]][remotebase1[1]].remotes) {
+ pixelMap[remotebase1[0]][remotebase1[1]].remotes = []
+ }
+ pixelMap[remotebase1[0]][remotebase1[1]].remotes.push([px.x, px.y])
+ px.cd = false
+ }
+ },
+}
+
+elements.reader = {
+ category: "bf",
+ color: "#008600",
+ state: "solid",
+ behavior: behaviors.WALL,
+ conduct: 1,
+ onSelect: async function () {
+ var bfans2 = await _modprompt("Please input in the desired value to activate when read.", "0");
+ if (!bfans2) { return }
+ bfreader = Number(bfans2)
+ },
+ tick: (px) => {
+ if (pixelTicks == px.start) {
+ px.tread = bfreader
+ }
+ },
+}
+
+elements.pointer_reader = {
+ category: "bf",
+ color: "#008600",
+ state: "solid",
+ behavior: behaviors.WALL,
+ conduct: 1,
+ onSelect: async function () {
+ var bfans3 = await _modprompt("Please input in the desired pointer and value to activate when read. (pointer,value)", "0,0");
+ if (!bfans3) { return }
+ let [x, y] = bfans3.split(",")
+ bfreader2 = [Number(x), Number(y)]
+ },
+ tick: (px) => {
+ if (pixelTicks == px.start) {
+ px.tread = bfreader2
+ }
+ },
+}
+
+elements.bf_runner = {
+ category: "bf",
+ color: "#ababab",
+ tool: (px) => {
+ if (px.element == "bf_base" && !px.running) {
+ px.running = true
+ px.act = true
+ px.interpreter.map.fill(0)
+ px.interpreter.code = ""
+ px.interpreter.index = 0
+ px.interpreter.ci = 0
+ }
+ }
+}
+
+for (let token of bftokenslist) {
+ if (token == "bf_base" || token == "bf_remote_base") { continue }
+ elements[token] = {
+ category: "bf",
+ color: bftokens[token],
+ state: "solid",
+ behavior: behaviors.WALL,
+ tick: (px) => {
+ if (!px.base) {
+ px.way = "l"
+ px.act = false
+ const ns = getNeighbors(px)
+ if (ns.length > 0) {
+ if (!isEmpty(px.x - 1, px.y)) {
+ const left = ns[0]
+ if (bftokenslist.includes(left.element) && left.base) {
+ px.base = left.base
+ }
+ }
+ }
+ } else {
+ if (px.act) {
+ px.color = "#00ff00"
+ } else {
+ px.color = bftokens[token]
+ }
+ const ns = getNeighbors(px)
+ if (ns.length > 0) {
+ const left = ns[0]
+ if (bftokenslist.includes(left.element) && left.base) {
+ if (left.act && !px.act) {
+ left.act = false
+ px.act = true
+ pixelMap[px.base[0]][px.base[1]].interpreter.code += token
+ if (isEmpty(px.x + 1, px.y)) {
+ if (px.remotes) {
+ px.remotes.forEach(remote => {
+ pixelMap[remote[0]][remote[1]].act = true
+ })
+ } else {
+ pixelMap[px.base[0]][px.base[1]].interpreter.run(pixelMap[px.base[0]][px.base[1]])
+ }
+ px.act = false
+ }
+ }
+ }
+ if (ns.length >= 2) {
+ ns.forEach(n => {
+ if (n.element == "reader" && pixelMap[px.base[0]][px.base[1]].interpreter.map[pixelMap[px.base[0]][px.base[1]].interpreter.index] == n.tread) {
+ n.charge = 1
+ } else if (n.element == "pointer_reader" && pixelMap[px.base[0]][px.base[1]].interpreter.map[n.tread[0]] == n.tread[1]) {
+ n.charge = 1
+ }
+ })
+ }
+ }
+ }
+ }
+ }
+}
+
+elements.act.conduct = 0.1
+const oldact = elements.act.tick
+elements.act.tick = (px) => {
+ oldact(px)
+
+ if (px.charge && !px.act) {
+ px.act = true
+ px.charge = 0
+ } else {
+ px.charge = 0
+ }
+}
\ No newline at end of file
diff --git a/mods/biology.js b/mods/biology.js
index 32988991..7b9ad7d2 100644
--- a/mods/biology.js
+++ b/mods/biology.js
@@ -1,5 +1,9 @@
// by Nekonico
+window.addEventListener("load", () => {
+ document.getElementById("elementButton-lungs")?.remove()
+})
+
viewInfo[4] = { // Nutrition View
name: "nutr",
pixel: function(pixel,ctx) {
@@ -601,13 +605,29 @@ if (!isEmpty(pixel.x+1, pixel.y, true)) {
}
doBioBlood = function(pixel) {
-if (Math.random() > (1 - ((pixel.nutrition + pixel.oxygen + pixel.speed) / 2050)) && Math.random() < 0.001) {
+if (Math.random() > 0.5) {
for (var i = 0; i < squareCoords.length; i++) {
var coords = squareCoords[i];
var x = pixel.x + coords[0];
var y = pixel.y + coords[1];
- if (isEmpty(x,y)) {
- createPixel("flesh",x,y);
+ if (!isEmpty(x,y) && !outOfBounds(x,y)) {
+ var bloodPixel = pixelMap[x][y]
+ if (elements[bloodPixel.element].isBio === true && elements[bloodPixel.element].isBlood != true && elements[bloodPixel.element].isSkin != true && (!pixel.surrounded || pixel.surrounded != bloodPixel.element)) {
+ pixel.surrounded = bloodPixel.element
+ }
+ else if (elements[bloodPixel.element].id === elements.blood.id || elements[bloodPixel.element].id === elements.antibody.id || elements[bloodPixel.element].id === elements.blood_clot.id) {
+ if (Math.random() > (1 - ((pixel.nutrition + pixel.oxygen + pixel.speed) / 2050)) && Math.random() < 0.005) {
+ changePixel(bloodPixel,pixel.surrounded)
+ }
+ }
+ }
+ else if (isEmpty(x,y) && pixel.surrounded && Math.random() > (1 - ((pixel.nutrition + pixel.oxygen + pixel.speed) / 2050)) && Math.random() < 0.001) {
+ if (Math.random() > 0.9) {
+ createPixel(pixel.surrounded,x,y)
+ }
+ else {
+ createPixel("blood_clot",x,y)
+ }
}
}
}
@@ -1569,6 +1589,7 @@ elements.epidermis = {
},
isBio: true,
+ isSkin: true,
renderer: renderPresets.FLESHBURN,
movable: false,
}
@@ -1599,6 +1620,7 @@ elements.dermis = {
pixelMap[x][y].oxygen = (Math.round(pixel.oxygen / 2))
pixel.nutrition = (Math.round(pixel.nutrition / 2))
pixel.oxygen = (Math.round(pixel.oxygen / 2))
+ pixelMap[x][y].color = pixelColorPick(pixelMap[x][y],pixel.skinColor)
}
}
}
@@ -1627,7 +1649,7 @@ elements.dermis = {
speed: 0,
poisoned: false,
immune: false,
-
+ skinColor: "#f7ead0"
},
isBio: true,
renderer: renderPresets.FLESHBURN,
@@ -1750,6 +1772,7 @@ elements.cloak_skin = {
immune: false,
},
+ isSkin: true,
isBio: true,
renderer: renderPresets.FLESHBURN,
movable: false,
@@ -2197,6 +2220,7 @@ elements.hairy_skin = {
immune: false,
},
+ isSkin: true,
isHair: true,
isBio: true,
renderer: renderPresets.FLESHBURN,
@@ -2274,6 +2298,164 @@ elements.hair_dermis = {
movable: false,
}
+elements.furred_skin = {
+ color: "#DFC1B6",
+ category: "structural",
+ behavior: behaviors.WALL,
+ nutrTrans: 20,
+ oxygTrans: 25,
+ isMultiDie: true,
+ normDie: "dust",
+ roomDie: "meat",
+ coldDie: "dust",
+ heatDie: "cooked_meat",
+ hoverStat: function(pixel) {
+ return "Ntr:"+pixel.nutrition+" O2:"+pixel.oxygen
+ },
+ tick: function(pixel) {
+ if (Math.random() > (1 - ((pixel.nutrition + pixel.oxygen + pixel.speed) / 2050)) && Math.random() < 0.01) {
+ if (isEmpty(pixel.x,pixel.y-1)) {
+ createPixel("hair_end",pixel.x,pixel.y-1)
+ pixelMap[pixel.x][pixel.y-1].color = pixelColorPick(pixelMap[pixel.x][pixel.y-1],pixel.furColor)
+ pixelMap[pixel.x][pixel.y-1].dir = "up"
+ }
+ if (isEmpty(pixel.x,pixel.y+1)) {
+ createPixel("hair_end",pixel.x,pixel.y+1)
+ pixelMap[pixel.x][pixel.y+1].color = pixelColorPick(pixelMap[pixel.x][pixel.y+1],pixel.furColor)
+ pixelMap[pixel.x][pixel.y+1].dir = "down"
+ }
+
+ if (isEmpty(pixel.x-1,pixel.y)) {
+ createPixel("hair_end",pixel.x-1,pixel.y)
+ pixelMap[pixel.x-1][pixel.y].color = pixelColorPick(pixelMap[pixel.x-1][pixel.y],pixel.furColor)
+ pixelMap[pixel.x-1][pixel.y].dir = "left"
+ }
+
+ if (isEmpty(pixel.x+1,pixel.y)) {
+ createPixel("hair_end",pixel.x+1,pixel.y)
+ pixelMap[pixel.x+1][pixel.y].color = pixelColorPick(pixelMap[pixel.x+1][pixel.y],pixel.furColor)
+ pixelMap[pixel.x+1][pixel.y].dir = "right"
+ }
+
+ }
+ if ((pixel.temp > 40 || pixel.temp < 10) && Math.random() < 0.005) {
+ for (var i = 0; i < squareCoords.length; i++) {
+ var coords = squareCoords[i];
+ var x = pixel.x + coords[0];
+ var y = pixel.y + coords[1];
+ if (isEmpty(x,y)) {
+ if (pixel.temp > 40) {
+ pixel.temp -= 20;
+ createPixel("salt_water",x,y);
+ break;
+ }
+ pixel.temp += 20;
+ break;
+ }
+ }
+ }
+ if (pixel.temp < 36.5 && Math.random() < 0.1) {
+ pixel.temp += 1;
+ }
+ else if (pixel.temp > 37 && Math.random() < 0.1) {
+ pixel.temp -= 1;
+ }
+ doDefaults(pixel);
+ doBioNorm(pixel);
+ },
+ density: 2710,
+ state: "solid",
+ conduct: .001,
+ tempHigh: 200,
+ stateHigh: "cooked_meat",
+ tempLow: -25,
+ stateLow: "frozen_meat",
+ burn: 5,
+ burnTime: 375,
+ burnInto: "cooked_meat",
+ breakInto: ["blood","meat","dust","dust","dust","dust"],
+ forceSaveColor: true,
+ reactions: {
+ "cancer": { elem1:"cancer", chance:0.0005 },
+ "radiation": { elem1:["ash","meat","rotten_meat","cooked_meat","flesh"], chance:0.2 },
+ },
+ properties: {
+ oxygen: 1000,
+ nutrition: 1000,
+ speed: 0,
+ poisoned: false,
+ immune: false,
+ furColor: "#2e2a2b"
+ },
+ isSkin: true,
+ isHair: true,
+ isBio: true,
+ renderer: renderPresets.FLESHBURN,
+ movable: false,
+}
+
+elements.fur_dermis = {
+ color: "#C89985",
+ category: "structural",
+ behavior: behaviors.WALL,
+ nutrTrans: 20,
+ oxygTrans: 25,
+ isMultiDie: true,
+ normDie: "meat",
+ roomDie: "rotten_meat",
+ coldDie: "frozen_meat",
+ heatDie: "cooked_meat",
+ hoverStat: function(pixel) {
+ return "Ntr:"+pixel.nutrition+" O2:"+pixel.oxygen
+ },
+ tick: function(pixel) {
+ if (Math.random() > (1 - ((pixel.nutrition + pixel.oxygen + pixel.speed) / 2050)) && Math.random() < 0.005) {
+ for (var i = 0; i < squareCoords.length; i++) {
+ var coords = squareCoords[i];
+ var x = pixel.x + coords[0];
+ var y = pixel.y + coords[1];
+ if (isEmpty(x,y)) {
+ createPixel("furred_skin",x,y);
+ pixelMap[x][y].nutrition = (Math.round(pixel.nutrition / 2))
+ pixelMap[x][y].oxygen = (Math.round(pixel.oxygen / 2))
+ pixel.nutrition = (Math.round(pixel.nutrition / 2))
+ pixel.oxygen = (Math.round(pixel.oxygen / 2))
+ pixelMap[x][y].color = pixelColorPick(pixelMap[x][y],pixel.skinColor)
+ }
+ }
+ }
+ doDefaults(pixel);
+ doBioNorm(pixel);
+ },
+ density: 2710,
+ state: "solid",
+ conduct: .001,
+ tempHigh: 200,
+ stateHigh: "cooked_meat",
+ tempLow: -25,
+ stateLow: "frozen_meat",
+ burn: 4,
+ burnTime: 350,
+ burnInto: "cooked_meat",
+ breakInto: ["blood","meat"],
+ forceSaveColor: true,
+ reactions: {
+ "cancer": { elem1:"cancer", chance:0.0005 },
+ "radiation": { elem1:["ash","meat","rotten_meat","cooked_meat","flesh"], chance:0.2 },
+ },
+ properties: {
+ oxygen: 1000,
+ nutrition: 1000,
+ speed: 0,
+ poisoned: false,
+ immune: false,
+ skinColor: "#DFC1B6"
+ },
+ isBio: true,
+ renderer: renderPresets.FLESHBURN,
+ movable: false,
+}
+
elements.scales = {
color: "#6b839a",
category: "structural",
@@ -2314,6 +2496,7 @@ elements.scales = {
immune: false,
},
+ isSkin: true,
isBio: true,
renderer: renderPresets.FLESHBURN,
movable: false,
@@ -3068,16 +3251,17 @@ elements.blood_vessel = {
heartAttached: false,
},
reactions: {
- "dirt": { elem2: "infected_vessel", chance:0.005 },
- "dust": { elem1: null, elem2: "infected_vessel", chance:0.005 },
- "ash": { elem1: null, elem2: "infected_vessel", chance:0.005 },
- "mud": { elem2: "infected_vessel", chance:0.005 },
- "sand": { elem2: "infected_vessel", chance:0.005 },
- "gravel": { elem2: "infected_vessel", chance:0.005 },
- "brick_rubble": { elem2: "infected_vessel", chance:0.005 },
- "glitter": { elem1: null, elem2: "infected_vessel", chance:0.001 },
- "sulfur": { elem2: "infected_vessel", chance:0.005 },
+ "dirt": { elem1: "infected_vessel", chance:0.005 },
+ "dust": { elem2: null, elem1: "infected_vessel", chance:0.005 },
+ "ash": { elem2: null, elem1: "infected_vessel", chance:0.005 },
+ "mud": { elem1: "infected_vessel", chance:0.005 },
+ "sand": { elem1: "infected_vessel", chance:0.005 },
+ "gravel": { elem1: "infected_vessel", chance:0.005 },
+ "brick_rubble": { elem1: "infected_vessel", chance:0.005 },
+ "glitter": { elem2: null, elem1: "infected_vessel", chance:0.001 },
+ "sulfur": { elem1: "infected_vessel", chance:0.005 },
"rust": { elem1: ["meat","infected_vessel","infected_vessel","infected_vessel","blood","blood"], chance:0.005 },
+ "blood": { elem2: "blood_clot", chance:0.05 },
"mercury": { elem2: null, elem1: "infected_vessel", func:function(pixel1,pixel2){ if (pixel1.poisoned != true) {
pixel1.poisoned = true;
} }, chance:0.005 },
@@ -3280,7 +3464,7 @@ elements.white_blood_cell = {
"cyanide": { elem2: null, func:function(pixel1,pixel2){ if (pixel1.poisoned != true) {
pixel1.poisoned = true;
} }, chance:0.01 },
- "blood": { elem2:"blood_vessel", chance:0.10 },
+ "blood": { elem2:"blood_clot", chance:0.10 },
},
tempHigh: 175,
stateHigh: ["meat","blood","blood","blood"],
@@ -3300,6 +3484,47 @@ elements.white_blood_cell = {
isBlood: true,
}
+elements.blood_clot = {
+ color: ["#8C1D14","#AF2419"],
+ category: "structural",
+ behavior: behaviors.WALL,
+ state: "solid",
+ reactions: {
+ "mercury": { elem2: null, elem1: "infected_vessel", func:function(pixel1,pixel2){ if (pixel1.poisoned != true) {
+ pixel1.poisoned = true;
+ } }, chance:0.005 },
+ "vaccine": { elem2: null, func:function(pixel1,pixel2){ if (pixel1.immune != true) {
+ pixel1.immune = true;
+ } }, chance:0.01 },
+ "antibody": { elem2: null, func:function(pixel1,pixel2){ if (pixel1.immune != true) {
+ pixel1.immune = true;
+ } }, chance:0.0025 },
+ "antidote": { elem2: null, func:function(pixel1,pixel2){ if (pixel1.poisonImmune != true) {
+ pixel1.poisonImmune = true;
+ } }, chance:0.02 },
+ "poison": { elem2: null, func:function(pixel1,pixel2){ if (pixel1.poisoned != true) {
+ pixel1.poisoned = true;
+ } }, chance:0.02 },
+ "cyanide": { elem2: null, func:function(pixel1,pixel2){ if (pixel1.poisoned != true) {
+ pixel1.poisoned = true;
+ } }, chance:0.01 },
+ },
+ tempHigh: 175,
+ stateHigh: ["meat","blood","blood"],
+ tempLow: -50,
+ stateLow: ["frozen_meat","blood","blood","blood"],
+ burn: 20,
+ burnTime: 160,
+ burnInto: ["meat","blood","blood","blood","blood","blood","blood","steam"],
+ breakInto: ["meat","blood","blood","blood","blood","blood","blood","blood"],
+ category: "circulation",
+ density: 2250,
+ movable: false,
+ extinguish: true,
+ isBio: true,
+ isBlood: true,
+}
+
elements.eye = {
color: "#451800",
category: "nervous system",
@@ -4907,7 +5132,8 @@ elements.appendix = {
}
elements.simple_lung = {
- color: "#EB85D9",
+ name: "lung",
+ color: "#D8A3B3",
category: "oxygen",
behavior: behaviors.WALL,
nutrTrans: 20,
@@ -4933,7 +5159,13 @@ elements.simple_lung = {
doBioNorm(pixel);
if (!isEmpty(pixel.x, pixel.y-1, true)) {
var hitPixel = pixelMap[pixel.x][pixel.y-1]
- if ((elements[hitPixel.element].id === elements.chlorine.id || elements[hitPixel.element].id === elements.poison_gas.id || elements[hitPixel.element].id === elements.acid_gas.id || elements[hitPixel.element].id === elements.cyanide_gas.id || elements[hitPixel.element].id === elements.dioxin.id) && Math.random() > 0.5) {
+ if (elements[hitPixel.element].id === elements.oxygen.id && Math.random() > 0.9) {
+ if (Math.random() > 0.75) {
+ changePixel(hitPixel,"carbon_dioxide");
+ }
+ pixel.oxygen += 100
+ }
+ else if ((elements[hitPixel.element].id === elements.chlorine.id || elements[hitPixel.element].id === elements.poison_gas.id || elements[hitPixel.element].id === elements.acid_gas.id || elements[hitPixel.element].id === elements.cyanide_gas.id || elements[hitPixel.element].id === elements.dioxin.id) && Math.random() > 0.5) {
deletePixel(hitPixel.x,hitPixel.y)
pixel.oxygen -= 250
pixel.nutrition -= 250
@@ -4942,7 +5174,13 @@ elements.simple_lung = {
}
if (!isEmpty(pixel.x, pixel.y+1, true)) {
var hitPixel = pixelMap[pixel.x][pixel.y+1]
- if ((elements[hitPixel.element].id === elements.chlorine.id || elements[hitPixel.element].id === elements.poison_gas.id || elements[hitPixel.element].id === elements.acid_gas.id || elements[hitPixel.element].id === elements.cyanide_gas.id || elements[hitPixel.element].id === elements.dioxin.id) && Math.random() > 0.5) {
+ if (elements[hitPixel.element].id === elements.oxygen.id && Math.random() > 0.9) {
+ if (Math.random() > 0.75) {
+ changePixel(hitPixel,"carbon_dioxide");
+ }
+ pixel.oxygen += 100
+ }
+ else if ((elements[hitPixel.element].id === elements.chlorine.id || elements[hitPixel.element].id === elements.poison_gas.id || elements[hitPixel.element].id === elements.acid_gas.id || elements[hitPixel.element].id === elements.cyanide_gas.id || elements[hitPixel.element].id === elements.dioxin.id) && Math.random() > 0.5) {
deletePixel(hitPixel.x,hitPixel.y)
pixel.oxygen -= 250
pixel.nutrition -= 250
@@ -4951,7 +5189,13 @@ elements.simple_lung = {
}
if (!isEmpty(pixel.x-1, pixel.y, true)) {
var hitPixel = pixelMap[pixel.x-1][pixel.y]
- if ((elements[hitPixel.element].id === elements.chlorine.id || elements[hitPixel.element].id === elements.poison_gas.id || elements[hitPixel.element].id === elements.acid_gas.id || elements[hitPixel.element].id === elements.cyanide_gas.id || elements[hitPixel.element].id === elements.dioxin.id) && Math.random() > 0.5) {
+ if (elements[hitPixel.element].id === elements.oxygen.id && Math.random() > 0.9) {
+ if (Math.random() > 0.75) {
+ changePixel(hitPixel,"carbon_dioxide");
+ }
+ pixel.oxygen += 100
+ }
+ else if ((elements[hitPixel.element].id === elements.chlorine.id || elements[hitPixel.element].id === elements.poison_gas.id || elements[hitPixel.element].id === elements.acid_gas.id || elements[hitPixel.element].id === elements.cyanide_gas.id || elements[hitPixel.element].id === elements.dioxin.id) && Math.random() > 0.5) {
deletePixel(hitPixel.x,hitPixel.y)
pixel.oxygen -= 250
pixel.nutrition -= 250
@@ -4960,7 +5204,13 @@ elements.simple_lung = {
}
if (!isEmpty(pixel.x+1, pixel.y, true)) {
var hitPixel = pixelMap[pixel.x+1][pixel.y]
- if ((elements[hitPixel.element].id === elements.chlorine.id || elements[hitPixel.element].id === elements.poison_gas.id || elements[hitPixel.element].id === elements.acid_gas.id || elements[hitPixel.element].id === elements.cyanide_gas.id || elements[hitPixel.element].id === elements.dioxin.id) && Math.random() > 0.5) {
+ if (elements[hitPixel.element].id === elements.oxygen.id && Math.random() > 0.9) {
+ if (Math.random() > 0.75) {
+ changePixel(hitPixel,"carbon_dioxide");
+ }
+ pixel.oxygen += 100
+ }
+ else if ((elements[hitPixel.element].id === elements.chlorine.id || elements[hitPixel.element].id === elements.poison_gas.id || elements[hitPixel.element].id === elements.acid_gas.id || elements[hitPixel.element].id === elements.cyanide_gas.id || elements[hitPixel.element].id === elements.dioxin.id) && Math.random() > 0.5) {
deletePixel(hitPixel.x,hitPixel.y)
pixel.oxygen -= 250
pixel.nutrition -= 250
@@ -4995,115 +5245,24 @@ elements.simple_lung = {
movable: false,
isBio: true,
renderer: renderPresets.FLESHBURN,
- desc: "Like lung, but no need to hassle with the oxygen element!"
+ desc: "Gets oxygen from empty space!"
}
elements.lungs = {
color: "#d4aaab",
- category: "oxygen",
behavior: behaviors.WALL,
- nutrTrans: 20,
- oxygTrans: 20,
- isMultiDie: true,
- normDie: "meat",
- roomDie: "rotten_meat",
- coldDie: "frozen_meat",
- heatDie: "cooked_meat",
+ category: "oxygen",
hoverStat: function(pixel) {
return "Ntr:"+pixel.nutrition+" O2:"+pixel.oxygen
},
tick: function(pixel) {
- doDefaults(pixel);
- doBioNorm(pixel);
- if (!isEmpty(pixel.x, pixel.y-1, true)) {
- var hitPixel = pixelMap[pixel.x][pixel.y-1]
- if (elements[hitPixel.element].id === elements.oxygen.id && Math.random() > 0.9) {
- if (Math.random() > 0.75) {
- changePixel(hitPixel,"carbon_dioxide");
- }
- pixel.oxygen += 100
- }
- else if ((elements[hitPixel.element].id === elements.chlorine.id || elements[hitPixel.element].id === elements.poison_gas.id || elements[hitPixel.element].id === elements.acid_gas.id || elements[hitPixel.element].id === elements.cyanide_gas.id || elements[hitPixel.element].id === elements.dioxin.id) && Math.random() > 0.5) {
- deletePixel(hitPixel.x,hitPixel.y)
- pixel.oxygen -= 250
- pixel.nutrition -= 250
- pixel.speed -= 25
- }
- }
- if (!isEmpty(pixel.x, pixel.y+1, true)) {
- var hitPixel = pixelMap[pixel.x][pixel.y+1]
- if (elements[hitPixel.element].id === elements.oxygen.id && Math.random() > 0.9) {
- if (Math.random() > 0.75) {
- changePixel(hitPixel,"carbon_dioxide");
- }
- pixel.oxygen += 100
- }
- else if ((elements[hitPixel.element].id === elements.chlorine.id || elements[hitPixel.element].id === elements.poison_gas.id || elements[hitPixel.element].id === elements.acid_gas.id || elements[hitPixel.element].id === elements.cyanide_gas.id || elements[hitPixel.element].id === elements.dioxin.id) && Math.random() > 0.5) {
- deletePixel(hitPixel.x,hitPixel.y)
- pixel.oxygen -= 250
- pixel.nutrition -= 250
- pixel.speed -= 25
- }
- }
- if (!isEmpty(pixel.x-1, pixel.y, true)) {
- var hitPixel = pixelMap[pixel.x-1][pixel.y]
- if (elements[hitPixel.element].id === elements.oxygen.id && Math.random() > 0.9) {
- if (Math.random() > 0.75) {
- changePixel(hitPixel,"carbon_dioxide");
- }
- pixel.oxygen += 100
- }
- else if ((elements[hitPixel.element].id === elements.chlorine.id || elements[hitPixel.element].id === elements.poison_gas.id || elements[hitPixel.element].id === elements.acid_gas.id || elements[hitPixel.element].id === elements.cyanide_gas.id || elements[hitPixel.element].id === elements.dioxin.id) && Math.random() > 0.5) {
- deletePixel(hitPixel.x,hitPixel.y)
- pixel.oxygen -= 250
- pixel.nutrition -= 250
- pixel.speed -= 25
- }
- }
- if (!isEmpty(pixel.x+1, pixel.y, true)) {
- var hitPixel = pixelMap[pixel.x+1][pixel.y]
- if (elements[hitPixel.element].id === elements.oxygen.id && Math.random() > 0.9) {
- if (Math.random() > 0.75) {
- changePixel(hitPixel,"carbon_dioxide");
- }
- pixel.oxygen += 100
- }
- else if ((elements[hitPixel.element].id === elements.chlorine.id || elements[hitPixel.element].id === elements.poison_gas.id || elements[hitPixel.element].id === elements.acid_gas.id || elements[hitPixel.element].id === elements.cyanide_gas.id || elements[hitPixel.element].id === elements.dioxin.id) && Math.random() > 0.5) {
- deletePixel(hitPixel.x,hitPixel.y)
- pixel.oxygen -= 250
- pixel.nutrition -= 250
- pixel.speed -= 25
- }
- }
- },
- density: 2710,
- state: "solid",
- conduct: .001,
- tempHigh: 200,
- stateHigh: "cooked_meat",
- tempLow: -25,
- stateLow: "frozen_meat",
- burn: 5,
- burnTime: 350,
- burnInto: "cooked_meat",
- breakInto: ["blood","meat"],
- forceSaveColor: true,
- reactions: {
- "cancer": { elem1:"cancer", chance:0.0005 },
- "radiation": { elem1:["ash","carbon_dioxide","meat","rotten_meat","cooked_meat","flesh","ash","carbon_dioxide","meat","rotten_meat","cooked_meat","flesh","ash","oxygen","meat","rotten_meat","cooked_meat","flesh"], chance:0.4 },
- },
- properties: {
- oxygen: 1000,
- nutrition: 1000,
- speed: 0,
- poisoned: false,
- immune: false,
-
+ pixel.element = "simple_lung"
},
movable: false,
isBio: true,
renderer: renderPresets.FLESHBURN,
- desc: "Gets oxygen from, well, oxygen! Makes it into carbon-dioxide."
+ desc: "Deprecated.",
+ hidden: true,
}
elements.amphib_skin = {
@@ -5146,6 +5305,14 @@ elements.amphib_skin = {
if (pixel.temp < 15 && Math.random() < 0.1) {
pixel.temp += 1;
}
+ for (var i = 0; i < squareCoords.length; i++) {
+ var x = pixel.x+squareCoords[i][0];
+ var y = pixel.y+squareCoords[i][1];
+ if (isEmpty(x,y)) {
+ if (Math.random() < 0.01) { pixel.oxygen += 100 }
+ break
+ }
+ }
doDefaults(pixel);
doBioNorm(pixel);
if (!isEmpty(pixel.x, pixel.y-1, true)) {
@@ -5230,6 +5397,7 @@ elements.amphib_skin = {
immune: false,
},
+ isSkin: true,
isBio: true,
renderer: renderPresets.FLESHBURN,
movable: false,
@@ -5255,6 +5423,14 @@ elements.exoskeleton = {
if (pixel.temp > 40 && Math.random() < 0.1) {
pixel.temp -= 1;
}
+ for (var i = 0; i < squareCoords.length; i++) {
+ var x = pixel.x+squareCoords[i][0];
+ var y = pixel.y+squareCoords[i][1];
+ if (isEmpty(x,y)) {
+ if (Math.random() < 0.01) { pixel.oxygen += 100 }
+ break
+ }
+ }
doDefaults(pixel);
doBioNorm(pixel);
if (!isEmpty(pixel.x, pixel.y-1, true)) {
@@ -5339,6 +5515,7 @@ elements.exoskeleton = {
immune: false,
},
+ isSkin: true,
isBio: true,
renderer: renderPresets.FLESHBURN,
movable: false,
@@ -5549,11 +5726,7 @@ elements.simple_gill = {
elements.stomach_lining = {
color: "#be5c4b",
category: "nutrition",
- behavior: [
- "XX|CR:stomach_acid%1|XX",
- "CR:stomach_acid%1|XX|CR:stomach_acid%1",
- "XX|CR:stomach_acid%1|XX",
- ],
+ behavior: behaviors.WALL,
nutrTrans: 20,
oxygTrans: 25,
isMultiDie: true,
@@ -5567,6 +5740,21 @@ elements.stomach_lining = {
tick: function(pixel) {
doDefaults(pixel);
doBioNorm(pixel);
+ for (var i = 0; i < squareCoords.length; i++) {
+ var x = pixel.x+squareCoords[i][0];
+ var y = pixel.y+squareCoords[i][1];
+ var x2 = pixel.x-squareCoords[i][0];
+ var y2 = pixel.y-squareCoords[i][1];
+ if (!isEmpty(x,y)) {
+ if (isEmpty(x2,y2)) {
+ if (Math.random() < 0.05) {
+ tryCreate("stomach_acid",x2,y2)
+ }
+ break
+ }
+ break
+ }
+ }
},
density: 2710,
state: "solid",
@@ -5601,11 +5789,7 @@ elements.stomach_lining = {
elements.herbi_stomach = {
color: "#B77A3D",
category: "nutrition",
- behavior: [
- "XX|CR:herbi_acid%5|XX",
- "CR:herbi_acid%5|XX|CR:herbi_acid%5",
- "XX|CR:herbi_acid%5|XX",
- ],
+ behavior: behaviors.WALL,
nutrTrans: 20,
oxygTrans: 25,
isMultiDie: true,
@@ -5619,6 +5803,21 @@ elements.herbi_stomach = {
tick: function(pixel) {
doDefaults(pixel);
doBioNorm(pixel);
+ for (var i = 0; i < squareCoords.length; i++) {
+ var x = pixel.x+squareCoords[i][0];
+ var y = pixel.y+squareCoords[i][1];
+ var x2 = pixel.x-squareCoords[i][0];
+ var y2 = pixel.y-squareCoords[i][1];
+ if (!isEmpty(x,y)) {
+ if (isEmpty(x2,y2)) {
+ if (Math.random() < 0.05) {
+ tryCreate("herbi_acid",x2,y2)
+ }
+ break
+ }
+ break
+ }
+ }
},
density: 2710,
state: "solid",
@@ -5653,11 +5852,7 @@ elements.herbi_stomach = {
elements.carni_stomach = {
color: "#8E2A3E",
category: "nutrition",
- behavior: [
- "XX|CR:carni_acid%5|XX",
- "CR:carni_acid%5|XX|CR:carni_acid%5",
- "XX|CR:carni_acid%5|XX",
- ],
+ behavior: behaviors.WALL,
nutrTrans: 20,
oxygTrans: 25,
isMultiDie: true,
@@ -5671,6 +5866,21 @@ elements.carni_stomach = {
tick: function(pixel) {
doDefaults(pixel);
doBioNorm(pixel);
+ for (var i = 0; i < squareCoords.length; i++) {
+ var x = pixel.x+squareCoords[i][0];
+ var y = pixel.y+squareCoords[i][1];
+ var x2 = pixel.x-squareCoords[i][0];
+ var y2 = pixel.y-squareCoords[i][1];
+ if (!isEmpty(x,y)) {
+ if (isEmpty(x2,y2)) {
+ if (Math.random() < 0.05) {
+ tryCreate("carni_acid",x2,y2)
+ }
+ break
+ }
+ break
+ }
+ }
},
density: 2710,
state: "solid",
@@ -5699,17 +5909,13 @@ elements.carni_stomach = {
movable: false,
isBio: true,
renderer: renderPresets.FLESHBURN,
- desc: "Makes a different stomach acid to digest meat!"
+ desc: "Makes a different stomach acid to digest meats!"
}
elements.explosive_stomach = {
color: "#AA9167",
category: "nutrition",
- behavior: [
- "XX|CR:explosive_acid%5|XX",
- "CR:explosive_acid%5|XX|CR:explosive_acid%5",
- "XX|CR:explosive_acid%5|XX",
- ],
+ behavior: behaviors.WALL,
nutrTrans: 20,
oxygTrans: 25,
isMultiDie: true,
@@ -5723,6 +5929,21 @@ elements.explosive_stomach = {
tick: function(pixel) {
doDefaults(pixel);
doBioNorm(pixel);
+ for (var i = 0; i < squareCoords.length; i++) {
+ var x = pixel.x+squareCoords[i][0];
+ var y = pixel.y+squareCoords[i][1];
+ var x2 = pixel.x-squareCoords[i][0];
+ var y2 = pixel.y-squareCoords[i][1];
+ if (!isEmpty(x,y)) {
+ if (isEmpty(x2,y2)) {
+ if (Math.random() < 0.05) {
+ tryCreate("explosive_acid",x2,y2)
+ }
+ break
+ }
+ break
+ }
+ }
},
density: 2710,
state: "solid",
@@ -5879,6 +6100,192 @@ elements.sphincter = {
desc: "Blocks undigested material, lets other things through!"
}
+elements.real_bone = {
+ color: "#d9d9d9",
+ behavior: behaviors.WALL,
+ reactions: {
+ "water": { elem2:"broth", tempMin:70 },
+ "salt_water": { elem2:"broth", tempMin:70 },
+ "sugar_water": { elem2:"broth", tempMin:70 },
+ "seltzer": { elem2:"broth", tempMin:70 },
+ },
+ nutrTrans: 10,
+ oxygTrans: 15,
+ isMultiDie: false,
+ normDie: "bone",
+ otherDie: "bone",
+ hoverStat: function(pixel) {
+ return "Ntr:"+pixel.nutrition+" O2:"+pixel.oxygen
+ },
+ tick: function(pixel) {
+ doBioBone(pixel);
+ doDefaults(pixel);
+ },
+ category:"structural",
+ tempHigh: 260,
+ stateHigh: "bone",
+ tempLow: -36,
+ stateLow: "bone",
+ state: "solid",
+ density: 1900,
+ hardness: 0.5,
+ properties: {
+ oxygen: 1000,
+ nutrition: 1000,
+ speed: 0,
+ poisoned: false,
+ immune: false,
+ },
+ breakInto: ["real_bone_marrow","real_bone_marrow","blood","bone","bone","bone","bone","bone","bone","bone","bone","bone","bone","bone","bone"],
+ movable: false,
+ isBio: true,
+ burn: 1,
+ burnTime: 100,
+ burnInto: ["bone","bone","bone","bone","quicklime"],
+ desc: "Hard organism building material!"
+}
+
+elements.real_bone_marrow = {
+ color: "#D3A491",
+ category: "structural",
+ behavior: [
+ "SW:real_bone_marrow%0.25|SW:real_bone_marrow%1.25|SW:real_bone_marrow%0.25",
+ "SW:real_bone_marrow%1.25|XX|SW:real_bone_marrow%1.25",
+ "SW:real_bone_marrow%0.25|SW:real_bone_marrow%1.25|SW:real_bone_marrow%0.25",
+ ],
+ nutrTrans: 25,
+ oxygTrans: 30,
+ isMultiDie: true,
+ normDie: "meat",
+ roomDie: "rotten_meat",
+ coldDie: "frozen_meat",
+ heatDie: "cooked_meat",
+ hoverStat: function(pixel) {
+ return "Ntr:"+pixel.nutrition+" O2:"+pixel.oxygen
+ },
+ tick: function(pixel) {
+ if (Math.random() > (1 - ((pixel.nutrition + pixel.oxygen + pixel.speed) / 2050)) && Math.random() < 0.005) {
+ for (var i = 0; i < squareCoords.length; i++) {
+ var coords = squareCoords[i];
+ var x = pixel.x + coords[0];
+ var y = pixel.y + coords[1];
+ if (isEmpty(x,y)) {
+ createPixel("real_bone",x,y);
+ }
+ }
+ }
+ doBioNorm(pixel);
+ doDefaults(pixel);
+ if (!isEmpty(pixel.x, pixel.y-1, true)) {
+ var hitPixel = pixelMap[pixel.x][pixel.y-1]
+ if (elements[hitPixel.element].isBlood === true) {
+ if (Math.random() > 0.9995 && Math.random() > (1 - ((pixel.nutrition + pixel.oxygen + pixel.speed) / 2020))) {
+ hitPixel.element = "white_blood_cell";
+ hitPixel.color = elements.white_blood_cell.color;
+ }
+ }
+ }
+ if (!isEmpty(pixel.x, pixel.y+1, true)) {
+ var hitPixel = pixelMap[pixel.x][pixel.y+1]
+ if (elements[hitPixel.element].isBlood === true) {
+ if (Math.random() > 0.9995 && Math.random() > (1 - ((pixel.nutrition + pixel.oxygen + pixel.speed) / 2020))) {
+ hitPixel.element = "white_blood_cell";
+ hitPixel.color = elements.white_blood_cell.color;
+ }
+ }
+ }
+ if (!isEmpty(pixel.x-1, pixel.y, true)) {
+ var hitPixel = pixelMap[pixel.x-1][pixel.y]
+ if (elements[hitPixel.element].isBlood === true) {
+ if (Math.random() > 0.9995 && Math.random() > (1 - ((pixel.nutrition + pixel.oxygen + pixel.speed) / 2020))) {
+ hitPixel.element = "white_blood_cell";
+ hitPixel.color = elements.white_blood_cell.color;
+ }
+ }
+ }
+ if (!isEmpty(pixel.x+1, pixel.y, true)) {
+ var hitPixel = pixelMap[pixel.x+1][pixel.y]
+ if (elements[hitPixel.element].isBlood === true) {
+ if (Math.random() > 0.9995 && Math.random() > (1 - ((pixel.nutrition + pixel.oxygen + pixel.speed) / 2020))) {
+ hitPixel.element = "white_blood_cell";
+ hitPixel.color = elements.white_blood_cell.color;
+ }
+ }
+ }
+ },
+ density: 2710,
+ state: "solid",
+ conduct: .001,
+ tempHigh: 350,
+ stateHigh: "cooked_meat",
+ tempLow: -40,
+ stateLow: "frozen_meat",
+ burn: 5,
+ burnTime: 400,
+ burnInto: "cooked_meat",
+ breakInto: ["blood","meat"],
+ hardness: 0.2,
+ forceSaveColor: true,
+ reactions: {
+ "cancer": { elem1:"cancer", chance:0.0005 },
+ "radiation": { elem1:["ash","meat","rotten_meat","cooked_meat","flesh"], chance:0.2 },
+ },
+ properties: {
+ oxygen: 1000,
+ nutrition: 1000,
+ speed: 0,
+ poisoned: false,
+ immune: false,
+
+ },
+ extinguish: true,
+ isBio: true,
+ renderer: renderPresets.FLESHBURN,
+ movable: false,
+ desc: "Makes bones and white blood cells!"
+}
+
+elements.cartilage = {
+ color: "#DBDBDB",
+ behavior: behaviors.WALL,
+ nutrTrans: 10,
+ oxygTrans: 15,
+ isMultiDie: false,
+ normDie: "quicklime",
+ otherDie: "water",
+ hoverStat: function(pixel) {
+ return "Ntr:"+pixel.nutrition+" O2:"+pixel.oxygen
+ },
+ tick: function(pixel) {
+ doBioBone(pixel);
+ doDefaults(pixel);
+ },
+ category:"structural",
+ tempHigh: 200,
+ stateHigh: ["calcium","glue","steam","steam","meat","steam",null],
+ tempLow: -36,
+ stateLow: ["calcium","calcium","meat","water","water","water",null],
+ state: "solid",
+ density: 1900,
+ hardness: 0.05,
+ properties: {
+ oxygen: 1000,
+ nutrition: 1000,
+ speed: 0,
+ poisoned: false,
+ immune: false,
+
+ },
+ breakInto: ["quicklime","calcium","meat","meat","water","water",null],
+ movable: false,
+ isBio: true,
+ renderer: renderPresets.FLESHBURN,
+ burn: 1,
+ burnTime: 100,
+ burnInto: ["bone","bone","bone","bone","quicklime"],
+ desc: "Bones but slightly worse!"
+}
+
elements.real_udder = {
color: "#ecb3f5",
behavior: [
@@ -6084,6 +6491,98 @@ elements.biotorch = {
desc: "Turns its oxygen into fire, and works as a heat shield!"
}
+elements.bioinsulation = {
+ color: ["#C18B81","#D39C8B","#E2B1A1"],
+ behavior: behaviors.WALL,
+ nutrTrans: 20,
+ oxygTrans: 25,
+ isMultiDie: true,
+ normDie: "meat",
+ roomDie: "cooked_meat",
+ coldDie: "meat",
+ heatDie: "cooked_meat",
+ hoverStat: function(pixel) {
+ return "Ntr:"+pixel.nutrition+" O2:"+pixel.oxygen
+ },
+ tick: function(pixel) {
+ doDefaults(pixel);
+ doBioNorm(pixel);
+ if (!isEmpty(pixel.x, pixel.y-1, true)) {
+ var hitPixel = pixelMap[pixel.x][pixel.y-1]
+ if (elements[hitPixel.element].isBio != true && Math.random() > 0.5) {
+ if (hitPixel.temp < pixel.temp) {
+ hitPixel.temp++
+ pixel.temp--
+ }
+ if (hitPixel.temp > pixel.temp) {
+ hitPixel.temp--
+ pixel.temp++
+ }
+ }
+ }
+ if (!isEmpty(pixel.x, pixel.y+1, true)) {
+ var hitPixel = pixelMap[pixel.x][pixel.y+1]
+ if (elements[hitPixel.element].isBio != true && Math.random() > 0.5) {
+ if (hitPixel.temp < pixel.temp) {
+ hitPixel.temp++
+ pixel.temp--
+ }
+ if (hitPixel.temp > pixel.temp) {
+ hitPixel.temp--
+ pixel.temp++
+ }
+ }
+ }
+ if (!isEmpty(pixel.x-1, pixel.y, true)) {
+ var hitPixel = pixelMap[pixel.x-1][pixel.y]
+ if (elements[hitPixel.element].isBio != true && Math.random() > 0.5) {
+ if (hitPixel.temp < pixel.temp) {
+ hitPixel.temp++
+ pixel.temp--
+ }
+ if (hitPixel.temp > pixel.temp) {
+ hitPixel.temp--
+ pixel.temp++
+ }
+ }
+ }
+ if (!isEmpty(pixel.x+1, pixel.y, true)) {
+ var hitPixel = pixelMap[pixel.x+1][pixel.y]
+ if (elements[hitPixel.element].isBio != true && Math.random() > 0.5) {
+ if (hitPixel.temp < pixel.temp) {
+ hitPixel.temp++
+ pixel.temp--
+ }
+ if (hitPixel.temp > pixel.temp) {
+ hitPixel.temp--
+ pixel.temp++
+ }
+ }
+ }
+ doDefaults(pixel);
+ },
+ properties: {
+ oxygen: 1000,
+ nutrition: 1000,
+ speed: 0,
+ poisoned: false,
+ immune: false,
+ },
+ tempHigh: 750,
+ stateHigh: "cooked_meat",
+ tempLow: -20,
+ stateLow: "frozen_meat",
+ breakInto: ["meat","cooked_meat","cooked_meat","fire"],
+ category: "structural",
+ state: "solid",
+ insulate: true,
+ density: 1250,
+ conduct: .001,
+ movable: false,
+ isBio: true,
+ desc: "Works as a heat shield!"
+}
+
elements.digested_material = {
color: "#B5C306",
behavior: [
@@ -6765,192 +7264,6 @@ elements.deoxygenated_water = {
extinguish: true
}
-elements.real_bone = {
- color: "#d9d9d9",
- behavior: behaviors.WALL,
- reactions: {
- "water": { elem2:"broth", tempMin:70 },
- "salt_water": { elem2:"broth", tempMin:70 },
- "sugar_water": { elem2:"broth", tempMin:70 },
- "seltzer": { elem2:"broth", tempMin:70 },
- },
- nutrTrans: 10,
- oxygTrans: 15,
- isMultiDie: false,
- normDie: "bone",
- otherDie: "bone",
- hoverStat: function(pixel) {
- return "Ntr:"+pixel.nutrition+" O2:"+pixel.oxygen
- },
- tick: function(pixel) {
- doBioBone(pixel);
- doDefaults(pixel);
- },
- category:"structural",
- tempHigh: 260,
- stateHigh: "bone",
- tempLow: -36,
- stateLow: "bone",
- state: "solid",
- density: 1900,
- hardness: 0.5,
- properties: {
- oxygen: 1000,
- nutrition: 1000,
- speed: 0,
- poisoned: false,
- immune: false,
- },
- breakInto: ["real_bone_marrow","real_bone_marrow","blood","bone","bone","bone","bone","bone","bone","bone","bone","bone","bone","bone","bone"],
- movable: false,
- isBio: true,
- burn: 1,
- burnTime: 100,
- burnInto: ["bone","bone","bone","bone","quicklime"],
- desc: "Hard organism building material!"
-}
-
-elements.real_bone_marrow = {
- color: "#D3A491",
- category: "structural",
- behavior: [
- "SW:real_bone_marrow%0.25|SW:real_bone_marrow%1.25|SW:real_bone_marrow%0.25",
- "SW:real_bone_marrow%1.25|XX|SW:real_bone_marrow%1.25",
- "SW:real_bone_marrow%0.25|SW:real_bone_marrow%1.25|SW:real_bone_marrow%0.25",
- ],
- nutrTrans: 25,
- oxygTrans: 30,
- isMultiDie: true,
- normDie: "meat",
- roomDie: "rotten_meat",
- coldDie: "frozen_meat",
- heatDie: "cooked_meat",
- hoverStat: function(pixel) {
- return "Ntr:"+pixel.nutrition+" O2:"+pixel.oxygen
- },
- tick: function(pixel) {
- if (Math.random() > (1 - ((pixel.nutrition + pixel.oxygen + pixel.speed) / 2050)) && Math.random() < 0.005) {
- for (var i = 0; i < squareCoords.length; i++) {
- var coords = squareCoords[i];
- var x = pixel.x + coords[0];
- var y = pixel.y + coords[1];
- if (isEmpty(x,y)) {
- createPixel("real_bone",x,y);
- }
- }
- }
- doBioNorm(pixel);
- doDefaults(pixel);
- if (!isEmpty(pixel.x, pixel.y-1, true)) {
- var hitPixel = pixelMap[pixel.x][pixel.y-1]
- if (elements[hitPixel.element].isBlood === true) {
- if (Math.random() > 0.9995 && Math.random() > (1 - ((pixel.nutrition + pixel.oxygen + pixel.speed) / 2020))) {
- hitPixel.element = "white_blood_cell";
- hitPixel.color = elements.white_blood_cell.color;
- }
- }
- }
- if (!isEmpty(pixel.x, pixel.y+1, true)) {
- var hitPixel = pixelMap[pixel.x][pixel.y+1]
- if (elements[hitPixel.element].isBlood === true) {
- if (Math.random() > 0.9995 && Math.random() > (1 - ((pixel.nutrition + pixel.oxygen + pixel.speed) / 2020))) {
- hitPixel.element = "white_blood_cell";
- hitPixel.color = elements.white_blood_cell.color;
- }
- }
- }
- if (!isEmpty(pixel.x-1, pixel.y, true)) {
- var hitPixel = pixelMap[pixel.x-1][pixel.y]
- if (elements[hitPixel.element].isBlood === true) {
- if (Math.random() > 0.9995 && Math.random() > (1 - ((pixel.nutrition + pixel.oxygen + pixel.speed) / 2020))) {
- hitPixel.element = "white_blood_cell";
- hitPixel.color = elements.white_blood_cell.color;
- }
- }
- }
- if (!isEmpty(pixel.x+1, pixel.y, true)) {
- var hitPixel = pixelMap[pixel.x+1][pixel.y]
- if (elements[hitPixel.element].isBlood === true) {
- if (Math.random() > 0.9995 && Math.random() > (1 - ((pixel.nutrition + pixel.oxygen + pixel.speed) / 2020))) {
- hitPixel.element = "white_blood_cell";
- hitPixel.color = elements.white_blood_cell.color;
- }
- }
- }
- },
- density: 2710,
- state: "solid",
- conduct: .001,
- tempHigh: 350,
- stateHigh: "cooked_meat",
- tempLow: -40,
- stateLow: "frozen_meat",
- burn: 5,
- burnTime: 400,
- burnInto: "cooked_meat",
- breakInto: ["blood","meat"],
- hardness: 0.2,
- forceSaveColor: true,
- reactions: {
- "cancer": { elem1:"cancer", chance:0.0005 },
- "radiation": { elem1:["ash","meat","rotten_meat","cooked_meat","flesh"], chance:0.2 },
- },
- properties: {
- oxygen: 1000,
- nutrition: 1000,
- speed: 0,
- poisoned: false,
- immune: false,
-
- },
- extinguish: true,
- isBio: true,
- renderer: renderPresets.FLESHBURN,
- movable: false,
- desc: "Makes bones and white blood cells!"
-}
-
-elements.cartilage = {
- color: "#DBDBDB",
- behavior: behaviors.WALL,
- nutrTrans: 10,
- oxygTrans: 15,
- isMultiDie: false,
- normDie: "quicklime",
- otherDie: "water",
- hoverStat: function(pixel) {
- return "Ntr:"+pixel.nutrition+" O2:"+pixel.oxygen
- },
- tick: function(pixel) {
- doBioBone(pixel);
- doDefaults(pixel);
- },
- category:"structural",
- tempHigh: 200,
- stateHigh: ["calcium","glue","steam","steam","meat","steam",null],
- tempLow: -36,
- stateLow: ["calcium","calcium","meat","water","water","water",null],
- state: "solid",
- density: 1900,
- hardness: 0.05,
- properties: {
- oxygen: 1000,
- nutrition: 1000,
- speed: 0,
- poisoned: false,
- immune: false,
-
- },
- breakInto: ["quicklime","calcium","meat","meat","water","water",null],
- movable: false,
- isBio: true,
- renderer: renderPresets.FLESHBURN,
- burn: 1,
- burnTime: 100,
- burnInto: ["bone","bone","bone","bone","quicklime"],
- desc: "Bones but slightly worse!"
-}
-
elements.cerebrospinal_fluid = {
color: "#CBC3E3",
behavior: behaviors.LIQUID,
@@ -8102,7 +8415,7 @@ elements.cancer.reactions.liver = { elem2: "cancer", chance:0.005 };
elements.cancer.reactions.dermis = { elem2: "cancer", chance:0.005 };
elements.cancer.reactions.amphib_dermis = { elem2: "cancer", chance:0.005 };
elements.cancer.reactions.scale_dermis = { elem2: "cancer", chance:0.004 };
-elements.cancer.reactions.epidermis = { elem2: "cancer", chance:0.0002 };
+elements.cancer.reactions.epidermis = { elem2: "cancer", chance:0.0001 };
elements.cancer.reactions.amphib_skin = { elem2: "cancer", chance:0.0003 };
elements.cancer.reactions.hairy_skin = { elem2: "cancer", chance:0.0003 };
elements.cancer.reactions.hair_dermis = { elem2: "cancer", chance:0.0003 };
@@ -8146,7 +8459,7 @@ elements.uranium.reactions.dermis = { elem2: ["ash","blood","fat","meat","rotten
elements.uranium.reactions.amphib_dermis = { elem2: ["ash","blood","slime","meat","rotten_meat","cooked_meat","cancer","cancer"], chance:0.5 };
elements.uranium.reactions.scale_dermis = { elem2: ["ash","blood","fat","meat","rotten_meat","cooked_meat","cancer","cancer"], chance:0.5 };
elements.uranium.reactions.bug_dermis = { elem2: ["ash","blood","fat","meat","rotten_meat","cooked_meat","cancer","cancer"], chance:0.5 };
-elements.uranium.reactions.epidermis = { elem2: ["cooked_meat","cancer","ash","skin"], chance:0.1 };
+elements.uranium.reactions.epidermis = { elem2: ["cooked_meat","cancer","ash","skin"], chance:0.01 };
elements.uranium.reactions.hairy_skin = { elem2: ["cooked_meat","cancer","ash","skin","hair"], chance:0.1 };
elements.uranium.reactions.hair_dermis = { elem2: ["ash","blood","fat","meat","rotten_meat","cooked_meat","cancer","cancer"], chance:0.5 };
elements.uranium.reactions.amphib_skin = { elem2: ["cooked_meat","cancer","ash","skin","slime"], chance:0.4 };
@@ -8192,7 +8505,7 @@ elements.radiation.reactions.scale_dermis = { elem2: ["ash","blood","fat","meat"
elements.radiation.reactions.scales = { elem2: ["cooked_meat","cancer","ash","epidermis","skin","dust","calcium"], chance:0.1 };
elements.radiation.reactions.exoskeleton = { elem2: ["cooked_meat","cancer","ash","epidermis","skin","dust","calcium"], chance:0.1 };
elements.radiation.reactions.bug_dermis = { elem2: ["ash","blood","fat","meat","rotten_meat","cooked_meat","cancer","cancer"], chance:0.4 };
-elements.radiation.reactions.epidermis = { elem2: ["cooked_meat","cancer","ash","skin"], chance:0.1 };
+elements.radiation.reactions.epidermis = { elem2: ["cooked_meat","cancer","ash","skin"], chance:0.01 };
elements.radiation.reactions.hairy_skin = { elem2: ["cooked_meat","cancer","ash","skin","hair"], chance:0.1 };
elements.radiation.reactions.hair_dermis = { elem2: ["ash","blood","fat","meat","rotten_meat","cooked_meat","cancer","cancer"], chance:0.4 };
elements.radiation.reactions.amphib_skin = { elem2: ["cooked_meat","cancer","ash","skin","slime"], chance:0.1 };
@@ -8235,7 +8548,7 @@ elements.plague.reactions.hair_dermis = { elem2: ["rotten_meat","infection","fat
elements.plague.reactions.hairy_skin = { elem2: ["plague","infection","rotten_meat","dust","dust","hair"], chance:0.04 };
elements.plague.reactions.amphib_dermis = { elem2: ["rotten_meat","infection","slime","meat","rotten_meat","plague","infection","infection"], chance:0.01 };
elements.plague.reactions.scale_dermis = { elem2: ["rotten_meat","infection","fat","meat","rotten_meat","plague","infection","infection"], chance:0.04 };
-elements.plague.reactions.epidermis = { elem2: ["plague","infection","rotten_meat","dust","dust"], chance:0.01 };
+elements.plague.reactions.epidermis = { elem2: ["plague","infection","rotten_meat","dust","dust"], chance:0.001 };
elements.plague.reactions.amphib_skin = { elem2: ["plague","infection","rotten_meat","skin","slime"], chance:0.01 };
elements.plague.reactions.scales = { elem2: ["plague","infection","rotten_meat","dust","skin","calcium"], chance:0.01 };
elements.plague.reactions.real_bone = { elem2: ["bone","bone","infection","plague"], chance:0.01 };
diff --git a/mods/bojithekings_mod.js b/mods/bojithekings_mod.js
new file mode 100644
index 00000000..11fcac1d
--- /dev/null
+++ b/mods/bojithekings_mod.js
@@ -0,0 +1,377 @@
+runAfterLoad(function() {
+ console.log("Thanks for using bojithekings_mod.js! This is 1.0v")
+})
+
+elements.ultronium = {
+ color: ["#3a293a", "#77337c"],
+ behavior: [
+ "XX|CR:radiation%20 AND CR:neutron%10|XX",
+ "CR:radiation%20 AND CR:neutron%10|XX|CR:radiation%20 AND CR:neutron%10",
+ "XX|CR:radiation%20 AND CR:neutron%10|XX"
+ ],
+ state: "solid",
+ reactions: {
+ "neutron": {elem1: "n_explosion", elem2: null, chance: 0.01, tempMin: 600 }
+ },
+ temp: 500,
+ tempHigh: 10000,
+ stateHigh: "ultronium_gas",
+ renderer: renderPresets.HEATGLOW,
+ tick: function(pixel) {
+ if (Math.random()<0.01 && pixel.temp < 500) {
+ changePixel(pixel, "stable_ultronium")
+ }
+ },
+ category: "solids",
+ density: 25000, //in kg/m³
+ hardness: 0.80
+
+}
+
+elements.ultronium_gas = {
+ color: ["#b45bb4", "#722478"],
+ behavior: [
+ "M2|CR:radiation%20 AND CR:neutron%10 AND M1|M2",
+ "CR:radiation%20 AND CR:neutron%10 AND M1|XX|CR:radiation%20 AND CR:neutron%10 AND M1",
+ "M2|CR:radiation%20 AND CR:neutron%10 AND M1|M2"
+ ],
+ state: "gas",
+ reactions: {
+ "neutron": {elem1: "n_explosion", elem2: null, chance: 0.05}
+ },
+ temp: 12500,
+ tempLow: 9000,
+ stateLow: "ultronium",
+ category: "gases",
+ density: 12000
+
+}
+
+elements.stable_ultronium = {
+ color: ["#362236", "#492a4c"],
+ behavior: [
+ "XX|CR:radiation%10|XX",
+ "CR:radiation%10|XX|CR:radiation%10",
+ "XX|CR:radiation%10|XX"
+ ],
+ state: "solid",
+ tempHigh: 1200,
+ stateHigh: "ultronium",
+ reactions: {
+ "neutron": {elem1: "depleted_ultronium", elem2: null, chance: 0.05, tempMin: 400}
+ },
+ category: "solids",
+ density: 22550, //in kg/m³,
+ hardness: 0.80
+
+}
+
+elements.depleted_ultronium = {
+ color: ["#464646", "#b1a4b5"],
+ behavior: [
+ "XX|XX|XX",
+ "XX|XX|XX",
+ "XX|XX|XX"
+ ],
+ state: "solid",
+ tempHigh: 4000,
+ renderer: renderPresets.HEATGLOW,
+ stateHigh: "depleted_gas_ultronium",
+ category: "solids",
+ density: 22300, //in kg/m³
+ hardness: 0.80
+}
+
+elements.depleted_gas_ultronium = {
+ color: ["#3a293a", "#837c84"],
+ behavior: behaviors.GAS,
+ state: "gas",
+ tempLow: 3990,
+ stateLow: "depleted_ultronium",
+ temp: 4250,
+ category: "gases",
+ density: 13000
+}
+
+elements.supernova.hidden = false
+elements.supernova.category = "energy"
+elements.n_explosion.hidden = false
+elements.n_explosion.category = "energy"
+
+elements.steam.reactions["oxygen"] = {elem1: "humid_air", elem2: null}
+
+elements.humid_air = {
+ color: "#9cb8c9",
+ behavior: behaviors.GAS,
+ state: "gas",
+ temp: 40,
+ tempLow: 20,
+ stateLow: ["water", "oxygen"],
+ category: "gases",
+ density: 1.4
+}
+
+
+elements.heat_to_infinity = {
+ color: "#000000",
+ tool: function(pixel) {
+ pixel.temp += 1e309
+ },
+ category: "tools"
+}
+
+elements.super_heat = {
+ color: "#9c1717",
+ tool: function(pixel) {
+ pixel.temp += 100000
+ },
+ category: "tools"
+}
+elements.super_cool = {
+ color: "#9c1717",
+ tool: function(pixel) {
+ pixel.temp -= 100000
+ },
+ category: "tools"
+}
+
+elements.diamond.tempHigh = 3550
+elements.diamond.stateHigh = "carbon_dioxide"
+
+elements.sulfur_gas.reactions["oxygen"] = {elem1: "sulfur_dioxide", elem2: null}
+
+elements.sulfur_dioxide = {
+ color: ["#cfd5d8","#d5dbde","#c9d0d3"],
+ behavior: behaviors.GAS,
+ category: "gases",
+ state: "gas",
+ density: 2.6,
+ stateLow: "liquid_sulfur_dioxide",
+ tempLow: -10,
+}
+
+elements.liquid_sulfur_dioxide = {
+ color: ["#bfc7cb","#b9c2c7"],
+ behavior: behaviors.LIQUID,
+ category: "liquids",
+ state: "liquid",
+ density: 1.4,
+ stateHigh: "sulfur_dioxide",
+ tempHigh: -10
+}
+
+elements.magma.tempHigh = 2500
+elements.magma.stateHigh = ["sulfur_dioxide", "carbon_dioxide"]
+
+elements.molten_glass.tempHigh = 2500
+elements.molten_glass.stateHigh = ["silicon_gas", "oxygen"]
+
+elements.molten_dirt.tempHigh = 2500
+elements.molten_dirt.stateHigh = ["silicon_gas", "carbon_dioxide"]
+
+elements.molten_salt.tempHigh = 2500
+elements.molten_salt.stateHigh = ["sodium_gas", "chlorine"]
+
+elements.silicon_gas = {
+ color: "#c0c0c0",
+ behavior: behaviors.GAS,
+ state: "gas",
+ category: "gases",
+ density: 0.5,
+ temp: 1500
+}
+
+elements.firebal = {
+ color: "#fff200",
+ behavior: [
+ "XX|XX|XX",
+ "XX|EX:30>plasma|XX",
+ "XX|XX|XX"
+ ],
+ state: "gas",
+ temp: 100000
+}
+
+elements.chromium = {
+ color: ["#beebf0", "#87c0cc"],
+ behavior: behaviors.SOLID,
+ category: "solids",
+ state: "solid",
+ density: 7140,
+ conduct: 0.6,
+ hardness: 0.85,
+ tempHigh: 1907,
+ stateHigh: "molten_chromium"
+}
+
+elements.molten_chromium = {
+ color: ["#ffd500", "#ffae00", "#ff0000"],
+ behavior: behaviors.MOLTEN,
+ hidden: true,
+ state: "liquid",
+ density: 6500,
+ tempLow: 1907,
+ stateLow: "chromium",
+ viscosity: 100,
+ reactions: {
+ "molten_steel": {elem1: "molten_stainless_steel", elem2: null}
+ }
+}
+
+elements.stainless_steel = {
+ color: "#c0c0c0",
+ colorKey: {
+ "L":"#bababa",
+ "B":"#6c6c6c"
+ },
+ colorPattern: [
+ "BBLB",
+ "BBBL",
+ "BLBB",
+ "LBBB"
+ ],
+ behavior: behaviors.SOLID,
+ category: "solids",
+ state: "solid",
+ density: 8000,
+ conduct: 0.42,
+ hardness: 0.85,
+ tempHigh: 1450,
+ stateHigh: "molten_stainless_steel",
+ breakInto: "stainless_steel_dust",
+}
+
+elements.molten_stainless_steel = {
+ color: ["#fff942", "#f49e1d", "#ff4400"],
+ behavior: behaviors.MOLTEN,
+ hidden: true,
+ state: "liquid",
+ density: 8000,
+ tempLow: 1450,
+ stateLow: "stainless_steel",
+ viscosity: 120,
+ conduct: 1,
+}
+
+elements.infinite_burn = {
+ color: "#a16868",
+ behavior: behaviors.WALL,
+ state: "solid",
+ burn: 100,
+ burnTime: 1e9, //more then one irl year
+ fireColor: "#eaff00"
+}
+
+
+elements.h_bomb.behavior = [
+ "XX|XX|XX",
+ "XX|XX|XX",
+ "M2|M1 AND EX:90>plasma,plasma,plasma,plasma,fire,neutron,helium|M2",
+]
+
+elements.hydrogen.reactions["hydrogen"] = {
+ elem1: "h_explosion" , elem2: null, tempMin: 70000
+}
+
+elements.h_explosion = {
+ color: "#aeff00",
+ state: "gas",
+ behavior: [
+ "XX|XX|XX",
+ "XX|EX:90>plasma,plasma,plasma,plasma,fire,neutron,helium|XX",
+ "XX|XX|XX"
+ ],
+ alias: "thermonuclear explosion",
+ category: "fusion_explsosion"
+}
+
+elements.short_super_heater = {
+ color: "#c14a4a",
+ behavior: [
+ "XX|HT:5000|XX",
+ "HT:5000|DL%10|HT:5000",
+ "XX|HT:5000|XX"
+ ]
+}
+
+
+elements.cluster_bomb = {
+ color: "#9b9b9b",
+ behavior: [
+ "XX|XX|XX",
+ "XX|XX|XX",
+ "M2|M1 AND EX:10>bomb|M2",
+ ],
+ category: "weapons"
+}
+
+elements.cluster_bomb_squared = {
+ color: "#6f6f6f",
+ behavior: [
+ "XX|XX|XX",
+ "XX|XX|XX",
+ "M2|M1 AND EX:25>cluster_bomb|M2",
+ ],
+ category: "weapons"
+}
+
+elements.cluster_bomb_cubed = {
+ color: "#737373",
+ behavior: [
+ "XX|XX|XX",
+ "XX|XX|XX",
+ "M2|M1 AND EX:50>cluster_bomb_squared|M2",
+ ],
+ category: "weapons"
+}
+
+elements.cluster_bomb_fourth = {
+ color: "#525252",
+ behavior: [
+ "XX|XX|XX",
+ "XX|XX|XX",
+ "M2|M1 AND EX:100>cluster_bomb_cubed|M2",
+ ],
+ category: "weapons"
+}
+
+elements.cluster_bomb_final = {
+ color: "#525252",
+ behavior: [
+ "XX|XX|XX",
+ "XX|XX|XX",
+ "M2|M1 AND EX:250>cluster_bomb_fourth|M2",
+ ],
+ category: "weapons"
+}
+
+elements.compress_to_a_star = {
+ color: "#e5ff00",
+ tool: function(pixel) {
+ if (pixel.element=="hydrogen" && pixel.temp >= 10000) {
+ changePixel(pixel, "sun")
+ }
+ },
+ category: "tools"
+}
+
+elements.brown_dwarf = {
+ color: "#502606",
+ state: "gas",
+ behavior: behaviors.WALL,
+ temp: 2226,
+ tempHigh: 2726,
+ stateHigh: "sun",
+ tempLow: -23,
+ stateLow: "hydrogen",
+ category: "special"
+}
+
+elements.sun.tempLow = 2225
+elements.sun.stateLow = "brown_dwarf"
+
+//to make it more realistic and hoping it doesn't ruin gameplay
+elements.plasma.behavior = behaviors.GAS
+elements.plasma.temp = 12500
+
+// ISOTOPES category is gonna come next in 1.1v
diff --git a/mods/cubesstuff.js b/mods/cubesstuff.js
index baea58e7..ccf3b56f 100644
--- a/mods/cubesstuff.js
+++ b/mods/cubesstuff.js
@@ -1,11 +1,27 @@
-// TypeScript integration for Sandboxels modding
-// Enables function autocomplete & element definition hints
-///
-// Get the file here: https://github.com/Cube14yt/sandboxels-types
-// Changelog
-// Starts at version 3
+/*
+Use intellisense for sandboxels modding here:
+ to show availavle functions and show global variables
+ https://github.com/Cube14yt/sandboxels-types
+*/
+
+// Changelog
/*
+V1
+Solids: Aerogel, Nordic Gold, Nordic Gold coin, Pyrite
+Machines: Disco Ball
+Extras: Fire Extinguisher Powder
+
+V2
+Machines: Button, Disco Floor, Faulty Wire, Randomizer,
+Tools: Press, Circle
+Solids: Cardboard, Obsidian
+Powders: Glow Stick, Obsidian Shard
+Liquids: Glow Stick Liquid, Lighter fluid, Gasoline
+Life: Mold, Moss,
+Gases: Lighter Fluid Gas
+Food: Pie, Pie Crust
+
V3
Tools: RGB LED, Dice, Custom Bomb
Life: Pineapple Plants (seed, stem, fruit)
@@ -33,8 +49,32 @@ Tools: Polish
Extras: 2 ways to make an element with no name
Special: Black hole
Building Materials: Roman concrete/cement
-*/
+V5
+Machines: Random Teleporter
+Life: Carrot seed and fruit
+Minerals: Quartz and Quartz powder
+Special: Random Word Generator, Fill all,
+Element fill all, Pulsing Color, Element line, White hole
+
+Changes:
+ Moved sandstone to land category
+
+Technical:
+ New helpers for squareCoords and adjacentCoords
+ Rainbow color preset
+*/
+let globals = {
+ circleRad: 7,
+ circleElem: "wood",
+ red: randomIntInRange(0, 255),
+ green: randomIntInRange(0, 255),
+ blue: randomIntInRange(0, 255),
+ explodeElem: "fire",
+ adjusted_heater_temp: 100
+}
+
+const rainbowColor = ["#ff0000", "#ff8800", "#ffff00", "#00ff00", "#00ffff", "#0000ff", "#ff00ff"]
elements.button = {
color: "#970000",
@@ -129,7 +169,7 @@ function randomColor() {
elements.disco_ball = {
color: "#ebebc3",
- buttonColor: ["#ff0000", "#ff8800", "#ffff00", "#00ff00", "#00ffff", "#0000ff", "#ff00ff"],
+ buttonColor: rainbowColor,
renderer: renderPresets.LED,
behavior: behaviors.WALL,
category: "machines",
@@ -139,6 +179,9 @@ elements.disco_ball = {
breakInto: "glass_shard",
forceSaveColor: true,
tick: function (pixel) {
+ if (!pixel.charge) {
+ pixel.charge = 0
+ }
for (var i = 0; i < squareCoords.length; i++) {
var coord = squareCoords[i];
var x = pixel.x + coord[0];
@@ -279,7 +322,7 @@ elements.molten_sulfur.tick = function (pixel) {
var y = pixel.y + coords[1];
if (isEmpty(x, y) && Math.random() <= 0.0005) {
createPixel("stench", x, y)
- p = getPixel(x, y)
+ let p = getPixel(x, y)
if (p !== null && p.element == "stench") {
p.temp = pixel.temp
}
@@ -288,7 +331,7 @@ elements.molten_sulfur.tick = function (pixel) {
}
elements.disco_floor = {
- color: ["#ff0000", "#ff8800", "#ffff00", "#00ff00", "#00ffff", "#0000ff", "#ff00ff"],
+ color: rainbowColor,
breakInto: "glass_shard",
category: "machines",
forceSaveColor: true,
@@ -444,6 +487,9 @@ elements.press = {
tryMove(pixel, pixel.x + x, pixel.y + y)
}
}
+ if (elements[pixel.element].onPress !== undefined) {
+ elements[pixel.element].onPress(pixel)
+ }
}
}
@@ -605,7 +651,7 @@ addRowWhenReady();
elements.randomizer = {
- buttonColor: ["#ff0000", "#ff8800", "#ffff00", "#00ff00", "#00ffff", "#0000ff", "#ff00ff"],
+ buttonColor: rainbowColor,
excludeRandom: true,
onSelect: function () {
logMessage("Warning: It can fill up the screen with random elements")
@@ -618,7 +664,7 @@ elements.randomizer = {
var y = pixel.y + coords[1];
let p = getPixel(x, y)
if (!isEmpty(x, y) && !outOfBounds(x, y)) {
- if (p.element !== "randomizer") {
+ if (p && p.element !== "randomizer") {
changePixel(p, "random")
}
}
@@ -667,10 +713,6 @@ function drawCircle(x0, y0, radius, element) {
}
}
-
-let circleRad = 7;
-let circle_element = "wood";
-
elements.circle = {
color: "#ffffff",
behavior: behaviors.WALL,
@@ -682,20 +724,20 @@ elements.circle = {
function (input1) {
let ans1 = Number(input1)
if (Number.isInteger(ans1) && ans1 > 0) {
- circleRad = ans1
+ globals.circleRad = ans1
} else {
- circleRad = 7
- logMessage("Invalid radius, using default size: " + circleRad);
+ globals.circleRad = 7
+ logMessage("Invalid radius, using default size: " + globals.circleRad);
}
promptInput(
"Select the element you want your circle to be:",
function (ans2) {
let similar = mostSimilarElement(ans2);
if (similar && elements[similar]) {
- circle_element = similar;
+ globals.circleElem = similar;
} else {
- circle_element = "wood"
- logMessage("Invalid element, using default element: " + circle_element);
+ globals.circleElem = "wood"
+ logMessage("Invalid element, using default element: " + globals.circleElem);
}
},
"Element prompt",
@@ -707,29 +749,35 @@ elements.circle = {
);
},
onPlace: function (pixel) {
- drawCircle(pixel.x, pixel.y, circleRad, circle_element);
- changePixel(pixel, circle_element);
- pixel.temp = (elements[circle_element].temp || 20)
+ drawCircle(pixel.x, pixel.y, globals.circleRad, globals.circleElem);
+ changePixel(pixel, globals.circleElem);
+ pixel.temp = (elements[globals.circleElem].temp || 20)
},
maxSize: 1,
excludeRandom: true
};
runAfterReset(function () {
- circleRad = 7;
- circle_element = "wood";
+ if (globals.rCircle) {
+ globals.circleRad = 7;
+ globals.circleElem = "wood";
+ }
})
+/**
+ * gets a random int in a range
+ * @param {number} min
+ * @param {number} max
+ * @returns {number}
+ */
function randomIntInRange(min, max) {
return Math.floor(Math.random() * (max - min + 1)) + min;
}
-let r = randomIntInRange(0, 255);
-let g = randomIntInRange(0, 255);
-let b = randomIntInRange(0, 255);
+
elements.rgb_led = {
- buttonColor: ["#ff0000", "#ff8800", "#ffff00", "#00ff00", "#00ffff", "#0000ff", "#ff00ff"],
+ buttonColor: rainbowColor,
behavior: behaviors.WALL,
desc: "Input the red, green, and blue value (not exceeding 255) and get the color.",
renderer: renderPresets.LED,
@@ -751,7 +799,7 @@ elements.rgb_led = {
if (r_inp > 255 || r_inp < 0 || isNaN(r_inp)) {
logMessage("Red value is invalid, using default/last red value: " + r);
} else {
- r = r_inp;
+ globals.red = r_inp;
}
promptInput("Enter green value (0-255):", function (g_inp) {
@@ -759,7 +807,7 @@ elements.rgb_led = {
if (g_inp > 255 || g_inp < 0 || isNaN(g_inp)) {
logMessage("Green value is invalid, using default/last green value: " + g);
} else {
- g = g_inp;
+ globals.green = g_inp;
}
promptInput("Enter blue value (0-255):", function (b_inp) {
@@ -767,26 +815,29 @@ elements.rgb_led = {
if (b_inp > 255 || b_inp < 0 || isNaN(b_inp)) {
logMessage("Blue value is invalid, using default/last blue value: " + b);
} else {
- b = b_inp;
+ globals.blue = b_inp;
}
- }, "Blue Value", b); // optional default input
- }, "Green Value", g);
- }, "Red Value", r);
+ }, "Blue Value", globals.blue); // optional default input
+ }, "Green Value", globals.green);
+ }, "Red Value", globals.red);
},
onPlace: (pixel) => {
- var ledColor = RGBToHex({ r: r, g: g, b: b });
+ var ledColor = RGBToHex([red, green, blue]);
pixel.color = ledColor;
}
};
runAfterReset(() => {
- r = 100;
- g = 100;
- b = 100;
+ if (globals.rRGBLed) {
+ globals.red = 100;
+ globals.greed = 100;
+ globals.blue = 100;
+ }
})
+if (!elements.malware.reactions) { elements.malware.reactions = {} }
elements.malware.reactions.rgb_led = { elem2: ["led_r", "led_g", "led_b"], chance: 0.01 }
elements.malware.reactions.led_r = { elem2: ["rgb_led", "led_g", "led_b"], chance: 0.01 }
elements.malware.reactions.led_g = { elem2: ["rgb_led", "led_r", "led_b"], chance: 0.01 }
@@ -1132,7 +1183,7 @@ elements.sandstone = {
state: "solid",
stateHigh: "glass",
tempHigh: 1700,
- category: "solids"
+ category: "land"
}
// Glow.js integrtion
@@ -1237,7 +1288,6 @@ elements.realistic_ball = {
}
}
-explodeElem = "fire"
elements.custom_bomb = {
color: "#49443b",
category: "weapons",
@@ -1250,16 +1300,15 @@ elements.custom_bomb = {
promptInput(
"Input the element you want your bomb to explode into",
function (input) {
- pr1 = mostSimilarElement(input)
- if (elements[pr1]) {
+ let pr1 = mostSimilarElement(input)
+ if (pr1 && elements[pr1]) {
if (pr1 === "custom_bomb") {
- explodeElem = 'fire'
- logMessage("Element cannot explode to itself. Using default: fire")
+ promptConfirm("Are you sure you want custom bomb to create itself as it will spread", (a) => { if (!a) { globals.explodeElem = 'fire' } else globals.explodeElem = 'custom_bomb' }, "Warning")
}
- else { explodeElem = pr1 }
+ else { globals.explodeElem = pr1 }
}
else {
- explodeElem = 'fire'
+ globals.explodeElem = 'fire'
logMessage("Invalid element. Using default: fire")
}
},
@@ -1279,7 +1328,9 @@ elements.custom_bomb = {
}
runAfterReset(() => {
- explodeElem = 'fire'
+ if (globals.rCustomBomb) {
+ globals.explodeElem = 'fire'
+ }
})
elements.pineapple = {
@@ -1417,7 +1468,6 @@ elements.rubidium = {
"sugar_water": { elem1: ["explosion", "explosion", "hydrogen"], temp2: 200 },
"pool_water": { elem1: ["explosion", "explosion", "hydrogen"], temp2: 200 },
"dirty_water": { elem1: ["explosion", "explosion", "hydrogen"], temp2: 200 },
- "salt_water": { elem1: ["explosion", "explosion", "hydrogen"], temp2: 200 },
"seltzer": { elem1: ["explosion", "explosion", "hydrogen"], temp2: 200 },
"primordial_soup": { elem1: ["explosion", "explosion", "hydrogen"], temp2: 200 },
"nut_milk": { elem1: ["explosion", "explosion", "hydrogen"], temp2: 200 }
@@ -1441,7 +1491,6 @@ elements.liquid_rubidium = {
"sugar_water": { elem1: ["explosion", "explosion", "hydrogen"], temp2: 200 },
"pool_water": { elem1: ["explosion", "explosion", "hydrogen"], temp2: 200 },
"dirty_water": { elem1: ["explosion", "explosion", "hydrogen"], temp2: 200 },
- "salt_water": { elem1: ["explosion", "explosion", "hydrogen"], temp2: 200 },
"seltzer": { elem1: ["explosion", "explosion", "hydrogen"], temp2: 200 },
"primordial_soup": { elem1: ["explosion", "explosion", "hydrogen"], temp2: 200 },
"nut_milk": { elem1: ["explosion", "explosion", "hydrogen"], temp2: 200 }
@@ -1618,6 +1667,7 @@ elements.robot_body = {
};
// Robot creator element
+var mode = "Aimless"
elements.robot = {
color: "#b1b1b1",
category: "machines",
@@ -1671,7 +1721,7 @@ elements.mercury_gas.behaviorOn = [
"M2|CR:uv_light%10 AND M1|M2"
]
-adjusted_heater_temp = 100
+
elements.broken_adjustable_heater = {
color: "#ff0000",
category: "extras",
@@ -1683,15 +1733,15 @@ elements.broken_adjustable_heater = {
"Select the temperature you want to adjust to",
function (choice) {
if (choice && !isNaN(Number(choice))) {
- adjusted_heater_temp = choice
+ globals.adjusted_heater_temp = Number(choice)
logMessage("Occasionally creates superheated pixels")
}
},
- "Temperature Prompt", adjusted_heater_temp
+ "Temperature Prompt", `${globals.adjusted_heater_temp}`
)
},
tick(pixel) {
- pixel.heat_temp ??= adjusted_heater_temp
+ pixel.heat_temp ??= globals.adjusted_heater_temp
for (let i = 0; i < adjacentCoords.length; i++) {
let x = pixel.x + adjacentCoords[i][0];
let y = pixel.y + adjacentCoords[i][1];
@@ -1708,8 +1758,8 @@ elements.broken_adjustable_heater = {
}
};
-adjusted_temp = 100
-heatAmount = 2
+globals.adjusted_temp = 100
+globals.heatAmount = 2
elements.adjustable_heater = {
color: "#ff0000",
@@ -1722,10 +1772,10 @@ elements.adjustable_heater = {
"Select the temperature you want to adjust to",
function (choice) {
if (choice && !isNaN(Number(choice))) {
- adjusted_temp = Number(choice);
+ globals.adjusted_temp = Number(choice);
}
},
- "Temperature Prompt", adjusted_temp
+ "Temperature Prompt", `${globals.adjusted_temp}`
);
},
@@ -1740,10 +1790,10 @@ elements.adjustable_heater = {
!elements[current_pixel.element]?.insulate
) {
// Heat or cool toward the adjusted temp
- if (current_pixel.temp < adjusted_temp) {
- current_pixel.temp = Math.min(current_pixel.temp + heatAmount, adjusted_temp);
- } else if (current_pixel.temp > adjusted_temp) {
- current_pixel.temp = Math.max(current_pixel.temp - heatAmount, adjusted_temp);
+ if (current_pixel.temp < globals.adjusted_temp) {
+ current_pixel.temp = Math.min(current_pixel.temp + globals.heatAmount, globals.adjusted_temp);
+ } else if (current_pixel.temp > globals.adjusted_temp) {
+ current_pixel.temp = Math.max(current_pixel.temp - globals.heatAmount, globals.adjusted_temp);
}
pixelTempCheck(current_pixel)
}
@@ -1751,7 +1801,7 @@ elements.adjustable_heater = {
}
};
-adjusted_cooler_temp = 0; // default cooling target
+globals.adjusted_cooler_temp = 0; // default cooling target
elements.broken_adjustable_cooler = {
color: "#0000ff",
@@ -1764,16 +1814,16 @@ elements.broken_adjustable_cooler = {
"Select the temperature you want to cool to",
function (choice) {
if (choice && !isNaN(Number(choice))) {
- adjusted_cooler_temp = Number(choice);
+ globals.adjusted_cooler_temp = Number(choice);
logMessage("Occasionally creates supercooled pixels");
}
},
- "Temperature Prompt", adjusted_cooler_temp
+ "Temperature Prompt", `${globals.adjusted_cooler_temp}`
);
},
tick(pixel) {
- pixel.cool_temp ??= adjusted_cooler_temp;
+ pixel.cool_temp ??= globals.adjusted_cooler_temp;
for (let i = 0; i < adjacentCoords.length; i++) {
let x = pixel.x + adjacentCoords[i][0];
let y = pixel.y + adjacentCoords[i][1];
@@ -1791,8 +1841,8 @@ elements.broken_adjustable_cooler = {
}
};
-adjusted_cool_temp = 0; // default cooling target
-coolAmount = 2; // adjustable step
+globals.adjusted_cool_temp = 0; // default cooling target
+globals.coolAmount = 2; // adjustable step
elements.adjustable_cooler = {
color: "#0000ff",
@@ -1805,10 +1855,10 @@ elements.adjustable_cooler = {
"Select the temperature you want to cool to",
function (choice) {
if (choice && !isNaN(Number(choice))) {
- adjusted_cool_temp = Number(choice);
+ globals.adjusted_cool_temp = Number(choice);
}
},
- "Temperature Prompt", adjusted_cool_temp
+ "Temperature Prompt", `${globals.adjusted_cool_temp}`
);
},
@@ -1823,10 +1873,10 @@ elements.adjustable_cooler = {
!elements[current_pixel.element]?.insulate
) {
// Cool or heat toward target (mirrors fixed heater logic)
- if (current_pixel.temp > adjusted_cool_temp) {
- current_pixel.temp = Math.max(current_pixel.temp - coolAmount, adjusted_cool_temp);
- } else if (current_pixel.temp < adjusted_cool_temp) {
- current_pixel.temp = Math.min(current_pixel.temp + coolAmount, adjusted_cool_temp);
+ if (current_pixel.temp > globals.adjusted_cool_temp) {
+ current_pixel.temp = Math.max(current_pixel.temp - globals.coolAmount, globals.adjusted_cool_temp);
+ } else if (current_pixel.temp < globals.adjusted_cool_temp) {
+ current_pixel.temp = Math.min(current_pixel.temp + globals.coolAmount, globals.adjusted_cool_temp);
}
pixelTempCheck(current_pixel)
@@ -1836,20 +1886,21 @@ elements.adjustable_cooler = {
};
-let polishedList = new Set()
+globals.polishedList = new Set()
elements.polish = {
+ desc: "Polishes textured elements",
category: "tools",
color: ["#a0dff0", "#c0e8f8", "#e0f5ff"],
tool(pixel) {
let element = pixel.element
- if ((elements[pixel.element].colorPattern && !polishedList.has(`${pixel.x}, ${pixel.y}`)) || shiftDown) {
+ if ((elements[pixel.element].colorPattern && !globals.polishedList.has(`${pixel.x}, ${pixel.y}`)) || shiftDown) {
deletePixel(pixel.x, pixel.y)
createPixel(element, pixel.x, pixel.y)
- polishedList.add(`${pixel.x}, ${pixel.y}`)
+ globals.polishedList.add(`${pixel.x}, ${pixel.y}`)
}
},
onUnselect() {
- polishedList.clear()
+ globals.polishedList.clear()
}
}
@@ -1890,8 +1941,9 @@ elements.paper_filter = {
let liquid = upPixel.con
let viscMove = true
- if (elements[liquid.element].viscosity) {
- viscMove = (Math.random() * 100) < (100 / Math.pow(elements[liquid.element].viscosity, 0.5))
+ let visc = elements[liquid.element].viscosity
+ if (visc) {
+ viscMove = (Math.random() * 100) < (100 / Math.pow(visc, 0.5))
}
if (viscMove) {
@@ -1904,8 +1956,9 @@ elements.paper_filter = {
let liquid = pixel.con
let viscExit = true
- if (elements[liquid.element].viscosity) {
- viscExit = (Math.random() * 100) < (100 / Math.pow(elements[liquid.element].viscosity, 0.5))
+ let visc = elements[liquid.element].viscosity
+ if (visc) {
+ viscExit = (Math.random() * 100) < (100 / Math.pow(visc, 0.5))
}
if (viscExit) {
@@ -1936,8 +1989,9 @@ elements.indestructable_filter = {
let liquid = upPixel.con
let viscMove = true
- if (elements[liquid.element].viscosity) {
- viscMove = (Math.random() * 100) < (100 / Math.pow(elements[liquid.element].viscosity, 0.5))
+ let visc = elements[liquid.element].viscosity
+ if (visc) {
+ viscMove = (Math.random() * 100) < (100 / Math.pow(visc, 0.5))
}
if (viscMove) {
@@ -1950,8 +2004,9 @@ elements.indestructable_filter = {
let liquid = pixel.con
let viscExit = true
- if (elements[liquid.element].viscosity) {
- viscExit = (Math.random() * 100) < (100 / Math.pow(elements[liquid.element].viscosity, 0.5))
+ let visc = elements[liquid.element].viscosity
+ if (visc) {
+ viscExit = (Math.random() * 100) < (100 / Math.pow(visc, 0.5))
}
if (viscExit) {
@@ -1962,7 +2017,7 @@ elements.indestructable_filter = {
}
}
-let black_hole_expand = false
+globals.glass_hole_expand = false
elements.black_hole = {
color: "#111111",
hardness: 1,
@@ -2050,7 +2105,7 @@ elements.black_hole = {
}
}
}
- if (black_hole_expand) {
+ if (globals.glass_hole_expand) {
for (var i = 0; i < adjacentCoords.length; i++) {
var x = pixel.x + adjacentCoords[i][0];
var y = pixel.y + adjacentCoords[i][1];
@@ -2069,19 +2124,92 @@ elements.black_hole = {
["Yes", "No"],
(choice) => {
if (!choice) {
- choice = false
+ choice = "No"
}
if (choice == "Yes") {
- black_hole_expand = true
+ globals.glass_hole_expand = true
}
else {
- black_hole_expand = false
+ globals.glass_hole_expand = false
}
}
)
}
};
+elements.white_hole = {
+ color: "#ffffff",
+ renderer: function (pixel, ctx) {
+ if (!viewInfo[view].colorEffects) { drawDefault(ctx, pixel); return }
+ renderPresets.HEATGLOW(pixel, ctx);
+ if (pixel.alpha === 0) return;
+ let edge = false;
+ 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) && elements[pixelMap[x][y].element].movable !== elements[pixel.element].movable)) {
+ edge = true;
+ break;
+ }
+ }
+ if (edge) { drawSquare(ctx, "rgba(0,0,0," + (pixel.alpha || 1) / 4 + ")", pixel.x, pixel.y) }
+ },
+ tick(pixel) {
+ 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) && !outOfBounds(x, y) && Math.random() <= 0.0005) {
+ createPixel(
+ ["proton", "neutron", "electric",
+ "proton", "neutron", "electric",
+ "proton", "neutron", "electric",
+ "proton", "neutron", "electric",
+ "random"], x, y)
+ }
+ }
+ let radius = 20;
+ for (let dx = -radius; dx <= radius; dx++) {
+ for (let dy = -radius; dy <= radius; dy++) {
+ if (dx === 0 && dy === 0) continue;
+
+ let x = pixel.x + dx;
+ let y = pixel.y + dy;
+
+ if (!outOfBounds(x, y)) {
+ let other = getPixel(x, y);
+ if (other && other !== pixel) {
+ let elemDef = elements[other.element];
+
+ if (elemDef.hardness === 1) continue;
+
+ let dist = Math.sqrt(dx * dx + dy * dy);
+
+ if (dist <= radius) {
+ let chance = 1 / (dist * 0.75);
+ if (Math.random() < chance) {
+ let stepX = Math.sign(pixel.x - x);
+ let stepY = Math.sign(pixel.y - y);
+
+ let newX = x - stepX;
+ let newY = y - stepY;
+
+ if (isEmpty(newX, newY) && !outOfBounds(newX, newY)) {
+ movePixel(other, newX, newY);
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ hardness: 1,
+ behavior: behaviors.WALL,
+ category: "special"
+}
+
elements.cacao_fruit = {
color: "#854700",
behavior: [
@@ -2133,7 +2261,6 @@ elements.dried_cacao_bean = {
elements.coffee_bean.reactions.sugar_water = { elem2: "coffee", tempMin: 80 }
elements.coffee.reactions.sugar_water = { elem2: "coffee", tempMin: 70, chance: 0.2 }
elements.coffee_ground.reactions.sugar_water = elements.coffee_ground.reactions.water
-
elements._ = {
category: "extras",
onSelect() {
@@ -2196,7 +2323,9 @@ elements.cacao_stem = {
if (pixel.stage === 1 && isEmpty(pixel.x, pixel.y - 1) && Math.random() <= 0.05) {
tryMove(pixel, pixel.x, pixel.y - 1, "cacao_stem")
let oldPixel = getPixel(pixel.x, pixel.y + 1)
- delete oldPixel.stage
+ if (oldPixel) {
+ delete oldPixel.stage
+ }
if (Math.random() <= 0.3) {
pixel.stage = 2
}
@@ -2213,11 +2342,11 @@ elements.cacao_stem = {
else nx = 0;
if (isEmpty(pixel.x + nx, pixel.y - 1) && Math.random() <= 0.05) {
createPixel(["cacao_stem", "plant"], pixel.x + nx, pixel.y - 1)
- newPixel = getPixel(pixel.x + nx, pixel.y - 1)
- if (Math.random() <= 0.2) {
+ let newPixel = getPixel(pixel.x + nx, pixel.y - 1)
+ if (Math.random() <= 0.2 && newPixel) {
newPixel.stage = 3
}
- else newPixel.stage = 2;
+ else if (newPixel) newPixel.stage = 2;
}
if (!isEmpty(pixel.x + 1, pixel.y - 1) && !isEmpty(pixel.x, pixel.y - 1) && !isEmpty(pixel.x - 1, pixel.y - 1) && Math.random() <= 0.005) {
shuffleArray(adjacentCoordsShuffle)
@@ -2318,21 +2447,21 @@ const pianoFrequencies = {
};
-let note = 261.626; // default C4
-let notesToPlay = [];
+globals.note = 261.626; // default C4
+globals.notesToPlay = [];
function flushNotes() {
- if (notesToPlay.length === 0) return;
+ if (globals.notesToPlay.length === 0) return;
let baseVolume = 0.2;
- let volume = baseVolume / Math.sqrt(notesToPlay.length);
+ let volume = baseVolume / Math.sqrt(globals.notesToPlay.length);
- for (let f of notesToPlay) {
+ for (let f of globals.notesToPlay) {
playNote(f, 1, "sine", volume);
}
- notesToPlay = [];
+ globals.notesToPlay = [];
}
elements.note_block = {
@@ -2343,25 +2472,25 @@ elements.note_block = {
"Select the note this note block should be",
function (choice) {
if (!choice) {
- if (!note) { note = 261.626; }
+ if (!globals.note) { globals.note = 261.626; }
return;
}
let key = choice.toUpperCase();
if (key in pianoFrequencies) {
- note = pianoFrequencies[key];
+ globals.note = pianoFrequencies[key];
} else {
- note = 261.626; // fallback = C4
+ globals.note = 261.626; // fallback = C4
}
},
"Note prompt"
);
},
onPlace(pixel) {
- pixel.note = note;
+ pixel.note = globals.note;
},
tick(pixel) {
if (pixel.charge) {
- notesToPlay.push(Number(pixel.note));
+ globals.notesToPlay.push(Number(pixel.note));
}
},
conduct: 1,
@@ -2458,4 +2587,742 @@ function doWaterReactions(element, reaction) {
elements[element].reactions.nut_milk = reaction
}
-doWaterReactions("slaked_lime", {elem1:"roman_cement", elem2: null, chance: 0.25})
+doWaterReactions("slaked_lime", { elem1: "roman_cement", elem2: null, chance: 0.25 })
+
+globals.cachedWords = [];
+globals.otherCachedWords = [];
+globals.filteredCachedWords = [];
+globals.loadingLogged = false;
+
+
+async function getWordList() {
+ if (globals.cachedWords) return globals.cachedWords;
+ try {
+ const response = await fetch("https://raw.githubusercontent.com/first20hours/google-10000-english/refs/heads/master/google-10000-english-no-swears.txt");
+ if (!response.ok) throw new Error('Network error');
+ const text = await response.text();
+ globals.cachedWords = text.split("\n");
+ return globals.cachedWords;
+ } catch (err) {
+ console.error(err);
+ return [];
+ }
+}
+
+
+async function getCleanWordList() {
+ if (globals.otherCachedWords) return globals.otherCachedWords;
+ try {
+ const response = await fetch("https://raw.githubusercontent.com/dwyl/english-words/refs/heads/master/words.txt");
+ if (!response.ok) throw new Error('Network error');
+ const text = await response.text();
+ globals.otherCachedWords = text.split("\n");
+ return globals.otherCachedWords;
+ } catch (err) {
+ console.error(err);
+ return [];
+ }
+}
+
+async function filterWordList() {
+ if (!globals.cachedWords) await getWordList();
+ if (!globals.otherCachedWords) await getCleanWordList();
+
+ if (globals.filteredCachedWords) return globals.filteredCachedWords;
+
+ const cleanSet = new Set(globals.otherCachedWords);
+ globals.filteredCachedWords = [];
+
+ const chunkSize = 1000;
+ for (let i = 0; i < globals.cachedWords.length; i += chunkSize) {
+ const chunk = globals.cachedWords.slice(i, i + chunkSize);
+ globals.filteredCachedWords.push(...chunk.filter(word => cleanSet.has(word)));
+ await new Promise(requestAnimationFrame);
+ }
+ console.log("Finished filtering")
+ return globals.filteredCachedWords;
+}
+
+filterWordList()
+
+// getting myself familiar with async functions
+elements.random_word_generator = {
+ color: "#ffffff",
+ behavior: behaviors.WALL,
+ desc: "When shocked logs a random word",
+ conduct: 1,
+ category: "special",
+ tick: function (pixel) {
+ pixel.cd ??= 0;
+
+ if (pixel.charge === 1 && pixel.cd <= 0) {
+ if (!globals.filteredCachedWords && !globals.loadingLogged) {
+ logMessage("Loading...");
+ globals.loadingLogged = true;
+ }
+
+ const words = globals.filteredCachedWords ?? []
+
+ if (words.length > 0) {
+ const word = words[Math.floor(Math.random() * words.length)];
+ logMessage("Your word is: " + word);
+ pixel.cd = 10;
+ } else {
+ logMessage("Failed to load words.");
+ }
+ } else if (pixel.cd > 0) {
+ pixel.cd--;
+ }
+ }
+};
+
+globals.paint_color = "#ff0000";
+
+elements.paint_using_hex = {
+ color: elements.paint.color,
+ onSelect() {
+ promptInput(
+ "Select the color you want in hex. If you pass an array, make sure each hex value is wrapped with quotes.",
+ (choice) => {
+ if (!choice) return;
+
+ const regex = /^#([a-fA-F0-9]{6})$/;
+
+ if (regex.test(choice)) {
+ globals.paint_color = choice;
+ return;
+ }
+
+ try {
+ const converted = choice.replace(/'/g, '"')
+ const parsed = JSON.parse(converted);
+
+ if (Array.isArray(parsed)) {
+ let valid = true;
+ for (let value of parsed) {
+ if (!regex.test(value)) {
+ valid = false;
+ break;
+ }
+ }
+ if (valid) {
+ globals.paint_color = parsed;
+ return;
+ }
+ }
+ } catch (e) {
+ logMessage("Parse failed")
+ console.log(e)
+ }
+
+ logMessage("Invalid color or array of colors");
+ console.log(`${choice}`)
+ }
+ );
+ },
+ tool(pixel) {
+ if (!shiftDown) {
+ pixel.color = pixelColorPick(pixel, globals.paint_color);
+ }
+ else if (Array.isArray(globals.paint_color)) {
+ pixel.color = choose(globals.paint_color)
+ }
+ else {
+ pixel.color = globals.paint_color
+ }
+ },
+ category: "tools"
+};
+
+globals.rCircle = false
+globals.rRGBLed = false
+globals.rCustomBomb = false
+dependOn("betterSettings.js", () => {
+ var Reset = new SettingsTab("Reset");
+ var resetCircle = new Setting("Reset circle value and radius on reset", "Reset circle", settingType.BOOLEAN, false, defaultValue = false);
+ var resetRGBLed = new Setting("Reset RGB Led value on reset", "Reset RGB Led", settingType.BOOLEAN, false, defaultValue = false);
+ var resetCustomBomb = new Setting("Reset Custom Bomb value on reset", "Reset Custom Bomb", settingType.BOOLEAN, false, defaultValue = false);
+ Reset.registerSettings("Reset", resetRGBLed)
+ Reset.registerSettings("Reset", resetCircle)
+ Reset.registerSettings("Reset", resetCustomBomb)
+ settingsManager.registerTab(Reset);
+ runEveryTick(() => {
+ if (resetCircle.value == true) {
+ globals.rCircle = true
+ } else globals.rCircle = false
+ if (resetCustomBomb.value == true) {
+ globals.rCustomBomb = true
+ } else globals.rCustomBomb = false
+ if (resetRGBLed.value == true) {
+ globals.rRGBLed = true
+ } else globals.rRGBLed = false
+ })
+}, true)
+
+elements.quartz = {
+ color: ["#f0f0f0", "#ebebeb", "#f8f8f8"],
+ grain: 0,
+ conduct: 0.3,
+ behavior: behaviors.WALL,
+ onBreak(pixel) {
+ if (Math.random() <= 0.2) {
+ pixel.charge = 1
+ }
+ },
+ onPress(pixel) {
+ if (Math.random() <= 0.2) {
+ pixel.charge = 1
+ }
+ },
+ density: 2650,
+ hardness: 0.7,
+ breakInto: "quartz_powder",
+ category: "solids"
+}
+
+elements.quartz_powder = {
+ color: ["#dddddd", "#e0e0e0", "#f0f0f0"],
+ grain: 0,
+ conduct: 0.3,
+ behavior: behaviors.POWDER,
+ onBreak(pixel) {
+ if (Math.random() <= 0.2) {
+ pixel.charge = 1
+ }
+ },
+ density: 2650,
+ hardness: 0.7,
+ category: "powders"
+}
+
+elements.carrot_seed = {
+ color: '#925420',
+ behavior: behaviors.STURDYPOWDER,
+ cooldown: defaultCooldown,
+ category: "life",
+ tempHigh: 400,
+ stateHigh: "fire",
+ tempLow: -2,
+ stateLow: "frozen_plant",
+ burn: 50,
+ burnTime: 20,
+ state: "solid",
+ tick(pixel) {
+ let belowPixel = getPixel(pixel.x, pixel.y + 1)
+ if (belowPixel && eLists.SOIL.includes(belowPixel.element) && Math.random() <= 0.05) {
+ changePixel(belowPixel, "carrot")
+ belowPixel.stage = 1
+ belowPixel.connected = true
+ changePixel(pixel, "plant")
+ }
+ }
+}
+
+
+elements.carrot = {
+ color: ["#ec9a00", "#d67200"],
+ behavior: behaviors.STURDYPOWDER,
+ category: "food",
+ density: 700,
+ isFood: true,
+ breakInto: "juice",
+ breakIntoColor: "#ffa600",
+ hoverStat(pixel) {
+ if (pixel.stage) return pixel.stage
+ else return 0;
+ },
+ tick(pixel) {
+ let belowPixel = getPixel(pixel.x, pixel.y + 1)
+ if (getPixel(pixel.x, pixel.y - 1) && getPixel(pixel.x, pixel.y - 1).element != "carrot" && getPixel(pixel.x, pixel.y - 1).element != "plant") {
+ pixel.connected = false;
+ }
+ if (!getPixel(pixel.x, pixel.y - 1)) {
+ pixel.connected = false
+ }
+ if (pixel.stage == 1 && Math.random() <= 0.05 && belowPixel && eLists.SOIL.includes(belowPixel.element) && pixel.connected) {
+ changePixel(belowPixel, "carrot");
+ let newStage;
+ if (Math.random() <= 0.3) newStage = 1; else newStage = 2;
+ belowPixel.stage = newStage
+ belowPixel.connected = true
+ }
+ else if (pixel.stage == 2) {
+ if (Math.random() <= 0.1 && belowPixel && eLists.SOIL.includes(belowPixel.element) && pixel.connected) {
+ changePixel(belowPixel, "root")
+ }
+ }
+ }
+}
+
+function factorial(n) {
+ if (n < 0) throw new Error("Factorial not defined for negative numbers");
+ let result = 1;
+ for (let i = 2; i <= Number(n); i++) {
+ result *= i;
+ }
+ return result;
+}
+
+function parseEquation(eq) {
+ eq = eq.replace(/\s+/g, "");
+
+ let tokens = [];
+ let current_num = "";
+
+ for (let i = 0; i < eq.length; i++) {
+ // Multi-character constants
+ if (eq.startsWith("pi", i)) {
+ if (current_num !== "") { tokens.push(parseFloat(current_num)); current_num = ""; }
+ tokens.push(Math.PI);
+ i++;
+ continue;
+ }
+ if (eq.startsWith("phi", i)) {
+ if (current_num !== "") { tokens.push(parseFloat(current_num)); current_num = ""; }
+ tokens.push(1.6180339887);
+ i += 2;
+ continue;
+ }
+ // Multi-character functions
+ if (eq.startsWith("sqrt", i)) {
+ if (current_num !== "") { tokens.push(parseFloat(current_num)); current_num = ""; }
+ tokens.push("sqrt");
+ i += 3; // skip 'qrt'
+ continue;
+ }
+
+ let char = eq[i];
+
+ if (/[0-9.]/.test(char)) {
+ current_num += char;
+ } else {
+ if (current_num !== "") { tokens.push(parseFloat(current_num)); current_num = ""; }
+
+ if (char === "-" && (i === 0 || /[+\-*/(]/.test(eq[i - 1]))) {
+ current_num = "-";
+ }
+ else if (char === "e") { tokens.push(Math.E); }
+ else if (char === "Ï€") { tokens.push(Math.PI); }
+ else if (char === "φ") { tokens.push(1.6180339887); }
+ else if (char === "×") { tokens.push("*"); }
+ else if (char === "÷") { tokens.push("/"); }
+ else { tokens.push(char); }
+ }
+ }
+
+ if (current_num !== "") { tokens.push(parseFloat(current_num)); }
+
+ // Implicit multiplication
+ let fixed = [];
+ for (let i = 0; i < tokens.length; i++) {
+ fixed.push(tokens[i]);
+ let curr = tokens[i];
+ let next = tokens[i + 1];
+
+ if (
+ (typeof curr === "number" && next === "(") ||
+ (curr === ")" && typeof next === "number") ||
+ (curr === ")" && next === "(") ||
+ (typeof curr === "number" && next === "sqrt") // implicit multiplication with functions
+ ) {
+ fixed.push("*");
+ }
+ }
+
+ return fixed;
+}
+
+
+function evaluate(tokens) {
+ function helper(start = 0) {
+ let stack = [];
+ let i = start;
+
+ while (i < tokens.length) {
+ let token = tokens[i];
+
+ if (typeof token === "number") {
+ stack.push(token);
+
+ // Check for factorial
+ if (tokens[i + 1] === "!") {
+ stack[stack.length - 1] = factorial(stack[stack.length - 1]);
+ i++; // skip the '!' token
+ }
+ }
+ else if (token === "sqrt") {
+ let [val, nextIndex] = helper(i + 1);
+ stack.push(Math.sqrt(val));
+
+ // Check for factorial after function
+ if (tokens[nextIndex + 1] === "!") {
+ stack[stack.length - 1] = factorial(stack[stack.length - 1]);
+ nextIndex++;
+ }
+
+ i = nextIndex;
+ }
+ else if (token === "(") {
+ let [val, nextIndex] = helper(i + 1);
+ stack.push(val);
+
+ // Factorial for parentheses
+ if (tokens[nextIndex + 1] === "!") {
+ stack[stack.length - 1] = factorial(stack[stack.length - 1]);
+ nextIndex++;
+ }
+
+ i = nextIndex;
+ }
+ else if (token === ")") {
+ break;
+ }
+ else {
+ // operator
+ stack.push(token);
+ }
+ i++;
+ }
+
+
+ // First handle * and /
+ for (let j = 0; j < stack.length; j++) {
+ if (stack[j] === "*" || stack[j] === "/") {
+ let left = stack[j - 1];
+ let right = stack[j + 1];
+ let result = stack[j] === "*" ? left * right : left / right;
+ stack.splice(j - 1, 3, result);
+ j--;
+ }
+ }
+
+ // Then handle + and -
+ for (let j = 0; j < stack.length; j++) {
+ if (stack[j] === "+" || stack[j] === "-") {
+ let left = stack[j - 1];
+ let right = stack[j + 1];
+ let result = stack[j] === "+" ? left + right : left - right;
+ stack.splice(j - 1, 3, result);
+ j--;
+ }
+ }
+
+ return [stack[0], i];
+ }
+
+ return helper(0)[0];
+}
+
+function calculate(expr) {
+ let tokens = parseEquation(expr);
+ return evaluate(tokens);
+}
+
+elements.calculator = {
+ canPlace: false,
+ onSelect() {
+ promptInput("Input your equation", (eq) => {
+ try {
+ let ans = calculate(eq)
+ if (ans == Infinity) {
+ logMessage("Division by 0 error")
+ return;
+ }
+ if (isNaN(ans)) {
+ logMessage("Error")
+ return;
+ }
+ logMessage(Number(ans.toFixed(10)))
+ }
+ catch (e) {
+ logMessage("Invalid Characters Detected")
+ console.log(e)
+ }
+ })
+ },
+ category: "tools"
+}
+
+elements.random_teleporter = {
+ buttonColor: ["#5fdaff", "#dd8500"],
+ color: "#5fdaff",
+ grain: 0,
+ tick(pixel) {
+ // Color fading
+ pixel.fadeTo ??= "orange"
+ pixel.colorStay ??= 30
+ if (pixel.fadeTo === "orange") {
+ if (pixel.colorStay > 0) {
+ let ratio = pixel.colorStay / 30
+ pixel.color = fadeColor("#dd8500", "#5fdaff", ratio)
+ pixel.colorStay--
+ } else pixel.fadeTo = "blue";
+ } else {
+ if (30 - pixel.colorStay > 0) {
+ let ratio = (30 - pixel.colorStay) / 30
+ pixel.color = fadeColor("#5fdaff", "#dd8500", ratio)
+ pixel.colorStay++
+ } else pixel.fadeTo = "orange";
+ }
+
+ for (var i = 0; i < squareCoords.length; i++) {
+ let coord = squareCoords[i];
+ let x = pixel.x + coord[0];
+ let y = pixel.y + coord[1];
+ if (!isEmpty(x, y)) {
+ let p = getPixel(x, y)
+ if (!p) return;
+ if (elements[p.element]?.hardness === 1) return;
+ let availableCoords = [];
+ for (let j = 0; j <= width; j++) {
+ for (let k = 0; k <= height; k++) {
+ if (isEmpty(j, k)) {
+ availableCoords.push([j, k])
+ }
+ }
+ }
+ if (availableCoords.length > 0) {
+ let newCoords = choose(availableCoords)
+ tryMove(p, newCoords[0], newCoords[1])
+ }
+ }
+ }
+ },
+ hardness: 1,
+ behavior: behaviors.WALL,
+ renderer: renderPresets.BORDER,
+ category: "machines"
+}
+
+elements.fill_all = {
+ color: "#ae4cd9",
+ behavior: behaviors.WALL,
+ category: "special",
+ reactions: {
+ "neutron": { elem1: "lattice" },
+ "proton": { elem1: "vertical" },
+ "electric": { elem1: "horizontal" },
+ "positron": { elem1: "vertical" },
+ "plasma": { elem1: "armageddon", tempMin: 500, charged: true }
+ },
+ density: 1834,
+ tick(pixel) {
+ for (let x = 0; x <= width; x++) {
+ for (let y = 0; y <= height; y++) {
+ tryCreate("filler", x, y)
+ }
+ }
+ changePixel(pixel, "filler")
+ },
+ maxSize: 1,
+ excludeRandom: true
+}
+
+globals.elemFillAll = "sand"
+elements.element_fill_all = {
+ color: "#ae4cd9",
+ behavior: behaviors.WALL,
+ category: "special",
+ excludeRandom: true,
+ reactions: {
+ "neutron": { elem1: "lattice" },
+ "proton": { elem1: "vertical" },
+ "electric": { elem1: "horizontal" },
+ "positron": { elem1: "vertical" },
+ "plasma": { elem1: "armageddon", tempMin: 500, charged: true }
+ },
+ onSelect() {
+ promptInput("What element should this filler fill", (elem) => {
+ let el = mostSimilarElement(elem)
+ if (el) {
+ globals.elemFillAll = el
+ }
+ }, "Element Prompt")
+ },
+ tick(pixel) {
+ for (let x = 0; x <= width; x++) {
+ for (let y = 0; y <= height; y++) {
+ tryCreate(globals.elemFillAll, x, y)
+ }
+ }
+ changePixel(pixel, globals.elemFillAll)
+ },
+ maxSize: 1,
+}
+
+globals.pulsecol1 = "#ffffff"
+globals.pulsecol2 = "#000000"
+elements.pulsing_color = {
+ buttonColor: rainbowColor,
+ behavior: behaviors.WALL,
+ category: "special",
+ onSelect() {
+ promptInput("Input the starting color of the pulse in hex", (col1) => {
+ if (col1) {
+ if (/^#([A-Fa-f0-9]{6})$/.test(col1)) {
+ globals.pulsecol1 = col1
+ promptInput("Input the second color that it should pulse to", (col2) => {
+ if (col2) {
+ if (/^#([A-Fa-f0-9]{6})$/.test(col2)) {
+ globals.pulsecol2 = col2
+ }
+ }
+ })
+ }
+ }
+ })
+ },
+ onPlace(pixel) {
+ pixel.color = globals.pulsecol1
+ },
+ tick(pixel) {
+ // 1 = fade to color 2, 0 = fade to color 1
+ let frames = 30
+ pixel.fadeTo ??= 1
+ pixel.colorStay ??= frames
+ pixel.col1 ??= globals.pulsecol1
+ pixel.col2 ??= globals.pulsecol2
+ if (pixel.fadeTo === 1) {
+ if (pixel.colorStay > 0) {
+ let ratio = pixel.colorStay / frames
+ pixel.color = fadeColor(pixel.col2, pixel.col1, ratio)
+ pixel.colorStay--
+ } else pixel.fadeTo = 0;
+ } else {
+ if (frames - pixel.colorStay > 0) {
+ let ratio = (frames - pixel.colorStay) / frames
+ pixel.color = fadeColor(pixel.col1, pixel.col2, ratio)
+ pixel.colorStay++
+ } else pixel.fadeTo = 1;
+ }
+ }
+}
+
+globals.createElemWDir = "wood"
+globals.lineDir = 0
+elements.element_line = {
+ color: "#d9d9d9",
+ behavior: behaviors.WALL,
+ category: "special",
+ hidden: true,
+ excludeRandom: true,
+ insulate: true,
+ movable: false,
+ onSelect() {
+ promptInput("Input the element it should use", (input) => {
+ if (!input) return;
+ let elem = mostSimilarElement(input)
+ if (elem) {
+ globals.createElemWDir = elem
+ }
+ promptDir("Choose The direction the line should draw in", (dir) => {
+ globals.lineDir = dir
+ }, "Direction Input")
+ }, "Element Input")
+ },
+ onPlace(pixel) {
+ pixel.clone ??= globals.createElemWDir
+ pixel.dir ??= globals.lineDir
+ },
+ tick(pixel) {
+ if (pixel.dir === 0) {
+ if (!tryMove(pixel, pixel.x + 1, pixel.y, pixel.clone)) {
+ changePixel(pixel, pixel.clone, true)
+ }
+ }
+ if (pixel.dir === 1) {
+ if (!tryMove(pixel, pixel.x, pixel.y - 1, pixel.clone)) {
+ changePixel(pixel, pixel.clone, true)
+ }
+ }
+ if (pixel.dir === 2) {
+ if (!tryMove(pixel, pixel.x + 1, pixel.y, pixel.clone)) {
+ changePixel(pixel, pixel.clone, true)
+ }
+ }
+ if (pixel.dir === 3) {
+ if (!tryMove(pixel, pixel.x, pixel.y + 1, pixel.clone)) {
+ changePixel(pixel, pixel.clone, true)
+ }
+ }
+ }
+}
+
+function getSquareCoords(pixel) {
+ let x, y;
+ for (let i = 0; i < squareCoords.length; i++) {
+ let coord = squareCoords[i];
+ x = pixel.x + coord[0];
+ y = pixel.y + coord[1];
+ }
+ return { x, y }
+}
+
+function getAdjacentCoords(pixel) {
+ let x, y;
+ for (let i = 0; i < adjacentCoords.length; i++) {
+ x = pixel.x + adjacentCoords[i][0];
+ y = pixel.y + adjacentCoords[i][1];
+ }
+ return { x, y }
+}
+
+function getSquareCoordsShuffle(pixel) {
+ shuffleArray(squareCoordsShuffle);
+ let x, y;
+ for (var i = 0; i < squareCoordsShuffle.length; i++) {
+ var coord = squareCoordsShuffle[i];
+ x = pixel.x + coord[0];
+ y = pixel.y + coord[1];
+ }
+ return { x, y }
+}
+
+function getAdjacentCoordsShuffle(pixel) {
+ shuffleArray(adjacentCoordsShuffle)
+ let x, y
+ for (var i = 0; i < adjacentCoordsShuffle.length; i++) {
+ x = pixel.x + adjacentCoordsShuffle[i][0];
+ y = pixel.y + adjacentCoordsShuffle[i][1];
+ }
+ return { x, y }
+}
+
+function getScreenCoords() {
+ let coords = []
+ for (let x = 0; x <= width; x++) {
+ for (let y = 0; y <= height; y++) {
+ coords.push([x, y])
+ }
+ }
+ return coords
+}
+
+globals.replaceElem = "wood"
+elements.replace_all_of_element = {
+ color: ["#35008a", "#000000"],
+ category: "tools",
+ onSelect() {
+ promptInput("What should it change into?", (input) => {
+ if (!input) return;
+ let elem = mostSimilarElement(input)
+ if (elem) {
+ globals.replaceElem = elem
+ }
+ }, "Element Prompt")
+ },
+ tool(pixel) {
+ let elem = pixel.element
+ if (elem === globals.replaceElem) return
+
+ for (let row of pixelMap) {
+ for (let p of row) {
+ if (p?.element === elem) {
+ changePixel(p, globals.replaceElem)
+ }
+ }
+ }
+ }
+}
+
+
diff --git a/mods/datawire.js b/mods/datawire.js
new file mode 100644
index 00000000..dcf88613
--- /dev/null
+++ b/mods/datawire.js
@@ -0,0 +1,238 @@
+/*
+*Version 1.0.0
+*/
+dependOn("orchidslibrary.js", ()=>{
+ elements.data_wire = {
+ desc: "Transfers data.",
+ color: ["#6b1502", "#631402", "#6e1400", "#631200"],
+ properties: {cd: 0, value: null},
+ tick: function(pixel){
+ for(let coords of adjacentCoords){
+ let x = pixel.x+coords[0], y = pixel.y+coords[1];
+ let p2 = getPixel(x,y);
+ if(p2 != null){
+ if(p2.value != null && pixel.cd == 0){
+ pixel.value = p2.value;
+ pixel.cd = 15;
+ };
+ pixel.value = (pixel.cd == 3) ? null : pixel.value;
+ if(elements[p2.element].dataInFunc != undefined && pixel.value != null){
+ elements[p2.element].dataInFunc(p2, pixel.value);
+ }
+ }
+ }
+ pixel.cd -= (pixel.cd == 0) ? 0 : 1;
+ },
+ category: "data",
+ behavior: behaviors.WALL,
+ state: "solid",
+ };
+ elements.data_input = {
+ desc: "Holds a data value that can be outputted to any nearby data wire.",
+ color: ["#e06500", "#f57105", "#f06f05", "#e66c09"],
+ value: null,
+ onSelect: function(){
+ promptInput("Enter data info", (input)=>{elements.data_input.value = input;}, "Data Input", elements.data_input.value);
+ },
+ category: "data",
+ behavior: behaviors.WALL,
+ state: "solid",
+ properties: {
+ value:null,
+ },
+ tick: function(pixel){
+ if(pixel.value == null){
+ pixel.value = elements.data_input.value;
+ }
+ for(let coords of adjacentCoords){
+ let x = pixel.x+coords[0], y = pixel.y+coords[1];
+ let p2 = getPixel(x,y);
+ if(p2 != null && elements[p2.element].dataInFunc != undefined && pixel.value != null){
+ elements[p2.element].dataInFunc(p2, pixel.value);
+ }
+ }
+ }
+ }
+ elements.toggle_data_input = {
+ desc: "Holds a data value that can be outputted to any nearby data wire when toggled on.",
+ color: ["#6e3302", "#783905", "#823c03", "#7d3a02"],
+ value: null,
+ onSelect: function(){
+ promptInput("Enter data info", (input)=>{elements.data_input.value = input;}, "Data Input", elements.data_input.value);
+ },
+ category: "data",
+ behavior: behaviors.WALL,
+ state: "solid",
+ properties: {
+ value:null,
+ val: null,
+ toggle: false,
+ clickCd: 0,
+ },
+ tick: function(pixel){
+ if(pixel.val == null){
+ pixel.val = elements.data_input.value;
+ }
+ pixel.value = (pixel.toggle) ? pixel.val : null;
+ for(let coords of adjacentCoords){
+ let x = pixel.x+coords[0], y = pixel.y+coords[1];
+ let p2 = getPixel(x,y);
+ if(p2 != null && elements[p2.element].dataInFunc != undefined && pixel.value != null){
+ elements[p2.element].dataInFunc(p2, pixel.value);
+ }
+ }
+ pixel.clickCd -= (pixel.clickCd == 0) ? 0 : 1;
+ },
+ onClicked: function(pixel){
+ if(pixel.clickCd == 0){
+ pixel.clickCd = 20;
+ pixel.toggle = !pixel.toggle;
+ if(pixel.toggle){
+ pixel.color = noiseify("#edba00", 8);
+ } else {
+ pixel.color = noiseify("#6e3302", 8);
+ }
+ }
+ }
+ }
+ elements.join = {
+ desc: "Combines multiple data inputs. Click to reset value.",
+ color: ["#046e00", "#067a02", "#097006", "#065904", "#056602"],
+ properties: {val: null, clickCd: 0},
+ dataInFunc: function(pixel, value){
+ if(pixel.val != null && !pixel.val.includes(value)){
+ pixel.val += value;
+ }
+ if(pixel.val == null){
+ pixel.val = value;
+ }
+ },
+ category: "data",
+ behavior: behaviors.WALL,
+ state: "solid",
+ tick: function(pixel){
+ let p2 = getPixel(pixel.x+1, pixel.y);
+ if(p2 != null && p2.element == "data_wire"){
+ p2.value = pixel.val;
+ }
+ pixel.clickCd -= (pixel.clickCd == 0) ? 0 : 1;
+ },
+ onClicked: function(pixel){
+ if(pixel.clickCd == 0){
+ pixel.clickCd = 20;
+ pixel.val = null;
+ }
+ }
+ }
+ elements.data_sensor = {
+ desc: "Scans adjacent pixels for a target property and outputs them, uses \"element\" by default. Click on pixel to change properties.",
+ color: ["#3d3c28", "#4d4b32", "#4a482f", "#403e28"],
+ properties: {
+ value: null,
+ property: "element",
+ clickCd: 0,
+ },
+ tick: function(pixel){
+ for(let coords of adjacentCoords){
+ let x = pixel.x+coords[0], y = pixel.y+coords[1];
+ let p2 = getPixel(x,y);
+ if(p2 != null && !["data_wire"].includes(p2.element)){
+ pixel.value = p2[pixel.property];
+ }
+ };
+ pixel.clickCd -= (pixel.clickCd == 0) ? 0 : 1;
+ },
+ onClicked: function(pixel){
+ let propertyArr = [];
+ for(let coords of adjacentCoords){
+ let x = pixel.x+coords[0], y = pixel.y+coords[1];
+ let p2 = getPixel(x,y);
+ if(p2 != null){
+ for(let property in p2){
+ if(typeof p2[property] != "function" && !propertyArr.includes(property)){
+ propertyArr.push(property);
+ }
+ }
+ }
+ };
+ promptChoose("Choose property this data sensor detects:", propertyArr, (input)=>{pixel.property = input || pixel.property;}, "Property to Detect");
+ },
+ category: "data",
+ behavior: behaviors.WALL,
+ state: "solid",
+ }
+ elements.if = {
+ desc: "Takes 3 inputs, conditon (1 (true) or 0 (false), x-1), ifTrue (output if true, y-1 (pixel above)), and ifFalse (output if false, y+1 (pixel below)).",
+ color: ["#00574b", "#005247", "#02594e", "#025c50"],
+ category: "data",
+ behavior: behaviors.WALL,
+ state: "solid",
+ tick: function(pixel){
+ let conditionPixel = getPixel(pixel.x-1, pixel.y), truePixel = getPixel(pixel.x, pixel.y-1), falsePixel = getPixel(pixel.x, pixel.y+1);
+ let condition = (conditionPixel != null &&conditionPixel.value != undefined) ? parseInt(conditionPixel.value) : false;
+ let trueOut = (truePixel != null && truePixel.value != undefined) ? truePixel.value : 1;
+ let falseOut = (falsePixel != null && falsePixel.value != undefined) ? falsePixel.value : 0;
+ let outPixel = getPixel(pixel.x+1, pixel.y);
+ if(outPixel != null && outPixel.value !== undefined){
+ outPixel.value = (condition) ? trueOut : falseOut;
+ }
+ }
+ }
+ elements.equals = {
+ desc: "Takes 2 inputs, A (y-1 (pixel above)) and B (y+1 (pixel below), returns 1 if they are equal and 0 if they are not.",
+ color: ["#12ccb3", "#15ebce", "#0bd6bb", "#14dec3"],
+ category: "data",
+ behavior: behaviors.WALL,
+ state: "solid",
+ tick: function(pixel){
+ let a = getPixel(pixel.x, pixel.y-1), b = getPixel(pixel.x, pixel.y+1);
+ if(a != null && b != null){
+ let aVal = (a.value != undefined) ? a.value : 1;
+ let bVal = (b.value != undefined) ? b.value : 0;
+ let outPixel = getPixel(pixel.x+1, pixel.y);
+ if(outPixel != null && outPixel.value !== undefined){
+ outPixel.value = (aVal == bVal) ? 1 : 0;
+ }
+ }
+ }
+ }
+ elements.prop_setter = {
+ category: "data",
+ properties: {
+ val: null,
+ },
+ dataInFunc: function(pixel, value){
+ pixel.val = value;
+ },
+ color: ["#deb150", "#ebba52", "#ebba52", "#e3b44d", "#dbab44"],
+ state: "solid",
+ behavior: behaviors.WALL,
+ tick: function(pixel){
+ if(pixel.val != null){
+ let valArr = pixel.val.split(":");
+ let prop = valArr[0], value = valArr[1];
+ for(let coords of adjacentCoords){
+ let x = pixel.x+coords[0], y = pixel.y+coords[1];
+ let p2 = getPixel(x,y);
+ if(p2 != null && p2[prop] != undefined && elements[p2.element].category != "data"){
+ if(prop == "element"){
+ changePixel(p2, value);
+ } else if (prop == "x" || prop == "y"){
+ let x = (prop == "x") ? value : p2.x, y = (prop == "y") ? value : p2.y;
+ tryMove(p2, parseInt(x), parseInt(y), null, true);
+ } else {
+ if(typeof p2[prop] == "number"){
+ p2[prop] = parseInt(value);
+ } else if(typeof p2[prop] == "boolean"){
+ p2[prop] = value.includes("true");
+ } else if(typeof p2[prop] == "string"){
+ p2[prop] = value;
+ };
+ }
+ }
+ }
+ }
+ }
+ };
+
+}, true);
diff --git a/mods/light.js b/mods/light.js
new file mode 100644
index 00000000..3fab039e
--- /dev/null
+++ b/mods/light.js
@@ -0,0 +1,218 @@
+elements.light.insulate = false;
+elements.light.tempLow = -200;
+elements.liquid_light.tempHigh = -200;
+elements.light.tempHigh = 2500;
+elements.light.stateHigh = "photonic_steam";
+elements.laser.stateHigh = "photonic_steam";
+elements.laser.tempHigh = 2500;
+elements.dirty_water.density=1600
+
+if (!elements.zinc.reactions) elements.zinc.reactions = {};
+elements.zinc.reactions["sulfur"] = { elem1:"zinc_sulfide", elem2:null };
+
+
+elements.photonic_steam = {
+ color: ["#fffccc", "#fff9aa"],
+ behavior: [
+ "M2|M1|M2",
+ "M2|XX|M2",
+ "XX|XX|XX"
+ ],
+ category: "energy",
+ state: "gas",
+ density: 0.08,
+ temp: 2500,
+ emit: 4,
+ emitColor: "#fff8aa",
+ tick: function(pixel) {
+
+ if (Math.random() < 0.08) {
+ let x = pixel.x + (Math.floor(Math.random() * 3) - 1);
+ let y = pixel.y + (Math.floor(Math.random() * 3) - 1);
+ if (!outOfBounds(x, y) && isEmpty(x, y, true)) {
+ createPixel("cherenkov_radiation", x, y);
+ }
+ }
+
+ if (Math.random() < 0.01) {
+ deletePixel(pixel.x, pixel.y);
+ return;
+ }
+
+ doHeat(pixel);
+ doBurning(pixel);
+ doDefaults(pixel);
+ }
+};
+
+
+elements.cherenkov_radiation = {
+ color: ["#66ccff", "#99ddff", "#44aaff"],
+ behavior: behaviors.SUPERDFLUID,
+ category: "energy",
+ state: "gas",
+ density: 0.05,
+ temp: 500,
+ emit: 3,
+ emitColor: "#66ccff",
+ tick: function(pixel) {
+ for (let [dx, dy] of [[1,0], [-1,0], [0,1], [0,-1]]) {
+ let x = pixel.x + dx, y = pixel.y + dy;
+ if (outOfBounds(x, y)) continue;
+ let other = pixelMap[x]?.[y];
+ if (!other) continue;
+
+ let def = elements[other.element];
+ if (def?.category === "life") {
+ if (Math.random() < 0.35) changePixel(other, "ash");
+ else other.color = "#88ccff";
+ }
+ }
+ if (Math.random() < 0.25) {
+ changePixel(pixel, "light");
+ pixel.color = "#66ccff"
+ return;
+ }
+
+ doDefaults(pixel);
+ }
+};
+
+
+elements.charged_phosphor = {
+ color: ["#d0ff7f", "#e6ff99", "#f0ffa6"],
+ behavior: behaviors.POWDER,
+ category: "powders",
+ state: "solid",
+ density: 3980,
+ tick: function(pixel) {
+ pixel.charged = true;
+
+ let dirs = [[0,-1],[1,0],[-1,0],[0,1],[1,1],[1,-1],[-1,1],[-1,-1]];
+ let dir = dirs[Math.floor(Math.random() * dirs.length)];
+ let nx = pixel.x + dir[0];
+ let ny = pixel.y + dir[1];
+
+ if (!outOfBounds(nx, ny) && isEmpty(nx, ny)) {
+ createPixel("light", nx, ny);
+ pixel.charged=false;
+ }
+
+ if (pixel.charged==false) {
+ changePixel(pixel, "phosphor");
+ }
+
+ doDefaults(pixel);
+ }
+};
+
+
+elements.phosphor = {
+ color: ["#66ff88", "#88ffaa", "#aaffcc"],
+ behavior: behaviors.POWDER,
+ category: "powders",
+ state: "solid",
+ density: 3980,
+ reactions: {
+ "light": { elem1:"charged_phosphor", elem2:null },
+ "liquid_light": { elem1:"charged_phosphor", elem2:null },
+ "laser": { elem1:"charged_phosphor", elem2:null },
+ "photonic_steam": { elem1:"charged_phosphor", elem2:null },
+
+ },
+};
+
+
+elements.zinc_sulfide= {
+ color: ["#f8f8f8","#ffffff","#eeeeee"],
+ behavior:behaviors.POWDER,
+ category: "powders",
+ state: "solid",
+ density: 3980,
+ reactions: {
+ "copper": { elem1:"phosphor", elem2:null}
+ },
+};
+
+elements.bioluminescent_cell = {
+ behavior: behaviors.SUPPORT,
+ color: ["#81ec75","#5fec87","#3ca365"],
+ category: "life",
+ state: "solid",
+ density: 1000.1,
+ tempHigh: 102,
+ stateHigh: ["steam","steam","steam","sugar"],
+ tempLow: -2,
+ stateLow: ["ice","ice","ice","sugar_ice"],
+ breakInto: ["water","dna","phosphor"],
+ reactions: {
+ "sugar_water": { elem2:["bio_seed","dirty_water"], chance:0.06, temp2:30, elem1:"bioluminescent_cell"},
+ "sugar":{ elem2:["bio_seed","dirty_water"], chance:0.08, temp2:30, elem1:"bioluminescent_cell"},
+ "water":{ elem2:["bio_seed","dirty_water"], chance:0.04, temp2:30, elem1:"bioluminescent_cell"},
+ "salt_water": { elem2:["bio_seed","dirty_water"], chance:0.02, temp2:30, elem1:"bioluminescent_cell"},
+ "oxygen": { elem1:"bioluminescent_cell", elem2:"light" },
+ "infection": { elem1:"infection", chance:0.015 },
+ "blood": { elem1:"blood", chance:0.01 },
+ "antibody": { elem1:"antibody", chance:0.01 },
+ "alcohol": { elem1:[null,"dna"], chance:0.02 },
+ "poison": { elem1:null, chance:0.02 },
+ "plague": { elem1:null, chance:0.02 },
+ "mercury": { elem1:null, chance:0.02 },
+ "chlorine": { elem1:null, chance:0.02 },
+ "cyanide": { elem1:null, chance:0.02 },
+ "soap": { elem1:null, chance:0.015 },
+ "ammonia": { elem2:"nitrogen", chance:0.05 },
+ "oil": { elem2:"methane", chance:0.001 },
+ "milk": { elem2:"yogurt", chance:0.01 },
+ "cream": { elem2:"yogurt", chance:0.01 },
+ "chocolate_milk": { elem2:"yogurt", chance:0.01, color2:"#4c392c" },
+ "fruit_milk": { elem2:"yogurt", chance:0.01, color2:"#977871" },
+ "pilk": { elem2:"yogurt", chance:0.01, color2:"#bba789" },
+ "eggnog": { elem2:"yogurt", chance:0.01, color2:"#ae9a7e" }
+ }
+};
+
+elements.bio_seed = {
+ color: "#55cc77",
+ category: "life",
+ state: "solid",
+ density: 900,
+ hidden:1,
+ behavior: behaviors.POWDER,
+ tick: function(pixel) {
+ if (Math.random() < 0.1) {
+ changePixel(pixel,"bioluminescent_cell");
+ }
+ doDefaults(pixel);
+ },
+};
+
+elements.solar_panel = {
+ behavior:behaviors.WALL,
+ color:["#2b6fb0","#2f73bd","#1f4f86"],
+ tick:function(pixel){
+ var adj = [[1,0],[-1,0],[0,1],[0,-1],[1,1],[-1,-1],[-1,1],[1,-1]];
+ for(var i=0;iexplosion|XX",
+ "M2|M1|M2"
+ ],
+ category: "evilness",
+ state: "solid",
+ reactions: {
+ "water": { elem1: "supernova", elem2: null }
+ },
+ desc: 'Unstable element that creates a massive explosion when it comes into contact with water.'
+};
+
+elements.netrinth = {
+ color: "#0066ff",
+ behavior: behaviors.WALL,
+ category: 'evilness',
+ state: 'solid',
+ desc: 'Highly radioactive element that twists structure of atom particles, making them part of radiation, energy can be extracted from it.',
+ tick: function(pixel) {
+ if (Math.floor(Math.random() * 900) + 1 === 1) {
+ tryCreate('radiation', pixel.x, pixel.y+1)
+ }
+ },
+ reactions: {
+ "proton": { elem1: "radiation", elem2: null},
+ "neutron": { elem1: "radiation", elem2: null},
+ "electric": { elem1: "radiation", elem2: null}
+ },
+ tempHigh: 1000,
+ stateHigh: "liquid_netrinth"
+};
+
+elements.liquid_netrinth = {
+ color: "#0066ff",
+ behavior: [
+ "XX|XX|XX",
+ "M3%15|XX|M3%15",
+ "M2%15|M1|M2%15"
+ ],
+ category: 'states',
+ state: 'liquid',
+ desc: 'ok nub did you expect liquid netrinth be billion times dangerous and more evil? this damages the atom structure of this element, making it less radioactive, harder to extract energy.',
+ tick: function(pixel) {
+ if (Math.floor(Math.random() * 1800) + 1 === 1) {
+ tryCreate('radiation', pixel.x, pixel.y+1)
+ }
+ },
+ reactions: {
+ "proton": { elem1: "radiation", elem2: null},
+ "neutron": { elem1: "radiation", elem2: null},
+ "electric": { elem1: "radiation", elem2: null}
+ },
+ tempLow:500,
+ stateLow: "netrinth",
+ tempHigh: 6000,
+ stateHigh: "gas_netrinth",
+ temp: 1001
+};
+
+elements.gas_netrinth = {
+ color: "#76adff",
+ behavior: behaviors.GAS,
+ category: 'states',
+ state: 'gas',
+ desc: 'the element atom structure is completely destroyed, making it non radioactive, even after solidifying, no longer extractable energy, and giving it brigher color, also now completely safe.',
+ tempLow: 6000,
+ stateLow: "safe_liquid_nentrinth",
+ temp: 6001
+}
+
+elements.safe_liquid_netrinth = {
+ color: "#76adff",
+ behavior: [
+ "XX|XX|XX",
+ "M3%15|XX|M3%15",
+ "M2%15|M1|M2%15"
+ ],
+ category: 'states',
+ state: 'liquid',
+ desc: 'what do you expect this to be',
+ tempLow:500,
+ stateLow: "safe_netrinth",
+ tempHigh: 6000,
+ stateHigh: "gas_netrinth",
+ temp: 1001
+};
+
+elements.safe_netrinth = {
+ color: "#76adff",
+ behavior: behaviors.WALL,
+ category: 'evilness',
+ state: 'solid',
+ desc: ':/',
+ tempHigh: 1000,
+ stateHigh: "safe_liquid_netrinth"
+};
+
+elements.mercurium = {
+ color: ["#740000","#2e2e2e","#1b0047"],
+ behavior: behaviors.SUPPORT,
+ category: 'evilness',
+ state: 'solid',
+ desc: 'Very rare and sticky element, DO NOT MISTAKE WITH MERCURY, will explode on high temperatures',
+ tick: function(pixel) {
+ if (Math.floor(Math.random() * 1000) + 1 === 1) {
+ tryCreate('electric', pixel.x, pixel.y-1)
+ }
+ },
+ tempHigh: 4000,
+ stateHigh: "supernova"
+};
+
+elements.magnetite = {
+ color: ["#3a3a3a", "#535353", "#a200d3"],
+ behavior: behaviors.WALL,
+ category: 'evilness',
+ state: 'solid',
+ desc: 'A very dense and heavy magnetic element, it can attract and repel other metals.',
+ reactions: {
+ "iron": { elem1: "magnetite", elem2: null },
+ "steel": { elem1: "magnetite", elem2: null },
+ "gold": { elem1: "magnetite", elem2: null },
+ "copper": { elem1: "magnetite", elem2: null },
+ "aluminum": { elem1: "magnetite", elem2: null },
+ "lead": { elem1: "magnetite", elem2: null },
+ "tungsten": { elem1: "magnetite", elem2: null },
+ },
+ tick: function(pixel) {
+ if (Math.floor(Math.random() * 1000) + 1 === 1) {
+ tryCreate('electric', pixel.x, pixel.y-1)
+ }
+ },
+ tempHigh: 3000,
+ stateHigh: "molten_magnetite",
+ breakInto: "magnetite_powder"
+}
+
+elements.molten_magnetite = {
+ color: ["#e4e4e4", "#535353", "#e180ff"],
+ behavior: behaviors.LIQUID,
+ category: 'states',
+ state: 'liquid',
+ desc: 'magnetite but liquid, and also explodes in electricity during high temperatures',
+ tempLow: 3000,
+ stateLow: "magnetite",
+ temp: 3000,
+ tempHigh: 6000,
+ stateHigh: 'lightning',
+}
+
+elements.netrinth_receiver = {
+ color: "#00ffcc",
+ behavior: behaviors.WALL,
+ category: 'machines',
+ state: 'solid',
+ desc: 'A device that absorbs radiation from netrinth and converts it into electricity, hoewer destroys the netrinth in the process.',
+ conduct: 1,
+ tick: function(pixel) {
+ // Check adjacent pixels for netrinth or liquid_netrinth
+ let dirs = [
+ [0, -1], [1, 0], [0, 1], [-1, 0]
+ ];
+ for (let d = 0; d < dirs.length; d++) {
+ let nx = pixel.x + dirs[d][0];
+ let ny = pixel.y + dirs[d][1];
+ if (isEmpty(nx, ny)) continue;
+ let np = pixelMap[nx][ny];
+ if (!np) continue;
+ if (np.element === "netrinth" || np.element === "liquid_netrinth") {
+ // Remove netrinth and create electric
+ changePixel(np, "electric");
+ break;
+ }
+ }
+ }
+};
+
+elements.magnetite_powder = {
+ color: ["#3a3a3a", "#535353", "#a200d3"],
+ behavior: [
+ "XX|XX|XX",
+ "XX|XX|XX",
+ "M2|M1|M2"
+ ],
+ category: 'evilness',
+ state: 'solid',
+ desc: 'tottaly not the same magnetite as the previous one',
+ reactions: {
+ "iron": { elem1: "magnetite_powder", elem2: null },
+ "steel": { elem1: "magnetite_powder", elem2: null },
+ "gold": { elem1: "magnetite_powder", elem2: null },
+ "copper": { elem1: "magnetite_powder", elem2: null },
+ "aluminum": { elem1: "magnetite_powder", elem2: null },
+ "lead": { elem1: "magnetite_powder", elem2: null },
+ "tungsten": { elem1: "magnetite_powder", elem2: null },
+ },
+ tempHigh: 3000,
+ stateHigh: "molten_magnetite",
+ tick: function(pixel) {
+ if (Math.floor(Math.random() * 1000) + 1 === 1) {
+ tryCreate('electric', pixel.x, pixel.y-1)
+ }
+ },
+}
+
+elements.side_gravity_powder = {
+ color: ["#ff0000", "#ff8800", "#fffb00", "#00ff00", "#00ffff", "#0000ff", "#ff00ff"],
+ fireColor: ["#ff0000", "#ff8800", "#fffb00", "#00ff00", "#00ffff", "#0000ff", "#ff00ff"],
+ behavior: [
+ "M2|XX|XX",
+ "M1|XX|XX",
+ "M2|XX|XX"
+ ],
+ desc: "Powder that falls sideways, isnt that cool?, NO PLEASE DONT THROW TOMATOES AT ME I DONT SUPPORT LGBTQ+",
+ category: "evilness",
+ state: "solid",
+ burn: 20,
+}
+
+elements.side_gravity_powder_but_not_directly_sideways = {
+ color: ["#ff0000", "#ff8800", "#fffb00", "#00ff00", "#00ffff", "#0000ff", "#ff00ff"],
+ fireColor: ["#ff0000", "#ff8800", "#fffb00", "#00ff00", "#00ffff", "#0000ff", "#ff00ff"],
+ behavior: [
+ "XX|XX|XX",
+ "M2|XX|XX",
+ "M1|M2|XX"
+ ],
+ desc: "Powder that falls sideways, isnt that cool?, NO PLEASE DONT THROW TOMATOES AT ME I DONT SUPPORT LGBTQ+",
+ category: "evilness",
+ state: "solid",
+ burn: 20,
+}
+
+elements.explosive_gas = {
+ color: "#ff0000",
+ behavior: behaviors.GAS,
+ category: "evilness",
+ state: "gas",
+ reactions: {
+ "fire": { elem1: "explosion", elem2: null },
+ "plasma": { elem1: "supernova", elem2: null},
+ "laser": { elem1: "explosion", elem2: null },
+ "flash": { elem1: "explosion", elem2: null },
+ },
+ desc: "boom",
+ tempHigh: 21,
+ stateHigh: "explosion",
+ tempLow: 19,
+ stateLow: "explosion",
+}
+
+elements.neutronium = {
+ color: ["#00ffdd", "#00098b", "rgba(71, 71, 71, 1)"],
+ behavior: behaviors.POWDER,
+ category: 'evilness',
+ glow: true,
+ state: 'solid',
+ desc: 'A very dense and heavy element, made entirely out of neutrons, it is incredibly rare and valuable, but also very unstable.',
+ tempHigh: 1000,
+ stateHigh: "neutron",
+ density: 10000,
+ tick: function(pixel) {
+ if (Math.floor(Math.random() * 600) + 1 === 1) {
+ tryCreate('neutron', pixel.x, pixel.y-1)
+ };
+ if (Math.floor(Math.random() * 800) + 1 === 1) {
+ tryCreate('electric', pixel.x, pixel.y-1)
+ };
+ },
+ unbreakable: true,
+ reactions: {
+ "proton": { elem1: "neutron", elem2: null},
+ }
+}
+
diff --git a/mods/morechemistry.js b/mods/morechemistry.js
index 25221c1b..eb628940 100644
--- a/mods/morechemistry.js
+++ b/mods/morechemistry.js
@@ -1,960 +1,1565 @@
/*
-Version 2.1.0
+*Version 2.2.0
*/
-function pixelToggle(pixel, multi = {r:1,g:1,b:1}){
- if(pixel.toggle != undefined){
- pixel.toggle = !pixel.toggle;
- let rgb;
- if(Array.isArray(elements[pixel.element].color)){
- let elemColor = elements[pixel.element].color[Math.round(Math.random()*elements[pixel.element].color.length)];
- rgb = hexToRGB(elemColor) || getRGB(elemColor);
- } else {
- let elemColor = elements[pixel.element].color;
- rgb = hexToRGB(elemColor) || getRGB(elemColor);
- }
- let num = 5 - Math.round(Math.random()*10);
- if(pixel.toggle){
- for(let key in rgb){
- rgb[key] += (100*multi[key]);
- rgb[key] = Math.round(Math.max(Math.min(rgb[key], 255), 0));
- }
- pixel.color = `rgb(${rgb.r+num},${rgb.g+num},${rgb.b+num})`;
- }
- else {
- pixel.color = `rgb(${rgb.r+num},${rgb.g+num},${rgb.b+num})`;
- }
- }
-}
-function getRGB(rgb){
- let rgb2 = rgb.replace(")", "").replace("rgb(", "").replace(/,/g, "r").split("r")
- return { r: parseInt(rgb2[0]), g: parseInt(rgb2[1]), b: parseInt(rgb2[2]) };
-}
-elements.cloner.keyInput = "str:clone", elements.ecloner.keyInput = "str:clone", elements.slow_cloner.keyInput = "str:clone", elements.floating_cloner.keyInput = "str:clone";
-let xDown = false;
-elements.copper_sulfate = {
- behavior: behaviors.POWDER,
- color: ["#4391fd","#004cfe"],
- reactions: {
- ant: {"elem2": "dead_bug"},
- fly: {"elem2": "dead_bug"},
- firefly: {"elem2": "dead_bug"},
- stink_bug: {"elem2": "dead_bug"},
- bee: {"elem2": "dead_bug"},
- termite: {"elem2": "dead_bug"},
- spider: {"elem2": "dead_bug"},
- plant: {"elem2": "dead_plant"},
- grass: {"elem2": "dead_plant"},
- algae: {"elem2": null},
- kelp: {"elem2": "water"},
- coral: {"elem2": "water"},
- mushroom_cap: {"elem2": null},
- mushroom_stalk: {"elem2": null},
- mushroom_gill: {"elem2": null},
- mushroom_spore: {"elem2": null},
- zinc: {"stain2": "#2A1210"},
- fire: {"elem1": null,"elem2": "poison_gas","chance": 0.1},
- sugar: {"elem1": "oxidized_copper","elem2": null,"color1": ["#CB3D3D","#A6292B","#6E1B1B"]}
- },
- tempHigh: 110,
- fireColor: [
- "#91d106",
- "#feff97",
- "#248e01"
- ],
- state: "solid",
- density: 3600,
- hidden: true,
- category: "powders",
- id: 509,
- movable: true,
- properties: {
- anhydrous: false
- },
- tick: function(pixel){
- if(pixelTicks-pixel.start == 2 && xDown){
- pixel.anhydrous = true;
- let rgb = {r: 235, g: 247, b: 250};
- let num = 6 - (Math.round(Math.random()*12));
- for(let key in rgb){
- rgb[key] += num;
- }
- pixel.color = `rgb(${rgb.r},${rgb.g},${rgb.b})`;
- }
- let multi = (pixel.temp-70)/100;
- multi = (multi < 0) ? 0 : ((multi > 1) ? 1 : multi);
- if(Math.random() < 0.05*multi){
- pixel.anhydrous = true;
- let rgb = {r: 235, g: 247, b: 250};
- let num = 6 - (Math.round(Math.random()*12));
- for(let key in rgb){
- rgb[key] += num;
- }
- pixel.color = `rgb(${rgb.r},${rgb.g},${rgb.b})`;
- }
- if(pixel.anhydrous){
- let neighbors = [];
- 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: 67, g: 145, b: 253} : {r: 0, g: 76, b: 254};
- let num = 6 - (Math.round(Math.random()*12));
- for(let key in rgb){
- rgb[key] += num;
- }
- pixel.color = `rgb(${rgb.r},${rgb.g},${rgb.b})`;
-
- } else if (neighbors.includes("steam") || neighbors.includes("water") || neighbors.includes("salt_water") || neighbors.includes("sugar_water") || neighbors.includes("dirty_water") || neighbors.includes("seltzer") || neighbors.includes("pool_water") || neighbors.includes("slush")){
- pixel.anhydrous = false;
- let rgb = (Math.random() > 0.5) ? {r: 67, g: 145, b: 253} : {r: 0, g: 76, b: 254};
+dependOn("orchidslibrary.js", ()=>{
+ elements.cloner.keyInput = "str:clone", elements.ecloner.keyInput = "str:clone", elements.slow_cloner.keyInput = "str:clone", elements.floating_cloner.keyInput = "str:clone";
+ let xDown = false;
+ elements.copper_sulfate = {
+ behavior: behaviors.POWDER,
+ color: ["#4391fd","#004cfe"],
+ reactions: {
+ ant: {"elem2": "dead_bug"},
+ fly: {"elem2": "dead_bug"},
+ firefly: {"elem2": "dead_bug"},
+ stink_bug: {"elem2": "dead_bug"},
+ bee: {"elem2": "dead_bug"},
+ termite: {"elem2": "dead_bug"},
+ spider: {"elem2": "dead_bug"},
+ plant: {"elem2": "dead_plant"},
+ grass: {"elem2": "dead_plant"},
+ algae: {"elem2": null},
+ kelp: {"elem2": "water"},
+ coral: {"elem2": "water"},
+ mushroom_cap: {"elem2": null},
+ mushroom_stalk: {"elem2": null},
+ mushroom_gill: {"elem2": null},
+ mushroom_spore: {"elem2": null},
+ zinc: {"stain2": "#2A1210"},
+ fire: {"elem1": null,"elem2": "poison_gas","chance": 0.1},
+ sugar: {"elem1": "oxidized_copper","elem2": null,"color1": ["#CB3D3D","#A6292B","#6E1B1B"]},
+ magnesium: {elem1: "copper", elem2: "epsom_salt"},
+ wood: {stain2: "#043023"},
+ },
+ tempHigh: 110,
+ fireColor: [
+ "#91d106",
+ "#feff97",
+ "#248e01"
+ ],
+ state: "solid",
+ density: 3600,
+ hidden: true,
+ category: "powders",
+ id: 509,
+ movable: true,
+ properties: {
+ anhydrous: false
+ },
+ tick: function(pixel){
+ if(pixelTicks-pixel.start == 2 && xDown){
+ pixel.anhydrous = true;
+ let rgb = {r: 235, g: 247, b: 250};
let num = 6 - (Math.round(Math.random()*12));
for(let key in rgb){
rgb[key] += num;
}
pixel.color = `rgb(${rgb.r},${rgb.g},${rgb.b})`;
}
- }
- }
-}
-elements.water.ignore = ["copper_sulphate"], elements.steam.ignore = ["copper_sulphate"], elements.pool_water.ignore = ["copper_sulphate", 'pool_ice'], elements.salt_water.ignore = ["copper_sulphate", 'salt_ice'], elements.sugar_water.ignore = ["copper_sulphate", 'sugar_ice'], elements.seltzer.ignore = ["copper_sulphate", 'seltzer_ice'],
-document.addEventListener("keydown", (e)=>{xDown = (e.key.toLowerCase() == "x") ? true : xDown;});
-document.addEventListener("keyup", (e)=>{xDown = (e.key.toLowerCase() == "x") ? false : xDown;});
-
-elements.toggle_cloner = {
- category: "machines",
- active: "#fbff03",
- inactive: "#333300",
- color: "#333300",
- name: "ToggleableCloner",
- keyInput: "chance",
- insulate: 1,
- properties: {
- clone: null,
- toggle: false,
- chance: 0.0166666667,
- clickCd: 0,
- },
- hardness: 1,
- ignore: ["drag","unknown", "cloner", "toggle_cloner", "floating_cloner", "clone_powder", "slow_cloner", "ecloner", "destroyable_cloner", "destroyable_clone_powder", "ewall", "wall"],
- onClicked: function(pixel,element){
-
- if(pixel.clone == null && pixel.clickCd == 0 && dragStart == null){
- pixel.clone = (elements.toggle_cloner.ignore.includes(element)) ? pixel.clone : element;
- } else if (pixel.clickCd == 0 && !shiftDown) {
- pixel.toggle = !pixel.toggle;
- if(pixel.toggle){
- let rgb = hexToRGB(elements.toggle_cloner.active);
- let num = 5 - (Math.random()*10);
+ let multi = (pixel.temp-70)/100;
+ multi = (multi < 0) ? 0 : ((multi > 1) ? 1 : multi);
+ if(Math.random() < 0.05*multi){
+ pixel.anhydrous = true;
+ let rgb = {r: 235, g: 247, b: 250};
+ let num = 6 - (Math.round(Math.random()*12));
for(let key in rgb){
rgb[key] += num;
- rgb[key] = Math.round(Math.max(Math.min(rgb[key], 255), 0));
- }
- pixel.color = `rgb(${rgb.r},${rgb.g},${rgb.b})`;
- } else {
- let rgb = hexToRGB(elements.toggle_cloner.inactive);
- let num = 5 - (Math.random()*10);
- for(let key in rgb){
- rgb[key] += num;
- rgb[key] = Math.round(Math.max(Math.min(rgb[key], 255), 0));
}
pixel.color = `rgb(${rgb.r},${rgb.g},${rgb.b})`;
}
+ if(pixel.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: 67, g: 145, b: 253} : {r: 0, g: 76, b: 254};
+ let num = 6 - (Math.round(Math.random()*12));
+ for(let key in rgb){
+ rgb[key] += num;
+ }
+ pixel.color = `rgb(${rgb.r},${rgb.g},${rgb.b})`;
+
+ } else if (neighbors.includes("steam") || neighbors.includes("water") || neighbors.includes("salt_water") || neighbors.includes("sugar_water") || neighbors.includes("dirty_water") || neighbors.includes("seltzer") || neighbors.includes("pool_water") || neighbors.includes("slush")){
+ pixel.anhydrous = false;
+ let rgb = (Math.random() > 0.5) ? {r: 67, g: 145, b: 253} : {r: 0, g: 76, b: 254};
+ let num = 6 - (Math.round(Math.random()*12));
+ for(let key in rgb){
+ rgb[key] += num;
+ }
+ pixel.color = `rgb(${rgb.r},${rgb.g},${rgb.b})`;
+ }
+ }
}
- if(shiftDown && !elements.toggle_cloner.ignore.includes(element)){
- pixel.clone = element;
- }
-
- if(pixel.clickCd == 0 && dragStart == null){
- pixel.clickCd = 20;
- };
- },
- onSelect: function(){
- logMessage("Place cloner, select element to clone, click on the pixel to set the clone element, then click on it to toggle on or off. Hold shift when clicking to change the element to the selected element.");
- },
- tick: function(pixel){
- if(pixel.clickCd > 0){pixel.clickCd--;}
- if(![null, undefined].includes(pixel.clone) && pixel.toggle == true && Math.random() < pixel.chance){
+ }
+ elements.water.ignore = ["copper_sulphate"], elements.steam.ignore = ["copper_sulphate"], elements.pool_water.ignore = ["copper_sulphate", 'pool_ice'], elements.salt_water.ignore = ["copper_sulphate", 'salt_ice'], elements.sugar_water.ignore = ["copper_sulphate", 'sugar_ice'], elements.seltzer.ignore = ["copper_sulphate", 'seltzer_ice'],
+ document.addEventListener("keydown", (e)=>{xDown = (e.key.toLowerCase() == "x") ? true : xDown;});
+ document.addEventListener("keyup", (e)=>{xDown = (e.key.toLowerCase() == "x") ? false : xDown;});
+
+ elements.toggle_cloner = {
+ category: "machines",
+ active: "#fbff03",
+ inactive: "#333300",
+ color: "#333300",
+ name: "ToggleableCloner",
+ keyInput: "chance",
+ insulate: 1,
+ properties: {
+ clone: null,
+ toggle: false,
+ chance: 0.0166666667,
+ clickCd: 0,
+ },
+ hardness: 1,
+ ignore: ["drag","unknown", "cloner", "toggle_cloner", "floating_cloner", "clone_powder", "slow_cloner", "ecloner", "destroyable_cloner", "destroyable_clone_powder", "ewall", "wall"],
+ onClicked: function(pixel,element){
+
+ if(pixel.clone == null && pixel.clickCd == 0 && dragStart == null){
+ pixel.clone = (elements.toggle_cloner.ignore.includes(element)) ? pixel.clone : element;
+ } else if (pixel.clickCd == 0 && !shiftDown) {
+ pixel.toggle = !pixel.toggle;
+ if(pixel.toggle){
+ let rgb = hexToRGB(elements.toggle_cloner.active);
+ let num = 5 - (Math.random()*10);
+ for(let key in rgb){
+ rgb[key] += num;
+ rgb[key] = Math.round(Math.max(Math.min(rgb[key], 255), 0));
+ }
+ pixel.color = `rgb(${rgb.r},${rgb.g},${rgb.b})`;
+ } else {
+ let rgb = hexToRGB(elements.toggle_cloner.inactive);
+ let num = 5 - (Math.random()*10);
+ for(let key in rgb){
+ rgb[key] += num;
+ rgb[key] = Math.round(Math.max(Math.min(rgb[key], 255), 0));
+ }
+ pixel.color = `rgb(${rgb.r},${rgb.g},${rgb.b})`;
+ }
+ }
+ if(shiftDown && !elements.toggle_cloner.ignore.includes(element)){
+ pixel.clone = element;
+ }
+
+ if(pixel.clickCd == 0 && dragStart == null){
+ pixel.clickCd = 20;
+ };
+ },
+ onSelect: function(){
+ logMessage("Place cloner, select element to clone, click on the pixel to set the clone element, then click on it to toggle on or off. Hold shift when clicking to change the element to the selected element.");
+ },
+ tick: function(pixel){
+ if(pixel.clickCd > 0){pixel.clickCd--;}
+ if(![null, undefined].includes(pixel.clone) && pixel.toggle == true && Math.random() < pixel.chance){
+ for(let coords of adjacentCoords){
+ let x = pixel.x+coords[0], y = pixel.y+coords[1];
+ if(isEmpty(x,y) && !outOfBounds(x,y)){
+ createPixel(pixel.clone, x, y);
+ pixelMap[x][y].temp = pixel.temp;
+ }
+ }
+ }
for(let coords of adjacentCoords){
let x = pixel.x+coords[0], y = pixel.y+coords[1];
- if(isEmpty(x,y) && !outOfBounds(x,y)){
- createPixel(pixel.clone, x, y);
+ let p2 = getPixel(x,y);
+ if(p2 != null && p2.element == pixel.element && (p2.clone == null && pixel.clone != null)){
+ p2.clone = pixel.clone;
+ }
+ }
+ },
+ dataInFunc: function(pixel, value){
+ if(value.includes(":")){
+ let valueArr = value.split(":");
+ if(Array.isArray(pixel[valueArr[0]]) && !pixel[valueArr[0]].includes(valueArr[1])){
+ pixel[valueArr[0]].push(valueArr[1]);
+ } else {
+ pixel[valueArr[0]] = (Number.isInteger(pixel[valueArr[0]])) ? parseInt(valueArr[1]) : valueArr[1];
+ }
+ }
+ }
+ };
+
+ elements.multi_toggle_cloner = {
+ category: "machines",
+ color: "#283300",
+ keyInput: "chance",
+ ignore: ["unknown", "cloner", "toggle_cloner", "floating_cloner", "clone_powder", "slow_cloner", "ecloner", "destroyable_cloner", "destroyable_clone_powder", "ewall", "wall"],
+ properties: {
+ cloneElems: [],
+ toggle: false,
+ clickCd: 0,
+ chance: 0.45,
+ },
+ hardness: 1,
+ insulate: 1,
+ onClicked: function(pixel, element){
+ if(pixel.clickCd == 0 && !shiftDown && dragStart == null){
+ pixelToggle(pixel, {r:1.5,g:1.5,b:0});
+ pixel.clickCd = 20;
+ }
+ if(shiftDown && !elements.multi_toggle_cloner.ignore.includes(element)){
+ if(pixel.cloneElems.includes(element)){
+ pixel.cloneElems.splice(pixel.cloneElems.indexOf(element), 1);
+ } else {
+ pixel.cloneElems.push(element);
+ }
+ }
+ },
+ tick: function(pixel){
+ for(let coords of adjacentCoords){
+ let x = pixel.x+coords[0], y = pixel.y+coords[1];
+ if(isEmpty(x,y) && !outOfBounds(x,y) && Math.random() < pixel.chance && pixel.toggle && JSON.stringify(pixel.cloneElems) != "[]"){
+ elem = pixel.cloneElems[Math.round(Math.random()*pixel.cloneElems.length)];
+ createPixel(elem, x, y);
pixelMap[x][y].temp = pixel.temp;
}
}
- }
- for(let coords of adjacentCoords){
- let x = pixel.x+coords[0], y = pixel.y+coords[1];
- let p2 = getPixel(x,y);
- if(p2 != null && p2.element == pixel.element && (p2.clone == null && pixel.clone != null)){
- p2.clone = pixel.clone;
- }
- }
- }
-};
-
-elements.multi_toggle_cloner = {
- category: "machines",
- color: "#283300",
- keyInput: "chance",
- ignore: ["unknown", "cloner", "toggle_cloner", "floating_cloner", "clone_powder", "slow_cloner", "ecloner", "destroyable_cloner", "destroyable_clone_powder", "ewall", "wall"],
- properties: {
- cloneElems: [],
- toggle: false,
- clickCd: 0,
- chance: 0.45,
- },
- hardness: 1,
- insulate: 1,
- onClicked: function(pixel, element){
- if(pixel.clickCd == 0 && !shiftDown && dragStart == null){
- pixelToggle(pixel, {r:1.5,g:1.5,b:0});
- pixel.clickCd = 20;
- }
- if(shiftDown && !elements.multi_toggle_cloner.ignore.includes(element)){
- if(pixel.cloneElems.includes(element)){
- pixel.cloneElems.splice(pixel.cloneElems.indexOf(element), 1);
- } else {
- pixel.cloneElems.push(element);
- }
- }
- },
- tick: function(pixel){
- for(let coords of adjacentCoords){
- let x = pixel.x+coords[0], y = pixel.y+coords[1];
- if(isEmpty(x,y) && !outOfBounds(x,y) && Math.random() < pixel.chance && pixel.toggle && JSON.stringify(pixel.cloneElems) != "[]"){
- elem = pixel.cloneElems[Math.round(Math.random()*pixel.cloneElems.length)];
- createPixel(elem, x, y);
- pixelMap[x][y].temp = pixel.temp;
- }
- }
- pixel.clickCd -= (pixel.clickCd == 0) ? 0 : 1;
- },
- onSelect: function(){
- logMessage("Place cloner, then add elements to the clone list by selecting the element and hold down shift while clicking in it, then click on it to toggle on or off. Shift clicking with an element already found in the list will remove it.");
- }
-}
-
-elements.toggle = {
- category: "machines",
- active: "#b8b8b8",
- inactive: "#2b2b2b",
- color: "#2b2b2b",
- properties: {
- toggle: false,
- clickCd: 0,
- },
- hardness: 1,
- onClicked: function(pixel){
- if(pixel.clickCd == 0 && dragStart == null){
- pixel.toggle = !pixel.toggle;
- pixel.clickCd = 20;
- if(pixel.toggle){
- let rgb = hexToRGB(elements.toggle.active);
- let num = 5 - (Math.random()*10);
- for(let key in rgb){
- rgb[key] += num;
- rgb[key] = Math.round(Math.max(Math.min(rgb[key], 255), 0));
- }
- pixel.color = `rgb(${rgb.r},${rgb.g},${rgb.b})`;
- } else {
- let rgb = hexToRGB(elements.toggle.inactive);
- let num = 5 - (Math.random()*10);
- for(let key in rgb){
- rgb[key] += num;
- rgb[key] = Math.round(Math.max(Math.min(rgb[key], 255), 0));
- }
- pixel.color = `rgb(${rgb.r},${rgb.g},${rgb.b})`;
- }
- };
- },
- tick: function(pixel){
- if(pixel.clickCd != 0){pixel.clickCd--;}
- for(let coords of adjacentCoords){
- let x = pixel.x+coords[0], y = pixel.y+coords[1];
- let p2 = getPixel(x,y);
- if(p2 != null && elements[p2.element].conduct == 1 && pixel.toggle){
- p2.charge = 1;
- }
- }
- }
-}
-
-elements.e_temper = {
- category: "machines",
- color: "#ffb300",
- conduct: 1,
- targetTemp: 25,
- hardness: 1,
- onSelect: function(){
- promptInput("Enter the target temperature:", (In)=>{
- this.targetTemp = parseInt(In) || this.targetTemp;
- }, "Temperature Selector", this.targetTemp);
- },
- properties: {
- targetTemp: null
- },
- keyInput: "targetTemp",
- tick: function(pixel){
- if(pixel.targetTemp == null){
- pixel.targetTemp = elements.e_temper.targetTemp;
- }
-
- doElectricity(pixel, 1);
- for(let coords of adjacentCoords){
- let x = pixel.x+coords[0], y = pixel.y+coords[1];
- let p2 = getPixel(x,y);
- if(p2 != null && pixel.charge > 0){
- let difference = pixel.targetTemp-p2.temp;
- p2.temp += difference/4;
- }
- }
- }
-}
-
-elements.toggle_temper = {
- active: "#ff7b00",
- inactive: "#261200",
- color: "#261200",
- category: "machines",
- targetTemp: 25,
- keyInput: "targetTemp",
- hardness: 1,
- properties: {
- toggle: false,
- clickCd: 0,
- targetTemp: null,
- },
- onClicked: function(pixel){
- if(pixel.clickCd == 0 && dragStart == null){
- pixel.toggle = !pixel.toggle;
- pixel.clickCd = 20;
- if(pixel.toggle){
- let rgb = hexToRGB(elements.toggle_temper.active);
- let num = 5 - (Math.random()*10);
- for(let key in rgb){
- rgb[key] += num;
- rgb[key] = Math.round(Math.max(Math.min(rgb[key], 255), 0));
- }
- pixel.color = `rgb(${rgb.r},${rgb.g},${rgb.b})`;
- } else {
- let rgb = hexToRGB(elements.toggle_temper.inactive);
- let num = 5 - (Math.random()*10);
- for(let key in rgb){
- rgb[key] += num;
- rgb[key] = Math.round(Math.max(Math.min(rgb[key], 255), 0));
- }
- pixel.color = `rgb(${rgb.r},${rgb.g},${rgb.b})`;
- }
- };
- },
- onSelect: function(){
- promptInput("Enter the target temperature:", (In)=>{
- this.targetTemp = parseInt(In) || this.targetTemp;
- }, "Temperature Selector", this.targetTemp);
- },
- tick: function(pixel){
- if(pixel.targetTemp == null){
- pixel.targetTemp = this.targetTemp;
- }
- for(let coords of adjacentCoords){
- let x = pixel.x+coords[0], y = pixel.y+coords[1];
- let p2 = getPixel(x,y);
- if(p2 != null && pixel.toggle){
- let difference = pixel.targetTemp-p2.temp;
- p2.temp += difference/4;
- }
- }
- if(pixel.clickCd > 0){pixel.clickCd--;};
- },
-}
-
-elements.multitool = {
- category: "tools",
- input: 0,
- onSelect: function(){
- promptInput("Multitool for morechemistry.js, changes key values for different elements added in morechemistry.js, chance for toggleable cloner, targetTemp for toggleable temper, clone for other cloners, and channel for portals.", (In)=>{
- this.input = In;
- }, "Multitool Input", this.input);
- },
- tool: function(pixel){
- if(elements[pixel.element].keyInput != undefined){
- let type = (elements[pixel.element].keyInput.startsWith("int:")) ? "int" : (elements[pixel.element].keyInput.startsWith("str:")) ? "string" : "int";
- let In = elements[pixel.element].keyInput.slice(elements[pixel.element].keyInput.indexOf(":")+1, elements[pixel.element].keyInput.length);
- pixel[In] = (type == "int") ? parseFloat(this.input) : this.input;
- }
- },
- canPlace: false,
-}
-
-class rangeTool {
- constructor(color, func, properties = false, onSelect = false, onClicked = false){
- this.category = "machines";
- this.properties = (properties == false) ? { range: null } : properties;
- this.color = color;
- this.range = 0;
- this.onSelect = (onSelect == false) ? ()=>{promptInput("Enter the range for this tool: ", (range)=>{this.range = parseInt(range);}, "Tool Range", this.range)} : onSelect;
- this.onClicked = (onClicked == false) ? undefined : onClicked;
- this.func = func;
- }
- tick = function(pixel){
- if(pixel.range == null){
- pixel.range = elements[pixel.element].range;
- } else {
- let pixelRange = mouseRange(pixel.x, pixel.y, pixel.range);
- for(let coords of pixelRange){
- let p2 = getPixel(coords[0], coords[1]);
- if(p2 != null){
- elements[pixel.element].func(p2);
- }
- }
- }
- }
-}
-
-elements.button = {
- category: "machines",
- color: "#c7c7c7",
- hardness: 1,
- onClicked: function(pixel){
- for(let coords of adjacentCoords){
- let x = pixel.x+coords[0], y = pixel.y+coords[1];
- let p = getPixel(x,y);
- if(p != null && elements[p.element].conduct){
- p.charge = 1;
- }
- }
- }
-}
-
-elements.toggle_mixer = new rangeTool("#212420", (pixel)=>{
- let range = mouseRange(pixel.x, pixel.y, pixel.range);
- let pixels = [];
- for(let coords of range){
- let p2 = getPixel(coords[0], coords[1]);
- if(p2 != null && pixel.toggle){
- pixels.push(p2);
- }
- }
- for(let p of pixels){
- if(Math.random() < pixel.chance){
- let p2 = pixels[Math.round(Math.random()*pixels.length)];
- if(p != undefined && p2 != undefined && elements[p.element].movable && elements[p2.element].movable){
- swapPixels(p, p2);
- if(elements[p.element].onMix != undefined){
- elements[p.element].onMix(p);
- }
- if(elements[p2.element].onMix != undefined){
- elements[p2.element].onMix(p2);
- }
- }
- }
- }
- if(pixel.clickCd > 0){pixel.clickCd--;}
-}, {range: null, toggle: false, clickCd: 0, chance: 0.35}, false, (pixel)=>{
- if(pixel.clickCd == 0 && dragStart == null){
- pixel.toggle = !pixel.toggle;
- pixel.clickCd = 20;
- if(pixel.toggle){
- let rgb = hexToRGB(elements.toggle_mixer.active);
- let num = 5 - (Math.random()*10);
- for(let key in rgb){
- rgb[key] += num;
- rgb[key] = Math.round(Math.max(Math.min(rgb[key], 255), 0));
- }
- pixel.color = `rgb(${rgb.r},${rgb.g},${rgb.b})`;
- } else {
- let rgb = hexToRGB(elements.toggle_mixer.inactive);
- let num = 5 - (Math.random()*10);
- for(let key in rgb){
- rgb[key] += num;
- rgb[key] = Math.round(Math.max(Math.min(rgb[key], 255), 0));
- }
- pixel.color = `rgb(${rgb.r},${rgb.g},${rgb.b})`;
- }
- };
-});
-elements.toggle_mixer.inactive = "#212420", elements.toggle_mixer.active = "#93a390", elements.toggle_mixer.movable = false, elements.toggle_mixer.keyInput = "chance";
-elements.toggle_mixer.hardness = 1;
-
-elements.toggle_smasher = new rangeTool("#2e2726", (pixel)=>{
- let range = mouseRange(pixel.x, pixel.y, pixel.range);
- for(let coords of range){
- let p2 = getPixel(coords[0], coords[1]);
- if(p2 != null && pixel.toggle && Math.random() < pixel.chance && elements[p2.element].breakInto != undefined){
- let elem = (Array.isArray(elements[p2.element].breakInto)) ? elements[p2.element].breakInto[Math.round(Math.random()*elements[p2.element].breakInto.length)] : elements[p2.element].breakInto;
- if(elem != undefined){
- changePixel(p2, elem);
- }
- }
- }
- if(pixel.clickCd > 0){pixel.clickCd--;}
-}, {range: null, toggle: false, clickCd: 0, chance: 0.35}, false, (pixel)=>{
- if(pixel.clickCd == 0 && dragStart == null){
- pixel.toggle = !pixel.toggle;
- pixel.clickCd = 20;
- if(pixel.toggle){
- let rgb = hexToRGB(elements.toggle_smasher.active);
- let num = 5 - (Math.random()*10);
- for(let key in rgb){
- rgb[key] += num;
- rgb[key] = Math.round(Math.max(Math.min(rgb[key], 255), 0));
- }
- pixel.color = `rgb(${rgb.r},${rgb.g},${rgb.b})`;
- } else {
- let rgb = hexToRGB(elements.toggle_smasher.inactive);
- let num = 5 - (Math.random()*10);
- for(let key in rgb){
- rgb[key] += num;
- rgb[key] = Math.round(Math.max(Math.min(rgb[key], 255), 0));
- }
- pixel.color = `rgb(${rgb.r},${rgb.g},${rgb.b})`;
- }
- };
-});
-elements.toggle_smasher.inactive = "#2e2726", elements.toggle_smasher.active = "#bf9e9b", elements.toggle_smasher.movable = false, elements.toggle_smasher.keyInput = "chance";
-elements.toggle_smasher.hardness = 1;
-
-elements.target_toggle_smasher = new rangeTool("#332422", (pixel)=>{
- let range = mouseRange(pixel.x, pixel.y, pixel.range);
- for(let coords of range){
- let p2 = getPixel(coords[0], coords[1]);
- if(p2 != null && pixel.toggle && Math.random() < pixel.chance && elements[p2.element].breakInto != undefined && pixel.targetElems.includes(p2.element)){
- let elem = (Array.isArray(elements[p2.element].breakInto)) ? elements[p2.element].breakInto[Math.round(Math.random()*elements[p2.element].breakInto.length)] : elements[p2.element].breakInto;
- if(elem != undefined){
- changePixel(p2, elem);
- }
- }
- }
- if(pixel.clickCd > 0){pixel.clickCd--;}
-}, {range: null, toggle: false, clickCd: 0, chance: 0.35, targetElems: []}, ()=>{
- promptInput("Enter the range for this tool: ", (range)=>{
- console.log(range);
- elements.target_toggle_smasher.range = parseInt(range);
- logMessage("Place smasher, then add elements to the target list by selecting the element and hold down shift while clicking on the pixel, then click on it to toggle on or off. Shift clicking with an element already found in the list will remove it.");
- }, "Enter range", elements.target_toggle_smasher.range);
-}, (pixel, elem)=>{
- if(pixel.clickCd == 0 && dragStart == null && !shiftDown){
- pixel.toggle = !pixel.toggle;
- pixel.clickCd = 20;
- if(pixel.toggle){
- let rgb = hexToRGB(elements.target_toggle_smasher.active);
- let num = 5 - (Math.random()*10);
- for(let key in rgb){
- rgb[key] += num;
- rgb[key] = Math.round(Math.max(Math.min(rgb[key], 255), 0));
- }
- pixel.color = `rgb(${rgb.r},${rgb.g},${rgb.b})`;
- } else {
- let rgb = hexToRGB(elements.target_toggle_smasher.inactive);
- let num = 5 - (Math.random()*10);
- for(let key in rgb){
- rgb[key] += num;
- rgb[key] = Math.round(Math.max(Math.min(rgb[key], 255), 0));
- }
- pixel.color = `rgb(${rgb.r},${rgb.g},${rgb.b})`;
- }
- };
- if(shiftDown && elements[elem].breakInto != undefined){
- if(pixel.targetElems.includes(elem)){
- pixel.targetElems.splice(pixel.targetElems.indexOf(elem), 1);
- } else {
- pixel.targetElems.push(elem);
- }
- }
-});
-elements.target_toggle_smasher.inactive = "#332422", elements.target_toggle_smasher.active = "#b57a72", elements.target_toggle_smasher.movable = false, elements.target_toggle_smasher.keyInput = "chance";
-elements.target_toggle_smasher.hardness = 1;
-
-elements.target_toggle_mixer = new rangeTool("#1f291b", (pixel)=>{
-
- let range = mouseRange(pixel.x, pixel.y, pixel.range);
- let pixels = [];
- for(let coords of range){
- let p2 = getPixel(coords[0], coords[1]);
- if(p2 != null && pixel.toggle){
- pixels.push(p2);
- }
- }
- for(let p of pixels){
- if(Math.random() < pixel.chance){
- let p2 = pixels[Math.round(Math.random()*pixels.length)];
- if(p != undefined && p2 != undefined && elements[p.element].movable && elements[p2.element].movable && pixel.targetElems.includes(p.element) && pixel.targetElems.includes(p2.element)){
- swapPixels(p, p2);
- if(elements[p.element].onMix != undefined){
- elements[p.element].onMix(p);
- }
- if(elements[p2.element].onMix != undefined){
- elements[p2.element].onMix(p2);
- }
- }
- }
- }
- if(pixel.clickCd > 0){pixel.clickCd--;}
-}, {range: null, toggle: false, clickCd: 0, chance: 0.35, targetElems: []}, ()=>{
- promptInput("Enter the range for this tool: ", (range)=>{
- console.log(range);
- elements.target_toggle_mixer.range = parseInt(range);
- logMessage("Place mixer, then add elements to the target list by selecting the element and hold down shift while clicking on the pixel, then click on it to toggle on or off. Shift clicking with an element already found in the list will remove it.");
- }, "Enter range", elements.target_toggle_mixer.range);
-}, (pixel, elem)=>{
- if(pixel.clickCd == 0 && dragStart == null && !shiftDown){
- pixel.toggle = !pixel.toggle;
- pixel.clickCd = 20;
- if(pixel.toggle){
- let rgb = hexToRGB(elements.target_toggle_mixer.active);
- let num = 5 - (Math.random()*10);
- for(let key in rgb){
- rgb[key] += num;
- rgb[key] = Math.round(Math.max(Math.min(rgb[key], 255), 0));
- }
- pixel.color = `rgb(${rgb.r},${rgb.g},${rgb.b})`;
- } else {
- let rgb = hexToRGB(elements.target_toggle_mixer.inactive);
- let num = 5 - (Math.random()*10);
- for(let key in rgb){
- rgb[key] += num;
- rgb[key] = Math.round(Math.max(Math.min(rgb[key], 255), 0));
- }
- pixel.color = `rgb(${rgb.r},${rgb.g},${rgb.b})`;
- }
- };
- if(shiftDown && elements[elem].movable){
- if(pixel.targetElems.includes(elem)){
- pixel.targetElems.splice(pixel.targetElems.indexOf(elem), 1);
- } else {
- pixel.targetElems.push(elem);
- }
- }
-});
-elements.target_toggle_mixer.inactive = "#1f291b", elements.target_toggle_mixer.active = "#8cbf7a", elements.target_toggle_mixer.movable = false, elements.target_toggle_mixer.keyInput = "chance";
-elements.target_toggle_mixer.hardness = 1;
-elements.target_sensor = {
- color: "#afb08b",
- conduct: 1,
- category: "machines",
- properties: {
- targetElems: [],
- clickCd: 0,
- },
- hardness: 1,
- onClicked: function(pixel, element){
- if(shiftDown && element != "unknown" && pixel.clickCd == 0){
- if(pixel.targetElems.includes(element)){
- pixel.targetElems.splice(pixel.targetElems.indexOf(element), 1);
- pixel.clickCd = 20;
- } else {
- pixel.targetElems.push(element);
- pixel.clickCd = 20;
- }
- }
- },
- tick: function(pixel){
- for(let coords of adjacentCoords){
- let x = pixel.x+coords[0], y = pixel.y+coords[1];
- let p = getPixel(x,y);
- if(p != null && pixel.targetElems.includes(p.element)){
- pixel.charge = 1;
- doElectricity(pixel,1);
- }
- }
- pixel.clickCd -= (pixel.clickCd > 0) ? 1 : 0;
- }
-}
-
-Pixel.prototype.inRange = function(range){
- res = false;
- for(let coords of range){
- if(this.x == coords[0] && this.y == coords[1]){
- res = true;
- }
- }
- return res;
-}
-elements.acid.ignore = elements.acid.ignore.concat(["nitric_acid", "aqua_regia", "chloroauric_acid", "nitrogen_dioxide", "nitric_acid_ice", "nitrogen_dioxide_ice", "acid", "chloroauric_acid", "magnesium_chloride", "magnesium_carbonate", "magnesium_hydroxide", "magnesium", "gallium", "gallium_chloride", "salt", "aluminum", "aluminum_chloride", "target_portal_in"]);
-elements.nitric_acid = {
- alias: "HNO₃",
- behavior: [["XX","DB%5","XX"],["DB%5 AND M2","XX","DB%5 AND M2"],["DB%5 AND M2","DB%10 AND M1","DB%5 AND M2"]],
- ignore: elements.acid.ignore,
- state: "liquid",
- color: ["#f5e7e1", "#f7e8e1", "#f7ebe6"],
- tempLow: -42,
- stateLow: "nitric_acid_ice",
- reactions: {
- acid: {elem1: null, elem2: "aqua_regia"},
- },
- density: 1510,
- category: "liquids",
- tick: function(pixel){
- for(let coords of squareCoords){
- let x = pixel.x+coords[0], y = pixel.y+coords[1];
- let p2 = getPixel(x,y);
- if(p2 != null && ["light", "liquid_light", "laser"].includes(p2.element) || Math.random()<(pixel.temp-68)/53){
- let elems = ["nitrogen_dioxide","water", "oxygen"];
- let elem = elems[Math.round(Math.random()*elems.length)];
- while (elem == undefined){
- elem = elems[Math.round(Math.random()*elems.length)];
- }
- changePixel(pixel, elem);
- }
- }
- }
-}
-elements.nitrogen_dioxide = {
- alias: "NOâ‚‚",
- color: ["#6e361f", "#7d3d22", "#873f20", "#9c4935"],
- behavior: behaviors.GAS,
- state: "gas",
- reactions: {
- water: {elem1: null, elem2: "nitric_acid"},
- },
- category: "gases",
- stateHigh: ["nitrogen", "oxygen"],
- tempHigh: 150,
- stateLow: "nitrogen_dioxide_ice",
- tempLow: -11,
-};
-
-elements.nitrogen_dioxide_ice = {
- color: ["#4f1607", "#4d1709", "#541606", "#471407"],
- behavior: behaviors.WALL,
- state: "solid",
- category: "states",
- stateHigh: "nitrogen_dioxide",
- tempHigh: -10,
-};
-
-elements.nitric_acid_ice = {
- behavior: behaviors.WALL,
- color: ["#f5e7e4", "#f5efed", "#fcfafa"],
- state: "solid",
- category: "states",
- stateHigh: "nitric_acid",
- tempHigh: -41
-};
-
-elements.aqua_regia = {
- alias: "3HCl•HNO₃",
- color:["#ffc766", "#f5c36e", "#f7c163", "#ffcd75"],
- behavior: [["XX","DB%5","XX"],["DB%5 AND M2","XX","DB%5 AND M2"],["DB%5 AND M2","DB%10 AND M1","DB%5 AND M2"]],
- ignore: elements.acid.ignore,
- category: "liquids",
- state: "liquid",
- density: 1210,
- reactions: {
- gold: {elem1: "chloroauric_acid", elem2: null, chance: 0.15},
- gold_coin: {elem1: "chloroauric_acid", elem2: null, chance: 0.15},
- blue_gold: {elem1: ["chloroauric_acid", "gallium_chloride"], elem2: null, chance: 0.15},
- purple_gold: {elem1: ["chloroauric_acid", "chloroauric_acid", "chloroauric_acid", "aluminum_chloride"], elem2: null, chance: 0.15},
- }
-};
-elements.chloroauric_acid = {
- color: ["#f7bb2f", "#f5bb33", "#f5b727", "#e8ae25"],
- alias: "H(AuClâ‚„)",
- behavior: behaviors.POWDER,
- category: "powders",
- state: "solid",
- density: 3900,
- reactions: {
- potassium: {elem1: "gold_coin", elem2: "potassium_salt", func: function(pixel){for(let coords of squareCoords){let x=pixel.x+coords[0],y=pixel.y+coords[1]; if(isEmpty(x,y) && !outOfBounds(x,y) && Math.random()<0.25){createPixel("hydrogen", x, y);}}}},
- sodium: {elem1: "gold_coin", elem2: "salt", func: function(pixel){for(let coords of squareCoords){let x=pixel.x+coords[0],y=pixel.y+coords[1]; if(isEmpty(x,y) && !outOfBounds(x,y) && Math.random()<0.25){createPixel("hydrogen", x, y);}}}},
- caustic_potash: {elem1: "gold_coin", elem2: "potassium_salt", func: function(pixel){for(let coords of squareCoords){let x=pixel.x+coords[0],y=pixel.y+coords[1]; if(isEmpty(x,y) && !outOfBounds(x,y) && Math.random()<0.25){createPixel("water", x, y);}}}},
- lye: {elem1: "gold_coin", elem2: "salt", func: function(pixel){for(let coords of squareCoords){let x=pixel.x+coords[0],y=pixel.y+coords[1]; if(isEmpty(x,y) && !outOfBounds(x,y) && Math.random()<0.25){createPixel("water", x, y);}}}},
- magnesium: {elem1: "gold_coin", elem2: "magnesium_chloride", func: function(pixel){for(let coords of squareCoords){let x=pixel.x+coords[0],y=pixel.y+coords[1]; if(isEmpty(x,y) && !outOfBounds(x,y) && Math.random()<0.25){createPixel("hydrogen", x, y);}}}},
- metal_scrap: {elem1: "gold_coin", elem2: "slag", func: function(pixel){for(let coords of squareCoords){let x=pixel.x+coords[0],y=pixel.y+coords[1]; if(isEmpty(x,y) && !outOfBounds(x,y) && Math.random()<0.25){createPixel("hydrogen", x, y);}}}},
- }
-};
-elements.magnesium_chloride = {
- alias: "MgClâ‚‚",
- category: "salts",
- behavior: behaviors.POWDER,
- state: "solid",
- color: ["#f2f2f2", "#f5f5f5", "#ebebeb", "#e6e6e6"],
- density: 2320,
- reactions: {
- baking_soda: {elem1: "magnesium_carbonate", elem2: "salt"},
- lye: {elem1: "magnesium_hydroxide", elem2: "salt"},
- caustic_potash: {elem1: "magnesium_hydroxide", elem2: "potassium_salt"},
- ash: {elem1: "magnesium_carbonate", elem2: ["dust","dust",null,"potassium_salt", "charcoal"]}
- }
-}
-elements.calcium_chloride = {
- alias: "CaClâ‚‚",
- category: "salts",
- density: 2150,
- behavior: behaviors.POWDER,
- state: "solid",
- color: ["#f2f2f2", "#f5f5f5", "#ebebeb", "#e6e6e6"],
- density: 2320,
- reactions: {
- baking_soda: {elem1: "limestone", elem2: "salt"},
- lye: {elem1: "slaked_lime", elem2: "salt"},
- caustic_potash: {elem1: "slaked_lime", elem2: "potassium_salt"},
- ash: {elem1: "limestone", elem2: ["dust","dust",null,"potassium_salt", "charcoal"]},
- epsom_salt: {elem1: "hardened_gypsum", elem2: "magnesium_chloride"},
- carbon_dioxide: {elem1: "limestone", elem2: "chlorine", chance: 0.001, tempMin: 60}
- }
-}
-elements.sodium.reactions.carbon_dioxide = {elem1: "baking_soda", elem2: null}, elements.magnesium.reactions.carbon_dioxide = {elem1: "magnesium_carbonate", elem2:null};
-elements.acid.reactions.magnesium = {elem1: "hydrogen", elem2: "magnesium_chloride"};
-elements.magnesium_carbonate = {
- alias: "MgCO₃",
- category: "salts",
- behavior: behaviors.POWDER,
- state: "solid",
- color: ["#f2f2f2", "#f5f5f5", "#ebebeb", "#e6e6e6"],
- density: 2960,
- reactions: {
- acid: {elem1: "magnesium_chloride", elem2: ["carbon_dioxide", "foam", "seltzer", "seltzer"]}
- }
-}
-elements.magnesium_hydroxide = {
- alias: "Mg(OH)â‚‚",
- category: "salts",
- behavior: behaviors.POWDER,
- state: "solid",
- color: ["#f2f2f2", "#f5f5f5", "#ebebeb", "#e6e6e6"],
- density: 2340,
- reactions: {
- acid: {elem1: "magnesium_chloride", elem2: "water"}
- }
-}
-elements.hardened_gypsum = {
- alias: "CaSO₄•2H₂O",
- color: ["#f2f2f2", "#f5f5f5", "#ebebeb", "#e6e6e6"],
- category: "solids",
- state: "solid",
- behavior: behaviors.WALL,
- density: 2320,
- breakInto: "gypsum",
-}
-elements.gypsum = {
- alias: "CaSO₄•2H₂O",
- color: ["#d1d1d1", "#d6d6d6", "#cccbca", "#cfcdca", "#bfbebb"],
- category: "powders",
- state: "solid",
- behavior: behaviors.STURDYPOWDER,
- density: 2420,
- tick: function(pixel){
- let chance = (pixel.temp-18)/100*(pixel.temp/40)*((pixelTicks-pixel.start)/250);
- if(Math.random(){
- elements.target_portal_in.channel = parseInt(input);
- }, "Portal Channel", elements.target_portal_in.channel)
- },
- tick: function(pixel){
- pixel.clickCd -= (pixel.clickCd == 0) ? 0 : 1;
- if(pixel.channel == null){
- pixel.channel = elements.target_portal_in.channel;
- }
- if(pixel.out == null){
- for(p2 of currentPixels){
- if(p2.element == "portal_out" && p2.channel == pixel.channel){
- let adjacent = this.checkAdjacent(p2);
- if(adjacent != false){
- pixel.out = p2;
- break;
- }
+ pixel[valueArr[0]] = (Number.isInteger(pixel[valueArr[0]])) ? parseInt(valueArr[1]) : valueArr[1];
}
}
}
- for(let coords of adjacentCoords){
- let x = pixel.x+coords[0], y = pixel.y+coords[1];
- if(!isEmpty(x,y) && !outOfBounds(x,y) && elements[pixelMap[x][y].element].movable && pixel.out != undefined){
- let pixel2 = getPixel(x,y);
- let spots = this.checkAdjacent(pixel.out);
- if(spots != false && Array.isArray(spots)){
- let num = Math.round(Math.random()*spots.length);
- while(spots[num] == undefined){
- num = Math.round(Math.random()*spots.length);
+ }
+
+ elements.toggle = {
+ category: "machines",
+ active: "#b8b8b8",
+ inactive: "#2b2b2b",
+ color: "#2b2b2b",
+ properties: {
+ toggle: false,
+ clickCd: 0,
+ },
+ hardness: 1,
+ onClicked: function(pixel){
+ if(pixel.clickCd == 0 && dragStart == null){
+ pixel.toggle = !pixel.toggle;
+ pixel.clickCd = 20;
+ if(pixel.toggle){
+ let rgb = hexToRGB(elements.toggle.active);
+ let num = 5 - (Math.random()*10);
+ for(let key in rgb){
+ rgb[key] += num;
+ rgb[key] = Math.round(Math.max(Math.min(rgb[key], 255), 0));
}
- if(pixel.targetElems.includes(pixel2.element)){
- movePixel(pixel2, spots[num][0], spots[num][1]);
+ pixel.color = `rgb(${rgb.r},${rgb.g},${rgb.b})`;
+ } else {
+ let rgb = hexToRGB(elements.toggle.inactive);
+ let num = 5 - (Math.random()*10);
+ for(let key in rgb){
+ rgb[key] += num;
+ rgb[key] = Math.round(Math.max(Math.min(rgb[key], 255), 0));
+ }
+ pixel.color = `rgb(${rgb.r},${rgb.g},${rgb.b})`;
+ }
+ };
+ },
+ tick: function(pixel){
+ if(pixel.clickCd != 0){pixel.clickCd--;}
+ for(let coords of adjacentCoords){
+ let x = pixel.x+coords[0], y = pixel.y+coords[1];
+ let p2 = getPixel(x,y);
+ if(p2 != null && elements[p2.element].conduct == 1 && pixel.toggle){
+ p2.charge = 1;
+ }
+ }
+ }
+ }
+
+ elements.e_temper = {
+ category: "machines",
+ color: "#ffb300",
+ conduct: 1,
+ targetTemp: 25,
+ hardness: 1,
+ onSelect: function(){
+ promptInput("Enter the target temperature:", (In)=>{
+ this.targetTemp = parseInt(In) || this.targetTemp;
+ }, "Temperature Selector", this.targetTemp);
+ },
+ properties: {
+ targetTemp: null
+ },
+ keyInput: "targetTemp",
+ tick: function(pixel){
+ if(pixel.targetTemp == null){
+ pixel.targetTemp = elements.e_temper.targetTemp;
+ }
+
+ doElectricity(pixel, 1);
+ for(let coords of adjacentCoords){
+ let x = pixel.x+coords[0], y = pixel.y+coords[1];
+ let p2 = getPixel(x,y);
+ if(p2 != null && pixel.charge > 0){
+ let difference = pixel.targetTemp-p2.temp;
+ p2.temp += difference/4;
+ }
+ }
+ },
+ dataInFunc: function(pixel, value){
+ if(value.includes(":")){
+ let valueArr = value.split(":");
+ if(Array.isArray(pixel[valueArr[0]]) && !pixel[valueArr[0]].includes(valueArr[1])){
+ pixel[valueArr[0]].push(valueArr[1]);
+ } else {
+ pixel[valueArr[0]] = (Number.isInteger(pixel[valueArr[0]])) ? parseInt(valueArr[1]) : valueArr[1];
+ }
+ }
+ }
+ }
+
+ elements.toggle_temper = {
+ active: "#ff7b00",
+ inactive: "#261200",
+ color: "#261200",
+ category: "machines",
+ targetTemp: 25,
+ keyInput: "targetTemp",
+ hardness: 1,
+ properties: {
+ toggle: false,
+ clickCd: 0,
+ targetTemp: null,
+ },
+ onClicked: function(pixel){
+ if(pixel.clickCd == 0 && dragStart == null){
+ pixel.toggle = !pixel.toggle;
+ pixel.clickCd = 20;
+ if(pixel.toggle){
+ let rgb = hexToRGB(elements.toggle_temper.active);
+ let num = 5 - (Math.random()*10);
+ for(let key in rgb){
+ rgb[key] += num;
+ rgb[key] = Math.round(Math.max(Math.min(rgb[key], 255), 0));
+ }
+ pixel.color = `rgb(${rgb.r},${rgb.g},${rgb.b})`;
+ } else {
+ let rgb = hexToRGB(elements.toggle_temper.inactive);
+ let num = 5 - (Math.random()*10);
+ for(let key in rgb){
+ rgb[key] += num;
+ rgb[key] = Math.round(Math.max(Math.min(rgb[key], 255), 0));
+ }
+ pixel.color = `rgb(${rgb.r},${rgb.g},${rgb.b})`;
+ }
+ };
+ },
+ onSelect: function(){
+ promptInput("Enter the target temperature:", (In)=>{
+ this.targetTemp = parseInt(In) || this.targetTemp;
+ }, "Temperature Selector", this.targetTemp);
+ },
+ tick: function(pixel){
+ if(pixel.targetTemp == null){
+ pixel.targetTemp = this.targetTemp;
+ }
+ for(let coords of adjacentCoords){
+ let x = pixel.x+coords[0], y = pixel.y+coords[1];
+ let p2 = getPixel(x,y);
+ if(p2 != null && pixel.toggle){
+ let difference = pixel.targetTemp-p2.temp;
+ p2.temp += difference/4;
+ }
+ }
+ if(pixel.clickCd > 0){pixel.clickCd--;};
+ },
+ dataInFunc: function(pixel, value){
+ if(value.includes(":")){
+ let valueArr = value.split(":");
+ if(Array.isArray(pixel[valueArr[0]]) && !pixel[valueArr[0]].includes(valueArr[1])){
+ pixel[valueArr[0]].push(valueArr[1]);
+ } else {
+ pixel[valueArr[0]] = (Number.isInteger(pixel[valueArr[0]])) ? parseInt(valueArr[1]) : valueArr[1];
+ }
+ }
+ }
+ }
+
+ elements.multitool = {
+ category: "tools",
+ input: 0,
+ onSelect: function(){
+ promptInput("Multitool for morechemistry.js, changes key values for different elements added in morechemistry.js, chance for toggleable cloner, targetTemp for toggleable temper, clone for other cloners, and channel for portals.", (In)=>{
+ this.input = In;
+ }, "Multitool Input", this.input);
+ },
+ tool: function(pixel){
+ if(elements[pixel.element].keyInput != undefined){
+ let type = (elements[pixel.element].keyInput.startsWith("int:")) ? "int" : (elements[pixel.element].keyInput.startsWith("str:")) ? "string" : "int";
+ let In = elements[pixel.element].keyInput.slice(elements[pixel.element].keyInput.indexOf(":")+1, elements[pixel.element].keyInput.length);
+ pixel[In] = (type == "int") ? parseFloat(this.input) : this.input;
+ }
+ },
+ canPlace: false,
+ }
+
+ class rangeTool {
+ constructor(color, func, properties = false, onSelect = false, onClicked = false){
+ this.category = "machines";
+ this.properties = (properties == false) ? { range: null } : properties;
+ this.color = color;
+ this.range = 0;
+ this.onSelect = (onSelect == false) ? ()=>{promptInput("Enter the range for this tool: ", (range)=>{this.range = parseInt(range);}, "Tool Range", this.range)} : onSelect;
+ this.onClicked = (onClicked == false) ? undefined : onClicked;
+ this.func = func;
+ }
+ tick = function(pixel){
+ if(pixel.range == null){
+ pixel.range = elements[pixel.element].range;
+ } else {
+ let pixelRange = mouseRange(pixel.x, pixel.y, pixel.range);
+ for(let coords of pixelRange){
+ let p2 = getPixel(coords[0], coords[1]);
+ if(p2 != null){
+ elements[pixel.element].func(p2);
}
}
}
}
}
-}
+
+ elements.button = {
+ category: "machines",
+ color: "#c7c7c7",
+ hardness: 1,
+ onClicked: function(pixel){
+ for(let coords of adjacentCoords){
+ let x = pixel.x+coords[0], y = pixel.y+coords[1];
+ let p = getPixel(x,y);
+ if(p != null && elements[p.element].conduct){
+ p.charge = 1;
+ }
+ }
+ }
+ }
+
+ elements.toggle_mixer = new rangeTool("#212420", (pixel)=>{
+ let range = mouseRange(pixel.x, pixel.y, pixel.range);
+ let pixels = [];
+ for(let coords of range){
+ let p2 = getPixel(coords[0], coords[1]);
+ if(p2 != null && pixel.toggle){
+ pixels.push(p2);
+ }
+ }
+ for(let p of pixels){
+ if(Math.random() < pixel.chance){
+ let p2 = pixels[Math.round(Math.random()*pixels.length)];
+ if(p != undefined && p2 != undefined && elements[p.element].movable && elements[p2.element].movable){
+ swapPixels(p, p2);
+ if(elements[p.element].onMix != undefined){
+ elements[p.element].onMix(p);
+ }
+ if(elements[p2.element].onMix != undefined){
+ elements[p2.element].onMix(p2);
+ }
+ }
+ }
+ }
+ if(pixel.clickCd > 0){pixel.clickCd--;}
+ }, {range: null, toggle: false, clickCd: 0, chance: 0.35}, false, (pixel)=>{
+ if(pixel.clickCd == 0 && dragStart == null){
+ pixel.toggle = !pixel.toggle;
+ pixel.clickCd = 20;
+ if(pixel.toggle){
+ let rgb = hexToRGB(elements.toggle_mixer.active);
+ let num = 5 - (Math.random()*10);
+ for(let key in rgb){
+ rgb[key] += num;
+ rgb[key] = Math.round(Math.max(Math.min(rgb[key], 255), 0));
+ }
+ pixel.color = `rgb(${rgb.r},${rgb.g},${rgb.b})`;
+ } else {
+ let rgb = hexToRGB(elements.toggle_mixer.inactive);
+ let num = 5 - (Math.random()*10);
+ for(let key in rgb){
+ rgb[key] += num;
+ rgb[key] = Math.round(Math.max(Math.min(rgb[key], 255), 0));
+ }
+ pixel.color = `rgb(${rgb.r},${rgb.g},${rgb.b})`;
+ }
+ };
+ });
+ elements.toggle_mixer.inactive = "#212420", elements.toggle_mixer.active = "#93a390", elements.toggle_mixer.movable = false, elements.toggle_mixer.keyInput = "chance";
+ elements.toggle_mixer.hardness = 1;
+
+ elements.toggle_smasher = new rangeTool("#2e2726", (pixel)=>{
+ let range = mouseRange(pixel.x, pixel.y, pixel.range);
+ for(let coords of range){
+ let p2 = getPixel(coords[0], coords[1]);
+ if(p2 != null && pixel.toggle && Math.random() < pixel.chance && elements[p2.element].breakInto != undefined){
+ let elem = (Array.isArray(elements[p2.element].breakInto)) ? elements[p2.element].breakInto[Math.round(Math.random()*elements[p2.element].breakInto.length)] : elements[p2.element].breakInto;
+ if(elem != undefined){
+ changePixel(p2, elem);
+ }
+ }
+ }
+ if(pixel.clickCd > 0){pixel.clickCd--;}
+ }, {range: null, toggle: false, clickCd: 0, chance: 0.35}, false, (pixel)=>{
+ if(pixel.clickCd == 0 && dragStart == null){
+ pixel.toggle = !pixel.toggle;
+ pixel.clickCd = 20;
+ if(pixel.toggle){
+ let rgb = hexToRGB(elements.toggle_smasher.active);
+ let num = 5 - (Math.random()*10);
+ for(let key in rgb){
+ rgb[key] += num;
+ rgb[key] = Math.round(Math.max(Math.min(rgb[key], 255), 0));
+ }
+ pixel.color = `rgb(${rgb.r},${rgb.g},${rgb.b})`;
+ } else {
+ let rgb = hexToRGB(elements.toggle_smasher.inactive);
+ let num = 5 - (Math.random()*10);
+ for(let key in rgb){
+ rgb[key] += num;
+ rgb[key] = Math.round(Math.max(Math.min(rgb[key], 255), 0));
+ }
+ pixel.color = `rgb(${rgb.r},${rgb.g},${rgb.b})`;
+ }
+ };
+ });
+ elements.toggle_smasher.inactive = "#2e2726", elements.toggle_smasher.active = "#bf9e9b", elements.toggle_smasher.movable = false, elements.toggle_smasher.keyInput = "chance";
+ elements.toggle_smasher.hardness = 1;
+
+ elements.target_toggle_smasher = new rangeTool("#332422", (pixel)=>{
+ let range = mouseRange(pixel.x, pixel.y, pixel.range);
+ for(let coords of range){
+ let p2 = getPixel(coords[0], coords[1]);
+ if(p2 != null && pixel.toggle && Math.random() < pixel.chance && elements[p2.element].breakInto != undefined && pixel.targetElems.includes(p2.element)){
+ let elem = (Array.isArray(elements[p2.element].breakInto)) ? elements[p2.element].breakInto[Math.round(Math.random()*elements[p2.element].breakInto.length)] : elements[p2.element].breakInto;
+ if(elem != undefined){
+ changePixel(p2, elem);
+ }
+ }
+ }
+ if(pixel.clickCd > 0){pixel.clickCd--;}
+ }, {range: null, toggle: false, clickCd: 0, chance: 0.35, targetElems: []}, ()=>{
+ promptInput("Enter the range for this tool: ", (range)=>{
+ console.log(range);
+ elements.target_toggle_smasher.range = parseInt(range);
+ logMessage("Place smasher, then add elements to the target list by selecting the element and hold down shift while clicking on the pixel, then click on it to toggle on or off. Shift clicking with an element already found in the list will remove it.");
+ }, "Enter range", elements.target_toggle_smasher.range);
+ }, (pixel, elem)=>{
+ if(pixel.clickCd == 0 && dragStart == null && !shiftDown){
+ pixel.toggle = !pixel.toggle;
+ pixel.clickCd = 20;
+ if(pixel.toggle){
+ let rgb = hexToRGB(elements.target_toggle_smasher.active);
+ let num = 5 - (Math.random()*10);
+ for(let key in rgb){
+ rgb[key] += num;
+ rgb[key] = Math.round(Math.max(Math.min(rgb[key], 255), 0));
+ }
+ pixel.color = `rgb(${rgb.r},${rgb.g},${rgb.b})`;
+ } else {
+ let rgb = hexToRGB(elements.target_toggle_smasher.inactive);
+ let num = 5 - (Math.random()*10);
+ for(let key in rgb){
+ rgb[key] += num;
+ rgb[key] = Math.round(Math.max(Math.min(rgb[key], 255), 0));
+ }
+ pixel.color = `rgb(${rgb.r},${rgb.g},${rgb.b})`;
+ }
+ };
+ if(shiftDown && elements[elem].breakInto != undefined){
+ if(pixel.targetElems.includes(elem)){
+ pixel.targetElems.splice(pixel.targetElems.indexOf(elem), 1);
+ } else {
+ pixel.targetElems.push(elem);
+ }
+ }
+ });
+ elements.target_toggle_smasher.inactive = "#332422", elements.target_toggle_smasher.active = "#b57a72", elements.target_toggle_smasher.movable = false, elements.target_toggle_smasher.keyInput = "chance";
+ elements.target_toggle_smasher.hardness = 1;
+
+ elements.target_toggle_mixer = new rangeTool("#1f291b", (pixel)=>{
+
+ let range = mouseRange(pixel.x, pixel.y, pixel.range);
+ let pixels = [];
+ for(let coords of range){
+ let p2 = getPixel(coords[0], coords[1]);
+ if(p2 != null && pixel.toggle){
+ pixels.push(p2);
+ }
+ }
+ for(let p of pixels){
+ if(Math.random() < pixel.chance){
+ let p2 = pixels[Math.round(Math.random()*pixels.length)];
+ if(p != undefined && p2 != undefined && elements[p.element].movable && elements[p2.element].movable && pixel.targetElems.includes(p.element) && pixel.targetElems.includes(p2.element)){
+ swapPixels(p, p2);
+ if(elements[p.element].onMix != undefined){
+ elements[p.element].onMix(p);
+ }
+ if(elements[p2.element].onMix != undefined){
+ elements[p2.element].onMix(p2);
+ }
+ }
+ }
+ }
+ if(pixel.clickCd > 0){pixel.clickCd--;}
+ }, {range: null, toggle: false, clickCd: 0, chance: 0.35, targetElems: []}, ()=>{
+ promptInput("Enter the range for this tool: ", (range)=>{
+ console.log(range);
+ elements.target_toggle_mixer.range = parseInt(range);
+ logMessage("Place mixer, then add elements to the target list by selecting the element and hold down shift while clicking on the pixel, then click on it to toggle on or off. Shift clicking with an element already found in the list will remove it.");
+ }, "Enter range", elements.target_toggle_mixer.range);
+ }, (pixel, elem)=>{
+ if(pixel.clickCd == 0 && dragStart == null && !shiftDown){
+ pixel.toggle = !pixel.toggle;
+ pixel.clickCd = 20;
+ if(pixel.toggle){
+ let rgb = hexToRGB(elements.target_toggle_mixer.active);
+ let num = 5 - (Math.random()*10);
+ for(let key in rgb){
+ rgb[key] += num;
+ rgb[key] = Math.round(Math.max(Math.min(rgb[key], 255), 0));
+ }
+ pixel.color = `rgb(${rgb.r},${rgb.g},${rgb.b})`;
+ } else {
+ let rgb = hexToRGB(elements.target_toggle_mixer.inactive);
+ let num = 5 - (Math.random()*10);
+ for(let key in rgb){
+ rgb[key] += num;
+ rgb[key] = Math.round(Math.max(Math.min(rgb[key], 255), 0));
+ }
+ pixel.color = `rgb(${rgb.r},${rgb.g},${rgb.b})`;
+ }
+ };
+ if(shiftDown && elements[elem].movable){
+ if(pixel.targetElems.includes(elem)){
+ pixel.targetElems.splice(pixel.targetElems.indexOf(elem), 1);
+ } else {
+ pixel.targetElems.push(elem);
+ }
+ }
+ });
+ elements.target_toggle_mixer.inactive = "#1f291b", elements.target_toggle_mixer.active = "#8cbf7a", elements.target_toggle_mixer.movable = false, elements.target_toggle_mixer.keyInput = "chance";
+ elements.target_toggle_mixer.hardness = 1;
+ elements.target_sensor = {
+ color: "#afb08b",
+ conduct: 1,
+ category: "machines",
+ properties: {
+ targetElems: [],
+ clickCd: 0,
+ },
+ hardness: 1,
+ onClicked: function(pixel, element){
+ if(shiftDown && element != "unknown" && pixel.clickCd == 0){
+ if(pixel.targetElems.includes(element)){
+ pixel.targetElems.splice(pixel.targetElems.indexOf(element), 1);
+ pixel.clickCd = 20;
+ } else {
+ pixel.targetElems.push(element);
+ pixel.clickCd = 20;
+ }
+ }
+ },
+ tick: function(pixel){
+ for(let coords of adjacentCoords){
+ let x = pixel.x+coords[0], y = pixel.y+coords[1];
+ let p = getPixel(x,y);
+ if(p != null && pixel.targetElems.includes(p.element)){
+ pixel.charge = 1;
+ doElectricity(pixel,1);
+ }
+ }
+ pixel.clickCd -= (pixel.clickCd > 0) ? 1 : 0;
+ },
+ dataInFunc: function(pixel, value){
+ if(value.includes(":")){
+ let valueArr = value.split(":");
+ if(Array.isArray(pixel[valueArr[0]]) && !pixel[valueArr[0]].includes(valueArr[1])){
+ pixel[valueArr[0]].push(valueArr[1]);
+ } else {
+ pixel[valueArr[0]] = (Number.isInteger(pixel[valueArr[0]])) ? parseInt(valueArr[1]) : valueArr[1];
+ }
+ }
+ }
+ }
+
+ Pixel.prototype.inRange = function(range){
+ res = false;
+ for(let coords of range){
+ if(this.x == coords[0] && this.y == coords[1]){
+ res = true;
+ }
+ }
+ return res;
+ }
+ function acidTick(pixel){
+ 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){
+ 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;
+ }
+ }
+ 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.nitric_acid = {
+ alias: "HNO₃",
+ behavior: behaviors.LIQUID,
+ ignore: elements.acid.ignore,
+ state: "liquid",
+ color: ["#f5e7e1", "#f7e8e1", "#f7ebe6"],
+ tempLow: -42,
+ stateLow: "nitric_acid_ice",
+ reactions: {
+ acid: {elem1: null, elem2: "aqua_regia"},
+ },
+ density: 1510,
+ category: "liquids",
+ tick: function(pixel){
+ acidTick(pixel);
+ for(let coords of squareCoords){
+ let x = pixel.x+coords[0], y = pixel.y+coords[1];
+ let p2 = getPixel(x,y);
+ if(p2 != null && ["light", "liquid_light", "laser"].includes(p2.element) || Math.random()<(pixel.temp-68)/53){
+ let elems = ["nitrogen_dioxide","water", "oxygen"];
+ let elem = elems[Math.round(Math.random()*elems.length)];
+ while (elem == undefined){
+ elem = elems[Math.round(Math.random()*elems.length)];
+ }
+ changePixel(pixel, elem);
+ }
+ }
+ }
+ }
+ elements.nitrogen_dioxide = {
+ alias: "NOâ‚‚",
+ color: ["#6e361f", "#7d3d22", "#873f20", "#9c4935"],
+ behavior: behaviors.GAS,
+ state: "gas",
+ reactions: {
+ water: {elem1: null, elem2: "nitric_acid"},
+ },
+ category: "gases",
+ stateHigh: ["nitrogen", "oxygen"],
+ tempHigh: 150,
+ stateLow: "nitrogen_dioxide_ice",
+ tempLow: -11,
+ };
+
+ elements.nitrogen_dioxide_ice = {
+ temp: -20,
+ color: ["#4f1607", "#4d1709", "#541606", "#471407"],
+ behavior: behaviors.WALL,
+ state: "solid",
+ category: "states",
+ stateHigh: "nitrogen_dioxide",
+ tempHigh: -10,
+ };
+
+ elements.nitric_acid_ice = {
+ temp: -45,
+ behavior: behaviors.WALL,
+ color: ["#f5e7e4", "#f5efed", "#fcfafa"],
+ state: "solid",
+ category: "states",
+ stateHigh: "nitric_acid",
+ tempHigh: -41
+ };
+
+ elements.aqua_regia = {
+ alias: "3HCl•HNO₃",
+ color:["#ffc766", "#f5c36e", "#f7c163", "#ffcd75"],
+ behavior: behaviors.LIQUID,
+ ignore: elements.acid.ignore,
+ category: "liquids",
+ state: "liquid",
+ density: 1210,
+ reactions: {
+ gold: {elem1: "chloroauric_acid", elem2: null, chance: 0.15},
+ gold_coin: {elem1: "chloroauric_acid", elem2: null, chance: 0.15},
+ blue_gold: {elem1: ["chloroauric_acid", "gallium_chloride"], elem2: null, chance: 0.15},
+ purple_gold: {elem1: ["chloroauric_acid", "chloroauric_acid", "chloroauric_acid", "aluminum_chloride"], elem2: null, chance: 0.15},
+ },
+ tick: acidTick,
+ };
+ elements.chloroauric_acid = {
+ color: ["#f7bb2f", "#f5bb33", "#f5b727", "#e8ae25"],
+ alias: "H(AuClâ‚„)",
+ behavior: behaviors.POWDER,
+ category: "salts",
+ state: "solid",
+ density: 3900,
+ reactions: {
+ potassium: {elem1: "gold_coin", elem2: "potassium_salt", func: function(pixel){for(let coords of squareCoords){let x=pixel.x+coords[0],y=pixel.y+coords[1]; if(isEmpty(x,y) && !outOfBounds(x,y) && Math.random()<0.25){createPixel("hydrogen", x, y);}}}, color1: ["#574000", "#705200", "#634900", "#755600"]},
+ sodium: {elem1: "gold_coin", elem2: "salt", func: function(pixel){for(let coords of squareCoords){let x=pixel.x+coords[0],y=pixel.y+coords[1]; if(isEmpty(x,y) && !outOfBounds(x,y) && Math.random()<0.25){createPixel("hydrogen", x, y);}}}, color1: ["#574000", "#705200", "#634900", "#755600"]},
+ caustic_potash: {elem1: "gold_coin", elem2: "potassium_salt", func: function(pixel){for(let coords of squareCoords){let x=pixel.x+coords[0],y=pixel.y+coords[1]; if(isEmpty(x,y) && !outOfBounds(x,y) && Math.random()<0.25){createPixel("water", x, y);}}}},
+ lye: {elem1: "gold_coin", elem2: "salt", func: function(pixel){for(let coords of squareCoords){let x=pixel.x+coords[0],y=pixel.y+coords[1]; if(isEmpty(x,y) && !outOfBounds(x,y) && Math.random()<0.25){createPixel("water", x, y);}}}, color1: ["#574000", "#705200", "#634900", "#755600"]},
+ magnesium: {elem1: "gold_coin", elem2: "magnesium_chloride", func: function(pixel){for(let coords of squareCoords){let x=pixel.x+coords[0],y=pixel.y+coords[1]; if(isEmpty(x,y) && !outOfBounds(x,y) && Math.random()<0.25){createPixel("hydrogen", x, y);}}}, color1: ["#574000", "#705200", "#634900", "#755600"]},
+ metal_scrap: {elem1: "gold_coin", elem2: "slag", func: function(pixel){for(let coords of squareCoords){let x=pixel.x+coords[0],y=pixel.y+coords[1]; if(isEmpty(x,y) && !outOfBounds(x,y) && Math.random()<0.25){createPixel("hydrogen", x, y);}}}, color1: ["#574000", "#705200", "#634900", "#755600"]},
+ copper: {elem1: "copper_chloride", elem2: "gold", color2: ["#574000", "#705200", "#634900", "#755600"]}
+ }
+ };
+ elements.magnesium_chloride = {
+ alias: "MgClâ‚‚",
+ category: "salts",
+ behavior: behaviors.POWDER,
+ state: "solid",
+ color: ["#f2f2f2", "#f5f5f5", "#ebebeb", "#e6e6e6"],
+ density: 2320,
+ reactions: {
+ baking_soda: {elem1: "magnesium_carbonate", elem2: "salt"},
+ lye: {elem1: "magnesium_hydroxide", elem2: "salt"},
+ caustic_potash: {elem1: "magnesium_hydroxide", elem2: "potassium_salt"},
+ ash: {elem1: "magnesium_carbonate", elem2: ["dust","dust",null,"potassium_salt", "charcoal"]}
+ },
+ tempHigh: 714,
+ }
+ elements.molten_magnesium_chloride = {
+ alias: "MgClâ‚‚",
+ density: 2150,
+ behavior: behaviors.MOLTEN,
+ state: "liquid",
+ color: ["#ffeb91", "#ffea8c", "#ffd480", "#ffd685", "#ffc37a"],
+ category: "states",
+ tempLow: 713,
+ stateLow: "magnesium_chloride",
+ stateHigh: ["acid_gas", "magnesium"],
+ tempHigh: 800,
+ temp: 720,
+ }
+ elements.calcium_chloride = {
+ flameColor: ["#fc8721", "#f58625", "#fa8d2d"],
+ alias: "CaClâ‚‚",
+ category: "salts",
+ density: 2150,
+ behavior: behaviors.POWDER,
+ state: "solid",
+ color: ["#f2f2f2", "#f5f5f5", "#ebebeb", "#e6e6e6"],
+ reactions: {
+ baking_soda: {elem1: "limestone", elem2: "salt"},
+ lye: {elem1: "slaked_lime", elem2: "salt"},
+ caustic_potash: {elem1: "slaked_lime", elem2: "potassium_salt"},
+ ash: {elem1: "limestone", elem2: ["dust","dust",null,"potassium_salt", "charcoal"]},
+ epsom_salt: {elem1: "hardened_gypsum", elem2: "magnesium_chloride"},
+ carbon_dioxide: {elem1: "limestone", elem2: "chlorine", chance: 0.001, tempMin: 60}
+ },
+ tempHigh: 772,
+ stateHigh: "molten_calcium_chloride",
+ }
+ elements.molten_calcium_chloride = {
+ flameColor: ["#fc8721", "#f58625", "#fa8d2d"],
+ alias: "CaClâ‚‚",
+ density: 2150,
+ behavior: behaviors.MOLTEN,
+ state: "liquid",
+ color: ["#ffeb91", "#ffea8c", "#ffd480", "#ffd685", "#ffc37a"],
+ category: "states",
+ tempLow: 771,
+ stateLow: "calcium_chloride",
+ reactions: {
+ oxygen: {elem1: "quicklime", elem2: "chlorine", chance: 0.005, tempMin: 800}
+ },
+ temp: 780,
+ }
+ elements.sodium.reactions.carbon_dioxide = {elem1: "baking_soda", elem2: null}, elements.magnesium.reactions.carbon_dioxide = {elem1: "magnesium_carbonate", elem2:null};
+ elements.acid.reactions.magnesium = {elem1: "hydrogen", elem2: "magnesium_chloride"};
+ elements.magnesium_carbonate = {
+ alias: "MgCO₃",
+ category: "salts",
+ behavior: behaviors.POWDER,
+ state: "solid",
+ color: ["#f2f2f2", "#f5f5f5", "#ebebeb", "#e6e6e6"],
+ density: 2960,
+ reactions: {
+ acid: {elem1: "magnesium_chloride", elem2: ["carbon_dioxide", "foam", "seltzer", "seltzer"]},
+ vinegar: {elem1: "magnesium_acetate", elem2: ["carbon_dioxide", "foam", "seltzer", "seltzer"]}
+ }
+ }
+ elements.magnesium_hydroxide = {
+ alias: "Mg(OH)â‚‚",
+ category: "salts",
+ behavior: behaviors.POWDER,
+ state: "solid",
+ color: ["#f2f2f2", "#f5f5f5", "#ebebeb", "#e6e6e6"],
+ density: 2340,
+ reactions: {
+ acid: {elem1: "magnesium_chloride", elem2: "water"},
+ vinegar: {elem1: "magnesium_acetate", elem2: "water"},
+ },
+ tempHigh: 350,
+ stateHigh: ["steam", "magnesium"],
+ }
+ elements.vinegar.reactions.limestone = undefined;
+ elements.limestone.reactions = {vinegar: {elem1: "calcium_acetate", elem2: ["carbon_dioxide", "foam", "seltzer", "seltzer"]}};
+ elements.quicklime.reactions.vinegar = {elem1: "calcium_acetate", elem2: "oxygen"};
+ elements.oxidized_copper.reactions.vinegar = {elem1: "copper_acetate", elem2: "water"};
+ elements.slaked_lime.reactions.vinegar = {elem1: "calcium_acetate", elem2: "water"};
+ elements.hardened_gypsum = {
+ alias: "CaSO₄•2H₂O",
+ color: ["#f2f2f2", "#f5f5f5", "#ebebeb", "#e6e6e6"],
+ category: "solids",
+ state: "solid",
+ behavior: behaviors.WALL,
+ density: 2320,
+ breakInto: "gypsum",
+ }
+ elements.gypsum = {
+ alias: "CaSO₄•2H₂O",
+ color: ["#d1d1d1", "#d6d6d6", "#cccbca", "#cfcdca", "#bfbebb"],
+ category: "powders",
+ state: "solid",
+ behavior: behaviors.STURDYPOWDER,
+ density: 2420,
+ tick: function(pixel){
+ let chance = ((pixel.temp-18)/100*(Math.abs(pixel.temp)/40)*((pixelTicks-pixel.start)/250))*0.1;
+ if(Math.random(){
+ elements.target_portal_in.channel = parseInt(input);
+ }, "Portal Channel", elements.target_portal_in.channel)
+ },
+ tick: function(pixel){
+ pixel.clickCd -= (pixel.clickCd == 0) ? 0 : 1;
+ if(pixel.channel == null){
+ pixel.channel = elements.target_portal_in.channel;
+ }
+ if(pixel.out == null){
+ for(p2 of currentPixels){
+ if(p2.element == "portal_out" && p2.channel == pixel.channel){
+ let adjacent = this.checkAdjacent(p2);
+ if(adjacent != false){
+ pixel.out = p2;
+ break;
+ }
+ }
+ }
+ }
+ for(let coords of adjacentCoords){
+ let x = pixel.x+coords[0], y = pixel.y+coords[1];
+ if(!isEmpty(x,y) && !outOfBounds(x,y) && elements[pixelMap[x][y].element].movable && pixel.out != undefined){
+ let pixel2 = getPixel(x,y);
+ let spots = this.checkAdjacent(pixel.out);
+ if(spots != false && Array.isArray(spots)){
+ let num = Math.round(Math.random()*spots.length);
+ while(spots[num] == undefined){
+ num = Math.round(Math.random()*spots.length);
+ }
+ if(pixel.targetElems.includes(pixel2.element)){
+ movePixel(pixel2, spots[num][0], spots[num][1]);
+ }
+ }
+ }
+ }
+ },
+ dataInFunc: function(pixel, value){
+ if(value.includes(":")){
+ let valueArr = value.split(":");
+ if(Array.isArray(pixel[valueArr[0]]) && !pixel[valueArr[0]].includes(valueArr[1])){
+ pixel[valueArr[0]].push(valueArr[1]);
+ } else {
+ pixel[valueArr[0]] = (Number.isInteger(pixel[valueArr[0]])) ? parseInt(valueArr[1]) : valueArr[1];
+ }
+ }
+ }
+ }
+
+ elements.aluminum_acetate = {
+ density: 1002,
+ color: ["#e8e8e8", "#ededed", "#e8e8e8", "#dedede"],
+ behavior: behaviors.POWDER,
+ state: "solid",
+ category: "salts",
+ alias: "Al(CH₃COO)₃",
+ reactions: {
+ acid: {elem1: "aluminum_chloride", elem2: "vinegar"},
+ },
+ tempHigh: 120,
+ stateHigh: ["vinegar", "aluminum"],
+ }
+ elements.magnesium_acetate = {
+ density: 1450,
+ color: ["#e8e8e8", "#ededed", "#e8e8e8", "#dedede"],
+ behavior: behaviors.POWDER,
+ state: "solid",
+ category: "salts",
+ alias: "Mg(CH₃COO)₂",
+ reactions: {
+ acid: {elem1: "magnesium_chloride", elem2: "vinegar"},
+ baking_soda: {elem1: "magnesium_carbonate", elem2: "sodium_acetate"},
+ ash: {elem1: "magnesium_carbonate", elem2: ["dust", "dust", null, "potassium_acetate"]},
+ },
+ tempHigh: 300,
+ stateHigh: ["vinegar", "magnesium_carbonate"],
+ }
+ elements.calcium_acetate = {
+ flameColor: ["#fc8721", "#f58625", "#fa8d2d"],
+ density: 1509,
+ color: ["#e8e8e8", "#ededed", "#e8e8e8", "#dedede"],
+ behavior: behaviors.POWDER,
+ state: "solid",
+ category: "salts",
+ alias: "Ca(CH₃COO)₂",
+ reactions: {
+ acid: {elem1: "calcium_chloride", elem2: "vinegar"},
+ baking_soda: {elem1: "limestone", elem2: "sodium_acetate"},
+ ash: {elem1: "limestone", elem2: ["dust", "dust", null, "potassium_acetate"]},
+ epsom_salt: {elem1: "hardened_gypsum", elem2: "magnesium_acetate"},
+ copper_sulfate: {elem1: "hardened_gypsum", elem2: "copper_acetate"},
+ },
+ tempHigh: 650,
+ stateHigh: ["vinegar", "limestone"]
+ }
+ elements.potassium_acetate = {
+ density: 1570,
+ fireColor: ["#e3a6ff", "#d798f5", "#d88efa"],
+ color: ["#e8e8e8", "#ededed", "#e8e8e8", "#dedede"],
+ behavior: behaviors.POWDER,
+ state: "solid",
+ category: "salts",
+ alias: "CH₃COOK",
+ reactions: {
+ acid: {elem1: "potassium_salt", elem2: "vinegar"},
+ baking_soda: {elem1: "caustic_potash", elem2: "sodium_acetate"},
+
+ },
+ tempHigh: 292,
+ }
+ elements.copper_acetate = {
+ density: 1880,
+ fireColor:["#4dff58", "#4ee658", "#59f054", "#54f05c"],
+ color: ["#00594d", "#036357", "#045661", "#044052"],
+ behavior: behaviors.POWDER,
+ state: "solid",
+ category: "salts",
+ alias: "Cu(CH₃COO)₂",
+ 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"},
+ wood: {stain2: "#043023"},
+ },
+ tempHigh: 240,
+ stateHigh: ["vinegar", "oxidized_copper"],
+ }
+ elements.copper_chloride = {
+ density: 3390,
+ tempHigh: 620,
+ stateHigh: ["copper", "chlorine"],
+ color: ["#59f0c2", "#57f2b2", "#53edce", "#61eddf"],
+ behavior: behaviors.POWDER,
+ state: "solid",
+ category: "salts",
+ alias: "CuClâ‚‚",
+ 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"},
+ wood: {stain2: "#043023"},
+ },
+ properties: {
+ anhydrous: false
+ },
+ fireColor: "#19abff",
+ tick: function(pixel){
+ if(pixelTicks-pixel.start == 2 && xDown){
+ pixel.anhydrous = true;
+ let rgb = {r: 74, g: 42, b: 10};
+ 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: 74, g: 42, b: 10};
+ 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: 116, g: 237, b: 203} : {r: 116, g: 237, b: 231};
+ 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: 116, g: 237, b: 203} : {r: 116, g: 237, b: 231};
+ 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.magnesium.reactions.water = {elem1: "magnesium_hydroxide", elem2: "hydrogen"};
+ elements.sulfuric_acid = {
+ alias: "Hâ‚‚SOâ‚„",
+ category: "liquids",
+ ignore: elements.acid.ignore,
+ tick: acidTick,
+ color: ["#f5f5f5", "#fcfcfc", "#fffce8", "#fffce6"],
+ behavior: behaviors.LIQUID,
+ state: "liquid",
+ density: 1830,
+ reactions: {
+ magnesium_carbonate: {elem1: ["carbon_dioxide", "foam","foam"], elem2: "epsom_salt"},
+ limestone: {elem1: ["carbon_dioxide", "foam","foam"], elem2: "hardened_gypsum"},
+ quicklime: {elem1: "water", elem2: "hardened_gypsum"},
+ slaked_lime: {elem1: "water", elem2: "hardened_gypsum"},
+ copper_acetate: {elem1: "vinegar", elem2: "copper_sulfate"},
+ copper_oxide: {elem1: "water", elem2: "copper_sulfate"},
+ copper_chloride: {elem1: "acid_gas", elem2: "copper_sulfate"},
+ magnesium: {elem1: "hydrogen", elem2: "epsom_salt"},
+ calcium: {elem1: "hydrogen", elem2: "hardened_gypsum"},
+ magnesium_chloride: {elem1: "acid_gas", elem2: "epsom_salt"},
+ calcium_chloride: {elem1: "acid_gas", elem2: "hardened_gypsum"},
+ calcium_acetate: {elem1: "vinegar", elem2: "hardened_gypsum"},
+ },
+ }
+ elements.platinum = {
+ alias: "Pt",
+ color: ["#cccccc", "#cfcfcf", "#d9d9d9", "#dedede"],
+ category: "solids",
+ state: "solid",
+ density: 21450,
+ behavior: behaviors.WALL,
+ reactions: {
+ aqua_regia: {elem1: "chloroplatinic_acid", elem2: "hydrogen"},
+ },
+ tempHigh: 1768,
+ stateHigh: "molten_platinum",
+ }
+ elements.molten_platinum = {
+ color: ["#ffd429", "#f7b228", "#ffb13d", "#ffd83d"],
+ behavior: behaviors.MOLTEN,
+ category: "states",
+ state: "liquid",
+ density: 21450,
+ tempLow: 1767,
+ stateLow: "platinum",
+ temp: 1770
+ }
+ elements.chloroplatinic_acid = {
+ color: ["#e6842e", "#f5923b", "#f5853b", "#f57a33"],
+ behavior: behaviors.POWDER,
+ category: "salts",
+ state: "solid",
+ density: 2431,
+ alias: "H₂PtCl₆",
+ tempHigh: 500,
+ stateHigh: ["acid_gas", "chlorine", "platinum", "platinum"],
+ reactions: {
+ sodium: {elem1: "salt", elem2: "platinum", color2: ["#404040", "#525252", "#454545", "#2e2e2e", "#262626"]},
+ potassium: {elem1: "potassium_salt", elem2: "platinum", color2: ["#404040", "#525252", "#454545", "#2e2e2e", "#262626"]},
+ magnesium: {elem1: "magnesium_chloride", elem2: "platinum", color2: ["#404040", "#525252", "#454545", "#2e2e2e", "#262626"]},
+ calcium: {elem1: "calcium_chloride", elem2: "platinum", color2: ["#404040", "#525252", "#454545", "#2e2e2e", "#262626"]},
+ aluminum: {elem1: "aluminum_chloride", elem2: "platinum", color2: ["#404040", "#525252", "#454545", "#2e2e2e", "#262626"]},
+ baking_soda: {elem1: ["salt", "foam"], elem2: "platinum", color2: ["#404040", "#525252", "#454545", "#2e2e2e", "#262626"]},
+ limestone: {elem1: ["calcium_chloride", "foam"], elem2: "platinum", color2: ["#404040", "#525252", "#454545", "#2e2e2e", "#262626"]},
+ caustic_potash: {elem1: "potassium_salt", elem2: "platinum", color2: ["#404040", "#525252", "#454545", "#2e2e2e", "#262626"]},
+ lye: {elem1: "salt", elem2: "platinum", color2: ["#404040", "#525252", "#454545", "#2e2e2e", "#262626"]},
+ ash: {elem1: ["potassium_salt", "foam", "charcoal", null, null], elem2: "platinum", color2: ["#404040", "#525252", "#454545", "#2e2e2e", "#262626"]},
+ copper: {elem1: "copper_chloride", elem2: "platinum", color2: ["#404040", "#525252", "#454545", "#2e2e2e", "#262626"]}
+
+ }
+ }
+ elements.magnet = {
+ keyInput: "range",
+ category: "machines",
+ range: 0,
+ attract: ["#1e43fc", "#1137f2", "#1c42ff", "#143bff"],
+ repel: ["#ff1814", "#ff1612", "#ff201c", "#ff0e0a"],
+ off: ["#303030", "#454545", "#3b3b3b", "#3d3d3d"],
+ color: ["#303030", "#454545", "#3b3b3b", "#3d3d3d"],
+ properties: {
+ range: null,
+ dragPixels: [],
+ clickCd: 0,
+ targetElems: [],
+ mode: 0,
+ },
+ onSelect: function(){
+ promptInput("Enter the range of this machine:", (input)=>{elements.magnet.range = parseInt(input);}, "Magnet Range", elements.magnet.range);
+ },
+ onClicked: function(pixel, elem){
+ if(pixel.targetElems.includes(elem) && elem != "unknown" && pixel.clickCd <= 0){
+ pixel.targetElems.splice(pixel.targetElems.indexOf(elem), 1);
+ pixel.clickCd = 20;
+ } else if (elem != "unknown" && pixel.clickCd <= 0) {
+ pixel.targetElems.push(elem);
+ pixel.clickCd = 20;
+ }
+ if(elem == "unknown" && pixel.clickCd <= 0){
+ switch(pixel.mode){
+ case 0:
+ pixel.mode = 1; //attract
+ pixel.color = elements.magnet.attract[Math.round(Math.random()*elements.magnet.attract.length)];
+ while(pixel.color == undefined){
+ pixel.color = elements.magnet.attract[Math.round(Math.random()*elements.magnet.attract.length)];
+ }
+ break;
+ case 1:
+ pixel.mode = 2; //repel
+ pixel.color = elements.magnet.repel[Math.round(Math.random()*elements.magnet.repel.length)];
+ while(pixel.color == undefined){
+ pixel.color = elements.magnet.repel[Math.round(Math.random()*elements.magnet.repel.length)];
+ }
+ break;
+ case 2:
+ pixel.mode = 0; //off
+ pixel.color = elements.magnet.off[Math.round(Math.random()*elements.magnet.off.length)];
+ while(pixel.color == undefined){
+ pixel.color = elements.magnet.off[Math.round(Math.random()*elements.magnet.off.length)];
+ }
+ break;
+ default:
+ pixel.mode = 0;
+ pixel.color = elements.magnet.off[Math.round(Math.random()*elements.magnet.off.length)];
+ while(pixel.color == undefined){
+ pixel.color = elements.magnet.off[Math.round(Math.random()*elements.magnet.off.length)];
+ }
+ break;
+ };
+ pixel.clickCd = 20;
+ }
+ },
+ tick: function(pixel){
+ pixel.clickCd -= (pixel.clickCd == 0) ? 0 : 1;
+ if(pixel.range == null){
+ pixel.range = elements.magnet.range;
+ };
+ let range = mouseRange(pixel.x, pixel.y, pixel.range);
+ for(let p of pixel.dragPixels){
+ if(!p.inRange(range) || pixel.mode == 0 || !currentPixels.includes(p) || !pixel.targetElems.includes(p.element)){
+ p.drag = false;
+ pixel.dragPixels.splice(pixel.dragPixels.indexOf(p), 1);
+ } else {
+ switch(pixel.mode){
+ case 1:
+ let dX = pixel.x-p.x, dY = pixel.y-p.y;
+ tryMove(p, p.x+Math.sign(dX), p.y+Math.sign(dY), null, true);
+ break;
+ case 2:
+ let dx = p.x-pixel.x, dy = p.y-pixel.y;
+ tryMove(p, p.x+Math.sign(dx), p.y+Math.sign(dy), null, true);
+ break;
+ }
+ }
+ };
+ for(let coords of range){
+ let p2 = getPixel(coords[0], coords[1]);
+ if(p2 != null && pixel.targetElems.includes(p2.element) && pixel.mode != 0 && !pixel.dragPixels.includes(p2)){
+ p2.drag = true;
+ pixel.dragPixels.push(p2);
+ }
+ }
+ },
+ dataInFunc: function(pixel, value){
+ if(value.includes(":")){
+ let valueArr = value.split(":");
+ if(Array.isArray(elements[pixel.element].properties[valueArr[0]]) && !pixel[valueArr[0]].includes(valueArr[1])){
+ pixel[valueArr[0]].push(valueArr[1]);
+ } else if(!Array.isArray(elements[pixel.element].properties[valueArr[0]])){
+ pixel[valueArr[0]] = (Number.isInteger(pixel[valueArr[0]])) ? parseInt(valueArr[1]) : valueArr[1];
+ }
+ }
+ }
+ }
+ elements.liquid_sulfur_trioxide = {
+ density: 1920,
+ color: ["#fffdc7", "#fffdcc", "#f7f6da", "#f5f3bc"],
+ behavior: behaviors.LIQUID,
+ state: "liquid",
+ category: "states",
+ reactions: {
+ plant: {elem1: null, elem2: "dead_plant"},
+ fruit_leaves: {elem1: null, elem2: "dead_plant"},
+ fruit_branch: {elem1: null, elem2: "wood"},
+ tree_branch: {elem1: null, elem2: "wood"},
+ fruit_vine: {elem1: null, elem2: "dead_plant"},
+ low_fruit_vine: {elem1: null, elem2: "dead_plant"},
+ water: {elem1: null, elem2:"sulfuric_acid"},
+ quicklime: {elem1: null, elem2: "hardened_gypsum"},
+ },
+ tick: function(pixel){
+ for(let coords of adjacentCoords){
+ let x = pixel.x+coords[0], y = pixel.y+coords[1];
+ let p2 = getPixel(x,y);
+ if(p2 != null && eLists.ANIMAL.includes(p2.element)){
+ if(p2.element == "rat"){
+ deletePixel(pixel.x,pixel.y);
+ changePixel(p2, "rotten_meat");
+ } else {
+ deletePixel(pixel.x,pixel.y);
+ changePixel(p2, "dead_bug");
+ }
+ } else if (p2 != null && eLists.CLEANANIMAL.includes(p2.element)){
+ if(["frog", "tadpole"].includes(p2.element)){
+ deletePixel(pixel.x,pixel.y);
+ changePixel(p2, "rotten_meat");
+ } else {
+ deletePixel(pixel.x,pixel.y);
+ changePixel(p2, "dead_bug");
+ }
+ } else if (p2 != null && eLists.SEEDS.includes(p2.element)){
+ deletePixel(pixel.x,pixel.y);
+ changePixel(p2, "dead_plant");
+ }
+ }
+ },
+ tempLow: 16,
+ stateLow: "sulfur_trioxide",
+ }
+ elements.sulfur_trioxide = {
+ temp: 16,
+ density: 1920,
+ color: ["#fffdc7", "#fffdcc", "#f7f6da", "#f5f3bc"],
+ behavior: behaviors.POWDER,
+ state: "solid",
+ category: "salts",
+ reactions: {
+ plant: {elem1: null, elem2: "dead_plant"},
+ fruit_leaves: {elem1: null, elem2: "dead_plant"},
+ fruit_branch: {elem1: null, elem2: "wood"},
+ tree_branch: {elem1: null, elem2: "wood"},
+ fruit_vine: {elem1: null, elem2: "dead_plant"},
+ low_fruit_vine: {elem1: null, elem2: "dead_plant"},
+ water: {elem1: null, elem2:"sulfuric_acid"},
+ quicklime: {elem1: null, elem2: "hardened_gypsum"},
+ grass: {elem1: null, elem2: "dead_plant"},
+ vine: {elem1: null, elem2: "dead_plant"},
+ evergreen: {elem1: null, elem2: "dead_plant"},
+ },
+ tick: function(pixel){
+ for(let coords of adjacentCoords){
+ let x = pixel.x+coords[0], y = pixel.y+coords[1];
+ let p2 = getPixel(x,y);
+ if(p2 != null && eLists.ANIMAL.includes(p2.element)){
+ if(p2.element == "rat"){
+ deletePixel(pixel.x,pixel.y);
+ changePixel(p2, "rotten_meat");
+ } else {
+ deletePixel(pixel.x,pixel.y);
+ changePixel(p2, "dead_bug");
+ }
+ } else if (p2 != null && eLists.CLEANANIMAL.includes(p2.element)){
+ if(["frog", "tadpole"].includes(p2.element)){
+ deletePixel(pixel.x,pixel.y);
+ changePixel(p2, "rotten_meat");
+ } else {
+ deletePixel(pixel.x,pixel.y);
+ changePixel(p2, "dead_bug");
+ }
+ } else if (p2 != null && eLists.SEEDS.includes(p2.element)){
+ deletePixel(pixel.x,pixel.y);
+ changePixel(p2, "dead_plant");
+ }
+ }
+ },
+ tempHigh: 17,
+ stateHigh: "liquid_sulfur_trioxide",
+ }
+ elements.sulfur.burnInto = "liquid_sulfur_trioxide", elements.molten_sulfur.burnInto = "liquid_sulfur_trioxide", elements.sulfur_gas.burnInto = "liquid_sulfur_trioxide";
+
+ /*Inspired by the bismuth element from nousersthings.js*/
+ elements.bismuth = {
+ color: ["#d4d4d4", "#d6d6d6", "#dedede", "#d9d9d9", "#dbdbd5"],
+ tempHigh: 271,
+ stateHigh: "molten_bismuth",
+ category: "solids",
+ state: "solid",
+ density: 9807,
+ }
+
+ elements.molten_bismuth = {
+ color: ["#d4d4d4", "#d6d6d6", "#dedede", "#d9d9d9", "#dbdbd5"],
+ category: "states",
+ state: "liquid",
+ behavior: behaviors.MOLTEN,
+ tick: function(pixel){
+ if(pixel.temp > 250 && pixel.temp < 270){
+ chance = 0.000075-(Math.min((pixel.temp-250)/20, 0)*0.00005);
+ if(Math.random() 0){
+ let lowestIndex = positions.indexOf(Math.min(...positions));
+ let newPos = positions[lowestIndex]+1;
+ let coords = coordsArr[lowestIndex], colors = pixelMap[coords[0]][coords[1]].colorArr || [
+ {r:255, g:127, b:0},
+ {r: 255, g:200, b:0},
+ {r: 255, g:255, b:0},
+ {r:0, g:255, b:0},
+ {r:0, g:255, b:255},
+ {r:0, g:0, b:255},
+ {r:255, g:0, b:255},
+ {r:255, g:0, b:70},
+ {r:255, g:105, b:0},
+ ];
+ let current = ((newPos%11)/10)*colors.length;
+ let currentIndex = Math.floor(current);
+ let d = current-currentIndex;
+ let c1 = colors[currentIndex%colors.length], c2 = colors[(currentIndex+1)%colors.length];
+ changePixel(pixel, "bismuth");
+ pixel.crystallized = true;
+ pixel.position = newPos;
+ let num = 207 + (Math.round(Math.random()*12)-6);
+ let rgb = getRGB(interpolateRgb(c1, c2, d));
+ rgb.r = Math.round(rgb.r*(num/255)), rgb.g = Math.round(rgb.g*(num/255)), rgb.b = Math.round(rgb.b*(num/255));
+ pixel.color = normalize(rgb);
+ }
+ }
+
+ }
+ },
+ tempLow: 250,
+ stateLow: "bismuth",
+ temp: 270,
+ };
+}, true);
diff --git a/mods/nature_Mod.js b/mods/nature_Mod.js
new file mode 100644
index 00000000..3ed17b16
--- /dev/null
+++ b/mods/nature_Mod.js
@@ -0,0 +1,1384 @@
+
+//P.S. I had to study A LOT to find this information, so please credit me if you include any code from this mod.
+//mod includes code by a-ReaL-EngInEer, do not steal without this text.
+elements.fly.behavior = [["XX","XX","XX"], ["XX","CH:female_green_bottle_fly,male_green_bottle_fly,crawl_fruitfly","XX"], ["XX","XX","XX"]];
+elements.hyphae.behavior = [["CH:dirt>hyphae,hyphae,mycelium%0.05","CR:fungi%0.5,","CH:dirt>hyphae,hyphae,mycelium%0.05"], ["CH:dirt>hyphae,hyphae,mycelium%0.05","CH:dirt%0.05","CH:dirt>hyphae,hyphae,mycelium%0.05"], ["CH:dirt>hyphae,hyphae,mycelium%0.05","CH:dirt>hyphae,hyphae,mycelium%0.05","CH:dirt>hyphae,hyphae,mycelium%0.05"]];
+elements.rotten_meat.behavior = [["XX","XX","XX"], ["XX","CH:infested_meat","XX"], ["XX","XX","XX"]];
+elements.tornado.category = "gases"
+elements.mushroom_gill.breakInto = "fungi"
+elements.slime.stain = 0
+elements.rock_wall.hardness = 0.95
+elements.dead_bug.behavior = [["XX","XX","XX"], ["XX","CH:dead_arthropod","XX"], ["XX","XX","XX"]];
+elements.meat.behavior = [["XX","XX","XX"], ["SP","CH:rotten_meat%0.5","SP"], ["XX","M1","XX"]];
+elements.ant.behavior = [["XX","XX","XX"], ["XX","CH:worker_leafcutter_ant,queen_leafcutter_ant","XX"], ["XX","XX","XX"]];
+elements.primordial_soup.behavior = [["XX","CR:foam%2","XX"], ["M2%50","CH:algae,cell,mushroom_spore,fungi,giant_puffball_mushroom_cap,bold_jumping_spider_eggsac,ant,bug,meadow_mushroom_spore,lichen,yeast,moss,green_bottle_fly_larva,antibody,cellulose,seltzer,oxygen%0.0075","M2%50"], ["M1","M1","M1"]];
+//XX|CR:foam%2|XX;M2|CH:algae,cell,mushroom_spore,lichen,yeast,antibody,cellulose,seltzer,oxygen%0.005|M2;M1|M1|M1
+var food = ["meat","rotten_meat","cooked_meat","salt","sugar","flour","broth","yolk","hard_yolk","dough","batter","butter","cheese","rotten_cheese","cheese_powder","chocolate","chocolate_powder","grape","herb","lettuce","pickle","tomato","sauce","pumpkin","corn","popcorn","potato","baked_potato","mashed_potato"];
+
+
+
+elements.weather = {
+ color: "#7A9CE1",
+ excludeRandom: false,
+ behavior: [["M1","M2 AND CR:flash,electric,water%0.05 AND CR:cloud,rain_cloud,snow_cloud,steam%0.07 AND CR:thunder_cloud,hail_cloud,tornado%0.03","M1"],["M2","XX","M2"],["M1%0.1","M2","M1%0.1"]],
+ category: "ecosystem",
+ state: "gas",
+},
+
+elements.moss = {
+ color: ["#6B7A1A", "#60742E", "#5E823C"],
+ excludeRandom: false,
+ behavior: [
+ ["XX","SA","XX"],
+ ["SA AND CL%0.2","XX","SA AND CL%0.2"],
+ ["M1","M1 AND SA","M1"]
+],
+category: "ecosystem",
+state: "solid",
+tempHigh: 55,
+stateHigh: "grass",
+tempLow: -20,
+stateLow: "ice"
+},
+
+elements.female_green_bottle_fly = {
+ alias: "Lucilia sericata",
+ color: "#474f48",
+ excludeRandom: false,
+ behavior: [["M1%20 AND ST:web","XX","M1%20 AND ST:web"],["M1%20 AND ST:web","CH:female_green_bottle_fly>dead_arthropod%0.01 AND CH:crawl_female_green_bottle_fly%0.06","M1%20 AND ST:web"],["M1%20 AND ST:web","ST:web AND CH:food>undefined,green_bottle_fly_egg%0.1","M1%20 AND ST:web"]],
+ category: "ecosystem",
+ state: "solid",
+ breakInto: "injured_female_green_bottle_fly",
+ reactions: {
+ "disinfectant": { elem1: "dead_arthropod", elem2: "ammonia", elem3: "stench"},
+ "web": { elem1:"dead_arthropod"}
+ },
+ density:35,
+ burn: .01,
+ burnTime: 150,
+ burnInto: ["dead_arthropod","dirt"],
+ tempHigh: 100,
+ stateHigh:"dead_arthropod",
+ tempLow: 10,
+ stateLow: "ice",
+},
+
+elements.male_green_bottle_fly = {
+ alias: "Lucilia sericata",
+ color: "#4B4B4B",
+ excludeRandom: false,
+ behavior: [["M1 AND ST:web","M2 AND ST:web","M1 AND ST:web"],["M2 AND ST:web","CH:dead_arthropod%0.01 AND CH:crawl_male_green_bottle_fly%0.06","M2 AND ST:web"],["M1 AND ST:web","M2 AND ST:web AND CH:food>undefined","M1 AND ST:web"]],
+ category: "ecosystem",
+ breakInto:"injured_male_green_bottle_fly",
+ state: "solid",
+ density: 30,
+ burn: .01,
+ burnTime: 150,
+ burnInto: ["dead_arthropod","dirt"],
+ reactions: {
+ "disinfectant": { elem1: "dead_arthropod", elem2: "dead_arthropod"},
+ "web": { elem1:"dead_arthropod"}
+ }
+},
+
+elements.green_bottle_fly_egg = {
+ color: "#E2EAF4",
+ excludeRandom: false,
+ behavior: [["XX","ST","XX"],["ST","CH:green_bottle_fly_larva%0.036","ST"],["M1","M1 AND ST","M1"]],
+ category: "ecosystem",
+ state: "solid",
+ breakInto: ["slime","green_bottle_fly_larva","female_green_bottle_fly"],
+ reactions: {
+ "disinfectant": { elem1: "dead_arthropod", elem2: "ammonia", elem3: "stench"},
+ }
+},
+
+elements.green_bottle_fly_larva = {
+ color: "#F0EEE8",
+ alias: "Lucilia sericata Larva",
+ excludeRandom: false,
+ behavior: [["M2%10 AND SA%50","SA%50 AND SW: green_bottle_fly_larva,green_bottle_fly_egg,meat,rotten_meat,infested_meat%0.1","M2%10 AND SA%50"],["M2%50 AND CH:food,garbage_juice,banana,mashed_banana,rotten_banana>stench,stench,stench,plague%0.1 AND CH:meat,rotten_meat,fat,broth,grease>undefined","CC: #F9E6D4%0.08 AND CH:green_bottle_fly_pupae%0.05,CR:stench%10","M2%50 AND CH:meat,rotten_meat,infested_meat,cheese,melted_cheese,cheese_powder,rotten_cheese,bread,crumb,toast,banana,mashed_banana,rotten_banana>stench,plaque%0.1 AND CH:meat,rotten_meat,fat,broth,grease>undefined"],["M1%1 AND CH:meat>rotten_meat%1","M1 AND CH:meat,rotten_meat,infested_meat,cheese,melted_cheese,cheese_powder,rotten_cheese,bread,crumb,toast,>stench,plaque AND CH:cheese,cheese_powder,melted_cheese>rotten_cheese AND CH:meat,rotten_meat,fat,broth,grease>undefined","M1%1"]],
+ category: "ecosystem",
+ state: "solid",
+ breakInto: "slime",
+ breakIntoColor: "#f1efe9",
+ density: 150,
+ tempHigh: 80,
+ stateHigh: "female_green_bottle_fly",
+ reactions: {
+ "disinfectant": { elem1: "stench", elem2: "ammonia", elem3: "stench"},
+ }
+},
+
+elements.green_bottle_fly_pupae = {
+ alias: "Lucilia sericata pupae",
+ color: "#B1834D",
+ breakInto:"slime",
+ breakIntoColor: "#D4A930",
+ excludeRandom: false,
+ behavior: [["XX","SP","XX"],["SP","CH:crawl_male_green_bottle_fly,crawl_female_green_bottle_fly%0.006 AND CC:#5D5247%0.01","SP"],["M1","M1","M1"]],
+ category: "ecosystem",
+ density: 80,
+ state: "solid",
+ reactions:{
+ "disinfectant": {elem1:"mold", elem2:"dead_arthropod", elem3:"dirt"}
+ }
+},
+
+elements.crawl_male_green_bottle_fly = {
+ alias: "Lucilia sericata",
+ color: "#5D5247",
+ excludeRandom: false,
+ behavior: [["M2%0.5 AND ST:web","XX","M2%0.5 AND ST:web"],["M2%1 AND CH:meat,rotten_meat,fat,broth,grease>undefined","CH:male_green_bottle_fly%0.06","M2%1 AND CH:meat,rotten_meat,fat,broth,grease>undefined"],["ST:web","M1 AND CH:meat,rotten_meat,fat,broth,grease>undefined","ST:web"]],
+ category: "ecosystem",
+ breakInto:"injured_male_green_bottle_fly",
+ density:30,
+ state: "solid",
+ reactions:{
+ "disinfectant": {elem1:"mold", elem2:"dead_arthropod", elem3:"dirt"}
+ }
+},
+
+elements.crawl_female_green_bottle_fly = {
+ alias: "Lucilia sericata",
+ color: "#5D5247",
+ excludeRandom: false,
+ behavior: [["M2%0.5 AND ST:web","XX","M2%0.5 AND ST:web"],["M2%1 AND CH:meat,rotten_meat,fat,broth,grease>undefined AND CR:green_bottle_fly_egg%0.05","CH:female_green_bottle_fly%0.06","M2%1 AND CH:meat,rotten_meat,fat,broth,grease>undefined AND CR:green_bottle_fly_egg%0.1"],["ST:web","M1 AND CH:meat,rotten_meat,fat,broth,grease>undefined","ST:web"]],
+ category: "ecosystem",
+ breakInto:"injured_female_green_bottle_fly",
+ state: "solid",
+ reactions:{
+ "disinfectant": {elem1:"mold", elem2:"dead_arthropod", elem3:"dirt"}
+ }
+},
+
+elements.injured_male_green_bottle_fly = {
+ alias: "Lucilia sericata",
+ color: "#5D5247",
+ excludeRandom: false,
+ behavior: [["M2%0.5 AND ST:web","XX","M2%0.5 AND ST:web"],["M2%1 AND CH:meat,rotten_meat,fat,broth,grease>undefined","CH:dead_arthropod%0.01","M2%1 AND CH:meat,rotten_meat,fat,broth,grease>undefined"],["ST:web","M1 AND CH:meat,rotten_meat,fat,broth,grease>undefined","ST:web"]],
+ category: "ecosystem",
+ breakInto:"slime",
+ breakIntoColor: "#D4A930",
+ density:30,
+ state: "solid",
+ reactions:{
+ "disinfectant": {elem1:"mold", elem2:"dead_arthropod", elem3:"dirt"}
+ }
+},
+
+elements.injured_female_green_bottle_fly = {
+ alias: "Lucilia sericata",
+ color: "#5D5247",
+ excludeRandom: false,
+ behavior: [["M2%0.5 AND ST:web","XX","M2%0.5 AND ST:web"],["CR:green_bottle_fly_egg%1 AND M2%1 AND CH:meat,rotten_meat,fat,broth,grease>undefined","CH:dead_arthropod%0.01","M2%1 AND CH:meat,rotten_meat,fat,broth,grease>undefined AND CR:green_bottle_fly_egg%1"],["ST:web","M1 AND CH:meat,rotten_meat,fat,broth,grease>undefined","ST:web"]],
+ category: "ecosystem",
+ breakInto:"green_bottle_fly_egg",
+ breakIntoColor: "#D4A930",
+ density:30,
+ state: "solid",
+ reactions:{
+ "disinfectant": {elem1:"mold", elem2:"dead_arthropod", elem3:"dirt"}
+ }
+},
+
+elements.female_fruitfly = {
+ color: "#EEC758",
+ alias: "Drosophila Melanogaster",
+ excludeRandom: false,
+ behavior: [["M1%20","SW:grape,juice,fruit_milk,banana,mashed_banana,rotten_banana,dirt,mold%10","M1%20"],["M1%20","CH:female_fruitfly>dead_arthropod%0.01","M1%20"],["M1%20","CR:fruitfly_egg%0.06","M1%20"]],
+ category: "ecosystem",
+ state: "solid",
+ breakInto: ["dead_arthropod","fruitfly_egg"],
+ reactions: {
+ "disinfectant": { elem1: "dead_arthropod", elem2: "dead_arthropod", elem3: "stench"},
+ },
+ burn: .01,
+ burnTime: 10,
+ burnInto:["dead_arthropod","dirt"],
+ tempHigh: 100,
+ stateHigh:"dead_arthropod",
+ tempLow: 10,
+ stateLow: "ice",
+},
+
+elements.male_fruitfly = {
+ color: "#D4A930",
+ alias: "Drosophila Melanogaster",
+ excludeRandom: false,
+ behavior: [["M1","M2 AND SW:grape,juice,fruit_milk,banana,mashed_banana,rotten_banana,dirt,mold%10","M1"],["M2","CH:dead_arthropod%0.01","M2"],["M1","M2","M1"]],
+ category: "ecosystem",
+ breakInto:"dead_bug",
+ burn: .01,
+ burnTime: 10,
+ burnInto:["dead_arthropod","dirt"],
+ state: "solid",
+ reactions: {
+ "disinfectant": { elem1: "dead_arthropod", elem2: "dead_arthropod"},
+ }
+},
+
+elements.fruitfly_egg = {
+ color: "#E2EAF4",
+ alias: "Drosophila Melanogaster Egg",
+ excludeRandom: false,
+ behavior: [["XX","ST","XX"],["ST","CH:fruitfly_larva%0.018","ST"],["M1","M1 AND ST","M1"]],
+ category: "ecosystem",
+ state: "solid",
+ breakInto: ["slime","green_bottle_fly_larva","female_fruitfly"],
+ reactions: {
+ "disinfectant": { elem1: "plague", elem2: "slime", elem3: "stench"},
+ }
+},
+
+elements.fruitfly_larva = {
+ color: "#F0EEE8",
+ alias: "Drosophila Melanogaster Larva",
+ excludeRandom: false,
+ behavior: [["M2%10 AND SA%50 AND SW:grape,juice,fruit_milk,banana,mashed_banana,rotten_banana%10","SA%50","M2%10 AND SA%50 AND SW:grape,juice,fruit_milk,banana,mashed_banana,rotten_banana"],["M2%50 AND CH:cheese,melted_cheese,cheese_powder,rotten_cheese,bread,crumb,toast,grape,banana,mashed_banana,rotten_banana>stench,stench,stench,plague%0.1","CH:fruitfly_pupae%0.05,CR:stench%10","M2%50 AND CH:cheese,melted_cheese,cheese_powder,rotten_cheese,bread,crumb,toast,grape,banana>stench,plaque%0.1"],["M1 AND CH:banana>rotten_banana%1 AND SW:grape,juice,banana,mashed_banana,rotten_banana","M1 AND CH:cheese,melted_cheese,cheese_powder,rotten_cheese,bread,crumb,toast,grape,banana>stench,plaque%0.1 AND CH:cheese,cheese_powder,melted_cheese>rotten_cheese AND CH:banana>rotten_banana,mashed_banana%0.01","M1 AND SW:grape,juice,banana,mashed_banana,rotten_banana"]],
+ category: "ecosystem",
+ state: "solid",
+ stain:0.2,
+ breakInto: "slime",
+ breakIntoColor: "#f8f6f0",
+ tempHigh: 80,
+ stateHigh: "female_fruitfly",
+ reactions: {
+ "disinfectant": { elem1: "stench", elem2: "plague", elem3: "stench"},
+ }
+},
+
+elements.fruitfly_pupae = {
+ color: "#CBAD91",
+ alias: "Drosophila Melanogaster pupae",
+ breakInto:"slime",
+ breakIntoColor: "#D4A930",
+ excludeRandom: false,
+ behavior: [["XX","SP","XX"],["SP","CH:crawl_fruitfly%0.06 AND CH:dead_arthropod%0.006 AND CC:#5D5247%0.01","SP"],["M1","M1","M1"]],
+ category: "ecosystem",
+ state: "solid"
+},
+
+elements.crawl_fruitfly = {
+ alias: "Drosophila Melanogaster",
+ color: "#64571c",
+ breakInto:"slime",
+ breakIntoColor: "#D4A930",
+ excludeRandom: false,
+ behavior: [["XX","XX","XX"],["M2%2","CH:male_fruitfly,female_fruitfly%0.004","M2%2"],["M1","M1","M1"]],
+ category: "ecosystem",
+ state: "solid",
+
+},
+
+elements.worker_leafcutter_ant = {
+ alias: "Atta Cephalotes",
+ color: "#7b370c",
+ desc:"This species of ant is special because it can farm mushrooms and leaves, and turn them into ant bread.",
+ excludeRandom: false,
+ behavior: [["ST:web","SW:ant_wall%5 AND M2%5","ST:web"],["M2 AND CH:grape,banana,mashed_banana,rotten_banana,juice,yeast>undefined%2%2 AND SW:dirt,sand,ant_wall%2 AND CH:dirt,sand>mushroom_spore%0.01","CH:dead_arthropod%0.006","M2 AND Ch:dirt,sand>mushroom_spore%0.1 AND CH:grape,banana,mashed_banana,rotten_banana,juice,yeast>undefined%2%2 AND SW:ant_wall%5"],["ST:web AND M2%75 AND Ch:dirt,sand,ant_wall,ant_wall,ant_wall>sand,sand,ant_wall AND CH:plant,mushroom_spore,mushroom_stalk,mushroom_gill,mushroom_cap,hyphae,lichen,mycelium,corn_seed,flower_seed,grass_seed,pumpkin_seed,wheat_seed,potato_seed,yeast,fertilized_banana_seed>bread,crumb,undefined,yeast","M1 AND CH:meat,rotten_meat,fat,broth,grease>undefined AND CH:dirt,sand>undefined,ant_wall,ant_wall AND CH:plant,mushroom_spore,mushroom_stalk,mushroom_gill,mushroom_cap,hyphae,lichen,mycelium,corn_seed,flower_seed,grass_seed,pumpkin_seed,wheat_seed,potato_seed>bread,crumb,undefined AND SW:ant_wall%5","ST:M2%75 AND CH:dirt,sand>undefined,ant_wall,ant_wall AND CH:mushroom_spore,mushroom_stalk,mushroom_gill,mushroom_cap,hyphae,lichen,mycelium,corn_seed,flower_seed,grass_seed,pumpkin_seed,wheat_seed,potato_seed>bread,crumb,undefined"]],
+ category: "ecosystem",
+ breakInto:"dead_arthropod",
+ density:30,
+ state: "solid",
+ reactions:{
+ "disinfectant": {elem1:"mold", elem2:"dead_arthropod", elem3:"dirt"}
+ }
+},
+
+elements.queen_leafcutter_ant = {
+ alias: "Atta Cephalotes",
+ color: "#9f3e06",
+ desc:"This species of ant is special because it can farm mushrooms and leaves, and turn them into ant bread.",
+ excludeRandom: false,
+ behavior: [["ST:web","SW:ant_wall%5 AND M2%5","ST:web"],["M2%2 AND CH:grape,banana,mashed_banana,rotten_banana,juice,yeast>undefined%2 AND SW:dirt,sand,ant_wall%2","CH:dead_arthropod%0.006 AND SW:ant_wall%5","M2%2 AND CH:grape,banana,mashed_banana,rotten_banana,juice,yeast>undefined%2 AND SW:ant_wall%5"],["ST:web AND M2%75 AND CH:plant,mushroom_spore,mushroom_stalk,mushroom_gill,mushroom_cap,hyphae,lichen,mycelium,corn_seed,flower_seed,grass_seed,pumpkin_seed,wheat_seed,potato_seed,yeast,fertilized_banana_seed>bread,crumb,undefined,yeast","M1 AND CH:meat,rotten_meat,fat,broth,grease>undefined AND CH:plant,mushroom_spore,mushroom_stalk,mushroom_gill,mushroom_cap,hyphae,lichen,mycelium,corn_seed,flower_seed,grass_seed,pumpkin_seed,wheat_seed,potato_seed>bread,crumb,undefined AND CH:bread,crumb,yeast>leafcutter_ant_egg AND SW:ant_wall%5","ST:M2%75 AND CH:mushroom_spore,mushroom_stalk,mushroom_gill,mushroom_cap,hyphae,lichen,mycelium,corn_seed,flower_seed,grass_seed,pumpkin_seed,wheat_seed,potato_seed>bread,crumb,undefined"]],
+ category: "ecosystem",
+ breakInto:"dead_arthropod",
+ density:30,
+ state: "solid",
+ reactions:{
+ "disinfectant": {elem1:"mold", elem2:"dead_arthropod", elem3:"dirt"}
+ }
+},
+
+elements.leafcutter_ant_egg = {
+ color: "#E2EAF4",
+ alias: "Atta Cephalotes Egg",
+ excludeRandom: false,
+ behavior: [["XX","ST","XX"],["ST","CH:leafcutter_ant_larva%0.018","ST"],["M1","M1 AND ST","M1"]],
+ category: "ecosystem",
+ state: "solid",
+ breakInto: ["slime","green_bottle_fly_larva","female_fruitfly"],
+ reactions: {
+ "disinfectant": { elem1: "plague", elem2: "stench", elem3: "stench"},
+ },
+},
+
+elements.leafcutter_ant_larva = {
+ color: "#FAEFE9",
+ alias: "Atta Cephalotes Larva",
+ excludeRandom: false,
+ behavior: [["M2%10 AND SA%50 AND SW:grape,juice,fruit_milk,banana,mashed_banana,rotten_banana,ant_wall%10","SA%50","M2%10 AND SA%50 AND SW:grape,juice,fruit_milk,banana,mashed_banana,rotten_banana,ant_wall"],["M2%50 AND CH:cheese,melted_cheese,cheese_powder,rotten_cheese,bread,crumb,toast,grape,banana,mashed_banana,rotten_banana>stench,stench,plague%0.1 AND CH:plant,mushroom_spore,mushroom_stalk,mushroom_gill,mushroom_cap,hyphae,lichen,mycelium,corn_seed,flower_seed,grass_seed,pumpkin_seed,wheat_seed,potato_seed,yeast,fertilized_banana_seed>bread,crumb,undefined,yeast","CH:leafcutter_ant_pupae%0.05,CR:stench%10","M2%50 AND CH:cheese,melted_cheese,cheese_powder,rotten_cheese,bread,crumb,toast,grape,banana>stench,plaque%0.1 AND CH:plant,mushroom_spore,mushroom_stalk,mushroom_gill,mushroom_cap,hyphae,lichen,mycelium,corn_seed,flower_seed,grass_seed,pumpkin_seed,wheat_seed,potato_seed,yeast,fertilized_banana_seed>bread,crumb,undefined,yeast"],["M1%1 AND CH:banana>undefined%1 AND CH:plant,mushroom_spore,mushroom_stalk,mushroom_gill,mushroom_cap,hyphae,lichen,mycelium,corn_seed,flower_seed,grass_seed,pumpkin_seed,wheat_seed,potato_seed,yeast,fertilized_banana_seed>bread,crumb,undefined,yeast AND CH:bread,yeast>undefined%10 AND SW:grape,juice,banana,mashed_banana,rotten_banana","M1 AND CH:bread,yeast>undefined%10 AND CH:cheese,melted_cheese,cheese_powder,rotten_cheese,bread,crumb,toast,grape,banana>stench,plaque%0.1 AND CH:plant,mushroom_spore,mushroom_stalk,mushroom_gill,mushroom_cap,hyphae,lichen,mycelium,corn_seed,flower_seed,grass_seed,pumpkin_seed,wheat_seed,potato_seed,yeast,fertilized_banana_seed>bread,crumb,undefined,yeast AND CH:cheese,cheese_powder,melted_cheese>rotten_cheese AND CH:banana>rotten_banana,mashed_banana%0.01","M1%1 AND CH:bread,yeast>undefined%10 AND SW:grape,juice,banana,mashed_banana,rotten_banana"]],
+ category: "ecosystem",
+ state: "solid",
+ breakInto: "slime",
+ breakIntoColor: "#f8f6f0",
+ tempHigh: 80,
+ stateHigh: "worker_leafcutter_ant",
+ reactions: {
+ "disinfectant": { elem1: "stench", elem2: "plague", elem3: "stench"},
+ }
+},
+
+elements.leafcutter_ant_pupae = {
+ color: "#b95c3d",
+ alias: "Atta Cephalotes pupae",
+ breakInto:"slime",
+ breakIntoColor: "#d46f30ff",
+ excludeRandom: false,
+ behavior: [["XX","SP","XX"],["SP","CH:worker_leafcutter_ant%0.006 AND CC:#903e22%0.01","SP"],["M1","M1","M1"]],
+ category: "ecosystem",
+ state: "solid"
+},
+
+elements.female_ladybird_beetle = {
+ alias: ["Coccinellidae"],
+ color: ["#AA4936","#711D0D","#851C00"],
+ excludeRandom: false,
+ behavior: [["M1%20 AND ST:web","XX","M1%20 AND ST:web"],["M1%20 AND ST:web","CH:female_ladybird_beetle>dead_arthropod%0.01 AND CH:crawl_female_ladybird_beetle%0.06","M1%20 AND ST:web"],["M1%20 AND ST:web","CR:ladybird_beetle_egg%0.06 AND ST:web AND CH:pollen>undefined,ladybird_beetle_egg%0.1","M1%20 AND ST:web"]],
+ category: "ecosystem",
+ state: "solid",
+ breakInto: "dead_arthropod",
+ breakIntoColor:"#ba4933",
+ reactions: {
+ "disinfectant": { elem1: "dead_arthropod", elem2: "ammonia", elem3: "stench"},
+ "web": { elem1:"dead_arthropod"}
+ },
+ density:35,
+ burn: .01,
+ burnTime: 150,
+ burnInto: ["dead_arthropod","dirt"],
+ tempHigh: 100,
+ stateHigh:"dead_arthropod",
+ tempLow: 10,
+ stateLow: "ice",
+},
+
+elements.male_ladybird_beetle = {
+ alias: ["Coccinellidae"],
+ color: ["#AA4936","#711D0D","#851C00"],
+ excludeRandom: false,
+ behavior: [["M1 AND ST:web","XX","M1 AND ST:web"],["M1%20 AND ST:web","CH:male_ladybird_beetle>dead_arthropod%0.01 AND CH:crawl_male_ladybird_beetle%0.06","M1%20 AND ST:web"],["M1% AND ST:web","ST:web AND CH:meat,rotten_meat,fat,broth,grease>undefined,dirt%0.1","M1 AND ST:web"]],
+ category: "ecosystem",
+ state: "solid",
+ breakInto: "dead_arthropod",
+ breakIntoColor:"#ba4933",
+ reactions: {
+ "disinfectant": { elem1: "dead_arthropod", elem2: "ammonia", elem3: "stench"},
+ "web": { elem1:"dead_arthropod"}
+ },
+ density:35,
+ burn: .01,
+ burnTime: 150,
+ burnInto: ["dead_arthropod","dirt"],
+ tempHigh: 100,
+ stateHigh:"dead_arthropod",
+ tempLow: 10,
+ stateLow: "ice",
+},
+
+elements.crawl_male_ladybird_beetle = {
+ alias: ["Coccinellidae"],
+ color: ["#AA4936","#711D0D","#851C00"],
+ excludeRandom: false,
+ behavior: [["M2%1 AND ST:web","XX","M2%1 AND ST:web"],["M2%1 AND ST:web","CH:crawl_male_ladybird_beetle>male_ladybird_beetle%0.01 AND CH:crawl_male_ladybird_beetle%0.06","M2%1 AND ST:web"],["M1%10 AND ST:web","M1 AND ST:web AND CH:meat,rotten_meat,fat,broth,grease>undefined,dirt%0.1","M1%10 AND ST:web"]],
+ category: "ecosystem",
+ state: "solid",
+ breakInto: "dead_arthropod",
+ breakIntoColor:"#ba4933",
+ reactions: {
+ "disinfectant": { elem1: "dead_arthropod", elem2: "ammonia", elem3: "stench"},
+ "web": { elem1:"dead_arthropod"}
+ },
+ density:35,
+ burn: .01,
+ burnTime: 150,
+ burnInto: ["dead_arthropod","dirt"],
+ tempHigh: 100,
+ stateHigh:"dead_arthropod",
+ tempLow: 10,
+ stateLow: "ice",
+},
+
+elements.crawl_female_ladybird_beetle = {
+ alias: ["Coccinellidae"],
+ color: ["#AA4936","#711D0D","#851C00"],
+ excludeRandom: false,
+ behavior: [["M2%1 AND ST:web","XX","M2%1 AND ST:web"],["M2%1 AND ST:web","CH:crawl_female_ladybird_beetle>female_ladybird_beetle%0.01 AND CH:crawl_male_ladybird_beetle%0.06","M2%1 AND ST:web"],["M1%10 AND ST:web","M1 AND ST:web AND CH:meat,rotten_meat,fat,broth,grease>undefined,dirt%0.1","M1%10 AND ST:web"]],
+ category: "ecosystem",
+ state: "solid",
+ breakInto: "dead_arthropod",
+ breakIntoColor:"#ba4933",
+ reactions: {
+ "disinfectant": { elem1: "dead_arthropod", elem2: "ammonia", elem3: "stench"},
+ "web": { elem1:"dead_arthropod"}
+ },
+ density:35,
+ burn: .01,
+ burnTime: 150,
+ burnInto: ["dead_arthropod","dirt"],
+ tempHigh: 100,
+ stateHigh:"dead_arthropod",
+ tempLow: 10,
+ stateLow: "ice",
+},
+
+elements.male_springtail = {
+ alias: ["Orchesella cincta"],
+ color: ["#533A4E","#635964","#696280"],
+ excludeRandom: false,
+ behavior: [["M2%1 AND ST:web AND SW:dirt,leaf_litter,hyphae,mycelium,fiber%5 AND CH:dirt,leaf_litter,hyphae,mycelium,fiber>dirt","XX","M2%1 AND ST:web AND SW:dirt,leaf_litter,hyphae,mycelium,fiber%5 AND CH:dirt,leaf_litter,hyphae,mycelium,fiber>dirt"],["M2%1 AND ST:web","CH:male_springtail>dead_arthropod%0.01","M2%1 AND ST:web"],["M1%10 AND ST:web AND SW:dirt,leaf_litter,hyphae,mycelium,fiber %5 AND CH:dirt,leaf_litter,hyphae,mycelium,fiber>dirt","M1 AND ST:web AND CH:mold,dead_arthropod>undefined,dirt%0.1","M1%10 AND ST:web AND SW:dirt,leaf_litter,hyphae,mycelium,fiber%5 AND CH:dirt,leaf_litter,hyphae,mycelium,fiber>dirt"]],
+ category: "ecosystem",
+ state: "solid",
+ breakInto: "dead_arthropod",
+ breakIntoColor:"#676797",
+ reactions: {
+ "disinfectant": { elem1: "dead_arthropod", elem2: "ammonia", elem3: "stench"},
+ "web": { elem1:"dead_arthropod"}
+ },
+ density:35,
+ burn: .01,
+ burnTime: 150,
+ burnInto: ["dead_arthropod","dirt"],
+ tempHigh: 100,
+ stateHigh:"dead_arthropod",
+ tempLow: 0,
+ stateLow: "dead_arthropod",
+},
+
+elements.female_springtail = {
+ alias: ["Orchesella cincta"],
+ color: ["#533A4E","#635964","#696280"],
+ excludeRandom: false,
+ behavior: [["M2%1 AND ST:web AND SW:dirt,leaf_litter,hyphae,mycelium,fiber%5 AND CH:dirt,leaf_litter,hyphae,mycelium,fiber>undefined,springtail_egg%5","XX","M2%1 AND ST:web AND SW:dirt,leaf_litter,hyphae,mycelium,fiber%5 AND CH:dirt,leaf_litter,hyphae,mycelium,fiber>undefined,springtail_egg%5"],["M2%1 AND ST:web","CH:male_springtail>dead_arthropod%0.01","M2%1 AND ST:web"],["M1%10 AND ST:web AND SW:dirt,leaf_litter,hyphae,mycelium,fiber %5 AND CH:dirt,leaf_litter,hyphae,mycelium,fiber>undefined,springtail_egg %5","M1 AND ST:web AND CH:mold,dead_arthropod>undefined,dirt%0.1","M1%10 AND ST:web AND SW:dirt,leaf_litter,hyphae,mycelium,fiber %5 AND CH:dirt,leaf_litter,hyphae,mycelium,fiber>undefined,springtail_egg%5"]],
+ category: "ecosystem",
+ state: "solid",
+ breakInto: "dead_arthropod",
+ breakIntoColor:"#676797",
+ reactions: {
+ "disinfectant": { elem1: "dead_arthropod", elem2: "ammonia", elem3: "stench"},
+ "web": { elem1:"dead_arthropod"}
+ },
+ density:35,
+ burn: .01,
+ burnTime: 150,
+ burnInto: ["dead_arthropod","dirt"],
+ tempHigh: 100,
+ stateHigh:"dead_arthropod",
+ tempLow: 0,
+ stateLow: "dead_arthropod",
+},
+
+elements.springtail_egg = {
+ color: "#8b5b23",
+ excludeRandom: false,
+ behavior: [["XX","ST","XX"],["ST","CH:springtail_larva%0.036","ST"],["M1","M1 AND ST","M1"]],
+ category: "ecosystem",
+ state: "solid",
+ breakInto: ["slime","springtail_larva"],
+ breakIntoColor:"#efe4dc",
+ reactions: {
+ "disinfectant": { elem1: "dead_arthropod", elem2: "ammonia", elem3: "stench"},
+ }
+},
+
+elements.springtail_larva = {
+ color: "#b1890f",
+ alias: "Orchesella cincta Larva",
+ excludeRandom: false,
+ behavior: [["M2%10 AND SA%50 SW:dirt,sand%0.1","SA%50 AND SW: springtail_larva,springtail_egg,leaf_litter%0.1","M2%10 AND SA%50 AND SW:dirt,sand%0.1"],["M2%50 AND CH:leaf_litter>undefined,dirt%0.1 AND CH:hyphae,leaf_litter,mycelium>undefined","CC: #F9E6D4%0.08 AND CH:springtail_pupae%0.05,","M2%50 AND CH:meat,rotten_meat,fat,broth,grease>undefined"],["M1%1 AND CH:meat>rotten_meat%1 AND SW:dirt,sand%0.1","M1 AND CH:meat,rotten_meat,infested_meat,cheese,melted_cheese,cheese_powder,rotten_cheese,bread,crumb,toast,>stench,plaque AND CH:cheese,cheese_powder,melted_cheese>rotten_cheese AND CH:meat,rotten_meat,fat,broth,grease>undefined","M1%1 AND SW:dirt,sand%0.1"]],
+ category: "ecosystem",
+ state: "solid",
+ breakInto: "dirt",
+ density: 150,
+ tempHigh: 80,
+ stateHigh: "female_green_bottle_fly",
+ reactions: {
+ "disinfectant": { elem1: "stench", elem2: "ammonia", elem3: "stench"},
+ }
+},
+
+elements.springtail_pupae = {
+ alias: "Orchesella cincta pupae",
+ color: "#fadbb7",
+ breakInto:"dirt",
+ breakIntoColor: "#ebaf0a",
+ excludeRandom: false,
+ behavior: [["XX","SP","XX"],["SP","CH:male_springtail,female_springtail%0.006 AND CC:#5D5247%0.01","SP"],["M1","M1","M1"]],
+ category: "ecosystem",
+ density: 80,
+ state: "solid",
+ reactions:{
+ "disinfectant": {elem1:"mold", elem2:"dead_arthropod", elem3:"dirt"}
+ }
+},
+
+elements.bold_jumping_spider_eggsac = {
+ color: "#637b99",
+ excludeRandom: false,
+ behavior: [["XX","ST","XX"],["ST","CH:bold_jumping_spiderling%0.07","ST"],["XX","M1 AND ST","XX"]],
+ category: "ecosystem",
+ state: "solid",
+ reactions: {
+ "disinfectant": { elem1: "dead_arthropod", elem2: "oxygen"},
+ }
+},
+
+elements.bold_jumping_spiderling = {
+ color: ["#224045","#393114","#252410"],
+ excludeRandom: false,
+ behavior: [
+ `XX|M2%1|M2%1|M2%1|XX`,
+ `XX|M2%20|XX|M2%20|XX`,
+ `XX|M2%50 AND SW:web%10 AND DE:dead_arthropod,protein,crawl_female_green_bottle_fly,crawl_fruitfly,crawl_female_ladybird_beetle|CH:streamlining_bold_jumping_spider%5 AND L2:molt%0.15 AND C2:male_bold_jumping_spider,female_bold_jumping_spider%0.1|M2%50 AND SW:web%10 AND DE:dead_arthropod,crawl_female_green_bottle_fly,crawl_fruitfly,crawl_female_ladybird_beetle|XX`,
+ `XX|XX|M1|XX|XX`,
+ `XX|XX|XX|XX|XX`
+ ],
+ density: 90,
+ category: "ecosystem",
+ state: "solid",
+ breakInto:"dead_arthropod",
+ reactions: {
+ "disinfectant": { elem1: "streamlining_bold_jumping_spider", elem2: "dead_arthropod", elem3: "bold_jumping_spiderling", elem4: "bold_jumping_spiderling" },
+ }
+},
+
+elements.streamlining_bold_jumping_spider = {
+ color: ["#224539","#393114","#252410"],
+ name:"bold_jumping_spider",
+ excludeRandom: false,
+ behavior: [
+ `XX|XX|XX|XX|M1`,
+ `XX|XX|BO|M1|M1`,
+ `XX|XX|CH:male_bold_jumping_spider,female_bold_jumping_spider%0.1 AND FY%2|M1 AND BO AND FX:0.1|BO`,
+ `XX|XX|XX|XX|XX`,
+ `XX|XX|XX|XX|XX`
+ ],
+ density: 90,
+ category: "ecosystem",
+ state: "solid",
+ breakInto:"dead_arthropod",
+},
+
+elements.male_bold_jumping_spider = {
+ color: ["#224045","#143934","#252410"],
+ excludeRandom: false,
+ behavior: [
+ `XX|M2%1|M2%1|M2%1|XX`,
+ `XX|M2%20|XX|M2%20|XX`,
+ `XX|M2%50 AND SW:web%10 AND DE:dead_arthropod,protein,crawl_female_green_bottle_fly,crawl_fruitfly,crawl_female_ladybird_beetle|r:1 AND L2:web,molt%1 AND CH:dead_arthropod%0.01|M2%50 AND SW:web%10 AND DE:dead_arthropod,crawl_female_green_bottle_fly,crawl_fruitfly,crawl_female_ladybird_beetle|XX`,
+ `XX|XX|M1 AND DE:giant_puffball_cap%5|XX|XX`,
+ `XX|XX|XX|XX|XX`
+ ],
+ density: 90,
+ category: "ecosystem",
+ state: "solid",
+ breakInto:"dead_arthropod",
+},
+
+elements.female_bold_jumping_spider = {
+ color: ["#224045","#603c19","#252410"],
+ excludeRandom: false,
+ behavior: [
+ `XX|M2%1|M2%1|M2%1|XX`,
+ `XX|M2%20|XX|M2%20|XX`,
+ `XX|M2%50 AND SW:web%10|L2:bold_jumping_spider_eggsac%0.07 AND L2:web,molt,bold_jumping_spider_eggsac%1 AND CH:dead_arthropod%0.01 AND r:1|M2%50 AND SW:web%10 AND DE:dead_arthropod,crawl_female_green_bottle_fly,crawl_fruitfly,crawl_female_ladybird_beetle|XX`,
+ `XX|XX|M1 AND DE:giant_puffball_cap%5|XX|XX`,
+ `XX|XX|XX|XX|XX`
+ ],
+ density: 90,
+ category: "ecosystem",
+ state: "solid",
+ breakInto:"dead_arthropod",
+},
+
+
+
+elements.dead_arthropod = {
+ alias:["Dead Bug"],
+ color: "#4B4A4B",
+ excludeRandom: false,
+ behavior: [["XX","XX","XX"],["XX","CH:dirt,protein%0.1","XX"],["M1","M1 AND SA","M1"]],
+ category: "ecosystem",
+ breakInto:"protein",
+ state: "solid",
+ burnInto:["ash","dirt"],
+ density: 90,
+ reactions: {
+ "disinfectant": { elem1: "dirt"},
+ }
+},
+
+elements.protein = {
+ color: ["#bbd3ce","#c3cdaf",],
+ excludeRandom: false,
+ behavior: [["XX","XX","XX"],["SP%20","CH:dirt%0.1 AND DE:2","SP%20"],["M1","M2","M1"]],
+ category: "ecosystem",
+ state: "solid",
+ reactions: {
+ "water": { elem1: "salt_water", elem2: "water", chance:1},
+ }
+},
+
+elements.molt = {
+ color: ["#bbd3ce","#c3cdaf",],
+ excludeRandom: false,
+ behavior: [["XX","XX","XX"],["SP%20","CH:dirt,protein%0.1 AND DE%2","SP%20"],["M1","M2","M1"]],
+ category: "ecosystem",
+ state: "solid",
+ reactions: {
+ "water": { elem1: "dirt", elem2: "mud", elem3:"primordial_soup", chance:0.1},
+ }
+},
+
+elements.leaf_litter = {
+ color: ["#684841","#3D5B07","#2d4814","#006300","#584011","#7a640f","#914732"],
+ excludeRandom: false,
+ behavior: [["XX","XX","XX"],["SP%20","CH:dirt%0.03 AND DE%0.09","SP%20"],["M1","M2","M1"]],
+ category: "ecosystem",
+ state: "solid",
+ reactions: {
+ "water": { elem1: "dirt", elem2: "mud", elem3:"primordial_soup", chance:0.1},
+ }
+},
+
+elements.wood_anemone_seed = {
+ alias:"Anemonoides nemorosa",
+ color: ["#A1BA0C","#ACC11C","#bedd20","#a9be0e"],
+ excludeRandom: false,
+ cooldown:defaultCooldown,
+ behavior: [["XX","M2%2","XX"],["XX","L2:wood_anemone_stem AND C2:wood_anemone_sepal%33","XX"],["XX","M1","XX"]],
+ category: "ecosystem",
+ state: "solid",
+},
+elements.wood_anemone_stem = {
+ alias:"Anemonoides nemorosa",
+ color: ["#A1BA0C","#ACC11C","#5F6D1B","#6B7800"],
+ excludeRandom: false,
+ behavior: [["XX","ST:wood_anemone_stem,wood_anemone_sepal","XX"],["XX","DE:0.05","XX"],["XX","M1 AND CH:dirt,leaf_litter>root","XX"]],
+ category: "ecosystem",
+ breakInto:"fragrance",
+ state: "solid",
+},
+
+elements.wood_anemone_sepal = {
+ alias:"Anemonoides nemorosa",
+ color: ["#A1BA0C","#ACC11C","#5F6D1B","#6B7800"],
+ excludeRandom: false,
+ breakInto:"fragrance",
+ behavior: [["CR:wood_anemone_petal","ST:wood_anemone_stem,wood_anemone_sepal AND CR:wood_anemone_sepal%0.07 AND CR:wood_anemone_pistil","CR:wood_anemone_petal"],["ST:wood_anemone_stem,wood_anemone_sepal","DE:0.05 AND CH:leaf_litter%0.05","ST:wood_anemone_stem,wood_anemone_sepal"],["XX","M1 AND ST:wood_anemone_stem,wood_anemone_sepal","XX"]],
+ category: "ecosystem",
+ state: "solid",
+},
+
+elements.wood_anemone_pistil = {
+ alias:"Anemonoides nemorosa",
+ color: ["#DAB227","#C1A127","#A19C06"],
+ breakInto:"wood_anemone_seed",
+ excludeRandom: false,
+ behavior: [["CR:wood_anemone_petal","CR:pollen,fragrance%0.1","CR:wood_anemone_petal"],["ST:wood_anemone_petal,wood_anemone_sepal","DE:0.05 AND CH:leaf_litter%0.05","ST:wood_anemone_petal,wood_anemone_sepal"],["XX","M1 AND ST:wood_anemone_stem,wood_anemone_sepal","XX"]],
+ category: "ecosystem",
+ state: "solid",
+},
+
+elements.wood_anemone_petal = {
+ alias:"Anemonoides nemorosa",
+ color: ["#EAE3DE","#BCB197","#D6CFC9","#FFFBF6","#EAE3DE","#BEB5AD"],
+ excludeRandom: false,
+ breakInto:"fragrance",
+ behavior: [["XX","ST:wood_anemone_pistil","XX"],["ST:wood_anemone_pistil","DE:0.05 AND CH:leaf_litter%0.05","ST:wood_anemone_pistil"],["ST:wood_anemone_pistil","M1 AND ST:wood_anemone_stem,wood_anemone_pistil","ST:wood_anemone_pistil"]],
+ category: "ecosystem",
+ state: "solid",
+},
+
+elements.conecap_mushroom_spore = {
+ alias:"Conocybe tenera",
+ color: "#B1762D",
+ excludeRandom: false,
+ behavior: [["XX","M2%1.5","XX"],["XX","L2:conecap_mushroom_stalk AND C2:conecap_mushroom_gill","XX"],["M1","M1","M1"]],
+ category: "ecosystem",
+ cooldown: defaultCooldown,
+ state: "solid",
+ reactions: {
+ "water": { elem1: "broth", elem2: "primordial_soup", elem3: "dirty_water", temp:80, chance:0.1},
+ }
+
+},
+
+elements.conecap_mushroom_stalk = {
+ alias:"Conocybe tenera",
+ color: "#E0D3A7",
+ excludeRandom: false,
+ breakInto:"mycelium",
+ behavior: [["XX","SP","XX"],["XX","XX","XX"],["XX","M1 AND CH:dirt,leaf_litter,infested_meat,meat,mud,moss>hyphae%1 AND SP","XX"]],
+ category: "ecosystem",
+ state: "solid",
+ reactions: {
+ "water": { elem1: "broth", elem2: "primordial_soup", elem3: "dirty_water", temp:80, chance:0.1},
+ }
+},
+
+elements.conecap_mushroom_gill = {
+ alias:"Conocybe tenera",
+ color: ["#d2c28f","#A98256"],
+ excludeRandom: false,
+ breakInto:"mycelium",
+ behavior: [["XX","CR:conecap_mushroom_cap%5 AND CR:conecap_mushroom_gill%1","XX"],["SA AND CR:conecap_mushroom_cap%5 AND CR:conecap_mushroom_gill%1","XX","SA AND CR:conecap_mushroom_cap%5 AND CR:conecap_mushroom_gill%1"],["CR:dirty_water%0.05","M1 AND SP","CR:dirty_water%0.05"]],
+ category: "ecosystem",
+ state: "solid",
+ reactions: {
+ "water": { elem1: "broth", elem2: "primordial_soup", elem3: "dirty_water", temp:80, chance:0.1},
+ }
+},
+
+elements.conecap_mushroom_cap = {
+ alias:"Conocybe tenera",
+ color: ["#8D4A38","#EF7B19"],
+ excludeRandom: false,
+ breakInto:"mycelium",
+ behavior: [["XX","XX","XX"],["SA","XX","SA"],["XX","M1","XX"]],
+ category: "ecosystem",
+ state: "solid",
+ reactions: {
+ "water": { elem1: "broth", elem2: "primordial_soup", elem3: "dirty_water", temp:80, chance:0.1},
+ }
+},
+
+elements.green_spored_parasol_spore = {
+ alias:"Chlorophyllum molybdites",
+ color: "#59605A",
+ excludeRandom: false,
+ behavior: [["XX","M2%1.5","XX"],["XX","L2:green_spored_parasol_stalk,green_spored_parasol_stalk,green_spored_parasol_stalk,green_spored_parasol_ring AND C2:green_spored_parasol_gill%25","XX"],["XX","M1","XX"]],
+ category: "ecosystem",
+ cooldown: defaultCooldown,
+ state: "solid",
+ reactions: {
+ "water": { elem1: "broth", elem2: "primordial_soup", elem3: "dirty_water", temp:80, chance:0.1},
+ }
+},
+
+elements.green_spored_parasol_stalk = {
+ alias:"Chlorophyllum molybdites",
+ color: "#897B5E",
+ excludeRandom: false,
+ behavior: [["XX","SP","XX"],["XX","CH:dirt,leaf_litter%0.007","XX"],["XX","M1 AND CH:dirt,leaf_litter,mud,moss,water,dirty_water,infested_meat,meat,poison>hyphae%1 AND SP","XX"]],
+ category: "ecosystem",
+ state: "solid",
+ breakInto:"mycelium",
+ reactions: {
+ "water": { elem1: "broth", elem2: "primordial_soup", elem3: "dirty_water", chance:0.1},
+ "disinfectant": { elem1: "stench", elem2: "stench", elem3: "mold", elem4: "dirt", elem5: "plague" },
+ }
+},
+
+elements.green_spored_parasol_ring = {
+ alias:"Chlorophyllum molybdites",
+ color: ["#ABB5B6","#897B5E","#908D77","#59605A"],
+ excludeRandom: false,
+ behavior: [["XX","SP","XX"],["CR:green_spored_parasol_cap%5 AND CR:green_spored_parasol_ring%1 AND SA","CH:dirt,leaf_litter%0.01","CR:green_spored_parasol_cap%5 AND CR:green_spored_parasol_ring%1 AND SA"],["CR:dirty_water%0.05","M1 AND SP","CR:dirty_water%0.05"]],
+ category: "ecosystem",
+ state: "solid",
+ breakInto:"mycelium",
+ reactions: {
+ "water": { elem1: "broth", elem2: "primordial_soup", elem3: "dirty_water", chance:0.1},
+ "disinfectant": { elem1: "stench", elem2: "stench", elem3: "mold", elem4: "dirt", elem5: "green_spored_parasol_spore" },
+ }
+},
+
+elements.green_spored_parasol_gill = {
+ alias:"Chlorophyllum molybdites",
+ color: ["#ABB5B6","#59605A","#908D77","#bbcbc2"],
+ excludeRandom: false,
+ behavior: [["XX","CR:green_spored_parasol_cap%2 AND CR:green_spored_parasol_gill%0.5","XX"],["SA AND CR:green_spored_parasol_gill%0.5 AND CR:green_spored_parasol_cap%2.5","CH:dirt,leaf_litter%0.01","SA AND CR:green_spored_parasol_gill%0.5 AND CR:green_spored_parasol_cap%2.5"],["CR:dirty_water,poison%0.05","M1 AND SP","CR:dirty_water,poison%0.05"]],
+ category: "ecosystem",
+ breakInto:"mycelium",
+ state: "solid",
+ reactions: {
+ "water": { elem1: "broth", elem2: "primordial_soup", elem3: "dirty_water", chance:0.1},
+ "disinfectant": { elem1: "stench", elem2: "stench", elem3: "mold", elem4: "dirt", elem5: "plague" },
+ }
+},
+
+elements.green_spored_parasol_cap = {
+ alias:"Chlorophyllum molybdites",
+ color: ["#D3CCBF","#BA9F8A"],
+ excludeRandom: false,
+ breakInto:"leaf_litter",
+ behavior: [["XX","XX","XX"],["SA","CC:768b7b%1 AND CH:dirt,leaf_litter%0.01","SA"],["XX","M1","XX"]],
+ category: "ecosystem",
+ state: "solid",
+ reactions: {
+ "water": { elem1: "broth", elem2: "primordial_soup", elem3: "dirty_water", chance:0.1},
+ "disinfectant": { elem1: "stench", elem2: "stench", elem3: "mold", elem4: "dirt", elem5: "plague" },
+ }
+},
+
+elements.meadow_mushroom_spore = {
+ alias:"Agaricus campestris",
+ color: "#817C86",
+ excludeRandom: false,
+ behavior: [["XX","M2%1.5","XX"],["XX","L2:meadow_mushroom_stalk AND C2:meadow_mushroom_gill%80","XX"],["XX","M1","XX"]],
+ category: "ecosystem",
+ isFood:true,
+ cooldown: defaultCooldown,
+ state: "solid",
+ reactions: {
+ "water": { elem1: "broth", elem2: "primordial_soup", elem3: "dirty_water", temp:80, chance:0.1},
+ }
+},
+
+elements.meadow_mushroom_stalk = {
+ alias:"Agaricus campestris",
+ color: "#CFD8E7",
+ excludeRandom: false,
+ breakInto:"mycelium",
+ behavior: [["XX","SP","XX"],["XX","XX","XX"],["XX","M1 AND CH:dirt,leaf_litter,mud,moss>hyphae%1 AND SP","XX"]],
+ category: "ecosystem",
+ isFood:true,
+ state: "solid",
+ reactions: {
+ "water": { elem1: "broth", elem2: "primordial_soup", elem3: "dirty_water", temp:80, chance:0.1},
+ }
+},
+
+elements.meadow_mushroom_gill = {
+ alias:"Agaricus campestris",
+ color: ["#623A34","#553736"],
+ breakInto:"mycelium",
+ excludeRandom: false,
+ behavior: [["XX","CR:meadow_mushroom_cap%5 AND CR:meadow_mushroom_gill%1","XX"],["SA AND CR:meadow_mushroom_cap%5 AND CR:meadow_mushroom_gill%1","XX","SA AND CR:meadow_mushroom_cap%5 AND CR:meadow_mushroom_gill%1"],["CR:sugar%0.05","M1 AND SP","CR:sugar%0.05"]],
+ category: "ecosystem",
+ isFood:true,
+ state: "solid",
+ reactions: {
+ "water": { elem1: "broth", elem2: "primordial_soup", elem3: "dirty_water", temp:80, chance:0.1},
+ }
+},
+
+elements.meadow_mushroom_cap = {
+ alias:"Agaricus campestris",
+ color: ["#ACC2E2","#8C96A2","#8A949F"],
+ excludeRandom: false,
+ breakInto:"leaf_litter",
+ behavior: [["XX","CR:fragrance%0.1","XX"],["SA","XX","SA"],["XX","M1","XX"]],
+ category: "ecosystem",
+ isFood:true,
+ state: "solid",
+ reactions: {
+ "water": { elem1: "broth", elem2: "primordial_soup", elem3: "dirty_water", temp:80, chance:0.1},
+ }
+},
+
+elements.amanita_muscaria_spore = {
+ alias:"Amanita muscaria",
+ color: "#FFAA85",
+ excludeRandom: false,
+ behavior: [["XX","M2%1.5","XX"],["XX","L2:amanita_muscaria_stalk AND C2:amanita_muscaria_gill","XX"],["M1","M1","M1"]],
+ category: "ecosystem",
+ cooldown: defaultCooldown,
+ state: "solid",
+ reactions: {
+ "water": { elem1: "broth", elem2: "primordial_soup", elem3: "dirty_water", temp:80, chance:0.1},
+ }
+},
+
+elements.amanita_muscaria_stalk = {
+ alias:"Amanita muscaria",
+ color: "#CCB4A4",
+ excludeRandom: false,
+ breakInto:"mycelium",
+ behavior: [["XX","SP","XX"],["XX","XX","XX"],["XX","M1 AND CH:dirt,leaf_litter,mud,infested_meat,meat,moss>hyphae%1 AND SP","XX"]],
+ category: "ecosystem",
+ state: "solid",
+ reactions: {
+ "water": { elem1: "broth", elem2: "primordial_soup", elem3: "dirty_water", temp:80, chance:0.1},
+ }
+},
+
+elements.amanita_muscaria_gill = {
+ alias:"Amanita muscaria",
+ color: ["#e7cf80","#f3bf83"],
+ excludeRandom: false,
+ breakInto:"mycelium",
+ behavior: [["XX","CR:amanita_muscaria_cap%5 AND CR:amanita_muscaria_gill%1","XX"],["SA AND CR:amanita_muscaria_cap%5 AND CR:amanita_muscaria_gill%1","XX","SA AND CR:amanita_muscaria_cap%5 AND CR:amanita_muscaria_gill%1"],["CR:dirty_water,dirty_water,dirty_water,poison%0.05","M1 AND SP","CR:dirty_water,dirty_water,dirty_water,poison%0.05"]],
+ category: "ecosystem",
+ state: "solid",
+ reactions: {
+ "water": { elem1: "broth", elem2: "primordial_soup", elem3: "dirty_water", temp:80, chance:0.1},
+ }
+},
+
+elements.amanita_muscaria_cap = {
+ alias:"Amanita muscaria",
+ color: ["#CC2D00","#7E0400","#E9F0A3"],
+ excludeRandom: false,
+ breakInto:"mycelium",
+ behavior: [["XX","XX","XX"],["SA","XX","SA"],["XX","M1","XX"]],
+ category: "ecosystem",
+ state: "solid",
+ reactions: {
+ "water": { elem1: "broth", elem2: "primordial_soup", elem3: "dirty_water", temp:80, chance:0.1},
+ }
+},
+
+elements.amanita_parcivolvata_spore = {
+ alias:"amanita parcivolvata",
+ color: "#FFAA85",
+ excludeRandom: false,
+ behavior: [["XX","M2%1.5","XX"],["XX","L2:amanita_parcivolvata_stalk AND C2:amanita_parcivolvata_gill","XX"],["M1","M1","M1"]],
+ category: "ecosystem",
+ cooldown: defaultCooldown,
+ state: "solid",
+ reactions: {
+ "water": { elem1: "broth", elem2: "primordial_soup", elem3: "dirty_water", temp:80, chance:0.1},
+ }
+},
+
+elements.amanita_parcivolvata_stalk = {
+ alias:"amanita parcivolvata",
+ color: "#CCB4A4",
+ excludeRandom: false,
+ breakInto:"mycelium",
+ behavior: [["XX","SP","XX"],["XX","XX","XX"],["XX","M1 AND CH:dirt,leaf_litter,mud,moss,infested_meat,meat>hyphae%1 AND SP","XX"]],
+ category: "ecosystem",
+ state: "solid",
+ reactions: {
+ "water": { elem1: "broth", elem2: "primordial_soup", elem3: "dirty_water", temp:80, chance:0.1},
+ }
+},
+
+elements.amanita_parcivolvata_gill = {
+ alias:"amanita parcivolvata",
+ color: ["#e7cf80","#f3bf83"],
+ excludeRandom: false,
+ breakInto:"mycelium",
+ behavior: [["XX","CR:amanita_parcivolvata_cap%5 AND CR:amanita_parcivolvata_gill%1","XX"],["SA AND CR:amanita_parcivolvata_cap%5 AND CR:amanita_parcivolvata_gill%1","XX","SA AND CR:amanita_parcivolvata_cap%5 AND CR:amanita_parcivolvata_gill%1"],["CR:dirty_water,dirty_water,dirty_water,poison%0.05","M1 AND SP","CR:dirty_water,dirty_water,dirty_water,poison%0.05"]],
+ category: "ecosystem",
+ state: "solid",
+ reactions: {
+ "water": { elem1: "broth", elem2: "primordial_soup", elem3: "dirty_water", temp:80, chance:0.1},
+ }
+},
+
+elements.amanita_parcivolvata_cap = {
+ alias:"amanita parcivolvata",
+ color: ["#CC2D00","#7E0400","#8D3E5A","#CB0F1C","#E9F0A3"],
+ excludeRandom: false,
+ breakInto:["mycelium","dirty_water","poison"],
+ behavior: [["XX","XX","XX"],["SA","XX","SA"],["XX","M1","XX"]],
+ category: "ecosystem",
+ state: "solid",
+ reactions: {
+ "water": { elem1: "broth", elem2: "primordial_soup", elem3: "dirty_water", temp:80, chance:0.1},
+ }
+},
+
+elements.giant_puffball_mushroom_spore = {
+ alias:"Calvatia gigantea",
+ color: "#817C86",
+ excludeRandom: false,
+ behavior: [["XX","M2%1.5","XX"],["XX","L2:giant_puffball_mushroom_ring AND C2:giant_puffball_mushroom_gill%80","XX"],["XX","M1","XX"]],
+ category: "ecosystem",
+ isFood:true,
+ cooldown: defaultCooldown,
+ state: "solid",
+ reactions: {
+ "water": { elem1: "broth", elem2: "primordial_soup", chance:0.1},
+ }
+},
+
+elements.giant_puffball_mushroom_gill = {
+ alias:"Calvatia gigantea",
+ color: ["#623A34","#553736"],
+ breakInto:"mycelium",
+ excludeRandom: false,
+ behavior: [["XX","CR:giant_puffball_mushroom_cap%5 AND CR:giant_puffball_mushroom_gill%1","XX"],["SA AND CR:giant_puffball_mushroom_cap%5 AND CR:giant_puffball_mushroom_gill%1","XX","SA AND CR:giant_puffball_mushroom_cap%5 AND CR:giant_puffball_mushroom_gill%1"],["CR:sugar%0.05","M1 AND SP","CR:sugar%0.05"]],
+ category: "ecosystem",
+ isFood:true,
+ state: "solid",
+ reactions: {
+ "water": { elem1: "broth", elem2: "primordial_soup", chance:0.1},
+ }
+},
+
+elements.giant_puffball_mushroom_ring = {
+ alias:"Calvatia gigantea",
+ color: ["#ABB5B6","#897B5E","#908D77","#59605A"],
+ excludeRandom: false,
+ behavior: [["XX","SP","XX"],["CR:giant_puffball_mushroom_cap%5 AND CR:giant_puffball_mushroom_ring%1","XX","CR:giant_puffball_mushroom_cap%5 AND CR:giant_puffball_mushroom_ring%1"],["CR:fragrance%0.05","M1 AND SP","CR:dirty_water%0.05"]],
+ category: "ecosystem",
+ state: "solid",
+ isFood:true,
+ breakInto:"mycelium",
+ reactions: {
+ "water": { elem1: "broth", elem2: "primordial_soup", elem3: "dirty_water", chance:0.1},
+ "disinfectant": { elem1: "stench", elem2: "stench", elem3: "mold", elem4: "dirt", elem5: "green_spored_parasol_spore" },
+ }
+},
+
+elements.giant_puffball_mushroom_cap = {
+ alias:"Calvatia gigantea",
+ color: ["#ACC2E2","#8C96A2","#8A949F"],
+ excludeRandom: false,
+ breakInto:"mycelium",
+ behavior: [["XX","CR:fragrance%0.1","XX"],["SA","XX","SA"],["XX","M1","XX"]],
+ category: "ecosystem",
+ isFood:true,
+ state: "solid",
+ reactions: {
+ "water": { elem1: "broth", elem2: "primordial_soup", elem3: "dirty_water", temp:80, chance:0.1},
+ }
+},
+
+elements.disinfectant = {
+ color: "#E2EAF4",
+ excludeRandom: false,
+ behavior: behaviors.FOAM,
+ category: "ecosystem",
+ state: "gas",
+ stain: -1,
+ density: 80,
+ reactions: {
+ "water": { elem1: "water", elem2: "seltzer"}
+ }
+};
+
+elements.infested_meat = {
+ color: ["#c5b880","#b8b165","#b89765"],
+ excludeRandom: false,
+ behavior: [["XX","SP AND CR:fungi,mold,mold,mold,mushroom_spore%0.0175 AND CR:male_green_bottle_fly,green_bottle_fly_larva,green_bottle_fly_pupa%0.0047","XX"],["SP","CH:fungi,green_bottle_fly_larva,green_bottle_fly_egg%0.01","SP"],["XX","M1","XX"]],
+ category: "ecosystem",
+ state: "solid",
+ reactions: {
+ "disinfectant": { elem1: "mushroom_spore", elem2: "female_green_bottle_fly", elem3: "mold", elem4: "dirt", elem5: "plague" },
+ }
+},
+
+elements.garbage_bag = {
+ color: "#4B4B4B",
+ excludeRandom: false,
+ behavior: [["XX","CH:meat,rotten_meat,frozen_meat,salt,sugar,flour,egg,hard_yolk,rotten_cheese,cheese_powder,grape,herb,lettuce,pickle,banana,mashed_banana,rotten_banana,dirt,mud,juice,dead_bug,>stench","XX"],["XX","XX","XX"],["M1","M1","M1"]],
+ category: "ecosystem",
+ state: "solid",
+ burn: .01,
+ burnTime: 300,
+ burnInto: "molten_plastic",
+ reactions: {
+ "meat": { elem1: "garbage" },
+ "rotten_meat": { elem1: "garbage" },
+ "frozen_meat": { elem1: "garbage" },
+ "infested_meat": {elem1: "garbage"},
+ "salt": { elem1: "garbage" },
+ "sugar": { elem1: "garbage" },
+ "flour": { elem1: "garbage" },
+ "egg": { elem1: "garbage" },
+ "hard_yolk": { elem1: "garbage" },
+ "rotten_cheese": { elem1: "garbage" },
+ "cheese_powder": { elem1: "garbage" },
+ "grape": { elem1: "garbage" },
+ "herb": { elem1: "garbage" },
+ "lettuce": { elem1: "garbage" },
+ "pickle": { elem1: "garbage" },
+ }
+},
+
+elements.garbage = {
+ color: "#4B4A4B",
+ excludeRandom: false,
+ behavior: [["XX","CR:stench%0.1","XX"],["SP%20 AND CR:garbage_juice%0.1 AND CH:water>dirty_water,garbage_juice%1","CH:green_bottle_fly_larva%0.007","SP%20 AND CR:garbage_juice%0.1 AND CH:water>dirty_water,garbage_juice%1"],["M1%0.1","M1","M1%0.1"]],
+ breakInto:"green_bottle_fly_larva",
+ category: "ecosystem",
+ state: "solid",
+ burn: .01,
+ burnTime: 300,
+ burnInto: "ash",
+ reactions: {
+ "fire": { elem1: "ash", elem2: "female_green_bottle_fly", elem3: "green_bottle_fly_larva", elem4: "green_bottle_fly_egg" },
+ }
+},
+
+elements.garbage_juice = {
+ color: ["#6B7A1A", "#60742E", "#5E823C"],
+ excludeRandom: false,
+ behavior: behaviors.LIQUID,
+ stain:0.125,
+ density: 977,
+ conduct: 0.8,
+ category: "ecosystem",
+ state: "liquid",
+ reactions: {
+ "disinfectant": { elem1: "dirty_water", elem2: "stench"},
+ }
+},
+
+
+
+elements.banana = {
+ color: ["#FCE47D","#EEC758"],
+ excludeRandom: false,
+ behavior: [["ST:banana_leaf,banana_penducle_2,banana_peduncle_1%70","ST:banana_leaf,banana_penducle_2,banana_peduncle_1","ST:banana_leaf,banana_penducle_2,banana_peduncle_1"],["ST:banana_leaf,banana_penducle_2,banana_peduncle_1","CH:rotten_banana%0.005","ST:banana_leaf,banana_penducle_2,banana_peduncle_1"],["M2","M1","M2"]],
+ category: "ecosystem",
+ breakInto:["mashed_banana","juice","fertilized_banana_seed"],
+ breakIntoColor: "#D4A930",
+ isFood: true,
+ state: "solid",
+ reactions: {
+ "dirty_water": { elem1: "rotten_banana" },
+ }
+},
+
+elements.mashed_banana = {
+ color: ["#FCE47D","#D4A930"],
+ excludeRandom: false,
+ behavior: [["XX","CR:juice%0.01","XX"],["ST%75 AND M1%20","Ch:mold%0.015","ST%75 AND M1%20"],["M1","M1","M1"]],
+ category: "ecosystem",
+ state: "solid",
+ isFood:true,
+ reactions: {
+ "yogurt": { elem1: "yogurt" },
+ "milk": {elem1: "fruit_milk"},
+ }
+},
+
+elements.rotten_banana = {
+ color: ["#7e7c29","#64571c","#4a3e16"],
+ excludeRandom: false,
+ behavior: [["XX","ST:vine AND CR:juice%0.01 AND CR:green_bottle_fly_egg,fruitfly_egg%0.0085 AND SP","XX"],["ST:vine AND SP","CH:dirt%0.1","ST:vine AND SP"],["M2","M1","M2"]],
+ category: "ecosystem",
+ breakInto:"mashed_banana",
+ state: "solid",
+ isFood:true,
+ reactions: {
+ "disinfectant": { elem1: "fertilized_banana_seed" },
+ "worm": { elem1: "fertilized_banana_seed", elem2: "mold"},
+ "green_bottle_fly_larva": { elem1: "dirt", elem2: "mold"},
+ "fruitfly_larva": { elem1: "dirt", elem2: "mold"},
+ }
+},
+
+elements.banana_seed = {
+ color: ["#5f5d53","#423924"],
+ excludeRandom: false,
+ behavior: [["XX","XX","XX"],["XX","CH:banana_seed>mold,fertilized_banana_seed%0.1","XX"],["M2%1","M1","M2%1"]],
+ category: "ecosystem",
+ state: "solid",
+ isFood:true,
+ reactions: {
+ "milk": {elem1: "fruit_milk", chance:3},
+ }
+},
+
+elements.fertilized_banana_seed = {
+ color: "#4d4a3b",
+ excludeRandom: false,
+ behavior: [
+ `XX|XX|XX|XX|XX`,
+ `XX|XX|XX|XX|XX`,
+ `XX|XX|SW:banana_pseudostem AND CR:banana_pseudostem%1|XX|XX`,
+ `XX|XX|LB:banana_pseudostem,banana_pseudostem_2 AND CH:banana_plant_top%0.05|XX|XX`,
+ `XX|XX|CH:dirt>root,fiber|XX|XX`,
+ `XX|XX|CH:dirt>root,fiber|XX|XX`,
+ `XX|CH:dirt>root,fiber|CH:dirt>root,fiber|CH:dirt>root,fiber|XX`
+ ],
+ category: "ecosystem",
+ state: "solid",
+ reactions: {
+ "water": { elem1: "fertilized_banana_seed", elem2: "fertilized_banana_seed", elem3: "mold", elem4: "fertilized_banana_seed" },
+ }
+},
+
+elements.banana_pseudostem = {
+ color: ["#afb845","#a7dc6b","#b4be44"],
+ excludeRandom: false,
+ behavior: [
+ `XX|XX|XX|XX|XX`,
+ `XX|XX|XX|XX|XX`,
+ `XX|XX|XX|XX|XX`,
+ `XX|CR:banana_peduncle_1%0.5|CH:dirt%0.001|CR:banana_peduncle_1%0.5|XX`,
+ `XX|XX|XX|XX|XX`,
+ `XX|XX|XX|XX|XX`,
+ `XX|XX|XX|XX|XX`
+ ],
+ category: "ecosystem",
+ state: "solid",
+ breakInto:"sap",
+ breakIntoColor:"#f2e477",
+},
+
+elements.banana_pseudostem_2 = {
+ name: "banana_pseudostem",
+ color: ["#afb845","#a7dc6b","#b4be44"],
+ excludeRandom: false,
+ behavior: [
+ `XX|XX|XX|XX|XX`,
+ `XX|XX|XX|XX|XX`,
+ `XX|XX|XX|XX|XX`,
+ `XX|CR:banana_peduncle_1%0.5|CH:dirt%0.001|CR:banana_peduncle_1%0.5|XX`,
+ `XX|XX|XX|XX|XX`,
+ `XX|XX|XX|XX|XX`,
+ `XX|XX|XX|XX|XX`
+ ],
+ category: "ecosystem",
+ state: "solid",
+ breakInto:"sap",
+ breakIntoColor:"#f2e477",
+},
+
+elements.banana_plant_top = {
+ color: ["#e5f56c"],
+ excludeRandom: false,
+ behavior: [
+ `XX|XX|XX|XX|XX`,
+ `XX|XX|XX|XX|XX`,
+ `XX|XX|XX|XX|XX`,
+ `XX|CR:banana_leaf%0.5|CH:dirt%0.001|CR:banana_leaf%0.5|XX`,
+ `CR:banana_leaf%0.5|CR:banana%0.01|XX|CR:banana0.01|CR:banana_leaf%0.5`,
+ `XX|XX|XX|XX|XX`,
+ `XX|XX|XX|XX|XX`
+ ],
+ category: "ecosystem",
+ state: "solid",
+ breakInto:"sap",
+ breakIntoColor:"#f2e477",
+},
+
+elements.banana_leaf = {
+ color: ["#8cb845","#addc6b","#a0be44"],
+ excludeRandom: false,
+ behavior: [
+ `XX|XX|XX|XX|XX`,
+ `XX|XX|XX|XX|XX`,
+ `XX|SA:banana_leaf|XX|SA:banana_leaf|XX`,
+ `XX|SA:banana_leaf|CH:fertilized_banana_seed%0.001|SA:banana_leaf|XX`,
+ `XX|XX|XX|XX|XX`,
+ `XX|XX|XX|XX|XX`,
+ `XX|XX|XX|XX|XX`
+ ],
+ category: "ecosystem",
+ state: "solid",
+ breakInto:"sap",
+ breakIntoColor:"#f2e477",
+ reactions: {
+ "water": { elem1: "fertilized_banana_seed", elem2: "fertilized_banana_seed", elem3: "mold", elem4: "fertilized_banana_seed" },
+ }
+},
+
+elements.banana_peduncle_1 = {
+ color: ["#d7eb42","#e5f56c","#a0be44"],
+ name:"banana_peduncle-offshoot",
+ excludeRandom: false,
+ behavior: [
+ `XX|XX|XX|XX|XX`,
+ `XX|XX|XX|XX|XX`,
+ `XX|XX|XX|XX|XX`,
+ `XX|CR:banana_peduncle_1%0.0022 AND CH:banana_peduncle_2%0.5|CH:dirt%0.001|CR:banana_peduncle_1,banana_peduncle_2%0.5|XX`,
+ `XX|XX|XX|XX|XX`,
+ `XX|XX|XX|XX|XX`,
+ `XX|XX|XX|XX|XX`
+ ],
+ category: "ecosystem",
+ state: "solid",
+ breakInto:"sap",
+ breakIntoColor:"#f2e477",
+},
+
+elements.banana_peduncle_2 = {
+ color: ["#8cb845","#addc6b","#a0be44"],
+ name:"banana_peduncle-hanging",
+ excludeRandom: false,
+ behavior: [
+ `XX|XX|XX|XX|XX`,
+ `XX|XX|XX|XX|XX`,
+ `XX|XX|XX|XX|XX`,
+ `XX|CR:banana%0.5|CH:dirt,fertilized_banana_seed%0.001|CR:banana%0.5|XX`,
+ `XX|XX|XX|XX|XX`,
+ `XX|XX|XX|XX|XX`,
+ `XX|XX|XX|XX|XX`
+ ],
+ category: "ecosystem",
+ state: "solid",
+ breakInto:"fertilized_banana_seed",
+ breakIntoColor:"#f2e477",
+ reactions: {
+ "water": { elem1: "fertilized_banana_seed", elem2: "fertilized_banana_seed", elem3: "mold", elem4: "fertilized_banana_seed" },
+ }
+},
+
+elements.mold = {
+ color: ["#6B7A1A", "#60742E", "#5E823C"],
+ excludeRandom: false,
+ behavior: [["CH:rotten_meat,rotten_cheese,rotten_banana>mold%0.07","SP","CH:rotten_meat,rotten_cheese,rotten_banana>mold%0.07"],["CH:rotten_meat,rotten_cheese,rotten_banana>mold%0.07","CH:dirt%0.001","CH:rotten_meat,rotten_cheese,rotten_banana>mold%0.07"],["M1 AND CH:rotten_meat,rotten_cheese,rotten_banana>mold%0.07","M1","M1 AND CH:rotten_meat,rotten_cheese,rotten_banana>mold%0.07"]],
+ category: "ecosystem",
+ state: "solid",
+ reactions: {
+ "disinfectant": { elem1: "dirt", elem2: "fruitfly_egg", elem3: "stench", elem4: "fruitfly_larva", elem5: "mold", elem6: "mold" },
+ }
+},
+
+elements.bug = {
+ color: "#FFFFFF",
+ excludeRandom: false,
+ behavior: [["XX","XX","XX"],["XX","CH:male_green_bottle_fly,crawl_male_green_bottle_fly,female_green_bottle_fly,male_fruitfly,crawl_female_green_bottle_fly,green_bottle_fly_pupa,female_fruitfly,worker_leafcutter_ant,queen_leafcuttter_ant,female_ladybird_beetle,male_ladybird_beetle,female_springtail,male_springtail,bold_jumping_spiderling,male_bold_jumping_spiderling,female_bold_jumping_spiderling,","XX"],["XX","XX","XX"]],
+ category: "ecosystem",
+ cooldown: defaultCooldown,
+ state: "solid",
+
+},
+
+elements.fungi = {
+ color: "#FFFFFF",
+ excludeRandom: false,
+ behavior: [["XX","XX","XX"],["XX","CH:mushroom_spore,conecap_mushroom_spore,green_spored_parasol_spore,meadow_mushroom_spore,meadow_mushroom_spore,meadow_mushroom_spore,giant_puffball_mushroom_spore,amanita_muscaria_spore,amanita_parcivolvata_spore","XX"],["XX","XX","XX"]],
+ category: "ecosystem",
+ cooldown: defaultCooldown,
+ state: "solid",
+
+},
+
+worldgentypes.fungi_ecosystem = {
+ layers: [
+ [0.50, "dirt"],
+ [0.25, "rock"],
+ [0.10, "basalt"],
+ ],
+ decor: [ // [element, chance, distance from top]
+ ["female_springtail", 0.08],
+ ["ant", 0.08],
+ ["tuff", 0],
+ ["leaf_litter", 0],
+ ["fungi", 0.067, 10]
+ ],
+ baseHeight: 0.5,
+},
+worldgentypes.insect_ecosystem = {
+ layers: [
+ [0.95, "grass"],
+ [0.50, "dirt"],
+ [0.05, "rock"],
+ [0, "basalt"],
+ ],
+ decor: [ // [element, chance, distance from top]
+ ["bee", 0.08],
+ ["bug", 0.08],
+ ["bird", 0.025, 10],
+ ["mushroom_spore", 0.02, 10],
+ ["banana_seed", 0.02, 10],
+ ["flower_seed", 0.02, 10],
+ ["tuff", 0],
+ ["leaf_litter", 0],
+ ["fungi",0]
+ ],
+ baseHeight: 0.5,
+}
+
+
diff --git a/mods/orchidslibrary.js b/mods/orchidslibrary.js
new file mode 100644
index 00000000..bf4e768d
--- /dev/null
+++ b/mods/orchidslibrary.js
@@ -0,0 +1,70 @@
+/*
+*Version 1.0.0
+*/
+function noiseify(color, range){
+ if(color.startsWith("#")){
+ color = hexToRGB(color);
+ } else {
+ color = getRGB(color);
+ }
+ let num = Math.round(Math.random()*(range*2))-range;
+ for(let value in color){
+ color[value] += num;
+ }
+ return `rgb(${color.r},${color.g},${color.b})`;
+}
+
+function is2d(arr){
+ return arr.some(item => Array.isArray(item));
+}
+
+function colorMix(p1, p2, bias = 0.5){
+ c1 = p1.color;
+ p1.color = interpolateRgb(getRGB(p1.color), getRGB(p2.color), bias);
+ p2.color = interpolateRgb(getRGB(c1), getRGB(p2.color), bias);
+}
+
+function interpolateRgb(rgb1, rgb2, ratio = 0.5) {
+ const interpolatedRgb = {
+ r: Math.round(rgb1.r + (rgb2.r - rgb1.r) * ratio),
+ g: Math.round(rgb1.g + (rgb2.g - rgb1.g) * ratio),
+ b: Math.round(rgb1.b + (rgb2.b - rgb1.b) * ratio),
+ };
+ return normalize(interpolatedRgb);
+}
+
+function getRGB(rgb){
+ if(rgb.startsWith("rgb(")){
+ let rgb2 = rgb.replace(")", "").replace("rgb(", "").replace(/,/g, "r").split("r")
+ return { r: parseInt(rgb2[0]), g: parseInt(rgb2[1]), b: parseInt(rgb2[2]) };
+ } else {
+ return hexToRGB(rgb2);
+ }
+}
+function pixelToggle(pixel, multi = {r:1,g:1,b:1}){
+ if(pixel.toggle != undefined){
+ pixel.toggle = !pixel.toggle;
+ let rgb;
+ if(Array.isArray(elements[pixel.element].color)){
+ let elemColor = elements[pixel.element].color[Math.round(Math.random()*elements[pixel.element].color.length)];
+ rgb = hexToRGB(elemColor) || getRGB(elemColor);
+ } else {
+ let elemColor = elements[pixel.element].color;
+ rgb = hexToRGB(elemColor) || getRGB(elemColor);
+ }
+ let num = 5 - Math.round(Math.random()*10);
+ if(pixel.toggle){
+ for(let key in rgb){
+ rgb[key] += (100*multi[key]);
+ rgb[key] = Math.round(Math.max(Math.min(rgb[key], 255), 0));
+ }
+ pixel.color = `rgb(${rgb.r+num},${rgb.g+num},${rgb.b+num})`;
+ }
+ else {
+ pixel.color = `rgb(${rgb.r+num},${rgb.g+num},${rgb.b+num})`;
+ }
+ }
+}
+function normalize(obj){
+ return `rgb(${obj.r},${obj.g},${obj.b})`;
+}
diff --git a/mods/plants.js b/mods/plants.js
index 807c3f46..ca38e2a5 100644
--- a/mods/plants.js
+++ b/mods/plants.js
@@ -1,44 +1,19 @@
/*
-Version 2.2.0
+*Version 2.2.1
*/
-function noiseify(color, range){
- if(color.startsWith("#")){
- color = hexToRGB(color);
- } else {
- color = getRGB(color);
- }
- let num = Math.round(Math.random()*(range*2))-range;
- for(let value in color){
- color[value] += num;
- }
- return `rgb(${color.r},${color.g},${color.b})`;
-}
-let is2d = (arr)=>{
- return arr.some(item => Array.isArray(item));
-}
-class growInterval {
- constructor(seedPixel, pattern, basePos, c = 0.025, dieAfter = undefined, fruit = undefined, elems = undefined){
- let currentLength = 0;
- let chance = c;
- let pos = basePos;
- let interval = setInterval(()=>{
- if(currentLength == pattern.length || seedPixel == undefined){
- clearInterval(interval);
- } else {
- let x = pos[0]+pattern[currentLength][0], y = pos[1]+pattern[currentLength][1];
- if(Math.random(){
+ class growInterval {
+ constructor(seedPixel, pattern, basePos, c = 0.025, dieAfter = undefined, fruit = undefined, elems = undefined){
+ let currentLength = 0;
+ let chance = c;
+ let pos = basePos;
+ let interval = setInterval(()=>{
+ if(currentLength == pattern.length || seedPixel == undefined){
+ clearInterval(interval);
+ } else {
+ let x = pos[0]+pattern[currentLength][0], y = pos[1]+pattern[currentLength][1];
+ if(Math.random() exclude[0] && angle < exclude[1]){
- angle = min+(Math.random()*(max-min));
+ }, 1000/tps);
+ this.interval = interval;
}
}
- let res = [];
- let num = (angle < 270) ? -0.5 : 0.5;
- for(let i = 0; i < length; i++){
- let tempAngle = (angle+(num*i))*(Math.PI/180);
- let dX = Math.cos(tempAngle)*i, dY = Math.sin(tempAngle)*i;
- res.push([Math.floor(dX), Math.floor(dY)]);
+ let flowerExclude = ["pineapple"];
+ let vineGrow = ["wood", "rock_wall", "straw", "wall", "ewall", "bush_cane", "bush_base", "fruit_branch"];
+ plants = {
+ tree: [],
+ vine: ["grape", "tomato"],
+ bush: [],
+ other: ["pineapple", "watermelon", "banana", "onion"],
+ includes: function(target){
+ for(item in this){
+ if(this[item] && Array.isArray(this[item]) && this[item].includes(target)){return true;}
+ }
+ return false;
+ }
}
- return res;
- },
- palm: function(length, min, max, exclude = null){
+ let growthPatterns = {
+ pineapple1: [[-1,-1],[-2,-2],[1,-1],[2,-2],[0,-1],[0,-2],[0,-3],[0,-4],[0,-5],[0,-6],[-1,-6],[1,-6],[-1,-5],[1,-5],[-1,-4],[1,-4],[-1,-3],[1,-3],[0,-7],[-1,-8],[1,-8]],
+ pineapple2: [[[-1,-1],[1,-1]],[[-2,-2],[2,-2]], [0,-1],[0,-2],[0,-3],[0,-4],[0,-5],[0,-6],[[-1,-6],[1,-6]],[[-1,-5],[1,-5]],[[-1,-4],[1,-4]],[[-1,-3],[1,-3]],[[-1,-2],[1,-2]],[0,-7],[-1,-8],[1,-8]],
+ pineapple3: [[-1,0],[-2,-1],[-3,-2],[1,0],[2,-1],[-4,-3],[3,-2],[4,-3],[-5,-4],[5,-4],[0,-1],[0,-2],[0,-3],[0,-4],[0,-5],[0,-6],[0,-7],[0,-8],[0,-9],[0,-10],[-1,-10],[1,-10],[-1,-9],[1,-9],[-1,-8],[1,-8],[-1,-7],[1,-7],[-1,-6],[1,-6],[-1,-5],[1,-5],[-1,-4],[1,-4],[-2,-9],[2,-9],[-2,-8],[2,-8],[2,-7],[-2,-7],[-2,-6],[2,-6],[2,-5],[-2,-5],[0,-11],[-1,-12],[1,-12],[2,-13],[-2,-13]],
+ melon_2x2: [[0,-1],[1,-2],[1,-1],[[1,0],[2,-1]],[2,0]],
+ melon_3x3: [[0,-1],[0,-2],[1,-3],[2,-3],[2,-2],[[1,-2],[1,-1]],[2,-1],[2,0],[1,0],[3,0],[3,-1],[3,-2]],
+ melon_4x4: [[0,-1],[0,-2],[0,-3],[1,-4],[2,-4],[3,-4],[3,-3],[2,-3],[2,-2],[3,-2],[1,-2],[1,-3],[1,-1],[2,-1],[3,-1],[1,0],[2,0],[3,0],[4,0],[4,-1],[4,-2],[4,-3]],
+ melon_5x5: [[0,-1],[0,-2],[0,-3],[0,-4],[1,-5],[2,-5],[3,-5],[3,-4],[2,-4],[3,-3],[4,-4],[4,-3],[2,-3],[1,-4],[5,-4],[3,-2],[2,-2],[4,-2],[5,-2],[1,-2],[1,-3],[5,-3],[1,-1],[2,-1],[3,-1],[4,-1],[5,-1],[5,0],[4,0],[3,0],[2,0],[1,0]],
+ palm_1: [[1,-1],[2,-2],[3,-2],[4,-2],[5,-1]],
+ palm_2: [[1,-1],[2,-2],[3,-2],[4,-3],[5,-3],[6,-3],[7,-2]],
+ palm_3: [[1,-1],[2,-2],[3,-3],[4,-3],[5,-4],[6,-4],[7,-4],[8,-3],[9,-2]] ,
+ palm_4: [[1,-1],[2,-1],[3,-2],[4,-2],[5,-3],[6,-3],[7,-3],[8,-3],[9,-2]],
+ "palm_5-1":[[0,-1],[0,-2],[1,-2],[0,-3],[-1,-3],[-2,-3],[2,-2],[3,-2],[4,-2],[5,-2],[-3,-3],[-4,-3],[-5,-3],[6,-2],[-6,-2],[-7,-2],[7,-1],[8,-1],[-8,-2],[-9,-1],[9,0],[0,-4],[1,-4],[1,-3],[2,-3],[-2,-4],[-3,-5],[-4,-5],[3,-4],[4,-4],[5,-5],[6,-5],[7,-5],[-5,-6],[-6,-6],[-7,-6],[-8,-5],[8,-4],[1,-5],[1,-6],[-1,-5],[-1,-6],[-2,-7],[-2,-8],[1,-7],[2,-8],[2,-9],[-3,-9],[-4,-10],[3,-10],[-1,-1],[-2,-1],[-2,0],[-1,0],[-1,1],[-2,1],[1,1],[1,0],[1,-1],[2,-1],[2,0],[2,1]],
+ "palm_5-2": [[-1,-1],[1,-1],[-2,-1],[2,-1],[-3,-2],[3,-2],[-4,-2],[4,-2],[5,-3],[-5,-3],[-6,-3],[6,-3],[7,-3],[-7,-3],[8,-4],[9,-4],[10,-4],[-8,-2],[11,-3],[0,-1],[1,-2],[-1,-2],[-2,-3],[2,-3],[3,-4],[4,-4],[-3,-4],[-4,-5],[-5,-5],[5,-5],[6,-5],[-6,-6],[-7,-6],[-8,-6],[7,-6],[8,-6],[9,-6],[10,-6],[-9,-5],[0,-3],[0,-2],[1,-4],[1,-5],[-1,-4],[-1,-5],[-2,-6],[-2,-7],[2,-6],[3,-7],[4,-8],[-3,-8],[-4,-9],[5,-9],[6,-9],[-5,-10],[-6,-10],[-7,-9],[7,-8],[1,0],[2,0],[3,0],[0,0],[-1,0],[-2,0],[-2,1],[-3,1],[-3,0],[-1,1],[1,1],[2,1],[3,1],[3,2],[2,2],[1,2],[-1,2],[-2,2],[-3,2],[-3,3],[-2,3],[-1,3],[1,3],[2,3],[3,3]],
+ "coconut_5-1":[[0,-1],[-1,-1],[-2,-1],[-3,-1],[1,-1],[2,-1],[3,-2],[4,-2],[-4,-2],[-5,-2],[-6,-2],[-7,-2],[5,-2],[6,-2],[7,-1],[-8,-1],[0,-2],[0,-3],[-1,-3],[-2,-4],[1,-2],[2,-3],[3,-4],[4,-4],[5,-4],[6,-4],[7,-4],[-3,-5],[-4,-5],[-5,-5],[-6,-5],[-7,-4],[8,-3],[0,-4],[0,-5],[1,-6],[1,-7],[2,-8],[3,-9],[4,-10],[5,-10],[-1,0],[-2,0],[-1,1],[-2,1],[-1,2],[-3,0],[-4,-1],[1,0],[1,1],[1,2],[2,0],[2,1],[3,-1],[3,0],[0,0]],
+ "coconut_5-2":[[0,-1],[-1,-1],[-2,-1],[-3,-2],[-4,-2],[-5,-2],[-6,-2],[-7,-1],[1,-1],[2,-2],[3,-2],[4,-3],[5,-3],[6,-3],[7,-2],[8,-2],[9,-1],[0,-2],[0,-3],[1,-3],[2,-4],[3,-5],[4,-5],[5,-6],[6,-6],[7,-6],[8,-5],[-1,-3],[-2,-4],[-3,-5],[-4,-5],[-5,-6],[-6,-6],[-7,-6],[-8,-5],[-9,-4],[0,-4],[0,-5],[1,-6],[1,-7],[2,-8],[2,-9],[3,-10],[4,-11],[-1,0],[1,0],[2,0],[2,-1],[-2,0],[-1,1],[-2,1],[-3,1],[1,1],[2,1],[3,0],[4,0],[-3,-1],[-3,0],[-4,0],[-4,1],[3,1],[4,1],[3,-1],[-1,2],[-2,2],[-3,2],[1,2],[2,2],[3,2]],
+ blade: function(length, min, max, exclude = null){
let angle = min+(Math.random()*(max-min));
if(exclude != null){
while(angle > exclude[0] && angle < exclude[1]){
@@ -109,423 +80,555 @@ let growthPatterns = {
}
}
let res = [];
- let num = (angle < 270) ? -3 : 3;
+ let num = (angle < 270) ? -0.5 : 0.5;
for(let i = 0; i < length; i++){
let tempAngle = (angle+(num*i))*(Math.PI/180);
let dX = Math.cos(tempAngle)*i, dY = Math.sin(tempAngle)*i;
res.push([Math.floor(dX), Math.floor(dY)]);
}
return res;
- },
- palm_bloom: function(){
- let res = [];
-
- let width = 3+Math.round(Math.random()*2);
- let length = 5+(width-3);
- for(let i = 1; i < length; i++){
- for(let ii = 1; ii < width; ii++){
- res.push([-ii,i]);
- res.push([ii,i]);
- }
- }
- return res;
- },
- stalk: function(height){
- let res = [];
- for(let i = 1; i <= height; i++){
- res.push([0, -i]);
- }
- return res;
- },
-};
-let growthElems = {
- pineapple1: ["fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","fruit_leaves","fruit_leaves","fruit_leaves"],
- pineapple2: ["fruit_leaves","fruit_leaves","fruit_leaves","flower","flower","flower","flower","flower","flower","flower","flower","flower","fruit_leaves","fruit_leaves","fruit_leaves"],
- pineapple3: ["fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves"],
- melon_2x2: ["fruit_leaves","fruit_leaves","flower","flower","flower","flower"],
- melon_3x3: ["fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","flower","flower","flower","flower","flower","flower","flower","flower","flower"],
- melon_4x4: ["fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower"],
- melon_5x5: ["fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower"],
- palm_1: ["fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves"],
- palm_2: ["fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves"],
- palm_3: ["fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves"],
- palm_4: ["fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves"],
- "palm_5-1": ["fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower"],
- "palm_5-2":["fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","flower","flower","flower","fruit_leaves","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower"],
- "coconut_5-1": ["fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","fruit_leaves"],
- "coconut_5-2": ["fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower"],
-}
-let ethyleneChance = {
- tomato: 0.000055,
- orange: 0.000005,
- strawberry: 0.000005,
- grape: 0.000005,
- blueberry: 0.000005,
- apple: 0.00005,
- avocado: 0.00005,
- plum: 0.00005,
- peach: 0.00005,
- apricot: 0.00005,
- pear: 0.00005,
- mango: 0.000005,
- kiwi: 0.000005,
- lemon: 0.000005,
- raspberry: 0.000005,
- blackberry: 0.000005,
- get: function(name){
- return this[name] || 0.00000035;
- }
-}
-elements.tomato.properties = {
- type: "fruit",
- fruit: "tomato",
-};
-elements.grape.properties = {
- type: "fruit",
- fruit: "grape",
-};
-class vineSeed {
- category = "life";
- behavior = behaviors.POWDER;
- tick = function(pixel){
- if(pixel.age > 40){
- changePixel(pixel, (elements[pixel.element].low) ? "low_fruit_vine" : "fruit_vine");
- }
- pixel.age += 1;
- };
- properties = {
- age: 0,
- };
- constructor(fruit, color, low = false){
- this.properties.fruit = fruit;
- this.color = color;
- this.low = low;
- };
-}
-
-class treeSeed {
- properties = {
- age: 0,
- fruit: "",
- };
- tick = function(pixel) {
- if (isEmpty(pixel.x,pixel.y+1)) {
- movePixel(pixel,pixel.x,pixel.y+1);
- }
- else {
- if (Math.random() < 0.02 && pixel.age > 50 && pixel.temp < 100) {
- if (!outOfBounds(pixel.x,pixel.y+1)) {
- var dirtPixel = pixelMap[pixel.x][pixel.y+1];
- if (["dirt", "mud", "sand", "wet_sand", "clay_soil", "mycelium"].includes(dirtPixel.element)) {
- changePixel(dirtPixel,"root");
- }
- }
- if (isEmpty(pixel.x,pixel.y-1)) {
- movePixel(pixel,pixel.x,pixel.y-1);
- createPixel(Math.random() > 0.5 ? "wood" : "fruit_branch",pixel.x,pixel.y+1);
- if (pixelMap[pixel.x][pixel.y+1].element == "fruit_branch" || pixelMap[pixel.x][pixel.y+1].element == "fruit_leaves" || pixelMap[pixel.x][pixel.y+1].element == "wood"){
- pixelMap[pixel.x][pixel.y+1].fruit = pixel.fruit;
- pixelMap[pixel.x][pixel.y+1].age = pixel.age;
- }
+ },
+ palm: function(length, min, max, exclude = null){
+ let angle = min+(Math.random()*(max-min));
+ if(exclude != null){
+ while(angle > exclude[0] && angle < exclude[1]){
+ angle = min+(Math.random()*(max-min));
}
}
- else if (pixel.age > 1000) {
- changePixel(pixel,"wood");
+ let res = [];
+ let num = (angle < 270) ? -3 : 3;
+ for(let i = 0; i < length; i++){
+ let tempAngle = (angle+(num*i))*(Math.PI/180);
+ let dX = Math.cos(tempAngle)*i, dY = Math.sin(tempAngle)*i;
+ res.push([Math.floor(dX), Math.floor(dY)]);
}
- pixel.age++;
- }
- doDefaults(pixel);
+ return res;
+ },
+ palm_bloom: function(){
+ let res = [];
+
+ let width = 3+Math.round(Math.random()*2);
+ let length = 5+(width-3);
+ for(let i = 1; i < length; i++){
+ for(let ii = 1; ii < width; ii++){
+ res.push([-ii,i]);
+ res.push([ii,i]);
+ }
+ }
+ return res;
+ },
+ stalk: function(height){
+ let res = [];
+ for(let i = 1; i <= height; i++){
+ res.push([0, -i]);
+ }
+ return res;
+ },
};
- breakInto = ["sawdust", "sap"];
- burnInto = ["charcoal", "sap", "ember"];
- tempHigh = 100;
- stateHigh = "dead_plant";
- tempLow = -40;
- stateLow = "frozen_plant";
- burn = 40;
- burnTime = 50;
- category = "life";
- seed = true;
- constructor(fruit, colours){
- this.properties.fruit = fruit;
- this.color = colours;
+ let growthElems = {
+ pineapple1: ["fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","fruit_leaves","fruit_leaves","fruit_leaves"],
+ pineapple2: ["fruit_leaves","fruit_leaves","fruit_leaves","flower","flower","flower","flower","flower","flower","flower","flower","flower","fruit_leaves","fruit_leaves","fruit_leaves"],
+ pineapple3: ["fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves"],
+ melon_2x2: ["fruit_leaves","fruit_leaves","flower","flower","flower","flower"],
+ melon_3x3: ["fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","flower","flower","flower","flower","flower","flower","flower","flower","flower"],
+ melon_4x4: ["fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower"],
+ melon_5x5: ["fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower"],
+ palm_1: ["fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves"],
+ palm_2: ["fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves"],
+ palm_3: ["fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves"],
+ palm_4: ["fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves"],
+ "palm_5-1": ["fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower"],
+ "palm_5-2":["fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","flower","flower","flower","fruit_leaves","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower"],
+ "coconut_5-1": ["fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","fruit_leaves"],
+ "coconut_5-2": ["fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","fruit_leaves","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower","flower"],
}
-}
-
-class fruit {
- category = "food";
- behavior = [["XX", "ST:fruit_leaves AND ST:fruit_branch AND ST:wood", "XX"],["ST:fruit_leaves AND ST:fruit_branch AND ST:wood", "XX", "ST:fruit_leaves AND ST:fruit_branch AND ST:wood"],["M2", "ST:fruit_leaves AND ST:fruit_branch AND ST:wood AND M1", "M2"]];
- breakInto = "juice";
- properties = {
+ let ethyleneChance = {
+ tomato: 0.000055,
+ orange: 0.000005,
+ strawberry: 0.000005,
+ grape: 0.000005,
+ blueberry: 0.000005,
+ apple: 0.00005,
+ avocado: 0.00005,
+ plum: 0.00005,
+ peach: 0.00005,
+ apricot: 0.00005,
+ pear: 0.00005,
+ mango: 0.000005,
+ kiwi: 0.000005,
+ lemon: 0.000005,
+ raspberry: 0.000005,
+ blackberry: 0.000005,
+ get: function(name){
+ return this[name] || 0.00000035;
+ }
+ }
+ elements.tomato.properties = {
type: "fruit",
+ fruit: "tomato",
};
- isFood = true;
- constructor(name, colour, jColour, type = "tree", sColour = false, extract = false, low = false){
- this.properties.fruit = name;
- this.color = colour;
- this.breakIntoColor = jColour;
- this.extract = (extract == false) ? undefined : extract;
- if(type == "bush"){
- this.behavior = [["XX", "ST:bush_cane", "XX"],["ST:bush_cane", "XX", "ST:bush_cane"],["M2", "ST:bush_cane AND M1", "M2"]];
- } else if (type == "vine"){
- this.behavior = behaviors.VINEFRUIT;
- }
- plants[type].push(name);
- if(sColour != false){
- if(type == "bush"){
- elements[`${name}_seed`] = new bushSeed(name, sColour);
- } else if (type == "vine"){
- elements[`${name}_seed`] = new vineSeed(name, sColour, low);
- } else {
- elements[`${name}_seed`] = new treeSeed(name, sColour);
- }
- }
+ elements.grape.properties = {
+ type: "fruit",
+ fruit: "grape",
};
- tick = function(pixel){
- let chance = ethyleneChance.get(pixel.fruit);
- for(let i = 0; i < squareCoords.length; i++){
- let x = pixel.x+squareCoords[i][0], y = pixel.y+squareCoords[i][1];
- if(isEmpty(x,y) && !outOfBounds(x,y) && Math.random() < chance){
- createPixel("ethylene", x, y);
- }
- }
- }
-}
-elements.tomato.tick = function(pixel){
- let chance = ethyleneChance.get(pixel.fruit);
- for(let i = 0; i < squareCoords.length; i++){
- let x = pixel.x+squareCoords[i][0], y = pixel.y+squareCoords[i][1];
- if(isEmpty(x,y) && !outOfBounds(x,y) && Math.random() < chance){
- createPixel("ethylene", x, y);
- }
- }
-}
-elements.grape.tick = function(pixel){
- let chance = ethyleneChance.get(pixel.fruit);
- for(let i = 0; i < squareCoords.length; i++){
- let x = pixel.x+squareCoords[i][0], y = pixel.y+squareCoords[i][1];
- if(isEmpty(x,y) && !outOfBounds(x,y) && Math.random() < chance){
- createPixel("ethylene", x, y);
- }
- }
-}
-elements.wood.properties = {age: 0, fruit: ""};
-
-elements.fruit_branch = {
- color: elements.tree_branch.color,
- behavior: [
- "XX|XX|XX",
- "XX|XX|XX",
- "XX|XX|XX",
- ],
- tempHigh: 100,
- stateHigh: "wood",
- tempLow: -30,
- stateLow: "wood",
- category: "life",
- burn: 40,
- burnTime: 50,
- burnInto: ["sap","ember","charcoal"],
- hidden: true,
- state: "solid",
- density: 1500,
- hardness: 0.15,
- breakInto: ["sap","sawdust"],
- seed: "apple_seed",
- properties: {
- age: 0,
- fruit: "",
- },
- tick: function(pixel){
- let pos = [[-1, -1], [0, -1], [1, -1]];
- for(let i = 0; i < pos.length; i++){
- let x = pixel.x+pos[i][0], y = pixel.y+pos[i][1];
- if(isEmpty(x,y) && !outOfBounds(x,y)){
- if(Math.random() < 0.035){
- let elemArr = (pos[i][0] == 0) ? ["fruit_leaves","fruit_leaves","fruit_leaves","fruit_branch","fruit_branch"] : ["fruit_branch", "fruit_branch", "fruit_leaves", "fruit_leaves", "wood"];
- createPixel(elemArr[Math.round(Math.random()*elemArr.length)], x, y);
+ class vineSeed {
+ category = "life";
+ behavior = behaviors.POWDER;
+ tick = function(pixel){
+ if(pixel.age > 40){
+ changePixel(pixel, (elements[pixel.element].low) ? "low_fruit_vine" : "fruit_vine");
+ }
+ pixel.age += 1;
+ };
+ properties = {
+ age: 0,
+ };
+ constructor(fruit, color, low = false){
+ this.properties.fruit = fruit;
+ this.color = color;
+ this.low = low;
+ };
+ }
+
+ class treeSeed {
+ properties = {
+ age: 0,
+ fruit: "",
+ };
+ tick = function(pixel) {
+ if (isEmpty(pixel.x,pixel.y+1)) {
+ movePixel(pixel,pixel.x,pixel.y+1);
+ }
+ else {
+ if (Math.random() < 0.02 && pixel.age > 50 && pixel.temp < 100) {
+ if (!outOfBounds(pixel.x,pixel.y+1)) {
+ var dirtPixel = pixelMap[pixel.x][pixel.y+1];
+ if (["dirt", "mud", "sand", "wet_sand", "clay_soil", "mycelium"].includes(dirtPixel.element)) {
+ changePixel(dirtPixel,"root");
+ }
+ }
+ if (isEmpty(pixel.x,pixel.y-1)) {
+ movePixel(pixel,pixel.x,pixel.y-1);
+ createPixel(Math.random() > 0.5 ? "wood" : "fruit_branch",pixel.x,pixel.y+1);
+ if (pixelMap[pixel.x][pixel.y+1].element == "fruit_branch" || pixelMap[pixel.x][pixel.y+1].element == "fruit_leaves" || pixelMap[pixel.x][pixel.y+1].element == "wood"){
+ pixelMap[pixel.x][pixel.y+1].fruit = pixel.fruit;
+ pixelMap[pixel.x][pixel.y+1].age = pixel.age;
+ }
+ }
+ }
+ else if (pixel.age > 1000) {
+ changePixel(pixel,"wood");
+ }
+ pixel.age++;
+ }
+ doDefaults(pixel);
+ };
+ breakInto = ["sawdust", "sap"];
+ burnInto = ["charcoal", "sap", "ember"];
+ tempHigh = 100;
+ stateHigh = "dead_plant";
+ tempLow = -40;
+ stateLow = "frozen_plant";
+ burn = 40;
+ burnTime = 50;
+ category = "life";
+ seed = true;
+ constructor(fruit, colours){
+ this.properties.fruit = fruit;
+ this.color = colours;
}
}
- }
- for(var i = 0; i < adjacentCoords.length; i++){
- let x = pixel.x+adjacentCoords[i][0];
- let y = pixel.y+adjacentCoords[i][1];
- if(isEmpty(x, y) || outOfBounds(x, y)) { continue; }
- let pixel2 = pixelMap[x][y];
- if(pixel2.element == "fruit_branch" || pixel2.element == "fruit_leaves" || pixel2.element == "wood"){
- if(pixel.fruit != "" && pixel2.fruit == ""){
- pixel2.fruit = pixel.fruit;
- } else if (pixel.fruit == "" && pixel2.fruit != ""){
- pixel.fruit = pixel2.fruit;
+
+ class fruit {
+ category = "food";
+ behavior = [["XX", "ST:fruit_leaves AND ST:fruit_branch AND ST:wood", "XX"],["ST:fruit_leaves AND ST:fruit_branch AND ST:wood", "XX", "ST:fruit_leaves AND ST:fruit_branch AND ST:wood"],["M2", "ST:fruit_leaves AND ST:fruit_branch AND ST:wood AND M1", "M2"]];
+ breakInto = "juice";
+ properties = {
+ type: "fruit",
+ };
+ isFood = true;
+ constructor(name, colour, jColour, type = "tree", sColour = false, extract = false, low = false){
+ this.properties.fruit = name;
+ this.color = colour;
+ this.breakIntoColor = jColour;
+ this.extract = (extract == false) ? undefined : extract;
+ if(type == "bush"){
+ this.behavior = [["XX", "ST:bush_cane", "XX"],["ST:bush_cane", "XX", "ST:bush_cane"],["M2", "ST:bush_cane AND M1", "M2"]];
+ } else if (type == "vine"){
+ this.behavior = behaviors.VINEFRUIT;
+ }
+ plants[type].push(name);
+ if(sColour != false){
+ if(type == "bush"){
+ elements[`${name}_seed`] = new bushSeed(name, sColour);
+ } else if (type == "vine"){
+ elements[`${name}_seed`] = new vineSeed(name, sColour, low);
+ } else {
+ elements[`${name}_seed`] = new treeSeed(name, sColour);
+ }
+ }
+ };
+ tick = function(pixel){
+ let chance = ethyleneChance.get(pixel.fruit);
+ for(let i = 0; i < squareCoords.length; i++){
+ let x = pixel.x+squareCoords[i][0], y = pixel.y+squareCoords[i][1];
+ if(isEmpty(x,y) && !outOfBounds(x,y) && Math.random() < chance){
+ createPixel("ethylene", x, y);
+ }
+ }
+ }
+ }
+ elements.tomato.tick = function(pixel){
+ let chance = ethyleneChance.get(pixel.fruit);
+ for(let i = 0; i < squareCoords.length; i++){
+ let x = pixel.x+squareCoords[i][0], y = pixel.y+squareCoords[i][1];
+ if(isEmpty(x,y) && !outOfBounds(x,y) && Math.random() < chance){
+ createPixel("ethylene", x, y);
+ }
+ }
+ }
+ elements.grape.tick = function(pixel){
+ let chance = ethyleneChance.get(pixel.fruit);
+ for(let i = 0; i < squareCoords.length; i++){
+ let x = pixel.x+squareCoords[i][0], y = pixel.y+squareCoords[i][1];
+ if(isEmpty(x,y) && !outOfBounds(x,y) && Math.random() < chance){
+ createPixel("ethylene", x, y);
+ }
+ }
+ }
+ elements.wood.properties = {age: 0, fruit: ""};
+
+ elements.nutrient_agar = {
+ category: "life",
+ behavior: behaviors.STURDYPOWDER,
+ properties: {
+ value: null,
+ },
+ state: "solid",
+ color: ["#edeae4", "#f2f0eb", "#e8e7e3", "#f5f1e9"],
+ tick: function(pixel) {
+ for(let coords of adjacentCoords){
+ let x = pixel.x+coords[0], y = pixel.y+coords[1];
+ let p2 = getPixel(x,y);
+ if(p2 != null){
+ if(["wine", "yeast", "grape", "apple", "plum"].includes(p2.element) && pixel.value == null){
+ pixel.value = "yeast";
+ } else if(p2.element == "mold" && pixel.value == null){
+ pixel.value = "mold";
+ }else if(p2.element == "mushroom_spore" && pixel.value == null){
+ pixel.value = "mushroom_spore";
+ }else if (p2.element == pixel.element && p2.value != null && pixel.value == null && Math.random()<0.0035){
+ pixel.value = p2.value;
+ }
+ }
+ }
+ if(Math.random() < 0.00075){
+ if(pixel.value == null && Math.random() < 0.025){
+ let elems = ["mold", "mold", "mushroom_spore"];
+ let elem = elems[Math.round(Math.random()*elems.length)];
+ while(elem == undefined){
+ elem = elems[Math.round(Math.random()*elems.length)];
+ }
+ changePixel(pixel, elem);
+ } else {
+ changePixel(pixel, pixel.value);
+ }
+ }
+ }
+ };
+
+ elements.mold = {
+ category: "life",
+ behavior: behaviors.POWDER,
+ color: ["#33402a", "#303d25", "#2b4f39", "#254231"],
+ reactions: {
+ cheese: {elem2: ["rotten_cheese", "rotten_cheese", "mold"], chance: 0.075},
+ meat: {elem2: ["rotten_meat", "rotten_meat", "mold"], chance: 0.075},
+ },
+ state: "solid",
+ tick: function(pixel){
+ for(let coords of adjacentCoords){
+ let x = pixel.x+coords[0], y = pixel.y+coords[1], p2 = getPixel(x,y);
+ if(p2 != null){
+ if(plants.includes(p2.element) && Math.random() < 0.025){
+ let elems = ["mold", "rotten_fruit", "rotten_fruit"];
+ let elem = elems[Math.round(Math.random()*elems.length)];
+ while(elem == undefined){
+ elem = elems[Math.round(Math.random()*elems.length)];
+ }
+ changePixel(p2, elem);
+ }
+ }
+ }
+ }
+ };
+
+ elements.rotten_fruit = {
+ color: ["#5e3d00", "#5c3c01", "#4a3205", "#634102"],
+ category: "life",
+ behavior: behaviors.POWDER,
+ reactions: {
+ cheese: {elem2: ["rotten_cheese", "rotten_cheese", "mold"], chance: 0.075},
+ meat: {elem2: ["rotten_meat", "rotten_meat", "mold"], chance: 0.075},
+ },
+ state: "solid",
+ };
+
+ elements.yeast = {
+ color: ["#e3d3a6", "#f2dea7", "#e3cf98", "#f2dfaa"],
+ category: "life",
+ density: 1033,
+ behavior: behaviors.POWDER,
+ reactions: {
+ sugar_water: {elem2: "wine", color2: ["#6e85b5", "#6d81ab"], chance: 0.00025},
+ water: {elem2: "seltzer", chance: 0.00005},
+ },
+ tick: function(pixel){
+ for(let coords of adjacentCoords){
+ let x = pixel.x+coords[0], y = pixel.y+coords[1], p2 = getPixel(x,y);
+ if(p2 != null){
+ if(p2.element == "juice" && Math.random() < 0.00025){
+ let rgb = getRGB(p2.color);
+ for(key in rgb){
+ rgb[key] = Math.max(rgb[key] - 10, 0);
+ }
+ changePixel(p2, "wine");
+ p2.color = normalize(rgb);
+ }
+ }
+ }
+ }
+ }
+
+ elements.fruit_branch = {
+ color: elements.tree_branch.color,
+ behavior: [
+ "XX|XX|XX",
+ "XX|XX|XX",
+ "XX|XX|XX",
+ ],
+ tempHigh: 100,
+ stateHigh: "wood",
+ tempLow: -30,
+ stateLow: "wood",
+ category: "life",
+ burn: 40,
+ burnTime: 50,
+ burnInto: ["sap","ember","charcoal"],
+ hidden: true,
+ state: "solid",
+ density: 1500,
+ hardness: 0.15,
+ breakInto: ["sap","sawdust"],
+ seed: "apple_seed",
+ properties: {
+ age: 0,
+ fruit: "",
+ },
+ tick: function(pixel){
+ let pos = [[-1, -1], [0, -1], [1, -1]];
+ for(let i = 0; i < pos.length; i++){
+ let x = pixel.x+pos[i][0], y = pixel.y+pos[i][1];
+ if(isEmpty(x,y) && !outOfBounds(x,y)){
+ if(Math.random() < 0.035){
+ let elemArr = (pos[i][0] == 0) ? ["fruit_leaves","fruit_leaves","fruit_leaves","fruit_branch","fruit_branch"] : ["fruit_branch", "fruit_branch", "fruit_leaves", "fruit_leaves", "wood"];
+ createPixel(elemArr[Math.round(Math.random()*elemArr.length)], x, y);
+ }
+ }
+ }
+ for(var i = 0; i < adjacentCoords.length; i++){
+ let x = pixel.x+adjacentCoords[i][0];
+ let y = pixel.y+adjacentCoords[i][1];
+ if(isEmpty(x, y) || outOfBounds(x, y)) { continue; }
+ let pixel2 = pixelMap[x][y];
+ if(pixel2.element == "fruit_branch" || pixel2.element == "fruit_leaves" || pixel2.element == "wood"){
+ if(pixel.fruit != "" && pixel2.fruit == ""){
+ pixel2.fruit = pixel.fruit;
+ } else if (pixel.fruit == "" && pixel2.fruit != ""){
+ pixel.fruit = pixel2.fruit;
+ }
+ }
}
}
}
- }
-}
-elements.fruit_leaves = {
- color: elements.plant.color,
- behavior: [
- "XX|XX|XX",
- "XX|XX|XX",
- "XX|XX|XX",
- ],
- reactions: {
- "vinegar": { elem1:"dead_plant", elem2:null, chance:0.035 },
- "baking_soda": { elem1:"dead_plant", elem2:null, chance:0.01 },
- "bleach": { elem1:"dead_plant", elem2:null, chance:0.05 },
- "alcohol": { elem1:"dead_plant", elem2:null, chance:0.035 }
- },
- category:"life",
- tempHigh: 100,
- stateHigh: "dead_plant",
- tempLow: -1.66,
- stateLow: "frozen_plant",
- burn:65,
- burnTime:60,
- burnInto: "dead_plant",
- breakInto: "dead_plant",
- state: "solid",
- density: 1050,
- hidden: true,
- properties: {
- age: 0,
- fruit: "",
- growthStage: 0,
- dir: [1,1],
- bloomColor: "#FFE2E2",
- },
- tick: function(pixel){
- if(pixel.dieAfter != undefined){
- let chance = (pixel.age-pixel.dieAfter)/150;
- chance = Math.max(0, Math.min(1, chance));
- if(Math.random() < chance){
- changePixel(pixel, "dead_plant");
- let neighbors = [], boolArr = [];
-
- for(let coords of squareCoords){
- let x = pixel.x+coords[0], y = pixel.y+coords[1];
- let p2 = getPixel(x,y);
- if(p2 != null){
- neighbors[neighbors.length] = p2;
- boolArr[boolArr.length] = (p2.dieAfter != undefined);
+ elements.fruit_leaves = {
+ color: elements.plant.color,
+ behavior: [
+ "XX|XX|XX",
+ "XX|XX|XX",
+ "XX|XX|XX",
+ ],
+ reactions: {
+ "vinegar": { elem1:"dead_plant", elem2:null, chance:0.035 },
+ "baking_soda": { elem1:"dead_plant", elem2:null, chance:0.01 },
+ "bleach": { elem1:"dead_plant", elem2:null, chance:0.05 },
+ "alcohol": { elem1:"dead_plant", elem2:null, chance:0.035 }
+ },
+ category:"life",
+ tempHigh: 100,
+ stateHigh: "dead_plant",
+ tempLow: -1.66,
+ stateLow: "frozen_plant",
+ burn:65,
+ burnTime:60,
+ burnInto: "dead_plant",
+ breakInto: "dead_plant",
+ state: "solid",
+ density: 1050,
+ hidden: true,
+ properties: {
+ age: 0,
+ fruit: "",
+ growthStage: 0,
+ dir: [1,1],
+ bloomColor: "#FFE2E2",
+ },
+ tick: function(pixel){
+ if(pixel.dieAfter != undefined){
+ let chance = (pixel.age-pixel.dieAfter)/150;
+ chance = Math.max(0, Math.min(1, chance));
+ if(Math.random() < chance){
+ changePixel(pixel, "dead_plant");
+ let neighbors = [], boolArr = [];
+
+ for(let coords of squareCoords){
+ let x = pixel.x+coords[0], y = pixel.y+coords[1];
+ let p2 = getPixel(x,y);
+ if(p2 != null){
+ neighbors[neighbors.length] = p2;
+ boolArr[boolArr.length] = (p2.dieAfter != undefined);
+ }
+ }
+ if(boolArr.includes(true)){
+ for(let coords of squareCoords){
+ let x = pixel.x+coords[0], y = pixel.y+coords[1];
+ let p2 = getPixel(x,y);
+ if(p2 != null){
+ if(p2.dieAfter != undefined){
+ p2.age = p2.dieAfter+150;
+ }
+ }
+ }
}
}
- if(boolArr.includes(true)){
- for(let coords of squareCoords){
- let x = pixel.x+coords[0], y = pixel.y+coords[1];
- let p2 = getPixel(x,y);
- if(p2 != null){
- if(p2.dieAfter != undefined){
- p2.age = p2.dieAfter+150;
+
+ }
+ if(pixelTicks == pixel.start + 1 && pixel.blooming == undefined && !pixel.growthPattern && !pixel.noBloom){
+ if(Math.floor(Math.random() * 3) == 2){
+ pixel.blooming = true;
+ pixel.color ="#FFE2E2";
+ } else {
+ pixel.blooming = false;
+ }
+ }
+ if(pixel.blooming && elements[pixel.fruit] != undefined && elements[pixel.fruit].bloomColor != undefined && !elements[pixel.fruit].bloomColor.includes(pixel.bloomColor)){
+ pixel.bloomColor = elements[pixel.fruit].bloomColor;
+ }
+ if(pixel.blooming && !pixel.bloomColor.includes(pixel.c)){
+ let color = "";
+ if(Array.isArray(pixel.bloomColor)){
+ color = pixel.bloomColor[Math.round(Math.random()*pixel.bloomColor.length)];
+ while(color == undefined){
+ color = pixel.bloomColor[Math.round(Math.random()*pixel.bloomColor.length)];
+ }
+ } else {
+ color = pixel.bloomColor;
+ }
+ pixel.c = color;
+ let range = (elements[pixel.fruit] && elements[pixel.fruit].bloomRange) ? elements[pixel.fruit].bloomRange : 5;
+ let rgb = (color.startsWith("#")) ? hexToRGB(color) : getRGB(color);
+ let num = (Math.round(Math.random()*(range*2)))-range;
+ color = RGBToHex({r: Math.max(0, Math.min(255, rgb.r+num)), g: Math.max(0, Math.min(255, rgb.g+num)), b: Math.max(0, Math.min(255, rgb.b+num))});
+
+ pixel.color = color;
+ }
+ for(var i = 0; i < adjacentCoords.length; i++){
+ let x = pixel.x+adjacentCoords[i][0];
+ let y = pixel.y+adjacentCoords[i][1];
+ if(isEmpty(x, y) || outOfBounds(x, y)) { continue; }
+ let pixel2 = pixelMap[x][y];
+ if((["fruit_vine", "fruit_branch", "fruit_leaves", "low_fruit_vine", "wood"].includes(pixel2.element) || (pixel2.type && pixel2.type == "fruit")) && pixel2.fruit != "pineapple"){
+ if(pixel.fruit && !pixel2.fruit){
+ pixel2.fruit = pixel.fruit;
+ } else if (!pixel.fruit && pixel2.fruit){
+ pixel.fruit = pixel2.fruit;
+ }
+ if(pixel.age && !pixel2.age){
+ pixel2.age = pixel.age;
+ } else if (!pixel.age && pixel2.age){
+ pixel.age = pixel2.age;
+ }
+ } else if(pixel2.element == "bee" && pixel.blooming){
+ for(let value of pixel2.fruitPollen){
+ if(value.fruit == pixel.fruit){
+ let rgb1 = (value.color.startsWith("#")) ? hexToRGB(value.color) : getRGB(value.color);
+ let rgb2 = (pixel.color.startsWith("#")) ? hexToRGB(pixel.color) : getRGB(pixel.color);
+ let combinedRGB = {r: (rgb1.r+rgb2.r)/2, g: (rgb1.g+rgb2.g)/2, b: (rgb1.b+rgb2.b)/2};
+ pixel.offspringColor = combinedRGB;
+ }
+ }
+ }
+ }
+ if(pixel.blooming && pixel.fruit == "pineapple" && Math.random() < 0.0035){
+ let x = pixel.x, y = pixel.y;
+ changePixel(pixel, "unripe_fruit");
+ pixelMap[x][y].fruit = "pineapple";
+ }
+ if(pixel.blooming && !flowerExclude.includes(pixel.fruit)){
+ let chance = 0.0025;
+ for(let i = 0; i < squareCoords.length; i++){
+ let x = pixel.x+squareCoords[i][0], y = pixel.y+squareCoords[i][1];
+ if(!isEmpty(x,y) && !outOfBounds(x,y)){
+ let p2 = pixelMap[x][y];
+ if(["ethylene","propylene"].includes(p2.element)){
+ chance = [0.01, 0.0035][["ethylene","propylene"].indexOf(p2.element)] || chance;
+
}
}
}
- }
- }
-
- }
- if(pixelTicks == pixel.start + 1 && pixel.blooming == undefined && !pixel.growthPattern && !pixel.noBloom){
- if(Math.floor(Math.random() * 3) == 2){
- pixel.blooming = true;
- pixel.color ="#FFE2E2";
- } else {
- pixel.blooming = false;
- }
- }
- if(pixel.blooming && elements[pixel.fruit] != undefined && elements[pixel.fruit].bloomColor != undefined && !elements[pixel.fruit].bloomColor.includes(pixel.bloomColor)){
- pixel.bloomColor = elements[pixel.fruit].bloomColor;
- }
- if(pixel.blooming && !pixel.bloomColor.includes(pixel.c)){
- let color = "";
- if(Array.isArray(pixel.bloomColor)){
- color = pixel.bloomColor[Math.round(Math.random()*pixel.bloomColor.length)];
- while(color == undefined){
- color = pixel.bloomColor[Math.round(Math.random()*pixel.bloomColor.length)];
- }
- } else {
- color = pixel.bloomColor;
- }
- pixel.c = color;
- let range = (elements[pixel.fruit] && elements[pixel.fruit].bloomRange) ? elements[pixel.fruit].bloomRange : 5;
- let rgb = (color.startsWith("#")) ? hexToRGB(color) : getRGB(color);
- let num = (Math.round(Math.random()*(range*2)))-range;
- color = RGBToHex({r: Math.max(0, Math.min(255, rgb.r+num)), g: Math.max(0, Math.min(255, rgb.g+num)), b: Math.max(0, Math.min(255, rgb.b+num))});
-
- pixel.color = color;
- }
- for(var i = 0; i < adjacentCoords.length; i++){
- let x = pixel.x+adjacentCoords[i][0];
- let y = pixel.y+adjacentCoords[i][1];
- if(isEmpty(x, y) || outOfBounds(x, y)) { continue; }
- let pixel2 = pixelMap[x][y];
- if((["fruit_vine", "fruit_branch", "fruit_leaves", "low_fruit_vine", "wood"].includes(pixel2.element) || (pixel2.type && pixel2.type == "fruit")) && pixel2.fruit != "pineapple"){
- if(pixel.fruit && !pixel2.fruit){
- pixel2.fruit = pixel.fruit;
- } else if (!pixel.fruit && pixel2.fruit){
- pixel.fruit = pixel2.fruit;
- }
- if(pixel.age && !pixel2.age){
- pixel2.age = pixel.age;
- } else if (!pixel.age && pixel2.age){
- pixel.age = pixel2.age;
- }
- } else if(pixel2.element == "bee" && pixel.blooming){
- for(let value of pixel2.fruitPollen){
- if(value.fruit == pixel.fruit){
- let rgb1 = (value.color.startsWith("#")) ? hexToRGB(value.color) : getRGB(value.color);
- let rgb2 = (pixel.color.startsWith("#")) ? hexToRGB(pixel.color) : getRGB(pixel.color);
- let combinedRGB = {r: (rgb1.r+rgb2.r)/2, g: (rgb1.g+rgb2.g)/2, b: (rgb1.b+rgb2.b)/2};
- pixel.offspringColor = combinedRGB;
- }
- }
- }
- }
- if(pixel.blooming && pixel.fruit == "pineapple" && Math.random() < 0.0035){
- let x = pixel.x, y = pixel.y;
- changePixel(pixel, "unripe_fruit");
- pixelMap[x][y].fruit = "pineapple";
- }
- if(pixel.blooming && !flowerExclude.includes(pixel.fruit)){
- let chance = 0.0025;
- for(let i = 0; i < squareCoords.length; i++){
- let x = pixel.x+squareCoords[i][0], y = pixel.y+squareCoords[i][1];
- if(!isEmpty(x,y) && !outOfBounds(x,y)){
- let p2 = pixelMap[x][y];
- if(["ethylene","propylene"].includes(p2.element)){
- chance = [0.01, 0.0035][["ethylene","propylene"].indexOf(p2.element)] || chance;
-
+ if(pixelTicks > pixel.start + 150){
+ if(Math.random() < chance){
+ if(pixel.fruit){
+ if(pixel.fruit == "random"){
+ changePixel(pixel, fruits[Math.floor(Math.random() * fruits.length)]);
+ } else {
+ let c = (pixel.offspringColor) ? pixel.offspringColor : undefined;
+ changePixel(pixel, pixel.fruit);
+ if(c != undefined){
+ pixel.bloomColor = c;
+ }
}
- }
- }
- if(pixelTicks > pixel.start + 150){
- if(Math.random() < chance){
- if(pixel.fruit){
- if(pixel.fruit == "random"){
- changePixel(pixel, fruits[Math.floor(Math.random() * fruits.length)]);
- } else {
- let c = (pixel.offspringColor) ? pixel.offspringColor : undefined;
- changePixel(pixel, pixel.fruit);
- if(c != undefined){
- pixel.bloomColor = c;
}
}
}
}
- }
- }
- if(pixel.growthPattern == true){
- let chance = (pixel.age-150)/2500;
- chance = Math.max(Math.min(chance, 1), 0);
- if(Math.random() < chance){
- let value = growthPatterns[pixel.pattern][pixel.growthStage];
- if(pixel.growthStage < growthPatterns[pixel.pattern].length && is2d(value)){
- for(let coords of value){
- let x = pixel.x+(coords[0]*pixel.dir[0]), y = pixel.y+(coords[1]*pixel.dir[1]);
+ if(pixel.growthPattern == true){
+ let chance = (pixel.age-150)/2500;
+ chance = Math.max(Math.min(chance, 1), 0);
+ if(Math.random() < chance){
+ let value = growthPatterns[pixel.pattern][pixel.growthStage];
+ if(pixel.growthStage < growthPatterns[pixel.pattern].length && is2d(value)){
+ for(let coords of value){
+ let x = pixel.x+(coords[0]*pixel.dir[0]), y = pixel.y+(coords[1]*pixel.dir[1]);
+ if(isEmpty(x,y) && !outOfBounds(x,y)){
+ if(growthElems[pixel.pattern][pixel.growthStage] == "flower"){
+ createPixel("fruit_leaves", x, y);
+ pixelMap[x][y].blooming = true;
+ pixelMap[x][y].fruit = pixel.fruit;
+ } else {
+ createPixel((growthElems[pixel.pattern][pixel.growthStage] == undefined) ? growthElems[pixel.pattern][0] : growthElems[pixel.pattern][pixel.growthStage], x, y);
+ pixelMap[x][y].noBloom = true;
+ pixelMap[x][y].dieAfter = pixel.dieAfter;
+ }
+ }
+ }
+ } else if(pixel.growthStage < growthPatterns[pixel.pattern].length) {
+ let x = pixel.x+(value[0]*pixel.dir[0]), y = pixel.y+(value[1]*pixel.dir[1]);
if(isEmpty(x,y) && !outOfBounds(x,y)){
if(growthElems[pixel.pattern][pixel.growthStage] == "flower"){
createPixel("fruit_leaves", x, y);
pixelMap[x][y].blooming = true;
- pixelMap[x][y].fruit = pixel.fruit;
+ pixelMap[x][y].fruit = pixel.fruit.split("_")[0];
} else {
createPixel((growthElems[pixel.pattern][pixel.growthStage] == undefined) ? growthElems[pixel.pattern][0] : growthElems[pixel.pattern][pixel.growthStage], x, y);
pixelMap[x][y].noBloom = true;
@@ -533,972 +636,981 @@ elements.fruit_leaves = {
}
}
}
- } else if(pixel.growthStage < growthPatterns[pixel.pattern].length) {
- let x = pixel.x+(value[0]*pixel.dir[0]), y = pixel.y+(value[1]*pixel.dir[1]);
- if(isEmpty(x,y) && !outOfBounds(x,y)){
- if(growthElems[pixel.pattern][pixel.growthStage] == "flower"){
- createPixel("fruit_leaves", x, y);
- pixelMap[x][y].blooming = true;
- pixelMap[x][y].fruit = pixel.fruit.split("_")[0];
- } else {
- createPixel((growthElems[pixel.pattern][pixel.growthStage] == undefined) ? growthElems[pixel.pattern][0] : growthElems[pixel.pattern][pixel.growthStage], x, y);
- pixelMap[x][y].noBloom = true;
- pixelMap[x][y].dieAfter = pixel.dieAfter;
- }
- }
+ pixel.growthStage += 1;
}
- pixel.growthStage += 1;
+ }
+ pixel.age++;
+ }
+ }
+
+
+
+ class bushSeed{
+ behavior = behaviors.STURDYPOWDER;
+ category = "life";
+ properties = {
+ age: 0,
+ };
+ tick = function(pixel){
+ if(pixel.age > 40){
+ let x1 = pixel.x - 1;
+ let y = pixel.y;
+ let x2 = pixel.x + 1;
+ if(isEmpty(x1,y) && !outOfBounds(x1,y)){
+ createPixel("bush_base", x1, y);
+ pixelMap[x1][y].fruit = pixel.fruit;
+ }
+ if(isEmpty(x2,y) && !outOfBounds(x2,y)){
+ createPixel("bush_base", x2, y);
+ pixelMap[x2][y].fruit = pixel.fruit;
+ }
+ if(!isEmpty(x1, y) && !isEmpty(x2, y)){
+ deletePixel(pixel.x, pixel.y);
+ }
+ }
+ pixel.age += 1;
+ };
+ constructor(fruit, colour){
+ this.properties.fruit = fruit;
+ this.color = colour;
}
}
- pixel.age++;
- }
-}
-
-
-
-class bushSeed{
- behavior = behaviors.STURDYPOWDER;
- category = "life";
- properties = {
- age: 0,
- };
- tick = function(pixel){
- if(pixel.age > 40){
- let x1 = pixel.x - 1;
- let y = pixel.y;
- let x2 = pixel.x + 1;
- if(isEmpty(x1,y) && !outOfBounds(x1,y)){
- createPixel("bush_base", x1, y);
- pixelMap[x1][y].fruit = pixel.fruit;
- }
- if(isEmpty(x2,y) && !outOfBounds(x2,y)){
- createPixel("bush_base", x2, y);
- pixelMap[x2][y].fruit = pixel.fruit;
- }
- if(!isEmpty(x1, y) && !isEmpty(x2, y)){
- deletePixel(pixel.x, pixel.y);
- }
- }
- pixel.age += 1;
- };
- constructor(fruit, colour){
- this.properties.fruit = fruit;
- this.color = colour;
- }
-}
-elements.bush_base = {
- color: elements.wood.color,
- behavior: [
- ["CR:bush_cane%25", "XX", "CR:bush_cane%25"],
- ["XX", "XX", "XX"],
- ["XX", "XX", "XX"]
- ],
- tempHigh: 100,
- stateHigh: "dead_plant",
- tempLow: -40,
- stateLow: "frozen_plant",
- burn: 65,
- burnTime: 15,
- category: "life",
- state: "solid",
- tick: function(pixel){
- let caneCoords = [[-1,-1],[1,-1]];
- for(var i = 0; i < caneCoords.length; i++){
- let x = pixel.x + caneCoords[i][0];
- let y = pixel.y + caneCoords[i][1];
- if(!isEmpty(x,y) && !outOfBounds(x,y)){
- let pixel2 = pixelMap[x][y];
- if(pixel2.element == "bush_cane" && !pixel2.fruit){
- pixel2.fruit = pixel.fruit;
+ elements.bush_base = {
+ color: elements.wood.color,
+ behavior: [
+ ["CR:bush_cane%25", "XX", "CR:bush_cane%25"],
+ ["XX", "XX", "XX"],
+ ["XX", "XX", "XX"]
+ ],
+ tempHigh: 100,
+ stateHigh: "dead_plant",
+ tempLow: -40,
+ stateLow: "frozen_plant",
+ burn: 65,
+ burnTime: 15,
+ category: "life",
+ state: "solid",
+ tick: function(pixel){
+ let caneCoords = [[-1,-1],[1,-1]];
+ for(var i = 0; i < caneCoords.length; i++){
+ let x = pixel.x + caneCoords[i][0];
+ let y = pixel.y + caneCoords[i][1];
+ if(!isEmpty(x,y) && !outOfBounds(x,y)){
+ let pixel2 = pixelMap[x][y];
+ if(pixel2.element == "bush_cane" && !pixel2.fruit){
+ pixel2.fruit = pixel.fruit;
+ }
+ }
}
- }
+ }
+ };
+ elements.bush_cane = {
+ color: elements.wood.color,
+ tick: function(pixel){
+ if(pixel.age < 200 && Math.floor(Math.random() * 40) == 1){
+ if(!outOfBounds(pixel.x,pixel.y-1)){
+ if(isEmpty(pixel.x,pixel.y-1)){
+ createPixel("bush_cane",pixel.x,pixel.y-1);
+ if(pixel.fruit){
+ let pixel2 = pixelMap[pixel.x][pixel.y-1];
+ pixel2.fruit = pixel.fruit;
+ pixel2.age = pixel.age;
+ }
+ }
+ }
+ }
+ if(pixel.fruit && Math.floor(Math.random() * 400) == 1 && pixel.age > 200){
+ for(var i = 0; i < adjacentCoords.length; i++){
+ let x = pixel.x + adjacentCoords[i][0];
+ let y = pixel.y + adjacentCoords[i][1];
+ if(isEmpty(x,y) && !outOfBounds(x,y)){
+ createPixel("fruit_leaves", x, y);
+ pixelMap[x][y].fruit = pixel.fruit;
+ pixel.blooming = [true, false][Math.floor(Math.random() * 2)];
+ }
+ }
+ }
+ pixel.age += 1;
+ },
+ properties: {
+ age: 0,
+ },
+ category: "life",
+ tempLow: -2,
+ stateLow: "frozen_plant",
}
- }
-};
-elements.bush_cane = {
- color: elements.wood.color,
- tick: function(pixel){
- if(pixel.age < 200 && Math.floor(Math.random() * 40) == 1){
- if(!outOfBounds(pixel.x,pixel.y-1)){
- if(isEmpty(pixel.x,pixel.y-1)){
- createPixel("bush_cane",pixel.x,pixel.y-1);
- if(pixel.fruit){
- let pixel2 = pixelMap[pixel.x][pixel.y-1];
- pixel2.fruit = pixel.fruit;
- pixel2.age = pixel.age;
+
+
+ elements.low_fruit_vine = {
+ color: elements.plant.color,
+ behavior: behaviors.WALL,
+ category: "life",
+ properties: {
+ age: 0,
+ },
+ tick: function(pixel){
+ if(isEmpty(pixel.x, pixel.y - 1) && !outOfBounds(pixel.x, pixel.y - 1) && Math.random() < ((pixel.age/50000 > 0.005) ? 0.005 : (pixel.age/50000)) && pixel.fruit && ![undefined, "watermelon", "pumpkin"].includes(pixel.fruit)){
+ createPixel("fruit_leaves", pixel.x, pixel.y - 1);
+ pixelMap[pixel.x][pixel.y - 1].blooming = true;
+ pixelMap[pixel.x][pixel.y - 1].color = "#FFE2E2";
+ pixelMap[pixel.x][pixel.y - 1].fruit = pixel.fruit;
+ }
+ if(Math.floor(Math.random() * 100) == 1 && !["watermelon", "pumpkin", undefined].includes(pixel.fruit)){
+ let num = (Math.random() > 0.5) ? -1 : 1;
+ if(isEmpty(pixel.x + num, pixel.y)){
+ createPixel("low_fruit_vine", pixel.x + num, pixel.y);
+ pixelMap[pixel.x + num][pixel.y].fruit = pixel.fruit;
+ }
+ }
+ pixel.age++;
+ }
+ }
+ let str = "";
+ for(let i = 0; i < vineGrow.length; i++){
+ str += (i == vineGrow.length-1) ? `ST:${vineGrow[i]}` : `ST:${vineGrow[i]} AND `;
+ }
+ elements.fruit_vine = {
+ category: "life",
+ color: elements.plant.color,
+ behavior: [["XX", str, "XX"], [str, "XX", str], ["XX", str + " AND M1", "XX"]],
+ properties: {
+ age: 0,
+ },
+ tick: function(pixel){
+ if(Math.floor(Math.random() * 100) == 1 && pixel.age > 25 && pixel.age < 500){
+ for(var i = 0; i < squareCoords.length; i++){
+ let x1 = pixel.x + squareCoords[i][0];
+ let y1 = pixel.y + squareCoords[i][1];
+ if(!isEmpty(x1,y1) && !outOfBounds(x1,y1) && vineGrow.includes(pixelMap[x1][y1].element)){
+ //pixel.drag = true;
+ let randomNum = Math.floor(Math.random() * 4);
+ let x2 = x1 + squareCoords[randomNum][0];
+ let y2 = y1 + squareCoords[randomNum][1];
+ if(isEmpty(x2,y2) && !outOfBounds(x2,y2)){
+ createPixel("fruit_vine", x2, y2);
+ pixelMap[x2][y2].fruit = pixel.fruit;
+ pixelMap[x2][y2].bloomColor = pixel.bloomColor;
+ }
+ } //else {pixel.drag = false;}
+ }
+ }
+ pixel.age += 1;
+ if(pixel.fruit){
+ for(var i = 0; i < adjacentCoords.length; i++){
+ let x = pixel.x + adjacentCoords[i][0];
+ let y = pixel.y + adjacentCoords[i][1];
+ if(isEmpty(x,y) && !outOfBounds(x,y) && Math.floor(Math.random() * 5000) == 5 && pixel.age > 650){
+ createPixel("fruit_leaves", x, y);
+ pixelMap[x][y].blooming = true;
+ pixelMap[x][y].bloomColor = pixel.bloomColor;
+ }
+ }
+ }
+ if(!pixel.fruit){
+ for(var i = 0; i < squareCoords.length; i++){
+ let x = pixel.x + squareCoords[i][0];
+ let y = pixel.y + squareCoords[i][1];
+ if(isEmpty(x,y) || outOfBounds(x,y)){ continue; }
+ let pixel2 = pixelMap[x][y];
+ if(pixel2.fruit){
+ pixel.fruit = pixel2.fruit;
+ } else { continue; }
}
}
}
}
- if(pixel.fruit && Math.floor(Math.random() * 400) == 1 && pixel.age > 200){
- for(var i = 0; i < adjacentCoords.length; i++){
- let x = pixel.x + adjacentCoords[i][0];
- let y = pixel.y + adjacentCoords[i][1];
- if(isEmpty(x,y) && !outOfBounds(x,y)){
- createPixel("fruit_leaves", x, y);
- pixelMap[x][y].fruit = pixel.fruit;
- pixel.blooming = [true, false][Math.floor(Math.random() * 2)];
+
+ behaviors.VINEFRUIT = ["XX|ST:fruit_vine AND ST:low_fruit_vine|XX",
+ "ST:fruit_vine AND ST:low_fruit_vine|XX|ST:fruit_vine AND ST:low_fruit_vine",
+ "M2|M1|M2"];
+ elements.grape.behavior = behaviors.VINEFRUIT;
+ elements.tomato.behavior = behaviors.VINEFRUIT;
+ elements.grape_seed = new vineSeed("grape",["#281B01", "#2D1F06", "#2D1F06"]);
+ elements.tomato_seed = new vineSeed("tomato", ["#F8F5D1","#E7E5CF","#E3E1C5"]);
+ elements.apple = new fruit("apple", ["#FF0507", "#EC0A0D", "#F22426", "#DC2C2E"], ["#F9C497", "#EED3BB", "#EEDEBB"]);
+ elements.apple.bloomColor = ["#fff0f7", "#fcebf3", "#fff0f7", "#ffe6f2", "#fff7fb"];
+ elements.apple_seed = new treeSeed("apple", ["#3B1C01", "#3E2107", "#3A1C02"]);
+
+ elements.juice.tick = function(pixel){
+ for(let i = 0; i < squareCoords.length; i++){
+ let x = pixel.x+squareCoords[i][0], y = pixel.y+squareCoords[i][1];
+ if(!isEmpty(x,y) && !outOfBounds(x,y) && pixelMap[x][y].element == pixel.element && Math.random() < 0.005){
+ colorMix(pixel, pixelMap[x][y]);
+ }
}
- }
}
- pixel.age += 1;
- },
- properties: {
- age: 0,
- },
- category: "life",
- tempLow: -2,
- stateLow: "frozen_plant",
-}
-
-
-elements.low_fruit_vine = {
- color: elements.plant.color,
- behavior: behaviors.WALL,
- category: "life",
- properties: {
- age: 0,
- },
- tick: function(pixel){
- if(isEmpty(pixel.x, pixel.y - 1) && !outOfBounds(pixel.x, pixel.y - 1) && Math.random() < ((pixel.age/50000 > 0.005) ? 0.005 : (pixel.age/50000)) && pixel.fruit && ![undefined, "watermelon", "pumpkin"].includes(pixel.fruit)){
- createPixel("fruit_leaves", pixel.x, pixel.y - 1);
- pixelMap[pixel.x][pixel.y - 1].blooming = true;
- pixelMap[pixel.x][pixel.y - 1].color = "#FFE2E2";
- pixelMap[pixel.x][pixel.y - 1].fruit = pixel.fruit;
- }
- if(Math.floor(Math.random() * 100) == 1 && !["watermelon", "pumpkin", undefined].includes(pixel.fruit)){
- let num = (Math.random() > 0.5) ? -1 : 1;
- if(isEmpty(pixel.x + num, pixel.y)){
- createPixel("low_fruit_vine", pixel.x + num, pixel.y);
- pixelMap[pixel.x + num][pixel.y].fruit = pixel.fruit;
- }
- }
- pixel.age++;
- }
-}
-let str = "";
-for(let i = 0; i < vineGrow.length; i++){
- str += (i == vineGrow.length-1) ? `ST:${vineGrow[i]}` : `ST:${vineGrow[i]} AND `;
-}
-elements.fruit_vine = {
- category: "life",
- color: elements.plant.color,
- behavior: [["XX", str, "XX"], [str, "XX", str], ["XX", str + " AND M1", "XX"]],
- properties: {
- age: 0,
- },
- tick: function(pixel){
- if(Math.floor(Math.random() * 100) == 1 && pixel.age > 25 && pixel.age < 500){
- for(var i = 0; i < squareCoords.length; i++){
- let x1 = pixel.x + squareCoords[i][0];
- let y1 = pixel.y + squareCoords[i][1];
- if(!isEmpty(x1,y1) && !outOfBounds(x1,y1) && vineGrow.includes(pixelMap[x1][y1].element)){
- //pixel.drag = true;
- let randomNum = Math.floor(Math.random() * 4);
- let x2 = x1 + squareCoords[randomNum][0];
- let y2 = y1 + squareCoords[randomNum][1];
- if(isEmpty(x2,y2) && !outOfBounds(x2,y2)){
- createPixel("fruit_vine", x2, y2);
- pixelMap[x2][y2].fruit = pixel.fruit;
- pixelMap[x2][y2].bloomColor = pixel.bloomColor;
- }
- } //else {pixel.drag = false;}
- }
- }
- pixel.age += 1;
- if(pixel.fruit){
- for(var i = 0; i < adjacentCoords.length; i++){
- let x = pixel.x + adjacentCoords[i][0];
- let y = pixel.y + adjacentCoords[i][1];
- if(isEmpty(x,y) && !outOfBounds(x,y) && Math.floor(Math.random() * 5000) == 5 && pixel.age > 650){
- createPixel("fruit_leaves", x, y);
- pixelMap[x][y].blooming = true;
- pixelMap[x][y].bloomColor = pixel.bloomColor;
+ elements.juice.onMix = function(pixel){
+ for(let i = 0; i < squareCoords.length; i++){
+ let x = pixel.x+squareCoords[i][0], y = pixel.y+squareCoords[i][1];
+ if(!isEmpty(x,y) && !outOfBounds(x,y) && pixelMap[x][y].element == pixel.element && Math.random() < 0.5){
+ colorMix(pixel, pixelMap[x][y]);
+ }
}
- }
}
- if(!pixel.fruit){
- for(var i = 0; i < squareCoords.length; i++){
- let x = pixel.x + squareCoords[i][0];
- let y = pixel.y + squareCoords[i][1];
- if(isEmpty(x,y) || outOfBounds(x,y)){ continue; }
- let pixel2 = pixelMap[x][y];
- if(pixel2.fruit){
- pixel.fruit = pixel2.fruit;
- } else { continue; }
- }
+ elements.fruit_milk.tick = function(pixel){
+ for(let i = 0; i < squareCoords.length; i++){
+ let x = pixel.x+squareCoords[i][0], y = pixel.y+squareCoords[i][1];
+ if(!isEmpty(x,y) && !outOfBounds(x,y) && pixelMap[x][y].element == pixel.element && Math.random() < 0.005){
+ colorMix(pixel, pixelMap[x][y]);
+ }
+ }
}
- }
-}
-
-behaviors.VINEFRUIT = ["XX|ST:fruit_vine AND ST:low_fruit_vine|XX",
-"ST:fruit_vine AND ST:low_fruit_vine|XX|ST:fruit_vine AND ST:low_fruit_vine",
-"M2|M1|M2"];
-elements.grape.behavior = behaviors.VINEFRUIT;
-elements.tomato.behavior = behaviors.VINEFRUIT;
-elements.grape_seed = new vineSeed("grape",["#281B01", "#2D1F06", "#2D1F06"]);
-elements.tomato_seed = new vineSeed("tomato", ["#F8F5D1","#E7E5CF","#E3E1C5"]);
-elements.apple = new fruit("apple", ["#FF0507", "#EC0A0D", "#F22426", "#DC2C2E"], ["#F9C497", "#EED3BB", "#EEDEBB"]);
-elements.apple.bloomColor = ["#fff0f7", "#fcebf3", "#fff0f7", "#ffe6f2", "#fff7fb"];
-elements.apple_seed = new treeSeed("apple", ["#3B1C01", "#3E2107", "#3A1C02"]);
-function colorMix(p1, p2, bias = 0.5){
- p1.color = interpolateRgb(getRGB(p1.color), getRGB(p2.color), bias);
- p2.color = interpolateRgb(getRGB(p1.color), getRGB(p2.color), bias);
-}
-function interpolateRgb(rgb1, rgb2, ratio = 0.5) {
- const interpolatedRgb = {
- r: Math.round(rgb1.r + (rgb2.r - rgb1.r) * ratio),
- g: Math.round(rgb1.g + (rgb2.g - rgb1.g) * ratio),
- b: Math.round(rgb1.b + (rgb2.b - rgb1.b) * ratio),
- };
- return normalize(interpolatedRgb);
-}
-function getRGB(rgb){
- let rgb2 = rgb.replace(")", "").replace("rgb(", "").replace(/,/g, "r").split("r")
- return { r: parseInt(rgb2[0]), g: parseInt(rgb2[1]), b: parseInt(rgb2[2]) };
-}
-
-elements.juice.tick = function(pixel){
- for(let i = 0; i < squareCoords.length; i++){
- let x = pixel.x+squareCoords[i][0], y = pixel.y+squareCoords[i][1];
- if(!isEmpty(x,y) && !outOfBounds(x,y) && pixelMap[x][y].element == pixel.element && Math.random() < 0.005){
- colorMix(pixel, pixelMap[x][y]);
- }
- }
-}
-elements.juice.onMix = function(pixel){
- for(let i = 0; i < squareCoords.length; i++){
- let x = pixel.x+squareCoords[i][0], y = pixel.y+squareCoords[i][1];
- if(!isEmpty(x,y) && !outOfBounds(x,y) && pixelMap[x][y].element == pixel.element && Math.random() < 0.5){
- colorMix(pixel, pixelMap[x][y]);
- }
- }
-}
-elements.fruit_milk.tick = function(pixel){
- for(let i = 0; i < squareCoords.length; i++){
- let x = pixel.x+squareCoords[i][0], y = pixel.y+squareCoords[i][1];
- if(!isEmpty(x,y) && !outOfBounds(x,y) && pixelMap[x][y].element == pixel.element && Math.random() < 0.005){
- colorMix(pixel, pixelMap[x][y]);
- }
- }
-}
-elements.fruit_milk.onMix = function(pixel){
- for(let i = 0; i < squareCoords.length; i++){
- let x = pixel.x+squareCoords[i][0], y = pixel.y+squareCoords[i][1];
- if(!isEmpty(x,y) && !outOfBounds(x,y) && pixelMap[x][y].element == pixel.element && Math.random() < 0.5){
- colorMix(pixel, pixelMap[x][y]);
- }
- }
-}
-function normalize(obj){
- return `rgb(${obj.r},${obj.g},${obj.b})`;
-}
-
-elements.milk.reactions.juice = {func: function(p1, p2){
- let rgb = interpolateRgb(getRGB(p1.color), getRGB(p2.color), 0.25);
- changePixel(p1, "fruit_milk");
- changePixel(p2, "fruit_milk");
- p1.color = rgb;
- p2.color = rgb;
- }
-};
-elements.juice.reactions.carbon_dioxide = { func: function(p1,p2){
- let rgb = interpolateRgb(getRGB(p1.color), getRGB(elements.water.color), 0.2);
- changePixel(p1, "soda");
- changePixel(p2, "foam");
- p1.color = rgb;
- p2.color = rgb;
- }
-}
-elements.juice.reactions.seltzer = { func: function(p1,p2){
- let rgb = interpolateRgb(getRGB(p1.color), getRGB(p2.color), 0.5);
- changePixel(p1, "soda");
- changePixel(p2, "foam");
- p1.color = rgb;
- p2.color = rgb;
- }
-}
-
-elements.milk.reactions.soda = {
- func: function(p1,p2){
- let rgb = interpolateRgb(getRGB(p1.color), getRGB(p2.color), 0.5);
- changePixel(p1, "pilk");
- changePixel(p2, "pilk");
- p1.color = rgb;
- p2.color = rgb;
- }
-}
-
-elements.seed_maker = {
- behavior: behaviors.WALL,
- category: "machines",
- tick: function(pixel){
- for(let i = 0; i < squareCoords.length; i++){
- let x = pixel.x+squareCoords[i][0], y = pixel.y+squareCoords[i][1];
- if((!isEmpty(x,y) && !outOfBounds(x,y)) && plants.includes(pixelMap[x][y].element)){
- let c = (pixelMap[x][y].bloomColor) ? pixelMap[x][y].bloomColor : undefined;
- changePixel(pixelMap[x][y], `${pixelMap[x][y].element}_seed`);
- if(c != undefined){
- pixelMap[x][y].bloomColor = c;
- }
- } else if ((!isEmpty(x,y) && !outOfBounds(x,y)) && pixelMap[x][y].alive == false){
- pixelMap[x][y].alive = true;
+ elements.fruit_milk.onMix = function(pixel){
+ for(let i = 0; i < squareCoords.length; i++){
+ let x = pixel.x+squareCoords[i][0], y = pixel.y+squareCoords[i][1];
+ if(!isEmpty(x,y) && !outOfBounds(x,y) && pixelMap[x][y].element == pixel.element && Math.random() < 0.5){
+ colorMix(pixel, pixelMap[x][y]);
}
- }
- }
-}
-
-elements.ethylene = {
- behavior: behaviors.GAS,
- category: "gases",
- reactionCatalysts: {
- gold: {e1: "water", product: "alcohol", chance: 0.025},
- copper: {e1: "oxygen", product: "vinegar", chance: 0.025}
- },
- reactions: {
- oxidized_copper: { elem1: "vinegar", elem2: "copper", chance: 0.025},
- },
- color: ["#fffffc", "#f7f7f2", "#eaebe6", "#ededed", "#f7f7f2", "#f2f2f2"],
- buttonColor: ["#fffffc", "#f7f7f2"],
- state: "gas",
- burnInto: ["carbon_dioxide", "steam"],
- burn: 100,
- burnTime: 15,
- stateHigh: "fire",
- tempHigh: 425,
- tick: function(pixel){
- catalyse(pixel);
- if(settings.cleargases){
- let rgb;
- if(settings.bg != undefined){
- rgb = interpolateRgb(hexToRGB("#E5EAEA"), hexToRGB(settings.bg), 0.85);
- } else {
- rgb = interpolateRgb(hexToRGB("#E5EAEA"), {r:0,g:0,b:0}, 0.85);
- }
- pixel.color = rgb;
- }else if (!["#fffffc", "#f7f7f2", "#eaebe6", "#ededed", "#f7f7f2", "#f2f2f2"].includes(pixel.color)){
- pixel.color = ["#fffffc", "#f7f7f2", "#eaebe6", "#ededed", "#f7f7f2", "#f2f2f2"][Math.floor(Math.random()*6)];
- };
- },
-}
-elements.propylene = {
- behavior: behaviors.GAS,
- category: "gases",
- reactionCatalysts: {
- nickel: {e1: "hydrogen", product: "propane", chance: 0.025},
- },
- color: ["#fffffc", "#f7f7f2", "#eaebe6", "#ededed", "#f7f7f2", "#f2f2f2"],
- buttonColor: ["#fffffc", "#f7f7f2"],
- state: "gas",
- burnInto: ["carbon_dioxide", "steam"],
- burn: 100,
- burnTime: 15,
- stateHigh: "fire",
- tempHigh: 425,
- tick: function(pixel){
- catalyse(pixel);
- let rgb;
- if(settings.cleargases){
- if(settings.bg != undefined){
- rgb = interpolateRgb(hexToRGB("#E5EAEA"), hexToRGB(settings.bg), 0.85);
- } else {
- rgb = interpolateRgb(hexToRGB("#E5EAEA"), {r:0,g:0,b:0}, 0.85);
- }
- pixel.color = rgb;
- } else if (!["#fffffc", "#f7f7f2", "#eaebe6", "#ededed", "#f7f7f2", "#f2f2f2"].includes(pixel.color)){
- pixel.color = ["#fffffc", "#f7f7f2", "#eaebe6", "#ededed", "#f7f7f2", "#f2f2f2"][Math.floor(Math.random()*6)];
- };
- },
-}
-elements.propane.reactionCatalysts = {
- aluminum: {e2: "hydrogen", product: "propylene", chance: 0.035},
- gallium: {e2: "hydrogen", product: "propylene", chance: 0.025},
-};
-elements.propane.tick = function(pixel){
- catalyse(pixel);
-}
-runAfterAutogen(()=>{
- let r;
- if(settings.cleargases){
- if(settings.bg != undefined){
- r = interpolateRgb(hexToRGB("#E5EAEA"), hexToRGB(settings.bg), 0.85);
- } else {
- r = interpolateRgb(hexToRGB("#E5EAEA"), {r:0,g:0,b:0}, 0.85);
+ }
+ }
+
+ elements.milk.reactions.juice = {func: function(p1, p2){
+ let rgb = interpolateRgb(getRGB(p1.color), getRGB(p2.color), 0.25);
+ changePixel(p1, "fruit_milk");
+ changePixel(p2, "fruit_milk");
+ p1.color = rgb;
+ p2.color = rgb;
}
};
- elements.ethylene.color = r;
- elements.propylene.color = r;
-})
-function catalyse(pixel){
- let rC = elements[pixel.element].reactionCatalysts;
- let neighbors = [];
- let p = [];
- for(let i = 0; i < squareCoords.length; i++){
- let x = pixel.x+squareCoords[i][0], y = pixel.y+squareCoords[i][1];
- if(!isEmpty(x,y) && !outOfBounds(x,y)){
- neighbors.push(pixelMap[x][y].element);
- p.push(pixelMap[x][y]);
- }
- }
- for(item in rC){
- if(neighbors.includes(item) && neighbors.includes(rC[item].e1) && Math.random() < rC[item].chance){
- changePixel(pixel, rC[item].product);
- if(rC[item].e2 != undefined){
- changePixel(p[neighbors.indexOf(rC[item].e1)], rC[item].e2);
- } else {
- let P = p[neighbors.indexOf(rC[item].e1)];
- deletePixel(P.x, P.y);
+ elements.juice.reactions.carbon_dioxide = { func: function(p1,p2){
+ let rgb = interpolateRgb(getRGB(p1.color), getRGB(elements.water.color), 0.2);
+ changePixel(p1, "soda");
+ changePixel(p2, "foam");
+ p1.color = rgb;
+ p2.color = rgb;
+ }
+ }
+ elements.juice.reactions.seltzer = { func: function(p1,p2){
+ let rgb = interpolateRgb(getRGB(p1.color), getRGB(p2.color), 0.5);
+ changePixel(p1, "soda");
+ changePixel(p2, "foam");
+ p1.color = rgb;
+ p2.color = rgb;
+ }
+ }
+
+ elements.milk.reactions.soda = {
+ func: function(p1,p2){
+ let rgb = interpolateRgb(getRGB(p1.color), getRGB(p2.color), 0.5);
+ changePixel(p1, "pilk");
+ changePixel(p2, "pilk");
+ p1.color = rgb;
+ p2.color = rgb;
+ }
+ }
+
+ elements.seed_maker = {
+ behavior: behaviors.WALL,
+ category: "machines",
+ tick: function(pixel){
+ for(let i = 0; i < squareCoords.length; i++){
+ let x = pixel.x+squareCoords[i][0], y = pixel.y+squareCoords[i][1];
+ if((!isEmpty(x,y) && !outOfBounds(x,y)) && plants.includes(pixelMap[x][y].element)){
+ let c = (pixelMap[x][y].bloomColor) ? pixelMap[x][y].bloomColor : undefined;
+ changePixel(pixelMap[x][y], `${pixelMap[x][y].element}_seed`);
+ if(c != undefined){
+ pixelMap[x][y].bloomColor = c;
+ }
+ } else if ((!isEmpty(x,y) && !outOfBounds(x,y)) && pixelMap[x][y].alive == false){
+ pixelMap[x][y].alive = true;
+ }
}
- } else if (rC[item].e1 == undefined){
- if(neighbors.includes(item) && rC[item].e2 != undefined && Math.random() < rC[item].chance){
- for(let i = 0; i < squareCoords.length; i++){
- let x = pixel.x+squareCoords[i][0], y = pixel.y+squareCoords[i][1];
- if(isEmpty(x,y) && !outOfBounds(x,y)){
- createPixel(rC[item].e2, x, y);
- changePixel(pixel, rC[item].product);
+ }
+ }
+
+ elements.ethylene = {
+ behavior: behaviors.GAS,
+ category: "gases",
+ reactionCatalysts: {
+ gold: {e1: "water", product: "alcohol", chance: 0.025},
+ copper: {e1: "oxygen", product: "vinegar", chance: 0.025}
+ },
+ reactions: {
+ oxidized_copper: { elem1: "vinegar", elem2: "copper", chance: 0.025},
+ },
+ color: ["#fffffc", "#f7f7f2", "#eaebe6", "#ededed", "#f7f7f2", "#f2f2f2"],
+ buttonColor: ["#fffffc", "#f7f7f2"],
+ state: "gas",
+ burnInto: ["carbon_dioxide", "steam"],
+ burn: 100,
+ burnTime: 15,
+ stateHigh: "fire",
+ tempHigh: 425,
+ tick: function(pixel){
+ catalyse(pixel);
+ if(settings.cleargases){
+ let rgb;
+ if(settings.bg != undefined){
+ rgb = interpolateRgb(hexToRGB("#E5EAEA"), hexToRGB(settings.bg), 0.85);
+ } else {
+ rgb = interpolateRgb(hexToRGB("#E5EAEA"), {r:0,g:0,b:0}, 0.85);
+ }
+ pixel.color = rgb;
+ }else if (!["#fffffc", "#f7f7f2", "#eaebe6", "#ededed", "#f7f7f2", "#f2f2f2"].includes(pixel.color)){
+ pixel.color = ["#fffffc", "#f7f7f2", "#eaebe6", "#ededed", "#f7f7f2", "#f2f2f2"][Math.floor(Math.random()*6)];
+ };
+ },
+ }
+ elements.propylene = {
+ behavior: behaviors.GAS,
+ category: "gases",
+ reactionCatalysts: {
+ nickel: {e1: "hydrogen", product: "propane", chance: 0.025},
+ },
+ color: ["#fffffc", "#f7f7f2", "#eaebe6", "#ededed", "#f7f7f2", "#f2f2f2"],
+ buttonColor: ["#fffffc", "#f7f7f2"],
+ state: "gas",
+ burnInto: ["carbon_dioxide", "steam"],
+ burn: 100,
+ burnTime: 15,
+ stateHigh: "fire",
+ tempHigh: 425,
+ tick: function(pixel){
+ catalyse(pixel);
+ let rgb;
+ if(settings.cleargases){
+ if(settings.bg != undefined){
+ rgb = interpolateRgb(hexToRGB("#E5EAEA"), hexToRGB(settings.bg), 0.85);
+ } else {
+ rgb = interpolateRgb(hexToRGB("#E5EAEA"), {r:0,g:0,b:0}, 0.85);
+ }
+ pixel.color = rgb;
+ } else if (!["#fffffc", "#f7f7f2", "#eaebe6", "#ededed", "#f7f7f2", "#f2f2f2"].includes(pixel.color)){
+ pixel.color = ["#fffffc", "#f7f7f2", "#eaebe6", "#ededed", "#f7f7f2", "#f2f2f2"][Math.floor(Math.random()*6)];
+ };
+ },
+ }
+ elements.propane.reactionCatalysts = {
+ aluminum: {e2: "hydrogen", product: "propylene", chance: 0.035},
+ gallium: {e2: "hydrogen", product: "propylene", chance: 0.025},
+ };
+ elements.propane.tick = function(pixel){
+ catalyse(pixel);
+ }
+ runAfterAutogen(()=>{
+ let r;
+ if(settings.cleargases){
+ if(settings.bg != undefined){
+ r = interpolateRgb(hexToRGB("#E5EAEA"), hexToRGB(settings.bg), 0.85);
+ } else {
+ r = interpolateRgb(hexToRGB("#E5EAEA"), {r:0,g:0,b:0}, 0.85);
+ }
+ };
+ elements.ethylene.color = r;
+ elements.propylene.color = r;
+ })
+ function catalyse(pixel){
+ let rC = elements[pixel.element].reactionCatalysts;
+ let neighbors = [];
+ let p = [];
+ for(let i = 0; i < squareCoords.length; i++){
+ let x = pixel.x+squareCoords[i][0], y = pixel.y+squareCoords[i][1];
+ if(!isEmpty(x,y) && !outOfBounds(x,y)){
+ neighbors.push(pixelMap[x][y].element);
+ p.push(pixelMap[x][y]);
+ }
+ }
+ for(item in rC){
+ if(neighbors.includes(item) && neighbors.includes(rC[item].e1) && Math.random() < rC[item].chance){
+ changePixel(pixel, rC[item].product);
+ if(rC[item].e2 != undefined){
+ changePixel(p[neighbors.indexOf(rC[item].e1)], rC[item].e2);
+ } else {
+ let P = p[neighbors.indexOf(rC[item].e1)];
+ deletePixel(P.x, P.y);
+ }
+ } else if (rC[item].e1 == undefined){
+ if(neighbors.includes(item) && rC[item].e2 != undefined && Math.random() < rC[item].chance){
+ for(let i = 0; i < squareCoords.length; i++){
+ let x = pixel.x+squareCoords[i][0], y = pixel.y+squareCoords[i][1];
+ if(isEmpty(x,y) && !outOfBounds(x,y)){
+ createPixel(rC[item].e2, x, y);
+ changePixel(pixel, rC[item].product);
+ }
}
}
}
}
- }
-}
-elements.orange = new fruit("orange", ['#FA9A14', '#E88D0F', '#F0963D', '#F4810E'], ['#FFDA0B', '#FFEA09', '#FFD609', '#FCC921'], "tree");
-elements.orange_seed = new treeSeed("orange", ['#EEE9C7', '#F4F1D0', '#E8E4C4', '#DBD5AF']);
-elements.kiwi = new fruit("kiwi", ['#886002', '#7D5B0D', '#876412', '#97620F'], ['#7DB410', '#86BC1B', '#95CE22', '#91CF12'], "vine");
-elements.kiwi_seed = new vineSeed("kiwi", ['#3E2A01', '#392804', '#473307', '#1E1500']);
-elements.raspberry = new fruit("raspberry", ['#FF201C', '#EF3D3A', '#FA5350', '#DF3E3B'], ['#FF4450', '#F43643', '#DF2C38', '#E92344'], "bush");
-elements.raspberry_seed = new bushSeed("raspberry", ['#572600', '#4C2506', '#592E0D', '#5E3211']);
-elements.blueberry = new fruit("blueberry", ['#322954', '#3F3366', '#2B1B5E', '#4C3C81'], ['#51042C', '#550E33', '#420D28', '#520F32'], "bush", ['#78573A', '#72492D', '#7D5438', '#704F3A']);
-elements.blackberry = new fruit("blackberry", ['#1A013A', '#1E073A', '#3D0A49', '#33043F'], ['#DC5F5F', '#D76D6D', '#BF6363', '#B05D5D'], "bush", ['#DA7878', '#C87B7B', '#AD6161', '#915656']);
-elements.blackberry.bloomColor = ["#f5f5f5", "#ede8ec", "#ebdfe8", "#f7f2f6", "#ffffff"];
-elements.strawberry = new fruit("strawberry", ['#FE3030', '#E93030', '#DE1F1F', '#CE0B0B'], ['#EA5C46', '#E24B34', '#CE5A48', '#E7604B'], "vine", ['#B27F65', '#AA7358', '#A27553', '#AF8B62'], false, true);
-elements.pear = new fruit("pear", ["#F1F8A7", "#DCE398", "#E3EE7E", "#D6E07F"], ["#F6F9D5", "#F6F9D5", "#E8ECC6", "#E8ECC0"], "tree", ["#3B1C01", "#3E2107", "#3A1C02"]);
-elements.mango = new fruit("mango", ["#F74E3E", "#E95D51", "#EE853B", "#D77026", "#F8BF46", "#F8B524", "#95C408", "#A5CD2D"], ["#FFC905", "#FFD605", "#FFE205", "#FFF305", "#FCE118"], "tree", ["#E8EABB", "#E3E5BA", "#EAEDC0", "#E8EAB1", "#D8DBA5"]);
-elements.lemon = new fruit("lemon", ["#FCF924", "#FCF924", "#EEEA1A", "#F6F212", "#FBF70B"], ["#F6F373", "#EEEC77", "#E3E267", "#F3F18B"], "tree", ["#F8F7B2", "#E9E9B1", "#E9E8A7", "#F1EFA4"]);
-elements.plum = new fruit("plum", ["#67486E", "#705476", "#634A69", "#785281"], ["#D58D77", "#DC9984", "#CA8D7A", "#CF816A"], "tree", ["#A08C5D", "#907D50", "#9B8551", "#AA9563"]);
-elements.plum.bloomColor = ["#ffb3df", "#ffa6da", "#ffbde3", "#ffd1ec"];
-elements.peach = new fruit("peach", ["#F76856", "#EA5D4A", "#EA6D4A", "#E5785A", "#FE824A", "#EE7A45", "#FAA543", "#F59D39", "#FF744D"], ["#F86F1F", "#EC742F", "#EC832F", "#EC9A2F", "#ECA62F"], "tree", ["#735940", "#7B5C3D", "#7D5935"]);
-elements.peach.bloomColor = ["#ffb3df", "#ffa6da", "#ffbde3", "#ffd1ec"];
-elements.apricot = new fruit("apricot", ["#F5A61F", "#F5A61F", "#EA9B12", "#F8A109"], ["#F2B016", "#F2AD0C", "#FBB81E", "#FFB301"], "tree", ["#735940", "#7B5C3D", "#7D5935"]);
-elements.apricot.bloomColor = ["#fff0fb", "#ffffff", "#fadef3", "#fcd9f4"];
-elements.avocado = new fruit("avocado", ["#3c9419", "#348514", "#367a1b", "#2f7d10"], ["#cff74a", "#caf244", "#c1e649", "#b3d640"], "tree", ["#4d290a", "#4d2b0d", "#63360f", "#572d09"]);
-elements.avocado.bloomColor = ["#e3ff9c", "#e1ff96", "#e6ffa6", "#e1faa2"];
-elements.avocado.breakInto = "guacamole";
-elements.guacamole = {
- color: ["#cff74a", "#caf244", "#c1e649", "#b3d640"],
- behavior: behaviors.LIQUID,
- viscosity: 1350,
- category: "food",
- state: "liquid",
- isFood: true,
- onMix: function(pixel){
- for(let coords of squareCoords){
- let x = pixel.x+coords[0], y = pixel.y+coords[1];
- if(!isEmpty(x,y) && !outOfBounds(x,y) && elements[pixelMap[x][y].element].isFood && pixelMap[x][y].element != "quacamole"){
- let chance = (shiftDown) ? 1 : 0.5;
- if(Math.random() < chance){
- let rgb = interpolateRgb(getRGB(pixel.color), getRGB(pixelMap[x][y].color), 0.8);
- changePixel(pixelMap[x][y], "guacamole");
- pixel.color = rgb;
- pixelMap[x][y].color = rgb;
+ }
+ elements.orange = new fruit("orange", ['#FA9A14', '#E88D0F', '#F0963D', '#F4810E'], ['#FFDA0B', '#FFEA09', '#FFD609', '#FCC921'], "tree");
+ elements.orange_seed = new treeSeed("orange", ['#EEE9C7', '#F4F1D0', '#E8E4C4', '#DBD5AF']);
+ elements.kiwi = new fruit("kiwi", ['#886002', '#7D5B0D', '#876412', '#97620F'], ['#7DB410', '#86BC1B', '#95CE22', '#91CF12'], "vine");
+ elements.kiwi_seed = new vineSeed("kiwi", ['#3E2A01', '#392804', '#473307', '#1E1500']);
+ elements.raspberry = new fruit("raspberry", ['#FF201C', '#EF3D3A', '#FA5350', '#DF3E3B'], ['#FF4450', '#F43643', '#DF2C38', '#E92344'], "bush");
+ elements.raspberry_seed = new bushSeed("raspberry", ['#572600', '#4C2506', '#592E0D', '#5E3211']);
+ elements.blueberry = new fruit("blueberry", ['#322954', '#3F3366', '#2B1B5E', '#4C3C81'], ['#51042C', '#550E33', '#420D28', '#520F32'], "bush", ['#78573A', '#72492D', '#7D5438', '#704F3A']);
+ elements.blackberry = new fruit("blackberry", ['#1A013A', '#1E073A', '#3D0A49', '#33043F'], ['#DC5F5F', '#D76D6D', '#BF6363', '#B05D5D'], "bush", ['#DA7878', '#C87B7B', '#AD6161', '#915656']);
+ elements.blackberry.bloomColor = ["#f5f5f5", "#ede8ec", "#ebdfe8", "#f7f2f6", "#ffffff"];
+ elements.strawberry = new fruit("strawberry", ['#FE3030', '#E93030', '#DE1F1F', '#CE0B0B'], ['#EA5C46', '#E24B34', '#CE5A48', '#E7604B'], "vine", ['#B27F65', '#AA7358', '#A27553', '#AF8B62'], false, true);
+ elements.pear = new fruit("pear", ["#F1F8A7", "#DCE398", "#E3EE7E", "#D6E07F"], ["#F6F9D5", "#F6F9D5", "#E8ECC6", "#E8ECC0"], "tree", ["#3B1C01", "#3E2107", "#3A1C02"]);
+ elements.mango = new fruit("mango", ["#F74E3E", "#E95D51", "#EE853B", "#D77026", "#F8BF46", "#F8B524", "#95C408", "#A5CD2D"], ["#FFC905", "#FFD605", "#FFE205", "#FFF305", "#FCE118"], "tree", ["#E8EABB", "#E3E5BA", "#EAEDC0", "#E8EAB1", "#D8DBA5"]);
+ elements.lemon = new fruit("lemon", ["#FCF924", "#FCF924", "#EEEA1A", "#F6F212", "#FBF70B"], ["#F6F373", "#EEEC77", "#E3E267", "#F3F18B"], "tree", ["#F8F7B2", "#E9E9B1", "#E9E8A7", "#F1EFA4"]);
+ elements.plum = new fruit("plum", ["#67486E", "#705476", "#634A69", "#785281"], ["#D58D77", "#DC9984", "#CA8D7A", "#CF816A"], "tree", ["#A08C5D", "#907D50", "#9B8551", "#AA9563"]);
+ elements.plum.bloomColor = ["#ffb3df", "#ffa6da", "#ffbde3", "#ffd1ec"];
+ elements.peach = new fruit("peach", ["#F76856", "#EA5D4A", "#EA6D4A", "#E5785A", "#FE824A", "#EE7A45", "#FAA543", "#F59D39", "#FF744D"], ["#F86F1F", "#EC742F", "#EC832F", "#EC9A2F", "#ECA62F"], "tree", ["#735940", "#7B5C3D", "#7D5935"]);
+ elements.peach.bloomColor = ["#ffb3df", "#ffa6da", "#ffbde3", "#ffd1ec"];
+ elements.apricot = new fruit("apricot", ["#F5A61F", "#F5A61F", "#EA9B12", "#F8A109"], ["#F2B016", "#F2AD0C", "#FBB81E", "#FFB301"], "tree", ["#735940", "#7B5C3D", "#7D5935"]);
+ elements.apricot.bloomColor = ["#fff0fb", "#ffffff", "#fadef3", "#fcd9f4"];
+ elements.avocado = new fruit("avocado", ["#3c9419", "#348514", "#367a1b", "#2f7d10"], ["#cff74a", "#caf244", "#c1e649", "#b3d640"], "tree", ["#4d290a", "#4d2b0d", "#63360f", "#572d09"]);
+ elements.avocado.bloomColor = ["#e3ff9c", "#e1ff96", "#e6ffa6", "#e1faa2"];
+ elements.avocado.breakInto = "guacamole";
+ elements.guacamole = {
+ color: ["#cff74a", "#caf244", "#c1e649", "#b3d640"],
+ behavior: behaviors.LIQUID,
+ viscosity: 1350,
+ category: "food",
+ state: "liquid",
+ isFood: true,
+ onMix: function(pixel){
+ for(let coords of squareCoords){
+ let x = pixel.x+coords[0], y = pixel.y+coords[1];
+ if(!isEmpty(x,y) && !outOfBounds(x,y) && elements[pixelMap[x][y].element].isFood && pixelMap[x][y].element != "quacamole"){
+ let chance = (shiftDown) ? 1 : 0.5;
+ if(Math.random() < chance){
+ let rgb = interpolateRgb(getRGB(pixel.color), getRGB(pixelMap[x][y].color), 0.8);
+ changePixel(pixelMap[x][y], "guacamole");
+ pixel.color = rgb;
+ pixelMap[x][y].color = rgb;
+ }
}
}
}
}
-}
-runAfterAutogen(()=>{settingsMenu.innerHTML += `
-
-
-`;});
-elements.cocoa = new fruit("cocoa", ["#b09533", "#ad9439", "#b39736", "#99732c", "#ab8338", "#ad8231"], ["#826a3e", "#634f28", "#634b1f", "#5c461c"], "tree", ["#826a3e", "#634f28", "#634b1f", "#5c461c"]);
-elements.cocoa.breakInto = "cocoa_seed";
-elements.cocoa_seed.name = "CocoaBean";
-elements.cocoa_seed.breakInto = undefined;
-elements.cocoa_seed.tempHigh = 125;
-elements.cocoa_seed.stateHigh = "roasted_cocoa_bean";
-elements.roasted_cocoa_bean = {
- category: "food",
- behavior: behaviors.POWDER,
- extract: "melted_cocoa_butter",
- color: ["#2b1b01", "#291a02", "#211503", "#211503"],
- breakInto: "cocoa_powder",
-}
-elements.cocoa_powder = {
- category: "food",
- behavior: behaviors.POWDER,
- color: ["#3b2604", "#332104", "#402802", "#301e01"],
-}
-elements.cocoa_butter = {
- behavior: behaviors.STURDYPOWDER,
- tempHigh: 36,
- color: ["#feffe8", "#f4f5dc", "#fcfce1", "#feffed", "#feffd6"],
- category: "food",
- isFood: true,
- stateHigh: "melted_cocoa_butter",
-}
-elements.melted_cocoa_butter = {
- behavior: behaviors.LIQUID,
- color: ["#fff082", "#e3d676", "#f2e57e", "#fff07d"],
- tempLow: 35,
- stateLow: "cocoa_butter",
- reactions: {
- cocoa_powder: {elem1: "chocolate", elem2: "chocolate"}
- },
- category: "states",
- isFood: true,
- viscosity: 750,
- temp: 36,
-};
-elements.extractor = {
- category: "machines",
- behavior: behaviors.WALL,
- tick: function(pixel){
- for(let coords of squareCoords){
- let x = pixel.x+coords[0], y = pixel.y+coords[1];
- if(!isEmpty(x,y) && !outOfBounds(x,y) && elements[pixelMap[x][y].element].extract != undefined){
- changePixel(pixelMap[x][y], elements[pixelMap[x][y].element].extract);
+ runAfterAutogen(()=>{settingsMenu.innerHTML += `
+
+
+ `;});
+ elements.cocoa = new fruit("cocoa", ["#b09533", "#ad9439", "#b39736", "#99732c", "#ab8338", "#ad8231"], ["#826a3e", "#634f28", "#634b1f", "#5c461c"], "tree", ["#826a3e", "#634f28", "#634b1f", "#5c461c"]);
+ elements.cocoa.breakInto = "cocoa_seed";
+ elements.cocoa_seed.name = "CocoaBean";
+ elements.cocoa_seed.breakInto = undefined;
+ elements.cocoa_seed.tempHigh = 125;
+ elements.cocoa_seed.stateHigh = "roasted_cocoa_bean";
+ elements.roasted_cocoa_bean = {
+ category: "food",
+ behavior: behaviors.POWDER,
+ extract: "melted_cocoa_butter",
+ color: ["#2b1b01", "#291a02", "#211503", "#211503"],
+ breakInto: "cocoa_powder",
+ }
+ elements.cocoa_powder = {
+ category: "food",
+ behavior: behaviors.POWDER,
+ color: ["#3b2604", "#332104", "#402802", "#301e01"],
+ }
+ elements.cocoa_butter = {
+ behavior: behaviors.STURDYPOWDER,
+ tempHigh: 36,
+ color: ["#feffe8", "#f4f5dc", "#fcfce1", "#feffed", "#feffd6"],
+ category: "food",
+ isFood: true,
+ stateHigh: "melted_cocoa_butter",
+ }
+ elements.melted_cocoa_butter = {
+ behavior: behaviors.LIQUID,
+ color: ["#fff082", "#e3d676", "#f2e57e", "#fff07d"],
+ tempLow: 35,
+ stateLow: "cocoa_butter",
+ reactions: {
+ cocoa_powder: {elem1: "chocolate", elem2: "chocolate"}
+ },
+ category: "states",
+ isFood: true,
+ viscosity: 750,
+ temp: 36,
+ };
+ elements.extractor = {
+ category: "machines",
+ behavior: behaviors.WALL,
+ tick: function(pixel){
+ for(let coords of squareCoords){
+ let x = pixel.x+coords[0], y = pixel.y+coords[1];
+ if(!isEmpty(x,y) && !outOfBounds(x,y) && elements[pixelMap[x][y].element].extract != undefined){
+ changePixel(pixelMap[x][y], elements[pixelMap[x][y].element].extract);
+ }
}
- }
- },
- movable: false,
-}
-elements.pineapple_seed = {
- behavior: behaviors.POWDER,
- color: ["#242000", "#1f1c00", "#1a1701", "#1f1c01"],
- category: "life",
- properties: {
- age: 0,
- fruit: "pineapple",
- growthPattern: true,
- },
- tick: function(pixel){
- let num = Math.round((Math.random()*0.75)*3)+1;
- chance = (pixel.age -140)/100;
- chance = Math.max(Math.min(chance, 1), 0);
- if(Math.random() 55){
- pixel.alive = false;
- }
- if(Math.random()<(pixel.age-95)/7500 && pixel.height < pixel.maxHeight && pixel.alive){
- let y = pixel.y;
- tryMove(pixel, pixel.x, pixel.y-1);
- pixel.height++;
- createPixel("wood", pixel.x, y);
- if(Math.random()<0.333){
- let i = new growInterval(pixel, growthPatterns.palm(Math.round((pixel.height/pixel.maxHeight)*14), 174, 366, [235,305]), [pixel.x, y], 0.25, 200);
+ elements.dead_plant.behavior = [["XX","XX","XX"],["XX","CH:dirt%0.015","XX"],["M2","M1","M2"]];
+ elements.banana = {
+ category: "food",
+ breakInto: "juice",
+ bloomColor: ["#6e2942", "#63293e", "#703249", "#82314f"],
+ color: ["#e8de20", "#f2e824", "#f0e626", "#ebe01c", "#f0e51a"],
+ breakIntoColor: ["#f2f0cb", "#f0eec5", "#f2f0c4"],
+ isFood: true,
+ };
+ elements.coconut = {
+ behavior: [['XX', 'XX', 'XX'],['XX', 'XX', 'XX'],['M2', 'M1 AND ST:wood', 'M2']],
+ color: ["#291706", "#382007", "#2e1905", "#361d05", "#361e06"],
+ category: "food",
+ properties: {
+ age: 0,
+ fruit: "coconut",
+ height: 0,
+ maxHeight: null,
+ alive: null,
+ leafLength: null,
+ intervals: [],
+ },
+ breakInto: "coconut_water",
+ extract: "coconut_oil",
+ onDelete: function(pixel){
+ for(let value of pixel.intervals){
+ clearInterval(value);
+ }
+ },
+ tick: function(pixel){
+ if(pixel.alive == null){
+ pixel.alive = shiftDown;
+ }
+ if(pixel.maxHeight == null){
+ pixel.maxHeight = 15+Math.round(Math.random()*6);
+ }
+ if(pixel.leafLength == null){
+ pixel.leafLength = Math.round((pixel.maxHeight/21)*Math.random()*4)+12;
+ }
+ if(pixel.alive && pixel.temp > 55){
+ pixel.alive = false;
+ }
+ if(Math.random()<(pixel.age-95)/7500 && pixel.height < pixel.maxHeight && pixel.alive){
+ let y = pixel.y;
+ tryMove(pixel, pixel.x, pixel.y-1);
+ pixel.height++;
+ createPixel("wood", pixel.x, y);
+ if(Math.random()<0.333){
+ let i = new growInterval(pixel, growthPatterns.palm(Math.round((pixel.height/pixel.maxHeight)*14), 174, 366, [235,305]), [pixel.x, y], 0.25, 200);
+ pixel.intervals.push(i.interval);
+ }
+ }
+ if(pixel.height == pixel.maxHeight && Math.random()<0.055){
+ let amnt = 6+Math.round(Math.random()*4);
+ for(let i = 0; i < amnt; i++){
+ let i = new growInterval(pixel, growthPatterns.palm(16, 174, 366, [255,285]), [pixel.x, pixel.y], 0.15);
+ pixel.intervals.push(i.interval);
+ }
+ let i = new growInterval(pixel, growthPatterns.palm_bloom(), [pixel.x,pixel.y], 0.025, undefined, pixel.fruit, ["flower"]);
pixel.intervals.push(i.interval);
+ pixel.height++;
}
+ pixel.age++;
}
- if(pixel.height == pixel.maxHeight && Math.random()<0.055){
- let amnt = 6+Math.round(Math.random()*4);
- for(let i = 0; i < amnt; i++){
- let i = new growInterval(pixel, growthPatterns.palm(16, 174, 366, [255,285]), [pixel.x, pixel.y], 0.15);
- pixel.intervals.push(i.interval);
- }
- let i = new growInterval(pixel, growthPatterns.palm_bloom(), [pixel.x,pixel.y], 0.025, undefined, pixel.fruit, ["flower"]);
- pixel.intervals.push(i.interval);
- pixel.height++;
- }
- pixel.age++;
}
-}
-elements.coconut_oil = {
- behavior: behaviors.SOLID,
- color: ["#f0efed", "#edeceb", "#e6e4e3", "#ebe9e8"],
- category: "food",
- isFood: true,
- reactions: {
- caustic_potash: {elem1: "soap", elem2: "soap"},
- lye: {elem1: "soap", elem2: "soap"},
- },
- tempHigh: 24,
- stateHigh: "melted_coconut_oil",
- state: "solid",
-}
-elements.melted_coconut_oil = {
- behavior: behaviors.LIQUID,
- color: ["#f0f0eb", "#e6e5d5", "#f5f4e6", "#f7f7e6", "#ededdd"],
- viscosity: 750,
- category: "states",
- state: "liquid",
- isFood: true,
- reactions: {
- caustic_potash: {elem1: "soap", elem2: "soap"},
- lye: {elem1: "soap", elem2: "soap"},
- },
- tempLow: 23,
- stateLow: "coconut_oil"
-}
-elements.coconut_water = {
- color: ["#8dd6d9", "#8cd9db", "#82d6d9"],
- behavior: behaviors.LIQUID,
- isFood: true,
- category: "food",
- state: "liquid",
- tempHigh: 100,
- stateHigh: ["sugar", "steam", "steam", "steam", "potassium_salt", "salt", "epsom_salt", "steam", "steam", "steam"]
-}
-elements.morning_glory_seed = {
- behavior: behaviors.VINEFRUIT,
- bloomColors: [["#f783f0", "#fa8cf3", "#fa96f3", "#f590ee"], ["#8d40f7", "#9a52ff", "#8041d9", "#7e3ade"], ["#ed5365", "#f0485b", "#f55b6d", "#eb3d51"], ["#f53d49", "#fa4652", "#f54e59", "#f23a46"], ["#f53d49", "#fa8cf3", "#f55b6d", "#f23a46"]],
- color: ["#5c5036", "#473e29", "#4f4631", "#fcf2b8"],
- properties: {
- bloomColor: null,
- fruit: "morning_glory_seed",
- age: 0,
- },
- category: "life",
- tick: function(pixel){
- if(pixel.bloomColor == null){
- let arr = elements.morning_glory_seed.bloomColors[Math.round(Math.random()*elements.morning_glory_seed.bloomColors.length)];
- while(!Array.isArray(arr)){
- arr = elements.morning_glory_seed.bloomColors[Math.round(Math.random()*elements.morning_glory_seed.bloomColors.length)];
- }
- let num = 100*(10**Math.random()/10);
- let newArr = false;
- for(let item of arr){
- let o = item;
- let rgb = hexToRGB(item);
- let newRGB = {r: Math.min(255, rgb.r+num), g: Math.min(255, rgb.g+num), b: Math.min(255, rgb.b+num)};
- newArr = [];
- newArr[arr.indexOf(item)] = RGBToHex(newRGB);
-
- }
- pixel.bloomColor = (newArr) ? newArr : arr;
- } else if(Math.random() < (pixel.age/2000)) {
- let fruit = pixel.fruit, bloomColor = pixel.bloomColor;
- changePixel(pixel, "fruit_vine");
- pixel.fruit = fruit, pixel.bloomColor = bloomColor;
- }
- pixel.age++;
+ elements.coconut_oil = {
+ behavior: behaviors.SOLID,
+ color: ["#f0efed", "#edeceb", "#e6e4e3", "#ebe9e8"],
+ category: "food",
+ isFood: true,
+ reactions: {
+ caustic_potash: {elem1: "soap", elem2: "soap"},
+ lye: {elem1: "soap", elem2: "soap"},
+ },
+ tempHigh: 24,
+ stateHigh: "melted_coconut_oil",
+ state: "solid",
}
-}
-elements.apricot_seed.tempHigh = 175;
-elements.apricot_seed.stateHigh = "almond";
-elements.almond = {
- color: ["#ab9450", "#b3994d", "#a18943", "#a18c43", "#a18d47"],
- behavior: behaviors.POWDER,
- state: "solid",
- category: "food",
- isFood: true,
- density: 1100,
- stateHigh: ["charcoal", "fire", "smoke"],
- tempHigh: 550,
- tick: function(pixel){
- for(let coords of squareCoords){
- let x = pixel.x+coords[0], y = pixel.y+coords[1];
- let p2 = getPixel(x,y);
- let chance = (pixel.temp > 0) ? ((pixel.temp**0.1)-1)*0.0025 : 0;
- if(p2 != null && p2.element == "alcohol" && Math.random() < chance){
- changePixel(p2, "almond_extract");
+ elements.melted_coconut_oil = {
+ behavior: behaviors.LIQUID,
+ color: ["#f0f0eb", "#e6e5d5", "#f5f4e6", "#f7f7e6", "#ededdd"],
+ viscosity: 750,
+ category: "states",
+ state: "liquid",
+ isFood: true,
+ reactions: {
+ caustic_potash: {elem1: "soap", elem2: "soap"},
+ lye: {elem1: "soap", elem2: "soap"},
+ },
+ tempLow: 23,
+ stateLow: "coconut_oil"
+ }
+ elements.coconut_water = {
+ color: ["#8dd6d9", "#8cd9db", "#82d6d9"],
+ behavior: behaviors.LIQUID,
+ isFood: true,
+ category: "food",
+ state: "liquid",
+ tempHigh: 100,
+ stateHigh: ["sugar", "steam", "steam", "steam", "potassium_salt", "salt", "epsom_salt", "steam", "steam", "steam"]
+ }
+ elements.morning_glory_seed = {
+ behavior: behaviors.VINEFRUIT,
+ bloomColors: [["#f783f0", "#fa8cf3", "#fa96f3", "#f590ee"], ["#8d40f7", "#9a52ff", "#8041d9", "#7e3ade"], ["#ed5365", "#f0485b", "#f55b6d", "#eb3d51"], ["#f53d49", "#fa4652", "#f54e59", "#f23a46"], ["#f53d49", "#fa8cf3", "#f55b6d", "#f23a46"]],
+ color: ["#5c5036", "#473e29", "#4f4631", "#fcf2b8"],
+ properties: {
+ bloomColor: null,
+ fruit: "morning_glory_seed",
+ age: 0,
+ },
+ category: "life",
+ tick: function(pixel){
+ if(pixel.bloomColor == null){
+ let arr = elements.morning_glory_seed.bloomColors[Math.round(Math.random()*elements.morning_glory_seed.bloomColors.length)];
+ while(!Array.isArray(arr)){
+ arr = elements.morning_glory_seed.bloomColors[Math.round(Math.random()*elements.morning_glory_seed.bloomColors.length)];
+ }
+ let num = 100*(10**Math.random()/10);
+ let newArr = false;
+ for(let item of arr){
+ let o = item;
+ let rgb = hexToRGB(item);
+ let newRGB = {r: Math.min(255, rgb.r+num), g: Math.min(255, rgb.g+num), b: Math.min(255, rgb.b+num)};
+ newArr = [];
+ newArr[arr.indexOf(item)] = RGBToHex(newRGB);
+
+ }
+ pixel.bloomColor = (newArr) ? newArr : arr;
+ } else if(Math.random() < (pixel.age/2000)) {
+ let fruit = pixel.fruit, bloomColor = pixel.bloomColor;
+ changePixel(pixel, "fruit_vine");
+ pixel.fruit = fruit, pixel.bloomColor = bloomColor;
+ }
+ pixel.age++;
+ }
+ }
+ elements.apricot_seed.tempHigh = 175;
+ elements.apricot_seed.stateHigh = "almond";
+ elements.almond = {
+ color: ["#ab9450", "#b3994d", "#a18943", "#a18c43", "#a18d47"],
+ behavior: behaviors.POWDER,
+ state: "solid",
+ category: "food",
+ isFood: true,
+ density: 1100,
+ stateHigh: ["charcoal", "fire", "smoke"],
+ tempHigh: 550,
+ tick: function(pixel){
+ for(let coords of squareCoords){
+ let x = pixel.x+coords[0], y = pixel.y+coords[1];
+ let p2 = getPixel(x,y);
+ let chance = (pixel.temp > 0) ? ((pixel.temp**0.1)-1)*0.0025 : 0;
+ if(p2 != null && p2.element == "alcohol" && Math.random() < chance){
+ changePixel(p2, "almond_extract");
+ }
}
}
}
-}
-elements.almond_extract = {
- color: ["#cfccbe", "#d6d4c7", "#c9c7bb", "#ccc9b8"],
- behavior: behaviors.LIQUID,
- isFood: true,
- category: "food",
- state: "liquid",
- density: 815,
- tempHigh: 78,
- stateHigh: ["alcohol_gas", "fragrance"],
- tempLow: -118,
- stateLow: "frozen_almond_extract",
- burn: 100,
- burnTime: 15,
- fireColor: ['#80acf0', '#96cdfe', '#bee6d4'],
- burnInto: ["fragrance", "smoke", "smoke"],
-}
-elements.frozen_almond_extract = {
- color: ["#cfccbe", "#d6d4c7", "#c9c7bb", "#ccc9b8"],
- behavior: behaviors.SOLID,
- isFood: true,
- category: "states",
- state: "solid",
- density: 865,
- tempHigh: -117,
- stateHigh: "almond_extract",
-}
-
-elements.onion = {
- category: "food",
- color: ["#dbaa5a", "#cc9b4b", "#bd9048", "#faebb4", "#fcf5d9", "#f2e9c7", "#7d2d50", "#ad3d6e", "#c25182"],
- state: "solid",
- properties: {
- age: 0,
- sprouted: null,
- intervals: [],
- height: null,
- },
- isFood: true,
- behavior: behaviors.POWDER,
- onDelete: function(pixel){
- for(let value of pixel.intervals){
- clearInterval(value);
- }
- },
- tick: function(pixel){
- let inDirt = (getPixel(pixel.x,pixel.y+1) != null && eLists.SOIL.includes(pixelMap[pixel.x][pixel.y+1].element)) ? true : false;
- for(let coords of adjacentCoords){
- let x = pixel.x+coords[0], y = pixel.y+coords[1];
- let p2 = getPixel(x,y);
- if(p2 != null){
- inDirt = (eLists.SOIL.includes(p2.element)) ? true : inDirt;
+ elements.almond_extract = {
+ color: ["#cfccbe", "#d6d4c7", "#c9c7bb", "#ccc9b8"],
+ behavior: behaviors.LIQUID,
+ isFood: true,
+ category: "food",
+ state: "liquid",
+ density: 815,
+ tempHigh: 78,
+ stateHigh: ["alcohol_gas", "fragrance"],
+ tempLow: -118,
+ stateLow: "frozen_almond_extract",
+ burn: 100,
+ burnTime: 15,
+ fireColor: ['#80acf0', '#96cdfe', '#bee6d4'],
+ burnInto: ["fragrance", "smoke", "smoke"],
+ }
+ elements.frozen_almond_extract = {
+ color: ["#cfccbe", "#d6d4c7", "#c9c7bb", "#ccc9b8"],
+ behavior: behaviors.SOLID,
+ isFood: true,
+ category: "states",
+ state: "solid",
+ density: 865,
+ tempHigh: -117,
+ stateHigh: "almond_extract",
+ }
+
+ elements.onion = {
+ category: "food",
+ color: ["#dbaa5a", "#cc9b4b", "#bd9048", "#faebb4", "#fcf5d9", "#f2e9c7", "#7d2d50", "#ad3d6e", "#c25182"],
+ state: "solid",
+ properties: {
+ age: 0,
+ sprouted: null,
+ intervals: [],
+ height: null,
+ },
+ isFood: true,
+ behavior: behaviors.POWDER,
+ onDelete: function(pixel){
+ for(let value of pixel.intervals){
+ clearInterval(value);
}
- if((pixel.sprouted == null && pixel.sprouted != "disabled") && pixel.age > 60 && inDirt){
- let height = 7+Math.round(Math.random()*4);
- pixel.height = height;
- let i = new growInterval(pixel, growthPatterns.stalk(height), [pixel.x,pixel.y], 0.15);
- pixel.intervals.push(i.interval);
- pixel.sprouted = true;
- } else if ((pixel.sprouted == true && pixel.sprouted != "disabled") && Math.random() < 0.0015){
- let i = new growInterval(pixel, growthPatterns.blade(7, 235, 315, [255,295]), [pixel.x,pixel.y], 0.15);
- pixel.intervals.push(i.interval);
- }
- }
- if(inDirt){
+ },
+ tick: function(pixel){
+ let inDirt = (getPixel(pixel.x,pixel.y+1) != null && eLists.SOIL.includes(pixelMap[pixel.x][pixel.y+1].element)) ? true : false;
for(let coords of adjacentCoords){
let x = pixel.x+coords[0], y = pixel.y+coords[1];
let p2 = getPixel(x,y);
- if(p2!=null && eLists.SOIL.includes(p2.element) && Math.random()<0.0005){
- changePixel(p2, "onion");
- p2.color = noiseify(pixel.color, 6);
- p2.sprouted = "disabled";
+ if(p2 != null){
+ inDirt = (eLists.SOIL.includes(p2.element)) ? true : inDirt;
+ }
+ if((pixel.sprouted == null && pixel.sprouted != "disabled") && pixel.age > 60 && inDirt){
+ let height = 7+Math.round(Math.random()*4);
+ pixel.height = height;
+ let i = new growInterval(pixel, growthPatterns.stalk(height), [pixel.x,pixel.y], 0.15);
+ pixel.intervals.push(i.interval);
+ pixel.sprouted = true;
+ } else if ((pixel.sprouted == true && pixel.sprouted != "disabled") && Math.random() < 0.0015){
+ let i = new growInterval(pixel, growthPatterns.blade(7, 235, 315, [255,295]), [pixel.x,pixel.y], 0.15);
+ pixel.intervals.push(i.interval);
}
}
- }
- if(pixel.sprouted === true && pixel.age > 600 && Math.random()<0.001){
- let length = Math.round(Math.random()*2);
- for(let i = 0; i < 5; i++){
- let ii = new growInterval(pixel, growthPatterns.blade(length,0,360), [pixel.x, pixel.y-pixel.height-length+1], 0.25, undefined, "onion_seed",['flower']);
- pixel.intervals.push(ii.interval);
+ if(inDirt){
+ for(let coords of adjacentCoords){
+ let x = pixel.x+coords[0], y = pixel.y+coords[1];
+ let p2 = getPixel(x,y);
+ if(p2!=null && eLists.SOIL.includes(p2.element) && Math.random()<0.0005){
+ changePixel(p2, "onion");
+ p2.color = noiseify(pixel.color, 6);
+ p2.sprouted = "disabled";
+ }
+ }
}
- }
- pixel.age++;
- },
-}
-elements.onion_seed = {
- behavior: behaviors.POWDER,
- color: ["#0f0f0f", "#0f0f0f", "#0a0a0a", "#0a0a0a"],
- category: "life",
- state: "solid",
- tick: function(pixel){
- let inDirt = (getPixel(pixel.x,pixel.y+1) != null && eLists.SOIL.includes(pixelMap[pixel.x][pixel.y+1].element)) ? true : false;
- for(let coords of adjacentCoords){
- let x = pixel.x+coords[0], y = pixel.y+coords[1];
- let p2 = getPixel(x,y);
- if(p2 != null){
- inDirt = (eLists.SOIL.includes(p2.element)) ? true : inDirt;
+ if(pixel.sprouted === true && pixel.age > 600 && Math.random()<0.001){
+ let length = Math.round(Math.random()*2);
+ for(let i = 0; i < 5; i++){
+ let ii = new growInterval(pixel, growthPatterns.blade(length,0,360), [pixel.x, pixel.y-pixel.height-length+1], 0.25, undefined, "onion_seed",['flower']);
+ pixel.intervals.push(ii.interval);
+ }
+ }
+ pixel.age++;
+ },
+ }
+ elements.onion_seed = {
+ behavior: behaviors.POWDER,
+ color: ["#0f0f0f", "#0f0f0f", "#0a0a0a", "#0a0a0a"],
+ category: "life",
+ state: "solid",
+ tick: function(pixel){
+ let inDirt = (getPixel(pixel.x,pixel.y+1) != null && eLists.SOIL.includes(pixelMap[pixel.x][pixel.y+1].element)) ? true : false;
+ for(let coords of adjacentCoords){
+ let x = pixel.x+coords[0], y = pixel.y+coords[1];
+ let p2 = getPixel(x,y);
+ if(p2 != null){
+ inDirt = (eLists.SOIL.includes(p2.element)) ? true : inDirt;
+ }
+ }
+ if(inDirt && Math.random() < 0.025){
+ changePixel(pixel, "onion");
}
- }
- if(inDirt && Math.random() < 0.025){
- changePixel(pixel, "onion");
}
}
-}
+ elements.grape.reactions.sugar_water = {elem2: "wine", chance: 0.0006};
+ elements.grape.reactions.water = {elem2: "wine", chance: 0.00006};
+ elements.wine = {
+ density: 992,
+ color: ["#381b30", "#402137", "#261321", "#38192f"],
+ behavior: behaviors.LIQUID,
+ category: "liquids",
+ state: "liquid",
+ properties: {
+ alcChance: 0.13,
+ },
+ tick: function(pixel){
+ if(Math.random() < 0.00025){
+ pixel.alcChance += 0.01;
+ }
+ if(pixel.temp >70){
+ let chanceMulti = (pixel.temp-70)/20;
+ let chance = (pixel.alcChance/100)*chanceMulti;
+ for(let coords of squareCoords){
+ let x = pixel.x+coords[0], y = pixel.y+coords[1];
+ if(isEmpty(x,y) && !outOfBounds(x,y) && Math.random() < chance){
+ createPixel("alcohol_gas", x,y);
+ if(Math.random() < 0.5){
+ let rgb = getRGB(pixel.color);
+ for(let key in rgb){
+ rgb[key] += 10;
+ rgb[key] = Math.max(rgb[key], 0);
+ }
+ changePixel(pixel, "juice");
+
+ pixel.color = noiseify(RGBToHex(rgb), 6);
+ }
+ }
+ }
+ }
+ },
+ tempHigh: 100,
+ stateHigh: ["sugar", "carbon_dioxide", "steam", "alcohol_gas"],
+ };
+
+
+}, true);
diff --git a/mods/scp.js b/mods/scp.js
index c71f61ce..62d462e6 100644
--- a/mods/scp.js
+++ b/mods/scp.js
@@ -1,45 +1,268 @@
-/* mod by nekonico aka doobienecoarc */
+/* by nekonico */
window.addEventListener("load", () => {
- document.getElementById("elementButton-mask_head")?.remove()
-})
-window.addEventListener("load", () => {
- document.getElementById("elementButton-mask_body")?.remove()
-})
-window.addEventListener("load", () => {
- document.getElementById("elementButton-infected_skin")?.remove()
-})
-window.addEventListener("load", () => {
+ document.getElementById("elementButton-head_008")?.remove()
+ document.getElementById("elementButton-body_008")?.remove()
+ document.getElementById("elementButton-head_012_1")?.remove()
+ document.getElementById("elementButton-body_012_1")?.remove()
+ document.getElementById("elementButton-complete_012")?.remove()
+ document.getElementById("elementButton-head_035")?.remove()
+ document.getElementById("elementButton-body_035")?.remove()
+ document.getElementById("elementButton-head_049")?.remove()
+ document.getElementById("elementButton-body_049")?.remove()
+ document.getElementById("elementButton-head_049_1")?.remove()
+ document.getElementById("elementButton-body_049_1")?.remove()
+ document.getElementById("elementButton-head_173")?.remove()
+ document.getElementById("elementButton-body_173")?.remove()
+ document.getElementById("elementButton-scp_229")?.remove()
+ document.getElementById("elementButton-head_457")?.remove()
+ document.getElementById("elementButton-body_457")?.remove()
+ document.getElementById("elementButton-head_1000")?.remove()
+ document.getElementById("elementButton-body_1000")?.remove()
+ document.getElementById("elementButton-head_1015")?.remove()
+ document.getElementById("elementButton-body_1015")?.remove()
+ document.getElementById("elementButton-penny_converter")?.remove()
+ document.getElementById("elementButton-scp_1600_1")?.remove()
+ document.getElementById("elementButton-infected_blood")?.remove()
document.getElementById("elementButton-infected_meat")?.remove()
-})
-window.addEventListener("load", () => {
document.getElementById("elementButton-frozen_infected_meat")?.remove()
-})
-window.addEventListener("load", () => {
- document.getElementById("elementButton-zombie")?.remove()
-})
-window.addEventListener("load", () => {
- document.getElementById("elementButton-z_head")?.remove()
-})
-window.addEventListener("load", () => {
- document.getElementById("elementButton-z_body")?.remove()
-})
-window.addEventListener("load", () => {
+ document.getElementById("elementButton-red_snow")?.remove()
+ document.getElementById("elementButton-packed_red_snow")?.remove()
+ document.getElementById("elementButton-red_snow_cloud")?.remove()
+ document.getElementById("elementButton-red_plant")?.remove()
+ document.getElementById("elementButton-scp_009_meat")?.remove()
+ 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-REDACTED")?.remove()
-})
-window.addEventListener("load", () => {
- document.getElementById("elementButton-hyper_tickle_monster")?.remove()
-})
-window.addEventListener("load", () => {
- document.getElementById("elementButton-calm_682")?.remove()
-})
-window.addEventListener("load", () => {
- document.getElementById("elementButton-mad_682")?.remove()
})
-// Coding junk above this point
+hex_is_light = function(color) {
+ hex = color.replace('#', '');
+ c_r = parseInt(hex.substring(0, 0 + 2), 16);
+ c_g = parseInt(hex.substring(2, 2 + 2), 16);
+ c_b = parseInt(hex.substring(4, 4 + 2), 16);
+ brightness = ((c_r * 334) + (c_g * 334) + (c_b * 332)) / 1000;
+ if (brightness > 127.5) {
+ return true
+ }
+ else {
+ return false
+ }
+}
-elements.SCP_008 = {
+if (!elements.human.reactions) { elements.human.reactions = {}; }
+elements.human.reactions.scp_055 = { attr1:{panic:5000} }
+elements.human.reactions.scp_682 = { attr1:{panic:5} }
+elements.human.reactions.body_008 = { attr1:{panic:5} }
+elements.human.reactions.head_008 = { attr1:{panic:5} }
+elements.human.reactions.body_049_1 = { attr1:{panic:5} }
+elements.human.reactions.head_049_1 = { attr1:{panic:5} }
+elements.human.reactions.scp_096 = { attr1:{panic:5} }
+elements.human.reactions.scp_229 = { attr1:{panic:5} }
+elements.human.reactions.scp_999 = { attr1:{panic:0} }
+elements.human.reactions.black_acid = { attr1:{panic:1} }
+
+hyperCoords = [
+ [0,1],
+ [0,1],
+ [1,-1],
+ [-1,-1],
+ [1,0],
+ [-1,0],
+ [1,0],
+ [-1,0]
+];
+
+destroyCoords = [
+ [0,1],
+ [0,-1],
+ [0,-1],
+ [1,0],
+ [1,0],
+ [-1,0],
+ [-1,0]
+];
+
+elements.metanarrative_ontokinetic_hume_stabilizing_anomaly_neutralizing_all_powerful_eraser = {
+ color: ["#FDB5FF","#FDB5FF","#D397D5","#A979AA","#7F5B80","#543C55","#2A1E2B","#000000","#000000"],
+ behavior: [
+ "DL|DL|DL",
+ "DL|DL|DL",
+ "DL|DL|DL",
+ ],
+ tool: function(pixel) {
+ pixel.del = true
+ },
+ category: "tools",
+ canPlace: false,
+ desc: "Use on something to truly delete it.",
+ hidden: true,
+}
+
+elements.d_class = {
+ // color: ["#f5eac6","#d4c594","#a89160","#7a5733","#523018","#361e0e"],
+ color: ["#f3e7db","#f7ead0","#eadaba","#d7bd96","#a07e56","#825c43","#604134","#3a312a"],
+ buttonColor: ["#A36A19","#BA7613","#C67B0F"],
+ name: "D-Class",
+ 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.d_class.buttonColor)
+ 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.d_class.buttonColor);
+ }
+ 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"],
+ buttonColor: ["#EDEEF7","#D9D9E7","#F8F7FC","#C6C8DC","#D0DCF1"],
+ name: "Researcher",
+ 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.scientist.buttonColor)
+ 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.scientist.buttonColor);
+ }
+ 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.guard = {
+ // color: ["#f5eac6","#d4c594","#a89160","#7a5733","#523018","#361e0e"],
+ color: ["#f3e7db","#f7ead0","#eadaba","#d7bd96","#a07e56","#825c43","#604134","#3a312a"],
+ buttonColor: ["#848692","#2B2A30","#515159","#3A393F"],
+ name: "Security Guard",
+ 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.guard.buttonColor)
+ 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.guard.buttonColor);
+ }
+ 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.scp_008 = {
+ name: "SCP-008",
color: "#11111f",
behavior: [
"M2|M1|M2",
@@ -47,21 +270,37 @@ elements.SCP_008 = {
"M2|M1|M2",
],
reactions: {
- "head": { elem1:null, elem2:"z_head" , chance:0.5 },
- "body": { elem1:null, elem2:"z_body" , chance:0.5 },
- "skin": { elem1:null, elem2: ["infected_skin","infected_skin","infected_meat"] , chance:0.3 },
- "blood": { elem1:null, elem2:"infection" , chance:0.6 },
+ "head": { elem1:null, elem2:"head_008" , chance:0.5 },
+ "cactus": { elem1:null, elem2:["dead_plant","dead_plant","scp_008"], chance:0.2 },
+ "kelp": { elem1:null, elem2:["dead_plant","dead_plant","scp_008"], chance:0.2 },
+ "algae": { elem1:null, elem2:["dead_plant","dead_plant","scp_008"], chance:0.2 },
+ "pistil": { elem1:null, elem2:["dead_plant","dead_plant","scp_008"], chance:0.2 },
+ "sapling": { elem1:null, elem2:["dead_plant","dead_plant","scp_008"], chance:0.2 },
+ "lichen": { elem1:null, elem2:["dead_plant","dead_plant","scp_008"], chance:0.2 },
+ "vine": { elem1:null, elem2:["dead_plant","dead_plant","scp_008"], chance:0.4 },
+ "plant": { elem1:null, elem2:["dead_plant","dead_plant","scp_008"], chance:0.4 },
+ "grass": { elem1:null, elem2:["dead_plant","dead_plant","scp_008"], chance:0.4 },
+ "evergreen": { elem1:null, elem2:["dead_plant","dead_plant","scp_008"], chance:0.4 },
+ "tree_branch": { elem1:null, elem2:["wood","wood","wood","wood","wood","wood","dead_plant","dead_plant","scp_008"], chance:0.4 },
+ "skin": { elem1:null, elem2: "infected_meat", chance:0.3 },
+ "blood": { elem1:null, elem2:"infected_blood" , chance:0.6 },
"meat": { elem1:null, elem2:"infected_meat" , chance:0.4 },
"rotten_meat": { elem1:null, elem2:"infected_meat" , chance:0.5 },
"frozen_meat": { elem1:null, elem2:"frozen_infected_meat" , chance:0.3 },
- "frog": { elem2:"SCP_008" , chance:0.5 },
- "ant": { elem2:"SCP_008" , chance:0.5 },
- "bee": { elem2:"SCP_008" , chance:0.5 },
- "fish": { elem2:"SCP_008" , chance:0.5 },
- "firefly": { elem2:"SCP_008" , chance:0.5 },
- "chlorine": { elem1: null , chance:0.01 },
- "liquid_chlorine": { elem1: null , chance:0.01 },
- "light": { elem1: null , chance:0.01 },
+ "frog": { elem2:["scp_008","infected_meat","infected_meat"], chance:0.5 },
+ "bird": { elem2:["scp_008","infected_meat","infected_meat","feather"], chance:0.5 },
+ "ant": { elem2:["scp_008","dead_bug","dead_bug"], chance:0.5 },
+ "fly": { elem2:["scp_008","dead_bug","dead_bug"], chance:0.5 },
+ "spider": { elem2:["scp_008","dead_bug","dead_bug"], chance:0.5 },
+ "worm": { elem2:["scp_008","dead_bug","slime"], chance:0.5 },
+ "bee": { elem2:["scp_008","dead_bug","dead_bug"], chance:0.5 },
+ "fish": { elem2:["scp_008","infected_meat","infected_meat"], chance:0.5 },
+ "rat": { elem2:["scp_008","infected_meat","infected_meat","infected_meat"], chance:0.5 },
+ "firefly": { elem2:["scp_008","dead_bug","dead_bug"], chance:0.5 },
+ "dead_bug": { elem2:["scp_008","scp_008","calcium"], chance:0.0025 },
+ "chlorine": { elem1: null , chance:0.001 },
+ "liquid_chlorine": { elem1: null , chance:0.001 },
+ "light": { elem1: null , chance:0.001 },
},
tempHigh: 750,
stateHigh: null,
@@ -70,9 +309,10 @@ elements.SCP_008 = {
category: "scp",
state: "gas",
density: 100,
-},
+}
elements.frozen_008 = {
+ name: "frozen SCP-008",
color: "#242424",
behavior: [
"XX|XX|XX",
@@ -80,10 +320,9 @@ elements.frozen_008 = {
"M2%0.01|M1%1.0|M2%0.01",
],
reactions: {
- "head": { elem1:null, elem2:"z_head" , chance:0.4 },
- "body": { elem1:null, elem2:"z_body" , chance:0.4 },
+ "head": { elem1:null, elem2:"head_008" , chance:0.5 },
"skin": { elem1:null, elem2:"frozen_infected_meat" , chance:0.4 },
- "blood": { elem1:null, elem2:"infection" , chance:0.6 },
+ "blood": { elem1:null, elem2:"infected_blood" , chance:0.6 },
"meat": { elem1:null, elem2:"frozen_infected_meat" , chance:0.4 },
"rotten_meat": { elem1:null, elem2:"frozen_infected_meat" , chance:0.5 },
"frozen_meat": { elem1:null, elem2:"frozen_infected_meat" , chance:0.4 },
@@ -93,92 +332,325 @@ elements.frozen_008 = {
},
temp: -50,
tempHigh: 0,
- stateHigh: "SCP_008",
+ stateHigh: "scp_008",
category: "scp",
state: "solid",
density: 95,
-},
-
-elements.infected_skin = {
- color: ["#75816B","#4D6B53"],
- singleColor: true,
- behavior: [
- "XX|CR:stench,stench,stench,SCP_008,fly%0.05 AND CH:skin>infected_skin%25|XX",
- "CH:skin>infected_skin%25|CH:infected_meat%0.5|CH:skin>infected_skin%25",
- "M2%1|M1%1.0 AND CH:skin>infected_skin%25|M2%1",
- ],
- tick: function(pixel) {
- if (pixel.temp > 40 && Math.random() < 0.003) {
- 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)) {
- pixel.temp -= 20;
- createPixel("infection",x,y)
- break;
- }
- }
+}
+
+elements.body_008 = {
+ name: "SCP-008-1",
+ color: ["#069469","#047e99","#7f5fb0"],
+ category: "life",
+ hidden: true,
+ density: 1500,
+ state: "solid",
+ conduct: .05,
+ temp: 37,
+ tempHigh: 150,
+ stateHigh: "infected_meat",
+ tempLow: -30,
+ stateLow: "frozen_infected_meat",
+ burn: 10,
+ burnTime: 250,
+ burnInto: "infected_meat",
+ breakInto: ["infected_blood","infected_meat","bone"],
+ forceSaveColor: true,
+ pickElement: "human",
+ reactions: {
+ "cancer": { elem1:"cancer", chance:0.005 },
+ "radiation": { elem1:["ash","infected_meat","infected_meat","infected_meat"], chance:0.4 },
+ "neutron": { elem1:["ash","infected_meat","infected_meat","infected_meat"], chance:0.01 },
+ "fallout": { elem1:["ash","infected_meat","infected_meat","infected_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 },
+ "gold_coin": { elem2:null, chance:0.05 },
+ "diamond": { elem2:null, chance:0.05 },
+ "sun": { elem1:"infected_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 === "head_008") {
+ 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) {
+ changePixel(pixel,"infected_meat");
+ }
+ return
+ }
+
+ if (!pixel.zStart) {
+ pixel.zStart = pixelTicks
}
- if (pixel.temp < 36 && Math.random() < 0.1) {
- pixel.temp += 1;
+ if ((pixel.zStart + 1000) < pixelTicks) {
+ pixel.dead = pixelTicks
}
- doDefaults(pixel);
- },
- reactions: {
- "cell": { chance:0.01, func:function(pixel1,pixel2){
- changePixel(pixel2,"infected_skin");
- pixel2.color = pixelColorPick(pixel2,RGBToHex(pixel1.color.match(/\d+/g)))
- if (pixel1.origColor) { pixel2.origColor = pixel1.origColor }
- } },
- "water": { elem2:"dirty_water" },
- "salt_water": { elem2:"dirty_water" , chance:0.5 },
- "sugar_water": { elem2:"dirty_water" },
- "seltzer": { elem2:"dirty_water" },
- "meat": { elem2:"infected_meat", chance:0.5 },
- "rotten_meat": { elem2:"infected_meat", chance:0.5 },
- "frozen_meat": { elem2:"frozen_infected_meat", chance:0.5 },
- "fly": { elem2: ["dead_bug","dead_bug","SCP_008"] , chance:0.2},
- "blood": { elem2:"infection" , chance:0.6 },
- "skin": { elem2:"infected_skin" , chance:0.6 },
- "acid": { elem1:"infection" },
- "soap": { elem1:null, elem2:null, chance:0.005 },
- "light": { stain1:"#825043" },
- "poison": { stain1:"#cc564b" },
- "poison_gas": { stain1:"#cc564b" },
- "infection": { stain1:"#cc564b" },
- "pollen": { stain1:"#cc564b" },
- "dust": { stain1:"#cc564b" },
- "flea": { stain1:"#cc564b" },
- "mushroom_spore": { stain1:"#cc564b" },
- "mushroom_stalk": { stain1:"#cc564b" },
- "chlorine": { stain1:"#cc564b" },
- "quicklime": { stain1:"#cc564b" },
- },
- category:"solids",
- breakInto: [null,null,"SCP_008","infection","dust"],
- temp: 37,
- tempHigh: 200,
- stateHigh: ["cooked_meat","cooked_meat","cooked_meat","SCP_008"],
- tempLow: -18,
- stateLow: "frozen_008_meat",
- burn:5,
- burnTime:400,
- burnInto: ["cooked_meat","cooked_meat","SCP_008"],
- state: "solid",
- density: 1010,
- conduct: 0.04,
- movable: false,
-},
+
+ // Find the head
+ if (!isEmpty(pixel.x, pixel.y-1, true) && pixelMap[pixel.x][pixel.y-1].element == "head_008") {
+ var head = pixelMap[pixel.x][pixel.y-1];
+ 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") {
+ var head = pixelMap[pixel.x][pixel.y-1];
+ changePixel(head,"head_008")
+ }
+ else if (!isEmpty(pixel.x, pixel.y-1, true) && pixelMap[pixel.x][pixel.y-1].element == "head_1000") {
+ var head = pixelMap[pixel.x][pixel.y-1];
+ changePixel(head,"head_008")
+ }
+ else { var head = null }
+ if (head && Math.random() < 0.5) {
+ 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].id == elements.head.id) {
+ 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.panic > 0) {
+ pixel.panic -= 0.1;
+ if (pixel.panic < 0) { pixel.panic = 0; }
+ else if (pixel.panic > 50) { pixel.panic = 50; }
+ }
+
+ if (isEmpty(pixel.x, pixel.y-1)) {
+ // create blood if decapitated 10% chance
+ if (Math.random() < 0.1 && !pixel.charge) {
+ createPixel("infected_blood", pixel.x, pixel.y-1);
+ // set dead to true 15% chance
+ if (Math.random() < 0.15) {
+ pixel.dead = pixelTicks;
+ }
+ }
+ }
+ else if (Math.random() < 0.2) { // Move 20% 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 (hitPixel.element === "body" || hitPixel.element === "head") {
+ // interact with other human
+ hitPixel.panic += 1
+ }
+ }
+ }
+ // 10% chance to change direction
+ if (Math.random() < 0.1 || !moved) {
+ pixel.dir *= -1;
+ }
+ }
+
+ }
+}
+
+elements.head_008 = {
+ color: ["#75816B","#4D6B53"],
+ name: "SCP-008-1",
+ category: "life",
+ hidden: true,
+ density: 1080,
+ state: "solid",
+ conduct: .05,
+ temp: 37,
+ tempHigh: 150,
+ stateHigh: "infected_meat",
+ tempLow: -30,
+ stateLow: "frozen_infected_meat",
+ burn: 10,
+ burnTime: 250,
+ burnInto: "infected_meat",
+ breakInto: ["infected_blood","infected_meat","bone"],
+ forceSaveColor: true,
+ pickElement: "human",
+ reactions: {
+ "cancer": { elem1:"cancer", chance:0.005 },
+ "radiation": { elem1:["ash","infected_meat","infected_meat","infected_meat"], chance:0.4 },
+ "neutron": { elem1:["ash","infected_meat","infected_meat","infected_meat"], chance:0.03 },
+ "fallout": { elem1:["ash","infected_meat","infected_meat","infected_meat"], chance:0.03 },
+ "plague": { elem1:"plague", chance:0.05 },
+ "oxygen": { elem2:["carbon_dioxide","carbon_dioxide","scp_008"], chance:0.5 },
+ "beans": { elem2:[null,null,null,null,null,null,null,null,"stench","scp_008"], chance:0.2 },
+ "sun": { elem1:"infected_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) {
+ changePixel(pixel,"infected_meat");
+ return
+ }
+ }
+
+ if (isEmpty(pixel.x, pixel.y-1, true) && Math.random() < 0.005) {
+ createPixel("scp_008",pixel.x,pixel.y)
+ }
+ if (isEmpty(pixel.x+1, pixel.y, true) && Math.random() < 0.01) {
+ createPixel("scp_008",pixel.x+1,pixel.y)
+ }
+ if (isEmpty(pixel.x-1, pixel.y, true) && Math.random() < 0.01) {
+ createPixel("scp_008",pixel.x-1,pixel.y)
+ }
+
+ // Find the body
+ if (!isEmpty(pixel.x, pixel.y+1, true) && pixelMap[pixel.x][pixel.y+1].element == "body_008") {
+ 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") {
+ var body = pixelMap[pixel.x][pixel.y+1];
+ body.element = "body_008"
+ }
+ else if (!isEmpty(pixel.x, pixel.y+1, true) && pixelMap[pixel.x][pixel.y+1].element == "body_1000") {
+ var body = pixelMap[pixel.x][pixel.y+1];
+ body.element = "body_008"
+ body.color == pixelColorPick(body,elements.head_008.color)
+ }
+ 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) {
+ deletePixel(x,y);
+ break;
+ }
+ else if (!isEmpty(x,y,true) && elements[pixelMap[x][y].element].id == elements.head.id) {
+ pixelMap[x][y+1].element = "body_008"
+ changePixel(pixelMap[x][y],"head_008")
+ break;
+ }
+ else if (!isEmpty(x,y,true) && elements[pixelMap[x][y].element].id == elements.body.id) {
+ pixelMap[x][y].element = "body_008"
+ changePixel(pixelMap[x][y-1],"head_008")
+ break;
+ }
+ else if (!isEmpty(x,y,true) && elements[pixelMap[x][y].element].id == elements.head_1000.id) {
+ pixelMap[x][y+1].element = "body_008"
+ pixelMap[x][y+1].color == pixelColorPick(pixelMap[x][y+1],elements.head_008.color)
+ changePixel(pixelMap[x][y],"head_008")
+ break;
+ }
+ else if (!isEmpty(x,y,true) && elements[pixelMap[x][y].element].id == elements.body_1000.id) {
+ pixelMap[x][y].element = "body_008"
+ pixelMap[x][y].color == pixelColorPick(pixelMap[x][y],elements.head_008.color)
+ changePixel(pixelMap[x][y-1],"head_008")
+ 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.1 && !pixel.charge) {
+ createPixel("infected_blood", pixel.x, pixel.y+1);
+ // set dead to true 15% chance
+ if (Math.random() < 0.15) {
+ pixel.dead = pixelTicks;
+ }
+ }
+ }
+ },
+}
elements.infected_meat = {
color: ["#b8b165","#b89765"],
+ name: "meat",
behavior: [
- "XX|CR:stench,stench,stench,SCP_008,fly%0.25 AND CH:skin>infected_skin%1|XX",
- "SP%25 AND CH:skin>infected_skin%1|XX|SP%25 AND CH:skin>infected_skin%1",
- "M2%0.5|M1 AND CH:meat>infected_meat%1|M2%0.5",
+ "XX|CR:stench,stench,stench,scp_008,fly%0.25 AND CH:meat,skin>infected_meat%1|XX",
+ "SP%25 AND CH:meat,skin>infected_meat%1|XX|SP%25 AND CH:meat,skin>infected_meat%1",
+ "M2%0.5|M1 AND CH:meat,skin>infected_meat%1|M2%0.5",
],
reactions: {
+ "head": { elem1:null, elem2:"head_008" , chance:0.75 },
+ "body": { elem1:null, elem2:"body_008" , chance:0.05 },
"water": { elem2:"dirty_water" },
"salt_water": { elem2:"dirty_water" , chance:0.5 },
"sugar_water": { elem2:"dirty_water" },
@@ -186,19 +658,19 @@ elements.infected_meat = {
"meat": { elem2:"infected_meat", chance:0.5 },
"rotten_meat": { elem2:"infected_meat", chance:0.5 },
"frozen_meat": { elem2:"frozen_infected_meat", chance:0.5 },
- "fly": { elem2: ["dead_bug","dead_bug","SCP_008"] , chance:0.2},
- "blood": { elem2:"infection" , chance:0.6 },
- "skin": { elem2:"infected_skin" , chance:0.6 },
+ "fly": { elem2: ["dead_bug","dead_bug","scp_008"] , chance:0.2},
+ "blood": { elem2:"infected_blood" , chance:0.6 },
+ "skin": { elem2:"infected_meat" , chance:0.6 },
},
tempHigh: 300,
- stateHigh: ["SCP_008","ash","ammonia"],
+ stateHigh: ["scp_008","ash","ammonia"],
tempLow: -20,
stateLow: "frozen_infected_meat",
category:"scp",
hidden: true,
burn:12,
burnTime:200,
- burnInto:["SCP_008","ash","ammonia"],
+ burnInto:["scp_008","ash","ammonia"],
state: "solid",
density: 1005,
conduct: 0.1,
@@ -207,12 +679,14 @@ elements.infected_meat = {
elements.frozen_infected_meat = {
color: ["#82AEC0","#80808F","#9CAC98"],
+ name: "frozen_meat",
behavior: [
"XX|XX|XX",
"SP%95|XX|SP%95",
"XX|M1 AND CH:frozen_meat,meat>frozen_infected_meat%1|XX",
],
reactions: {
+ "head": { elem1:null, elem2:"head_008" , chance:0.5 },
"water": { elem2:"dirty_water" },
"salt_water": { elem1:"infected_meat",elem2:"dirty_water" , chance:0.5 },
"sugar_water": { elem2:"dirty_water" },
@@ -220,8 +694,8 @@ elements.frozen_infected_meat = {
"meat": { elem2:"frozen_infected_meat", chance:0.5 },
"rotten_meat": { elem2:"frozen_infected_meat", chance:0.5 },
"frozen_meat": { elem2:"frozen_infected_meat", chance:0.5 },
- "fly": { elem2: ["dead_bug","dead_bug","SCP_008"] , chance:0.2},
- "blood": { elem2:"infection" , chance:0.6 },
+ "fly": { elem2: ["dead_bug","dead_bug","frozen_008"] , chance:0.2},
+ "blood": { elem2:"infected_blood" , chance:0.6 },
},
temp: -20,
tempHigh: 10,
@@ -231,237 +705,1373 @@ elements.frozen_infected_meat = {
state: "solid",
density: 1005,
conduct: 0.05,
-},
+}
-elements.possessive_mask = {
+elements.infected_blood = {
+ color: ["#cf005d","#be004c"],
+ name: "infection",
+ behavior: behaviors.LIQUID,
+ tick: function(pixel) {
+ if (Math.random() < 0.001) { releaseElement(pixel,"scp_008"); }
+ },
+ reactions: {
+ "head": { elem1:null, elem2:"head_008" , chance:0.75 },
+ "body": { elem1:null, elem2:"body_008" , chance:0.05 },
+ "blood": { elem2:"infected_blood", chance:0.02 },
+ "infection": { elem2:"infected_blood", chance:0.025 },
+ "frog": { elem2:"infected_meat", chance:0.005 },
+ "fish": { elem2:"infected_meat", chance:0.005 },
+ "meat": { elem2:"infected_meat", chance:0.005 },
+ "rotten_meat": { elem2:"infected_meat", chance:0.05 },
+ "alcohol": { elem1:"infection", chance:0.2 },
+ "epsom_salt": { elem1:"infection", chance:0.3 }
+ },
+ viscosity: 15,
+ tempHigh: 124.55,
+ stateHigh: ["scp_008","scp_008","scp_008","salt","oxygen"],
+ tempLow: 0,
+ stateLow: ["scp_008","infection"],
+ category:"liquids",
+ hidden: true,
+ state: "liquid",
+ density: 1060,
+ stain: 0.05
+}
+
+elements.scp_009 = {
+ color: "#D2042D",
+ behavior: [
+ "XX|XX|XX",
+ "XX|XX|XX",
+ "XX|M1|XX",
+ ],
+ reactions: {
+ "rain_cloud": { elem2: "red_rain", chance:0.4 },
+ "cloud": { elem2: "red_cloud", chance:0.4, chance:0.4 },
+ "snow_cloud": { elem2: "red_snow_cloud", chance:0.4 },
+ "frozen_plant":{elem2:"scp_009_plant", chance:0.025},
+ "dead_plant":{elem2:"red_plant", chance:0.025},
+ "salt_ice":{elem2:"scp_009", chance:0.25},
+ "sugar_ice":{elem2:"scp_009", chance:0.25},
+ "juice_ice":{elem2:"scp_009", chance:0.25},
+ "dirty_ice":{elem2:"scp_009", chance:0.25},
+ "ice":{elem2:"scp_009", chance:0.25},
+ "water":{elem2:"scp_009", chance:0.25},
+ "steam":{elem2:"scp_009", chance:0.15},
+ "blood":{elem2:"scp_009", chance:0.25},
+ "blood_ice":{elem2:"scp_009", chance:0.25},
+ "antibody":{elem2:"scp_009", chance:0.25},
+ "salt_water":{elem2:"scp_009", chance:0.25},
+ "sugar_water":{elem2:"scp_009", chance:0.25},
+ "dirty_water":{elem2:"scp_009", chance:0.25},
+ "pool_water":{elem2:"scp_009", chance:0.25},
+ "slush":{elem2:"scp_009", chance:0.25},
+ "seltzer":{elem2:"scp_009", chance:0.25},
+ "juice":{elem2:"scp_009", chance:0.25},
+ "soda":{elem2:"scp_009", chance:0.25},
+ "milk":{elem2:"scp_009", chance:0.25},
+ "slime":{elem2:"scp_009", chance:0.25},
+ "tea":{elem2:"scp_009", chance:0.25},
+ "coffee":{elem2:"scp_009", chance:0.25},
+ "neutral_acid":{elem2:"scp_009", chance:0.25},
+ "infection":{elem2:"scp_009", chance:0.25},
+ "meat":{elem2:"scp_009_meat", chance:0.15},
+ "skin":{elem2:"scp_009_meat", chance:0.075},
+ "body":{elem2:"scp_009_meat", chance:0.04},
+ "head":{elem2:"scp_009_meat", chance:0.05},
+ "frozen_meat":{elem2:"scp_009_meat", chance:0.15},
+ "fish":{elem2:"scp_009_meat", chance:0.15},
+ "bird":{elem2:"scp_009_meat", chance:0.15},
+ "frog":{elem2:"scp_009_meat", chance:0.15},
+ "tadpole":{elem2:"scp_009_meat", chance:0.15},
+ },
+ breakInto: "red_snow",
+ tempLow: 0,
+ stateLow: "red_water",
+ category: "scp",
+ state: "solid",
+ density: 917,
+}
+
+elements.red_snow = {
+ color: "#D64765",
+ name: "SCP-009",
+ behavior: behaviors.POWDER,
+ reactions: {
+ "rain_cloud": { elem2: "red_rain", chance:0.4 },
+ "cloud": { elem2: "red_cloud", chance:0.4, chance:0.4 },
+ "snow_cloud": { elem2: "red_snow_cloud", chance:0.4 },
+ "frozen_plant":{elem2:"scp_009_plant", chance:0.025},
+ "dead_plant":{elem2:"red_plant", chance:0.025},
+ "salt_ice":{elem2:"scp_009", chance:0.25},
+ "sugar_ice":{elem2:"scp_009", chance:0.25},
+ "juice_ice":{elem2:"scp_009", chance:0.25},
+ "dirty_ice":{elem2:"scp_009", chance:0.25},
+ "ice":{elem2:"scp_009", chance:0.25},
+ "water":{elem2:"scp_009", chance:0.25},
+ "steam":{elem2:"scp_009", chance:0.15},
+ "blood":{elem2:"scp_009", chance:0.25},
+ "blood_ice":{elem2:"scp_009", chance:0.25},
+ "antibody":{elem2:"scp_009", chance:0.25},
+ "salt_water":{elem2:"scp_009", chance:0.25},
+ "sugar_water":{elem2:"scp_009", chance:0.25},
+ "dirty_water":{elem2:"scp_009", chance:0.25},
+ "pool_water":{elem2:"scp_009", chance:0.25},
+ "slush":{elem2:"scp_009", chance:0.25},
+ "seltzer":{elem2:"scp_009", chance:0.25},
+ "juice":{elem2:"scp_009", chance:0.25},
+ "soda":{elem2:"scp_009", chance:0.25},
+ "milk":{elem2:"scp_009", chance:0.25},
+ "slime":{elem2:"scp_009", chance:0.25},
+ "tea":{elem2:"scp_009", chance:0.25},
+ "coffee":{elem2:"scp_009", chance:0.25},
+ "neutral_acid":{elem2:"scp_009", chance:0.25},
+ "infection":{elem2:"scp_009", chance:0.25},
+ "meat":{elem2:"scp_009_meat", chance:0.15},
+ "skin":{elem2:"scp_009_meat", chance:0.075},
+ "body":{elem2:"scp_009_meat", chance:0.04},
+ "head":{elem2:"scp_009_meat", chance:0.05},
+ "frozen_meat":{elem2:"scp_009_meat", chance:0.15},
+ "fish":{elem2:"scp_009_meat", chance:0.15},
+ "bird":{elem2:"scp_009_meat", chance:0.15},
+ "frog":{elem2:"scp_009_meat", chance:0.15},
+ "tadpole":{elem2:"scp_009_meat", chance:0.15},
+ },
+ temp: 5,
+ tempLow: -18,
+ tempHigh: 100,
+ stateHigh: "packed_red_snow",
+ stateLow: "red_water",
+ category: "scp",
+ state: "solid",
+ density: 100,
+ hidden: true,
+}
+
+elements.packed_red_snow = {
+ color: "#CC3F5F",
+ name: "SCP-009",
+ behavior: behaviors.SUPPORTPOWDER,
+ reactions: {
+ "rain_cloud": { elem2: "red_rain", chance:0.4 },
+ "cloud": { elem2: "red_cloud", chance:0.4, chance:0.4 },
+ "snow_cloud": { elem2: "red_snow_cloud", chance:0.4 },
+ "frozen_plant":{elem2:"scp_009_plant", chance:0.025},
+ "dead_plant":{elem2:"red_plant", chance:0.025},
+ "salt_ice":{elem2:"scp_009", chance:0.25},
+ "sugar_ice":{elem2:"scp_009", chance:0.25},
+ "juice_ice":{elem2:"scp_009", chance:0.25},
+ "dirty_ice":{elem2:"scp_009", chance:0.25},
+ "ice":{elem2:"scp_009", chance:0.25},
+ "water":{elem2:"scp_009", chance:0.25},
+ "steam":{elem2:"scp_009", chance:0.15},
+ "blood":{elem2:"scp_009", chance:0.25},
+ "blood_ice":{elem2:"scp_009", chance:0.25},
+ "antibody":{elem2:"scp_009", chance:0.25},
+ "salt_water":{elem2:"scp_009", chance:0.25},
+ "sugar_water":{elem2:"scp_009", chance:0.25},
+ "dirty_water":{elem2:"scp_009", chance:0.25},
+ "pool_water":{elem2:"scp_009", chance:0.25},
+ "slush":{elem2:"scp_009", chance:0.25},
+ "seltzer":{elem2:"scp_009", chance:0.25},
+ "juice":{elem2:"scp_009", chance:0.25},
+ "soda":{elem2:"scp_009", chance:0.25},
+ "milk":{elem2:"scp_009", chance:0.25},
+ "slime":{elem2:"scp_009", chance:0.25},
+ "tea":{elem2:"scp_009", chance:0.25},
+ "coffee":{elem2:"scp_009", chance:0.25},
+ "neutral_acid":{elem2:"scp_009", chance:0.25},
+ "infection":{elem2:"scp_009", chance:0.25},
+ "meat":{elem2:"scp_009_meat", chance:0.15},
+ "skin":{elem2:"scp_009_meat", chance:0.075},
+ "body":{elem2:"scp_009_meat", chance:0.04},
+ "head":{elem2:"scp_009_meat", chance:0.05},
+ "frozen_meat":{elem2:"scp_009_meat", chance:0.15},
+ "fish":{elem2:"scp_009_meat", chance:0.15},
+ "bird":{elem2:"scp_009_meat", chance:0.15},
+ "frog":{elem2:"scp_009_meat", chance:0.15},
+ "tadpole":{elem2:"scp_009_meat", chance:0.15},
+ },
+ temp: 5,
+ tempLow: -20,
+ tempHigh: 200,
+ stateHigh: "scp_009",
+ stateLow: "red_water",
+ breakInto: "red_snow",
+ category: "scp",
+ state: "solid",
+ density: 400,
+ hidden: true
+}
+
+elements.scp_009_meat = {
+ name: "SCP-009 meat",
+ color: "#AC3536",
+ behavior: [
+ "XX|CH:frozen_meat,meat>scp_009_meat%1|XX",
+ "CH:frozen_meat,meat>scp_009_meat%1|XX|CH:frozen_meat,meat>scp_009_meat%1",
+ "XX|M1 AND CH:frozen_meat,meat>scp_009_meat%1|XX",
+ ],
+ reactions: {
+ "rain_cloud": { elem2: "red_rain", chance:0.4 },
+ "cloud": { elem2: "red_cloud", chance:0.4, chance:0.4 },
+ "snow_cloud": { elem2: "red_snow_cloud", chance:0.4 },
+ "frozen_plant":{elem2:"scp_009_plant", chance:0.025},
+ "dead_plant":{elem2:"red_plant", chance:0.025},
+ "salt_ice":{elem2:"scp_009", chance:0.25},
+ "sugar_ice":{elem2:"scp_009", chance:0.25},
+ "juice_ice":{elem2:"scp_009", chance:0.25},
+ "dirty_ice":{elem2:"scp_009", chance:0.25},
+ "ice":{elem2:"scp_009", chance:0.25},
+ "water":{elem2:"scp_009", chance:0.025},
+ "steam":{elem2:"scp_009", chance:0.015},
+ "blood":{elem2:"scp_009", chance:0.025},
+ "blood_ice":{elem2:"scp_009", chance:0.25},
+ "antibody":{elem2:"scp_009", chance:0.025},
+ "salt_water":{elem2:"scp_009", chance:0.025},
+ "sugar_water":{elem2:"scp_009", chance:0.025},
+ "dirty_water":{elem2:"scp_009", chance:0.025},
+ "pool_water":{elem2:"scp_009", chance:0.025},
+ "slush":{elem2:"scp_009", chance:0.025},
+ "seltzer":{elem2:"scp_009", chance:0.025},
+ "juice":{elem2:"scp_009", chance:0.025},
+ "soda":{elem2:"scp_009", chance:0.025},
+ "milk":{elem2:"scp_009", chance:0.025},
+ "slime":{elem2:"scp_009", chance:0.025},
+ "tea":{elem2:"scp_009", chance:0.025},
+ "coffee":{elem2:"scp_009", chance:0.025},
+ "neutral_acid":{elem2:"scp_009", chance:0.025},
+ "infection":{elem2:"scp_009", chance:0.025},
+ "meat":{elem2:"scp_009_meat", chance:0.015},
+ "skin":{elem2:"scp_009_meat", chance:0.0075},
+ "body":{elem2:"scp_009_meat", chance:0.004},
+ "head":{elem2:"scp_009_meat", chance:0.005},
+ "frozen_meat":{elem2:"scp_009_meat", chance:0.015},
+ "fish":{elem2:"scp_009_meat", chance:0.015},
+ "bird":{elem2:"scp_009_meat", chance:0.015},
+ "frog":{elem2:"scp_009_meat", chance:0.015},
+ "tadpole":{elem2:"scp_009_meat", chance:0.015},
+ },
+ tempLow: -100,
+ stateLow: "meat",
+ category:"scp",
+ hidden:true,
+ state: "solid",
+ density: 1067.5,
+ isFood: true
+}
+
+elements.scp_009_plant = {
+ name: "SCP-009 plant",
+ color: "#735958",
+ reactions: {
+ "rain_cloud": { elem2: "red_rain", chance:0.4 },
+ "cloud": { elem2: "red_cloud", chance:0.4, chance:0.4 },
+ "snow_cloud": { elem2: "red_snow_cloud", chance:0.4 },
+ "frozen_plant":{elem2:"scp_009_plant", chance:0.025},
+ "dead_plant":{elem2:"red_plant", chance:0.025},
+ "salt_ice":{elem2:"scp_009", chance:0.25},
+ "sugar_ice":{elem2:"scp_009", chance:0.25},
+ "juice_ice":{elem2:"scp_009", chance:0.25},
+ "dirty_ice":{elem2:"scp_009", chance:0.25},
+ "ice":{elem2:"scp_009", chance:0.25},
+ "water":{elem2:"scp_009", chance:0.025},
+ "steam":{elem2:"scp_009", chance:0.015},
+ "blood":{elem2:"scp_009", chance:0.025},
+ "blood_ice":{elem2:"scp_009", chance:0.25},
+ "antibody":{elem2:"scp_009", chance:0.025},
+ "salt_water":{elem2:"scp_009", chance:0.025},
+ "sugar_water":{elem2:"scp_009", chance:0.025},
+ "dirty_water":{elem2:"scp_009", chance:0.025},
+ "pool_water":{elem2:"scp_009", chance:0.025},
+ "slush":{elem2:"scp_009", chance:0.025},
+ "seltzer":{elem2:"scp_009", chance:0.025},
+ "juice":{elem2:"scp_009", chance:0.025},
+ "soda":{elem2:"scp_009", chance:0.025},
+ "milk":{elem2:"scp_009", chance:0.025},
+ "slime":{elem2:"scp_009", chance:0.025},
+ "tea":{elem2:"scp_009", chance:0.025},
+ "coffee":{elem2:"scp_009", chance:0.025},
+ "neutral_acid":{elem2:"scp_009", chance:0.025},
+ "infection":{elem2:"scp_009", chance:0.025},
+ "meat":{elem2:"scp_009_meat", chance:0.015},
+ "skin":{elem2:"scp_009_meat", chance:0.0075},
+ "body":{elem2:"scp_009_meat", chance:0.004},
+ "head":{elem2:"scp_009_meat", chance:0.005},
+ "frozen_meat":{elem2:"scp_009_meat", chance:0.015},
+ "fish":{elem2:"scp_009_meat", chance:0.015},
+ "bird":{elem2:"scp_009_meat", chance:0.015},
+ "frog":{elem2:"scp_009_meat", chance:0.015},
+ "tadpole":{elem2:"scp_009_meat", chance:0.015},
+ },
+ behavior: behaviors.WALL,
+ category:"scp",
+ tempHigh: 300,
+ stateHigh: "fire",
+ burn:85,
+ burnTime:45,
+ temp: 2.66,
+ tempLow: -7,
+ stateLow: "red_plant",
+ state: "solid",
+ density: 1050,
+ hidden: true,
+}
+
+elements.red_plant = {
+ color: ["#AA3527","#AA3227","#AA2C27","#A11D1D"],
+ reactions: {
+ "rain_cloud": { elem2: "red_rain", chance:0.4 },
+ "cloud": { elem2: "red_cloud", chance:0.4, chance:0.4 },
+ "snow_cloud": { elem2: "red_snow_cloud", chance:0.4 },
+ "frozen_plant":{elem2:"scp_009_plant", chance:0.025},
+ "dead_plant":{elem2:"red_plant", chance:0.025},
+ "salt_ice":{elem2:"scp_009", chance:0.25},
+ "sugar_ice":{elem2:"scp_009", chance:0.25},
+ "juice_ice":{elem2:"scp_009", chance:0.25},
+ "dirty_ice":{elem2:"scp_009", chance:0.25},
+ "ice":{elem2:"scp_009", chance:0.25},
+ "water":{elem2:"scp_009", chance:0.025},
+ "steam":{elem2:"scp_009", chance:0.015},
+ "blood":{elem2:"scp_009", chance:0.025},
+ "blood_ice":{elem2:"scp_009", chance:0.25},
+ "antibody":{elem2:"scp_009", chance:0.025},
+ "salt_water":{elem2:"scp_009", chance:0.025},
+ "sugar_water":{elem2:"scp_009", chance:0.025},
+ "dirty_water":{elem2:"scp_009", chance:0.025},
+ "pool_water":{elem2:"scp_009", chance:0.025},
+ "slush":{elem2:"scp_009", chance:0.025},
+ "seltzer":{elem2:"scp_009", chance:0.025},
+ "juice":{elem2:"scp_009", chance:0.025},
+ "soda":{elem2:"scp_009", chance:0.025},
+ "milk":{elem2:"scp_009", chance:0.025},
+ "slime":{elem2:"scp_009", chance:0.025},
+ "tea":{elem2:"scp_009", chance:0.025},
+ "coffee":{elem2:"scp_009", chance:0.025},
+ "neutral_acid":{elem2:"scp_009", chance:0.025},
+ "infection":{elem2:"scp_009", chance:0.025},
+ "meat":{elem2:"scp_009_meat", chance:0.015},
+ "skin":{elem2:"scp_009_meat", chance:0.0075},
+ "body":{elem2:"scp_009_meat", chance:0.004},
+ "head":{elem2:"scp_009_meat", chance:0.005},
+ "frozen_meat":{elem2:"scp_009_meat", chance:0.015},
+ "fish":{elem2:"scp_009_meat", chance:0.015},
+ "bird":{elem2:"scp_009_meat", chance:0.015},
+ "frog":{elem2:"scp_009_meat", chance:0.015},
+ "tadpole":{elem2:"scp_009_meat", chance:0.015},
+ },
+ behavior: [
+ "XX|XX|XX",
+ "XX|XX|XX",
+ "M2|M1|M2",
+ ],
+ category:"scp",
+ tempHigh: 2,
+ stateHigh: "scp_009_plant",
+ state: "solid",
+ density: 1050,
+ hidden: true,
+}
+
+elements.red_water = {
+ color: "#880808",
+ name: "liquid_SCP-009",
+ behavior: behaviors.LIQUID,
+ reactions: {
+ "rain_cloud": { elem2: "red_rain", chance:0.4 },
+ "cloud": { elem2: "red_cloud", chance:0.4, chance:0.4 },
+ "snow_cloud": { elem2: "red_snow_cloud", chance:0.4 },
+ "frozen_plant":{elem2:"scp_009_plant", chance:0.025},
+ "dead_plant":{elem2:"red_plant", chance:0.025},
+ "salt_ice":{elem2:"scp_009", chance:0.25},
+ "sugar_ice":{elem2:"scp_009", chance:0.25},
+ "juice_ice":{elem2:"scp_009", chance:0.25},
+ "dirty_ice":{elem2:"scp_009", chance:0.25},
+ "ice":{elem2:"scp_009", chance:0.25},
+ "water":{elem2:"scp_009"},
+ "blood":{elem2:"scp_009"},
+ "blood_ice":{elem2:"scp_009", chance:0.25},
+ "antibody":{elem2:"scp_009"},
+ "salt_water":{elem2:"scp_009"},
+ "sugar_water":{elem2:"scp_009"},
+ "dirty_water":{elem2:"scp_009"},
+ "pool_water":{elem2:"scp_009"},
+ "slush":{elem2:"scp_009"},
+ "seltzer":{elem2:"scp_009"},
+ "juice":{elem2:"scp_009"},
+ "soda":{elem2:"scp_009"},
+ "milk":{elem2:"scp_009"},
+ "slime":{elem2:"scp_009"},
+ "tea":{elem2:"scp_009"},
+ "coffee":{elem2:"scp_009"},
+ "neutral_acid":{elem2:"scp_009"},
+ "infection":{elem2:"scp_009"},
+ "meat":{elem2:"scp_009_meat", chance:0.015},
+ "skin":{elem2:"scp_009_meat", chance:0.0075},
+ "body":{elem2:"scp_009_meat", chance:0.004},
+ "head":{elem2:"scp_009_meat", chance:0.005},
+ "frozen_meat":{elem2:"scp_009_meat", chance:0.015},
+ "fish":{elem2:"scp_009_meat", chance:0.015},
+ "bird":{elem2:"scp_009_meat", chance:0.015},
+ "frog":{elem2:"scp_009_meat", chance:0.015},
+ "tadpole":{elem2:"scp_009_meat", chance:0.015},
+ },
+ tempLow: -100,
+ stateLow: "red_steam",
+ tempHigh: 0,
+ stateHigh: "scp_009",
+ category: "scp",
+ state: "liquid",
+ density: 997,
+ conduct: 0.02,
+ temp: -20,
+ stain: -0.5,
+ extinguish: true,
+ hidden: true,
+}
+
+elements.red_steam = {
+ color: "#F88379",
+ name: "SCP-009_steam",
+ behavior: behaviors.GAS,
+ reactions: {
+ "red_steam": { elem1: "red_cloud", elem2: "red_cloud", chance:0.05, "y":[0,15], "setting":"clouds" },
+ "red_rain": { elem1: "red_rain", chance:0.4, "y":[0,12], "setting":"clouds" },
+ "red_cloud": { elem1: "red_cloud", chance:0.4, "y":[0,12], "setting":"clouds" },
+ "red_snow_cloud": { elem1: "red_rain_cloud", chance:0.4, "y":[0,12], "setting":"clouds" },
+ "rain_cloud": { elem2: "red_rain", chance:0.4 },
+ "cloud": { elem2: "red_cloud", chance:0.4, chance:0.4 },
+ "snow_cloud": { elem2: "red_snow_cloud", chance:0.4 },
+ "frozen_plant":{elem2:"scp_009_plant", chance:0.025},
+ "dead_plant":{elem2:"red_plant", chance:0.025},
+ "salt_ice":{elem2:"scp_009", chance:0.25},
+ "sugar_ice":{elem2:"scp_009", chance:0.25},
+ "juice_ice":{elem2:"scp_009", chance:0.25},
+ "dirty_ice":{elem2:"scp_009", chance:0.25},
+ "ice":{elem2:"scp_009", chance:0.25},
+ "water":{elem2:"scp_009"},
+ "blood":{elem2:"scp_009"},
+ "blood_ice":{elem2:"scp_009", chance:0.25},
+ "antibody":{elem2:"scp_009"},
+ "salt_water":{elem2:"scp_009"},
+ "sugar_water":{elem2:"scp_009"},
+ "dirty_water":{elem2:"scp_009"},
+ "pool_water":{elem2:"scp_009"},
+ "slush":{elem2:"scp_009"},
+ "seltzer":{elem2:"scp_009"},
+ "juice":{elem2:"scp_009"},
+ "soda":{elem2:"scp_009"},
+ "milk":{elem2:"scp_009"},
+ "slime":{elem2:"scp_009"},
+ "tea":{elem2:"scp_009"},
+ "coffee":{elem2:"scp_009"},
+ "neutral_acid":{elem2:"scp_009"},
+ "infection":{elem2:"scp_009"},
+ "meat":{elem2:"scp_009_meat", chance:0.015},
+ "skin":{elem2:"scp_009_meat", chance:0.0075},
+ "body":{elem2:"scp_009_meat", chance:0.004},
+ "head":{elem2:"scp_009_meat", chance:0.005},
+ "frozen_meat":{elem2:"scp_009_meat", chance:0.015},
+ "fish":{elem2:"scp_009_meat", chance:0.015},
+ "bird":{elem2:"scp_009_meat", chance:0.015},
+ "frog":{elem2:"scp_009_meat", chance:0.015},
+ "tadpole":{elem2:"scp_009_meat", chance:0.015},
+ },
+ temp: -150,
+ tempHigh: -100,
+ stateHigh: "red_water",
+ category: "scp",
+ state: "gas",
+ density: 0.6,
+ hidden: true,
+}
+
+elements.red_cloud = {
+ color: "#E8ABAB",
+ behavior: [
+ "XX|XX|XX",
+ "XX|CO:1%5|M1%2.5 AND BO",
+ "XX|XX|XX",
+ ],
+ reactions: {
+ "red_rain": { elem1:"red_rain", temp1: 20 },
+ "red_cloud": { elem1:"red_rain", elem2:"red_rain", temp1:20, temp2:20, charged:true },
+ "rain_cloud": { elem2: "red_rain", chance:0.4 },
+ "cloud": { elem2: "red_cloud", chance:0.4, chance:0.4 },
+ "snow_cloud": { elem2: "red_snow_cloud", chance:0.4 },
+ "frozen_plant":{elem2:"scp_009_plant", chance:0.025},
+ "dead_plant":{elem2:"red_plant", chance:0.025},
+ "water":{elem2:"scp_009"},
+ "blood":{elem2:"scp_009"},
+ "blood_ice":{elem2:"scp_009", chance:0.25},
+ "antibody":{elem2:"scp_009"},
+ "salt_water":{elem2:"scp_009"},
+ "sugar_water":{elem2:"scp_009"},
+ "dirty_water":{elem2:"scp_009"},
+ "pool_water":{elem2:"scp_009"},
+ "slush":{elem2:"scp_009"},
+ "seltzer":{elem2:"scp_009"},
+ "juice":{elem2:"scp_009"},
+ "soda":{elem2:"scp_009"},
+ "milk":{elem2:"scp_009"},
+ "slime":{elem2:"scp_009"},
+ "tea":{elem2:"scp_009"},
+ "coffee":{elem2:"scp_009"},
+ "neutral_acid":{elem2:"scp_009"},
+ "infection":{elem2:"scp_009"},
+ "meat":{elem2:"scp_009_meat", chance:0.015},
+ "skin":{elem2:"scp_009_meat", chance:0.0075},
+ "body":{elem2:"scp_009_meat", chance:0.004},
+ "head":{elem2:"scp_009_meat", chance:0.005},
+ "frozen_meat":{elem2:"scp_009_meat", chance:0.015},
+ "fish":{elem2:"scp_009_meat", chance:0.015},
+ "bird":{elem2:"scp_009_meat", chance:0.015},
+ "frog":{elem2:"scp_009_meat", chance:0.015},
+ "tadpole":{elem2:"scp_009_meat", chance:0.015},
+ },
+ category:"scp",
+ temp: -110,
+ tempHigh: -100,
+ stateHigh: "red_rain",
+ state: "gas",
+ breakInto: "red_rain",
+ density: 0.4,
+ ignoreAir: true,
+ conduct: 0.03,
+ hidden: true,
+}
+
+elements.red_rain = {
+ color: "#C27A79",
+ behavior: [
+ "XX|XX|XX",
+ "XX|CH:red_water%0.05|M1%2.5 AND BO",
+ "CR:electric%0.05|CR:electric%0.05|CR:electric%0.05",
+ ],
+ reactions: {
+ "rain_cloud": { elem2: "red_rain", chance:0.4 },
+ "cloud": { elem2: "red_cloud", chance:0.4, chance:0.4 },
+ "snow_cloud": { elem2: "red_snow_cloud", chance:0.4 },
+ "frozen_plant":{elem2:"scp_009_plant", chance:0.025},
+ "dead_plant":{elem2:"red_plant", chance:0.025},
+ "water":{elem2:"scp_009"},
+ "blood":{elem2:"scp_009"},
+ "blood_ice":{elem2:"scp_009", chance:0.25},
+ "antibody":{elem2:"scp_009"},
+ "salt_water":{elem2:"scp_009"},
+ "sugar_water":{elem2:"scp_009"},
+ "dirty_water":{elem2:"scp_009"},
+ "pool_water":{elem2:"scp_009"},
+ "slush":{elem2:"scp_009"},
+ "seltzer":{elem2:"scp_009"},
+ "juice":{elem2:"scp_009"},
+ "soda":{elem2:"scp_009"},
+ "milk":{elem2:"scp_009"},
+ "slime":{elem2:"scp_009"},
+ "tea":{elem2:"scp_009"},
+ "coffee":{elem2:"scp_009"},
+ "neutral_acid":{elem2:"scp_009"},
+ "infection":{elem2:"scp_009"},
+ "meat":{elem2:"scp_009_meat", chance:0.015},
+ "skin":{elem2:"scp_009_meat", chance:0.0075},
+ "body":{elem2:"scp_009_meat", chance:0.004},
+ "head":{elem2:"scp_009_meat", chance:0.005},
+ "frozen_meat":{elem2:"scp_009_meat", chance:0.015},
+ "fish":{elem2:"scp_009_meat", chance:0.015},
+ "bird":{elem2:"scp_009_meat", chance:0.015},
+ "frog":{elem2:"scp_009_meat", chance:0.015},
+ "tadpole":{elem2:"scp_009_meat", chance:0.015},
+ },
+ category:"scp",
+ temp: -70,
+ tempLow: -100,
+ stateLow: "red_cloud",
+ breakInto: "water",
+ tempHigh: 0,
+ stateHigh: "red_snow_cloud",
+ state: "gas",
+ density: 0.5,
+ ignoreAir: true,
+ conduct: 0.03,
+ hidden: true,
+}
+
+elements.red_snow_cloud = {
+ color: "#CC8482",
+ behavior: [
+ "XX|XX|XX",
+ "XX|CH:red_snow%0.05|M1%2.5 AND BO",
+ "XX|XX|XX",
+ ],
+ category:"scp",
+ temp: 10,
+ tempLow: -30,
+ stateLow: "red_rain",
+ state: "gas",
+ density: 0.55,
+ ignoreAir: true,
+ conduct: 0.01,
+ reactions: {
+ "rain_cloud": { elem2: "red_rain", chance:0.4 },
+ "cloud": { elem2: "red_cloud", chance:0.4, chance:0.4 },
+ "snow_cloud": { elem2: "red_snow_cloud", chance:0.4 },
+ "frozen_plant":{elem2:"scp_009_plant", chance:0.025},
+ "dead_plant":{elem2:"red_plant", chance:0.025},
+ "water":{elem2:"scp_009"},
+ "blood":{elem2:"scp_009"},
+ "blood_ice":{elem2:"scp_009", chance:0.25},
+ "antibody":{elem2:"scp_009"},
+ "salt_water":{elem2:"scp_009"},
+ "sugar_water":{elem2:"scp_009"},
+ "dirty_water":{elem2:"scp_009"},
+ "pool_water":{elem2:"scp_009"},
+ "slush":{elem2:"scp_009"},
+ "seltzer":{elem2:"scp_009"},
+ "juice":{elem2:"scp_009"},
+ "soda":{elem2:"scp_009"},
+ "milk":{elem2:"scp_009"},
+ "slime":{elem2:"scp_009"},
+ "tea":{elem2:"scp_009"},
+ "coffee":{elem2:"scp_009"},
+ "neutral_acid":{elem2:"scp_009"},
+ "infection":{elem2:"scp_009"},
+ "meat":{elem2:"scp_009_meat", chance:0.015},
+ "skin":{elem2:"scp_009_meat", chance:0.0075},
+ "body":{elem2:"scp_009_meat", chance:0.004},
+ "head":{elem2:"scp_009_meat", chance:0.005},
+ "frozen_meat":{elem2:"scp_009_meat", chance:0.015},
+ "fish":{elem2:"scp_009_meat", chance:0.015},
+ "bird":{elem2:"scp_009_meat", chance:0.015},
+ "frog":{elem2:"scp_009_meat", chance:0.015},
+ "tadpole":{elem2:"scp_009_meat", chance:0.015},
+ },
+ hidden: true,
+}
+
+elements.scp_012 = {
+ name: "SCP-012",
+ color: ["#b0996f","#a89163","#b0996f","#a89163","#9e804f","#7d5e2e","#81633b"],
+ buttonColor: ["#b0996f","#a89163","#874B2B","#b0996f","#a89163","#ad6236","#9e804f","#7a1d05","#7d5e2e","#81633b"],
+ behavior: [
+ "XX|XX|XX",
+ "XX|FX%0.25|XX",
+ "M2%25|M1%25|M1%25",
+ ],
+ tick: function(pixel) {
+ if (Math.random() < 0.95) {
+ 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;
+ if (!isEmpty(x2,y2,true)) {
+ let seenPixel = pixelMap[x2][y2];
+ if (elements[seenPixel.element].id == elements.body.id) {
+ seenPixel.element = "body_012_1"
+ break;
+ }
+ else if (elements[seenPixel.element].id == elements.head.id) {
+ seenPixel.element = "head_012_1"
+ pixelMap[seenPixel.x][seenPixel.y+1].element = "body_012_1"
+ break;
+ }
+ }
+ }
+ }
+ if (pixel.lines < 1 && isEmpty(pixel.x,pixel.y-1)) {
+ releaseElement(pixel, "scp_012", 1, true)
+ changePixel(pixel,"complete_012")
+ }
+ if (Math.random() < 0.5) {
+ shuffleArray(squareCoordsShuffle);
+ for (var i = 0; i < squareCoordsShuffle.length; i++) {
+ var x = pixel.x+squareCoordsShuffle[i][0];
+ var y = pixel.y+squareCoordsShuffle[i][1];
+ if (!isEmpty(x,y,true) && (elements[pixelMap[x][y].element].id == elements.blood.id || elements[pixelMap[x][y].element].id == elements.infection.id || elements[pixelMap[x][y].element].id == elements.infected_blood.id)) {
+ deletePixel(x,y);
+ pixel.lines -= 1
+ break;
+ }
+ }
+ }
+ },
+ properties: {
+ lines: 585,
+ },
+ category: "scp",
+ tempHigh: 278,
+ stateHigh: ["ash","ash","ash","smoke","smoke","fire"],
+ burn:15,
+ burnTime:150,
+ burnInto: ["ash","ash","ash","smoke","smoke","smoke"],
+ state: "solid",
+ density: 1201
+}
+
+elements.complete_012 = {
+ color: ["#b0996f","#874B2B","#874B2B","#a89163","#ad6236","#ad6236","#9e804f","#7a1d05","#7a1d05","#81633b"],
+ buttonColor: ["#b0996f","#a89163","#874B2B","#b0996f","#a89163","#ad6236","#9e804f","#7a1d05","#7d5e2e","#81633b"],
+ name: "SCP-012",
+ behavior: [
+ "XX|XX|XX",
+ "XX|FX%0.25|XX",
+ "M2%25|M1%25|M1%25",
+ ],
+ tick: function(pixel) {
+ if (Math.random() < 0.95) {
+ 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;
+ if (!isEmpty(x2,y2,true)) {
+ let seenPixel = pixelMap[x2][y2];
+ if (elements[seenPixel.element].id == elements.body.id) {
+ seenPixel.element = "body_012_1"
+ break;
+ }
+ else if (elements[seenPixel.element].id == elements.head.id) {
+ seenPixel.element = "head_012_1"
+ pixelMap[seenPixel.x][seenPixel.y+1].element = "body_012_1"
+ break;
+ }
+ }
+ }
+ }
+ },
+ properties: {
+ lines: 585
+ },
+ category: "scp",
+ tempHigh: 278,
+ stateHigh: ["ash","ash","ash","smoke","smoke","fire"],
+ burn:15,
+ burnTime:150,
+ burnInto: ["ash","ash","ash","smoke","smoke","smoke"],
+ state: "solid",
+ density: 1201,
+ hidden: true
+}
+
+elements.body_012_1 = {
+ color: ["#069469","#047e99","#7f5fb0"],
+ name: "body",
+ 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",
+ 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 },
+ "gold_coin": { elem2:null, chance:0.05 },
+ "diamond": { 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 === "head_012_1") {
+ 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) {
+ changePixel(pixel,"rotten_meat");
+ }
+ return
+ }
+
+ // Find the head
+ if (!isEmpty(pixel.x, pixel.y-1, true) && pixelMap[pixel.x][pixel.y-1].element == "head_012_1") {
+ var head = pixelMap[pixel.x][pixel.y-1];
+ if (head.dead) { // If head is dead, kill body
+ pixel.dead = head.dead;
+ }
+ else if (head.panic > 0) {
+ pixel.panic = head.panic;
+ delete head.panic;
+ }
+ }
+ else if (!isEmpty(pixel.x, pixel.y-1, true) && pixelMap[pixel.x][pixel.y-1].element == "head") {
+ var head = pixelMap[pixel.x][pixel.y-1];
+ head.element = "head_012_1"
+ }
+ else { var head = null }
+ if (head && Math.random() < 0.9) {
+ let y = Math.random() < 0.5 ? 0 : -1;
+ let xDir = Math.random() < 0.5 ? 1 : -1;
+ for (let x = 1; x < 50; 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].id == elements.scp_012.id) {
+ if (pixel.x-1 > seenPixel.x && pixel.dir != -1) {
+ pixel.dir = -1
+ }
+ else if (pixel.x+1 < seenPixel.x && pixel.dir != 1) {
+ pixel.dir = 1
+ }
+ else if ((pixel.x-1 == seenPixel.x || pixel.x+1 == seenPixel.x) && pixel.dir != 0) {
+ pixel.dir = 0
+ if (pixel.x > seenPixel.x && pixel.face != -1) {
+ pixel.face = -1
+ }
+ else if (pixel.x < seenPixel.x && pixel.face != 1) {
+ pixel.face = 1
+ }
+ }
+ break;
+ }
+ }
+ }
+ }
+ if (pixel.burning) {
+ pixel.panic += 0.1;
+ if (head && pixelTicks-pixel.burnStart > 240) {
+ pixel.color = head.color;
+ }
+ }
+ else if (pixel.panic > 0) {
+ pixel.panic -= 0.1;
+ if (pixel.panic < 0) { pixel.panic = 0; }
+ else if (pixel.panic > 50) { pixel.panic = 50; }
+ }
+
+ if (isEmpty(pixel.x, pixel.y-1)) {
+ // create blood if decapitated 10% chance
+ if (Math.random() < 0.1 && !pixel.charge) {
+ createPixel("blood", pixel.x, pixel.y-1);
+ // set dead to true 15% chance
+ 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;
+ }
+ }
+ }
+ // 5% chance to change direction
+ if (Math.random() < 0.05 || !moved) {
+ pixel.dir *= -1;
+ }
+ // homeostasis
+ if (pixel.temp > 37) { pixel.temp -= 1; }
+ else if (pixel.temp < 37) { pixel.temp += 1; }
+ }
+
+ if (pixel.dir == 0 && pixel.face) {
+ if (isEmpty(pixel.x+pixel.face, pixel.y-1) && !isEmpty(pixel.x+pixel.face, pixel.y)) {
+ // create blood 15% chance
+ if (Math.random() < 0.15) {
+ createPixel("blood", pixel.x+pixel.face, pixel.y-1);
+ // set dead to true 2.5% chance
+ if (Math.random() < 0.025) {
+ pixel.dead = pixelTicks;
+ }
+ }
+ }
+ else if (!isEmpty(pixel.x+pixel.face, pixel.y) && isEmpty(pixel.x+(-pixel.face), pixel.y-1)) {
+ if (tryMove(pixel, pixel.x+(-pixel.face), pixel.y)) {
+ movePixel(head, head.x+(-pixel.face), head.y);
+ }
+ else if (isEmpty(pixel.x+(-pixel.face), pixel.y-2)) {
+ if (tryMove(pixel, pixel.x+(-pixel.face), pixel.y-1)) {
+ movePixel(head, head.x+(-pixel.face), head.y-2);
+ }
+ }
+ }
+ }
+ }
+}
+
+elements.head_012_1 = {
+ color: ["#f3e7db","#f7ead0","#eadaba","#d7bd96","#a07e56","#825c43","#604134","#3a312a"],
+ name: "head",
+ 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",
+ 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) {
+ changePixel(pixel,"rotten_meat");
+ return
+ }
+ }
+
+ // Find the body
+ if (!isEmpty(pixel.x, pixel.y+1, true) && pixelMap[pixel.x][pixel.y+1].element == "body_012_1") {
+ var body = pixelMap[pixel.x][pixel.y+1];
+ if (body.dead) { // If body is dead, kill head
+ pixel.dead = body.dead;
+ }
+ }
+ else { var body = null }
+
+ // check for eating food
+ if (body && !pixel.dead && Math.random() < 0.0025) {
+ 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 (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.1 && !pixel.charge) {
+ createPixel("blood", pixel.x, pixel.y+1);
+ // set dead to true 15% chance
+ if (Math.random() < 0.15) {
+ pixel.dead = pixelTicks;
+ }
+ }
+ }
+ // homeostasis
+ if (pixel.temp > 37) { pixel.temp -= 1; }
+ else if (pixel.temp < 37) { pixel.temp += 1; }
+ },
+ onChange: function(pixel) {
+ 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) && pixelMap[x][y].panic !== undefined) {
+ pixelMap[x][y].panic += 20;
+ }
+ }
+ },
+ onDelete: function(pixel) {
+ 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) && pixelMap[x][y].panic !== undefined) {
+ pixelMap[x][y].panic += 20;
+ }
+ }
+ }
+}
+
+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.6,
category: "scp",
behavior: [
- "CR:black_acid%0.1|CR:black_acid%0.5|CR:black_acid%0.1",
- "CR:black_acid%0.5|XX|CR:black_acid%0.5",
- "CR:black_acid%0.1|CR:black_acid%0.5 AND M1|CR:black_acid%0.1",
+ "CR:black_acid%0.05|CR:black_acid%0.25|CR:black_acid%0.05",
+ "CR:black_acid%0.25|XX|CR:black_acid%0.25",
+ "CR:black_acid%0.05|CR:black_acid%0.5 AND M1|CR:black_acid%0.05",
],
- breakInto: ["porcelain_shard","porcelain_shard","black_acid","black_acid"],
+ properties: {
+ },
+ breakInto: ["scp_035","porcelain_shard","porcelain_shard","black_acid","black_acid"],
density: 800,
state: "solid",
tempHigh: 3500,
stateHigh: "porcelain_shard",
- reactions: {
- "head": { elem1:null, elem2: "mask_head" , chance:0.2 },
- "body": { elem1:null, elem2: "mask_body" , chance:0.1 },
- "z_head": { elem1:null, elem2: "mask_head" , chance:0.1 },
- "z_body": { elem1:null, elem2: "mask_body" , chance:0.05 },
- },
-},
-
-elements.mask_body = {
- color: ["#242424","#069469","#047e99","#7f5fb0"],
- category: "scp",
- hidden: true,
- density: 1500,
- state: "solid",
- conduct: .05,
- temp: 37,
- tempHigh: 250,
- stateHigh: "cooked_meat",
- tempLow: -30,
- stateLow: "frozen_meat",
- burn: 10,
- burnTime: 250,
- burnInto: "cooked_meat",
- breakInto: ["black_acid","rotten_meat","bone"],
- reactions: {
- "cancer": { elem1:"cancer", chance:0.005 },
- "egg": { elem2:"yolk", chance:0.5, oneway:true },
- },
- 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 == "mask_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]);
- }
- }
+ for (var i = 0; i < squareCoords.length; i++) {
+ var coords = squareCoords[i];
+ var x = pixel.x + coords[0];
+ var y = pixel.y + coords[1];
+ if (!isEmpty(x,y) && !outOfBounds(x,y) && Math.random() > 0.8) {
+ var pixel2 = pixelMap[x][y]
+ let old = pixel2.element;
+ if (pixel2.element == "head_008" || pixel2.element == "head" || pixel2.element == "head_1000") {
+ changePixel(pixel2,"head_035")
+ deletePixel(pixel.x,pixel.y)
+ }
+ else if (pixel2.element == "body_008" || pixel2.element == "body" || pixel2.element == "body_1000") {
+ pixel2.element = "body_035"
+ deletePixel(pixel.x,pixel.y)
+ }
}
}
- 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) {
- changePixel(pixel,"rotten_meat");
- }
- return
- }
-
- // Find the head
- if (!isEmpty(pixel.x, pixel.y-1, true) && pixelMap[pixel.x][pixel.y-1].element == "mask_head") {
- var head = pixelMap[pixel.x][pixel.y-1];
- if (head.dead) { // If head is dead, kill body
- pixel.dead = head.dead;
- }
- }
- else if (!isEmpty(pixel.x, pixel.y-1, true) && pixelMap[pixel.x][pixel.y-1].element == "head") { // If head is not mask head, make it one
- var head = pixelMap[pixel.x][pixel.y-1];
- changePixel(head,"mask_head");
- if (head.dead) { // If head is dead, kill body
- pixel.dead = head.dead;
- }
- }
- else if (!isEmpty(pixel.x, pixel.y-1, true) && pixelMap[pixel.x][pixel.y-1].element == "z_head") { // If head is not mask head, make it one
- var head = pixelMap[pixel.x][pixel.y-1];
- changePixel(head,"mask_head");
- if (head.dead) { // If head is dead, kill body
- pixel.dead = head.dead;
- }
- }
- else { var head = null }
- if (pixel.burning) {
- pixel.panic += 0.1;
- if (head && pixelTicks-pixel.burnStart > 240) {
- pixel.color = head.color;
- }
- }
- else if (pixel.panic > 0) {
- pixel.panic -= 0.1;
- }
-
- if (isEmpty(pixel.x, pixel.y-1)) {
- // create black acid if decapitated 10% chance
- if (Math.random() < 0.1 && !pixel.charge) {
- createPixel("black_acid", pixel.x, pixel.y-1);
- // set dead to true 15% chance
- 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],
- ];
- // 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]);
- break;
- }
- }
- }
- // 15% chance to change direction
- if (Math.random() < 0.15) {
- pixel.dir *= -1;
- }
- }
-
- }
+ },
+ reactions: {
+ "head": { elem1:null, elem2: "head_035" , chance:0.2 },
+ "head_008": { elem1:null, elem2: "head_035" , chance:0.1 },
+ },
},
-elements.mask_head = {
- color: ["#f7ead0","#faf9f6","#e9e6db"],
- category: "scp",
- hidden: true,
- density: 2280,
- state: "solid",
- conduct: .05,
- temp: 37,
- tempHigh: 250,
- stateHigh: "possessive_mask",
- tempLow: -30,
- stateLow: "possessive_mask",
- burn: 10,
- burnTime: 250,
- burnInto: "possessive_mask",
- breakInto: "possessive_mask",
- reactions: {
- "cancer": { elem1: "possessive_mask", chance:0.05 },
- "tea": { elem2:null, chance:0.2 },
- "alcohol": { elem2:null, chance:0.2 },
- },
- properties: {
- dead: false
- },
+elements.body_035 = {
+ color: ["#069469","#047e99","#7f5fb0"],
+ name: "SCP-035-1",
+ category: "life",
+ 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",
+ 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 },
+ "gold_coin": { elem2:null, chance:0.05 },
+ "diamond": { 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 === "head_035") {
+ 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) {
+ changePixel(pixel,"rotten_meat");
+ }
+ return
+ }
+
+ // Find the head
+ if (!isEmpty(pixel.x, pixel.y-1, true) && pixelMap[pixel.x][pixel.y-1].element == "head_035") {
+ var head = pixelMap[pixel.x][pixel.y-1];
+ if (head.dead) { // If head is dead, kill body
+ pixel.dead = head.dead;
+ }
+ else if (head.panic > 0) {
+ pixel.panic = head.panic;
+ delete head.panic;
+ }
+ }
+ else if (!isEmpty(pixel.x, pixel.y-1, true) && pixelMap[pixel.x][pixel.y-1].element == "head") {
+ var head = pixelMap[pixel.x][pixel.y-1];
+ changePixel(head,"head_035")
+ }
+ else if (!isEmpty(pixel.x, pixel.y-1, true) && pixelMap[pixel.x][pixel.y-1].element == "head_1000") {
+ var head = pixelMap[pixel.x][pixel.y-1];
+ changePixel(head,"head_035")
+ }
+ else if (!isEmpty(pixel.x, pixel.y-1, true) && pixelMap[pixel.x][pixel.y-1].element == "head_008") {
+ var head = pixelMap[pixel.x][pixel.y-1];
+ changePixel(head,"head_035")
+ }
+ else { var head = null }
+
+ if (pixel.burning) {
+ pixel.panic += 0.05;
+ if (head && pixelTicks-pixel.burnStart > 240) {
+ pixel.color = "#232323";
+ }
+ }
+ if (pixel.charge) {
+ pixel.panic += 0.5;
+ }
+ else if (pixel.panic > 0) {
+ pixel.panic -= 0.2;
+ if (pixel.panic < 0) { pixel.panic = 0; }
+ else if (pixel.panic > 50) { pixel.panic = 50; }
+ }
+
+ if (isEmpty(pixel.x, pixel.y-1)) {
+ // create blood if decapitated 10% chance
+ if (Math.random() < 0.1 && !pixel.charge) {
+ createPixel("black_acid", pixel.x, pixel.y-1);
+ // set dead to true 15% chance
+ 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 (hitPixel.element === "body" || hitPixel.element === "head") {
+ // interact with human
+ hitPixel.panic += 0.5
+ }
+ }
+ }
+ // 15% chance to change direction
+ if (Math.random() < 0.15 || !moved) {
+ pixel.dir *= -1;
+ }
+ // homeostasis
+ if (pixel.temp > 37) { pixel.temp -= 1; }
+ else if (pixel.temp < 37) { pixel.temp += 1; }
+ }
+
+ }
+}
+
+elements.head_035 = {
+ name: "SCP-035-1",
+ color: ["#f7ead0","#faf9f6","#e9e6db"],
+ category: "life",
behavior: [
- "CR:black_acid%0.1|CR:black_acid%0.5|CR:black_acid%0.1",
- "CR:black_acid%0.5|XX|CR:black_acid%0.5",
- "CR:black_acid%0.1|CR:black_acid%0.5 AND M1|CR:black_acid%0.1",
+ "CR:black_acid%0.01|CR:black_acid%0.05|CR:black_acid%0.01",
+ "CR:black_acid%0.05|XX|CR:black_acid%0.05",
+ "CR:black_acid%0.01|CR:black_acid%0.05|CR:black_acid%0.01",
],
- tick: function(pixel) {
- doHeat(pixel);
- doBurning(pixel);
- doElectricity(pixel);
- if (pixel.dead) {
- // Turn into the mask if pixelTicks-dead > 500
- if (pixelTicks-pixel.dead > 200 && Math.random() < 0.1) {
- changePixel(pixel,"possessive_mask");
- return
- }
- }
+ 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",
+ 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) {
+ changePixel(pixel,"rotten_meat");
+ return
+ }
+ }
- // Find the body
- if (!isEmpty(pixel.x, pixel.y+1, true) && pixelMap[pixel.x][pixel.y+1].element == "mask_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") { // If body is not mask body, make it one
- var body = pixelMap[pixel.x][pixel.y+1];
- changePixel(body,"mask_body");
- 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 == "z_body") { // If body is not mask body, make it one
- var body = pixelMap[pixel.x][pixel.y+1];
- changePixel(body,"mask_body");
- if (body.dead) { // If body is dead, kill head
- pixel.dead = body.dead;
- }
- }
- else { var body = null }
+ // Find the body
+ if (!isEmpty(pixel.x, pixel.y+1, true) && pixelMap[pixel.x][pixel.y+1].element == "body_035") {
+ 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") {
+ var body = pixelMap[pixel.x][pixel.y+1];
+ body.element = "body_035"
+ }
+ else if (!isEmpty(pixel.x, pixel.y+1, true) && pixelMap[pixel.x][pixel.y+1].element == "body_1000") {
+ var body = pixelMap[pixel.x][pixel.y+1];
+ body.element = "body_035"
+ }
+ else if (!isEmpty(pixel.x, pixel.y+1, true) && pixelMap[pixel.x][pixel.y+1].element == "body_008") {
+ var body = pixelMap[pixel.x][pixel.y+1];
+ body.element = "body_035"
+ }
+ else { var body = null }
- 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.1 && !pixel.charge) {
- createPixel("black_acid", pixel.x, pixel.y+1);
- // set dead to true 15% chance
- if (Math.random() < 0.15) {
- pixel.dead = pixelTicks;
- }
- }
- }
- // homeostasis
- if (pixel.temp > 37) { pixel.temp -= 1; }
- else if (pixel.temp < 37) { pixel.temp += 1; }
- }
-},
+ if (tryMove(pixel, pixel.x, pixel.y+1)) {
+ // create blood if severed 5% chance
+ if (isEmpty(pixel.x, pixel.y+1) && !pixel.dead && Math.random() < 0.05 && !pixel.charge) {
+ createPixel("black_acid", pixel.x, pixel.y+1);
+ // set dead to true 50% chance
+ if (Math.random() < 0.5) {
+ pixel.dead = pixelTicks;
+ }
+ }
+ }
+ // homeostasis
+ if (pixel.temp > 37) { pixel.temp -= 1; }
+ else if (pixel.temp < 37) { pixel.temp += 1; }
+ },
+ onChange: function(pixel) {
+ releaseElement(pixel,"scp_035",1,true)
+ },
+ onDelete: function(pixel) {
+ releaseElement(pixel,"scp_035",1,true)
+ },
+}
elements.black_acid = {
+ name: "SCP-035_acid",
hidden: true,
color: ["#00000f","#111111","#242424"],
behavior: [
- "XX|DB%5|XX",
- "DB%6 AND M2%10|XX|DB%6 AND M2%10",
- "DB%6 AND M2%10|DB%11 AND M1|DB%6 AND M2%10",
+ "XX|DB%2.5|XX",
+ "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","z_body","z_head","possessive_mask","mask_body","mask_head","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"*/"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"],
reactions: {
"caustic_potash": { elem1:null, elem2:"potassium_salt" },
"water": { elem1:null, elem2:"dirty_water" },
@@ -476,15 +2086,15 @@ elements.black_acid = {
"calcium": { elem1:null, elem2:"hydrogen", chance:0.01 },
"zinc": { elem1:null, elem2:null, chance:0.03 },
"sugar": { elem1:null, elem2:"carbon_dioxide" },
- "glass": { elem1:null, elem2: null , chance:0.01 },
- "rad_glass": { elem1:null, elem2: null , chance:0.01 },
- "stained_glass": { elem1:null, elem2: null , chance:0.01 },
- "glass_shard": { elem1:null, elem2: null , chance:0.015 },
- "rad_shard": { elem1:null, elem2: null , chance:0.015 },
- "porcelain_shard": { elem1:null, elem2: null , chance:0.015 },
+ "glass": { elem1:null, elem2: null , chance:0.005 },
+ "rad_glass": { elem1:null, elem2: null , chance:0.0075 },
+ "stained_glass": { elem1:null, elem2: null , chance:0.005 },
+ "glass_shard": { elem1:null, elem2: null , chance:0.01 },
+ "rad_shard": { elem1:null, elem2: null , chance:0.01 },
+ "porcelain_shard": { elem1:null, elem2: null , chance:0.005 },
"copper": { elem1:null, elem2: null , chance:0.02 },
"gold": { elem1:null, elem2: null , chance:0.02 },
- "porcelain": { elem1:null, elem2: null , chance:0.01 },
+ "porcelain": { elem1:null, elem2: null , chance:0.0005 },
"plastic": { elem1:null, elem2: null , chance:0.01 },
"molten_plastic": { elem1:null, elem2: null , chance:0.02 },
"gold_coin": { elem1:null, elem2: "gold" , chance:0.1 },
@@ -498,13 +2108,13 @@ elements.black_acid = {
"dirt": { elem1:null, elem2: null , chance:0.05 },
"sand": { elem1:null, elem2: null , chance:0.015 },
"color_sand": { elem1:null, elem2: null , chance:0.015 },
- "mask_head": { elem1:null, elem2: "possessive_mask" , chance:0.001},
- "mask_body": { elem1:null, elem2: null , chance:0.001 },
+ "head_035": { elem1:null, elem2: "scp_035" , chance:0.001},
+ "body_035": { elem1:null, elem2: null , chance:0.001 },
"head": { elem1:null, elem2: null , chance:0.01 },
"body": { elem1:null, elem2: null , chance:0.01 },
- "z_head": { elem1:null, elem2: null , chance:0.02 },
- "z_body": { elem1:null, elem2: null , chance:0.02 },
- /*"SCP_804": { elem1:null, elem2: null , chance:0.02 },*/
+ "head_008": { elem1:null, elem2: null , chance:0.02 },
+ "body_008": { elem1:null, elem2: null , chance:0.02 },
+ /*"scp_804": { elem1:null, elem2: null , chance:0.02 },*/
},
category: "scp",
tempHigh: 1000,
@@ -517,424 +2127,660 @@ elements.black_acid = {
state: "liquid",
density: 1105,
stain: 0.5,
-},
+}
-elements.SCP_055 = {
- color: "#00000f",
+elements.scp_049 = {
+ name: "SCP-049",
+ color: ["#f7ead0","#faf9f6","#e9e6db"],
+ buttonColor: ["#f7ead0","#faf9f6","#e9e6db","#11111f","#242424","#11111f","#242424"],
+ category: "scp",
+ properties: {
+ dead: false,
+ dir: 1,
+ panic: 0
+ },
+ onPlace: function(pixel) {
+ if (isEmpty(pixel.x, pixel.y+1)) {
+ createPixel("body_049", pixel.x, pixel.y+1);
+ var color = pixel.color;
+ changePixel(pixel,"head_049");
+ pixel.color = color;
+ }
+ else if (isEmpty(pixel.x, pixel.y-1)) {
+ createPixel("head_049", pixel.x, pixel.y-1);
+ pixelMap[pixel.x][pixel.y-1].color = pixel.color;
+ changePixel(pixel,"body_049");
+ }
+ else {
+ deletePixel(pixel.x, pixel.y);
+ }
+ },
+ reactions: {
+ "fire": { attr1:{panic:2} },
+ "plasma": { attr1:{panic:2} },
+ "plague": { attr1:{panic:3} },
+ "cancer": { attr1:{panic:4} },
+ "virus": { attr1:{panic:8} },
+ "scp_682": { attr1:{panic:4} },
+ "scp_008": { attr1:{panic:8} },
+ "scp_096": { attr1:{panic:4} },
+ },
+ related: ["body_049","head_049"],
+ cooldown: defaultCooldown,
+ forceSaveColor: true,
+}
+
+elements.body_049 = {
+ name: "SCP-049",
+ color: ["#11111f","#242424"],
+ category: "scp",
+ breakInto: ["rotten_meat","rotten_meat","bone","blood"],
+ hidden: true,
+ density: 1500,
+ state: "solid",
+ tempHigh: 250,
+ stateHigh: ["rotten_meat","bone"],
+ tempLow: -75,
+ stateLow: ["rotten_meat","bone"],
+ forceSaveColor: true,
+ pickElement: "scp_049",
+ reactions: {
+ "cancer": { elem2:null, chance:0.05 },
+ "plague": { elem2:null, chance:0.5 },
+ "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" },
+ },
+ 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 === "head_049") {
+ 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) {
+ changePixel(pixel,"rotten_meat");
+ }
+ return
+ }
+
+ // Find the head
+ if (!isEmpty(pixel.x, pixel.y-1, true) && pixelMap[pixel.x][pixel.y-1].element == "head_049") {
+ var head = pixelMap[pixel.x][pixel.y-1];
+ if (head.dead) { // If head is dead, kill body
+ pixel.dead = head.dead;
+ }
+ else if (head.panic > 0) {
+ pixel.panic = head.panic;
+ delete head.panic;
+ }
+ }
+ else { var head = null }
+ if (head && Math.random() < 0.25) {
+ let y = Math.random() < 0.5 ? 0 : -1;
+ for (let x = 1; x < 10; x++) {
+ let x2 = pixel.x+(x*pixel.dir);
+ let y2 = pixel.y+y;
+ if (!isEmpty(x2,y2,true)) {
+ let seenPixel = pixelMap[x2][y2];
+ if (elements.scp_049.reactions[seenPixel.element] && elements.scp_049.reactions[seenPixel.element].attr1 && elements.scp_049.reactions[seenPixel.element].attr1.panic) {
+ pixel.panic += elements.scp_049.reactions[seenPixel.element].attr1.panic;
+ pixel.dir *= -1;
+ break;
+ }
+ else if (seenPixel.dead || seenPixel.temp > 200) {
+ pixel.panic += 5;
+ pixel.dir *= -1;
+ if (seenPixel.panic) delete seenPixel.panic;
+ break;
+ }
+ }
+ }
+ }
+ if (pixel.burning) {
+ pixel.panic += 0.1;
+ if (head && pixelTicks-pixel.burnStart > 240) {
+ pixel.color = head.color;
+ }
+ }
+ else if (pixel.panic > 0) {
+ pixel.panic -= 1;
+ if (pixel.panic < 0) { pixel.panic = 0; }
+ else if (pixel.panic > 50) { pixel.panic = 50; }
+ }
+
+ if (isEmpty(pixel.x, pixel.y-1)) {
+ // bleed if decapitated 10% chance
+ if (Math.random() < 0.1 && !pixel.charge) {
+ createPixel("foam", pixel.x, pixel.y-1);
+ pixelMap[pixel.x][pixel.y-1].color = "#666666"
+ // set dead to true 15% chance
+ 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 (hitPixel.element === "body" || hitPixel.element === "head" && hitPixel.panic < pixel.panic) {
+ // interact with humans
+ hitPixel.panic = pixel.panic;
+ }
+ }
+ }
+ // 15% chance to change direction
+ if (Math.random() < 0.15 || !moved) {
+ pixel.dir *= -1;
+ }
+ // homeostasis
+ if (pixel.temp > 37) { pixel.temp -= 1; }
+ else if (pixel.temp < 37) { pixel.temp += 1; }
+ }
+
+ if (Math.random() < 0.95) {
+ let y = Math.random() < 0.5 ? 0 : -1;
+ let xDir = Math.random() < 0.5 ? 1 : -1;
+ for (let x = 1; x < 150; x++) {
+ let x2 = pixel.x+(x*xDir);
+ let y2 = pixel.y+y;
+ if (!isEmpty(x2,y2,true) && !outOfBounds(x2,y2)) {
+ let seenPixel = pixelMap[x2][y2];
+ if ((elements[seenPixel.element].id == elements.head.id || elements[seenPixel.element].id == elements.head_008.id) && seenPixel.pestilence == undefined) {
+ if (Math.random() > 0.07) {
+ seenPixel.pestilence = false
+ }
+ else {
+ seenPixel.pestilence = true
+ }
+ }
+ 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;
+ }
+ }
+ }
+ }
+ for (var i = 0; i < squareCoords.length; i++) {
+ var coords = squareCoords[i];
+ var x = pixel.x + coords[0];
+ var y = pixel.y + coords[1];
+ if (!isEmpty(x,y) && !outOfBounds(x,y)) {
+ var pixel2 = pixelMap[x][y]
+ if ((pixel2.dead == true || pixel2.pestilence == true) && (elements[pixel2.element].id == elements.head.id || elements[pixel2.element].id == elements.head_008.id)) {
+ changePixel(pixel2,"head_049_1")
+ }
+ else if ((pixel2.dead == true || pixel2.pestilence == true) && (elements[pixel2.element].id == elements.body.id || elements[pixel2.element].id == elements.body_008.id)) {
+ changePixel(pixel2,"body_049_1")
+ }
+ }
+ }
+
+ }
+}
+
+elements.head_049 = {
+ name: "SCP-049",
+ color: ["#f7ead0","#faf9f6","#e9e6db"],
+ category: "scp",
+ hidden: true,
+ density: 1080,
+ state: "solid",
+ tempHigh: 150,
+ stateHigh: "cooked_meat",
+ tempLow: -30,
+ stateLow: "frozen_meat",
+ burn: 10,
+ burnTime: 250,
+ burnInto: "cooked_meat",
+ breakInto: ["rotten_meat","bone","bone","blood"],
+ forceSaveColor: true,
+ pickElement: "scp_049",
+ reactions: {
+ "cancer": { elem2:null, chance:0.05 },
+ "plague": { elem2:null, chance:0.5 },
+ "sun": { elem1:"cooked_meat" },
+ "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 },
+ },
+ 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) {
+ changePixel(pixel,"rotten_meat");
+ return
+ }
+ }
+
+ // Find the body
+ if (!isEmpty(pixel.x, pixel.y+1, true) && pixelMap[pixel.x][pixel.y+1].element == "body_049") {
+ var body = pixelMap[pixel.x][pixel.y+1];
+ if (body.dead) { // If body is dead, kill head
+ pixel.dead = body.dead;
+ }
+ }
+ else { var body = null }
+
+ // check for drinking
+ 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].id == elements.alcohol.id) {
+ deletePixel(x,y);
+ break;
+ }
+ }
+ }
+
+ if (tryMove(pixel, pixel.x, pixel.y+1)) {
+ // bleed if severed 10% chance
+ if (isEmpty(pixel.x, pixel.y+1) && !pixel.dead && Math.random() < 0.1 && !pixel.charge) {
+ createPixel("foam", pixel.x, pixel.y+1);
+ pixelMap[pixel.x][pixel.y+1].color = "#666666"
+ // set dead to true 15% chance
+ if (Math.random() < 0.15) {
+ pixel.dead = pixelTicks;
+ }
+ }
+ }
+ // homeostasis
+ if (pixel.temp > 37) { pixel.temp -= 1; }
+ else if (pixel.temp < 37) { pixel.temp += 1; }
+ },
+ onChange: function(pixel) {
+ 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) && pixelMap[x][y].panic !== undefined) {
+ pixelMap[x][y].panic += 20;
+ }
+ }
+ },
+ onDelete: function(pixel) {
+ 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) && pixelMap[x][y].panic !== undefined) {
+ pixelMap[x][y].panic += 20;
+ }
+ }
+ }
+}
+
+elements.body_049_1 = {
+ color: ["#069469","#047e99","#7f5fb0"],
+ name: "SCP-049-1",
+ category: "life",
+ 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",
+ 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 === "head_049_1") {
+ 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) {
+ changePixel(pixel,"rotten_meat");
+ }
+ return
+ }
+
+ // Find the head
+ if (!isEmpty(pixel.x, pixel.y-1, true) && pixelMap[pixel.x][pixel.y-1].element == "head_049_1") {
+ var head = pixelMap[pixel.x][pixel.y-1];
+ 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" )) {
+ var head = pixelMap[pixel.x][pixel.y-1];
+ changePixel(head,"head_049_1")
+ }
+ else { var head = null }
+ if (head && Math.random() < 0.5) {
+ 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].id == elements.head.id) {
+ 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.panic > 0) {
+ pixel.panic = 0;
+ }
+
+ if (isEmpty(pixel.x, pixel.y-1)) {
+ // create blood if decapitated 10% chance
+ if (Math.random() < 0.1 && !pixel.charge) {
+ createPixel("blood", pixel.x, pixel.y-1);
+ // set dead to true 15% chance
+ 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;
+ }
+ }
+ }
+ // 15% chance to change direction
+ if (Math.random() < 0.2 || !moved) {
+ pixel.dir *= -1;
+ }
+ }
+
+ }
+}
+
+elements.head_049_1 = {
+ color: ["#75816B"],
+ name: "SCP-049-1",
+ category: "life",
+ 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",
+ 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) {
+ changePixel(pixel,"rotten_meat");
+ return
+ }
+ }
+
+ // Find the body
+ if (!isEmpty(pixel.x, pixel.y+1, true) && pixelMap[pixel.x][pixel.y+1].element == "body_049_1") {
+ 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")) {
+ var body = pixelMap[pixel.x][pixel.y+1];
+ body.element = "body_049_1"
+ }
+ 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) {
+ deletePixel(x,y);
+ break;
+ }
+ else if (!isEmpty(x,y,true) && elements[pixelMap[x][y].element].id == elements.head.id) {
+ pixelMap[x][y+1].element = "body_049_1"
+ changePixel(pixelMap[x][y],"head_049_1")
+ break;
+ }
+ else if (!isEmpty(x,y,true) && elements[pixelMap[x][y].element].id == elements.body.id) {
+ pixelMap[x][y].element = "body_049_1"
+ changePixel(pixelMap[x][y-1],"head_049_1")
+ 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.1 && !pixel.charge) {
+ createPixel("blood", pixel.x, pixel.y+1);
+ // set dead to true 15% chance
+ if (Math.random() < 0.15) {
+ pixel.dead = pixelTicks;
+ }
+ }
+ }
+ },
+}
+
+elements.scp_055 = {
+ color: "#000000",
+ name: "SCP-055",
+ grain: 0,
excludeRandom: true,
behavior: [
- "XX","XX","XX",
- "XX","CH:REDACTED","XX",
- "XX","XX","XX"
+ "XX|XX|XX",
+ "XX|CH:REDACTED|XX",
+ "XX|XX|XX"
],
category: "scp",
state: "solid",
tempHigh: 55055055055,
- stateHigh: ["metal_scrap","metal_scrap","smoke","smoke","smoke","smoke","smoke","smoke","smoke",null],
-},
+ stateHigh: ["random",null],
+ breakInto: ["random",null],
+ hardness: 0.99,
+}
elements.REDACTED = {
hidden: true,
- color: "#00000f",
+ color: "#000000",
+ grain: 0.1,
excludeRandom: true,
behavior: [
- "EX|CL|EX",
- "CL|EX:99999999999999999999999>REDACTED|CL",
- "EX|CL|EX",
+ "XX|CL|XX",
+ "CL|EX|CL",
+ "XX|CL|EX",
],
category: "scp",
state: "solid",
movable: false,
-},
+}
-elements.plague_doctor = {
+elements.scp_063 = {
+ color: ["#CAE8E9","#CCEAED","#A2CFD4","#A6D6D8","#8CCBD7"],
+ name: "SCP-063",
+ behavior: [
+ "XX|DL|XX",
+ "DL|XX|DL",
+ "M2%80 AND DL|M1 AND DL|M2%80 AND DL",
+ ],
+ ignore: ["scp_063","head_049","body_049","head_096","body_096","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"],
+ category: "scp",
+ tempHigh: 190,
+ stateHigh: ["molten_plastic","molten_plastic","fire","dioxin"],
+ burn: 10,
+ burnTime: 300,
+ burnInto: "dioxin",
+ state: "solid",
+ density: 1052,
+ darkText: true
+}
+
+elements.scp_096 = {
+ name: "SCP-096",
category: "scp",
- color: ["#f7ead0","#faf9f6","#e9e6db"],
+ color: ["#ddd2d6","#C9BCC2","#b6adb2"],
+ buttonColor: ["#dcd3da","#ddd2d6","#dcd3da","#ddd2d6","#0b0706","#C9BCC2","#b6adb2","#ddd2d6","#C9BCC2","#b6adb2","#C9BCC2","#b6adb2","#ddd2d6","#C9BCC2","#b6adb2","#633134","#633134"],
category: "scp",
properties: {
dead: false,
dir: 1,
- panic: 0
+ panic: 0,
},
- tick: function(pixel) {
- if (isEmpty(pixel.x, pixel.y+1)) {
- createPixel("doc_body", pixel.x, pixel.y+1);
- pixel.element = "doc_head";
- }
- else if (isEmpty(pixel.x, pixel.y-1)) {
- createPixel("doc_head", pixel.x, pixel.y-1);
- pixelMap[pixel.x][pixel.y-1].color = pixel.color;
- pixel.element = "doc_body";
- pixel.color = pixelColorPick(pixel)
- }
- else {
- deletePixel(pixel.x, pixel.y);
- }
- },
- related: ["doc_body","doc_head"],
- cooldown: defaultCooldown
-},
-
-elements.doc_head = {
- hidden: true,
- color: ["#f7ead0","#faf9f6","#e9e6db"],
- category: "scp",
- breakInto: ["rotten_meat","bone","bone","blood"],
- 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) {
- changePixel(pixel,"rotten_meat");
- return
- }
- }
-
- // Find the body
- if (!isEmpty(pixel.x, pixel.y+1, true) && pixelMap[pixel.x][pixel.y+1].element == "doc_body") {
- var body = pixelMap[pixel.x][pixel.y+1];
- if (body.dead) { // If body is dead, kill head
- pixel.dead = body.dead;
- }
- }
- else { var body = null }
-
- 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.1 && !pixel.charge) {
- createPixel("blood", pixel.x, pixel.y+1);
- // set dead to true 15% chance
- if (Math.random() < 0.15) {
- pixel.dead = pixelTicks;
- }
- }
- }
- // homeostasis
- if (pixel.temp > 37) { pixel.temp -= 1; }
- else if (pixel.temp < 37) { pixel.temp += 1; }
- },
- density: 1100,
- state: "solid",
- conduct: .05,
- tempHigh: 350,
- stateHigh: "rotten_meat",
- burn: .01,
- burnTime: 300,
- burnInto: "rotten_meat",
- reactions: {
- "alcohol": { elem2 : null , chance:0.5 },
- },
-},
-
-elements.doc_body = {
- hidden: true,
- color: ["#11111f","#242424"],
- category: "scp",
- breakInto: ["rotten_meat","rotten_meat","bone","blood"],
- 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 == "doc_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 bone if pixelTicks-dead > 500
- if (pixelTicks-pixel.dead > 200 && Math.random() < 0.1) {
- changePixel(pixel,"bone");
- }
- return
- }
-
- // Find the head
- if (!isEmpty(pixel.x, pixel.y-1, true) && pixelMap[pixel.x][pixel.y-1].element == "doc_head") {
- var head = pixelMap[pixel.x][pixel.y-1];
- if (head.dead) { // If head is dead, kill body
- pixel.dead = head.dead;
- }
- }
- else { var head = null }
- if (pixel.burning) {
- pixel.panic += 0.1;
- if (head && pixelTicks-pixel.burnStart > 240) {
- pixel.color = head.color;
- }
- }
- else if (pixel.panic > 0) {
- pixel.panic -= 0.1;
- }
-
- if (isEmpty(pixel.x, pixel.y-1)) {
- // create blood if decapitated 10% chance
- if (Math.random() < 0.1 && !pixel.charge) {
- createPixel("blood", pixel.x, pixel.y-1);
- // set dead to true 15% chance
- 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],
- ];
- // 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]);
- break;
- }
- }
- }
- // 15% chance to change direction
- if (Math.random() < 0.15) {
- pixel.dir *= -1;
- }
- // homeostasis
- if (pixel.temp > 37) { pixel.temp -= 1; }
- else if (pixel.temp < 37) { pixel.temp += 1; }
- }
-
- },
- density: 1100,
- state: "solid",
- conduct: .005,
- tempHigh: 350,
- stateHigh: "rotten_meat",
- burn: .01,
- burnTime: 300,
- burnInto: "rotten_meat",
- reactions: {
- "head": { elem2 : "z_head" , chance:0.3},
- "body": { elem2 : "z_body" , chance:0.3},
- },
-},
-
-elements.zombie = {
- color: ["#75816B","#4D6B53"],
- category: "scp",
- properties: {
- dead: false,
- dir: 1,
- panic: 0
- },
- tick: function(pixel) {
- if (isEmpty(pixel.x, pixel.y+1)) {
- createPixel("z_body", pixel.x, pixel.y+1);
- pixel.element = "z_head";
- }
- else if (isEmpty(pixel.x, pixel.y-1)) {
- createPixel("z_head", pixel.x, pixel.y-1);
- pixelMap[pixel.x][pixel.y-1].color = pixel.color;
- pixel.element = "z_body";
- }
- else {
- deletePixel(pixel.x, pixel.y);
- }
- },
- related: ["z_body","z_head"],
- cooldown: defaultCooldown
-},
-
-elements.z_head = {
- hidden: true,
- color: ["#75816B","#4D6B53"],
- category: "scp",
- breakInto: ["rotten_meat","bone","bone","blood"],
- 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) {
- changePixel(pixel,"rotten_meat");
- return
- }
- }
-
- // Find the body
- if (!isEmpty(pixel.x, pixel.y+1, true) && pixelMap[pixel.x][pixel.y+1].element == "z_body") {
- var body = pixelMap[pixel.x][pixel.y+1];
- if (body.dead) { // If body is dead, kill head
- pixel.dead = body.dead;
- }
- }
- else { var body = null }
-
- 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.1 && !pixel.charge) {
- createPixel("infection", pixel.x, pixel.y+1);
- // set dead to true 15% chance
- if (Math.random() < 0.15) {
- pixel.dead = pixelTicks;
- }
- }
- }
- // homeostasis
- if (pixel.temp > 37) { pixel.temp -= 1; }
- else if (pixel.temp < 37) { pixel.temp += 1; }
- },
- density: 1030,
- state: "solid",
- conduct: .05,
- tempHigh: 250,
- stateHigh: "rotten_meat",
- burn: .01,
- burnTime: 200,
- burnInto: "rotten_meat",
- reactions: {
- "head": { elem2 : "z_head" , chance:1.0 },
- "body": { elem2 : "z_body" , chance:1.0 },
- },
-},
-
-elements.z_body = {
- hidden: true,
- color: ["#11111f","#069469","#047e99","#7f5fb0"],
- category: "scp",
- breakInto: ["rotten_meat","rotten_meat","bone","blood"],
- 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 == "z_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 bone if pixelTicks-dead > 500
- if (pixelTicks-pixel.dead > 200 && Math.random() < 0.1) {
- changePixel(pixel,"rotten_meat");
- }
- return
- }
-
- // Find the head
- if (!isEmpty(pixel.x, pixel.y-1, true) && pixelMap[pixel.x][pixel.y-1].element == "z_head") {
- var head = pixelMap[pixel.x][pixel.y-1];
- if (head.dead) { // If head is dead, kill body
- pixel.dead = head.dead;
- }
- }
- else { var head = null }
- if (pixel.burning) {
- pixel.panic += 0.1;
- if (head && pixelTicks-pixel.burnStart > 240) {
- pixel.color = head.color;
- }
- }
- else if (pixel.panic > 0) {
- pixel.panic -= 0.1;
- }
-
- if (isEmpty(pixel.x, pixel.y-1)) {
- // create blood if decapitated 10% chance
- if (Math.random() < 0.1 && !pixel.charge) {
- createPixel("infection", pixel.x, pixel.y-1);
- // set dead to true 15% chance
- 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],
- ];
- // 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]);
- break;
- }
- }
- }
- // 15% chance to change direction
- if (Math.random() < 0.15) {
- pixel.dir *= -1;
- }
- // homeostasis
- if (pixel.temp > 37) { pixel.temp -= 1; }
- else if (pixel.temp < 37) { pixel.temp += 1; }
- }
-
- },
- density: 1035,
- state: "solid",
- conduct: .05,
- tempHigh: 250,
- stateHigh: "rotten_meat",
- burn: .01,
- burnTime: 300,
- burnInto: "rotten_meat",
- forceSaveColor: true,
- reactions: {
- "head": { elem2 : "z_head" , chance:1.0 },
- "body": { elem2 : "z_body" , chance:1.0 },
- },
-},
-
-elements.shy_guy = {
- category: "scp",
- color: ["#f7ead0","#faf9f6","#e9e6db"],
- category: "scp",
- properties: {
- dead: false,
- dir: 1,
- panic: 0
- },
- tick: function(pixel) {
+ onPlace: function(pixel) {
if (isEmpty(pixel.x, pixel.y+1)) {
createPixel("shy_body", pixel.x, pixel.y+1);
pixel.element = "shy_head";
@@ -951,16 +2797,17 @@ elements.shy_guy = {
},
related: ["shy_body","shy_head"],
cooldown: defaultCooldown
-},
+}
elements.shy_head = {
hidden: true,
- color: ["#f7ead0","#faf9f6","#e9e6db"],
+ name: "SCP-096",
+ color: ["#ddd2d6","#C9BCC2","#b6adb2"],
category: "scp",
- hardness: 1,
- breakInto: ["rotten_meat","bone","bone","blood","bone","bone","blood","bone","bone","blood","bone","bone","blood"],
+ hardness: 0.99,
+ pickElement: "scp_096",
properties: {
- dead: false
+ dead: false,
},
tick: function(pixel) {
doHeat(pixel);
@@ -968,7 +2815,7 @@ elements.shy_head = {
doElectricity(pixel);
if (pixel.dead) {
// Turn into rotten_meat if pixelTicks-dead > 500
- if (pixelTicks-pixel.dead > 200 && Math.random() < 0.1) {
+ if (pixelTicks-pixel.dead > 20 && Math.random() < 0.1) {
changePixel(pixel,"bone");
return
}
@@ -981,7 +2828,23 @@ elements.shy_head = {
pixel.dead = body.dead;
}
}
- else { var body = null }
+ else {
+ var body = null
+ changePixel(pixel,"bone")
+ }
+
+ // 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].target == true)) {
+ deletePixel(x,y);
+ break;
+ }
+ }
+ }
if (tryMove(pixel, pixel.x, pixel.y+1)) {
// create blood if severed 10% chance
@@ -1000,40 +2863,37 @@ elements.shy_head = {
density: 1070,
state: "solid",
conduct: .05,
- tempHigh: 3500,
+ tempHigh: 35000,
stateHigh: "bone",
burn: .01,
burnTime: 3000,
burnInto: "bone",
reactions: {
- "homunculus": { elem2 : ["blood","slime","blood","slime","rotten_meat",null] },
- "head": { elem2 : ["blood","blood","blood","bone",null] },
- "body": { elem2: ["blood","blood","meat","bone",null] },
- "z_head": { elem2 : ["infection","infection","infection","bone",null] },
- "z_body": { elem2: ["infection","infection","rotten_meat","bone",null] },
- "rat": { elem2: ["infection","rotten_meat",null]},
- "frog": { elem2: ["slime",null] },
- "cancer": { elem2: ["dna","dirty_water",null], },
- "blood": { elem2: null, chance:0.2 },
- "bone": { elem2: null, chance:0.2 },
- "meat": { elem2: [null,null,null,null,null,null,"rotten_meat"], chance:0.15 },
- "dna": { elem2: null, chance:0.2 },
- "water": { elem2: "dirty_water", chance:0.01 },
- "slime": { elem2: ["dirty_water",null], chance:0.2 },
+ "homunculus": { elem2 : ["blood","slime","blood","slime","rotten_meat",null] },
+ "head": { elem2 : ["blood","blood","blood","bone",null] },
+ "body": { elem2: ["blood","blood","meat","bone",null] },
+ "blood": { elem2 : null, chance: 0.5 },
+ "infection": { elem2 : null, chance: 0.5 },
+ "meat": { elem2 : ["blood",null], chance: 0.5 },
+ "bone_marrow": { elem2 : ["blood",null], chance: 0.5 },
+ "bone": { elem2 : ["bone_marrow","blood","quicklime"], chance: 0.5 },
+ "rotten_meat": { elem2 : ["infection","stench",null], chance: 0.5 },
+ "ground_meat": { elem2 : null, chance: 5 },
},
},
elements.shy_body = {
+ name: "SCP-096",
hidden: true,
- color: ["#f7ead0","#faf9f6","#e9e6db"],
+ color: ["#ddd2d6","#C9BCC2","#b6adb2"],
category: "scp",
- breakInto: ["rotten_meat","bone","blood","bone","bone","blood","bone","bone","blood","bone","bone","blood"],
+ pickElement: "scp_096",
hardness: 1,
properties: {
dead: false,
dir: 1,
+ h: 0,
panic: 0,
- anger: 0
},
tick: function(pixel) {
if (tryMove(pixel, pixel.x, pixel.y+1)) { // Fall
@@ -1052,20 +2912,10 @@ elements.shy_body = {
doHeat(pixel);
doBurning(pixel);
doElectricity(pixel);
- if (pixel.dead) {
- // Turn into bone if pixelTicks-dead > 500
- if (pixelTicks-pixel.dead > 200 && Math.random() < 0.1) {
- changePixel(pixel,"bone");
- }
- return
- }
// Find the head
if (!isEmpty(pixel.x, pixel.y-1, true) && pixelMap[pixel.x][pixel.y-1].element == "shy_head") {
var head = pixelMap[pixel.x][pixel.y-1];
- if (head.dead) { // If head is dead, kill body
- pixel.dead = head.dead;
- }
}
else { var head = null }
if (pixel.burning) {
@@ -1077,19 +2927,250 @@ elements.shy_body = {
else if (pixel.panic > 0) {
pixel.panic -= 0.1;
}
-
- if (isEmpty(pixel.x, pixel.y-1)) {
- // create blood if decapitated 10% chance
- if (Math.random() < 0.1 && !pixel.charge) {
- createPixel("blood", pixel.x, pixel.y-1);
- // set dead to true 15% chance
- if (Math.random() < 0.15) {
- pixel.dead = pixelTicks;
+ for (var i = 0; i <= width; i++) {
+ for (var j = 0; j <= height; j++) {
+ if (!isEmpty(i,j,true)) {
+ if (pixelMap[i][j].target == true && (pixelMap[i][j].element == "body" || pixelMap[i][j].element == "head")) {
+ var targetExist = true
+ pixel.h = 1
+ if (pixel.dir != 1 && pixelMap[i][j].x > pixel.x) {
+ pixel.dir = 1
+ }
+ else if (pixel.dir != -1 && pixelMap[i][j].x < pixel.x) {
+ pixel.dir = -1
+ }
+ else if (pixel.dir != 0 && pixelMap[i][j].x == pixel.x) {
+ pixel.dir = 0
+ }
+ }
+ if (pixelMap[i][j].target == true && pixelMap[i][j].element != "body" && pixelMap[i][j].element != "head") {
+ delete pixelMap[i][j].target
+ }
+ }
+ if (i >= width && j >= height && !targetExist && pixel.h != 0) {
+ pixel.h = 0
+ }
+ }
+ }
+ if (pixel.h == 1) {
+ if (Math.random() < 0.95) {
+ let y = Math.random() < 0.5 ? 0 : -1;
+ let xDir = Math.random() < 0.5 ? 1 : -1;
+ for (let x = 1; x < 200; x++) {
+ let x2 = pixel.x+(x*xDir);
+ let y2 = pixel.y+y;
+ if (!isEmpty(x2,y2,true) && !outOfBounds(x2,y2)) {
+ let seenPixel = pixelMap[x2][y2];
+ if (seenPixel.target == true) {
+ if (pixel.dir != 1 && seenPixel.x > pixel.x+1) {
+ pixel.dir = 1
+ }
+ else if (pixel.dir != -1 && seenPixel.x < pixel.x-1) {
+ pixel.dir = -1
+ }
+ else if (seenPixel.x == pixel.x+1 || seenPixel.x == pixel.x-1 || seenPixel.x == pixel.x) {
+ pixel.dir = 0
+ }
+ break;
+ }
+ }
+ }
+ }
+ if (Math.random() < 0.95) {
+ let y = Math.random() < 0.5 ? 0 : -1;
+ for (let x = 1; x < width; x++) {
+ let x2 = pixel.x+(x*pixel.dir);
+ let y2 = pixel.y+y;
+ if (!isEmpty(x2,y2,true) && !outOfBounds(x2,y2)) {
+ let seenPixel = pixelMap[x2][y2];
+ if (elements[seenPixel.element].id == elements.head.id) {
+ if (!seenPixel.target) {
+ seenPixel.target = true
+ }
+ }
+ 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 (Math.random() < 1) {
+ let yDir = -1
+ for (let y = 1; y < height; y++) {
+ let x2 = pixel.x
+ let y2 = pixel.y+(y*yDir);
+ if (!isEmpty(x2,y2,true) && !outOfBounds(x2,y2)) {
+ if (pixelMap[x2][y2].target == true) {
+ let seenPixel = pixelMap[x2][y2];
+ 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 (isEmpty(pixel.x, pixel.y-3)) {
+ tryMove(headpixel, pixel.x, pixel.y-3);
+ if (isEmpty(pixel.x, pixel.y-2)) {
+ tryMove(pixel, pixel.x, pixel.y-2)
+ }
+ else {
+ swapPixels(pixel, pixelMap[pixel.x][pixel.y-2])
+ }
+ }
+ else {
+ swapPixels(headpixel, pixelMap[pixel.x][pixel.y-3])
+ if (isEmpty(pixel.x, pixel.y-2)) {
+ tryMove(pixel, pixel.x, pixel.y-2)
+ }
+ else {
+ swapPixels(pixel, pixelMap[pixel.x][pixel.y-2])
+ }
+ }
+ }
+ }
+ }
+ break;
+ }
+ }
+ }
+ }
+ if (Math.random() < 1) {
+ let yDir = 1
+ for (let y = 1; y < height; y++) {
+ let x2 = pixel.x
+ let y2 = pixel.y+(y*yDir);
+ if (!isEmpty(x2,y2,true) && !outOfBounds(x2,y2)) {
+ if (pixelMap[x2][y2].target == true) {
+ let seenPixel = pixelMap[x2][y2];
+ 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 (isEmpty(pixel.x, pixel.y+1)) {
+ tryMove(headpixel, pixel.x, pixel.y+1);
+ if (isEmpty(pixel.x, pixel.y+2)) {
+ tryMove(pixel, pixel.x, pixel.y+2)
+ }
+ else {
+ swapPixels(pixel, pixelMap[pixel.x][pixel.y+2])
+ }
+ }
+ else {
+ swapPixels(headpixel, pixelMap[pixel.x][pixel.y+1])
+ if (isEmpty(pixel.x, pixel.y+2)) {
+ tryMove(pixel, pixel.x, pixel.y+2)
+ }
+ else {
+ swapPixels(pixel, pixelMap[pixel.x][pixel.y+2])
+ }
+ }
+ }
+ }
+ }
+ break;
+ }
+ }
+ }
+ }
+ if (isEmpty(pixel.x, pixel.y-1) || !isEmpty(pixel.x,pixel.y-1) && pixelMap[pixel.x][pixel.y-1].element != "shy_head") {
+ // 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)
+ }
+ 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")
+ }
+ }
+ else if (head == null) { return }
+ else if (isEmpty(pixel.x+pixel.dir, pixel.y) && !outOfBounds(pixel.x+pixel.dir, pixel.y) && isEmpty(pixel.x+pixel.dir, pixel.y-1) && !outOfBounds(pixel.x+pixel.dir, pixel.y-1)) {
+ tryMove(head, pixel.x+pixel.dir, pixel.y-1)
+ tryMove(pixel, pixel.x+pixel.dir, pixel.y)
+ }
+ else if (isEmpty(pixel.x+pixel.dir, pixel.y-1) && !outOfBounds(pixel.x+pixel.dir, pixel.y-1) && isEmpty(pixel.x+pixel.dir, pixel.y-2) && !outOfBounds(pixel.x+pixel.dir, pixel.y-2)) {
+ tryMove(head, pixel.x+pixel.dir, pixel.y-2)
+ tryMove(pixel, pixel.x+pixel.dir, pixel.y-1)
+ }
+ else if (isEmpty(pixel.x+pixel.dir, pixel.y-2) && !outOfBounds(pixel.x+pixel.dir, pixel.y-2) && isEmpty(pixel.x+pixel.dir, pixel.y-3) && !outOfBounds(pixel.x+pixel.dir, pixel.y-3)) {
+ tryMove(head, pixel.x+pixel.dir, pixel.y-3)
+ tryMove(pixel, pixel.x+pixel.dir, pixel.y-2)
+ }
+ else if (isEmpty(pixel.x+pixel.dir, pixel.y+1) && !outOfBounds(pixel.x+pixel.dir, pixel.y+1) && isEmpty(pixel.x+pixel.dir, pixel.y+2) && !outOfBounds(pixel.x+pixel.dir, pixel.y+2)) {
+ tryMove(head, pixel.x+pixel.dir, pixel.y+1)
+ tryMove(pixel, pixel.x+pixel.dir, pixel.y+2)
+ }
+ else if (isEmpty(pixel.x+pixel.dir, pixel.y+2) && !outOfBounds(pixel.x+pixel.dir, pixel.y+2) && isEmpty(pixel.x+pixel.dir, pixel.y+3) && !outOfBounds(pixel.x+pixel.dir, pixel.y+3)) {
+ tryMove(head, pixel.x+pixel.dir, pixel.y+2)
+ tryMove(pixel, pixel.x+pixel.dir, pixel.y+3)
+ }
+ else if (!isEmpty(pixel.x+pixel.dir, pixel.y) && !outOfBounds(pixel.x+pixel.dir, pixel.y) && !isEmpty(pixel.x+pixel.dir, pixel.y-1) && !outOfBounds(pixel.x+pixel.dir, pixel.y-1)) {
+ if (pixelMap[pixel.x+pixel.dir][pixel.y].target == true) {
+ changePixel(pixelMap[pixel.x+pixel.dir][pixel.y], "blood")
+ }
+ else if (pixelMap[pixel.x+pixel.dir][pixel.y-1].target == true) {
+ changePixel(pixelMap[pixel.x+pixel.dir][pixel.y-1], "blood")
+ }
+ else {
+ if (isBreakable(pixelMap[pixel.x+pixel.dir][pixel.y-1])) {
+ breakPixel(pixelMap[pixel.x+pixel.dir][pixel.y-1]);
+ swapPixels(head, pixelMap[pixel.x+pixel.dir][pixel.y-1])
+ }
+ else if (elements[pixelMap[pixel.x+pixel.dir][pixel.y-1].element].movable == true ) {
+ swapPixels(head, pixelMap[pixel.x+pixel.dir][pixel.y-1])
+ }
+ else if (elements[pixelMap[pixel.x+pixel.dir][pixel.y-1].element].hardness != 1 ) {
+ swapPixels(head, pixelMap[pixel.x+pixel.dir][pixel.y-1])
+ }
+ if (isBreakable(pixelMap[pixel.x+pixel.dir][pixel.y])) {
+ breakPixel(pixelMap[pixel.x+pixel.dir][pixel.y]);
+ swapPixels(pixel, pixelMap[pixel.x+pixel.dir][pixel.y])
+ }
+ else if (elements[pixelMap[pixel.x+pixel.dir][pixel.y].element].movable == true) {
+ swapPixels(pixel, pixelMap[pixel.x+pixel.dir][pixel.y])
+ }
+ else if (elements[pixelMap[pixel.x+pixel.dir][pixel.y].element].hardness != 1 ) {
+ swapPixels(pixel, pixelMap[pixel.x+pixel.dir][pixel.y])
+ }
+ }
+ }
+ for (var i = 0; i < squareCoords.length; i++) {
+ var coords = squareCoords[i];
+ var x = pixel.x + coords[0];
+ var y = pixel.y + coords[1];
+ if (!isEmpty(x,y) && !outOfBounds(x,y)) {
+ var pixel2 = pixelMap[x][y]
+ let old = pixel2.element;
+ if (isBreakable(pixel2)) {
+ // times 0.25 if not shiftDown else 1
+ if (Math.random() < (1.5-(elements[pixel.element].hardness || 0))) {
+ breakPixel(pixel2);
+ }
+ // 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") {
+ 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;
+ tryMove(pixel2,pixel2.x+x,pixel2.y+y)
+ }
}
}
}
+ else {
+ if (isEmpty(pixel.x, pixel.y-1) || !isEmpty(pixel.x,pixel.y-1) && pixelMap[pixel.x][pixel.y-1].element != "shy_head") {
+ // 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)
+ }
+ 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")
+ }
+ }
else if (head == null) { return }
- else if (Math.random() < 0.1*(isEmpty(pixel.x, pixel.y+1) ? 1 : pixel.panic+1)) { // Move 10% chance
+ else if (Math.random() < 0.01) { // Move 1% chance
var movesToTry = [
[1*pixel.dir,0],
[1*pixel.dir,-1],
@@ -1114,225 +3195,1910 @@ elements.shy_body = {
if (pixel.temp > 37) { pixel.temp -= 1; }
else if (pixel.temp < 37) { pixel.temp += 1; }
}
- if (pixel.dir == 1) {
- if (!isEmpty(pixel.x+2, pixel.y-1, true) && pixelMap[pixel.x+2][pixel.y-1].element == "head") {
- pixel.panic += 0.2;
- }
- else if (!isEmpty(pixel.x+3, pixel.y-1, true) && pixelMap[pixel.x+2][pixel.y-1].element == "head") {
- pixel.panic += 0.2;
- }
- else if (!isEmpty(pixel.x+4, pixel.y-1, true) && pixelMap[pixel.x+4][pixel.y-1].element == "head") {
- pixel.panic += 0.2;
- }
- else if (!isEmpty(pixel.x+5, pixel.y-1, true) && pixelMap[pixel.x+5][pixel.y-1].element == "head") {
- pixel.panic += 0.2;
- }
- else if (!isEmpty(pixel.x+5, pixel.y-1, true) && pixelMap[pixel.x+5][pixel.y-1].element == "head") {
- pixel.panic += 0.1;
- }
- else if (!isEmpty(pixel.x+6, pixel.y-1, true) && pixelMap[pixel.x+6][pixel.y-1].element == "head") {
- pixel.panic += 0.1;
- }
- else if (!isEmpty(pixel.x+7, pixel.y-1, true) && pixelMap[pixel.x+7][pixel.y-1].element == "head") {
- pixel.panic += 0.1;
- }
- else if (!isEmpty(pixel.x+8, pixel.y-1, true) && pixelMap[pixel.x+8][pixel.y-1].element == "head") {
- pixel.panic += 0.1;
- }
- else if (!isEmpty(pixel.x+9, pixel.y-1, true) && pixelMap[pixel.x+9][pixel.y-1].element == "head") {
- pixel.panic += 0.1;
- }
- else if (!isEmpty(pixel.x+10, pixel.y-1, true) && pixelMap[pixel.x+10][pixel.y-1].element == "head") {
- pixel.panic += 0.1;
- }
- else if (!isEmpty(pixel.x+11, pixel.y-1, true) && pixelMap[pixel.x+11][pixel.y-1].element == "head") {
- pixel.panic += 0.1;
- }
- else if (!isEmpty(pixel.x+12, pixel.y-1, true) && pixelMap[pixel.x+12][pixel.y-1].element == "head") {
- pixel.panic += 0.1;
- }
+ if (Math.random() < 0.95) {
+ let y = Math.random() < 0.5 ? 0 : -1;
+ let xDir = Math.random() < 0.5 ? 1 : -1;
+ for (let x = 1; x < 150; x++) {
+ let x2 = pixel.x+(x*xDir);
+ let y2 = pixel.y+y;
+ if (!isEmpty(x2,y2,true) && !outOfBounds(x2,y2)) {
+ let seenPixel = pixelMap[x2][y2];
+ if (elements[seenPixel.element].id == elements.head.id) {
+ pixel.h = 1
+ seenPixel.target = true
+ }
+ 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;
+ }
+ }
+ }
+ }
+ for (var i = 0; i < squareCoords.length; i++) {
+ var coords = squareCoords[i];
+ var x = pixel.x + coords[0];
+ var y = pixel.y + coords[1];
+ if (!isEmpty(x,y) && !outOfBounds(x,y)) {
+ var pixel2 = pixelMap[x][y]
+ let old = pixel2.element;
+ if (isBreakable(pixel2) && pixel2.target) {
+ // times 0.25 if not shiftDown else 1
+ if (Math.random() < (1.5-(elements[pixel.element].hardness || 0)) && Math.random() > 0.5) {
+ breakPixel(pixel2);
+ }
+ // if (Math.random() > ((1-(elements[pixel.element].hardness || 1)) * (shiftDown ? 0.5 : 1))) {
+ }
+ }
}
- else if (pixel.dir == -1) {
- if (!isEmpty(pixel.x-2, pixel.y-1, true) && pixelMap[pixel.x-2][pixel.y-1].element == "head") {
- pixel.panic += 0.2;
- }
- else if (!isEmpty(pixel.x-3, pixel.y-1, true) && pixelMap[pixel.x-3][pixel.y-1].element == "head") {
- pixel.panic += 0.2;
- }
- else if (!isEmpty(pixel.x-4, pixel.y-1, true) && pixelMap[pixel.x-4][pixel.y-1].element == "head") {
- pixel.panic += 0.2;
- }
- else if (!isEmpty(pixel.x-5, pixel.y-1, true) && pixelMap[pixel.x-5][pixel.y-1].element == "head") {
- pixel.panic += 0.2;
- }
- else if (!isEmpty(pixel.x-5, pixel.y-1, true) && pixelMap[pixel.x-5][pixel.y-1].element == "head") {
- pixel.panic += 0.1;
- }
- else if (!isEmpty(pixel.x-6, pixel.y-1, true) && pixelMap[pixel.x-6][pixel.y-1].element == "head") {
- pixel.panic += 0.1;
- }
- else if (!isEmpty(pixel.x-7, pixel.y-1, true) && pixelMap[pixel.x-7][pixel.y-1].element == "head") {
- pixel.panic += 0.1;
- }
- else if (!isEmpty(pixel.x-8, pixel.y-1, true) && pixelMap[pixel.x-8][pixel.y-1].element == "head") {
- pixel.panic += 0.1;
- }
- else if (!isEmpty(pixel.x-9, pixel.y-1, true) && pixelMap[pixel.x-9][pixel.y-1].element == "head") {
- pixel.panic += 0.1;
- }
- else if (!isEmpty(pixel.x-10, pixel.y-1, true) && pixelMap[pixel.x-10][pixel.y-1].element == "head") {
- pixel.panic += 0.1;
- }
- else if (!isEmpty(pixel.x-11, pixel.y-1, true) && pixelMap[pixel.x-11][pixel.y-1].element == "head") {
- pixel.panic += 0.1;
- }
- else if (!isEmpty(pixel.x-12, pixel.y-1, true) && pixelMap[pixel.x-12][pixel.y-1].element == "head") {
- pixel.panic += 0.1;
- }
}
},
- density: 1080,
+ density: 1090,
state: "solid",
conduct: .005,
- tempHigh: 3500,
- stateHigh: "bone",
- burn: .01,
- burnTime: 3000,
- burnInto: "bone",
forceSaveColor: true,
reactions: {
- "homunculus": { elem2 : ["blood","slime","blood","slime","rotten_meat",null] },
- "head": { elem2 : ["blood","blood","blood","bone",null] },
- "body": { elem2: ["blood","blood","meat","bone",null] },
- "z_head": { elem2 : ["infection","infection","infection","bone",null] },
- "z_body": { elem2: ["infection","infection","rotten_meat","bone",null] },
- "rat": { elem2: ["infection","infection","plague"] },
- "frog": { elem2: "slime" },
- "cell": { elem2: ["dna","water",null] },
- "cancer": { elem2: ["dna","dirty_water"] },
- "water": { elem2: "dirty_water", chance:0.01 },
+ "homunculus": { elem2 : ["blood","slime","blood","slime","rotten_meat",null] },
+ "head": { elem2 : ["blood","blood","blood","bone",null] },
+ "body": { elem2: ["blood","blood","meat","bone",null] },
+ "blood": { elem2 : null, chance: 0.5 },
+ "infection": { elem2 : null, chance: 0.5 },
+ "meat": { elem2 : ["blood",null], chance: 0.5 },
+ "bone_marrow": { elem2 : ["blood",null], chance: 0.5 },
+ "bone": { elem2 : ["bone_marrow","blood","quicklime"], chance: 0.5 },
+ "rotten_meat": { elem2 : ["infection","stench",null], chance: 0.5 },
+ "ground_meat": { elem2 : null, chance: 5 },
},
+}
+
+elements.scp_173 = {
+ name: "SCP-173",
+ color: ["#ababab","#ae551c","#AC3846","#AC3846","#698348","#444240","#E5BA9B","#AC3846","#AC3846","#698348","#444240","#E5BA9B","#AC3846","#AC3846","#698348","#444240","#E5BA9B"],
+ buttonColor: ["#AC3846","#AC3846","#698348","#444240","#E5BA9B","#ababab","#ababab","#ababab","#ababab","#ae551c","#bc6e39","#71797e","#AC3846","#AC3846","#698348","#444240","#E5BA9B"],
+ category: "scp",
+ properties: {
+ dead: false,
+ dir: 1,
+ panic: 0
+ },
+ onPlace: function(pixel) {
+ if (isEmpty(pixel.x, pixel.y+1)) {
+ createPixel("body_173", pixel.x, pixel.y+1);
+ var color = pixel.color;
+ changePixel(pixel,"head_173");
+ pixel.color = color;
+ }
+ else if (isEmpty(pixel.x, pixel.y-1)) {
+ createPixel("head_173", pixel.x, pixel.y-1);
+ pixelMap[pixel.x][pixel.y-1].color = pixel.color;
+ changePixel(pixel,"body_173");
+ }
+ else {
+ deletePixel(pixel.x, pixel.y);
+ }
+ },
+ reactions: {
+ },
+ related: ["body_173","head_173"],
+ cooldown: defaultCooldown,
+ forceSaveColor: true,
+}
+
+elements.body_173 = {
+ name: "SCP-173",
+ color: ["#ababab","#ababab","#ababab","#ababab","#ababab","#ababab","#ababab","#ae551c","#bc6e39","#71797e","#71797e"],
+ category: "scp",
+ hidden: true,
+ density: 2400,
+ state: "solid",
+ conduct: .025,
+ tempHigh: 1505,
+ stateHigh: ["magma","magma","magma","magma","rust","rust","rust","magma","magma","magma","magma","rust","rust","rust","spray_paint"],
+ breakInto: ["concrete","concrete","concrete","concrete","rust","rust","rust","concrete","concrete","concrete","concrete","rust","rust","rust","spray_paint"],
+ forceSaveColor: true,
+ pickElement: "scp_173",
+ reactions: {
+ "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 },
+ },
+ properties: {
+ dead: false,
+ dir: 1,
+ panic: 0,
+ frozen1: true,
+ frozen2: true
+ },
+ 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 === "head_173") {
+ 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 = "concrete"
+ }
+ return
+ }
+
+ // Find the head
+ if (!isEmpty(pixel.x, pixel.y-1, true) && pixelMap[pixel.x][pixel.y-1].element == "head_173") {
+ var head = pixelMap[pixel.x][pixel.y-1];
+ if (head.dead) { // If head is dead, kill body
+ pixel.dead = head.dead;
+ }
+ else if (head.panic > 0) {
+ pixel.panic = head.panic;
+ delete head.panic;
+ }
+ }
+ else { var head = null }
+ if (pixel.panic > 0) {
+ pixel.panic -= 0.1;
+ if (pixel.panic < 0) { pixel.panic = 0; }
+ else if (pixel.panic > 50) { pixel.panic = 50; }
+ }
+
+ if (isEmpty(pixel.x, pixel.y-1)) {
+ // create blood if decapitated 10% chance
+ if (Math.random() < 0.0025 && !pixel.charge) {
+ createPixel("blood", pixel.x, pixel.y-1);
+ }
+ if (Math.random() < 0.05) {
+ pixel.dead = pixelTicks;
+ }
+ }
+ else if (head === null) { return }
+ if (pixel.frozen1 == false && pixel.frozen2 == false) {
+ if (Math.random() < 1) {
+ let y = Math.random() < 0.5 ? 0 : -1;
+ for (let x = 1; x < 100; x++) {
+ let x2 = pixel.x+x
+ let y2 = pixel.y+y;
+ if (!isEmpty(x2,y2,true)) {
+ let seenPixel = pixelMap[x2][y2];
+ if (seenPixel.element == "head" && seenPixel.dead == false) {
+ if (!isEmpty(seenPixel.x,seenPixel.y+1) && !outOfBounds(seenPixel.x,seenPixel.y+1)) {
+ let bodyP = pixelMap[seenPixel.x][seenPixel.y+1]
+ if (bodyP.x > pixel.x && bodyP.dir == -1) {
+ pixel.frozen1 = true;
+ break;
+ }
+ else if (bodyP.x < pixel.x && bodyP.dir == 1) {
+ pixel.frozen1 = true;
+ break;
+ }
+ if (isEmpty(bodyP.x+(-bodyP.dir),bodyP.y) && isEmpty(bodyP.x+(-bodyP.dir),bodyP.y-1) && (bodyP.x < pixel.x && bodyP.dir == -1 || bodyP.x > pixel.x && bodyP.dir == 1)) {
+ tryMove(pixelMap[pixel.x][pixel.y-1],bodyP.x+(-bodyP.dir),bodyP.y-1)
+ tryMove(pixel,bodyP.x+(-bodyP.dir),bodyP.y)
+ bodyP.dead = pixelTicks
+ }
+ }
+ }
+ else if (seenPixel.element == "body" && seenPixel.dead == false) {
+ if (seenPixel.x > pixel.x && seenPixel.dir == -1) {
+ pixel.frozen1 = true;
+ break;
+ }
+ else if (seenPixel.x < pixel.x && seenPixel.dir == 1) {
+ pixel.frozen1 = true;
+ break;
+ }
+ if (isEmpty(seenPixel.x+(-seenPixel.dir),seenPixel.y) && isEmpty(seenPixel.x+(-seenPixel.dir),seenPixel.y-1) && (seenPixel.x < pixel.x && seenPixel.dir == -1 || seenPixel.x > pixel.x && seenPixel.dir == 1)) {
+ tryMove(pixelMap[pixel.x][pixel.y-1],seenPixel.x+(-seenPixel.dir),seenPixel.y-1)
+ tryMove(pixel,seenPixel.x+(-seenPixel.dir),seenPixel.y)
+ seenPixel.dead = pixelTicks
+ }
+ }
+ }
+ }
+ }
+ if (Math.random() < 1) {
+ let y = Math.random() < 0.5 ? 0 : -1;
+ for (let x = -1; x > -100; x--) {
+ let x2 = pixel.x+x
+ let y2 = pixel.y+y;
+ if (!isEmpty(x2,y2,true)) {
+ let seenPixel = pixelMap[x2][y2];
+ if (seenPixel.element == "head" && seenPixel.dead == false) {
+ if (!isEmpty(seenPixel.x,seenPixel.y+1) && !outOfBounds(seenPixel.x,seenPixel.y+1)) {
+ let bodyP = pixelMap[seenPixel.x][seenPixel.y+1]
+ if (bodyP.x > pixel.x && bodyP.dir == -1) {
+ pixel.frozen2 = true
+ break;
+ }
+ else if (bodyP.x < pixel.x && bodyP.dir == 1) {
+ pixel.frozen2 = true
+ break;
+ }
+ if (isEmpty(bodyP.x+(-bodyP.dir),bodyP.y) && isEmpty(bodyP.x+(-bodyP.dir),bodyP.y-1) && (bodyP.x < pixel.x && bodyP.dir == -1 || bodyP.x > pixel.x && bodyP.dir == 1)) {
+ tryMove(pixelMap[pixel.x][pixel.y-1],bodyP.x+(-bodyP.dir),bodyP.y-1)
+ tryMove(pixel,bodyP.x+(-bodyP.dir),bodyP.y)
+ bodyP.dead = pixelTicks
+ }
+ }
+ }
+ else if (seenPixel.element == "body" && seenPixel.dead == false) {
+ if (seenPixel.x > pixel.x && seenPixel.dir == -1) {
+ pixel.frozen2 = true
+ break;
+ }
+ else if (seenPixel.x < pixel.x && seenPixel.dir == 1) {
+ pixel.frozen2 = true
+ break;
+ }
+ if (isEmpty(seenPixel.x+(-seenPixel.dir),seenPixel.y) && isEmpty(seenPixel.x+(-seenPixel.dir),seenPixel.y-1) && (seenPixel.x < pixel.x && seenPixel.dir == -1 || seenPixel.x > pixel.x && seenPixel.dir == 1)) {
+ tryMove(pixelMap[pixel.x][pixel.y-1],seenPixel.x+(-seenPixel.dir),seenPixel.y-1)
+ tryMove(pixel,seenPixel.x+(-seenPixel.dir),seenPixel.y)
+ seenPixel.dead = pixelTicks
+ }
+ }
+ }
+ }
+ }
+ if (Math.random() < 0.5*(isEmpty(pixel.x, pixel.y+1) ? 1 : pixel.panic+1)) { // Move 50% chance
+ var movesToTry = [
+ [1*pixel.dir,0],
+ ];
+ 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 (hitPixel.element === "body" || hitPixel.element === "head") {
+ hitPixel.dead = pixelTicks
+ }
+ }
+ }
+ // 15% chance to change direction
+ if (Math.random() < 0.15 || !moved) {
+ pixel.dir *= -1;
+ }
+ }
+ }
+ else if (pixel.frozen1 == true || pixel.frozen2 == true) {
+ if (Math.random() < 0.9) {
+ let y = Math.random() < 0.5 ? 0 : -1;
+ for (let x = 1; x < 100; x++) {
+ let x2 = pixel.x+x
+ let y2 = pixel.y+y;
+ if (!isEmpty(x2,y2,true)) {
+ let seenPixel = pixelMap[x2][y2];
+ if (seenPixel.element == "head") {
+ if (!isEmpty(seenPixel.x,seenPixel.y+1) && !outOfBounds(seenPixel.x,seenPixel.y+1)) {
+ let bodyP = pixelMap[seenPixel.x][seenPixel.y+1]
+ if (bodyP.x > pixel.x && bodyP.dir == -1) {
+ break;
+ }
+ else if (bodyP.x < pixel.x && bodyP.dir == 1) {
+ break;
+ }
+ }
+ }
+ else if (seenPixel.element == "body") {
+ if (seenPixel.x > pixel.x && seenPixel.dir == -1) {
+ break;
+ }
+ else if (seenPixel.x < pixel.x && seenPixel.dir == 1) {
+ break;
+ }
+ }
+ }
+ if (x >= 99) {
+ pixel.frozen1 = false
+ }
+ }
+ }
+ if (Math.random() < 0.9) {
+ let y = Math.random() < 0.5 ? 0 : -1;
+ for (let x = -1; x > -100; x--) {
+ let x2 = pixel.x+x
+ let y2 = pixel.y+y;
+ if (!isEmpty(x2,y2,true)) {
+ let seenPixel = pixelMap[x2][y2];
+ if (seenPixel.element == "head") {
+ if (!isEmpty(seenPixel.x,seenPixel.y+1) && !outOfBounds(seenPixel.x,seenPixel.y+1)) {
+ let bodyP = pixelMap[seenPixel.x][seenPixel.y+1]
+ if (bodyP.x > pixel.x && bodyP.dir == -1) {
+ break;
+ }
+ else if (bodyP.x < pixel.x && bodyP.dir == 1) {
+ break;
+ }
+ }
+ }
+ else if (seenPixel.element == "body") {
+ if (seenPixel.x > pixel.x && seenPixel.dir == -1) {
+ break;
+ }
+ else if (seenPixel.x < pixel.x && seenPixel.dir == 1) {
+ break;
+ }
+ }
+ }
+ if (x <= -99) {
+ pixel.frozen2 = false
+ }
+ }
+ }
+ }
+ }
+}
+
+elements.head_173 = {
+ name: "SCP-173",
+ color: ["#ababab","#ae551c","#AC3846","#AC3846","#698348","#444240","#E5BA9B","#AC3846","#AC3846","#698348","#444240","#E5BA9B","#AC3846","#AC3846","#698348","#444240","#E5BA9B"],
+ category: "scp",
+ hidden: true,
+ density: 2400,
+ state: "solid",
+ conduct: .025,
+ tempHigh: 1505,
+ stateHigh: ["magma","magma","magma","magma","rust","rust","rust","magma","magma","magma","magma","rust","rust","rust","spray_paint"],
+ breakInto: ["concrete","concrete","concrete","concrete","rust","rust","rust","concrete","concrete","concrete","concrete","rust","rust","rust","spray_paint"],
+ forceSaveColor: true,
+ pickElement: "scp_173",
+ reactions: {
+ "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 },
+ },
+ 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 = "concrete"
+ return
+ }
+ }
+
+ // Find the body
+ if (!isEmpty(pixel.x, pixel.y+1, true) && pixelMap[pixel.x][pixel.y+1].element == "body_173") {
+ var body = pixelMap[pixel.x][pixel.y+1];
+ if (body.dead) { // If body is dead, kill head
+ pixel.dead = body.dead;
+ }
+ }
+ else { var body = null }
+
+ 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.025 && !pixel.charge) {
+ createPixel("blood", pixel.x, pixel.y+1);
+ // set dead to true 15% chance
+ }
+ if (Math.random() < 0.05) {
+ pixel.dead = pixelTicks;
+ }
+ }
+ },
+}
+
+elements.scp_229_seed = {
+ name: "SCP-229",
+ color: "#9c6c25",
+ buttonColor:["#4d0a03","#4d0a03","#4d0a03","#4d0a03","#4d0a03","#4d0a03","#a95232","#be4322","#BD2D2D","#EDEDE5","#F2D243","#FFF0E6","#908F84","#908F84","#E47A3E","#DBC0AC","#DBC0AC","#a95232","#be4322","#BD2D2D","#0C1D24","#0C1D24","#0C1D24","#0C1D24","#0C1D24","#0C1D24"],
+ behavior: [
+ "XX|M2%1.5|XX",
+ "XX|L2:copper AND C2:scp_229%50|XX",
+ "XX|M1|XX",
+ ],
+ behaviorOn: [
+ "SH%5|XX|SH%5",
+ "XX|CH:scp_229%50|XX",
+ "SH%5|M1|SH%5",
+ ],
+ tempHigh: 1750,
+ stateHigh: ["metal_scrap","metal_scrap","metal_scrap","metal_scrap","molten_glass","molten_plastic","molten_plastic"],
+ conduct: 1,
+ tick: behaviors.SEEDRISE,
+ breakInto: "metal_scrap",
+ category:"scp",
+ state: "solid",
+ density: 1700,
+ cooldown: defaultCooldown,
+ excludeRandom: true,
+}
+
+elements.scp_229 = {
+ name: "SCP-229",
+ color:["#a95232","#be4322","#4d0a03","#0C1D24","#908F84","#BD2D2D","#31BA90","#1B5BB2","#EDEDE5","#F2D243","#FFF0E6","#908F84","#E47A3E","#DBC0AC"],
+ colorPattern: [
+ "rVoooVwVVVVbVVVyVVvrvvvvvVVVVVVVVCrVVVVVVVVrrrrr",
+ "vrvvvovwvvvvbvvyvvrVVVVVVvvvvvvvvvrcvggrrrrvvtvv",
+ "VVrVVVorrVVVVbbbrrvvvvvvvVVVVVVVVVrggtrtVVVVtVVV",
+ "vvvrrrrvwrvvvggrggggVcCCcCoooogggggrrrvvtvvvtvvv",
+ "VVVVVVVVVwrrrrrCbcccgoooooVVVgVVVVVtVVVVVtttVVVV",
+ "vvvvvvvvvcwgccvvbvVVoggVVvvggvvvvvvtvtttvvvvvvvv",
+ "VVVVVccCCVgwVVVVVbvvvovggggVVVVVVVVVtVbbtVVVVVVV",
+ "vvccCvvvvgwvvvvvvvbVVVooVvvvvvvvvvvvbtttvvvvvvvv",
+ "cCVVVVVVgwVVVVVVVybvvvvvooooVVVVVVVbVVVVtVVVVVVV",
+ "vvvvvvwwgvvvvvvvvyVbbbVVVvvvooovbbbvvvvvvtvvvvvc",
+ "VVVwwwVVgVVVVVVVyVvvvvbbbVVVVbbboooVVVVVVVtVVVCV",
+ "vvwvggggbvvvvvvvyvVVVVVVVbbbbvvvvvvooovvvvvtwcvv",
+ "VVwgVVVVbVVVVVVyVVvvvvvvvVVVVVrVVVVVVVooocCctwVV",
+ "vvgwvvvwbvvvvvvyvvVVVVrrrvvvvrvrvvvvvCcCCoootvww",
+ "wgwwVVwVVbVVVVyVVVvvvrvvvrrrrVVVrVCCCVVVVVVVotoV",
+ "govvvvwvvvbvvvyvvvVVrVVVVvvvvvvvcrvvvvvvvvvvvtvo",/* my design
+ "oyyyvvorvywvoyvo",
+ "VooyyvoVVywwoyvo",
+ "VrVoyvorrywyoyvo",
+ "VrVvyvorrywyoyvo",
+ "ooooyooVVywyoywo",
+ "rrrryrrrvywyoyyr",
+ "wvvvyyvryywyoyyy",
+ "ywvvoyyyyowyooyy",
+ "yoovvoooovwyoooy",
+ "yrowvvvrvvwyrrro",
+ "yvoywvvrvvwyvvvv",
+ "yvovywooooooovvv",
+ "yoovvyorrrrrovvo",
+ "yrrVVVowvvyyyvvo",
+ "yrrrrroywyyoyyvo",
+ "yyVVVVoryyovoyvo", nousers design */
+ ],
+ colorKey: {
+ "C":"#a95232",
+ "c":"#be4322",
+ "V":"#4d0a03",
+ "v":"#0C1D24",
+ "g":"#908F84",
+ "r":"#BD2D2D",
+ "t":"#31BA90",
+ "b":"#1B5BB2",
+ "W":"#EDEDE5",
+ "w":"#DBC0AC",
+ "y":"#F2D243",
+ "o":"#E47A3E",
+ },
+ behavior: [
+ "XX|SH%5|XX",
+ "SH%5|XX|SH%5",
+ "XX|SH%5|XX",
+ ],
+ category: "scp",
+ hardness: 0.85,
+ breakInto: "metal_scrap",
+ tempHigh: 1750,
+ stateHigh: ["metal_scrap","metal_scrap","metal_scrap","metal_scrap","molten_glass","molten_plastic","molten_plastic"],
+ properties: {
+ radius: 10,
+ nodes: 2,
+ },
+ tick: function(pixel) {
+ if (pixel.nCD) {
+ pixel.nCD -= 1;
+ if (pixel.nCD <= 0) {
+ // delete pixel.chargeCD;
+ pixel.nCD = undefined;
+ }
+ }
+ if (!isEmpty(pixel.x-1,pixel.y+1) && !isEmpty(pixel.x+1,pixel.y+1) && !isEmpty(pixel.x-1,pixel.y-1) && !isEmpty(pixel.x+1,pixel.y-1) && !isEmpty(pixel.x,pixel.y-1) && !isEmpty(pixel.x,pixel.y+1) && !isEmpty(pixel.x-1,pixel.y) && !isEmpty(pixel.x+1,pixel.y) && Math.random() > 0.5) {
+ pixel.radius = 0
+ pixel.nodes = 0
+ }
+ if ((isEmpty(pixel.x,pixel.y-1) || isEmpty(pixel.x,pixel.y+1) || isEmpty(pixel.x-1,pixel.y) || isEmpty(pixel.x+1,pixel.y)) && Math.random() > 0.5 && pixel.radius == 0 && pixel.nodes == 0) {
+ pixel.radius = 10
+ pixel.nodes = 1
+ }
+ if (isEmpty(pixel.x,pixel.y+1) && Math.random() > 0.9 && Math.random() > 0.9 && pixel.radius > 0 && pixel.nodes > 1 && pixel.nCD == undefined) {
+ createPixel("electric",pixel.x,pixel.y+1)
+ }
+ if (pixel.radius > 0 && pixel.nodes > 0 && pixel.nCD == undefined) {
+ 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 electric = pixelMap[coords[i].x][coords[i].y]
+ if (elements[electric.element].category == "nervous system" && Math.random() > 0.5 || electric.charge || electric.element == "scp_804" && electric.active == true || 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]
+ pixel.nodes--
+ electric2.nodes = 1
+ electric2.nCD = 10
+ pixel.nCD = 50
+ }
+ else 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]
+ pixel.nodes--
+ electric2.nodes = 1
+ electric2.nCD = 10
+ pixel.nCD = 50
+ }
+ else 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]
+ pixel.nodes--
+ electric2.nodes = 1
+ electric2.nCD = 10
+ pixel.nCD = 50
+ }
+ else 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]
+ pixel.nodes--
+ electric2.nodes = 1
+ electric2.nCD = 10
+ pixel.nCD = 50
+ }
+ else if (electric.x > pixel.x && (isEmpty(pixel.x+1,pixel.y) || Math.random() < (1-(elements[pixelMap[pixel.x+1][pixel.y].element].hardness || 0)) / 4)) {
+ if (!isEmpty(pixel.x+1,pixel.y)) {
+ deletePixel(pixel.x+1,pixel.y)
+ }
+ createPixel("scp_229",pixel.x+1,pixel.y)
+ var electric2 = pixelMap[pixel.x+1][pixel.y]
+ pixel.nodes--
+ electric2.nodes = 1
+ electric2.nCD = 10
+ pixel.nCD = 50
+ }
+ else if (electric.x < pixel.x && (isEmpty(pixel.x-1,pixel.y) || Math.random() < (1-(elements[pixelMap[pixel.x-1][pixel.y].element].hardness || 0)) / 4)) {
+ if (!isEmpty(pixel.x-1,pixel.y)) {
+ deletePixel(pixel.x-1,pixel.y)
+ }
+ createPixel("scp_229",pixel.x-1,pixel.y)
+ var electric2 = pixelMap[pixel.x-1][pixel.y]
+ pixel.nodes--
+ electric2.nodes = 1
+ electric2.nCD = 10
+ pixel.nCD = 50
+ }
+ else if (electric.y > pixel.y && (isEmpty(pixel.x,pixel.y+1) || Math.random() < (1-(elements[pixelMap[pixel.x][pixel.y+1].element].hardness || 0)) / 4)) {
+ if (!isEmpty(pixel.x,pixel.y+1)) {
+ deletePixel(pixel.x,pixel.y+1)
+ }
+ createPixel("scp_229",pixel.x,pixel.y+1)
+ var electric2 = pixelMap[pixel.x][pixel.y+1]
+ pixel.nodes--
+ electric2.nodes = 1
+ electric2.nCD = 10
+ pixel.nCD = 50
+ }
+ else if (electric.y < pixel.y && (isEmpty(pixel.x,pixel.y-1) || Math.random() < (1-(elements[pixelMap[pixel.x][pixel.y-1].element].hardness || 0)) / 4)) {
+ if (!isEmpty(pixel.x,pixel.y-1)) {
+ deletePixel(pixel.x,pixel.y-1)
+ }
+ createPixel("scp_229",pixel.x,pixel.y-1)
+ var electric2 = pixelMap[pixel.x][pixel.y-1]
+ pixel.nodes--
+ electric2.nodes = 1
+ electric2.nCD = 10
+ pixel.nCD = 50
+ }
+ }
+ }
+ }
+ }
+ 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) && pixel.nCD == undefined) {
+ var electric = pixelMap[x][y]
+ let old = electric.element;
+ if (electric.element == "brain" || electric.element == "scp_804" && electric.active == true || elements[electric.element].category == "nervous system" && Math.random() > 0.5 || electric.element == "fish" || electric.element == "frog" || electric.element == "rat" || electric.element == "bird" || electric.element == "head" || electric.element == "head_035" || electric.element == "head_1000" || electric.element == "head_008" || elements[electric.element].category == "machines" && Math.random() > 0.5 || electric.element == "battery" || electric.element == "electric" || electric.element == "lightning" || electric.element == "malware" || electric.element == "gray_goo") {
+ deletePixel(electric.x,electric.y)
+ createPixel("scp_229",electric.x,electric.y)
+ electric = pixelMap[electric.x][electric.y]
+ pixel.nodes--
+ electric.nCD = 10
+ pixel.nCD = 50
+ }
+ else if (electric.element == "glass" || electric.element == "rad_glass" || electric.element == "stained_glass") {
+ electric.element = "glass_shard"
+ pixel.nCD = 2
+ }
+ else if (electric.charge) {
+ deletePixel(electric.x,electric.y)
+ createPixel("scp_229",electric.x,electric.y)
+ electric = pixelMap[electric.x][electric.y]
+ if (Math.random() > 0.45) {
+ electric.nodes = 1
+ }
+ pixel.nodes--
+ electric.nCD = 15
+ pixel.nCD = 60
+ }
+ }
+ }
+ doDefaults(pixel)
+ },
+ movable: false,
+ excludeRandom: true,
+ state: "solid",
+ hidden: true,
+}
+
+elements.scp_236 = {
+ name: "SCP-236",
+ color: "#bc5a4c",
+ properties: {
+ mimic: "meat",
+ mimicColor: "#a0522d",
+ hide: false,
+ dir: 1,
+ },
+ tick: function(pixel) {
+ if (Math.random() < 0.2) {
+ pixel.dir = Math.random() < 0.5 ? 1 : -1
+ }
+ if (pixel.hide == true) {
+ if (pixel.color != pixel.mimicColor) {
+ pixel.color = pixel.mimicColor
+ }
+ 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)) {
+ var pixel2 = pixelMap[x][y]
+ let old = pixel2.element;
+ if (Math.random() < 0.0125 && (elements[pixel2.element].category == "life" || elements[pixel2.element].category == "food" || pixel2.element == "wood" || pixel2.element == "straw" || pixel2.element == "paper" || pixel2.element == "cloth" || pixel2.element == "sponge" || pixel2.element == "bamboo" || pixel2.element == "amber" || pixel2.element == "skin" || pixel2.element == "particleboard" || pixel2.element == "hair" || pixel2.element == "udder")) {
+ if (Math.random() < (1-(elements[pixel2.element].hardness || 0)) / 4 || Math.random() > 0.5) {
+ pixel2.mimic = pixel2.element
+ pixel2.mimicColor = pixel2.color
+ pixel2.element = "scp_236"
+ pixel2.hide = true
+ pixel2.dir = pixel.dir
+ }
+ }
+ else if (pixel2.element == "scp_236" && pixel2.hide != true && Math.random() > 0.75 && (pixel2.awakeStart + 5) < pixelTicks) {
+ pixel2.hide = true
+ }
+ }
+ }
+ if (Math.random() < 0.75) {
+ let y = Math.random() < 0.5 ? 0 : -1;
+ let xDir = Math.random() < 0.5 ? 1 : -1;
+ for (let x = 1; x < 10; x++) {
+ let x2 = pixel.x+(x*xDir);
+ let y2 = pixel.y+y;
+ if (!isEmpty(x2,y2,true) && !outOfBounds(x2,y2)) {
+ let seenPixel = pixelMap[x2][y2];
+ if (elements[seenPixel.element].id == elements.head.id || elements[seenPixel.element].id == elements.body.id || elements[seenPixel.element].id == elements.light.id) {
+ pixel.hide = false
+ }
+ break;
+ }
+ }
+ }
+ if (elements[pixel.mimic].movable == true || (isEmpty(pixel.x,pixel.y-4) || isEmpty(pixel.x,pixel.y-3) || isEmpty(pixel.x,pixel.y-2) || isEmpty(pixel.x,pixel.y-1)) && (isEmpty(pixel.x+1,pixel.y) && isEmpty(pixel.x-1,pixel.y) || isEmpty(pixel.x-2,pixel.y) && isEmpty(pixel.x+2,pixel.y) || isEmpty(pixel.x-1,pixel.y) && isEmpty(pixel.x-2,pixel.y) && isEmpty(pixel.x+1,pixel.y) && isEmpty(pixel.x+2,pixel.y))) {
+ tryMove(pixel,pixel.x,pixel.y+1)
+ }
+ }
+ if (pixel.hide != true) {
+ if (!pixel.awakeStart) {
+ pixel.awakeStart = pixelTicks
+ }
+ if (pixel.color == pixel.mimicColor) {
+ pixel.color = pixelColorPick(pixel,"#bc5a4c")
+ }
+ 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)) {
+ var pixel2 = pixelMap[x][y]
+ let old = pixel2.element;
+ if ((elements[pixel2.element].category == "life" || elements[pixel2.element].category == "food") && Math.random() < 0.025) {
+ if (Math.random() < (1-(elements[pixel2.element].hardness || 0)) / 4 || Math.random() > 0.5) {
+ pixel2.mimic = pixel2.element
+ pixel2.mimicColor = pixel2.color
+ pixel2.element = "scp_236"
+ pixel2.hide = false
+ pixel2.dir = pixel.dir
+ }
+ }
+ else if (elements[pixel2.element].isFood == true && Math.random() < 0.025) {
+ deletePixel(pixel2.x,pixel2.y)
+ }
+ else if (pixel2.element == "scp_236" && pixel2.hide == true && Math.random() > 0.85) {
+ pixel2.hide = false
+ }
+ }
+ }
+ if (elements[pixel.mimic].movable != true && Math.random() > 0.75 && !tryMove(pixel,pixel.x,pixel.y+1) || elements[pixel.mimic].movable == true && !tryMove(pixel,pixel.x,pixel.y+1)) {
+ if (!tryMove(pixel,pixel.x+pixel.dir,pixel.y)) {
+ let ydir = Math.random() < 0.5 ? 1 : -1
+ tryMove(pixel,pixel.x+pixel.dir,pixel.y+ydir)
+ }
+ }
+ if (Math.random() < 0.05 && (pixel.awakeStart + 100) < pixelTicks) {
+ delete pixel.awakeStart
+ pixel.hide = true
+ }
+ }
+ },
+ temp: 20,
+ tempHigh: 250,
+ stateHigh: "meat",
+ onStateHigh(pixel) {
+ if (Math.random() < 0.9) {
+ changePixel(pixel, pixel.mimic)
+ }
+ else {
+ explodeAt(pixel.x,pixel.y,5,"fire")
+ }
+ },
+ tempLow: -30,
+ stateLow: "meat",
+ onStateLow(pixel) {
+ changePixel(pixel, pixel.mimic)
+ },
+ category:"scp",
+ hardness: 0.15,
+ onBreak(pixel) {
+ if (Math.random() < 0.9) {
+ changePixel(pixel, pixel.mimic)
+ }
+ else {
+ explodeAt(pixel.x,pixel.y,5,"fire")
+ }
+ },
+ state: "solid",
+ density: 963.7,
+ conduct: 0.2,
+}
+
+elements.scp_391 = {
+ name: "SCP-391",
+ color: ["#D7D0CA","#D7BFB5","#B49171","#986536","#B49171","#623613"],
+ properties: { "phase": 2, "rising":0 },
+ tick: function(pixel) {
+ if (Math.random() < 0.0000035 && isEmpty(pixel.x,pixel.y+1)) {
+ createPixel("diamond",pixel.x,pixel.y+1);
+ }
+ var newX = pixel.x;
+ var newY = pixel.y;
+ if (pixel.phase === 1) { // Landing
+ newX += pixel.flipX ? -1 : 1;
+ newY += Math.random() < 0.5 ? 0 : 1;
+ if (!tryMove(pixel, newX, newY)) {
+ if (outOfBounds(newX, newY)) { pixel.phase = 0 }
+ else {
+ var newPixel = pixelMap[newX][newY];
+ if (elements[newPixel.element].state !== "solid") { pixel.phase = 3; }
+ else if (newPixel.element === "bird") {
+ pixel.phase = 3;
+ newPixel.phase = 3;
+ }
+ else { pixel.phase = 0; }
+ }
+ } // Stop landing
+ }
+ else if (pixel.phase === 2) { // Gliding
+ newX += pixel.flipX ? -1 : 1;
+ newY += Math.random() < 0.9 ? 0 : 1;
+ if (Math.random() < 0.025) { pixel.phase = 1 } // Start landing
+ if (!tryMove(pixel, newX, newY)) {
+ pixel.flipX = !pixel.flipX;
+ if (!outOfBounds(newX, newY) && pixelMap[newX][newY].element !== "bird") {
+ pixel.phase = 3;
+ }
+ }
+ }
+ else if (pixel.phase === 0) { // Standing
+ if (Math.random() < 0.05) { newX += pixel.flipX ? -1 : 1; }
+ newY ++;
+ if (Math.random() < 0.02) { pixel.phase = 3 } // Start rising
+ if (!tryMove(pixel, newX, newY)) {
+ if (!outOfBounds(newX, newY) && pixelMap[newX][newY].element === "bird") {
+ pixel.phase = 3;
+ pixelMap[newX][newY].phase = 3;
+ }
+ }
+ }
+ else if (pixel.phase === 3) { // Rising
+ newX += pixel.flipX ? -1 : 1;
+ newY --;
+ if (!tryMove(pixel, newX, newY) || (pixel.rising > 5 && Math.random() < 0.05)) { pixel.phase = 2; pixel.rising = 0; } // Start gliding
+ else { pixel.rising ++; }
+ }
+ doHeat(pixel);
+ doElectricity(pixel);
+ doBurning(pixel);
+ },
+ flippableX: true,
+ reactions: {
+ "rat": { elem2:null, chance:0.25, func:behaviors.FEEDPIXEL },
+ "bird": { elem2:null, chance:0.125, func:behaviors.FEEDPIXEL },
+ "meat": { elem2:null, chance:0.125, func:behaviors.FEEDPIXEL },
+ "cured_meat": { elem2:null, chance:0.05, func:behaviors.FEEDPIXEL },
+ "cooked_meat": { elem2:null, chance:0.05, func:behaviors.FEEDPIXEL },
+ "fly": { elem2:null, chance:0.0625, func:behaviors.FEEDPIXEL },
+ "firefly": { elem2:null, chance:0.075, func:behaviors.FEEDPIXEL },
+ "bee": { elem2:null, chance:0.00625, func:behaviors.FEEDPIXEL },
+ "worm": { elem2:null, chance:0.0625, func:behaviors.FEEDPIXEL },
+ "ant": { elem2:null, chance:0.00625, func:behaviors.FEEDPIXEL },
+ "stink_bug": { elem2:"stench", chance:0.00625, func:behaviors.FEEDPIXEL },
+ "dead_bug": { elem2:null, chance:0.005, func:behaviors.FEEDPIXEL },
+ "spider": { elem2:null, chance:0.025, func:behaviors.FEEDPIXEL },
+ "web": { elem2:null, chance:0.05 },
+ "plague": { elem1:"plague", chance:0.0225 },
+ "oxygen": { elem2:"carbon_dioxide", chance:0.5 }
+ },
+ foodNeed: 5,
+ egg: "gold_coin",
+ temp: 41,
+ tempHigh: 120,
+ stateHigh: "cooked_meat",
+ stateHighColor: "#E4CFB9",
+ tempLow: -18,
+ stateLow: "frozen_meat",
+ category:"scp",
+ burn:2,
+ burnTime:100,
+ breakInto: ["feather","blood","feather","blood","feather","blood","feather","blood","feather","blood","diamond","gold_coin","gold_coin","feather","blood","feather","blood","feather","blood","feather","blood","feather","blood","feather","blood","gold_coin","feather","blood","feather","blood","feather","blood","feather","blood","feather","blood","feather","blood","gold_coin",],
+ state: "solid",
+ density: 400,
+ cooldown: defaultCooldown,
+ conduct: 0.5
+}
+
+if (!elements.magma.reactions) { elements.magma.reactions = {}; }
+elements.magma.reactions.molten_quartz = { elem1:"molten_granite", elem2:"molten_granite"}
+
+elements.molten_granite = {
+ color: ['#ffd956', '#ffae56', '#ff8200', '#ffff70', '#ffff70', '#ffa000', '#ff7e24', '#ff5e00'],
+ reactions: {
+ "molten_slag": { elem2:"molten_granite", chance:0.22 },
+ "molten_quartz": { elem2:"molten_granite", chance:0.66 },
+ "magma": { elem2:"molten_granite", chance:0.66 },
+ },
+ grain: 0.25
},
-elements.SCP_682 = {
+elements.granite = {
+ color: ["#F5EDF8","#8B8381","#B8AEAC","#DCD6E0","#847E7E","#1B1A1E","#F5EDF8","#8B8381","#B8AEAC","#DCD6E0","#847E7E"],
+ grain: 1.25,
+ behavior: behaviors.WALL,
+ tempHigh: 1237.5,
+ category: "land",
+ state: "solid",
+ density: 2700,
+ hardness: 0.4,
+ breakInto: ["rock","sand"],
+ breakIntoColor: ["#DCD6E0","#b1aba3","#8B8381","#DCD6E0","#b1aba3","#F5EDF8","#DCD6E0","#b1aba3","#8B8381","#DCD6E0","#b1aba3","#F5EDF8","#1B1A1E"],
+}
+
+elements.quartz = {
+ color: ["#EEF0EF","#ECEEED"],
+ behavior: behaviors.WALL,
+ canPlace: true,
+ grain: 0.1,
+ reactions: {
+ },
+ tempHigh: 1650,
+ hardness: 0.07,
+ breakInto: "quartz_crystal",
+ density: 2650,
+ state: "solid",
+ category:"solids",
+}
+
+elements.quartz_crystal = {
+ color: ["#EEF0EF","#ECEEED","#F3F3F3"],
+ behavior: behaviors.POWDER,
+ canPlace: true,
+ reactions: {
+ },
+ tempHigh: 1650,
+ stateHigh: "molten_quartz",
+ density: 2650,
+ state: "solid",
+ category:"powders",
+ hidden: true
+}
+
+elements.scp_409 = {
+ name: "SCP-409",
+ color: ["#EEF0EF","#ECEEED"],
+ grain: 0.5,
+ tick: function(pixel) {
+ if (pixel.start === pixelTicks) {return}
+ if (pixel.charge && elements[pixel.element].behaviorOn) {
+ pixelTick(pixel);
+ return;
+ }
+ if (!tryMove(pixel, pixel.x, pixel.y+1)) {
+ if (Math.random() < 0.5) {
+ if (!tryMove(pixel, pixel.x+1, pixel.y+1)) {
+ tryMove(pixel, pixel.x-1, pixel.y+1);
+ }
+ } else if (!tryMove(pixel, pixel.x-1, pixel.y+1)) {
+ tryMove(pixel, pixel.x+1, pixel.y+1);
+ }
+ }
+ doDefaults(pixel);
+ if (!isEmpty(pixel.x,pixel.y-1) && !outOfBounds(pixel.x,pixel.y-1)) {
+ if (elements[pixelMap[pixel.x][pixel.y-1].element].state != "liquid" && elements[pixelMap[pixel.x][pixel.y-1].element].state != "gas") {
+ tryMove(pixel,pixel.x,pixel.y-1)
+ }
+ }
+ },
+ onCollide: function(pixelOG,pixel) {
+ if (elements[pixel.element].id === elements.scp_409.id) { return; }
+ if (elements.scp_409.ignore.indexOf(pixel.element) !== -1) return;
+ if (Math.random() < (elements[pixel.element].hardness || 0.25)) { return; }
+ if (elements[pixel.element].state !== "liquid" && elements[pixel.element].state !== "gas" && Math.random() > 0.1) {
+ if (elements[pixel.element].category !== "life" && elements[pixel.element].category !== "food" && pixel.element !== "wood" && pixel.element !== "bamboo" && pixel.element !== "skin" && Math.random() > 0.75) {
+ if (Math.random() < 0.85) {
+ changePixel(pixel,"quartz_crystal")
+ }
+ else if (Math.random() < 0.5 && elements[pixel.element].movable == false) {
+ changePixel(pixel,"quartz")
+ }
+ else {
+ changePixel(pixel,"scp_409")
+ }
+ }
+ else if (Math.random() > 0.75) {
+ changePixel(pixel,"scp_409")
+ if (Math.random() > 0.95) {
+ explodeAt(pixel.x,pixel.y,10,["scp_409","quartz_crystal","quartz_crystal","quartz_crystal",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null])
+ }
+ }
+ }
+ },
+ ignore: ["granite","quartz","quartz_crystal","magma","molten_glass","molten_quartz","molten_granite"],
+ canPlace: true,
+ reactions: {
+ },
+ density: 2650,
+ state: "solid",
+ category:"scp",
+ cooldown: defaultCooldown,
+}
+
+elements.scp_457 = {
+ name: "SCP-457",
+ color: "#000000",
+ buttonColor: ["#ff6b21","#ffa600","#ff4000","#000000","#000000","#000000","#ff6b21","#ffa600","#ff4000"],
+ category: "scp",
+ properties: {
+ dead: false,
+ dir: 1,
+ panic: 0,
+ },
+ onPlace: function(pixel) {
+ if (isEmpty(pixel.x, pixel.y+1)) {
+ createPixel("body_457", pixel.x, pixel.y+1);
+ var color = pixel.color;
+ changePixel(pixel,"head_457");
+ pixel.color = color;
+ pixel.alpha = 0;
+ }
+ else if (isEmpty(pixel.x, pixel.y-1)) {
+ createPixel("head_457", pixel.x, pixel.y-1);
+ pixelMap[pixel.x][pixel.y-1].color = pixel.color;
+ pixelMap[pixel.x][pixel.y-1].alpha = 0;
+ changePixel(pixel,"body_457");
+ }
+ else {
+ deletePixel(pixel.x, pixel.y);
+ }
+ },
+ reactions: {
+ "steam": { attr1:{panic:50} },
+ "water": { attr1:{panic:50} },
+ "ice": { attr1:{panic:50} },
+ "salt_water": { attr1:{panic:50} },
+ "sugar_water": { attr1:{panic:50} },
+ "seltzer": { attr1:{panic:50} },
+ "foam": { attr1:{panic:50} },
+ "pool_water": { attr1:{panic:50} },
+ "dirty_water": { attr1:{panic:50} },
+ "cold_fire": { attr1:{panic:50} },
+ },
+ related: ["body","head"],
+ cooldown: defaultCooldown,
+ forceSaveColor: true,
+}
+
+elements.body_457 = {
+ name: "SCP-457",
+ color: "#000000",
+ tempLow:-50,
+ stateLow: "smoke",
+ tempHigh: 7000,
+ stateHigh: "plasma",
+ category: "scp",
+ hidden: true,
+ density: 1080,
+ state: "solid",
+ conduct: .05,
+ temp: 600,
+ forceSaveColor: true,
+ pickElement: "scp_457",
+ reactions: {
+ "ash": { elem2:[null,"smoke"], chance:0.05 },
+ "glass": { elem2:"glass_shard", chance:0.05 },
+ "rad_glass": { elem2:"rad_shard", chance:0.05 },
+ "stained_glass": { elem2:"color_sand", chance:0.05 },
+ },
+ properties: {
+ dead: false,
+ dir: 1,
+ panic: 0,
+ fuel: 500,
+ alpha: 0,
+ },
+ renderer: function(pixel,ctx) {
+ drawDefault(ctx,pixel);
+ if (!viewInfo[view].colorEffects) { return }
+ if (pixel.fuel > 1) {
+ drawPlus(ctx,"#ff6b21",pixel.x,pixel.y,undefined,Math.min(1,pixel.fuel/8));
+ drawPlus(ctx,"#ffa600",pixel.x,pixel.y-1,undefined,Math.min(1,pixel.fuel/9));
+ }
+ drawSquare(ctx,settings.bg,pixel.x,pixel.y);
+ drawSquare(ctx,settings.bg,pixel.x,pixel.y-1);
+ },
+ 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 === "head_457") {
+ 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 || pixel.fuel < 0) {
+ if (pixelTicks-pixel.dead > 200 && Math.random() < 0.1) {
+ changePixel(pixel,"fire");
+ changePixel(pixelMap[pixel.x][pixel.y-1],"fire");
+ }
+ return
+ }
+
+ if (Math.random() > 0.8 && Math.random() > 0.8) {
+ if (isEmpty(pixel.x, pixel.y-2) && Math.random() > 0.8) {
+ releaseElement(pixelMap[pixel.x][pixel.y-1],"fire")
+ }
+ pixel.fuel--
+ }
+
+ if (pixel.fuel > 1000) {
+ if ((isEmpty(pixel.x, pixel.y-2) || isEmpty(pixel.x-1, pixel.y-2) || isEmpty(pixel.x+1, pixel.y)) && Math.random() > 0.8) {
+ releaseElement(pixel,"scp_457",1,true)
+ pixel.fuel = 500
+ }
+ }
+
+ // Find the head
+ if (!isEmpty(pixel.x, pixel.y-1, true) && pixelMap[pixel.x][pixel.y-1].element == "head_457") {
+ var head = pixelMap[pixel.x][pixel.y-1];
+ if (head.dead) { // If head is dead, kill body
+ pixel.dead = head.dead;
+ }
+ else if (head.panic > 0) {
+ pixel.panic = head.panic;
+ delete head.panic;
+ }
+ if (head.fuel != 0 && head.fuel > 0) {
+ pixel.fuel += head.fuel;
+ head.fuel = 0;
+ }
+ }
+ else { var head = null }
+ if (head && Math.random() < 0.25) {
+ let y = Math.random() < 0.5 ? 0 : -1;
+ for (let x = 1; x < 10; x++) {
+ let x2 = pixel.x+(x*pixel.dir);
+ let y2 = pixel.y+y;
+ if (!isEmpty(x2,y2,true)) {
+ let seenPixel = pixelMap[x2][y2];
+ if (elements.scp_457.reactions[seenPixel.element] && elements.scp_457.reactions[seenPixel.element].attr1 && elements.scp_457.reactions[seenPixel.element].attr1.panic) {
+ pixel.panic += elements.scp_457.reactions[seenPixel.element].attr1.panic;
+ pixel.dir *= -1;
+ break;
+ }
+ else if (elements[seenPixel.element].extinguish == true) {
+ pixel.panic += 5;
+ pixel.dir *= -1;
+ break;
+ }
+ else if (seenPixel.temp < 5) {
+ pixel.panic += 5;
+ pixel.dir *= -1;
+ break;
+ }
+ }
+ }
+ }
+ if (!pixel.dead && Math.random() < 0.75) {
+ shuffleArray(squareCoordsShuffle);
+ for (var i = 0; i < squareCoordsShuffle.length; i++) {
+ var x = pixel.x+squareCoordsShuffle[i][0];
+ var y = pixel.y+squareCoordsShuffle[i][1];
+ if (!isEmpty(x,y,true) && elements[pixelMap[x][y].element].burnTime && pixelMap[x][y].element != "fire") {
+ var fuel = elements[pixelMap[x][y].element].burnTime
+ if (elements[pixelMap[x][y].element].burnInto && Math.random() > 0.5) {
+ if (elements[pixelMap[x][y].element].burnInto instanceof Array) {
+ var burnInto = elements[pixelMap[x][y].element].burnInto[Math.floor(Math.random()*elements[pixelMap[x][y].element].burnInto.length)];
+ }
+ else {
+ var burnInto = elements[pixelMap[x][y].element].burnInto
+ }
+ if (burnInto == undefined) {
+ changePixel(pixelMap[x][y],"fire");
+ }
+ else {
+ changePixel(pixelMap[x][y],burnInto)
+ }
+ }
+ else {
+ changePixel(pixelMap[x][y],"fire");
+ }
+ pixel.fuel += fuel
+ break;
+ }
+ }
+ }
+ if (pixel.fuel < 20) {
+ pixel.panic += 10;
+ }
+ else if (pixel.panic > 0) {
+ pixel.panic -= 1;
+ if (pixel.panic < 0) { pixel.panic = 0; }
+ else if (pixel.panic > 500) { pixel.panic = 500; }
+ }
+
+ if (isEmpty(pixel.x, pixel.y-1)) {
+ // create blood if decapitated 10% chance
+ if (Math.random() < 0.1 && !pixel.charge) {
+ createPixel("fire", pixel.x, pixel.y-1);
+ // set dead to true 15% chance
+ 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;
+ }
+ }
+ }
+ // 15% chance to change direction
+ if (Math.random() < 0.15 || !moved) {
+ pixel.dir *= -1;
+ }
+ // homeostasis
+ if (pixel.temp < 600) {
+ pixel.temp += 10;
+ pixel.fuel--
+ }
+ else if (pixel.temp > 2000) {
+ pixel.temp -= 10;
+ pixel.fuel++
+ }
+ }
+ },
+ onCollide: function(pixel1,pixel2) {
+ if (elements[pixel2.element].extinguish == true) {
+ if (Math.random() < 0.9) {
+ pixel1.fuel--
+ if (Math.random() < 0.25) {
+ deletePixel(pixel2.x,pixel2.y)
+ }
+ }
+ }
+ }
+}
+
+elements.head_457 = {
+ name: "SCP-457",
+ tempLow:-50,
+ stateLow: "smoke",
+ tempHigh: 7000,
+ stateHigh: "plasma",
+ color: "#000000",
+ category: "scp",
+ hidden: true,
+ density: 1080,
+ state: "solid",
+ conduct: .05,
+ temp: 600,
+ forceSaveColor: true,
+ pickElement: "scp_457",
+ reactions: {
+ "water": { elem1:["fire","smoke"], chance:0.00025 },
+ "ash": { elem2:[null,"smoke"], chance:0.5 },
+ "glass": { elem2:"glass_shard", chance:0.05 },
+ "rad_glass": { elem2:"rad_shard", chance:0.05 },
+ "stained_glass": { elem2:"color_sand", chance:0.05 },
+ },
+ properties: {
+ dead: false,
+ fuel: 0,
+ alpha: 0,
+ },
+ 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) {
+ changePixel(pixel,"fire");
+ return
+ }
+ }
+
+ // Find the body
+ if (!isEmpty(pixel.x, pixel.y+1, true) && pixelMap[pixel.x][pixel.y+1].element == "body_457") {
+ 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_457") {
+ pixel.dead = pixelTicks
+ }
+ 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].burnTime && pixelMap[x][y].element != "fire" && Math.random() > 0.75) {
+ var fuel = elements[pixelMap[x][y].element].burnTime
+ if (elements[pixelMap[x][y].element].burnInto && elements[pixelMap[x][y].element].burnInto != undefined && Math.random() > 0.75) {
+ if (elements[pixelMap[x][y].element].burnInto instanceof Array) {
+ var burnInto = elements[pixelMap[x][y].element].burnInto[Math.floor(Math.random()*elements[pixelMap[x][y].element].burnInto.length)];
+ }
+ else {
+ var burnInto = elements[pixelMap[x][y].element].burnInto
+ }
+ if (burnInto == undefined) {
+ changePixel(pixelMap[x][y],"fire");
+ }
+ else {
+ changePixel(pixelMap[x][y],burnInto)
+ }
+ }
+ else {
+ changePixel(pixelMap[x][y],"fire");
+ }
+ pixel.fuel += fuel
+ 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.1 && !pixel.charge) {
+ createPixel("fire", pixel.x, pixel.y+1);
+ // set dead to true 15% chance
+ if (Math.random() < 0.15) {
+ pixel.dead = pixelTicks;
+ }
+ }
+ }
+ if (isEmpty(pixel.x, pixel.y+1) && !pixel.dead || !isEmpty(pixel.x, pixel.y+1, true) && pixelMap[pixel.x][pixel.y+1].element != "body_457") {
+ if (Math.random() < 0.15) {
+ pixel.dead = pixelTicks;
+ }
+ }
+ },
+ onCollide: function(pixel1,pixel2) {
+ if (elements[pixel2.element].extinguish == true) {
+ if (Math.random() < 0.0025) {
+ pixel1.dead = true
+ }
+ }
+ }
+}
+
+elements.scp_682 = {
+ name: "SCP-682",
color: ["#424242","#75816B","#4D6B53"],
- behavior: [
- "M2%0.5|M2%0.3|M2%0.5",
- "M2%10|XX|M2%10",
- "XX|M1|XX",
- ],
+ onChange: function(pixel) {
+ var x = Math.floor(Math.random()*(width))+1;
+ var y = Math.floor(Math.random()*(height))+1;
+ if (isEmpty(x,y)) {
+ createPixel("scp_682",x,y)
+ }
+ else if (!isEmpty(x,y) && !outOfBounds(x,y) && pixelMap[x][y].element != "scp_682") {
+ changePixel(pixelMap[x][y], "scp_682")
+ }
+ },
+ onDelete: function(pixel) {
+ var x = Math.floor(Math.random()*(width))+1;
+ var y = Math.floor(Math.random()*(height))+1;
+ if (isEmpty(x,y)) {
+ createPixel("scp_682",x,y)
+ }
+ else if (!isEmpty(x,y) && !outOfBounds(x,y)) {
+ changePixel(pixelMap[x][y], "scp_682")
+ }
+ },
+ properties: {
+ h: 1,
+ dir: 1,
+ },
+ tick: function(pixel) {
+ if (pixel.h == 1) {
+ if (tryMove(pixel, pixel.x, pixel.y+1)) {} // Fall
+ doDefaults(pixel);
+ if (Math.random() < 0.5) { // Move 50% 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])) {
+ 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) {
+ moved = true;
+ break;
+ }
+ }
+ }
+ // 15% chance to change direction
+ if (Math.random() < 0.15 || !moved) {
+ pixel.dir *= -1;
+ }
+ }
+ if (Math.random() < 0.95) {
+ let y = Math.random() < 0.5 ? 0 : -1;
+ let xDir = Math.random() < 0.5 ? 1 : -1;
+ for (let x = 1; x < 50; x++) {
+ let x2 = pixel.x+(x*xDir);
+ let y2 = pixel.y+y;
+ if (!isEmpty(x2,y2,true) && !outOfBounds(x2,y2)) {
+ let seenPixel = pixelMap[x2][y2];
+ if (elements[seenPixel.element].id == elements.head.id || elements[seenPixel.element].id == elements.body.id) {
+ pixel.h = 3
+ break;
+ }
+ }
+ }
+ }
+ for (var i = 0; i < squareCoords.length; i++) {
+ var coords = squareCoords[i];
+ var x = pixel.x + coords[0];
+ var y = pixel.y + coords[1];
+ if (!isEmpty(x,y) && !outOfBounds(x,y)) {
+ var pixel2 = pixelMap[x][y]
+ let old = pixel2.element;
+ if (isBreakable(pixel2) && (elements[pixel2.element].category == "life" || elements[pixel2.element].category == "food")) {
+ // times 0.25 if not shiftDown else 1
+ if (Math.random() < (1-(elements[pixel2.element].hardness || 0)) / 4 && Math.random() > 0.5) {
+ breakPixel(pixel2);
+ }
+ // 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 && Math.random() > 0.75 && (elements[pixel2.element].category == "life" || elements[pixel2.element].category == "food")) {
+ 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;
+ tryMove(pixel2,pixel2.x+x,pixel2.y+y)
+ }
+ if (elements[pixel2.element].isFood == true) {
+ if (Math.random() < (1-(elements[pixel2.element].hardness || 0)) / 4 || Math.random() > 0.5) {
+ deletePixel(pixel2.x,pixel2.y)
+ }
+ }
+ }
+ }
+ for (var i = 0; i < destroyCoords.length; i++) {
+ var coords = destroyCoords[i];
+ var x = pixel.x + coords[0];
+ var y = pixel.y + coords[1];
+ if (!isEmpty(x,y) && !outOfBounds(x,y)) {
+ var pixel2 = pixelMap[x][y]
+ let old = pixel2.element;
+ if (old === pixel2.element && elements[pixel2.element].movable && !isEmpty(pixel2.x,pixel2.y+1) && !paused && Math.random() > 0.95) {
+ 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;
+ tryMove(pixel2,pixel2.x+x,pixel2.y+y)
+ }
+ if (elements[pixel2.element].isFood == true) {
+ if (Math.random() < (1-(elements[pixel2.element].hardness || 0)) / 4 || Math.random() > 0.5) {
+ deletePixel(pixel2.x,pixel2.y)
+ }
+ }
+ }
+ }
+ }
+ else if (pixel.h == 2) {
+ if (!pixel.hStart) {
+ pixel.hStart = pixelTicks
+ }
+ if (tryMove(pixel, pixel.x, pixel.y+1)) {} // Fall
+ doDefaults(pixel);
+ if (Math.random() < 0.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])) {
+ 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) {
+ moved = true;
+ break;
+ }
+ }
+ }
+ // 15% chance to change direction
+ if (Math.random() < 0.15 || !moved) {
+ pixel.dir *= -1;
+ }
+ }
+ if (Math.random() < 0.05 && (pixel.hStart + 500) < pixelTicks) {
+ pixel.h = 3
+ delete pixel.hStart
+ }
+ if (Math.random() < 0.25) {
+ let y = Math.random() < 0.5 ? 0 : -1;
+ for (let x = 1; x < 15; x++) {
+ let x2 = pixel.x+(x*pixel.dir);
+ let y2 = pixel.y+y;
+ if (!isEmpty(x2,y2,true) && !outOfBounds(x2,y2)) {
+ let seenPixel = pixelMap[x2][y2];
+ if (elements[seenPixel.element].id == elements.head.id || elements[seenPixel.element].id == elements.body.id) {
+ pixel.h = 3
+ break;
+ }
+ else if (elements[seenPixel.element].category == "life" && Math.random() > 0.995) {
+ pixel.h = 1
+ break;
+ }
+ }
+ }
+ }
+ for (var i = 0; i < destroyCoords.length; i++) {
+ var coords = destroyCoords[i];
+ var x = pixel.x + coords[0];
+ var y = pixel.y + coords[1];
+ if (!isEmpty(x,y) && !outOfBounds(x,y)) {
+ var pixel2 = pixelMap[x][y]
+ let old = pixel2.element;
+ if (elements[pixel2.element].isFood == true) {
+ if (Math.random() < (1-(elements[pixel2.element].hardness || 0)) / 4 || Math.random() > 0.5) {
+ deletePixel(pixel2.x,pixel2.y)
+ }
+ }
+ }
+ }
+ }
+ else {
+ if (tryMove(pixel, pixel.x, pixel.y+1)) {} // Fall
+ doDefaults(pixel);
+ if (Math.random() < 0.9) { // Move 90% 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])) {
+ 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) {
+ moved = true;
+ break;
+ }
+ else if (Math.random() > 0.25) {
+ tryMove(pixel, pixel.x, pixel.y-1);
+ break;
+ }
+ }
+ }
+ // 5% chance to change direction
+ if (Math.random() < 0.05 || !moved) {
+ pixel.dir *= -1;
+ }
+ }
+ if (Math.random() < 0.95) {
+ let y = Math.random() < 0.5 ? 0 : -1;
+ let xDir = Math.random() < 0.5 ? 1 : -1;
+ for (let x = 1; x < 55; x++) {
+ let x2 = pixel.x+(x*xDir);
+ let y2 = pixel.y+y;
+ if (!isEmpty(x2,y2,true) && !outOfBounds(x2,y2)) {
+ let seenPixel = pixelMap[x2][y2];
+ if (elements[seenPixel.element].id == elements.head.id || elements[seenPixel.element].id == elements.body.id) {
+ if (pixel.dir != 1 && seenPixel.x > pixel.x) {
+ pixel.dir = 1
+ }
+ else if (pixel.dir != -1 && seenPixel.x < pixel.x) {
+ pixel.dir = -1
+ }
+ break;
+ }
+ else if (elements[seenPixel.element].category == "life" && Math.random() > 0.995) {
+ if (pixel.dir != 1 && seenPixel.x > pixel.x) {
+ pixel.dir = 1
+ }
+ else if (pixel.dir != -1 && seenPixel.x < pixel.x) {
+ pixel.dir = -1
+ }
+ break;
+ }
+ }
+ }
+ }
+ for (var i = 0; i < destroyCoords.length; i++) {
+ var coords = destroyCoords[i];
+ var x = pixel.x + coords[0];
+ var y = pixel.y + coords[1];
+ if (!isEmpty(x,y) && !outOfBounds(x,y)) {
+ var pixel2 = pixelMap[x][y]
+ let old = pixel2.element;
+ if (isBreakable(pixel2)) {
+ // times 0.25 if not shiftDown else 1
+ if (Math.random() < (1.5-(elements[pixel.element].hardness || 0)) && Math.random() > 0.5) {
+ breakPixel(pixel2);
+ }
+ // if (Math.random() > ((1-(elements[pixel.element].hardness || 1)) * (shiftDown ? 0.5 : 1))) {
+ }
+ else if (old === pixel.element && elements[pixel.element].movable && !isEmpty(pixel.x,pixel.y+1) && !paused && Math.random() > 0.75) {
+ 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;
+ tryMove(pixel2,pixel2.x+x,pixel2.y+y)
+ }
+ }
+ }
+ if (Math.random() < 0.015) {
+ pixel.h = 1
+ }
+ }
+ },
category: "scp",
density: 7500,
reactions: {
- "head": { elem2 : ["bone","blood",null] , chance:50 },
- "body": { elem1 : "mad_682" , elem2 : ["meat","blood",null] , chance:50 },
- "z_head": { elem2 : ["infection","infection","infection","bone",null] , chance:50 },
- "z_body": { elem1 : "mad_682" , elem2: ["infection","infection","rotten_meat","bone",null] , chance:50 },
- "homunculus": { elem2 : ["slime","blood",null] , chance:10 },
- "rat": { elem2: ["infection","infection","plague"] },
- "frog": { elem2 : ["slime","blood",null] , chance:10 },
- "bird": { elem2 : ["feather","blood",null] , chance:10 },
- "meat": { elem2 : null , chance:0.2 },
- "cooked_meat": { elem2 : null , chance:0.3 },
- "tickle_monster": { elem1 : "calm_682" , chance:0.1 },
- "acid": { elem1 : "calm_682" , chance:0.2 },
- "rotten_meat": { elem2 : null , chance:0.1 },
- "blood": { elem2 : null , chance:0.2 },
- "bone": { elem2 : ["blood",null,null] , chance:0.1 },
- "bone_marrow": { elem2 : ["blood",null] , chance:0.1 },
- "aluminum": { elem2 : "metal_scrap" , chance:0.07 },
- "steel": { elem2 : "metal_scrap" , chance:0.05 },
- "iron": { elem2 : "metal_scrap" , chance:0.08 },
- "glass": { elem2 : "glass_shard" , chance:0.1 },
- "wood": { elem2 : "sawdust" , chance:0.1 },
- "concrete": { elem2 : "dust" , chance:0.05 },
- "dust": { elem2 : null , chance:0.1 },
+ "head": { attr1:{h:3}, elem2:["blood","meat","bone"],},
+ "body": { attr1:{h:3}, elem2:["blood","meat","bone"], },
+ "neutral_acid": { attr1:{h:2}, elem2:null, chance: 0.5 },
+ "acid": { attr1:{h:2}, elem2:[null,"acid","acid","acid","acid","acid","acid","acid","acid","acid","acid","acid","acid","acid","neutral_acid","neutral_acid"], chance: 0.5 },
+ "grass": { elem2: "dead_plant", chance:0.2 },
+ "plant": { elem2: "dead_plant", chance:0.2 },
+ "dead_plant": { elem2: null, chance:0.2 },
+ "dna": { elem2: null, chance:0.2 },
+ "meat": { elem2: null, chance:0.2 },
+ "ground_meat": { elem2: null, chance:0.2 },
+ "cooked_meat": { elem2: null, chance:0.3 },
+ "rotten_meat": { elem2: null, chance:0.1 },
+ "ground_rotten_meat": { elem2: null, chance:0.15 },
+ "blood": { attr1:{h:3}, elem2: null },
+ "infection": { elem2: null },
+ "bone": { elem2: ["blood",null,null], chance:0.1 },
+ "bone_marrow": { elem2: ["blood",null], chance:0.1 },
},
state: "solid",
hardness: 1,
conduct: .1,
-},
+ cooldown: defaultCooldown,
+}
-elements.calm_682 = {
- color: ["#424242","#75816B","#4D6B53"],
- behavior: [
- "M2%0.5|M2%0.3|M2%0.5",
- "M1%10|CH:mad_682%0.5|M1%10",
- "XX|M1|XX",
- ],
+elements.scp_804 = {
+ name: "SCP-804",
+ color:["#C49F4F","#F2D18E","#A59F8F","#7FA097","#7FA097","#405584","#8E7A45","#96814C"],
category: "scp",
- density: 7350,
- excludeRandom: true,
- reactions: {
- "meat": { elem2 : null , chance:0.2 },
- "bone": { elem2 : null , chance:0.1 },
- "blood": { elem2 : null , chance:0.1 },
- "cooked_meat": { elem2 : null , chance:0.3 },
- "acid": { elem1 : "calm_682" , chance:0.05 },
- "tickle_monster": { elem1 : "calm_682" , chance:99.9 },
+ hardness: 0.65,
+ breakInto: ["glass_shard","glass_shard","snow","metal_scrap","metal_scrap","glass_shard","glass_shard","snow","metal_scrap","metal_scrap","dust"],
+ tempHigh: 1750,
+ stateHigh: ["glass_shard","glass_shard","snow","metal_scrap","metal_scrap","glass_shard","glass_shard","snow","metal_scrap","metal_scrap","dust"],
+ conduct: 1,
+ properties: {
+ radius: 50,
+ active: false,
+ },
+ tick: function(pixel) {
+ tryMove(pixel,pixel.x,pixel.y+1)
+ if (pixel.charge && pixel.active != true) {
+ pixel.active = true
+ }
+ if (pixel.repair < 3 && pixel.active != false) {
+ pixel.active = false
+ }
+ doDefaults(pixel)
+ if (pixel.radius > 0 && (!pixel.repair || pixel.repair > 2) && pixel.active == true) {
+ 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 manmade = pixelMap[coords[i].x][coords[i].y]
+ if (manmade.element == "scp_804") {
+ if (!manmade.repair) {
+ manmade.repair = 75
+ }
+ if (Math.random() < 0.05) {
+ manmade.repair --
+ }
+ if (manmade.repair < 1) {
+ if (Math.random() > 0.95) {
+ changePixel(manmade, "metal_scrap")
+ }
+ else {
+ deletePixel(manmade.x,manmade.y)
+ }
+ }
+ }
+ else if (manmade.element == "skin" || manmade.element == "hair" || manmade.element == "body" || manmade.element == "head" || manmade.element == "body_012_1" || manmade.element == "head_012_1" || manmade.element == "body_008" || manmade.element == "head_008" || manmade.element == "body_035" || manmade.element == "head_035" || manmade.element == "body_049" || manmade.element == "head_049" || manmade.element == "body_049_1" || manmade.element == "head_049_1") {
+ if (!manmade.repair) {
+ manmade.repair = 25
+ }
+ if (Math.random() < 0.05) {
+ manmade.repair --
+ }
+ if (manmade.repair < 18 && manmade.element == "body" && !manmade.naked) {
+ if (!isEmpty(manmade.x,manmade.y-1) && Math.random() > 0.75) {
+ manmade.color = pixelMap[manmade.x][manmade.y-1].color;
+ manmade.naked = true
+ manmade.panic ++
+ }
+ }
+ if (manmade.repair < 1) {
+ if (Math.random() > 0.95) {
+ changePixel(manmade, "blood")
+ manmade.man = true
+ }
+ else {
+ deletePixel(manmade.x,manmade.y)
+ }
+ }
+ }
+ else if (elements[manmade.element].category == "weapons" || manmade.element == "tin" || manmade.element == "lead" || manmade.element == "gallium" || manmade.element == "mercury" || manmade.element == "tungsten" || manmade.element == "nickel" || manmade.element == "zinc" || manmade.element == "gold" || manmade.element == "silver" || manmade.element == "iron" || manmade.element == "copper" || manmade.element == "aluminum") {
+ if (!manmade.repair) {
+ manmade.repair = 20
+ }
+ if (Math.random() < 0.25) {
+ manmade.repair --
+ }
+ if (manmade.repair < 1) {
+ if (Math.random() > 0.65) {
+ changePixel(manmade, "rust")
+ }
+ else {
+ deletePixel(manmade.x,manmade.y)
+ }
+ }
+ }
+ else if (manmade.element == "unknown" || manmade.element == "scp_035" || manmade.element == "scp_229" || elements[manmade.element].category == "machines" || manmade.element == "metal_scrap" || manmade.element == "solid_mercury" || manmade.element == "molten_gallium" || manmade.element == "steel" || manmade.element == "galvanized_steel" || manmade.element == "brass" || manmade.element == "bronze" || manmade.element == "invar" || manmade.element == "sterling" || manmade.element == "rose_gold" || manmade.element == "purple_gold" || manmade.element == "blue_gold" || manmade.element == "electrum" || manmade.element == "solder" || manmade.element == "particleboard") {
+ if (!manmade.repair) {
+ manmade.repair = 15
+ }
+ if (Math.random() < 0.25) {
+ manmade.repair --
+ }
+ if (manmade.repair < 1) {
+ if (Math.random() > 0.75) {
+ changePixel(manmade, "rust")
+ }
+ else if (Math.random > 0.5) {
+ changePixel(manmade, "dust")
+ }
+ else {
+ deletePixel(manmade.x,manmade.y)
+ }
+ }
+ }
+ else if (manmade.element == "rust" || manmade.element == "oxidized_copper" || manmade.element == "concrete" || manmade.element == "brick" || manmade.element == "adobe" || manmade.element == "slag" || manmade.element == "amalgam" || manmade.element == "thermite" || manmade.element == "copper_sulfate" || manmade.element == "glass" || manmade.element == "glass_shard" || manmade.element == "rad_glass" || manmade.element == "rad_shard" || manmade.element == "stained_glass" || manmade.element == "color_sand" || manmade.element == "brick_rubble" || manmade.element == "clay_shard" || manmade.element == "porcelain" || manmade.element == "porcelain_shard") {
+ if (!manmade.repair) {
+ manmade.repair = 10
+ }
+ if (Math.random() < 0.25) {
+ manmade.repair --
+ }
+ if (manmade.repair < 1) {
+ if (Math.random() > 0.85) {
+ changePixel(manmade, "dust")
+ }
+ else {
+ deletePixel(manmade.x,manmade.y)
+ }
+ }
+ }
+ else if (!manmade.lc && !manmade.wc && manmade.element == "wood" || manmade.element == "tinder" || manmade.element == "scp_063" || manmade.element == "scp_012" || manmade.element == "dust" || manmade.element == "insulation" || manmade.element == "cloth" || manmade.element == "plastic" || manmade.element == "bead" || manmade.element == "glitter" || manmade.element == "confetti" || manmade.element == "paper" || manmade.element == "cement" || manmade.element == "acid" || manmade.element == "black_acid" || manmade.element == "alcohol" || manmade.element == "wax" || manmade.element == "poison" || manmade.element == "incense" || manmade.element == "gold_coin" || manmade.element == "borax" || manmade.element == "spray_paint" || manmade.element == "anesthesia" || manmade.element == "acid_gas" || manmade.element == "ball" || manmade.element == "potassium_salt" || manmade.element == "epsom_salt" || manmade.element == "sodium_acetate") {
+ if (!manmade.repair) {
+ manmade.repair = 6
+ }
+ if (Math.random() < 0.25) {
+ manmade.repair --
+ }
+ if (manmade.repair < 1) {
+ if (Math.random() > 0.75) {
+ changePixel(manmade, "foam")
+ }
+ else {
+ deletePixel(manmade.x,manmade.y)
+ }
+ }
+ }
+ else if (manmade.panic && manmade.element == "bone" || manmade.panic && manmade.element == "quicklime" || manmade.panic && manmade.element == "rotten_meat" || manmade.panic && manmade.element == "meat" || manmade.element == "cooked_meat" || manmade.element == "blood" || manmade.element == "infection" || manmade.element == "seltzer" || Math.random() > 0.9 && manmade.element == "dirty_water" || manmade.element == "pool_water" || manmade.element == "lamp_oil" || manmade.element == "neutral_acid" || manmade.element == "glue" || manmade.element == "soda" || manmade.element == "melted_wax" || manmade.element == "chocolate_milk" || manmade.element == "fruit_milk" || manmade.element == "pilk" || manmade.element == "eggnog" || manmade.element == "cream" || manmade.element == "nut_milk" || manmade.element == "vinegar" || manmade.element == "soap" || manmade.element == "bleach" || manmade.element == "dye" || manmade.element == "ink" || manmade.element == "vaccine" || manmade.element == "antidote" || manmade.element == "tea" || manmade.element == "coffee" || manmade.element == "caramel" || manmade.element == "molasses" || manmade.element == "ketchup" || manmade.element == "sauce" || manmade.element == "mayo" || manmade.element == "cyanide") {
+ if (!manmade.repair) {
+ manmade.repair = 3
+ }
+ if (Math.random() < 0.25) {
+ manmade.repair --
+ }
+ if (manmade.repair < 1) {
+ if (Math.random() > 0.5) {
+ changePixel(manmade, "water")
+ }
+ else {
+ deletePixel(manmade.x,manmade.y)
+ }
+ }
+ }
+ if (manmade.temp > 600) {
+ manmade.temp -= 10
+ }
+ else if (manmade.temp > 93.9) {
+ manmade.temp -= 1
+ }
+ else if (manmade.temp > 56.7) {
+ manmade.temp -= 0.1
+ }
+ }
+ }
+ if (Math.random() > 0.9) {
+ pixel.radius++
+ }
+ }
},
- hidden: true,
- state: "solid",
- hardness: 1,
- conduct: .1,
-},
-
-elements.mad_682 = {
- color: ["#424242","#75816B","#4D6B53"],
- behavior: [
- "M2%0.5|M2%0.3|M2%0.5",
- "M2%10|CH:SCP_682%0.3|M2%10",
- "XX|M1|XX",
- ],
- category: "scp",
- density: 8000,
- excludeRandom: true,
- reactions: {
- "head": { elem2 : ["bone","blood",null] },
- "body": { elem2 : ["meat","blood",null] },
- "z_head": { elem2 : ["bone","infection",null] },
- "z_body": { elem2 : ["meat","infection",null] },
- "homunculus": { elem2 : ["slime","blood",null] },
- "frog": { elem2 : ["slime","blood",null] },
- "bird": { elem2 : ["feather","blood",null] },
- "meat": { elem2 : null , chance:0.5 },
- "cooked_meat": { elem2 : null , chance:0.5 },
- "rotten_meat": { elem2 : null , chance:0.2 },
- "blood": { elem2 : null , chance:0.5 },
- "bone": { elem2 : ["blood",null,null] , chance:0.2 },
- "bone_marrow": { elem2 : ["blood",null] , chance:0.2 },
- "aluminum": { elem2 : "metal_scrap" , chance:1.0 },
- "steel": { elem2 : "metal_scrap" , chance:0.2 },
- "iron": { elem2 : "metal_scrap" , chance:0.3 },
- "lead": { elem2 : ["metal_scrap","metal_scrap","radiation"] , chance:0.3 },
- "glass": { elem2 : "glass_shard" },
- "wood": { elem2 : "sawdust" },
- "concrete": { elem2 : "dust" , chance:10 },
- "dust": { elem2 : null , chance:10 },
- },
- hidden: true,
- state: "solid",
- hardness: 1,
- conduct: .1,
-},
-
-// SCP-804 WIP template
-/*
-elements.SCP_804 = {
- color:"#beigeish",
- category: "scp",
excludeRandom: true,
state: "solid",
-},
-*/
+ cooldown: defaultCooldown,
+}
-elements.tickle_monster = {
+elements.scp_999 = {
+ name: "SCP-999",
color: "#FFA500",
- behavior: [
- "M2%0.5|M2%0.3 AND CR:fragrance%0.05|M2%0.5",
- "M1%10|XX|M1%10",
- "XX|M1|XX",
- ],
+ properties: {
+ h: false,
+ },
+ tick: function(pixel) {
+ if (pixel.h == true) {
+ if (!pixel.hStart) {
+ pixel.hStart = pixelTicks
+ }
+ if (pixel.start === pixelTicks) {return}
+ if (pixel.charge && elements[pixel.element].behaviorOn) {
+ pixelTick(pixel);
+ return;
+ }
+ let move1Spots = hyperCoords.slice(0);
+ var moved = false;
+ for (var i = 0; i < move1Spots.length; i++) {
+ const j = Math.random()*move1Spots.length | 0;
+ const coords = move1Spots[j];
+ if (tryMove(pixel, pixel.x+coords[0], pixel.y+coords[1])) { moved = true; break; }
+ move1Spots.splice(j, 1);
+ }
+ if (moved === false) {
+ let move2Spots = diagonalCoords.slice(0);
+ for (var i = 0; i < move2Spots.length; i++) {
+ const j = Math.random()*move2Spots.length | 0;
+ const coords = move2Spots[j];
+ if (tryMove(pixel, pixel.x+coords[0], pixel.y+coords[1])) { break; }
+ move2Spots.splice(j, 1);
+ }
+ }
+ doDefaults(pixel);
+ if ((pixel.hStart + 50) < pixelTicks) {
+ pixel.h = false
+ delete pixel.hStart
+ }
+ }
+ else {
+ if (pixel.start === pixelTicks) {return}
+ if (pixel.charge && elements[pixel.element].behaviorOn) {
+ pixelTick(pixel);
+ return;
+ }
+ var viscMove = true;
+ viscMove = (Math.random()*100) < 100 / Math.pow(1000, 0.25);
+ if (!viscMove) {
+ var move1Spots = [
+ 0
+ ]
+ }
+ else {
+ var move1Spots = [
+ 1,0,-1
+ ]
+ }
+ var moved = false;
+ for (var i = 0; i < move1Spots.length; i++) {
+ const j = Math.random()*move1Spots.length | 0;
+ const coord = move1Spots[j];
+ if (tryMove(pixel, pixel.x+coord, pixel.y+1)) { moved = true; break; }
+ move1Spots.splice(j, 1);
+ }
+ if (!moved) {
+ if (viscMove || Math.random > 0.5) {
+ if (Math.random() < 0.5) {
+ if (!tryMove(pixel, pixel.x+1, pixel.y)) {
+ tryMove(pixel, pixel.x-1, pixel.y);
+ }
+ } else {
+ if (!tryMove(pixel, pixel.x-1, pixel.y)) {
+ tryMove(pixel, pixel.x+1, pixel.y);
+ }
+ }
+ }
+ }
+ doDefaults(pixel);
+ }
+ },
category: "scp",
density: 550,
reactions: {
@@ -1367,80 +5133,1141 @@ elements.tickle_monster = {
"caramel": { elem2 : null },
"ash": { elem2 : null , chance:0.2 },
"dust": { elem2 : null , chance:0.2 },
- "alchohol": { elem1 : "hyper_tickle_monster", elem2 : null },
- "pilk": { elem1 : "hyper_tickle_monster", elem2 : null },
- "coffee_bean": { elem1 : "hyper_tickle_monster", elem2 : null },
- "coffee_ground": { elem1 : "hyper_tickle_monster", elem2 : null },
- "soda": { elem1 : "hyper_tickle_monster", elem2 : null },
- "coffee": { elem1 : "hyper_tickle_monster", elem2 : null },
- "seltzer": { elem1 : "hyper_tickle_monster", elem2 : null },
+ "alchohol": { attr1:{h:true}, elem2 : null },
+ "pilk": { attr1:{h:true}, elem2 : null },
+ "coffee_bean": { attr1:{h:true}, elem2 : null },
+ "coffee_ground": { attr1:{h:true}, elem2 : null },
+ "soda": { attr1:{h:true}, elem2 : null },
+ "coffee": { attr1:{h:true}, elem2 : null },
+ "seltzer": { attr1:{h:true}, elem2 : null },
},
state: "liquid",
conduct: .5,
- temp: 20,
- tempHigh: 350,
- stateHigh: ["smoke","smoke","smoke","slime"],
- burn: .1,
- burnTime: 300,
- burnInto: ["smoke","smoke","smoke","slime"],
+ temp: 37,
+ extinguish: true,
stain: 0.03,
-},
+ cooldown: defaultCooldown,
+}
-elements.hyper_tickle_monster = {
- color: "#FFA500",
- hidden: true,
- behavior: [
- "XX|XX|XX",
- "XX|CH:tickle_monster%1.0|XX",
- "XX|XX|XX",
- ],
- tick: behaviors.BOUNCY,
- category: "scp",
- density: 575,
- reactions: {
- "sugar_water": { elem2 : "water" },
- "dirty_water": { elem2 : "water" },
- "candy": { elem2 : null },
- "sugar": { elem2 : null },
- "sauce": { elem2 : null },
- "salt": { elem2 : null },
- "cheese": { elem2 : null },
- "melted_cheese": { elem2 : null },
- "baked_potato": { elem2 : null },
- "mashed_potato": { elem2 : null },
- "bread": { elem2 : null },
- "toast": { elem2 : null },
- "jelly": { elem2 : null },
- "nut_butter": { elem2 : null },
- "grape": { elem2 : null },
- "ice_cream": { elem2 : null },
- "juice": { elem2 : null },
- "milk": { elem2 : null },
- "gingerbread": { elem2 : null },
- "crumb": { elem2 : null },
- "cream": { elem2 : null },
- "baked_batter": { elem2 : null },
- "frozen_yogurt": { elem2 : null },
- "yogurt": { elem2 : null },
- "popcorn": { elem2 : null },
- "chocolate": { elem2 : null },
- "chocolate_milk": { elem2 : null },
- "melted_chocolate": { elem2 : null },
- "alchohol": { elem2 : null },
- "pilk": { elem2 : null },
- "soda": { elem2 : null },
- "coffee": { elem2 : null },
- "seltzer": { elem2 : null },
- },
- state: "liquid",
- conduct: .5,
+// scps with ID over 999 here
+
+elements.scp_1000 = {
+ name: "SCP-1000",
+ color: ["#a49d9c","#6a4420","#101c31","#90052A","#ffeed5","#90052A","#101c31","#6a4420","#a49d9c"],
+ buttonColor: ["#a49d9c","#6a4420","#6a4420","#101c31","#90052A","#ffeed5"],
+ category: "scp",
+ properties: {
+ dead: false,
+ dir: 1,
+ panic: 0
+ },
+ onPlace: function(pixel) {
+ if (isEmpty(pixel.x, pixel.y+1)) {
+ createPixel("body_1000", pixel.x, pixel.y+1);
+ var color = pixel.color;
+ changePixel(pixel,"head_1000");
+ pixel.color = color;
+ pixelMap[pixel.x][pixel.y+1].color = pixelColorPick(pixelMap[pixel.x][pixel.y+1],color);
+ }
+ else if (isEmpty(pixel.x, pixel.y-1)) {
+ var color = pixel.color;
+ createPixel("head_1000", pixel.x, pixel.y-1);
+ pixelMap[pixel.x][pixel.y-1].color = color;
+ changePixel(pixel,"body_1000");
+ pixel.color = pixelColorPick(pixel,color);
+ }
+ 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} },
+ "head": { attr1:{panic:3} },
+ "body": { attr1:{panic:3} },
+ },
+ related: ["body_1000","head_1000"],
+ cooldown: defaultCooldown,
+ forceSaveColor: true,
+}
+
+elements.body_1000 = {
+ color: ["#a49d9c","#6a4420","#101c31","#90052A","#ffeed5","#a49d9c","#6a4420","#101c31","#90052A","#ffeed5"],
+ name: "SCP-1000",
+ category: "scp",
+ hidden: true,
+ density: 1500,
+ state: "solid",
+ conduct: .05,
+ temp: 37,
+ tempHigh: 155,
+ stateHigh: "cooked_meat",
+ tempLow: -30,
+ stateLow: "frozen_meat",
+ burn: 15,
+ burnTime: 250,
+ burnInto: "cooked_meat",
+ breakInto: ["blood","meat","bone","blood","meat","bone","blood","meat","bone","blood","meat","bone","dust"],
+ forceSaveColor: true,
+ pickElement: "scp_1000",
+ 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 },
+ "gold_coin": { elem2:null, chance:0.05 },
+ "diamond": { 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 === "head_1000") {
+ 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) {
+ changePixel(pixel,"rotten_meat");
+ }
+ return
+ }
+
+ // Find the head
+ if (!isEmpty(pixel.x, pixel.y-1, true) && pixelMap[pixel.x][pixel.y-1].element == "head_1000") {
+ var head = pixelMap[pixel.x][pixel.y-1];
+ if (head.dead) { // If head is dead, kill body
+ pixel.dead = head.dead;
+ }
+ else if (head.panic > 0) {
+ pixel.panic = head.panic;
+ delete head.panic;
+ }
+ }
+ else { var head = null }
+ if (head && Math.random() < 0.25) {
+ let y = Math.random() < 0.5 ? 0 : -1;
+ for (let x = 1; x < 10; x++) {
+ let x2 = pixel.x+(x*pixel.dir);
+ let y2 = pixel.y+y;
+ if (!isEmpty(x2,y2,true)) {
+ let seenPixel = pixelMap[x2][y2];
+ if (elements.scp_1000.reactions[seenPixel.element] && elements.scp_1000.reactions[seenPixel.element].attr1 && elements.scp_1000.reactions[seenPixel.element].attr1.panic) {
+ pixel.panic += elements.scp_1000.reactions[seenPixel.element].attr1.panic;
+ pixel.dir *= -1;
+ break;
+ }
+ else if (seenPixel.dead || seenPixel.temp > 200) {
+ pixel.panic += 5;
+ pixel.dir *= -1;
+ if (seenPixel.panic) delete seenPixel.panic;
+ break;
+ }
+ }
+ }
+ }
+ if (pixel.burning) {
+ pixel.panic += 0.1;
+ if (head && pixelTicks-pixel.burnStart > 240) {
+ pixel.color = head.color;
+ }
+ }
+ if (pixel.charge) {
+ pixel.panic += 1;
+ }
+ else if (pixel.panic > 0) {
+ pixel.panic -= 0.1;
+ if (pixel.panic < 0) { pixel.panic = 0; }
+ else if (pixel.panic > 50) { pixel.panic = 50; }
+ }
+
+ if (isEmpty(pixel.x, pixel.y-1)) {
+ // create blood if decapitated 10% chance
+ if (Math.random() < 0.1 && !pixel.charge) {
+ createPixel("blood", pixel.x, pixel.y-1);
+ // set dead to true 15% chance
+ 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 (hitPixel.element === "body_1000" || hitPixel.element === "head_1000" && hitPixel.panic < pixel.panic) {
+ // interact with other human
+ hitPixel.panic = pixel.panic;
+ }
+ }
+ }
+ // 15% chance to change direction
+ if (Math.random() < 0.15 || !moved) {
+ pixel.dir *= -1;
+ }
+ // homeostasis
+ if (pixel.temp > 37) { pixel.temp -= 1; }
+ else if (pixel.temp < 37) { pixel.temp += 1; }
+ }
+
+ }
+}
+
+elements.head_1000 = {
+ color: ["#a49d9c","#6a4420","#101c31","#90052A","#ffeed5","#a49d9c","#6a4420","#101c31","#90052A","#ffeed5"],
+ name: "SCP-1000",
+ category: "scp",
+ hidden: true,
+ density: 1080,
+ state: "solid",
+ conduct: .05,
+ temp: 37,
+ tempHigh: 150,
+ stateHigh: "cooked_meat",
+ tempLow: -30,
+ stateLow: "frozen_meat",
+ burn: 15,
+ burnTime: 255,
+ burnInto: "cooked_meat",
+ breakInto: ["blood","meat","bone","blood","meat","bone","blood","meat","bone","blood","meat","bone","dust"],
+ forceSaveColor: true,
+ pickElement: "scp_1000",
+ 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) {
+ changePixel(pixel,"rotten_meat");
+ return
+ }
+ }
+
+ // Find the body
+ if (!isEmpty(pixel.x, pixel.y+1, true) && pixelMap[pixel.x][pixel.y+1].element == "body_1000") {
+ var body = pixelMap[pixel.x][pixel.y+1];
+ if (body.dead) { // If body is dead, kill head
+ pixel.dead = body.dead;
+ }
+ }
+ 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 (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.1 && !pixel.charge) {
+ createPixel("blood", pixel.x, pixel.y+1);
+ // set dead to true 15% chance
+ if (Math.random() < 0.15) {
+ pixel.dead = pixelTicks;
+ }
+ }
+ }
+ // homeostasis
+ if (pixel.temp > 37) { pixel.temp -= 1; }
+ else if (pixel.temp < 37) { pixel.temp += 1; }
+ },
+ onChange: function(pixel) {
+ 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) && pixelMap[x][y].panic !== undefined) {
+ pixelMap[x][y].panic += 20;
+ }
+ }
+ },
+ onDelete: function(pixel) {
+ 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) && pixelMap[x][y].panic !== undefined) {
+ pixelMap[x][y].panic += 20;
+ }
+ }
+ }
+}
+
+elements.penny = {
+ color: ["#F49858","#DE882C","#D9752C","#B15D23","#C16522","#B75C24","#B05B28","#AF6720"],
+ behavior: behaviors.POWDER,
+ category: "powders",
+ tempHigh: 1085,
+ stateHigh: "molten_copper",
+ state: "solid",
+ density: 8960,
+ conduct: 0.85,
+ hardness: 0.3,
+}
+
+elements.scp_1015 = {
+ name: "SCP-1015",
+ color: ["#F49858","#DE882C","#D9752C","#B15D23","#C16522","#B75C24","#B05B28","#AF6720"],
+ behavior: behaviors.POWDER,
+ tick: function(pixel) {
+ for (var i = 0; i < destroyCoords.length; i++) {
+ var coords = destroyCoords[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 pixel2 = pixelMap[x][y]
+ let old = pixel2.element;
+ if (elements[pixel2.element].id == elements.body.id) {
+ pixel2.element = "body_1015"
+ deletePixel(pixel.x,pixel.y)
+ break;
+ }
+ else if (elements[pixel2.element].id == elements.head.id) {
+ pixel2.element = "head_1015"
+ pixelMap[pixel2.x][pixel2.y+1].element = "body_1015"
+ deletePixel(pixel.x,pixel.y)
+ break;
+ }
+ }
+ }
+ },
+ tempHigh: 10850,
+ stateHigh: "molten_copper",
temp: 20,
- tempHigh: 350,
- stateHigh: ["smoke","smoke","smoke","slime"],
- burn: .1,
- burnTime: 300,
- burnInto: ["smoke","smoke","smoke","slime"],
- stain: 0.08,
-};
+ insulate: true,
+ category: "scp",
+ state: "solid",
+ density: 8960,
+ conduct: 0.85,
+ hardness: 1,
+}
-// SCPs with ID over 999 here
+elements.body_1015 = {
+ color: ["#069469","#047e99","#7f5fb0"],
+ name: "SCP-1015-1",
+ 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",
+ 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 },
+ "gold_coin": { elem2:null, chance:0.05 },
+ "diamond": { 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,
+ pennySize: 1,
+ },
+ 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 === "head_1015") {
+ 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) {
+ changePixel(pixel,"rotten_meat");
+ }
+ return
+ }
+
+ if (Math.random() < 0.5) {
+ let yDir = -1
+ for (let y = 1; y < height; y++) {
+ let x2 = pixel.x
+ let y2 = pixel.y+(y*yDir);
+ let weight = 0
+ if (!isEmpty(x2,y2,true) && !outOfBounds(x2,y2)) {
+ weight++
+ }
+ if (isEmpty(x2,y2,true) || outOfBounds(x2,y2)) {
+ if (weight > 4) {
+ changePixel(pixel,"scp_1015")
+ releaseElement(pixel,"blood")
+ }
+ }
+ }
+ }
+
+ // Find the head
+ if (!isEmpty(pixel.x, pixel.y-1, true) && pixelMap[pixel.x][pixel.y-1].element == "head_1015") {
+ var head = pixelMap[pixel.x][pixel.y-1];
+ if (head.dead) { // If head is dead, kill body
+ pixel.dead = head.dead;
+ }
+ else if (head.panic > 0) {
+ pixel.panic = head.panic;
+ delete head.panic;
+ }
+ }
+ else if (!isEmpty(pixel.x, pixel.y-1, true) && pixelMap[pixel.x][pixel.y-1].element == "head") {
+ var head = pixelMap[pixel.x][pixel.y-1];
+ head.element = "head_1015"
+ }
+ else { var head = null }
+ if (head && Math.random() < 0.25) {
+ let y = Math.random() < 0.5 ? 0 : -1;
+ for (let x = 1; x < 10; x++) {
+ let x2 = pixel.x+(x*pixel.dir);
+ let y2 = pixel.y+y;
+ if (!isEmpty(x2,y2,true)) {
+ let seenPixel = pixelMap[x2][y2];
+ if (elements.human.reactions[seenPixel.element] && elements.human.reactions[seenPixel.element].attr1 && elements.human.reactions[seenPixel.element].attr1.panic) {
+ pixel.panic += elements.human.reactions[seenPixel.element].attr1.panic;
+ pixel.dir *= -1;
+ break;
+ }
+ else if (seenPixel.dead || seenPixel.temp > 200) {
+ pixel.panic += 5;
+ pixel.dir *= -1;
+ if (seenPixel.panic) delete seenPixel.panic;
+ break;
+ }
+ }
+ }
+ }
+ if (pixel.burning) {
+ pixel.panic += 0.1;
+ if (head && pixelTicks-pixel.burnStart > 240) {
+ pixel.color = head.color;
+ }
+ }
+ if (pixel.charge) {
+ pixel.panic += 1;
+ }
+ else if (pixel.panic > 0) {
+ pixel.panic -= 0.1;
+ if (pixel.panic < 0) { pixel.panic = 0; }
+ else if (pixel.panic > 50) { pixel.panic = 50; }
+ }
+
+ if (isEmpty(pixel.x, pixel.y-1)) {
+ // create blood if decapitated 10% chance
+ if (Math.random() < 0.1 && !pixel.charge) {
+ createPixel("blood", pixel.x, pixel.y-1);
+ // set dead to true 15% chance
+ 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 ((hitPixel.element === "body" || hitPixel.element === "head") && pixel.pennySize > 10) {
+ if (Math.random() < 0.0005) {
+ changePixel(hitPixel,"scp_1015")
+ }
+ else {
+ changePixel(hitPixel,"penny")
+ }
+ releaseElement(pixel,"blood")
+ }
+ else if ((hitPixel.element === "body" || hitPixel.element === "head") && hitPixel.panic < pixel.panic) {
+ // interact with other human
+ hitPixel.panic = pixel.panic;
+ }
+ else if (elements[hitPixel.element].state != "gas" && elements[hitPixel.element].state != "liquid" && pixel.pennySize > 5 && hitPixel.element != "head_1015" && hitPixel.element != "body" && hitPixel.element != "head" && hitPixel.element != "penny" && hitPixel.element != "scp_1015" && hitPixel.element != "penny_converter") {
+ pixel.elemP = hitPixel.element
+ hitPixel.element = "penny_converter"
+ hitPixel.origElem = pixel.elemP
+ hitPixel.pennySize = pixel.pennySize
+ delete pixel.elemP
+ }
+ else if (elements[hitPixel.element].state != "gas" && elements[hitPixel.element].state != "liquid" && pixel.pennySize > 3 && hitPixel.element != "head_1015" && hitPixel.element != "body" && hitPixel.element != "body" && hitPixel.element != "head" && hitPixel.element != "penny" && hitPixel.element != "scp_1015" && hitPixel.element != "penny_converter") {
+ if (Math.random() < 0.0005) {
+ changePixel(hitPixel,"scp_1015")
+ }
+ else {
+ changePixel(hitPixel,"penny")
+ }
+ }
+ else if (elements[hitPixel.element].movable == true && elements[hitPixel.element].state != "gas" && elements[hitPixel.element].state != "liquid" && pixel.pennySize > 1 && hitPixel.element != "head_1015" && hitPixel.element != "body" && hitPixel.element != "body" && hitPixel.element != "head" && hitPixel.element != "penny" && hitPixel.element != "scp_1015" && hitPixel.element != "penny_converter") {
+ if (Math.random() < 0.0005) {
+ changePixel(hitPixel,"scp_1015")
+ }
+ else {
+ changePixel(hitPixel,"penny")
+ }
+ }
+ else if (Math.random() > 0.9 && elements[hitPixel.element].movable == true && elements[hitPixel.element].state != "gas" && elements[hitPixel.element].state != "liquid" && pixel.pennySize > 0 && hitPixel.element != "head_1015" && hitPixel.element != "body" && hitPixel.element != "body" && hitPixel.element != "head" && hitPixel.element != "penny" && hitPixel.element != "scp_1015" && hitPixel.element != "penny_converter") {
+ if (Math.random() < 0.0005) {
+ changePixel(hitPixel,"scp_1015")
+ }
+ else {
+ changePixel(hitPixel,"penny")
+ }
+ }
+ }
+ }
+ if (!isEmpty(pixel.x,pixel.y+1) && !outOfBounds(pixel.x,pixel.y+1) && Math.random() < 0.25) {
+ var hitPixel = pixelMap[pixel.x][pixel.y+1];
+ if ((hitPixel.element === "body" || hitPixel.element === "head") && pixel.pennySize > 10) {
+ if (!isEmpty(hitPixel.x,hitPixel.y-1) && !outOfBounds(hitPixel.x,hitPixel.y-1) && Math.random() > 0.5 && hitPixel.element == "body") {
+ if (Math.random() < 0.0005) {
+ changePixel(pixelMap[hitPixel.x][hitPixel.y-1],"scp_1015")
+ }
+ else {
+ changePixel(pixelMap[hitPixel.x][hitPixel.y-1],"penny")
+ }
+ }
+ if (Math.random() < 0.0005) {
+ changePixel(hitPixel,"scp_1015")
+ }
+ else {
+ changePixel(hitPixel,"penny")
+ }
+ releaseElement(pixel,"blood",2)
+ }
+ else if (elements[hitPixel.element].state != "gas" && elements[hitPixel.element].state != "liquid" && pixel.pennySize > 5 && hitPixel.element != "head_1015" && hitPixel.element != "body" && hitPixel.element != "head" && hitPixel.element != "penny" && hitPixel.element != "scp_1015" && hitPixel.element != "penny_converter") {
+ pixel.elemP = hitPixel.element
+ hitPixel.element = "penny_converter"
+ hitPixel.origElem = pixel.elemP
+ hitPixel.pennySize = pixel.pennySize
+ delete pixel.elemP
+ }
+ else if (elements[hitPixel.element].state != "gas" && elements[hitPixel.element].state != "liquid" && pixel.pennySize > 3 && hitPixel.element != "head_1015" && hitPixel.element != "body" && hitPixel.element != "body" && hitPixel.element != "head" && hitPixel.element != "penny" && hitPixel.element != "scp_1015" && hitPixel.element != "penny_converter") {
+ if (Math.random() < 0.0005) {
+ changePixel(hitPixel,"scp_1015")
+ }
+ else {
+ changePixel(hitPixel,"penny")
+ }
+ }
+ else if (elements[hitPixel.element].movable == true && elements[hitPixel.element].state != "gas" && elements[hitPixel.element].state != "liquid" && pixel.pennySize > 1 && hitPixel.element != "head_1015" && hitPixel.element != "body" && hitPixel.element != "body" && hitPixel.element != "head" && hitPixel.element != "penny" && hitPixel.element != "scp_1015" && hitPixel.element != "penny_converter") {
+ if (Math.random() < 0.0005) {
+ changePixel(hitPixel,"scp_1015")
+ }
+ else {
+ changePixel(hitPixel,"penny")
+ }
+ }
+ else if (Math.random() > 0.9 && elements[hitPixel.element].movable == true && elements[hitPixel.element].state != "gas" && elements[hitPixel.element].state != "liquid" && pixel.pennySize > 0 && hitPixel.element != "head_1015" && hitPixel.element != "body" && hitPixel.element != "body" && hitPixel.element != "head" && hitPixel.element != "penny" && hitPixel.element != "scp_1015" && hitPixel.element != "penny_converter") {
+ if (Math.random() < 0.0005) {
+ changePixel(hitPixel,"scp_1015")
+ }
+ else {
+ changePixel(hitPixel,"penny")
+ }
+ }
+ }
+ if (!isEmpty(pixel.x,pixel.y-2) && !outOfBounds(pixel.x,pixel.y-2) && Math.random() < 0.5) {
+ var hitPixel = pixelMap[pixel.x][pixel.y+1];
+ if ((hitPixel.element === "body" || hitPixel.element === "head") && pixel.pennySize > 10) {
+ if (Math.random() < 0.0005) {
+ changePixel(hitPixel,"scp_1015")
+ }
+ else {
+ changePixel(hitPixel,"penny")
+ }
+ releaseElement(pixel,"blood")
+ }
+ else if (elements[hitPixel.element].state != "gas" && elements[hitPixel.element].state != "liquid" && pixel.pennySize > 5 && hitPixel.element != "head_1015" && hitPixel.element != "body" && hitPixel.element != "head" && hitPixel.element != "penny" && hitPixel.element != "scp_1015" && hitPixel.element != "penny_converter") {
+ pixel.elemP = hitPixel.element
+ hitPixel.element = "penny_converter"
+ hitPixel.origElem = pixel.elemP
+ hitPixel.pennySize = pixel.pennySize
+ delete pixel.elemP
+ }
+ else if (Math.random() > 0.5 && elements[hitPixel.element].state != "gas" && elements[hitPixel.element].state != "liquid" && pixel.pennySize > 3 && hitPixel.element != "head_1015" && hitPixel.element != "body" && hitPixel.element != "body" && hitPixel.element != "head" && hitPixel.element != "penny" && hitPixel.element != "scp_1015" && hitPixel.element != "penny_converter") {
+ if (Math.random() < 0.0005) {
+ changePixel(hitPixel,"scp_1015")
+ }
+ else {
+ changePixel(hitPixel,"penny")
+ }
+ }
+ else if (elements[hitPixel.element].movable == true && elements[hitPixel.element].state != "gas" && elements[hitPixel.element].state != "liquid" && pixel.pennySize > 1 && hitPixel.element != "head_1015" && hitPixel.element != "body" && hitPixel.element != "body" && hitPixel.element != "head" && hitPixel.element != "penny" && hitPixel.element != "scp_1015" && hitPixel.element != "penny_converter") {
+ if (Math.random() < 0.0005) {
+ changePixel(hitPixel,"scp_1015")
+ }
+ else {
+ changePixel(hitPixel,"penny")
+ }
+ }
+ else if (Math.random() > 0.5 && elements[hitPixel.element].movable == true && elements[hitPixel.element].state != "gas" && elements[hitPixel.element].state != "liquid" && pixel.pennySize > 0 && hitPixel.element != "head_1015" && hitPixel.element != "body" && hitPixel.element != "body" && hitPixel.element != "head" && hitPixel.element != "penny" && hitPixel.element != "scp_1015" && hitPixel.element != "penny_converter") {
+ if (Math.random() < 0.0005) {
+ changePixel(hitPixel,"scp_1015")
+ }
+ else {
+ changePixel(hitPixel,"penny")
+ }
+ }
+ }
+ // 15% chance to change direction
+ if (Math.random() < 0.15 || !moved) {
+ pixel.dir *= -1;
+ }
+ // homeostasis
+ if (pixel.temp > 37) { pixel.temp -= 1; }
+ else if (pixel.temp < 37) { pixel.temp += 1; }
+ if (pixel.elemP) {
+ delete pixel.elemP
+ }
+ if (Math.random() < 0.05) {
+ if (!pixel.pennySize) {
+ pixel.pennySize = 0.5
+ }
+ else {
+ pixel.pennySize *= 1.1
+ }
+ }
+ }
+ },
+ onChange: function(pixel) {
+ releaseElement(pixel,"scp_1015",1,true)
+ },
+ onDelete: function(pixel) {
+ releaseElement(pixel,"scp_1015",1,true)
+ },
+}
+
+elements.head_1015 = {
+ color: ["#f3e7db","#f7ead0","#eadaba","#d7bd96","#a07e56","#825c43","#604134","#3a312a"],
+ name: "SCP-1015-1",
+ 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",
+ 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) {
+ changePixel(pixel,"rotten_meat");
+ return
+ }
+ }
+
+ // Find the body
+ if (!isEmpty(pixel.x, pixel.y+1, true) && pixelMap[pixel.x][pixel.y+1].element == "body_1015") {
+ var body = pixelMap[pixel.x][pixel.y+1];
+ if (body.dead) { // If body is dead, kill head
+ pixel.dead = body.dead;
+ }
+ }
+ else { var body = null }
+
+ // check for eating food
+ if (body && !pixel.dead && Math.random() < 0.0025) {
+ 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 (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.1 && !pixel.charge) {
+ createPixel("blood", pixel.x, pixel.y+1);
+ // set dead to true 15% chance
+ if (Math.random() < 0.15) {
+ pixel.dead = pixelTicks;
+ }
+ }
+ }
+ // homeostasis
+ if (pixel.temp > 37) { pixel.temp -= 1; }
+ else if (pixel.temp < 37) { pixel.temp += 1; }
+ },
+ onChange: function(pixel) {
+ 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) && pixelMap[x][y].panic !== undefined) {
+ pixelMap[x][y].panic += 20;
+ }
+ }
+ },
+ onDelete: function(pixel) {
+ 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) && pixelMap[x][y].panic !== undefined) {
+ pixelMap[x][y].panic += 20;
+ }
+ }
+ }
+}
+
+elements.penny_converter = {
+ color: ["#F49858","#DE882C","#D9752C","#B15D23","#C16522","#B75C24","#B05B28","#AF6720"],
+ name: "penny",
+ tick: function(pixel) {
+ 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,true)) {
+ var newPixel = pixelMap[x][y]
+ if (elements[newPixel.element].id !== elements.penny.id && elements[newPixel.element].id !== elements.scp_1015.id && newPixel.element == pixel.origElem && pixel.pennySize > 1) {
+ changePixel(newPixel,"penny_converter")
+ newPixel.origElem = pixel.origElem
+ newPixel.pennySize = (pixel.pennySize-1)
+ if (Math.random() < 0.0005) {
+ changePixel(pixel,"scp_1015")
+ }
+ else {
+ changePixel(pixel,"penny")
+ }
+ }
+ }
+ }
+ if (!pixel.pennySize || !pixel.origElem || pixel.pennySize < 2 || (pixel.start + 20) < pixelTicks) {
+ if (Math.random() < 0.0005) {
+ changePixel(pixel,"scp_1015")
+ }
+ else {
+ changePixel(pixel,"penny")
+ }
+ }
+ },
+ category: "special",
+ state: "solid",
+ density: 600,
+ excludeRandom: true
+}
+/*
+elements.scp_1147_1 = {
+ color: "#a32d2d",
+ behavior: [
+ "ST:scp_1147_branch|ST:scp_1147_branch|ST:scp_1147_branch",
+ "ST:scp_1147_branch|XX|ST:scp_1147_branch",
+ "ST:scp_1147_branch AND M2|ST:scp_1147_branch AND M1|ST:scp_1147_branch AND M2",
+ ],
+ reactions: {
+ },
+ category:"scp",
+ tempHigh: 256,
+ stateHigh: "scp_1147_1",
+ breakInto: "scp_1147_1",
+ state: "solid",
+ density: 1050,
+}
+
+elements.scp_1147_1 = {
+ color: "#291d07",
+ burn:50,
+ burnTime:20,
+ category:"scp",
+ state: "solid",
+ density: 1400,
+ cooldown: defaultCooldown,
+ seed: true,
+ tick: function(pixel) {
+ if (!tryMove(pixel,pixel.x,pixel.y+1)) {
+ if (Math.random() < 0.02 && pixel.age > 50 && pixel.temp < 100 && isEmpty(pixel.x, pixel.y-1)) {
+ changePixel(pixel,"scp_1147_branch")
+ createPixel("scp_1147_branch",pixel.x, pixel.y-1)
+ if (isEmpty(pixel.x, pixel.y-2)) {
+ createPixel("scp_1147_branch",pixel.x, pixel.y-2)
+ }
+ }
+ else if (pixel.age > 1000 && Math.random() < 0.05) {
+ changePixel(pixel,"scp_1147_branch");
+ pixel.color = pixelColorPick(pixel, pixel.wc);
+ }
+ pixel.age++;
+ }
+ doDefaults(pixel);
+ },
+ properties: {
+ "age":0
+ },
+}
+
+elements.scp_1147_branch = {
+ name: "scp_1147",
+ color: "#a0522d",
+ behavior: behaviors.WALL,
+ movable: false,
+ category: "scp",
+ hidden: true,
+ state: "solid",
+ density: 1500,
+ hardness: 0.15,
+ seed: "scp_1147_1",
+ forceSaveColor: true,
+ tick: function(pixel) {
+ if (!pixel.burning) {
+ if (!pixel.lc) { pixel.lc = "#00bf00" }
+ if (!pixel.wc) { pixel.wc = "#a0522d" }
+ if (isEmpty(pixel.x-1,pixel.y-1) && Math.random() < 0.02) {
+ if (Math.random() < 0.5) {
+ if (Math.random() > 0.7) {
+ createPixel("scp_1147_1",pixel.x-1,pixel.y-1);
+ }
+ else {
+ createPixel("scp_1147_leaf",pixel.x-1,pixel.y-1);
+ pixelMap[pixel.x-1][pixel.y-1].color = pixelColorPick(pixelMap[pixel.x-1][pixel.y-1], pixel.lc);
+ }
+ }
+ else {
+ createPixel("scp_1147_branch",pixel.x-1,pixel.y-1);
+ pixelMap[pixel.x-1][pixel.y-1].color = pixelColorPick(pixelMap[pixel.x-1][pixel.y-1], pixel.wc);
+ pixelMap[pixel.x-1][pixel.y-1].wc = pixel.wc;
+ pixelMap[pixel.x-1][pixel.y-1].lc = pixel.lc;
+ }
+ }
+ if (isEmpty(pixel.x+1,pixel.y-1) && Math.random() < 0.02) {
+ if (Math.random() < 0.5) {
+ if (Math.random() > 0.7) {
+ createPixel("scp_1147_1",pixel.x+1,pixel.y-1);
+ }
+ else {
+ createPixel("scp_1147_leaf",pixel.x+1,pixel.y-1);
+ pixelMap[pixel.x+1][pixel.y-1].color = pixelColorPick(pixelMap[pixel.x+1][pixel.y-1], pixel.lc);
+ }
+ }
+ else {
+ createPixel("scp_1147_branch",pixel.x+1,pixel.y-1);
+ pixelMap[pixel.x+1][pixel.y-1].color = pixelColorPick(pixelMap[pixel.x+1][pixel.y-1], pixel.wc);
+ pixelMap[pixel.x+1][pixel.y-1].wc = pixel.wc;
+ pixelMap[pixel.x+1][pixel.y-1].lc = pixel.lc;
+ }
+ }
+ if (isEmpty(pixel.x,pixel.y-1) && Math.random() < 0.02) {
+ if (Math.random() < 0.75) {
+ if (Math.random() > 0.8) {
+ createPixel("scp_1147_1",pixel.x,pixel.y-1);
+ }
+ else {
+ createPixel("scp_1147_leaf",pixel.x,pixel.y-1);
+ pixelMap[pixel.x][pixel.y-1].color = pixelColorPick(pixelMap[pixel.x][pixel.y-1], pixel.lc);
+ }
+ }
+ else {
+ createPixel("scp_1147_branch",pixel.x,pixel.y-1);
+ pixelMap[pixel.x][pixel.y-1].color = pixelColorPick(pixelMap[pixel.x][pixel.y-1], pixel.wc);
+ pixelMap[pixel.x][pixel.y-1].wc = pixel.wc;
+ pixelMap[pixel.x][pixel.y-1].lc = pixel.lc;
+ }
+ }
+ }
+ doDefaults(pixel);
+ },
+}
+
+elements.scp_1147_leaf = {
+ name: "scp_1147",
+ color: "#00bf00",
+ behavior: behaviors.WALL,
+ reactions: {
+ },
+ category:"scp",
+ state: "solid",
+ density: 1050,
+ forceSaveColor: true
+} */
+
+elements.scp_1600 = {
+ name: "SCP-1600-1",
+ color: "#D6CE02",
+ tick: function(pixel) {
+ if (pixel.start === pixelTicks) {return}
+ if (pixel.charge && elements[pixel.element].behaviorOn) {
+ pixelTick(pixel);
+ return;
+ }
+ var viscMove = true;
+ if (elements[pixel.element].viscosity) {
+ viscMove = (Math.random()*100) < 100 / Math.pow(elements[pixel.element].viscosity, 0.25);
+ }
+ if (!viscMove) {
+ var move1Spots = [
+ 0
+ ]
+ }
+ else {
+ var move1Spots = [
+ 1,0,-1
+ ]
+ }
+ var moved = false;
+ for (var i = 0; i < move1Spots.length; i++) {
+ const j = Math.random()*move1Spots.length | 0;
+ const coord = move1Spots[j];
+ if (tryMove(pixel, pixel.x+coord, pixel.y+1)) { moved = true; break; }
+ move1Spots.splice(j, 1);
+ }
+ if (!moved) {
+ if (viscMove) {
+ if (Math.random() < 0.5) {
+ if (!tryMove(pixel, pixel.x+1, pixel.y)) {
+ tryMove(pixel, pixel.x-1, pixel.y);
+ }
+ } else {
+ if (!tryMove(pixel, pixel.x-1, pixel.y)) {
+ tryMove(pixel, pixel.x+1, pixel.y);
+ }
+ }
+ }
+ }
+ if (!isEmpty(pixel.x,pixel.y-1) && !outOfBounds(pixel.x,pixel.y-1)) {
+ if (elements[pixelMap[pixel.x][pixel.y-1].element].state != "liquid" && elements[pixelMap[pixel.x][pixel.y-1].element].state != "gas") {
+ tryMove(pixel,pixel.x,pixel.y-1)
+ }
+ }
+ doDefaults(pixel);
+ },
+ onCollide: function(pixelOG,pixel) {
+ if (elements[pixel.element].id === elements.scp_1600.id) { return; }
+ if (elements.scp_1600.reactions[pixel.element]) { return; }
+ if (elements.scp_1600.ignore.indexOf(pixel.element) !== -1) return;
+ if (Math.random() < (elements[pixel.element].hardness || 0.25)) { return; }
+ if (elements[pixel.element].state !== "liquid" && elements[pixel.element].state !== "gas") {
+ var rgb1 = pixel.color.match(/\d+/g);
+ var hex1 = RGBToHex(rgb1)
+ // average the colors
+ if (hex_is_light(hex1) == false) {
+ var rgb2 = elements.scp_1600_1.color[1].match(/\d+/g);
+ }
+ else {
+ var rgb2 = elements.scp_1600_1.color[0].match(/\d+/g);
+ }
+ var avg = [];
+ for (var j = 0; j < rgb1.length; j++) {
+ avg[j] = Math.floor((rgb1[j]*(1-0.4)) + (rgb2[j]*0.6));
+ }
+ changePixel(pixel,"scp_1600_1")
+ pixel.color = "rgb("+avg.join(",")+")";
+ }
+ },
+ ignore: ["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,},
+ "cheese":{ elem2:"scp_1600_1", color2:"#CA8E2F"},
+ "melted_cheese":{ elem2:"scp_1600_1", color2:"#CA8E2F"},
+ "gold":{ elem2:"scp_1600_1", color2:"#FEDF5E"},
+ "gold_coin":{ elem2:"scp_1600_1", color2:"#FEDF5E"},
+ "molten_gold":{ elem2:"scp_1600_1", color2:"#FEDF5E"},
+ "rotten_cheese":{ elem2:"scp_1600_1", color2:["#B6B746","#B6B746","#BBA950","#BBA950","#CE9F4B"]},
+ "rotten_meat":{ elem2:"scp_1600_1", color2:["#B6B746","#B6B746","#C2995D","#C2995D","#CB7C8E"]},
+ "mercury":{ elem2:"scp_1600_1", color2:"#393430"},
+ "solid_mercury":{ elem2:"scp_1600_1", color2:"#393430"},
+ "meat":{ elem2:"scp_1600_1", color2:"#D5975F"},
+ "skin":{ elem2:"scp_1600_1", color2:"#D5975F"},
+ "head":{ elem2:"scp_1600_1", color2:"#D5975F"},
+ "cured_meat":{ elem2:"scp_1600_1", color2:"#D9A256"},
+ "blood":{ elem2:"scp_1600_1", color2:"#D36324"},
+ "infection":{ elem2:"scp_1600_1", color2:"#CE4B4A"},
+ },
+ density: 466.51,
+ state: "liquid",
+ category:"scp",
+}
+
+elements.scp_1600_1 = {
+ name: "SCP-1600-2",
+ color: ["#D8A43C","#A57426"],
+ behavior: behaviors.STURDYPOWDER,
+ reactions: {
+ },
+ breakInto: "cheese_powder",
+ breakIntoColorMultiplier: [1.1,1,0.86],
+ category: "scp",
+ state: "solid",
+ density: 666.51,
+ isFood: true
+}
diff --git a/mods/sensitive.js b/mods/sensitive.js
new file mode 100644
index 00000000..0b36169f
--- /dev/null
+++ b/mods/sensitive.js
@@ -0,0 +1,20 @@
+// Makes all elements EXTREAMLY sensitive to air or anything else.
+
+
+runAfterLoad(function() {
+ for (const elem in elements) {
+ if (["fire", "explosion", "smoke"].includes(elem)) continue;
+ if (!elements[elem].onPlace) {
+ elements[elem].onPlace = function(pixel) {
+ changePixel(pixel, "explosion");
+ };
+ } else {
+
+ const oldOnPlace = elements[elem].onPlace;
+ elements[elem].onPlace = function(pixel) {
+ oldOnPlace(pixel);
+ changePixel(pixel, "explosion");
+ };
+ }
+ }
+});
\ No newline at end of file