From 71be6dece1ff95390557274673a1837f176b2aef Mon Sep 17 00:00:00 2001 From: Nekonico <163950752+DBNekonico@users.noreply.github.com> Date: Mon, 8 Sep 2025 21:32:44 -0700 Subject: [PATCH 001/105] Fur and regen update --- mods/biology.js | 965 ++++++++++++++++++++++++++++++++---------------- 1 file changed, 639 insertions(+), 326 deletions(-) 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 }; From 3adea098240a668e56525066feaafdb5ee61da64 Mon Sep 17 00:00:00 2001 From: PogDog <121242106+P0gDog@users.noreply.github.com> Date: Tue, 9 Sep 2025 16:06:41 +0000 Subject: [PATCH 002/105] add sensitive mod --- mods/sensitive.js | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 mods/sensitive.js 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 From 55a5d7cf4ce4bc4b21b84eb6430b3883adc733bf Mon Sep 17 00:00:00 2001 From: slweeb <91897291+slweeb@users.noreply.github.com> Date: Thu, 11 Sep 2025 10:47:24 -0400 Subject: [PATCH 003/105] Update mod-list.html --- mod-list.html | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/mod-list.html b/mod-list.html index 0c6543bd..6f497af1 100644 --- a/mod-list.html +++ b/mod-list.html @@ -498,7 +498,8 @@ - + From 34c70c53bfb27daf4522f9c42761fec37a29bec9 Mon Sep 17 00:00:00 2001 From: JustAGenericUsername <92590792+JustAGenericUsername@users.noreply.github.com> Date: Fri, 12 Sep 2025 09:10:54 -0400 Subject: [PATCH 004/105] false vaccum fix --- mods/nousersthings.js | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/mods/nousersthings.js b/mods/nousersthings.js index e70e0059..2479903e 100644 --- a/mods/nousersthings.js +++ b/mods/nousersthings.js @@ -3901,6 +3901,13 @@ elements.false_vacuum = { if (!pixel.timeAlive){ pixel.timeAlive = 0 } + if (!pixel.generations){ + pixel.generations = 0 + } + if (pixel.generations > Math.max(width, height)){ + deletePixel(pixel.x, pixel.y) + return + } pixel.color = `rgb(${180/(pixel.timeAlive+2)}, ${27/(pixel.timeAlive+2)}, ${27/(pixel.timeAlive+2)})` if (pixel.timeAlive === 0){ for (i = 0; i < squareCoords.length; i++){ @@ -3910,9 +3917,11 @@ elements.false_vacuum = { if (pixelMap[x][y].element !== "false_vacuum"){ deletePixel(x, y) createPixel("false_vacuum", x, y) + pixelMap[x][y].generations = pixel.generations + 1 } } else if (isEmpty(x, y)){ createPixel("false_vacuum", x, y) + pixelMap[x][y].generations = pixel.generations + 1 } } } From 43a91664b8a7e3967c695581cc92f6a43c40867e Mon Sep 17 00:00:00 2001 From: Alexthetransfem <124483815+theenchantedsword@users.noreply.github.com> Date: Sun, 14 Sep 2025 19:53:37 -0500 Subject: [PATCH 005/105] Update plants.js --- mods/plants.js | 2883 +++++++++++++++++++++++++----------------------- 1 file changed, 1502 insertions(+), 1381 deletions(-) diff --git a/mods/plants.js b/mods/plants.js index 807c3f46..00699bda 100644 --- a/mods/plants.js +++ b/mods/plants.js @@ -1,44 +1,28 @@ /* Version 2.2.0 */ -function noiseify(color, range){ - if(color.startsWith("#")){ - color = hexToRGB(color); - } else { - color = getRGB(color); +let plants; +if(!enabledMods.includes("/mods/orchidslibrary.js")){ + let continueWithout = confirm("Missing dependency for plants.js: \"orchidslibrary.js\". Continue without? (cancel will add mod and refresh the page)"); + if(!continueWithout){ + addMod("/mods/orchidslibrary.js", true); + window.location.reload(); } - let num = Math.round(Math.random()*(range*2))-range; - for(let value in color){ - color[value] += num; +} else { + let is2d = (arr)=>{ + return arr.some(item => Array.isArray(item)); } - 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(){ + 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 +89,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 +645,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"], + }; + + } From 33207a1b2a4507df2a2b28bb3eb8826970971b14 Mon Sep 17 00:00:00 2001 From: Alexthetransfem <124483815+theenchantedsword@users.noreply.github.com> Date: Sun, 14 Sep 2025 19:53:57 -0500 Subject: [PATCH 006/105] Update plants.js --- mods/plants.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/plants.js b/mods/plants.js index 00699bda..aca2cb25 100644 --- a/mods/plants.js +++ b/mods/plants.js @@ -1,5 +1,5 @@ /* -Version 2.2.0 +Version 2.2.1 */ let plants; if(!enabledMods.includes("/mods/orchidslibrary.js")){ From 24f2b5c2e98b9341de251d51a75ca62c9749b6c7 Mon Sep 17 00:00:00 2001 From: Alexthetransfem <124483815+theenchantedsword@users.noreply.github.com> Date: Sun, 14 Sep 2025 19:56:13 -0500 Subject: [PATCH 007/105] Update morechemistry.js --- mods/morechemistry.js | 2469 +++++++++++++++++++++++++---------------- 1 file changed, 1540 insertions(+), 929 deletions(-) diff --git a/mods/morechemistry.js b/mods/morechemistry.js index 25221c1b..247806d1 100644 --- a/mods/morechemistry.js +++ b/mods/morechemistry.js @@ -1,960 +1,1571 @@ /* -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})`; - } +if(!enabledMods.includes("/mods/orchidslibrary.js")){ + let continueWithout = confirm("Missing dependency for morechemistry.js: \"orchidslibrary.js\". Continue without? (cancel will add mod and refresh the page)"); + if(!continueWithout){ + addMod("/mods/orchidslibrary.js", true); + window.location.reload(); } -} -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}; +} else { + 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, + }; +}; From c937375959756299bbe422741070e517e392a67f Mon Sep 17 00:00:00 2001 From: Alexthetransfem <124483815+theenchantedsword@users.noreply.github.com> Date: Sun, 14 Sep 2025 19:57:19 -0500 Subject: [PATCH 008/105] Create datawire.js --- mods/datawire.js | 244 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 244 insertions(+) create mode 100644 mods/datawire.js diff --git a/mods/datawire.js b/mods/datawire.js new file mode 100644 index 00000000..73fedd9e --- /dev/null +++ b/mods/datawire.js @@ -0,0 +1,244 @@ +/* +Version 1.0.0 +*/ +if(!enabledMods.includes("/mods/orchidslibrary.js")){ + let continueWithout = confirm("Missing dependency for datawire.js: \"orchidslibrary.js\". Continue without? (cancel will add mod and refresh the page)"); + if(!continueWithout){ + addMod("/mods/orchidslibrary.js", true); + window.location.reload(); + } +} else { + 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; + }; + } + } + } + } + } + }; + +} From dc6c9f4fec690ff2eb8d06879e1c390e4a19dbc1 Mon Sep 17 00:00:00 2001 From: Alexthetransfem <124483815+theenchantedsword@users.noreply.github.com> Date: Sun, 14 Sep 2025 19:58:40 -0500 Subject: [PATCH 009/105] Create orchidslibrary.js Library containing many of the functions i use for my mods --- mods/orchidslibrary.js | 70 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 mods/orchidslibrary.js diff --git a/mods/orchidslibrary.js b/mods/orchidslibrary.js new file mode 100644 index 00000000..678803ed --- /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})`; +} + +let 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})`; +} From f7e5e0da8680225afbbe987fecfab8fb36d83857 Mon Sep 17 00:00:00 2001 From: Alexthetransfem <124483815+theenchantedsword@users.noreply.github.com> Date: Sun, 14 Sep 2025 20:09:33 -0500 Subject: [PATCH 010/105] Update mod-list.html --- mod-list.html | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/mod-list.html b/mod-list.html index 6f497af1..d68b4f26 100644 --- a/mod-list.html +++ b/mod-list.html @@ -196,7 +196,7 @@ texturepack.jsTools that let you create and share custom texture packsnousernamefound the_ground.jsSeveral rock types, worldgen settings, and gemstonesAlice worldEdit.jsSelection and editing toolsRedBirdly -worldgenlibrary.jsWorld generation libraryAdora +worldgenlibrary.jsWorld generation libraryOrchid Science & Chemistry alcohol.jsMethanol, (iso-)propanol, and butanolAlice @@ -234,7 +234,7 @@ metals.jsSeveral metalsAlice mixture.jsMany chemicals can be mixedlllllllllwith10ls more_gold.jsGreen Goldpixelegend4 -morechemistry.jsNew chemicals, compounds, and machinesAdora +morechemistry.jsNew chemicals, compounds, and machinesOrchid moreliquids.jsVarious liquidste-agma-at neutronium_compressor.jsCompressor from Minecraft's Avaritia mod that compresses 10,000 pixels of an element into a singularityAlice noblegas.jsThe missing noble gasesnousernamefound @@ -253,6 +253,7 @@ colored_lightbulbs.jsLight bulb that can be paintedguzzo86, ggod combustion.jsComponents necessary for combustion enginesuptzik conveyance.jsConveyors, operated with and without electricityMelecie +datawire.jsAdds a wire that transfers data and other operators and machines for itOrchid drill.jsDrills made out of several materialsSuss ExtraMachines.jsSensors, energy resources, materials, and moreMecoolnotcool fans.jsFansCube14yt @@ -350,7 +351,7 @@ ocean.jsMarine lifeSquareScreamYT ores.jsOre generation along with tools to mine themnousernamefound petal_dye.jsBoil petals to make dyeSuss -plants.jsWide variety of new plants and fruitsAdora +plants.jsWide variety of new plants and fruitsOrchid primordial_birthpool.jsCross between Primordial Soup and Birthpool. Requires fey_and_more.jsAlice spring.jsMany nature elements, like sakura trees, butterflies, beehives, and moreR74n the_ground_og.jsSimplified and more stable version of the_ground.jsAlice @@ -361,7 +362,7 @@ Fun & Games 10kelements.jsCustomizable amount of randomly generated elementsnousernamefound all_around_fillers.jsDirectional Filler variantsidk73248 -allliquids.jsMade all elements liquidsAdora +allliquids.jsMade all elements liquidsOrchid amogus.jsSmall Among Us structureAlice bfdi.jsSeveral references to Battle for Dream IslandTaterbob citybuilding.jsSeeds that create miniature buildings and other city-related itemsSquareScreamYT @@ -440,7 +441,7 @@ changeTempReactionParameter.jsThe changeTemp property to modded reactionsAlice code_library.jsFunctions and variables common to some other modsAlice controllable_pixel_test.jsPixel that can be controlled with the keyboard keys [More Info] [PC ONLY]Alice -customexplosion.jsAdded a custom explosion element and interface for it. check out its source code for how modders can use itAlex +customexplosion.jsAdded a custom explosion element and interface for it.Orchid date_test.jsK-pop idol birthday testing stuffAlice drawPixels_change_test.jsTest of altering drawPixels(). Gives burning pixels a red overlay similar to the yellow overlay for charged pixelsAlice example_mod.jsExample mod for new moddersR74n @@ -455,6 +456,7 @@ modlangs.jsCustomisable property in an element to allow for translations in mods. See the file for instructions on how to implementSquareScreamYT nested_for_reaction_example.jsExample of using a nested for loop to add reactions. It makes various things kill plantsAlice nv7.jsGiant Nv7 image [Large]Nv7 +orchidslibrary.jsLibrary used by morechemistry.js, plants.js, and datawire.jsOrchid place_all_elements.jsExperimental function that places every pixelAlice randomness_but_tick.jsRandom experimental elements using the tick function featureAlice randomness_but_tool.jsRandom experimental elements using the tool function featureAlice @@ -464,7 +466,7 @@ structure_test.jsTest for implementing structures into SandboxelsAlice test.jsTest that adds mayo :)R74n tool_pixel_behavior.jsGives unique behaviors to tools if placed with cheatsAlice -worldgenlibrary.jsWorld generation libraryAdora +worldgenlibrary.jsWorld generation libraryOrchid worldgen_test.jsElement that generates a save with a grass layer, dirt layer, rock layer, and a pondAlice Broken or Deprecated From eae82f4bf60b1c0e5dfcf5549ae9321ba526d7c2 Mon Sep 17 00:00:00 2001 From: Alexthetransfem <124483815+theenchantedsword@users.noreply.github.com> Date: Mon, 15 Sep 2025 21:24:00 -0500 Subject: [PATCH 011/105] Update orchidslibrary.js --- mods/orchidslibrary.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mods/orchidslibrary.js b/mods/orchidslibrary.js index 678803ed..bf4e768d 100644 --- a/mods/orchidslibrary.js +++ b/mods/orchidslibrary.js @@ -1,5 +1,5 @@ /* -Version 1.0.0 +*Version 1.0.0 */ function noiseify(color, range){ if(color.startsWith("#")){ @@ -14,7 +14,7 @@ function noiseify(color, range){ return `rgb(${color.r},${color.g},${color.b})`; } -let is2d = (arr)=>{ +function is2d(arr){ return arr.some(item => Array.isArray(item)); } From b773d8f064c9b87bf4b9e860cb7213345cf3299f Mon Sep 17 00:00:00 2001 From: Alexthetransfem <124483815+theenchantedsword@users.noreply.github.com> Date: Mon, 15 Sep 2025 21:24:46 -0500 Subject: [PATCH 012/105] Update morechemistry.js --- mods/morechemistry.js | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/mods/morechemistry.js b/mods/morechemistry.js index 247806d1..eb628940 100644 --- a/mods/morechemistry.js +++ b/mods/morechemistry.js @@ -1,14 +1,8 @@ /* -Version 2.2.0 +*Version 2.2.0 */ -if(!enabledMods.includes("/mods/orchidslibrary.js")){ - let continueWithout = confirm("Missing dependency for morechemistry.js: \"orchidslibrary.js\". Continue without? (cancel will add mod and refresh the page)"); - if(!continueWithout){ - addMod("/mods/orchidslibrary.js", true); - window.location.reload(); - } -} else { +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 = { @@ -1568,4 +1562,4 @@ if(!enabledMods.includes("/mods/orchidslibrary.js")){ stateLow: "bismuth", temp: 270, }; -}; +}, true); From eb1d649246b9173fa9fea872a0d2e7ebf13cb382 Mon Sep 17 00:00:00 2001 From: Alexthetransfem <124483815+theenchantedsword@users.noreply.github.com> Date: Mon, 15 Sep 2025 21:26:03 -0500 Subject: [PATCH 013/105] Update plants.js --- mods/plants.js | 15 +++------------ 1 file changed, 3 insertions(+), 12 deletions(-) diff --git a/mods/plants.js b/mods/plants.js index aca2cb25..ca38e2a5 100644 --- a/mods/plants.js +++ b/mods/plants.js @@ -1,17 +1,8 @@ /* -Version 2.2.1 +*Version 2.2.1 */ let plants; -if(!enabledMods.includes("/mods/orchidslibrary.js")){ - let continueWithout = confirm("Missing dependency for plants.js: \"orchidslibrary.js\". Continue without? (cancel will add mod and refresh the page)"); - if(!continueWithout){ - addMod("/mods/orchidslibrary.js", true); - window.location.reload(); - } -} else { - let is2d = (arr)=>{ - return arr.some(item => Array.isArray(item)); - } +dependOn("orchidslibrary.js", ()=>{ class growInterval { constructor(seedPixel, pattern, basePos, c = 0.025, dieAfter = undefined, fruit = undefined, elems = undefined){ let currentLength = 0; @@ -1622,4 +1613,4 @@ if(!enabledMods.includes("/mods/orchidslibrary.js")){ }; -} +}, true); From 8d10ae9bb838e46c82c96a244b369f11b495205f Mon Sep 17 00:00:00 2001 From: Alexthetransfem <124483815+theenchantedsword@users.noreply.github.com> Date: Mon, 15 Sep 2025 21:27:14 -0500 Subject: [PATCH 014/105] Update datawire.js --- mods/datawire.js | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/mods/datawire.js b/mods/datawire.js index 73fedd9e..dcf88613 100644 --- a/mods/datawire.js +++ b/mods/datawire.js @@ -1,13 +1,7 @@ /* -Version 1.0.0 +*Version 1.0.0 */ -if(!enabledMods.includes("/mods/orchidslibrary.js")){ - let continueWithout = confirm("Missing dependency for datawire.js: \"orchidslibrary.js\". Continue without? (cancel will add mod and refresh the page)"); - if(!continueWithout){ - addMod("/mods/orchidslibrary.js", true); - window.location.reload(); - } -} else { +dependOn("orchidslibrary.js", ()=>{ elements.data_wire = { desc: "Transfers data.", color: ["#6b1502", "#631402", "#6e1400", "#631200"], @@ -241,4 +235,4 @@ if(!enabledMods.includes("/mods/orchidslibrary.js")){ } }; -} +}, true); From d65ee31f34f73ed104a3d1294fa55b6b8c16a3ee Mon Sep 17 00:00:00 2001 From: SweetySweetingtonsSweets Date: Tue, 16 Sep 2025 18:46:33 -0400 Subject: [PATCH 015/105] Create liquid_Master.js --- liquid_Master.js | 60 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 liquid_Master.js diff --git a/liquid_Master.js b/liquid_Master.js new file mode 100644 index 00000000..4db37967 --- /dev/null +++ b/liquid_Master.js @@ -0,0 +1,60 @@ +if (!elements.categories.custom) { + elements.categories.custom = "custom"; +} + +elements.hello_test = { + color: "#ff00ff", + behavior: behaviors.POWDER, + category: "custom", + state: "solid", +}; + + +// Ensure category exists +if (!elements.categories.special) { + elements.categories.special = "special"; +} + +elements.liquefier = { + color: "#33ccff", + behavior: behaviors.POWDER, // stays in place better than liquid + category: "liquids", + state: "solid", + density: 2000, + tick: function(pixel) { + const dirs = [ + [0,1], [0,-1], [1,0], [-1,0], + [1,1], [-1,1], [1,-1], [-1,-1] + ]; + for (const [dx,dy] of dirs) { + const x = pixel.x+dx; + const y = pixel.y+dy; + if (outOfBounds(x,y)) continue; + + const target = pixelMap[x][y]; + if (!target) continue; + if (target.element === "liquefier") continue; + + const liquidName = target.element + "_liquid"; + + // Define the "liquid" version if missing + if (!elements[liquidName]) { + let baseColor = elements[target.element]?.color || "#654321"; + if (Array.isArray(baseColor)) baseColor = baseColor[0]; + + elements[liquidName] = { + color: [baseColor, "#3399ff"], // tint + behavior: behaviors.LIQUID, + category: "liquids", + state: "liquid", + density: 1050, + viscosity: 8, + isFood: elements[target.element]?.isFood || false, + }; + } + + // Turn neighbor into its liquid version + changePixel(target, liquidName); + } + }, +}; From b8254e9b4a30e69febc3e2d9a6715f1e92423881 Mon Sep 17 00:00:00 2001 From: SweetySweetingtonsSweets Date: Tue, 16 Sep 2025 18:48:42 -0400 Subject: [PATCH 016/105] Create liquid_Master.js --- mods/liquid_Master.js | 60 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 mods/liquid_Master.js diff --git a/mods/liquid_Master.js b/mods/liquid_Master.js new file mode 100644 index 00000000..4db37967 --- /dev/null +++ b/mods/liquid_Master.js @@ -0,0 +1,60 @@ +if (!elements.categories.custom) { + elements.categories.custom = "custom"; +} + +elements.hello_test = { + color: "#ff00ff", + behavior: behaviors.POWDER, + category: "custom", + state: "solid", +}; + + +// Ensure category exists +if (!elements.categories.special) { + elements.categories.special = "special"; +} + +elements.liquefier = { + color: "#33ccff", + behavior: behaviors.POWDER, // stays in place better than liquid + category: "liquids", + state: "solid", + density: 2000, + tick: function(pixel) { + const dirs = [ + [0,1], [0,-1], [1,0], [-1,0], + [1,1], [-1,1], [1,-1], [-1,-1] + ]; + for (const [dx,dy] of dirs) { + const x = pixel.x+dx; + const y = pixel.y+dy; + if (outOfBounds(x,y)) continue; + + const target = pixelMap[x][y]; + if (!target) continue; + if (target.element === "liquefier") continue; + + const liquidName = target.element + "_liquid"; + + // Define the "liquid" version if missing + if (!elements[liquidName]) { + let baseColor = elements[target.element]?.color || "#654321"; + if (Array.isArray(baseColor)) baseColor = baseColor[0]; + + elements[liquidName] = { + color: [baseColor, "#3399ff"], // tint + behavior: behaviors.LIQUID, + category: "liquids", + state: "liquid", + density: 1050, + viscosity: 8, + isFood: elements[target.element]?.isFood || false, + }; + } + + // Turn neighbor into its liquid version + changePixel(target, liquidName); + } + }, +}; From 6f3b5becaf1a5a25f68e845c43e5f71933910899 Mon Sep 17 00:00:00 2001 From: reyyyyy1 Date: Wed, 17 Sep 2025 20:22:57 +0530 Subject: [PATCH 017/105] Add files via upload --- mods/light.js | 218 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 218 insertions(+) create mode 100644 mods/light.js 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;i Date: Thu, 18 Sep 2025 19:01:15 -0400 Subject: [PATCH 018/105] Add nature_Mod.js Have you ever wanted more things in Sandboxels? Then this mod is for you! Explore real species of insects, reptiles, and arachnids! Or take a look at the plants, flowers, and fungi! This mod has lots of stuff to enjoy! --- mods/nature_Mod.js | 1384 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 1384 insertions(+) create mode 100644 mods/nature_Mod.js 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, +} + + From 10f1aa0aad887d299e79b0635d89a0456af755ba Mon Sep 17 00:00:00 2001 From: Cube14yt Date: Fri, 19 Sep 2025 18:24:54 +0800 Subject: [PATCH 019/105] Update cubesstuff.js --- mods/cubesstuff.js | 1084 +++++++++++++++++++++++++++++++++++++++----- 1 file changed, 974 insertions(+), 110 deletions(-) diff --git a/mods/cubesstuff.js b/mods/cubesstuff.js index baea58e7..891e747e 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 && !other.element === "white_hole") 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,739 @@ 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, + 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) + } + } + } + } +} From a0b5263f35c76c6939745a25c49fb20d0253f35f Mon Sep 17 00:00:00 2001 From: Cube14yt Date: Fri, 19 Sep 2025 19:57:08 +0800 Subject: [PATCH 020/105] Update cubesstuff.js --- mods/cubesstuff.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/mods/cubesstuff.js b/mods/cubesstuff.js index 891e747e..1d70c684 100644 --- a/mods/cubesstuff.js +++ b/mods/cubesstuff.js @@ -3207,6 +3207,7 @@ elements.element_line = { hidden: true, excludeRandom: true, insulate: true, + movable: false, onSelect() { promptInput("Input the element it should use", (input) => { if (!input) return; @@ -3323,3 +3324,4 @@ elements.replace_all_of_element = { } } } + From 35bf3f9a78f46d43468bd1231cf7b1d6462a1d84 Mon Sep 17 00:00:00 2001 From: sahmurzaevruslan77-hash Date: Sun, 21 Sep 2025 22:26:35 +0500 Subject: [PATCH 021/105] adds more elements and 1 new machine --- miscellaneous_elements.js | 277 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 277 insertions(+) create mode 100644 miscellaneous_elements.js diff --git a/miscellaneous_elements.js b/miscellaneous_elements.js new file mode 100644 index 00000000..277cf36e --- /dev/null +++ b/miscellaneous_elements.js @@ -0,0 +1,277 @@ +elements.explorder = { + color: "#ff6600", + behavior: [ + "XX|XX|XX", + "XX|CH:water>explosion|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}, + } +} From f1363a6c299e65522e1627026f9f988a0b9386be Mon Sep 17 00:00:00 2001 From: BojiTheKing3o14 Date: Sun, 21 Sep 2025 21:21:18 +0300 Subject: [PATCH 022/105] Create bojithekings_mod.js my mod --- mods/bojithekings_mod.js | 377 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 377 insertions(+) create mode 100644 mods/bojithekings_mod.js diff --git a/mods/bojithekings_mod.js b/mods/bojithekings_mod.js new file mode 100644 index 00000000..85a36703 --- /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", + behavor: 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: "custom_fusion_2" , 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 From 16bf5209b2f943cf8fc7aac912102796d88180ab Mon Sep 17 00:00:00 2001 From: BojiTheKing3o14 Date: Sun, 21 Sep 2025 21:31:49 +0300 Subject: [PATCH 023/105] bojithekings_mod.js --- mods/bojithekings_mod.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/bojithekings_mod.js b/mods/bojithekings_mod.js index 85a36703..8bacd9fe 100644 --- a/mods/bojithekings_mod.js +++ b/mods/bojithekings_mod.js @@ -255,7 +255,7 @@ elements.molten_stainless_steel = { elements.infinite_burn = { color: "#a16868", - behavor: behaviors.WALL, + behavior: behaviors.WALL, state: "solid", burn: 100, burnTime: 1e9, //more then one irl year From 7d8a754fca5cc1586d985b516cf1f46231586bd9 Mon Sep 17 00:00:00 2001 From: BojiTheKing3o14 Date: Sun, 21 Sep 2025 22:51:10 +0300 Subject: [PATCH 024/105] fix bojithekings_mod.js --- mods/bojithekings_mod.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/bojithekings_mod.js b/mods/bojithekings_mod.js index 8bacd9fe..11fcac1d 100644 --- a/mods/bojithekings_mod.js +++ b/mods/bojithekings_mod.js @@ -270,7 +270,7 @@ elements.h_bomb.behavior = [ ] elements.hydrogen.reactions["hydrogen"] = { - elem1: "custom_fusion_2" , elem2: null, tempMin: 70000 + elem1: "h_explosion" , elem2: null, tempMin: 70000 } elements.h_explosion = { From a74e2b9a91a19fbe83d33433f61eb4eed3b2e7ea Mon Sep 17 00:00:00 2001 From: slweeb <91897291+slweeb@users.noreply.github.com> Date: Tue, 23 Sep 2025 11:33:31 -0400 Subject: [PATCH 025/105] Delete duplicate liquid_Master.js --- liquid_Master.js | 60 ------------------------------------------------ 1 file changed, 60 deletions(-) delete mode 100644 liquid_Master.js diff --git a/liquid_Master.js b/liquid_Master.js deleted file mode 100644 index 4db37967..00000000 --- a/liquid_Master.js +++ /dev/null @@ -1,60 +0,0 @@ -if (!elements.categories.custom) { - elements.categories.custom = "custom"; -} - -elements.hello_test = { - color: "#ff00ff", - behavior: behaviors.POWDER, - category: "custom", - state: "solid", -}; - - -// Ensure category exists -if (!elements.categories.special) { - elements.categories.special = "special"; -} - -elements.liquefier = { - color: "#33ccff", - behavior: behaviors.POWDER, // stays in place better than liquid - category: "liquids", - state: "solid", - density: 2000, - tick: function(pixel) { - const dirs = [ - [0,1], [0,-1], [1,0], [-1,0], - [1,1], [-1,1], [1,-1], [-1,-1] - ]; - for (const [dx,dy] of dirs) { - const x = pixel.x+dx; - const y = pixel.y+dy; - if (outOfBounds(x,y)) continue; - - const target = pixelMap[x][y]; - if (!target) continue; - if (target.element === "liquefier") continue; - - const liquidName = target.element + "_liquid"; - - // Define the "liquid" version if missing - if (!elements[liquidName]) { - let baseColor = elements[target.element]?.color || "#654321"; - if (Array.isArray(baseColor)) baseColor = baseColor[0]; - - elements[liquidName] = { - color: [baseColor, "#3399ff"], // tint - behavior: behaviors.LIQUID, - category: "liquids", - state: "liquid", - density: 1050, - viscosity: 8, - isFood: elements[target.element]?.isFood || false, - }; - } - - // Turn neighbor into its liquid version - changePixel(target, liquidName); - } - }, -}; From e74ffd50daa283c135d18a894c19a2cff2425510 Mon Sep 17 00:00:00 2001 From: slweeb <91897291+slweeb@users.noreply.github.com> Date: Tue, 23 Sep 2025 11:35:17 -0400 Subject: [PATCH 026/105] Moved to mods folder --- miscellaneous_elements.js => mods/miscellaneous_elements.js | 1 + 1 file changed, 1 insertion(+) rename miscellaneous_elements.js => mods/miscellaneous_elements.js (96%) diff --git a/miscellaneous_elements.js b/mods/miscellaneous_elements.js similarity index 96% rename from miscellaneous_elements.js rename to mods/miscellaneous_elements.js index 277cf36e..f2ccd74f 100644 --- a/miscellaneous_elements.js +++ b/mods/miscellaneous_elements.js @@ -275,3 +275,4 @@ elements.neutronium = { "proton": { elem1: "neutron", elem2: null}, } } + From e7812f65b5fde9a77945ecfae5c0acc7779c8e4f Mon Sep 17 00:00:00 2001 From: SweetySweetingtonsSweets Date: Tue, 23 Sep 2025 16:02:53 -0400 Subject: [PATCH 027/105] Update liquid_Master.js --- mods/liquid_Master.js | 37 ++++++++++++++++--------------------- 1 file changed, 16 insertions(+), 21 deletions(-) diff --git a/mods/liquid_Master.js b/mods/liquid_Master.js index 4db37967..b3dc732f 100644 --- a/mods/liquid_Master.js +++ b/mods/liquid_Master.js @@ -1,24 +1,12 @@ -if (!elements.categories.custom) { - elements.categories.custom = "custom"; -} - -elements.hello_test = { - color: "#ff00ff", - behavior: behaviors.POWDER, - category: "custom", - state: "solid", -}; - - -// Ensure category exists -if (!elements.categories.special) { - elements.categories.special = "special"; -} +runAfterLoad(function() { + console.log("Liquefier Mod loaded!") + console.log("Created by Hitochi — turns elements into liquid forms.") +}) elements.liquefier = { color: "#33ccff", - behavior: behaviors.POWDER, // stays in place better than liquid - category: "liquids", + behavior: behaviors.POWDER, // sits in place + category: "machines", state: "solid", density: 2000, tick: function(pixel) { @@ -37,19 +25,25 @@ elements.liquefier = { const liquidName = target.element + "_liquid"; - // Define the "liquid" version if missing + // Define the liquid version if missing if (!elements[liquidName]) { let baseColor = elements[target.element]?.color || "#654321"; if (Array.isArray(baseColor)) baseColor = baseColor[0]; + // check if original is food + const isEdible = + elements[target.element]?.isFood === true || + elements[target.element]?.category === "food"; + elements[liquidName] = { - color: [baseColor, "#3399ff"], // tint + color: [baseColor, "#3399ff"], // tinted version behavior: behaviors.LIQUID, category: "liquids", state: "liquid", density: 1050, viscosity: 8, - isFood: elements[target.element]?.isFood || false, + isFood: isEdible, // only food is edible + desc: "Liquefied form of " + target.element }; } @@ -57,4 +51,5 @@ elements.liquefier = { changePixel(target, liquidName); } }, + desc: "Liquefies nearby pixels into their liquid versions. Food becomes drinkable." }; From 4b28c9bf9ffa5343a36e43a66503c7511fc6a47e Mon Sep 17 00:00:00 2001 From: Nekonico <163950752+DBNekonico@users.noreply.github.com> Date: Fri, 26 Sep 2025 20:00:58 -0700 Subject: [PATCH 028/105] BIG scp.js update BIG and LARGE and HUGE and SIZE --- mods/scp.js | 6932 +++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 5878 insertions(+), 1054 deletions(-) diff --git a/mods/scp.js b/mods/scp.js index c71f61ce..7dc82e12 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,1907 @@ 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 == "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" || 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, + }, + renderer: function(pixel,ctx) { + 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" || 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 +5130,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 +} From 56a33004ed690466e19de0e0bd96adb3784f2ccc Mon Sep 17 00:00:00 2001 From: Nekonico <163950752+DBNekonico@users.noreply.github.com> Date: Fri, 26 Sep 2025 20:08:19 -0700 Subject: [PATCH 029/105] Update mod-list.html --- mod-list.html | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/mod-list.html b/mod-list.html index d68b4f26..bf46b56a 100644 --- a/mod-list.html +++ b/mod-list.html @@ -243,6 +243,7 @@ radioactive.jsRadioactive elements on the periodic table [WIP]kaeud random_rocks.jsRandomly generates rocks on game loadAlice roseyiede.jsSeveral variants of a substance called roseyiedeAlice +scp.jsMod for the SCP Foundation, a secretive organization that contains anomalous objects away from the public, from a collaborative writing website.Nekonico some_tf_liquids.jsVarious liquids from the Thermal Foundation Minecraft modAlice stickystuff.jsSlime, Honey, and others can stick to other elementsSuss the_ground.jsSeveral rocks, worldgen types, and gemstonesAlice @@ -272,6 +273,7 @@ pushers.jsPixels that push elements away from themAlice sandboxels.jsDigital screen to play a mini version of SandboxelsNekonico schematics.jsSchematics for logic gatesSquareScreamYT +scp.jsMod for the SCP Foundation, a secretive organization that contains anomalous objects away from the public, from a collaborative writing website.Nekonico spouts.jsSpouts for all liquidskaeud state_voids.jsSeveral elements that delete specific states of matterAlice switches.jsElectrical switches that can be toggledAlice @@ -293,6 +295,7 @@ more_breaking.jsMore elements can be brokenAlice rays.jsMore Ray typesAlice rays++.jsCouple more raysuptzik +scp.jsMod for the SCP Foundation, a secretive organization that contains anomalous objects away from the public, from a collaborative writing website.Nekonico subspace.jsThe Subspace Tripmine from Robloxnousernamefound war_crimes.jsTear gas and morevoidapex11 weapons.jsVariety of different weaponsJayd @@ -353,6 +356,7 @@ petal_dye.jsBoil petals to make dyeSuss plants.jsWide variety of new plants and fruitsOrchid primordial_birthpool.jsCross between Primordial Soup and Birthpool. Requires fey_and_more.jsAlice +scp.jsMod for the SCP Foundation, a secretive organization that contains anomalous objects away from the public, from a collaborative writing website.Nekonico spring.jsMany nature elements, like sakura trees, butterflies, beehives, and moreR74n the_ground_og.jsSimplified and more stable version of the_ground.jsAlice the_ground.jsSeveral rock types, worldgen settings, and gemstonesAlice @@ -392,6 +396,7 @@ random_elems.jsCurated randomly generated elementsAlice random_liquids.jsRandomly generates liquids on game loadAlice sbmixup.jsSilly elements from a Mix-Up! gamestefanblox +scp.jsMod for the SCP Foundation, a secretive organization that contains anomalous objects away from the public, from a collaborative writing website.Nekonico sports_beta.jsSeveral sports itemsBluBun5193 star_wars.jsVarious items from Star Wars by DisneySeaPickle754 sus.jsAmong Us crewmateNv7 From 696605b269b4c068320c78c3adf41f7bdce7e95f Mon Sep 17 00:00:00 2001 From: Nekonico <163950752+DBNekonico@users.noreply.github.com> Date: Fri, 26 Sep 2025 20:11:34 -0700 Subject: [PATCH 030/105] small bugfix --- mods/scp.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/mods/scp.js b/mods/scp.js index 7dc82e12..62c115f6 100644 --- a/mods/scp.js +++ b/mods/scp.js @@ -4258,8 +4258,11 @@ elements.body_457 = { 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)); From bd4d029b8d6111d30f4df553eb80f292b6720883 Mon Sep 17 00:00:00 2001 From: Nekonico <163950752+DBNekonico@users.noreply.github.com> Date: Fri, 26 Sep 2025 20:18:34 -0700 Subject: [PATCH 031/105] second bufi --- mods/scp.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/mods/scp.js b/mods/scp.js index 62c115f6..62d462e6 100644 --- a/mods/scp.js +++ b/mods/scp.js @@ -3725,7 +3725,7 @@ elements.scp_229 = { for (var i = 0; i < coords.length; i++) { if (!isEmpty(coords[i].x,coords[i].y) && !outOfBounds(coords[i].x,coords[i].y)) { var electric = pixelMap[coords[i].x][coords[i].y] - if (elements[electric.element].category == "nervous system" && Math.random() > 0.5 || electric.charge || electric.element == "brain" || electric.element == "fish" || electric.element == "frog" || electric.element == "rat" || electric.element == "bird" || electric.element == "head" || electric.element == "head_1000" || electric.element == "head_035" || electric.element == "head_008" || electric.element == "battery" || electric.element == "electric" || electric.element == "lightning" || electric.element == "malware" || electric.element == "gray_goo") { + if (elements[electric.element].category == "nervous system" && Math.random() > 0.5 || electric.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] @@ -3813,7 +3813,7 @@ elements.scp_229 = { if (!isEmpty(x,y) && !outOfBounds(x,y) && pixel.nCD == undefined) { var electric = pixelMap[x][y] let old = electric.element; - if (electric.element == "brain" || 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") { + 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] @@ -4931,7 +4931,7 @@ elements.scp_804 = { } } } - else if (manmade.element == "unknown" || manmade.element == "scp_035" || 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") { + 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 } From f25ccb65bf3fdfaa54798a8b89a285a1e08741ec Mon Sep 17 00:00:00 2001 From: Alexthetransfem <124483815+theenchantedsword@users.noreply.github.com> Date: Sat, 27 Sep 2025 20:30:37 -0500 Subject: [PATCH 032/105] Create PRNGworldgenlib.js --- mods/PRNGworldgenlib.js | 154 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 154 insertions(+) create mode 100644 mods/PRNGworldgenlib.js diff --git a/mods/PRNGworldgenlib.js b/mods/PRNGworldgenlib.js new file mode 100644 index 00000000..b07e7633 --- /dev/null +++ b/mods/PRNGworldgenlib.js @@ -0,0 +1,154 @@ +/*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:"); + } +} From de36f76e426f774346167ed30a047b25fd75b807 Mon Sep 17 00:00:00 2001 From: Alexthetransfem <124483815+theenchantedsword@users.noreply.github.com> Date: Sat, 27 Sep 2025 20:36:08 -0500 Subject: [PATCH 033/105] Added PRNGworldgenlib.js to the mods list --- mod-list.html | 2 ++ 1 file changed, 2 insertions(+) diff --git a/mod-list.html b/mod-list.html index d68b4f26..c24d159f 100644 --- a/mod-list.html +++ b/mod-list.html @@ -184,6 +184,7 @@ noconfirm.jsRemoves all confirmation popupsmollthecoder page_color.jsChange the page color with the "pageColor" query parameterAlice pixelResizeTool.jsButton to change pixel scalefeeshmaster +PRNGworldgenlib.jsSwitched from random numbers to pseudorandom numbers - seeds generate consistently but take longer to loadOrchid prompt.jsPrimitive command consoleAlice prop.jsTool to edit the attributes of pixelsAlice random_everything.jsAllows every element to be spawned with RandomR74n @@ -458,6 +459,7 @@ nv7.jsGiant Nv7 image [Large]Nv7 orchidslibrary.jsLibrary used by morechemistry.js, plants.js, and datawire.jsOrchid place_all_elements.jsExperimental function that places every pixelAlice +PRNGworldgenlib.jsSwitched from random numbers to pseudorandom numbers - seeds generate consistently but take longer to loadOrchid randomness_but_tick.jsRandom experimental elements using the tick function featureAlice randomness_but_tool.jsRandom experimental elements using the tool function featureAlice randomness.jsRandom experimental elementsAlice From 92cf70cee09895b1504c79d9ba13c396eaa3ba51 Mon Sep 17 00:00:00 2001 From: Alexthetransfem <124483815+theenchantedsword@users.noreply.github.com> Date: Sat, 27 Sep 2025 21:02:22 -0500 Subject: [PATCH 034/105] Update PRNGworldgenlib.js --- mods/PRNGworldgenlib.js | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/mods/PRNGworldgenlib.js b/mods/PRNGworldgenlib.js index b07e7633..39aa13d3 100644 --- a/mods/PRNGworldgenlib.js +++ b/mods/PRNGworldgenlib.js @@ -152,3 +152,10 @@ elements.PRNGgenerate = { }, "Enter seed:"); } } +elements.view_seed = { + category: "tools", + onSelect: function(){ + alert(seed); + selectElement("dirt"); + } +} From 59a85d84f6f90ea0a8968090c50a113293194d6f Mon Sep 17 00:00:00 2001 From: Cube14yt Date: Sun, 28 Sep 2025 15:46:04 +0800 Subject: [PATCH 035/105] Update cubesstuff.js --- mods/cubesstuff.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/mods/cubesstuff.js b/mods/cubesstuff.js index 1d70c684..ccf3b56f 100644 --- a/mods/cubesstuff.js +++ b/mods/cubesstuff.js @@ -2182,7 +2182,7 @@ elements.white_hole = { if (other && other !== pixel) { let elemDef = elements[other.element]; - if (elemDef.hardness === 1 && !other.element === "white_hole") continue; + if (elemDef.hardness === 1) continue; let dist = Math.sqrt(dx * dx + dy * dy); @@ -3241,7 +3241,7 @@ elements.element_line = { } } if (pixel.dir === 3) { - if (!tryMove(pixel, pixel.x, pixel.y - 1, pixel.clone)) { + if (!tryMove(pixel, pixel.x, pixel.y + 1, pixel.clone)) { changePixel(pixel, pixel.clone, true) } } @@ -3325,3 +3325,4 @@ elements.replace_all_of_element = { } } + From 7235205acce22ab472daabc0b84f26d4f06c6282 Mon Sep 17 00:00:00 2001 From: David Kopal <112717418+DavidKopal@users.noreply.github.com> Date: Sun, 28 Sep 2025 10:48:46 +0200 Subject: [PATCH 036/105] Add files via upload --- mods/bf.js | 307 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 307 insertions(+) create mode 100644 mods/bf.js diff --git a/mods/bf.js b/mods/bf.js new file mode 100644 index 00000000..0eaa5f38 --- /dev/null +++ b/mods/bf.js @@ -0,0 +1,307 @@ +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", + bf_electric_base: "#5cb334", + ">": "#ff7f00", + "<": "#ff00ff", + "+": "#00ffff", + "-": "#800080", + "[": "#ff1493", + "]": "#1e90ff", + ".": "#ffd700", + ",": "#ff4500", + "!": "#ff69b4", + "/": "#bd1515", + "split": "#565656" +} +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 + } + }, +} + +let remotebase1 = undefined +let bfreader = undefined +let bfreader2 = undefined +let bfelectricbase = 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.bf_electric_base = { + category: "bf", + color: "#5cb334", + state: "solid", + behavior: behaviors.WALL, + onSelect: async function () { + var bfans4 = await _modprompt("Please input in the coordinates of the desired base. (X,Y)", "0,0") + if (!bfans4) { return } + let [x, y] = bfans4.split(",") + bfelectricbase = [Number(x), Number(y)] + }, + tick: (px) => { + if (pixelTicks == px.start) { + const base = pixelMap[bfelectricbase[0]][bfelectricbase[1]] + if (base.element == "bf_base") { + px.act = false + px.interpreter = base.interpreter + px.base = [px.x, px.y] + px.running = false + } + } + if (px.interpreter && pixel.charge && !px.running) { + px.running = true + px.act = true + px.interpreter.map.fill(0) + px.interpreter.code = "" + px.interpreter.index = 0 + px.interpreter.ci = 0 + } + } +} + +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.element == "bf_electric_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 + } + } +} + +bftokenslist.forEach(token => { + if (token == "bf_base" || token == "bf_remote_base" || token == "bf_electric_base") { return } + 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) { + try { + pixelMap[px.base[0]][px.base[1]].interpreter.run(pixelMap[px.base[0]][px.base[1]]) + } catch { + const code = pixelMap[px.base[0]][px.base[1]].interpreter.code + pixelMap[px.base[0]][px.base[1]].interpreter = new Interpreter() + pixelMap[px.base[0]][px.base[1]].interpreter.code = code + pixelMap[px.base[0]][px.base[1]].interpreter.run(pixelMap[px.base[0]][px.base[1]]) + } + px.act = false + } else { + px.remotes.forEach(remote => { + pixelMap[remote[0]][remote[1]].act = true + }) + } + } + } + } + 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 + } + }) + } + } + } + } + } +}) + From 61f6e44b2979326179b6fe20caed9e9ada7f8c45 Mon Sep 17 00:00:00 2001 From: David Kopal <112717418+DavidKopal@users.noreply.github.com> Date: Sun, 28 Sep 2025 17:22:43 +0200 Subject: [PATCH 037/105] Add files via upload --- mods/bf.js | 88 ++++++++++++++++++++---------------------------------- 1 file changed, 32 insertions(+), 56 deletions(-) diff --git a/mods/bf.js b/mods/bf.js index 0eaa5f38..830805ee 100644 --- a/mods/bf.js +++ b/mods/bf.js @@ -1,8 +1,8 @@ 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) + resolve(result); + }, "bf.js is asking you...", defaultValue); }) } @@ -93,7 +93,6 @@ class Interpreter { const bftokens = { bf_base: "#00ff00", bf_remote_base: "#008600", - bf_electric_base: "#5cb334", ">": "#ff7f00", "<": "#ff00ff", "+": "#00ffff", @@ -103,8 +102,8 @@ const bftokens = { ".": "#ffd700", ",": "#ff4500", "!": "#ff69b4", - "/": "#bd1515", - "split": "#565656" + "split": "#565656", + "act": "#ffc400", } const bftokenslist = Object.keys(bftokens) @@ -121,13 +120,17 @@ elements.bf_base = { 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 -let bfelectricbase = undefined elements.bf_remote_base = { category: "bf", @@ -135,7 +138,7 @@ elements.bf_remote_base = { 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") + 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)] @@ -153,38 +156,6 @@ elements.bf_remote_base = { }, } -elements.bf_electric_base = { - category: "bf", - color: "#5cb334", - state: "solid", - behavior: behaviors.WALL, - onSelect: async function () { - var bfans4 = await _modprompt("Please input in the coordinates of the desired base. (X,Y)", "0,0") - if (!bfans4) { return } - let [x, y] = bfans4.split(",") - bfelectricbase = [Number(x), Number(y)] - }, - tick: (px) => { - if (pixelTicks == px.start) { - const base = pixelMap[bfelectricbase[0]][bfelectricbase[1]] - if (base.element == "bf_base") { - px.act = false - px.interpreter = base.interpreter - px.base = [px.x, px.y] - px.running = false - } - } - if (px.interpreter && pixel.charge && !px.running) { - px.running = true - px.act = true - px.interpreter.map.fill(0) - px.interpreter.code = "" - px.interpreter.index = 0 - px.interpreter.ci = 0 - } - } -} - elements.reader = { category: "bf", color: "#008600", @@ -192,7 +163,7 @@ elements.reader = { behavior: behaviors.WALL, conduct: 1, onSelect: async function () { - var bfans2 = await _modprompt("Please input in the desired value to activate when read.", "0") + var bfans2 = await _modprompt("Please input in the desired value to activate when read.", "0"); if (!bfans2) { return } bfreader = Number(bfans2) }, @@ -210,7 +181,7 @@ elements.pointer_reader = { 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") + 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)] @@ -226,7 +197,7 @@ elements.bf_runner = { category: "bf", color: "#ababab", tool: (px) => { - if ((px.element == "bf_base" || px.element == "bf_electric_base") && !px.running) { + if (px.element == "bf_base" && !px.running) { px.running = true px.act = true px.interpreter.map.fill(0) @@ -237,8 +208,8 @@ elements.bf_runner = { } } -bftokenslist.forEach(token => { - if (token == "bf_base" || token == "bf_remote_base" || token == "bf_electric_base") { return } +for (let token of bftokenslist) { + if (token == "bf_base" || token == "bf_remote_base") { continue } elements[token] = { category: "bf", color: bftokens[token], @@ -272,21 +243,14 @@ bftokenslist.forEach(token => { px.act = true pixelMap[px.base[0]][px.base[1]].interpreter.code += token if (isEmpty(px.x + 1, px.y)) { - if (!px.remotes) { - try { - pixelMap[px.base[0]][px.base[1]].interpreter.run(pixelMap[px.base[0]][px.base[1]]) - } catch { - const code = pixelMap[px.base[0]][px.base[1]].interpreter.code - pixelMap[px.base[0]][px.base[1]].interpreter = new Interpreter() - pixelMap[px.base[0]][px.base[1]].interpreter.code = code - pixelMap[px.base[0]][px.base[1]].interpreter.run(pixelMap[px.base[0]][px.base[1]]) - } - px.act = false - } else { + 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 } } } @@ -303,5 +267,17 @@ bftokenslist.forEach(token => { } } } -}) +} +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 From fdca2fb3fbbb4289f67996cc9a0bb25241b13238 Mon Sep 17 00:00:00 2001 From: slweeb <91897291+slweeb@users.noreply.github.com> Date: Sun, 28 Sep 2025 11:39:19 -0400 Subject: [PATCH 038/105] Update mod-list.html --- mod-list.html | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/mod-list.html b/mod-list.html index bf46b56a..b1247184 100644 --- a/mod-list.html +++ b/mod-list.html @@ -243,7 +243,6 @@ radioactive.jsRadioactive elements on the periodic table [WIP]kaeud random_rocks.jsRandomly generates rocks on game loadAlice roseyiede.jsSeveral variants of a substance called roseyiedeAlice -scp.jsMod for the SCP Foundation, a secretive organization that contains anomalous objects away from the public, from a collaborative writing website.Nekonico some_tf_liquids.jsVarious liquids from the Thermal Foundation Minecraft modAlice stickystuff.jsSlime, Honey, and others can stick to other elementsSuss the_ground.jsSeveral rocks, worldgen types, and gemstonesAlice @@ -295,7 +294,7 @@ more_breaking.jsMore elements can be brokenAlice rays.jsMore Ray typesAlice rays++.jsCouple more raysuptzik -scp.jsMod for the SCP Foundation, a secretive organization that contains anomalous objects away from the public, from a collaborative writing website.Nekonico +scp.jsCreatures and items from the SCP WikiNekonico subspace.jsThe Subspace Tripmine from Robloxnousernamefound war_crimes.jsTear gas and morevoidapex11 weapons.jsVariety of different weaponsJayd @@ -356,7 +355,7 @@ petal_dye.jsBoil petals to make dyeSuss plants.jsWide variety of new plants and fruitsOrchid primordial_birthpool.jsCross between Primordial Soup and Birthpool. Requires fey_and_more.jsAlice -scp.jsMod for the SCP Foundation, a secretive organization that contains anomalous objects away from the public, from a collaborative writing website.Nekonico +scp.jsCreatures and items from the SCP WikiNekonico spring.jsMany nature elements, like sakura trees, butterflies, beehives, and moreR74n the_ground_og.jsSimplified and more stable version of the_ground.jsAlice the_ground.jsSeveral rock types, worldgen settings, and gemstonesAlice @@ -396,7 +395,7 @@ random_elems.jsCurated randomly generated elementsAlice random_liquids.jsRandomly generates liquids on game loadAlice sbmixup.jsSilly elements from a Mix-Up! gamestefanblox -scp.jsMod for the SCP Foundation, a secretive organization that contains anomalous objects away from the public, from a collaborative writing website.Nekonico +scp.jsCreatures and items from the SCP WikiNekonico sports_beta.jsSeveral sports itemsBluBun5193 star_wars.jsVarious items from Star Wars by DisneySeaPickle754 sus.jsAmong Us crewmateNv7 From 0ae6c78aaad3cabf1946dbb5716ebeec3fd42087 Mon Sep 17 00:00:00 2001 From: slweeb <91897291+slweeb@users.noreply.github.com> Date: Sun, 28 Sep 2025 11:40:46 -0400 Subject: [PATCH 039/105] Update mod-list.html --- mod-list.html | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/mod-list.html b/mod-list.html index c24d159f..4d0a6d23 100644 --- a/mod-list.html +++ b/mod-list.html @@ -184,7 +184,6 @@ noconfirm.jsRemoves all confirmation popupsmollthecoder page_color.jsChange the page color with the "pageColor" query parameterAlice pixelResizeTool.jsButton to change pixel scalefeeshmaster -PRNGworldgenlib.jsSwitched from random numbers to pseudorandom numbers - seeds generate consistently but take longer to loadOrchid prompt.jsPrimitive command consoleAlice prop.jsTool to edit the attributes of pixelsAlice random_everything.jsAllows every element to be spawned with RandomR74n @@ -459,7 +458,7 @@ nv7.jsGiant Nv7 image [Large]Nv7 orchidslibrary.jsLibrary used by morechemistry.js, plants.js, and datawire.jsOrchid place_all_elements.jsExperimental function that places every pixelAlice -PRNGworldgenlib.jsSwitched from random numbers to pseudorandom numbers - seeds generate consistently but take longer to loadOrchid +PRNGworldgenlib.jsWorld generation library with seeded randomnessOrchid randomness_but_tick.jsRandom experimental elements using the tick function featureAlice randomness_but_tool.jsRandom experimental elements using the tool function featureAlice randomness.jsRandom experimental elementsAlice From 019acbd239a3b3d0d018eb0ed293a64c6b793942 Mon Sep 17 00:00:00 2001 From: JustAGenericUsername <92590792+JustAGenericUsername@users.noreply.github.com> Date: Sun, 28 Sep 2025 14:25:38 -0400 Subject: [PATCH 040/105] buttony buttons --- mods/logicgates.js | 39 ++++++++++++++++++--------------------- 1 file changed, 18 insertions(+), 21 deletions(-) diff --git a/mods/logicgates.js b/mods/logicgates.js index d23eae20..3888d199 100644 --- a/mods/logicgates.js +++ b/mods/logicgates.js @@ -296,33 +296,30 @@ elements.E2L_button = { state: "solid", category: "logic", tick: function(pixel){ + if (typeof pixel.db == "undefined"){pixel.db = 0} + for (var i = 0; i < adjacentCoords.length; i++) { + var coord = adjacentCoords[i]; + var x = pixel.x+coord[0]; + var y = pixel.y+coord[1]; + if (!isEmpty(x, y, true)){ + let newPixel = pixelMap[x][y] + if (newPixel.charge || newPixel.chargeCD){ + pixel.db = 5 + } + } + } + pixel.db-- 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)) { - if ((pixelMap[x][y].charge || pixelMap[x][y].chargeCD)){ - for (var j = 0; j < adjacentCoords.length; j++) { - var coord = adjacentCoords[j]; - var x = pixel.x+coord[0]; - var y = pixel.y+coord[1]; - if (!isEmpty(x,y,true)) { - if (pixelMap[x][y].element == "logic_wire"){ - pixelMap[x][y].lstate = 2 - } - } + if (pixelMap[x][y].element == "logic_wire"){ + if (pixel.db > 0){ + pixelMap[x][y].lstate = 2 + } else { + pixelMap[x][y].lstate = -2 } - return; - } - } - } - 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)) { - if (pixelMap[x][y].element == "logic_wire" && pixelMap[x][y].lstate > 0){ - pixelMap[x][y].lstate = -2 } } } From 9560f3dd0248259b804610dc6dcbe3d11e8f21ff Mon Sep 17 00:00:00 2001 From: Nekonico <163950752+DBNekonico@users.noreply.github.com> Date: Sun, 28 Sep 2025 18:06:58 -0700 Subject: [PATCH 041/105] 173 does not go through walls ! --- mods/scp.js | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/mods/scp.js b/mods/scp.js index 62d462e6..22a003c6 100644 --- a/mods/scp.js +++ b/mods/scp.js @@ -2757,7 +2757,7 @@ elements.scp_063 = { "DL|XX|DL", "M2%80 AND DL|M1 AND DL|M2%80 AND DL", ], - ignore: ["scp_063","head_049","body_049","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"], + 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","porcelain"], category: "scp", tempHigh: 190, stateHigh: ["molten_plastic","molten_plastic","fire","dioxin"], @@ -3410,6 +3410,7 @@ elements.body_173 = { seenPixel.dead = pixelTicks } } + break; } } } @@ -3453,6 +3454,7 @@ elements.body_173 = { seenPixel.dead = pixelTicks } } + break; } } } @@ -3725,7 +3727,7 @@ elements.scp_229 = { for (var i = 0; i < coords.length; i++) { if (!isEmpty(coords[i].x,coords[i].y) && !outOfBounds(coords[i].x,coords[i].y)) { var electric = pixelMap[coords[i].x][coords[i].y] - if (elements[electric.element].category == "nervous system" && Math.random() > 0.5 || electric.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 (elements[electric.element].category == "nervous system" && Math.random() > 0.5 || electric.element == "thunder_cloud" || 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] @@ -3813,7 +3815,7 @@ elements.scp_229 = { 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") { + if (electric.element == "brain" || electric.element == "thunder_cloud" || 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] @@ -5145,7 +5147,7 @@ elements.scp_999 = { conduct: .5, temp: 37, extinguish: true, - stain: 0.03, + stain: -0.03, cooldown: defaultCooldown, } From 5914ce2c04ffe36ca1f8589c94d1674a1fc76adb Mon Sep 17 00:00:00 2001 From: Nekonico <163950752+DBNekonico@users.noreply.github.com> Date: Sun, 28 Sep 2025 18:15:11 -0700 Subject: [PATCH 042/105] nuke update --- mods/scp.js | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/mods/scp.js b/mods/scp.js index 22a003c6..9f5e8138 100644 --- a/mods/scp.js +++ b/mods/scp.js @@ -102,6 +102,21 @@ elements.metanarrative_ontokinetic_hume_stabilizing_anomaly_neutralizing_all_pow hidden: true, } +elements.site_nuke = { + color: "#815E2B", + behaviorOn: [ + "XX|XX|XX", + "XX|XX|XX", + "M2|M1 AND EX:500>plasma,plasma,plasma,plasma,plasma,radiation,radiation,radiation,rad_steam,electric|M2", + ], + conduct: 0.75, + category: "scp", + state: "solid", + density: 1500, + excludeRandom: true, + cooldown: defaultCooldown +} + elements.d_class = { // color: ["#f5eac6","#d4c594","#a89160","#7a5733","#523018","#361e0e"], color: ["#f3e7db","#f7ead0","#eadaba","#d7bd96","#a07e56","#825c43","#604134","#3a312a"], @@ -3826,6 +3841,10 @@ elements.scp_229 = { else if (electric.element == "glass" || electric.element == "rad_glass" || electric.element == "stained_glass") { electric.element = "glass_shard" pixel.nCD = 2 + } + else if (electric.element == "site_nuke") { + explodeAt(electric.x,electric.y,500,["plasma","plasma","plasma","plasma","plasma","plasma","plasma","radiation","radiation","radiation","radiation","rad_steam","electric","electric"]) + pixel.nCD = 2 } else if (electric.charge) { deletePixel(electric.x,electric.y) @@ -4933,7 +4952,7 @@ elements.scp_804 = { } } } - 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") { + else if (manmade.element == "unknown" || manmade.element == "site_nuke" || 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 } From 70e597dfeb989e287ff3b01219c762e3f164779e Mon Sep 17 00:00:00 2001 From: Nekonico <163950752+DBNekonico@users.noreply.github.com> Date: Sun, 28 Sep 2025 18:44:01 -0700 Subject: [PATCH 043/105] gugfix --- mods/scp.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/mods/scp.js b/mods/scp.js index 9f5e8138..28b0118a 100644 --- a/mods/scp.js +++ b/mods/scp.js @@ -104,17 +104,17 @@ elements.metanarrative_ontokinetic_hume_stabilizing_anomaly_neutralizing_all_pow elements.site_nuke = { color: "#815E2B", + behavior: behaviors.WALL, behaviorOn: [ "XX|XX|XX", - "XX|XX|XX", - "M2|M1 AND EX:500>plasma,plasma,plasma,plasma,plasma,radiation,radiation,radiation,rad_steam,electric|M2", + "XX|EX:250>molten_glass,molten_glass,plasma,plasma,plasma,plasma,plasma,plasma,plasma,radiation,radiation,radiation,rad_steam,electric,electric,electric|XX", + "M2|M1|M2", ], - conduct: 0.75, + conduct: 1, category: "scp", state: "solid", density: 1500, excludeRandom: true, - cooldown: defaultCooldown } elements.d_class = { @@ -3843,7 +3843,7 @@ elements.scp_229 = { pixel.nCD = 2 } else if (electric.element == "site_nuke") { - explodeAt(electric.x,electric.y,500,["plasma","plasma","plasma","plasma","plasma","plasma","plasma","radiation","radiation","radiation","radiation","rad_steam","electric","electric"]) + explodeAt(electric.x,electric.y,100,["plasma","plasma","plasma","plasma","plasma","plasma","plasma","radiation","radiation","radiation","radiation","rad_steam","electric","electric"]) pixel.nCD = 2 } else if (electric.charge) { From eae096f0f0fd30a63cda8d5e36a6baf95ac18262 Mon Sep 17 00:00:00 2001 From: David Kopal <112717418+DavidKopal@users.noreply.github.com> Date: Tue, 30 Sep 2025 06:12:27 +0200 Subject: [PATCH 044/105] logicgates.js integration and a few fixes. --- mods/bf.js | 157 +++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 134 insertions(+), 23 deletions(-) diff --git a/mods/bf.js b/mods/bf.js index 830805ee..d4a6e663 100644 --- a/mods/bf.js +++ b/mods/bf.js @@ -16,9 +16,10 @@ class Interpreter { this.tsay = "" } - async run(px) { - while (this.ci < this.code.length) { - const token = this.code[this.ci] + async run(px, code = this.code) { + this.ci = 0 + while (this.ci < code.length) { + const token = code[this.ci] switch (token) { case ">": @@ -66,8 +67,8 @@ class Interpreter { let open = 1 while (open > 0) { this.ci++ - if (this.code[this.ci] === "[") open++ - else if (this.code[this.ci] === "]") open-- + if (code[this.ci] === "[") open++ + else if (code[this.ci] === "]") open-- } } else { this.loops.push(this.ci) @@ -90,6 +91,22 @@ class Interpreter { } } +class RemoteBase { + constructor(base) { + this.base = base + this.code = "" + } + + run() { + pixelMap[this.base[0]][this.base[1]].interpreter.run(pixelMap[this.base[0]][this.base[1]], this.code) + this.code = "" + } + + getMap() { + return pixelMap[this.base[0]][this.base[1]].interpreter.map + } +} + const bftokens = { bf_base: "#00ff00", bf_remote_base: "#008600", @@ -104,6 +121,7 @@ const bftokens = { "!": "#ff69b4", "split": "#565656", "act": "#ffc400", + "bf_gate": "#ffc400", } const bftokenslist = Object.keys(bftokens) @@ -146,14 +164,21 @@ elements.bf_remote_base = { tick: (px) => { if (pixelTicks == px.start) { px.act = false - px.base = pixelMap[remotebase1[0]][remotebase1[1]].base + px.interpreter = new RemoteBase(pixelMap[remotebase1[0]][remotebase1[1]].base) + px.base = [px.x, px.y] 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.parent = remotebase1 px.cd = false } }, + onDelete: (px) => { + if (!isEmpty(px.parent[0], px.parent[1]) && pixelMap[px.parent[0]][px.parent[1]].remotes) { + pixelMap[px.parent[0]][px.parent[1]].remotes.filter(a => !(a[0] === px.x && a[1] === px.y)) + } + } } elements.reader = { @@ -208,8 +233,85 @@ elements.bf_runner = { } } +dependOn("logicgates.js", () => { + elements.bf_gate = { + category: "bf", + color: "#ffc400", + state: "solid", + behavior: behaviors.WALL, + tick: (px) => { + if (!px.base) { + 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 = "#ffc400" + } + var countNeighborsResult = countNeighbors(pixel) + if (countNeighborsResult.charged > 0) { + px.can = true + } else { + px.can = false + } + + if (!isEmpty(px.x - 1, px.y)) { + const left = pixelMap[px.x - 1][px.y] + if (bftokenslist.includes(left.element) && left.base) { + if (left.act && !px.act && px.can) { + left.act = false + px.act = true + pixelMap[px.base[0]][px.base[1]].interpreter.code += "g" + if (isEmpty(px.x + 1, px.y) || !pixelMap[px.x][px.y].base || (pixelMap[px.x][px.y].element == "bf_gate" && !pixelMap[px.x][px.y].can)) { + px.act = false + } + 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]]) + } + } + } + } + + const ns = getNeighbors(px) + ns.forEach(n => { + if (pixelMap[px.base[0]][px.base[1]].interpreter instanceof Interpreter) { + 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 + } + } else { + if (n.element == "reader" && pixelMap[px.base[0]][px.base[1]].interpreter.getMap()[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.getMap()[n.tread[0]] == n.tread[1]) { + n.charge = 1 + } + } + }) + } + + if (isEmpty(px.x + 1, px.y) || !pixelMap[px.x + 1][px.y].base || (pixelMap[px.x + 1][px.y].element == "bf_gate" && !pixelMap[px.x + 1][px.y].can)) { + px.act = false + } + } + } +}, true) + for (let token of bftokenslist) { - if (token == "bf_base" || token == "bf_remote_base") { continue } + if (token == "bf_base" || token == "bf_remote_base" || token == "bf_gate") { continue } elements[token] = { category: "bf", color: bftokens[token], @@ -217,7 +319,6 @@ for (let token of bftokenslist) { behavior: behaviors.WALL, tick: (px) => { if (!px.base) { - px.way = "l" px.act = false const ns = getNeighbors(px) if (ns.length > 0) { @@ -235,36 +336,46 @@ for (let token of bftokenslist) { px.color = bftokens[token] } const ns = getNeighbors(px) - if (ns.length > 0) { - const left = ns[0] + if (ns.length > 0 && !isEmpty(px.x - 1, px.y)) { + const left = pixelMap[px.x - 1][px.y] 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 (px.remotes) { + px.remotes.forEach(remote => { + pixelMap[remote[0]][remote[1]].act = true + console.log(pixelMap[remote[0]][remote[1]].act) + }) + } else { + pixelMap[px.base[0]][px.base[1]].interpreter.run(pixelMap[px.base[0]][px.base[1]]) } } } - if (ns.length >= 2) { - ns.forEach(n => { + } + if (ns.length >= 2) { + ns.forEach(n => { + if (pixelMap[px.base[0]][px.base[1]].interpreter instanceof Interpreter) { 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 } - }) - } + } else { + if (n.element == "reader" && pixelMap[px.base[0]][px.base[1]].interpreter.getMap()[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.getMap()[n.tread[0]] == n.tread[1]) { + n.charge = 1 + } + } + }) } } + + if (isEmpty(px.x + 1, px.y) || !pixelMap[px.x + 1][px.y].base || (pixelMap[px.x + 1][px.y].element == "bf_gate" && !pixelMap[px.x + 1][px.y].can)) { + px.act = false + } } } } From 13bc3d88d48bc758c8281ea9df4b7049c821778a Mon Sep 17 00:00:00 2001 From: slweeb <91897291+slweeb@users.noreply.github.com> Date: Wed, 1 Oct 2025 13:18:10 -0400 Subject: [PATCH 045/105] Delete mods/liquid_Master.js Nonfunctional --- mods/liquid_Master.js | 55 ------------------------------------------- 1 file changed, 55 deletions(-) delete mode 100644 mods/liquid_Master.js diff --git a/mods/liquid_Master.js b/mods/liquid_Master.js deleted file mode 100644 index b3dc732f..00000000 --- a/mods/liquid_Master.js +++ /dev/null @@ -1,55 +0,0 @@ -runAfterLoad(function() { - console.log("Liquefier Mod loaded!") - console.log("Created by Hitochi — turns elements into liquid forms.") -}) - -elements.liquefier = { - color: "#33ccff", - behavior: behaviors.POWDER, // sits in place - category: "machines", - state: "solid", - density: 2000, - tick: function(pixel) { - const dirs = [ - [0,1], [0,-1], [1,0], [-1,0], - [1,1], [-1,1], [1,-1], [-1,-1] - ]; - for (const [dx,dy] of dirs) { - const x = pixel.x+dx; - const y = pixel.y+dy; - if (outOfBounds(x,y)) continue; - - const target = pixelMap[x][y]; - if (!target) continue; - if (target.element === "liquefier") continue; - - const liquidName = target.element + "_liquid"; - - // Define the liquid version if missing - if (!elements[liquidName]) { - let baseColor = elements[target.element]?.color || "#654321"; - if (Array.isArray(baseColor)) baseColor = baseColor[0]; - - // check if original is food - const isEdible = - elements[target.element]?.isFood === true || - elements[target.element]?.category === "food"; - - elements[liquidName] = { - color: [baseColor, "#3399ff"], // tinted version - behavior: behaviors.LIQUID, - category: "liquids", - state: "liquid", - density: 1050, - viscosity: 8, - isFood: isEdible, // only food is edible - desc: "Liquefied form of " + target.element - }; - } - - // Turn neighbor into its liquid version - changePixel(target, liquidName); - } - }, - desc: "Liquefies nearby pixels into their liquid versions. Food becomes drinkable." -}; From 9a2ed81b4a96eccfde3cab7c26a4d8f3f0cbd7b2 Mon Sep 17 00:00:00 2001 From: slweeb <91897291+slweeb@users.noreply.github.com> Date: Thu, 2 Oct 2025 17:27:08 -0400 Subject: [PATCH 046/105] Formatting and consistency --- mod-list.html | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/mod-list.html b/mod-list.html index 81272bed..54f54812 100644 --- a/mod-list.html +++ b/mod-list.html @@ -174,8 +174,8 @@ extra_element_info.jsDescriptions to various vanilla elements. Used to provide the functionality that desc now does before it was added to vanillaMelecie extrasaveslots.jsExtra saves slots [KEEP IMPORTANT SAVES AS FILES!!]Jayd find.jsFind mode that highlights a chosen element as pulsating red and yellow [More Info]Alice -hideandshowtools.jsTools to hide elements and show hidden elementsMicaelNotUsed gasdecay.jsGases will slowly decay over timenousernamefound +hideandshowtools.jsTools to hide elements and show hidden elementsMicaelNotUsed human_friendly_design.jsDrag and Mix tools don't kill humansNekonico insane_random_events.jsMassively buffs random eventsAlice jaydsfunctions.jsExtra toolsJayd @@ -201,12 +201,12 @@ Science & Chemistry alcohol.jsMethanol, (iso-)propanol, and butanolAlice alkahest.jsThe alkahest, a liquid which dissolves anythingAlice -alkali_metal.jsThe missing alkali metals. (Inspired by nobegas.js and halogen.js)Cube14yt +alkali_metal.jsThe missing alkali metals (Inspired by noblegas.js and halogen.js)Cube14yt aScientistsWish.jsSeveral things related to science and physicsCarbon Monoxide, salmonfishy bettermetalscrap.jsMetal scrap can be melted back into its original materialnousernamefound bigger_star_spawners.jsSpawners for larger starsAlice -biology.jsVarious elements and features that let you build your own organismNekonico -bioooze_and_pyrogens.jsBio-Ooze from Frackin' Universe and several heat-producing materials from various games' modsAlice +biology.jsVarious elements and features for building large organismsNekonico +bioooze_and_pyrogens.jsBio-Ooze from Frackin' Universe and several heat-producing materials from various games' modsAlice boiling_things.jsVarious elements can be vaporizedAlice bouncing_balls.jsNew types of balls that bounce accurately and rollNekonico chalcopyrite.jsThe chalcopyrite oreSophie @@ -220,7 +220,7 @@ fire_mod.jsVarious properties to change fire behavior and radioactive fireAlice fire_slime.jsPyrogenic version of slimeAlice Gemstones.jsGemstonesSchweeny -glenn_gases.jsMost gases from the Glenn's Gases mod into SandboxelsAlice +glenn_gases.jsMost gases from the Glenn's Gases mod into SandboxelsAlice grav_mudstones.jsVarious forms of mudstone with different gravitiesAlice halogen.jsThe missing halogensnousernamefound hidden_ground.jsHides most rock variants from the_ground.js excluding the base rocks and wallsMelecie @@ -233,7 +233,7 @@ mars.jsMartian materialscharcoal_afterlife metals.jsSeveral metalsAlice mixture.jsMany chemicals can be mixedlllllllllwith10ls -more_gold.jsGreen Goldpixelegend4 +more_gold.jsGreen and Black Goldpixelegend4 morechemistry.jsNew chemicals, compounds, and machinesOrchid moreliquids.jsVarious liquidste-agma-at neutronium_compressor.jsCompressor from Minecraft's Avaritia mod that compresses 10,000 pixels of an element into a singularityAlice @@ -253,7 +253,7 @@ colored_lightbulbs.jsLight bulb that can be paintedguzzo86, ggod combustion.jsComponents necessary for combustion enginesuptzik conveyance.jsConveyors, operated with and without electricityMelecie -datawire.jsAdds a wire that transfers data and other operators and machines for itOrchid +datawire.jsWire that transfers data and other operators and machines for itOrchid drill.jsDrills made out of several materialsSuss ExtraMachines.jsSensors, energy resources, materials, and moreMecoolnotcool fans.jsFansCube14yt @@ -272,7 +272,7 @@ pushers.jsPixels that push elements away from themAlice sandboxels.jsDigital screen to play a mini version of SandboxelsNekonico schematics.jsSchematics for logic gatesSquareScreamYT -scp.jsMod for the SCP Foundation, a secretive organization that contains anomalous objects away from the public, from a collaborative writing website.Nekonico +scp.jsCreatures and items from the SCP WikiNekonico spouts.jsSpouts for all liquidskaeud state_voids.jsSeveral elements that delete specific states of matterAlice switches.jsElectrical switches that can be toggledAlice @@ -281,7 +281,7 @@ video.jsVideo playerggod waterspout.jsRe-adds the old Water Spoutmollthecoder WhisperingTheory.jsMany more variants of heater and coolerkaeud -wifi_draw.jsDraws connections between WiFi in wifi.js and logicgates.jsRedBirdly +wifi_draw.jsConnections between WiFi in wifi.js and logicgates.jsRedBirdly Weapons aircrafts.jsAircrafts and aircraft partsJayd @@ -293,7 +293,7 @@ meat_rockets.jsRockets that create meat when explodingMelecie more_breaking.jsMore elements can be brokenAlice rays.jsMore Ray typesAlice -rays++.jsCouple more raysuptzik +rays++.jsA couple more raysuptzik scp.jsCreatures and items from the SCP WikiNekonico subspace.jsThe Subspace Tripmine from Robloxnousernamefound war_crimes.jsTear gas and morevoidapex11 @@ -370,7 +370,7 @@ bfdi.jsSeveral references to Battle for Dream IslandTaterbob citybuilding.jsSeeds that create miniature buildings and other city-related itemsSquareScreamYT collab_mod.jsCreated by multiple people, adds random thingsmrapple, ilikepizza, stefanblox -cubesstuff.jsSome random stuff like disco ball, pyrite, and nordic gold.Cube14yt +cubesstuff.jsSome random stuff like Disco Ball, Pyrite, and Nordic GoldCube14yt doom.jsAs seen on TikTok - Select the Doom element to start [WASD to move]ggod elem3.jsAll elements and combinations from Elemental 3 [Very Large]Sophie explosionsound.jsSound effects for explosionsnousernamefound @@ -417,7 +417,7 @@ invisible_wall.jsElement like Wall that takes the color of the backgroundAlice lightmap.jsLight sources glowRedBirdly liquid_mixing.jsLiquids can mix colors dynamicallyNekonico -manyMoreThemes.jsAdds additional themesJayd +manyMoreThemes.jsAdditional themesJayd moreViews.jsMany new rendering modesggod nicer_flame.jsFire is visually pleasingRedBirdly occlusion.jsRealistic shadows, similar to Terraria's lightingRedBirdly @@ -445,7 +445,7 @@ changeTempReactionParameter.jsThe changeTemp property to modded reactionsAlice code_library.jsFunctions and variables common to some other modsAlice controllable_pixel_test.jsPixel that can be controlled with the keyboard keys [More Info] [PC ONLY]Alice -customexplosion.jsAdded a custom explosion element and interface for it.Orchid +customexplosion.jsCustom explosion element and interface for itOrchid date_test.jsK-pop idol birthday testing stuffAlice drawPixels_change_test.jsTest of altering drawPixels(). Gives burning pixels a red overlay similar to the yellow overlay for charged pixelsAlice example_mod.jsExample mod for new moddersR74n @@ -471,8 +471,8 @@ structure_test.jsTest for implementing structures into SandboxelsAlice test.jsTest that adds mayo :)R74n tool_pixel_behavior.jsGives unique behaviors to tools if placed with cheatsAlice -worldgenlibrary.jsWorld generation libraryOrchid worldgen_test.jsElement that generates a save with a grass layer, dirt layer, rock layer, and a pondAlice +worldgenlibrary.jsWorld generation libraryOrchid Broken or Deprecated a_mod_by_alice.jsCombination of most of Alice's mods, and some other thingsAlice From 2d14411305c9acf981a3041f6927937f1ba50f49 Mon Sep 17 00:00:00 2001 From: Nekonico <163950752+DBNekonico@users.noreply.github.com> Date: Thu, 2 Oct 2025 18:45:16 -0700 Subject: [PATCH 047/105] keycard update --- mods/scp.js | 528 ++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 489 insertions(+), 39 deletions(-) diff --git a/mods/scp.js b/mods/scp.js index 28b0118a..68257180 100644 --- a/mods/scp.js +++ b/mods/scp.js @@ -39,6 +39,14 @@ window.addEventListener("load", () => { document.getElementById("elementButton-REDACTED")?.remove() }) +async function _scpAskPrompt(message, defaultValue = "") { + return new Promise(resolve => { + promptInput(message, (result) => { + resolve(result); + }, "Awaiting credentials...", defaultValue); + }) +} + hex_is_light = function(color) { hex = color.replace('#', ''); c_r = parseInt(hex.substring(0, 0 + 2), 16); @@ -65,6 +73,47 @@ elements.human.reactions.scp_229 = { attr1:{panic:5} } elements.human.reactions.scp_999 = { attr1:{panic:0} } elements.human.reactions.black_acid = { attr1:{panic:1} } +if (!elements.water.reactions) { elements.water.reactions = {}; } +elements.water.reactions.access_door = { elem1:null, elem2:"rust", chance:0.000125 } + +if (!elements.body.reactions) { elements.body.reactions = {}; } +elements.body.reactions.level_0 = { chance:0.3, func:function(pixel1,pixel2){ + if (!pixel1.level || pixel1.level > pixel2.level) { + pixel1.level = pixel2.level + deletePixel(pixel2.x,pixel2.y) + } +} }, +elements.body.reactions.level_1 = { chance:0.5, func:function(pixel1,pixel2){ + if (!pixel1.level || pixel1.level > pixel2.level) { + pixel1.level = pixel2.level + deletePixel(pixel2.x,pixel2.y) + } +} }, +elements.body.reactions.level_2 = { chance:0.5, func:function(pixel1,pixel2){ + if (!pixel1.level || pixel1.level > pixel2.level) { + pixel1.level = pixel2.level + deletePixel(pixel2.x,pixel2.y) + } +} }, +elements.body.reactions.level_3 = { chance:0.5, func:function(pixel1,pixel2){ + if (!pixel1.level || pixel1.level > pixel2.level) { + pixel1.level = pixel2.level + deletePixel(pixel2.x,pixel2.y) + } +} }, +elements.body.reactions.level_4 = { chance:0.5, func:function(pixel1,pixel2){ + if (!pixel1.level || pixel1.level > pixel2.level) { + pixel1.level = pixel2.level + deletePixel(pixel2.x,pixel2.y) + } +} }, +elements.body.reactions.level_5 = { chance:0.5, func:function(pixel1,pixel2){ + if (!pixel1.level || pixel1.level > pixel2.level) { + pixel1.level = pixel2.level + deletePixel(pixel2.x,pixel2.y) + } +} }, + hyperCoords = [ [0,1], [0,1], @@ -102,12 +151,289 @@ elements.metanarrative_ontokinetic_hume_stabilizing_anomaly_neutralizing_all_pow hidden: true, } +currentLevel = 0 +elements.keycard_terminal = { + color: "#C6B589", + onSelect: async function() { + currentLevel = await _scpAskPrompt("Please input the desired level requirement of this terminal as a number 0 through 5.", (currentLevel||undefined)) + }, + onPlace: function(pixel) { + if (!pixel.levelReq){ + pixel.levelReq = currentLevel; + pixel.clone = pixel.levelReq; + } + }, + tick: function(pixel) { + if (!pixel.levelReq){ + pixel.levelReq = currentLevel; + pixel.clone = pixel.levelReq; + } + if (!pixel.clone){ + pixel.clone = pixel.levelReq; + } + if (!isEmpty(pixel.x, pixel.y-1, true)){ + if (pixel.levelReq && elements[pixelMap[pixel.x][pixel.y-1].element].level < pixel.levelReq) {} + else if (pixelMap[pixel.x][pixel.y-1].level >= pixel.levelReq && (pixelMap[pixel.x][pixel.y-1].element == "body" || pixelMap[pixel.x][pixel.y-1].element == "bead" || elements[pixelMap[pixel.x][pixel.y-1].element].keycard == true)|| pixelMap[pixel.x][pixel.y-1].on) { + pixel.on = true; + var coordsToShock = [ + [pixel.x, pixel.y+1], + [pixel.x+1, pixel.y], + [pixel.x-1, pixel.y], + ] + for (var i = 0; i < coordsToShock.length; i++) { + var x = coordsToShock[i][0]; + var y = coordsToShock[i][1]; + if (!isEmpty(x,y,true)) { + var newpixel = pixelMap[x][y]; + if (elements[newpixel.element].conduct) { + newpixel.charge = 1; + } + } + } + } + } + else if (pixel.on) { + pixel.on = false; + } + doDefaults(pixel); + }, + category: "scp", + state: "solid", + density: 6394.4 +} + +elements.access_door = { + color: "#515151", + onSelect: async function() { + currentLevel = await _scpAskPrompt("Please input the desired level requirement of this door as a number 0 through 5.", (currentLevel||undefined)) + }, + onPlace: function(pixel) { + if (!pixel.levelReq){ + pixel.levelReq = currentLevel; + pixel.clone = pixel.levelReq; + } + }, + tick: function(pixel) { + if (pixel.level){ + pixel.levelReq = pixel.level; + pixel.clone = pixel.level; + delete pixel.level + } + else if (!pixel.levelReq){ + pixel.levelReq = currentLevel; + pixel.clone = pixel.levelReq; + } + if (!pixel.clone){ + pixel.clone = pixel.levelReq; + } + if (!isEmpty(pixel.x-1, pixel.y, true) && !outOfBounds(pixel.x-1, pixel.y) && Math.random() > 0.9){ + let neighbor = pixelMap[pixel.x-1][pixel.y] + if (pixel.levelReq && elements[neighbor.element].level < pixel.levelReq) {} + else if (neighbor.level >= pixel.levelReq && (neighbor.element == "body" || neighbor.element == "body_1000" || neighbor.element == "body_008" || neighbor.element == "body_1015" || neighbor.element == "body_035" || neighbor.element == "body_012_1")) { + if (neighbor.dir == 1 && !isEmpty(neighbor.x,neighbor.y-1) && !outOfBounds(neighbor.x,neighbor.y-1)) { + if (isEmpty(pixel.x+1,pixel.y) && isEmpty(pixel.x+1,pixel.y-1)) { + if (tryMove(pixelMap[neighbor.x][neighbor.y-1],pixel.x+1,pixel.y-1)) { + movePixel(neighbor,pixel.x+1,pixel.y) + } + } + else if (isEmpty(pixel.x+1,pixel.y-1) && isEmpty(pixel.x+1,pixel.y-2)) { + if (tryMove(pixelMap[neighbor.x][neighbor.y-1],pixel.x+1,pixel.y-2)) { + movePixel(neighbor,pixel.x+1,pixel.y-1) + } + } + else if (isEmpty(pixel.x+1,pixel.y+1) && isEmpty(pixel.x+1,pixel.y)) { + if (tryMove(pixelMap[neighbor.x][neighbor.y-1],pixel.x+1,pixel.y)) { + movePixel(neighbor,pixel.x+1,pixel.y+1) + } + } + else if (!isEmpty(pixel.x+1,pixel.y) && !isEmpty(pixel.x+1,pixel.y-1) && isEmpty(pixel.x+2,pixel.y+1) && isEmpty(pixel.x+2,pixel.y)) { + let doorB = pixelMap[pixel.x+1][pixel.y] + let doorH = pixelMap[pixel.x+1][pixel.y-1] + if (doorB.levelReq <= pixel.levelReq && doorH.levelReq <= pixel.levelReq) { + if (tryMove(pixelMap[neighbor.x][neighbor.y-1],pixel.x+2,pixel.y-1)) { + movePixel(neighbor,pixel.x+2,pixel.y) + } + } + } + } + } + } + else if (!isEmpty(pixel.x+1, pixel.y, true) && !outOfBounds(pixel.x+1, pixel.y) && Math.random() > 0.9){ + let neighbor = pixelMap[pixel.x+1][pixel.y] + if (pixel.levelReq && elements[neighbor.element].level < pixel.levelReq) {} + else if (neighbor.level >= pixel.levelReq && (neighbor.element == "body" || neighbor.element == "body_1000" || neighbor.element == "body_008" || neighbor.element == "body_1015" || neighbor.element == "body_035" || neighbor.element == "body_012_1")) { + if (neighbor.dir == -1 && !isEmpty(neighbor.x,neighbor.y-1) && !outOfBounds(neighbor.x,neighbor.y-1)) { + if (isEmpty(pixel.x-1,pixel.y) && isEmpty(pixel.x-1,pixel.y-1)) { + if (tryMove(pixelMap[neighbor.x][neighbor.y-1],pixel.x-1,pixel.y-1)) { + movePixel(neighbor,pixel.x-1,pixel.y) + } + } + else if (isEmpty(pixel.x-1,pixel.y-1) && isEmpty(pixel.x-1,pixel.y-2)) { + if (tryMove(pixelMap[neighbor.x][neighbor.y-1],pixel.x-1,pixel.y-2)) { + movePixel(neighbor,pixel.x-1,pixel.y-1) + } + } + else if (isEmpty(pixel.x-1,pixel.y+1) && isEmpty(pixel.x-1,pixel.y)) { + if (tryMove(pixelMap[neighbor.x][neighbor.y-1],pixel.x-1,pixel.y)) { + movePixel(neighbor,pixel.x-1,pixel.y+1) + } + } + else if (!isEmpty(pixel.x-1,pixel.y) && !isEmpty(pixel.x-1,pixel.y-1)) { + let doorB = pixelMap[pixel.x-1][pixel.y] + let doorH = pixelMap[pixel.x-1][pixel.y-1] + if (doorB.levelReq <= pixel.levelReq && doorH.levelReq <= pixel.levelReq && isEmpty(pixel.x-2,pixel.y+1) && isEmpty(pixel.x-2,pixel.y)) { + if (tryMove(pixelMap[neighbor.x][neighbor.y-1],pixel.x-2,pixel.y-1)) { + movePixel(neighbor,pixel.x-2,pixel.y) + } + } + } + } + } + } + tryMove(pixel, pixel.x, pixel.y+1); + doDefaults(pixel); + }, + grain: 0.5, + behavior: behaviors.WALL, + tempHigh: 1200, + stateHigh: "molten_galvanized_steel", + stateHighColorMultiplier: 0.86, + conduct: 0.475, + hardness: 0.8, + breakInto: "galvanized_steel", + breakIntoColorMultiplier: [1.1,1,0.86], + category: "scp", + state: "solid", + density: 7850, +} + +elements.level_0 = { + color: ["#635957","#AB9D9C","#D3CCCC"], + name: "Level 0 Keycard", + behavior: behaviors.STURDYPOWDER, + keycard: true, + tick: function(pixel) { + if (!pixel.level){ + pixel.level = 0; + } + doDefaults(pixel); + }, + category: "scp", + tempHigh: 185, + stateHigh: "molten_plastic", + burn: 10, + burnTime: 400, + burnInto: "dioxin", + state: "solid", + density: 1052, +} +elements.level_1 = { + color: ["#8C7D0D","#FDE507","#FCF081"], + name: "Level 1 Keycard", + behavior: behaviors.STURDYPOWDER, + keycard: true, + tick: function(pixel) { + if (!pixel.level){ + pixel.level = 1; + } + doDefaults(pixel); + }, + category: "scp", + tempHigh: 185, + stateHigh: "molten_plastic", + burn: 10, + burnTime: 400, + burnInto: "dioxin", + state: "solid", + density: 1052, +} +elements.level_2 = { + color: ["#8C710B","#FDCC03","#FCE47F"], + name: "Level 2 Keycard", + behavior: behaviors.STURDYPOWDER, + keycard: true, + tick: function(pixel) { + if (!pixel.level){ + pixel.level = 2; + } + doDefaults(pixel); + }, + category: "scp", + tempHigh: 190, + stateHigh: ["molten_plastic","molten_plastic","glue"], + burn: 10, + burnTime: 400, + burnInto: "dioxin", + state: "solid", + density: 1052, +} +elements.level_3 = { + color: ["#885C28","#F6A33D","#F9CF9C"], + name: "Level 3 Keycard", + behavior: behaviors.STURDYPOWDER, + keycard: true, + tick: function(pixel) { + if (!pixel.level){ + pixel.level = 3; + } + doDefaults(pixel); + }, + category: "scp", + tempHigh: 190, + stateHigh: ["molten_plastic","molten_plastic","molten_plastic","glue"], + burn: 5, + burnTime: 400, + burnInto: "dioxin", + state: "solid", + density: 1057, +} +elements.level_4 = { + color: ["#87371D","#F35828","#F7AA92"], + name: "Level 4 Keycard", + behavior: behaviors.STURDYPOWDER, + keycard: true, + tick: function(pixel) { + if (!pixel.level){ + pixel.level = 4; + } + doDefaults(pixel); + }, + category: "scp", + tempHigh: 660.3, + density: 2600, + conduct: 0.73, + hardness: 0.05, + breakInto: "metal_scrap", + stateHigh:"molten_aluminum", + superconductAt: -271.95, + state: "solid", +} +elements.level_5 = { + color: ["#831924","#EB1C36","#F38C99"], + name: "Level 5 Keycard", + behavior: behaviors.STURDYPOWDER, + keycard: true, + tick: function(pixel) { + if (!pixel.level){ + pixel.level = 5; + } + doDefaults(pixel); + }, + category: "scp", + tempHigh: 927, + density: 8330, + conduct: 0.52, + hardness: 0.275, + stateHigh: "molten_tungsten", + state: "solid", +} + elements.site_nuke = { color: "#815E2B", behavior: behaviors.WALL, behaviorOn: [ "XX|XX|XX", - "XX|EX:250>molten_glass,molten_glass,plasma,plasma,plasma,plasma,plasma,plasma,plasma,radiation,radiation,radiation,rad_steam,electric,electric,electric|XX", + "XX|EX:300>plasma,plasma,plasma,plasma,plasma,plasma,plasma,plasma,plasma,plasma,plasma,plasma,plasma,plasma,plasma,plasma,radiation,radiation,radiation,rad_steam,electric,electric,electric|XX", "M2|M1|M2", ], conduct: 1, @@ -185,6 +511,7 @@ elements.scientist = { 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) + pixelMap[pixel.x][pixel.y+1].level = 2 var color = pixel.color; changePixel(pixel,"head"); pixel.color = color; @@ -194,6 +521,7 @@ elements.scientist = { pixelMap[pixel.x][pixel.y-1].color = pixel.color; changePixel(pixel,"body"); pixel.color = pixelColorPick(pixel, elements.scientist.buttonColor); + pixel.level = 2 } else { deletePixel(pixel.x, pixel.y); @@ -227,7 +555,7 @@ 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", + name: "Security Officer", category: "scp", properties: { dead: false, @@ -238,6 +566,7 @@ elements.guard = { 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) + pixelMap[pixel.x][pixel.y+1].level = 2 var color = pixel.color; changePixel(pixel,"head"); pixel.color = color; @@ -247,6 +576,62 @@ elements.guard = { pixelMap[pixel.x][pixel.y-1].color = pixel.color; changePixel(pixel,"body"); pixel.color = pixelColorPick(pixel, elements.guard.buttonColor); + pixel.level = 2 + } + 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.director = { + // color: ["#f5eac6","#d4c594","#a89160","#7a5733","#523018","#361e0e"], + color: ["#f3e7db","#f7ead0","#eadaba","#d7bd96","#a07e56","#825c43","#604134","#3a312a"], + buttonColor: ["#2B2A30","#848692","#2B2A30","#515159","#919092","#069469","#047e99","#7f5fb0","#069469","#047e99","#7f5fb0","#EDEEF7","#D9D9E7","#F8F7FC","#C6C8DC","#D0DCF1"], + name: "Site Director", + 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.director.buttonColor) + pixelMap[pixel.x][pixel.y+1].level = 4 + 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.director.buttonColor); + pixel.level = 4 } else { deletePixel(pixel.x, pixel.y); @@ -1130,6 +1515,20 @@ elements.red_water = { "bird":{elem2:"scp_009_meat", chance:0.015}, "frog":{elem2:"scp_009_meat", chance:0.015}, "tadpole":{elem2:"scp_009_meat", chance:0.015}, + "iron": { elem1:null, elem2:"rust", chance:0.025 }, + "steel": { elem1:null, elem2:"rust", chance:0.02 }, + "galvanized_steel": { elem1:null, elem2:"rust", chance:0.00025 }, + "access_door": { elem1:null, elem2:"rust", chance:0.00025 }, + "aluminum": { elem1:["hydrogen","hydrogen","oxygen"], charged:true, chance:0.0025 }, + "zinc": { elem1:["hydrogen","hydrogen","oxygen"], charged:true, chance:0.015 }, + "steel": { elem1:["hydrogen","hydrogen","oxygen"], charged:true, chance:0.0125 }, + "iron": { elem1:["hydrogen","hydrogen","oxygen"], charged:true, chance:0.0125 }, + "tin": { elem1:["hydrogen","hydrogen","oxygen"], charged:true, chance:0.01 }, + "brass": { elem1:["hydrogen","hydrogen","oxygen"], charged:true, chance:0.001 }, + "bronze": { elem1:["hydrogen","hydrogen","oxygen"], charged:true, chance:0.001 }, + "copper": { elem1:["hydrogen","hydrogen","oxygen"], charged:true, chance:0.0075 }, + "silver": { elem1:["hydrogen","hydrogen","oxygen"], charged:true, chance:0.0075 }, + "gold": { elem1:["hydrogen","hydrogen","oxygen"], charged:true, chance:0.0075 } }, tempLow: -100, stateLow: "red_steam", @@ -1981,11 +2380,6 @@ elements.head_035 = { name: "SCP-035-1", color: ["#f7ead0","#faf9f6","#e9e6db"], category: "life", - behavior: [ - "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", - ], hidden: true, density: 1080, state: "solid", @@ -2026,7 +2420,10 @@ elements.head_035 = { doHeat(pixel); doBurning(pixel); doElectricity(pixel); - if (pixel.dead) { + if (Math.random() < 0.0125) { + releaseElement(pixel,"black_acid",4,true) + } + if (pixel.dead || (pixel.start+1000) , pixelTicks && Math.random() > 0.95) { // Turn into rotten_meat if pixelTicks-dead > 500 if (pixelTicks-pixel.dead > 200 && Math.random() < 0.1) { changePixel(pixel,"rotten_meat"); @@ -2772,7 +3169,7 @@ elements.scp_063 = { "DL|XX|DL", "M2%80 AND DL|M1 AND DL|M2%80 AND DL", ], - ignore: ["scp_063","head_049","body_049","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","porcelain"], + ignore: ["scp_063","head_049","body_049","shy_head","shy_body","head_049_1","body_049_1","head_008_1","body_008_1","head_012_1","body_012_1","scp_999","scp_682","head","body","plant","grass","algae","cell","cancer","worm","flea","termite","ant","spider","fly","firefly","bee","stink_bug","human","bird","rat","frog","tadpole","fish","slug","snail","sapling","evergreen","cactus","kelp","coral","pistil","tree_branch","vine","bamboo_plant","mushroom_stalk","mushroom_gill","mushroom_cap","lichen","homunculus","root","hyphae","skin","porcelain"], category: "scp", tempHigh: 190, stateHigh: ["molten_plastic","molten_plastic","fire","dioxin"], @@ -2904,7 +3301,7 @@ elements.shy_body = { category: "scp", pickElement: "scp_096", hardness: 1, - properties: { + properties: { dead: false, dir: 1, h: 0, @@ -3117,6 +3514,24 @@ elements.shy_body = { 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 { + tryMove(head, pixel.x+pixel.dir, pixel.y+2) + 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]) + } + } } 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) { @@ -3305,7 +3720,8 @@ elements.body_173 = { density: 2400, state: "solid", conduct: .025, - tempHigh: 1505, + tempHigh: 15050, + hardness: 1, 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, @@ -3580,7 +3996,8 @@ elements.head_173 = { density: 2400, state: "solid", conduct: .025, - tempHigh: 1505, + tempHigh: 15050, + hardness: 1, 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, @@ -3710,9 +4127,9 @@ elements.scp_229 = { "XX|SH%5|XX", ], category: "scp", - hardness: 0.85, + hardness: 0.25, breakInto: "metal_scrap", - tempHigh: 1750, + tempHigh: 1250, stateHigh: ["metal_scrap","metal_scrap","metal_scrap","metal_scrap","molten_glass","molten_plastic","molten_plastic"], properties: { radius: 10, @@ -3742,7 +4159,7 @@ elements.scp_229 = { for (var i = 0; i < coords.length; i++) { if (!isEmpty(coords[i].x,coords[i].y) && !outOfBounds(coords[i].x,coords[i].y)) { var electric = pixelMap[coords[i].x][coords[i].y] - if (elements[electric.element].category == "nervous system" && Math.random() > 0.5 || electric.element == "thunder_cloud" || electric.charge || electric.element == "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 (elements[electric.element].category == "nervous system" && Math.random() > 0.5 || electric.element == "thunder_cloud" || electric.charge || electric.element == "access_door" && Math.random() > 0.75 || electric.element == "keycard_terminal" || electric.element == "level_5" || electric.element == "scp_804" && electric.active == true || elements[electric.element].category == "logic" || electric.element == "brain" || electric.element == "fish" || electric.element == "frog" || electric.element == "rat" || electric.element == "bird" || electric.element == "head" || electric.element == "head_1000" || electric.element == "head_035" || electric.element == "head_008" || electric.element == "battery" || electric.element == "electric" || electric.element == "lightning" || electric.element == "malware" || electric.element == "gray_goo") { if (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] @@ -3830,7 +4247,7 @@ elements.scp_229 = { 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 == "thunder_cloud" || 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") { + if (electric.element == "brain" || electric.element == "access_door" || electric.element == "keycard_terminal" || electric.element == "level_4" || electric.element == "level_5" || electric.element == "thunder_cloud" || electric.element == "scp_804" && electric.active == true || elements[electric.element].category == "logic" || 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] @@ -3843,7 +4260,7 @@ elements.scp_229 = { pixel.nCD = 2 } else if (electric.element == "site_nuke") { - explodeAt(electric.x,electric.y,100,["plasma","plasma","plasma","plasma","plasma","plasma","plasma","radiation","radiation","radiation","radiation","rad_steam","electric","electric"]) + explodeAt(electric.x,electric.y,300,["plasma","plasma","plasma","plasma","plasma","plasma","plasma","radiation","radiation","radiation","radiation","rad_steam","electric","electric"]) pixel.nCD = 2 } else if (electric.charge) { @@ -3877,6 +4294,7 @@ elements.scp_236 = { dir: 1, }, tick: function(pixel) { + doDefaults(pixel) if (Math.random() < 0.2) { pixel.dir = Math.random() < 0.5 ? 1 : -1 } @@ -4952,7 +5370,7 @@ elements.scp_804 = { } } } - else if (manmade.element == "unknown" || manmade.element == "site_nuke" || 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") { + else if (manmade.element == "unknown" || manmade.element == "site_nuke" || manmade.element == "scp_035" || manmade.element == "access_door" || manmade.element == "keycard_terminal" || manmade.element == "scp_229" || elements[manmade.element].category == "machines" || elements[manmade.element].category == "logic" || 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 } @@ -4987,7 +5405,7 @@ elements.scp_804 = { } } } - 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") { + 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" || elements[manmade.element].keycard == true || 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 } @@ -5003,7 +5421,7 @@ elements.scp_804 = { } } } - 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") { + else if (manmade.panic && manmade.element == "bone" || elements[manmade.element].category == "medicine" || 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 } @@ -5632,24 +6050,10 @@ elements.body_1015 = { 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") - } - } - } - } - + if (Math.random() < 0.25 && !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) { + changePixel(pixel,"scp_1015") + releaseElement(pixel,"blood",4,true) + } // 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]; @@ -6181,6 +6585,52 @@ elements.scp_1147_leaf = { forceSaveColor: true } */ +elements.scp_1424 = { + name: "SCP-1424", + color: ["#E7E7E5","#DCD9D4","#ACACAC"], + temp: -23, + properties: { + dir: 1, + }, + tick: function(pixel) { + if (tryMove(pixel, pixel.x, pixel.y+1)) {} // Fall + doDefaults(pixel); + if (Math.random() < 0.05) { // Move 5% chance + var movesToTry = [ + [1*pixel.dir,0], + [1*pixel.dir,-1], + ]; + let moved = false; + // While movesToTry is not empty, tryMove(pixel, x, y) with a random move, then remove it. if tryMove returns true, break. + while (movesToTry.length > 0) { + var move = movesToTry.splice(Math.floor(Math.random() * movesToTry.length), 1)[0]; + if (isEmpty(pixel.x+move[0], pixel.y+move[1])) { + 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; + } + } + } + // 10% chance to change direction + if (Math.random() < 0.1 || !moved) { + pixel.dir *= -1; + } + } + if (Math.random() > 0.9 && Math.random() > 0.9) { + releaseElement(pixel,"ammonia",1,true) + } + if (pixel.temp > -17) { pixel.temp -= 1; } + else if (pixel.temp < -22) { pixel.temp += 1; } + }, + category: "scp", + density: 1580, + state: "solid", + conduct: .025, + cooldown: defaultCooldown, +} + elements.scp_1600 = { name: "SCP-1600-1", color: "#D6CE02", @@ -6254,7 +6704,7 @@ elements.scp_1600 = { 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"], + ignore: ["scp_1600_1","gallium","brass","zinc","sulfur","body_173","head_173","shy_body","shy_head","body_049","head_049","scp_035","scp_1015","scp_999","scp_063","scp_055"], canPlace: true, reactions: { "scp_682":{ stain2:"#CA8E2F", chance:0.05,}, From c1b233c1357f621e1777e0abc55253a497bf223d Mon Sep 17 00:00:00 2001 From: David Kopal <112717418+DavidKopal@users.noreply.github.com> Date: Fri, 3 Oct 2025 19:00:38 +0200 Subject: [PATCH 048/105] Add files via upload --- mods/more_cells.js | 414 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 414 insertions(+) create mode 100644 mods/more_cells.js diff --git a/mods/more_cells.js b/mods/more_cells.js new file mode 100644 index 00000000..9ff56ebc --- /dev/null +++ b/mods/more_cells.js @@ -0,0 +1,414 @@ +viewInfo[4] = { // energy view + name: "enrg", + pixel: function (pixel, ctx) { + if (elements[pixel.element].isCell === true) { + var stat = pixel.energy + var ratio = Math.log(stat) / Math.log(3000) + var hue = Math.round(ratio * 240) + if (hue < 0) hue = 0 + if (hue > 240) hue = 240 + drawSquare(ctx, `hsl(${hue},100%,50%)`, pixel.x, pixel.y) + } + } +} + +viewInfo[5] = { // breath view + name: "brth", + pixel: function (pixel, ctx) { + if (elements[pixel.element].isCell === true) { + var stat = pixel.breath + var ratio = Math.log(stat) / Math.log(3000) + var hue = Math.round(ratio * 240) + if (hue < 0) hue = 0 + if (hue > 240) hue = 240 + drawSquare(ctx, `hsl(${hue},100%,50%)`, pixel.x, pixel.y) + } + } +} + + +function baseCellTick(px) { + if (!elements[px.element].isCell) { return } + + if (px.energy > 3000) { px.energy = 3000 } + if (px.breath > 3000) { px.breath = 3000 } + + if (!px.static && Math.random() < 0.115) { + px.energy-- + px.breath-- + } + + if (px.energy < 1 || px.breath < 1) { + changePixel(px, "cancer") + return + } + + const ns = getNeighbors(px) + ns.forEach(n => { + if (!elements[n.element].isCell) { return } + + if (n.energy < px.energy) { + let transfer = (px.energy - n.energy) / 4 + transfer = Math.floor(Math.min(transfer, (px.transfer + n.transfer) / 2)) + px.energy -= transfer + n.energy += transfer + } + + if (n.breath < px.breath) { + let transfer = Math.floor((px.breath - n.breath) / 4) + transfer = Math.min(transfer, (px.transfer + n.transfer) / 2) + px.breath -= transfer + n.breath += transfer + } + + }) +} + +elements.chlorocyte = { + color: ["#00ff00", "#00a500", "#008a00", "#26a026", "#3eff3e"], + behavior: behaviors.WALL, + noMix: true, + properties: { + energy: 300, + breath: 300, + transfer: 1 + }, + isCell: true, + hoverStat: function (px) { + return `E:${px.energy} B:${px.breath}` + }, + tick: (px) => { + px.energy += (4 - getNeighbors(px).length) * 3 + baseCellTick(px) + doDefaults(px) + }, + tempHigh: 102, + stateHigh: ["steam", "steam", "steam", "sugar"], + tempLow: -2, + stateLow: ["ice", "ice", "ice", "sugar_ice"], + state: "solid", + density: 1000.1, + category: "cells", + breakInto: ["water", "dna", "dna", "dna"], + reactions: { + ...elements.cell.reactions, + cancer: { elem1: "cancer", chance: 0.005 } + } +} + +elements.nucleolyte = { + color: "#FF6F3C", + behavior: behaviors.WALL, + noMix: true, + properties: { + energy: 300, + breath: 300, + transfer: 1 + }, + isCell: true, + hoverStat: function (px) { + return `E:${px.energy} B:${px.breath}` + }, + tick: (px) => { + const ns = getNeighbors(px) + for (let n of ns) { + if (n.element == "vena" && n.charge) { + px.breath += 80 + px.energy += 80 + break + } + } + baseCellTick(px) + doDefaults(px) + }, + tempHigh: 102, + stateHigh: ["steam", "steam", "steam", "sugar"], + tempLow: -2, + stateLow: ["ice", "ice", "ice", "sugar_ice"], + state: "solid", + density: 1000.1, + category: "cells", + breakInto: ["sugar_water", "dna", "dna", "dna"], + reactions: { + ...elements.cell.reactions, + cancer: { elem1: "cancer", chance: 0.005 } + } +} + +elements.respira = { + color: ["#8888ff"], + behavior: behaviors.WALL, + noMix: true, + properties: { + energy: 300, + breath: 300, + transfer: 1 + }, + isCell: true, + hoverStat: function (px) { + return `E:${px.energy} B:${px.breath}` + }, + tick: (px) => { + px.breath += (4 - getNeighbors(px).length) * 3 + baseCellTick(px) + doDefaults(px) + }, + tempHigh: 102, + stateHigh: ["steam", "steam", "steam", "sugar"], + tempLow: -2, + stateLow: ["ice", "ice", "ice", "sugar_ice"], + state: "solid", + density: 1000.1, + category: "cells", + breakInto: ["water", "dna", "dna", "dna"], + reactions: { + ...elements.cell.reactions, + cancer: { elem1: "cancer", chance: 0.005 } + } +} + +elements.structura = { + color: ["#535353"], + behavior: behaviors.WALL, + noMix: true, + properties: { + energy: 300, + breath: 300, + transfer: 0, + static: true, + }, + isCell: true, + hoverStat: function (px) { + return `E:${px.energy} B:${px.breath}` + }, + tick: (px) => { + baseCellTick(px) + doDefaults(px) + }, + tempHigh: 102, + stateHigh: ["steam", "steam", "steam", "sugar"], + tempLow: -2, + stateLow: ["ice", "ice", "ice", "sugar_ice"], + state: "solid", + density: 1000.1, + category: "cells", + breakInto: ["water", "dna", "dna", "dna"], + reactions: { + ...elements.cell.reactions, + cancer: { elem1: "cancer", chance: 0.005 } + } +} + +elements.vena = { + color: ["#a85e5e"], + behavior: behaviors.WALL, + noMix: true, + properties: { + energy: 300, + breath: 300, + transfer: 0, + static: false, + }, + conduct: 1, + isCell: true, + hoverStat: function (px) { + return `E:${px.energy} B:${px.breath}` + }, + tick: (px) => { + if (px.charge) { + px.transfer = 500 + px.static = true + } else { + transfer = 0 + px.static = false + } + baseCellTick(px) + doDefaults(px) + }, + tempHigh: 102, + stateHigh: ["steam", "steam", "sugar_water", "sugar_water"], + tempLow: -2, + stateLow: ["ice", "ice", "sugar_ice", "sugar_ice"], + state: "solid", + density: 1010, + category: "cells", + breakInto: ["sugar_water", "sugar_water", "dna", "dna"], + reactions: { + ...elements.cell.reactions, + cancer: { elem1: "cancer", chance: 0.005 } + } +} + +elements.neurocell = { + color: ["#5e5fa8"], + behavior: behaviors.WALL, + noMix: true, + properties: { + energy: 300, + breath: 300, + transfer: 50, + cd: 1 + }, + conduct: 1, + isCell: true, + hoverStat: function (px) { + return `E:${px.energy} B:${px.breath}` + }, + tick: (px) => { + px.cd-- + if (px.cd < 1) { + px.cd = 20 + px.charge = 1 + } + baseCellTick(px) + doDefaults(px) + }, + tempHigh: 102, + stateHigh: ["steam", "steam", "sugar_water", "sugar_water"], + tempLow: -2, + stateLow: ["ice", "ice", "sugar_ice", "sugar_ice"], + state: "solid", + density: 1010, + category: "cells", + breakInto: ["sugar_water", "sugar_water", "dna", "dna"], + reactions: { + ...elements.cell.reactions, + cancer: { elem1: "cancer", chance: 0.005 } + } +} + +elements.insulon = { + color: ["#cadf7e"], + behavior: behaviors.WALL, + noMix: true, + properties: { + energy: 300, + breath: 300, + transfer: 1 + }, + conduct: 1, + isCell: true, + hoverStat: function (px) { + return `E:${px.energy} B:${px.breath}` + }, + tick: (px) => { + if (px.temp > 20) { + px.temp -= 6 + } + baseCellTick(px) + doDefaults(px) + }, + tempHigh: 300, + stateHigh: ["steam", "steam", "steam", "sugar"], + tempLow: -2, + stateLow: ["ice", "ice", "ice", "sugar_ice"], + state: "solid", + density: 1000.1, + category: "cells", + breakInto: ["water", "dna", "dna", "dna"], + reactions: { + ...elements.cell.reactions, + cancer: { elem1: "cancer", chance: 0.005 } + } +} + +elements.carapace = { + color: ["#46065a"], + behavior: behaviors.WALL, + noMix: true, + properties: { + energy: 300, + breath: 300, + transfer: 0 + }, + isCell: true, + hoverStat: function (px) { + return `E:${px.energy} B:${px.breath}` + }, + tick: (px) => { + baseCellTick(px) + doDefaults(px) + }, + tempHigh: 1200, + stateHigh: ["steam", "molten_copper", "steam", "sugar"], + state: "solid", + density: 1800, + category: "cells", + breakInto: ["water", "oxidized_copper", "dna", "dna"], +} + +elements.phagocyte = { + color: ["#a3d9a6"], + behavior: behaviors.WALL, + noMix: true, + properties: { + energy: 300, + breath: 300, + transfer: 0 + }, + isCell: true, + hoverStat: function (px) { + return `E:${px.energy} B:${px.breath}` + }, + tick: (px) => { + baseCellTick(px) + doDefaults(px) + }, + tempHigh: 102, + stateHigh: ["steam", "steam", "sugar", "sugar"], + tempLow: -2, + stateLow: ["ice", "ice", "sugar_ice", "sugar_ice"], + state: "solid", + density: 1010, + category: "cells", + breakInto: ["dna", "sugar", "dna", "dna"], + reactions: { + ...elements.cell.reactions, + cancer: { elem2: "stem_cell", chance: 0.055 }, + infection: { elem2: "stem_cell", chance: 0.075 }, + poison: { elem2: "stem_cell", chance: 0.025 }, + } +} + +elements.stem_cell = { + color: ["#c0c0c0"], + behavior: behaviors.LIQUID, + noMix: true, + hoverStat: function (px) { + return `E:${px.energy} B:${px.breath}` + }, + tick: (px) => { + const ns = getNeighbors(px) + if (ns.length > 0) { + const elem = ns[Math.floor(Math.random() * ns.length)].element + if (elements[elem].isCell) { + changePixel(px, elem) + } + } + doDefaults(px) + }, + tempHigh: 102, + stateHigh: ["steam", "steam", "sugar", "sugar"], + tempLow: -2, + stateLow: ["ice", "ice", "sugar_ice", "sugar_ice"], + state: "solid", + density: 1010, + category: "cells", + breakInto: ["dna", "sugar", "dna", "dna"], + reactions: { + ...elements.cell.reactions, + cancer: { elem1: "cancer", chance: 0.005 } + } +} + +elements.cancer.reactions.chlorocyte = { elem2: "cancer", chane: 0.005 } +elements.cancer.reactions.respira = { elem2: "cancer", chane: 0.005 } +elements.cancer.reactions.insulon = { elem2: "cancer", chane: 0.005 } +elements.cancer.reactions.neurocell = { elem2: "cancer", chane: 0.005 } +elements.cancer.reactions.vena = { elem2: "cancer", chane: 0.005 } + +elements.infection.reactions.chlorocyte = { elem2: "infection", chane: 0.0015 } +elements.infection.reactions.respira = { elem2: "infection", chane: 0.0015 } +elements.infection.reactions.insulon = { elem2: "infection", chane: 0.0015 } +elements.infection.reactions.neurocell = { elem2: "infection", chane: 0.0015 } +elements.infection.reactions.vena = { elem2: "infection", chane: 0.0015 } \ No newline at end of file From 851b3d9cb4957fc881b056a45ad4f489ad5aa157 Mon Sep 17 00:00:00 2001 From: Nekonico <163950752+DBNekonico@users.noreply.github.com> Date: Fri, 3 Oct 2025 21:44:58 -0700 Subject: [PATCH 049/105] more fixes --- mods/scp.js | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/mods/scp.js b/mods/scp.js index 68257180..8c6b2aba 100644 --- a/mods/scp.js +++ b/mods/scp.js @@ -2174,7 +2174,7 @@ elements.scp_035 = { color: ["#f7ead0","#faf9f6","#e9e6db"], buttonColor: ["#11111f","#f7ead0","#f7ead0","#f7ead0","#f7ead0","#11111f","#faf9f6","#faf9f6","#faf9f6","#faf9f6","#11111f","#e9e6db","#e9e6db","#e9e6db","#e9e6db","#11111f"], name: "SCP-035", - hardness: 0.6, + hardness: 0.9, category: "scp", behavior: [ "CR:black_acid%0.05|CR:black_acid%0.25|CR:black_acid%0.05", @@ -3946,6 +3946,8 @@ elements.body_173 = { break; } } + pixel.frozen1 = false + break; } if (x >= 99) { pixel.frozen1 = false @@ -3978,6 +3980,8 @@ elements.body_173 = { break; } } + pixel.frozen2 = false + break; } if (x <= -99) { pixel.frozen2 = false @@ -5421,7 +5425,7 @@ elements.scp_804 = { } } } - else if (manmade.panic && manmade.element == "bone" || elements[manmade.element].category == "medicine" || 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") { + else if (manmade.panic && manmade.element == "bone" || elements[manmade.element].category == "medicine" || 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 == "infected_blood" || 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 } From e2e995ab9d0a1024e74679fe452da25f45afe33c Mon Sep 17 00:00:00 2001 From: David Kopal <112717418+DavidKopal@users.noreply.github.com> Date: Sat, 4 Oct 2025 13:57:31 +0200 Subject: [PATCH 050/105] Delete mods/more_cells.js --- mods/more_cells.js | 414 --------------------------------------------- 1 file changed, 414 deletions(-) delete mode 100644 mods/more_cells.js diff --git a/mods/more_cells.js b/mods/more_cells.js deleted file mode 100644 index 9ff56ebc..00000000 --- a/mods/more_cells.js +++ /dev/null @@ -1,414 +0,0 @@ -viewInfo[4] = { // energy view - name: "enrg", - pixel: function (pixel, ctx) { - if (elements[pixel.element].isCell === true) { - var stat = pixel.energy - var ratio = Math.log(stat) / Math.log(3000) - var hue = Math.round(ratio * 240) - if (hue < 0) hue = 0 - if (hue > 240) hue = 240 - drawSquare(ctx, `hsl(${hue},100%,50%)`, pixel.x, pixel.y) - } - } -} - -viewInfo[5] = { // breath view - name: "brth", - pixel: function (pixel, ctx) { - if (elements[pixel.element].isCell === true) { - var stat = pixel.breath - var ratio = Math.log(stat) / Math.log(3000) - var hue = Math.round(ratio * 240) - if (hue < 0) hue = 0 - if (hue > 240) hue = 240 - drawSquare(ctx, `hsl(${hue},100%,50%)`, pixel.x, pixel.y) - } - } -} - - -function baseCellTick(px) { - if (!elements[px.element].isCell) { return } - - if (px.energy > 3000) { px.energy = 3000 } - if (px.breath > 3000) { px.breath = 3000 } - - if (!px.static && Math.random() < 0.115) { - px.energy-- - px.breath-- - } - - if (px.energy < 1 || px.breath < 1) { - changePixel(px, "cancer") - return - } - - const ns = getNeighbors(px) - ns.forEach(n => { - if (!elements[n.element].isCell) { return } - - if (n.energy < px.energy) { - let transfer = (px.energy - n.energy) / 4 - transfer = Math.floor(Math.min(transfer, (px.transfer + n.transfer) / 2)) - px.energy -= transfer - n.energy += transfer - } - - if (n.breath < px.breath) { - let transfer = Math.floor((px.breath - n.breath) / 4) - transfer = Math.min(transfer, (px.transfer + n.transfer) / 2) - px.breath -= transfer - n.breath += transfer - } - - }) -} - -elements.chlorocyte = { - color: ["#00ff00", "#00a500", "#008a00", "#26a026", "#3eff3e"], - behavior: behaviors.WALL, - noMix: true, - properties: { - energy: 300, - breath: 300, - transfer: 1 - }, - isCell: true, - hoverStat: function (px) { - return `E:${px.energy} B:${px.breath}` - }, - tick: (px) => { - px.energy += (4 - getNeighbors(px).length) * 3 - baseCellTick(px) - doDefaults(px) - }, - tempHigh: 102, - stateHigh: ["steam", "steam", "steam", "sugar"], - tempLow: -2, - stateLow: ["ice", "ice", "ice", "sugar_ice"], - state: "solid", - density: 1000.1, - category: "cells", - breakInto: ["water", "dna", "dna", "dna"], - reactions: { - ...elements.cell.reactions, - cancer: { elem1: "cancer", chance: 0.005 } - } -} - -elements.nucleolyte = { - color: "#FF6F3C", - behavior: behaviors.WALL, - noMix: true, - properties: { - energy: 300, - breath: 300, - transfer: 1 - }, - isCell: true, - hoverStat: function (px) { - return `E:${px.energy} B:${px.breath}` - }, - tick: (px) => { - const ns = getNeighbors(px) - for (let n of ns) { - if (n.element == "vena" && n.charge) { - px.breath += 80 - px.energy += 80 - break - } - } - baseCellTick(px) - doDefaults(px) - }, - tempHigh: 102, - stateHigh: ["steam", "steam", "steam", "sugar"], - tempLow: -2, - stateLow: ["ice", "ice", "ice", "sugar_ice"], - state: "solid", - density: 1000.1, - category: "cells", - breakInto: ["sugar_water", "dna", "dna", "dna"], - reactions: { - ...elements.cell.reactions, - cancer: { elem1: "cancer", chance: 0.005 } - } -} - -elements.respira = { - color: ["#8888ff"], - behavior: behaviors.WALL, - noMix: true, - properties: { - energy: 300, - breath: 300, - transfer: 1 - }, - isCell: true, - hoverStat: function (px) { - return `E:${px.energy} B:${px.breath}` - }, - tick: (px) => { - px.breath += (4 - getNeighbors(px).length) * 3 - baseCellTick(px) - doDefaults(px) - }, - tempHigh: 102, - stateHigh: ["steam", "steam", "steam", "sugar"], - tempLow: -2, - stateLow: ["ice", "ice", "ice", "sugar_ice"], - state: "solid", - density: 1000.1, - category: "cells", - breakInto: ["water", "dna", "dna", "dna"], - reactions: { - ...elements.cell.reactions, - cancer: { elem1: "cancer", chance: 0.005 } - } -} - -elements.structura = { - color: ["#535353"], - behavior: behaviors.WALL, - noMix: true, - properties: { - energy: 300, - breath: 300, - transfer: 0, - static: true, - }, - isCell: true, - hoverStat: function (px) { - return `E:${px.energy} B:${px.breath}` - }, - tick: (px) => { - baseCellTick(px) - doDefaults(px) - }, - tempHigh: 102, - stateHigh: ["steam", "steam", "steam", "sugar"], - tempLow: -2, - stateLow: ["ice", "ice", "ice", "sugar_ice"], - state: "solid", - density: 1000.1, - category: "cells", - breakInto: ["water", "dna", "dna", "dna"], - reactions: { - ...elements.cell.reactions, - cancer: { elem1: "cancer", chance: 0.005 } - } -} - -elements.vena = { - color: ["#a85e5e"], - behavior: behaviors.WALL, - noMix: true, - properties: { - energy: 300, - breath: 300, - transfer: 0, - static: false, - }, - conduct: 1, - isCell: true, - hoverStat: function (px) { - return `E:${px.energy} B:${px.breath}` - }, - tick: (px) => { - if (px.charge) { - px.transfer = 500 - px.static = true - } else { - transfer = 0 - px.static = false - } - baseCellTick(px) - doDefaults(px) - }, - tempHigh: 102, - stateHigh: ["steam", "steam", "sugar_water", "sugar_water"], - tempLow: -2, - stateLow: ["ice", "ice", "sugar_ice", "sugar_ice"], - state: "solid", - density: 1010, - category: "cells", - breakInto: ["sugar_water", "sugar_water", "dna", "dna"], - reactions: { - ...elements.cell.reactions, - cancer: { elem1: "cancer", chance: 0.005 } - } -} - -elements.neurocell = { - color: ["#5e5fa8"], - behavior: behaviors.WALL, - noMix: true, - properties: { - energy: 300, - breath: 300, - transfer: 50, - cd: 1 - }, - conduct: 1, - isCell: true, - hoverStat: function (px) { - return `E:${px.energy} B:${px.breath}` - }, - tick: (px) => { - px.cd-- - if (px.cd < 1) { - px.cd = 20 - px.charge = 1 - } - baseCellTick(px) - doDefaults(px) - }, - tempHigh: 102, - stateHigh: ["steam", "steam", "sugar_water", "sugar_water"], - tempLow: -2, - stateLow: ["ice", "ice", "sugar_ice", "sugar_ice"], - state: "solid", - density: 1010, - category: "cells", - breakInto: ["sugar_water", "sugar_water", "dna", "dna"], - reactions: { - ...elements.cell.reactions, - cancer: { elem1: "cancer", chance: 0.005 } - } -} - -elements.insulon = { - color: ["#cadf7e"], - behavior: behaviors.WALL, - noMix: true, - properties: { - energy: 300, - breath: 300, - transfer: 1 - }, - conduct: 1, - isCell: true, - hoverStat: function (px) { - return `E:${px.energy} B:${px.breath}` - }, - tick: (px) => { - if (px.temp > 20) { - px.temp -= 6 - } - baseCellTick(px) - doDefaults(px) - }, - tempHigh: 300, - stateHigh: ["steam", "steam", "steam", "sugar"], - tempLow: -2, - stateLow: ["ice", "ice", "ice", "sugar_ice"], - state: "solid", - density: 1000.1, - category: "cells", - breakInto: ["water", "dna", "dna", "dna"], - reactions: { - ...elements.cell.reactions, - cancer: { elem1: "cancer", chance: 0.005 } - } -} - -elements.carapace = { - color: ["#46065a"], - behavior: behaviors.WALL, - noMix: true, - properties: { - energy: 300, - breath: 300, - transfer: 0 - }, - isCell: true, - hoverStat: function (px) { - return `E:${px.energy} B:${px.breath}` - }, - tick: (px) => { - baseCellTick(px) - doDefaults(px) - }, - tempHigh: 1200, - stateHigh: ["steam", "molten_copper", "steam", "sugar"], - state: "solid", - density: 1800, - category: "cells", - breakInto: ["water", "oxidized_copper", "dna", "dna"], -} - -elements.phagocyte = { - color: ["#a3d9a6"], - behavior: behaviors.WALL, - noMix: true, - properties: { - energy: 300, - breath: 300, - transfer: 0 - }, - isCell: true, - hoverStat: function (px) { - return `E:${px.energy} B:${px.breath}` - }, - tick: (px) => { - baseCellTick(px) - doDefaults(px) - }, - tempHigh: 102, - stateHigh: ["steam", "steam", "sugar", "sugar"], - tempLow: -2, - stateLow: ["ice", "ice", "sugar_ice", "sugar_ice"], - state: "solid", - density: 1010, - category: "cells", - breakInto: ["dna", "sugar", "dna", "dna"], - reactions: { - ...elements.cell.reactions, - cancer: { elem2: "stem_cell", chance: 0.055 }, - infection: { elem2: "stem_cell", chance: 0.075 }, - poison: { elem2: "stem_cell", chance: 0.025 }, - } -} - -elements.stem_cell = { - color: ["#c0c0c0"], - behavior: behaviors.LIQUID, - noMix: true, - hoverStat: function (px) { - return `E:${px.energy} B:${px.breath}` - }, - tick: (px) => { - const ns = getNeighbors(px) - if (ns.length > 0) { - const elem = ns[Math.floor(Math.random() * ns.length)].element - if (elements[elem].isCell) { - changePixel(px, elem) - } - } - doDefaults(px) - }, - tempHigh: 102, - stateHigh: ["steam", "steam", "sugar", "sugar"], - tempLow: -2, - stateLow: ["ice", "ice", "sugar_ice", "sugar_ice"], - state: "solid", - density: 1010, - category: "cells", - breakInto: ["dna", "sugar", "dna", "dna"], - reactions: { - ...elements.cell.reactions, - cancer: { elem1: "cancer", chance: 0.005 } - } -} - -elements.cancer.reactions.chlorocyte = { elem2: "cancer", chane: 0.005 } -elements.cancer.reactions.respira = { elem2: "cancer", chane: 0.005 } -elements.cancer.reactions.insulon = { elem2: "cancer", chane: 0.005 } -elements.cancer.reactions.neurocell = { elem2: "cancer", chane: 0.005 } -elements.cancer.reactions.vena = { elem2: "cancer", chane: 0.005 } - -elements.infection.reactions.chlorocyte = { elem2: "infection", chane: 0.0015 } -elements.infection.reactions.respira = { elem2: "infection", chane: 0.0015 } -elements.infection.reactions.insulon = { elem2: "infection", chane: 0.0015 } -elements.infection.reactions.neurocell = { elem2: "infection", chane: 0.0015 } -elements.infection.reactions.vena = { elem2: "infection", chane: 0.0015 } \ No newline at end of file From 87b14daf94c094b9ca1c516799df9e71bdfbb256 Mon Sep 17 00:00:00 2001 From: David Kopal <112717418+DavidKopal@users.noreply.github.com> Date: Sat, 4 Oct 2025 13:58:46 +0200 Subject: [PATCH 051/105] Add files via upload --- mods/organism.js | 915 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 915 insertions(+) create mode 100644 mods/organism.js diff --git a/mods/organism.js b/mods/organism.js new file mode 100644 index 00000000..d1aec81e --- /dev/null +++ b/mods/organism.js @@ -0,0 +1,915 @@ +// heavily inspired by biology.js, go try it out too! +viewInfo[4] = { + name: "enrg", + pixel: function (pixel, ctx) { + if (elements[pixel.element].isCell === true) { + var stat = pixel.energy + var ratio = stat / 3000 + if (ratio < 0) ratio = 0 + if (ratio > 1) ratio = 1 + var hue = Math.round(ratio * 180) + drawSquare(ctx, `hsl(${hue},100%,50%)`, pixel.x, pixel.y) + } + } +} + +viewInfo[5] = { + name: "brth", + pixel: function (pixel, ctx) { + if (elements[pixel.element].isCell === true) { + var stat = pixel.breath + var ratio = stat / 3000 + if (ratio < 0) ratio = 0 + if (ratio > 1) ratio = 1 + var hue = Math.round(ratio * 180) + drawSquare(ctx, `hsl(${hue},100%,50%)`, pixel.x, pixel.y) + } + } +} + +viewInfo[6] = { + name: "wste", + pixel: function (pixel, ctx) { + if (elements[pixel.element].properties?.waste !== undefined) { + let stat = pixel.waste || 1 + let ratio = Math.log(stat) / Math.log(500) + if (ratio < 0) ratio = 0 + if (ratio > 1) ratio = 1 + let hue = 120 - Math.round(ratio * 120) + drawSquare(ctx, `hsl(${hue},100%,50%)`, pixel.x, pixel.y) + } + } +} + +function baseCellTick(px) { + if (!elements[px.element].isCell) { return } + + if (px.energy > 3000) { px.energy = 3000 } + if (px.breath > 3000) { px.breath = 3000 } + + if (!px.static && Math.random() < 0.115) { + px.energy -= 2 + px.breath -= 2 + } + + if (px.energy < 1 || px.breath < 1 || (px.waste > 500 && px.element !== "urocyte") || px.waste > 3000) { + changePixel(px, "infection") + return + } + + const ns = getNeighbors(px) + ns.forEach(n => { + if (!elements[n.element].isCell) { return } + + if (n.energy < px.energy) { + let transfer = (px.energy - n.energy) / 4 + transfer = Math.floor(Math.min(transfer, (px.transfer + n.transfer) / 2)) + px.energy -= transfer + n.energy += transfer + } else if (n.energy > px.energy) { + let transfer = (n.energy - px.energy) / 4 + transfer = Math.floor(Math.min(transfer, (px.transfer + n.transfer) / 2)) + px.energy += transfer + n.energy -= transfer + } + + if (n.breath < px.breath) { + let transfer = (px.breath - n.breath) / 4 + transfer = Math.floor(Math.min(transfer, (px.transfer + n.transfer) / 2)) + px.breath -= transfer + n.breath += transfer + } else if (n.breath > px.breath) { + let transfer = (n.breath - px.breath) / 4 + transfer = Math.floor(Math.min(transfer, (px.transfer + n.transfer) / 2)) + px.breath += transfer + n.breath -= transfer + } + + }) +} + +elements.chlorocyte = { // generates energy per air pixel next to it + color: ["#00ff00", "#00a500", "#008a00", "#26a026", "#3eff3e"], + behavior: behaviors.WALL, + noMix: true, + properties: { + energy: 300, + breath: 300, + transfer: 1 + }, + isCell: true, + hoverStat: function (px) { + return `E:${px.energy} B:${px.breath}` + }, + tick: (px) => { + px.energy += (4 - getNeighbors(px).length) * 3 + baseCellTick(px) + doDefaults(px) + }, + tempHigh: 102, + stateHigh: ["steam", "steam", "steam", "sugar"], + tempLow: -2, + stateLow: ["ice", "ice", "ice", "sugar_ice"], + state: "solid", + density: 1000.1, + category: "nutrients", + breakInto: ["water", "dna", "dna", "dna"], + reactions: { + ...elements.cell.reactions, + cancer: { elem1: "cancer", chance: 0.005 }, + sugar: undefined, + sugar_water: undefined, + }, + movable: false +} + +elements.fermentocyte = { // stores and ferments sugar into energy + color: "#FF6F3C", + behavior: behaviors.WALL, + noMix: true, + properties: { + energy: 300, + breath: 300, + transfer: 1, + waste: 0, + sugar: 0 + }, + isCell: true, + hoverStat: function (px) { + return `E:${px.energy} B:${px.breath}` + }, + tick: (px) => { + if (px.sugar + 1 < 5) { + const ns = getNeighbors(px) + for (let n of ns) { + if (n.element == "sugar") { + deletePixel(n.x, n.y) + px.sugar++ + break + } + } + } + if (px.sugar) { + px.sugar -= 0.0034 + px.energy += 50 + px.waste += 0.5 + if (px.sugar < 0) { px.sugar = 0 } + } + baseCellTick(px) + doDefaults(px) + }, + tempHigh: 102, + stateHigh: ["steam", "steam", "steam", "sugar"], + tempLow: -2, + stateLow: ["ice", "ice", "ice", "sugar_ice"], + state: "solid", + density: 1000.1, + category: "nutrients", + breakInto: ["sugar_water", "dna", "dna", "dna"], + reactions: { + ...elements.cell.reactions, + cancer: { elem1: "cancer", chance: 0.005 }, + sugar: undefined, + sugar_water: undefined, + }, + movable: false +} + +elements.urocyte = { + color: "#927d07", + behavior: behaviors.WALL, + noMix: true, + properties: { + energy: 300, + breath: 300, + waste: 0, + inWaste: true, + transfer: 1 + }, + isCell: true, + hoverStat: function (px) { + return `E:${px.energy} B:${px.breath}` + }, + tick: (px) => { + if (px.waste >= 400) { + if (isEmpty(px.x, px.y + 1)) { + createPixel("waste", px.x, px.y + 1) + px.waste -= 400 + } else if (isEmpty(px.x + 1, px.y)) { + createPixel("waste", px.x + 1, px.y) + px.waste -= 400 + } else if (isEmpty(px.x - 1, px.y)) { + createPixel("waste", px.x - 1, px.y) + px.waste -= 400 + } + } + baseCellTick(px) + doDefaults(px) + }, + tempHigh: 102, + stateHigh: ["steam", "steam", "steam", "sugar"], + tempLow: -2, + stateLow: ["ice", "ice", "ice", "sugar_ice"], + state: "solid", + density: 1000.1, + category: "waste", + breakInto: ["water", "dna", "dna", "dna"], + reactions: { + ...elements.cell.reactions, + cancer: { elem1: "cancer", chance: 0.005 }, + sugar: undefined, + sugar_water: undefined, + }, + movable: false +} + +elements.root = { // stores water and converts it into energy + color: ["#fff0c0", "#bba86c"], + behavior: behaviors.WALL, + noMix: true, + properties: { + energy: 300, + breath: 300, + transfer: 2, + water: 0 + }, + isCell: true, + hoverStat: function (px) { + return `E:${px.energy} B:${px.breath}` + }, + tick: (px) => { + const ns = getNeighbors(px) + ns.forEach(n => { + if (n.element == "water") { + deletePixel(n.x, n.y) + px.water += 2 + } else if (n.element == "root") { + if (n.energy < px.energy) { + let transfer = (px.energy - n.energy) / 4 + transfer = Math.floor(Math.min(transfer, 40 / 2)) + px.energy -= transfer + n.energy += transfer + } else if (n.energy > px.energy) { + let transfer = (n.breath - px.breath) / 4 + transfer = Math.floor(Math.min(transfer, (px.transfer + n.transfer) / 2)) + px.energy += transfer + n.energy -= transfer + } + + if (n.breath < px.breath) { + let transfer = (px.breath - n.breath) / 4 + transfer = Math.floor(Math.min(transfer, (px.transfer + n.transfer) / 2)) + px.breath -= transfer + n.breath += transfer + } else if (n.breath > px.breath) { + let transfer = (n.breath - px.breath) / 4 + transfer = Math.floor(Math.min(transfer, (px.transfer + n.transfer) / 2)) + px.breath += transfer + n.breath -= transfer + } + } else if (n.element == "sugar_water") { + deletePixel(n.x, n.y) + px.water += 3 + } else if (n.element == "mud") { + changePixel(n, "dirt") + px.water += 5 + } else if (n.element == "wet_sand") { + changePixel(n, "sand") + px.water += 5 + } else if (n.element == "dirt" && Math.random() < 0.075) { + px.water += 1 + } else if (n.element == "sand" && Math.random() < 0.025) { + px.water += 1 + } + }) + if (px.water > 0 && Math.random() < 0.185) { + px.water -= 1 + px.energy += 15 + if (px.water < 0) { px.water = 0 } + } + baseCellTick(px) + doDefaults(px) + }, + tempHigh: 102, + stateHigh: ["steam", "steam", "steam", "sugar"], + tempLow: -2, + stateLow: ["ice", "ice", "ice", "sugar_ice"], + state: "solid", + density: 1000.1, + category: "nutrients", + breakInto: ["sugar_water", "dna", "dna", "dna"], + reactions: { + ...elements.cell.reactions, + cancer: { elem1: "cancer", chance: 0.005 }, + sugar: undefined, + sugar_water: undefined, + }, + movable: false, + isFood: true +} + +elements.lipocyte = { // stores excess energy for later use + color: "#FFE680", + behavior: behaviors.WALL, + noMix: true, + properties: { + energy: 300, + breath: 300, + transfer: 30, + fat: 0 + }, + isCell: true, + hoverStat: function (px) { + return `E:${px.energy} B:${px.breath}` + }, + tick: (px) => { + if (px.energy >= 1300 && px.fat < 18) { + px.energy -= 1000 + px.fat += 1 + } else if (px.energy <= 300 && px.fat > 0 && Math.random() < 0.1875) { + px.fat -= 1 + px.energy += 1000 + } + baseCellTick(px) + doDefaults(px) + }, + tempHigh: 102, + stateHigh: ["steam", "steam", "steam", "sugar"], + tempLow: -2, + stateLow: ["ice", "ice", "ice", "sugar_ice"], + state: "solid", + density: 1000.1, + category: "nutrients", + breakInto: ["sugar_water", "dna", "dna", "dna"], + reactions: { + ...elements.cell.reactions, + cancer: { elem1: "cancer", chance: 0.005 }, + sugar: undefined, + sugar_water: undefined, + }, + movable: false +} + +elements.aerocyte = { // generates breath out of energy + color: "#66ccff", + behavior: behaviors.WALL, + noMix: true, + properties: { + energy: 300, + breath: 300, + waste: 0, + transfer: 30, + }, + isCell: true, + hoverStat: function (px) { + return `E:${px.energy} B:${px.breath}` + }, + tick: (px) => { + if (px.energy >= 305 && px.breath <= 1995) { + px.energy -= 5 + px.breath += 5 + px.waste += 0.075 + } + + baseCellTick(px) + doDefaults(px) + }, + tempHigh: 102, + stateHigh: ["steam", "steam", "steam", "sugar"], + tempLow: -2, + stateLow: ["ice", "ice", "ice", "sugar_ice"], + state: "solid", + density: 1000.1, + category: "breathing", + breakInto: ["sugar_water", "dna", "dna", "dna"], + reactions: { + ...elements.cell.reactions, + cancer: { elem1: "cancer", chance: 0.005 }, + sugar: undefined, + sugar_water: undefined, + }, + movable: false +} + +elements.respira = { // just like chlorocyte, but for breath + color: ["#8888ff"], + behavior: behaviors.WALL, + noMix: true, + properties: { + energy: 300, + breath: 300, + transfer: 1 + }, + isCell: true, + hoverStat: function (px) { + return `E:${px.energy} B:${px.breath}` + }, + tick: (px) => { + px.breath += (4 - getNeighbors(px).length) * 3 + baseCellTick(px) + doDefaults(px) + }, + tempHigh: 102, + stateHigh: ["steam", "steam", "steam", "sugar"], + tempLow: -2, + stateLow: ["ice", "ice", "ice", "sugar_ice"], + state: "solid", + density: 1000.1, + category: "breathing", + breakInto: ["water", "dna", "dna", "dna"], + reactions: { + ...elements.cell.reactions, + cancer: { elem1: "cancer", chance: 0.005 }, + sugar: undefined, + sugar_water: undefined, + }, + movable: false +} + +elements.vena = { // transfers energy when powered + color: ["#a85e5e"], + behavior: behaviors.WALL, + noMix: true, + properties: { + energy: 300, + breath: 300, + transfer: 0, + static: false, + waste: 0 + }, + conduct: 1, + isCell: true, + hoverStat: function (px) { + return `E:${px.energy} B:${px.breath}` + }, + tick: (px) => { + if (px.charge) { + px.transfer = 500 + px.static = true + } else { + px.transfer = 0 + px.static = false + } + + if (px.energy > 3000) { px.energy = 3000 } + if (px.breath > 3000) { px.breath = 3000 } + + if (!px.static && Math.random() < 0.115) { + px.energy -= 2 + px.breath -= 2 + } + + if (px.energy < 1 || px.breath < 1 || (px.waste > 500 && px.element !== "urocyte") || px.waste > 3000) { + changePixel(px, "infection") + return + } + + const ns = getNeighbors(px) + ns.forEach(n => { + if (!elements[n.element].isCell) { return } + + if (n.energy < px.energy) { + let transfer = (px.energy - n.energy) / 4 + transfer = Math.floor(Math.min(transfer, (px.transfer + n.transfer) / 2)) + px.energy -= transfer + n.energy += transfer + } else if (n.energy > px.energy) { + let transfer = (n.energy - px.energy) / 4 + transfer = Math.floor(Math.min(transfer, (px.transfer + n.transfer) / 2)) + px.energy += transfer + n.energy -= transfer + } + + if (n.breath < px.breath) { + let transfer = (px.breath - n.breath) / 4 + transfer = Math.floor(Math.min(transfer, (px.transfer + n.transfer) / 2)) + px.breath -= transfer + n.breath += transfer + } else if (n.breath > px.breath) { + let transfer = (n.breath - px.breath) / 4 + transfer = Math.floor(Math.min(transfer, (px.transfer + n.transfer) / 2)) + px.breath += transfer + n.breath -= transfer + } + + if (n.waste !== undefined) { + if (n.inWaste) { + let transfer = Math.max(1, Math.floor(Math.min(px.waste / 4, (px.transfer + n.transfer) / 2))) + if (px.waste >= transfer) { + px.waste -= transfer + n.waste += transfer + } + } else { + if (n.waste < px.waste) { + let transfer = Math.max(1, Math.min((px.waste - n.waste) / 4, (px.transfer + n.transfer) / 2)) + px.waste -= transfer + n.waste += transfer + } else if (n.waste > px.waste) { + let transfer = Math.max(1, Math.min((n.waste - px.waste) / 4, (px.transfer + n.transfer) / 2)) + px.waste += transfer + n.waste -= transfer + } + } + } + }) + doDefaults(px) + }, + tempHigh: 102, + stateHigh: ["steam", "steam", "sugar_water", "sugar_water"], + tempLow: -2, + stateLow: ["ice", "ice", "sugar_ice", "sugar_ice"], + state: "solid", + density: 1010, + category: "structural", + breakInto: ["sugar_water", "sugar_water", "dna", "dna"], + reactions: { + ...elements.cell.reactions, + cancer: { elem1: "cancer", chance: 0.005 }, + sugar: undefined, + sugar_water: undefined, + }, + movable: false +} + +elements.neurocell = { // powers up venas + color: ["#5e5fa8"], + behavior: behaviors.WALL, + noMix: true, + properties: { + energy: 300, + breath: 300, + transfer: 50, + cd: 1 + }, + conduct: 1, + isCell: true, + hoverStat: function (px) { + return `E:${px.energy} B:${px.breath}` + }, + tick: (px) => { + px.cd-- + if (px.cd < 1) { + px.cd = 20 + px.charge = 1 + } + baseCellTick(px) + doDefaults(px) + }, + tempHigh: 102, + stateHigh: ["steam", "steam", "sugar_water", "sugar_water"], + tempLow: -2, + stateLow: ["ice", "ice", "sugar_ice", "sugar_ice"], + state: "solid", + density: 1010, + category: "structural", + breakInto: ["sugar_water", "sugar_water", "dna", "dna"], + reactions: { + ...elements.cell.reactions, + cancer: { elem1: "cancer", chance: 0.005 }, + sugar: undefined, + sugar_water: undefined, + }, + movable: false +} + +elements.waste = { // urocyte excretes this + color: "#5f9102", + behavior: behaviors.LIQUID, + state: "liquid", + category: "waste", + stateHigh: "stench", + burn: 20, + isFood: true, + burnTime: 150, + burnInto: "stench", + tempHigh: 120, + stateLow: "slime_ice", + tempLow: 0, + density: 1465, + viscosity: 5000 +} + +elements.mucus = { // light protective layer + color: "#aff036", + behavior: [ + "XX|SA|XX", + "SA|DL%1|XX", + "XX AND M2|SA AND M1|XX AND M2" + ], + state: "liquid", + category: "protection", + stateHigh: "steam", + tempHigh: 120, + stateLow: "slime_ice", + tempLow: 0, + density: 1400, + viscosity: 5000 +} + +elements.toxic_mucus = { // toxic protective layer, eats bugs for energy + color: "#58046d", + behavior: [ + "XX|SA|XX", + "SA|DL%1|XX", + "XX AND M2|SA AND M1|XX AND M2" + ], + tick: (px) => { + const ns = getNeighbors(px) + energy = 0 + ns.forEach(n => { + if (["ant", "fly", "spider", "worm", "flea", "rat", "frog", "tadpole", "fish", "slug", "snail"].includes(n.element)) { + deletePixel(n.x, n.y) + energy++ + } else if (n.element == "mucotoxin" && energy > 0) { + energy-- + n.waste += 0.6 + n.energy += 3000 + } + }) + }, + state: "liquid", + category: "protection", + stateHigh: "steam", + tempHigh: 120, + stateLow: "slime_ice", + tempLow: 0, + density: 1400, + viscosity: 5000 +} + +elements.slimecoat = { // generates mucus + color: ["#5a4606"], + behavior: behaviors.WALL, + noMix: true, + properties: { + energy: 300, + breath: 300, + transfer: 0 + }, + isCell: true, + hoverStat: function (px) { + return `E:${px.energy} B:${px.breath}` + }, + tick: (px) => { + const ns = getNeighbors(px) + let change = (ns.length == 4) + if (change) { + ns.forEach(n => { + if (n.element == ("mucus" || "toxic_mucus" || "slimecoat")) { + change = false + } + }) + } + if (change) { + changePixel(px, "stem_cell") + return + } + if (isEmpty(px.x - 1, px.y)) { + createPixel("mucus", px.x - 1, px.y) + } + if (isEmpty(px.x + 1, px.y)) { + createPixel("mucus", px.x + 1, px.y) + } + if (isEmpty(px.x, px.y - 1)) { + createPixel("mucus", px.x, px.y - 1) + } + if (isEmpty(px.x, px.y + 1)) { + createPixel("mucus", px.x, px.y + 1) + } + baseCellTick(px) + doDefaults(px) + }, + tempHigh: 250, + stateHigh: "steam", + state: "solid", + density: 1800, + insulate: true, + category: "protection", + breakInto: ["tin", "dna", "dna"], + movable: false +} + +elements.mucotoxin = { // generates toxic mucus + color: ["#5a2806"], + behavior: behaviors.WALL, + noMix: true, + properties: { + energy: 300, + breath: 300, + waste: 0, + transfer: 0 + }, + isCell: true, + hoverStat: function (px) { + return `E:${px.energy} B:${px.breath}` + }, + tick: (px) => { + const ns = getNeighbors(px) + let change = (ns.length == 4) + if (change) { + ns.forEach(n => { + if (n.element == ("mucus" || "toxic_mucus" || "mucotoxin")) { + change = false + } + }) + } + if (isEmpty(px.x - 1, px.y)) { + createPixel("toxic_mucus", px.x - 1, px.y) + } + if (isEmpty(px.x + 1, px.y)) { + createPixel("toxic_mucus", px.x + 1, px.y) + } + if (isEmpty(px.x, px.y - 1)) { + createPixel("toxic_mucus", px.x, px.y - 1) + } + if (isEmpty(px.x, px.y + 1)) { + createPixel("toxic_mucus", px.x, px.y + 1) + } + baseCellTick(px) + doDefaults(px) + }, + tempHigh: 250, + stateHigh: "molten_tin", + state: "solid", + density: 1800, + insulate: true, + category: "protection", + breakInto: ["tin", "dna", "dna"], + movable: false +} + +elements.carapace = { // heat-resistant, cancer/infection proof shell + color: ["#46065a"], + behavior: behaviors.WALL, + noMix: true, + properties: { + energy: 300, + breath: 300, + transfer: 0 + }, + isCell: true, + hoverStat: function (px) { + return `E:${px.energy} B:${px.breath}` + }, + tick: (pixel) => { + if (getNeighbors(pixel).length == 4) { changePixel(pixel, "stem_cell"); return } + baseCellTick(pixel) + doDefaults(pixel) + if (!isEmpty(pixel.x, pixel.y - 1, true)) { // Everything after this in the tick function is from biology.js, make sure to check it out too! + var hitPixel = pixelMap[pixel.x][pixel.y - 1] + if (elements[hitPixel.element].isCell != true && Math.random() > 0.5) { + 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].isCell != true && Math.random() > 0.5) { + 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].isCell != true && Math.random() > 0.5) { + 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].isCell != true && Math.random() > 0.5) { + if (hitPixel.temp > pixel.temp) { + hitPixel.temp-- + pixel.temp++ + } + } + } + doDefaults(pixel); + if (pixel.temp > 250) { + changePixel(pixel, "molten_tin", 250) + } + }, + tempHigh: 250, + stateHigh: "steam", + state: "solid", + density: 1800, + insulate: true, + category: "protection", + breakInto: ["tin", "dna", "dna"], + movable: false +} + +elements.phagocyte = { // turns cancer and infection into stem cells + color: ["#a3d9a6"], + behavior: behaviors.WALL, + noMix: true, + properties: { + energy: 300, + breath: 300, + transfer: 0 + }, + isCell: true, + hoverStat: function (px) { + return `E:${px.energy} B:${px.breath}` + }, + tick: (px) => { + if (Math.random() < 0.35) { + const coords = circleCoords(px.x, px.y, 3) + coords.forEach(coord => { + if (!isEmpty(coord.x, coord.y)) { + const n = pixelMap[coord.x][coord.y] + if (n.element === "infection" || n.element === "cancer" || n.element === "poison") { + if (Math.random() < 0.35) { + changePixel(n, "stem_cell") + } + } + } + }) + } + baseCellTick(px) + doDefaults(px) + }, + tempHigh: 102, + stateHigh: ["steam", "steam", "sugar", "sugar"], + tempLow: -2, + stateLow: ["ice", "ice", "sugar_ice", "sugar_ice"], + state: "solid", + density: 1010, + category: "protection", + breakInto: ["dna", "sugar", "dna", "dna"], + reactions: { + ...elements.cell.reactions, + cancer: { elem2: "stem_cell", chance: 0.055 }, + infection: { elem2: "stem_cell", chance: 0.075 }, + poison: { elem2: "stem_cell", chance: 0.025 }, + sugar: undefined, + sugar_water: undefined, + }, + movable: false +} + +elements.stem_cell = { // turns into the first cell it touches + color: ["#c0c0c0"], + behavior: behaviors.LIQUID, + noMix: true, + hoverStat: function (px) { + return `E:${px.energy} B:${px.breath}` + }, + tick: (px) => { + const ns = getNeighbors(px) + if (ns.length > 0) { + const elem = ns[Math.floor(Math.random() * ns.length)].element + if (elements[elem].isCell && elem !== "phagocyte") { + changePixel(px, elem) + } + } + doDefaults(px) + }, + tempHigh: 102, + stateHigh: ["steam", "steam", "sugar", "sugar"], + tempLow: -2, + stateLow: ["ice", "ice", "sugar_ice", "sugar_ice"], + state: "solid", + density: 1010, + category: "structural", + breakInto: ["dna", "sugar", "dna", "dna"], + reactions: { + ...elements.cell.reactions, + cancer: { elem1: "cancer", chance: 0.005 }, + sugar: undefined, + sugar_water: undefined, + } +} + +elements.cancer.reactions.chlorocyte = { elem2: "cancer", chance: 0.005 } +elements.cancer.reactions.respira = { elem2: "cancer", chance: 0.005 } +elements.cancer.reactions.neurocell = { elem2: "cancer", chance: 0.005 } +elements.cancer.reactions.vena = { elem2: "cancer", chance: 0.005 } +elements.cancer.reactions.fermentocyte = { elem2: "cancer", chance: 0.005 } +elements.cancer.reactions.root = { elem2: "cancer", chance: 0.005 } +elements.cancer.reactions.lipocyte = { elem2: "cancer", chance: 0.005 } +elements.cancer.reactions.slimecoat = { elem2: "cancer", chance: 0.005 } +elements.cancer.reactions.mucotoxin = { elem2: "cancer", chance: 0.005 } +elements.cancer.reactions.aerocyte = { elem2: "cancer", chance: 0.005 } +elements.cancer.reactions.urocyte = { elem2: "cancer", chance: 0.005 } + +elements.infection.reactions.chlorocyte = { elem2: "infection", chance: 0.0015 } +elements.infection.reactions.respira = { elem2: "infection", chance: 0.0015 } +elements.infection.reactions.neurocell = { elem2: "infection", chance: 0.0015 } +elements.infection.reactions.vena = { elem2: "infection", chance: 0.0015 } +elements.infection.reactions.fermentocyte = { elem2: "infection", chance: 0.0015 } +elements.infection.reactions.lipocyte = { elem2: "infection", chance: 0.0015 } +elements.infection.reactions.root = { elem2: "infection", chance: 0.0015 } +elements.infection.reactions.slimecoat = { elem2: "infection", chance: 0.0015 } +elements.infection.reactions.mucotoxin = { elem2: "infection", chance: 0.0015 } +elements.infection.reactions.aerocyte = { elem2: "infection", chance: 0.0015 } +elements.infection.reactions.urocyte = { elem2: "infection", chance: 0.0015 } + +elements.ant.reactions.waste = { elem2: null, chance: 0.035, func: behaviors.FEEDPIXEL } \ No newline at end of file From 4beba7f9c115dfa5d0f92ec10c671ab7701e3302 Mon Sep 17 00:00:00 2001 From: Nekonico <163950752+DBNekonico@users.noreply.github.com> Date: Sun, 5 Oct 2025 15:51:31 -0700 Subject: [PATCH 052/105] more powerful 229 --- mods/scp.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mods/scp.js b/mods/scp.js index 8c6b2aba..1d479699 100644 --- a/mods/scp.js +++ b/mods/scp.js @@ -4163,7 +4163,7 @@ elements.scp_229 = { for (var i = 0; i < coords.length; i++) { if (!isEmpty(coords[i].x,coords[i].y) && !outOfBounds(coords[i].x,coords[i].y)) { var electric = pixelMap[coords[i].x][coords[i].y] - if (elements[electric.element].category == "nervous system" && Math.random() > 0.5 || electric.element == "thunder_cloud" || electric.charge || electric.element == "access_door" && Math.random() > 0.75 || electric.element == "keycard_terminal" || electric.element == "level_5" || electric.element == "scp_804" && electric.active == true || elements[electric.element].category == "logic" || electric.element == "brain" || electric.element == "fish" || electric.element == "frog" || electric.element == "rat" || electric.element == "bird" || electric.element == "head" || electric.element == "head_1000" || electric.element == "head_035" || electric.element == "head_008" || electric.element == "battery" || electric.element == "electric" || electric.element == "lightning" || electric.element == "malware" || electric.element == "gray_goo") { + if (elements[electric.element].category == "nervous system" && Math.random() > 0.5 || electric.element == "thunder_cloud" || electric.charge || electric.chargeCD || electric.element == "access_door" && Math.random() > 0.75 || electric.element == "keycard_terminal" || electric.element == "level_5" || electric.element == "scp_804" && electric.active == true || elements[electric.element].category == "logic" || electric.element == "brain" || electric.element == "fish" || electric.element == "frog" || electric.element == "rat" || electric.element == "bird" || electric.element == "head" || electric.element == "head_1000" || electric.element == "head_035" || electric.element == "head_008" || electric.element == "battery" || electric.element == "electric" || electric.element == "lightning" || electric.element == "malware" || electric.element == "gray_goo") { if (electric.y > pixel.y && electric.x > pixel.x && isEmpty(pixel.x+1,pixel.y+1)) { createPixel("scp_229",pixel.x+1,pixel.y+1) var electric2 = pixelMap[pixel.x+1][pixel.y+1] @@ -4267,7 +4267,7 @@ elements.scp_229 = { explodeAt(electric.x,electric.y,300,["plasma","plasma","plasma","plasma","plasma","plasma","plasma","radiation","radiation","radiation","radiation","rad_steam","electric","electric"]) pixel.nCD = 2 } - else if (electric.charge) { + else if (electric.charge || electric.chargeCD) { deletePixel(electric.x,electric.y) createPixel("scp_229",electric.x,electric.y) electric = pixelMap[electric.x][electric.y] From aab544d30b1008fcf75c2e8b80bca26588510c53 Mon Sep 17 00:00:00 2001 From: slweeb <91897291+slweeb@users.noreply.github.com> Date: Mon, 6 Oct 2025 19:20:06 -0400 Subject: [PATCH 053/105] Update devsnacks.js --- mods/devsnacks.js | 35 ++++++++++++++++++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) diff --git a/mods/devsnacks.js b/mods/devsnacks.js index f1cde22f..562c31ff 100644 --- a/mods/devsnacks.js +++ b/mods/devsnacks.js @@ -73,4 +73,37 @@ elements.tea_powder = { isFood: true, hidden: true } -elements.water.reactions.tea_powder = { elem1:"tea", chance:0.0002 } \ No newline at end of file +elements.water.reactions.tea_powder = { elem1:"tea", chance:0.0002 } + +elements.pumpkin.breakInto = ["pumpkin_seed","pumpkin_mash","pumpkin_mash","pumpkin_mash",null]; + +elements.pumpkin_mash = { + color: ["#DF7E06","#eba100"], + behavior: behaviors.STURDYPOWDER, + tempHigh: 125, + stateHigh: ["pumpkin_spice","pumpkin_spice",null], + category: "food", + state: "solid", + density: 490.3, + isFood: true, + hidden: true, +} + +elements.pumpkin_seed.tempHigh = 125; +elements.pumpkin_seed.stateHigh = ["pumpkin_spice","pumpkin_spice",null]; + +elements.pumpkin_spice = { + color: "#8d4f03", + grain: 1.5, + behavior: behaviors.POWDER, + tempHigh: 400, + stateHigh: ["smoke","smoke","smoke","smoke","ash"], + category: "food", + state: "solid", + density: 490.3, + isFood: true, + hidden: true, +} + +elements.coffee.reactions.pumpkin_spice = { elem2:null, color1:"#6A2F03", chance:0.005 }; +elements.coffee.reactions.pumpkin_mash = { elem2:null, color1:"#6A2F03", chance:0.005 }; \ No newline at end of file From eb366140767cba0368cb9657853c938abc63cf11 Mon Sep 17 00:00:00 2001 From: slweeb <91897291+slweeb@users.noreply.github.com> Date: Mon, 6 Oct 2025 19:36:04 -0400 Subject: [PATCH 054/105] Update devsnacks.js --- mods/devsnacks.js | 31 +++++++++++++++++++++++++++++-- 1 file changed, 29 insertions(+), 2 deletions(-) diff --git a/mods/devsnacks.js b/mods/devsnacks.js index 562c31ff..e63e7a54 100644 --- a/mods/devsnacks.js +++ b/mods/devsnacks.js @@ -83,7 +83,7 @@ elements.pumpkin_mash = { tempHigh: 125, stateHigh: ["pumpkin_spice","pumpkin_spice",null], category: "food", - state: "solid", + state: "liquid", density: 490.3, isFood: true, hidden: true, @@ -106,4 +106,31 @@ elements.pumpkin_spice = { } elements.coffee.reactions.pumpkin_spice = { elem2:null, color1:"#6A2F03", chance:0.005 }; -elements.coffee.reactions.pumpkin_mash = { elem2:null, color1:"#6A2F03", chance:0.005 }; \ No newline at end of file +elements.coffee.reactions.pumpkin_mash = { elem2:null, color1:"#6A2F03", chance:0.005 }; + +elements.apple = { + color: ["#b22424","#f5c517","#66b447"], + grain: 2, + behavior: behaviors.POWDER, + // singleColor: true, + category: "food", + state: "solid", + density: 750, + isFood: true, + breakInto: "juice", + tempHigh: 175, + stateHigh: ["applesauce",null] +} + +elements.applesauce = { + color: "#E7C45A", + behavior: behaviors.LIQUID, + viscosity: 50000, + tempHigh: 400, + stateHigh: "smoke", + category: "food", + state: "liquid", + density: 750, + isFood: true, + hidden: true, +} \ No newline at end of file From 1a6aee23f0eefd572a24b68f5276ea2c8327180b Mon Sep 17 00:00:00 2001 From: sq <> Date: Wed, 8 Oct 2025 17:06:23 +0800 Subject: [PATCH 055/105] sugar spice and everything nice --- mods/aChefsDream2.js | 145 ++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 144 insertions(+), 1 deletion(-) diff --git a/mods/aChefsDream2.js b/mods/aChefsDream2.js index 4a089e68..31fc4cfa 100644 --- a/mods/aChefsDream2.js +++ b/mods/aChefsDream2.js @@ -3,7 +3,7 @@ // https://github.com/SquareScreamYT/ // https://youtube.com/@sqec -version = "v2.1.0" +version = "v2.1.1" runAfterLoad(function() { console.log("Current aChefsDream version: "+version) @@ -595,4 +595,147 @@ elements.pistachio_powder = { hidden: true } +elements.pumpkin_mash = { + color: ["#f59c2f", "#efa810", "#e38f1a"], + behavior: behaviors.STURDYPOWDER, + tempHigh: 125, + stateHigh: ["pumpkin_spice","pumpkin_spice","smoke"], + category: "food", + state: "liquid", + density: 500, + isFood: true, + hidden: true, +} + +elements.pumpkin.breakInto = ["pumpkin_seed", "pumpkin_mash", "pumpkin_mash", "pumpkin_mash", "pumpkin_mash", null]; + +elements.pumpkin_spice = { + color: ["#95570b", "#ba7f36"], + behavior: behaviors.POWDER, + tempHigh: 400, + stateHigh: ["smoke","smoke","smoke","smoke","ash"], + category: "food", + state: "solid", + density: 500, + isFood: true, + hidden: true, +} + +elements.cinnamon_powder.reactions.nutmeg_powder = { elem1: "pumpkin_spice", elem2: null, chance: 0.5 }; + +elements.coffee.reactions.pumpkin_mash = { elem2: null, color1: "#7e3c09", chance: 0.005 }; +elements.coffee.reactions.pumpkin_spice = { elem2: null, color1: "#7e3c09", chance: 0.005 }; + +elements.nutmeg_tree = { + color: "#6B4226", + behavior: behaviors.WALL, + tempHigh: 400, + stateHigh: ["ember", "charcoal", "fire"], + category: "solids", + burn: 5, + burnTime: 300, + burnInto: ["ember", "charcoal", "fire"], + state: "solid", + hardness: 0.2, + breakInto: "sawdust", + hidden: true +}; + +elements.nutmeg_branch = { + color: "#5c3b23", + behavior: [ + "CR:nutmeg_leaves,nutmeg_branch%2|CR:nutmeg_leaves,nutmeg_branch%2|CR:nutmeg_leaves,nutmeg_branch%2", + "XX|XX|XX", + "XX|XX|XX", + ], + tempHigh: 100, + stateHigh: "nutmeg_tree", + tempLow: -30, + stateLow: "nutmeg_tree", + category: "life", + burn: 30, + burnTime: 60, + burnInto: ["sap", "ember"], + hidden: true, + state: "solid", + density: 1400, + breakInto: ["sap", "sawdust"] +}; + +elements.nutmeg_leaves = { + color: ["#4b7d3d", "#558c40"], + behavior: [ + "XX|XX|XX", + "XX|XX|XX", + "XX|CR:nutmeg_fruit%0.1|XX", + ], + reactions: { + "vinegar": { elem1: "dead_plant", chance: 0.035 }, + "baking_soda": { elem1: "dead_plant", chance: 0.01 }, + "bleach": { elem1: "dead_plant", chance: 0.05 }, + "alcohol": { elem1: "dead_plant", chance: 0.035 }, + }, + category: "life", + tempHigh: 90, + stateHigh: "dead_plant", + tempLow: -1.5, + stateLow: "frozen_plant", + burn: 60, + burnTime: 60, + burnInto: "dead_plant", + state: "solid", + density: 1050, + hidden: true +}; + +elements.nutmeg_fruit = { + color: ["#c0a25d", "#ddb86c"], + behavior: behaviors.POWDER, + category: "food", + tempHigh: 100, + stateHigh: "dead_plant", + burn: 60, + burnTime: 60, + cutInto: ["mace", "nutmeg", "nutmeg"], + breakInto: ["mace", "nutmeg", "nutmeg"], + state: "solid", + density: 1050 +}; + +elements.mace = { + color: ["#e04e1b", "#cc3614"], + behavior: behaviors.POWDER, + category: "food", + tempHigh: 250, + stateHigh: ["ash", "smoke"], + isFood: true, + state: "solid", + density: 900, + hidden: false +}; + +elements.nutmeg = { + color: ["#8b5a2b", "#A0522D"], + behavior: behaviors.POWDER, + category: "food", + tempHigh: 250, + stateHigh: ["ash", "smoke"], + isFood: true, + state: "solid", + density: 1000, + breakInto: "nutmeg_powder", +}; + +elements.nutmeg_powder = { + color: "#C58940", + behavior: behaviors.POWDER, + category: "food", + tempHigh: 250, + stateHigh: ["ash", "smoke"], + isFood: true, + state: "solid", + density: 950, + hidden: false +}; + },true) \ No newline at end of file From 9b8c49bc428286557f7884cc3a6ae440317d97bf Mon Sep 17 00:00:00 2001 From: 3pm-on-github Date: Wed, 8 Oct 2025 14:58:26 +0200 Subject: [PATCH 056/105] let's take a look... --- mods/3pms_mod.js | 133 +++++++++++++++++++++++++---------------------- 1 file changed, 72 insertions(+), 61 deletions(-) diff --git a/mods/3pms_mod.js b/mods/3pms_mod.js index 4e39d814..622d42db 100644 --- a/mods/3pms_mod.js +++ b/mods/3pms_mod.js @@ -1,43 +1,37 @@ -// mod moment -// also made by 3pm +// made by 3pm -// starting the initiation -version = "0.0.1" -subversion = "0.0.12" -versionname = "Gullible On The Ceilling" +version = "0.0.2" +subversion = "0.0.21" +versionname = "Let's take a look..." console.log("3pms_mod.js " + version + " \"" + versionname + "\"") console.log("3pms_mod.js | Initiating...") // bypassing the tps limit -// nvm this is useless -// whatever im keeping it -setTimeout(() => { - const tpsbutton = document.getElementById("tpsButton"); - tpsbutton.onclick = () => { - var tpsprompt = prompt( - "Enter the new simulation Ticks Per Second (TPS). This is how many updates per second the simulation will run.\n\n" + - "The default is 30.\n\nThe current TPS is " + tps + ".\n\nNOTE: 3pms_mod.js removes the TPS limit.\n" + - "Any TPS higher than 1000 isn\'t recommended.\n\n" - ); - - var newtps = parseInt(tpsprompt); - if (tpsprompt !== null) { - if (isNaN(newtps) || newtps == "") { - alert("You did not enter a valid TPS."); - } else { - tps = parseInt(newtps); - if (isNaN(tps) || tps <= 0) { - alert("You did not enter a valid TPS."); - tps = 30; +function tpsPrompt() { + promptInput("Enter the new simulation Ticks Per Second (TPS). This is how many updates per second the simulation will run.\n\nThe default is 30.\n\nThe current TPS is " + tps + ".\n\nNOTE: 3pms_mod.js removes the TPS limit.\nAny TPS higher than 1000 isn't recommended.\n\n", + (r) => { + var newtps = parseInt(r); + if (r !== null) { + if (isNaN(newtps) || newtps == "") logMessage("You did not enter a valid TPS."); + else { + newtps = parseInt(newtps); + if (isNaN(newtps) || newtps <= 0) { + logMessage("You did not enter a valid TPS."); + } + else { + tps = newtps; + delete currentSaveData.oldTps; + } + } + resetInterval(tps); } - } - resetInterval(tps); - } - focusGame(); - }; -}, 1000); + focusGame(); + }, + "Change TPS" + ) +} // more settings @@ -60,7 +54,7 @@ setTimeout(() => { `); - const menuText = document.getElementsByClassName("menuText")[6] + const menuText = document.getElementsByClassName("menuText")[9] const newButton = document.createElement("button") newButton.innerText = "More Settings" newButton.className = "settingsButton" @@ -73,7 +67,7 @@ setTimeout(() => { // elements -elements.calcium_oxide = { // most of this is taken off calcium +elements.calcium_oxide = { color: ["#544E45","#6A635E","#6E6A61","#756F62","#918A7B"], tick: function(pixel) { behaviors.POWDER(pixel); @@ -95,39 +89,56 @@ elements.calcium_oxide = { // most of this is taken off calcium fireColor: "#ff6b21" } -elements.eeraser = { // finally integrating it after over a year +elements.eeraser = { color: "#FFFF00", - behavior: behaviors.WALL, - behaviorON: [ - "DL|DL|DL", - "DL|DL|DL", + behaviorOn: [ + "DL|XX|DL", + "DL|XX|DL", "DL|DL|DL", ], + behavior: [ + "XX|XX|XX", + "XX|XX|XX", + "XX|XX|XX" + ], + conduct: 0.5, category: "machines", - insulate: elements.wire.insulate, - conduct: elements.wire.conduct, - noMix: elements.wire.noMix + state: "solid", }; -// stopping the initiation +// tools +elements.replace_all_of_element = { + color: ["#ff3030", "#800000"], + name: "replace all of element", + onSelect: async function() { + promptInput( + "Enter the element to be replaced.", + (r) => { + if (r in elements) { + elements.replace_all_of_element.tool = function(pixel) { + elementbefore = pixel.element + for (var i = 0; i <= width; i++) { + for (var j = 0; j <= height; j++) { + if (!isEmpty(i,j,true)) { + if(pixelMap[i][j].element == elementbefore) { + changePixel(pixelMap[i][j], r) + } + } + } + } + } + } else { + logMessage("You did not enter an existing element."); + } + }, + "3pms_mod.js" + ); + }, + category: "tools", +}; + + setTimeout(() => { console.log("3pms_mod.js | Initiated. Thank you.") -}, 1000); - - - - - - - - - - - - - - - - -const thing=document.createElement("p");thing.innerText="MY NAME 📛 IS DAVID 👨‍🎤 DAD 👨‍👩‍👧‍👦👨‍👩‍👧‍👧 I ℹ️ WANT SOME ICE 🧊🇦🇶 CREAM 🧴🧴 DAVID 👨‍🎤 THAT IS MY NAME 📛 DAVID 👨‍🎤👨‍🎤 I ℹ️ WANT ANOTHER WHERE ❔❓ IS MY BALL 🏈🏈 I’M RUNNING 🏃‍♂️🏃‍♀️ OUT ON 🔛 THE ROAD 🚧 THERE IS A 🅰️ CAR 🚔🚖 AND IT IS GOING TO HIT 👊 ME 🖐🙋‍♀️ HEEEEEEEEELP HELP 💁 MEEEEEEE HEEEEEEEEEEEEEEEEELP\n\nthanks for using 3pms_mod.js :3";document.body.appendChild(thing) \ No newline at end of file +}, 1000); \ No newline at end of file From 561c158e5d505da2bb860ccbecafe8a7b9b6e7bf Mon Sep 17 00:00:00 2001 From: 3pm-on-github Date: Wed, 8 Oct 2025 15:07:59 +0200 Subject: [PATCH 057/105] the humble mod-list change --- mod-list.html | 1 + 1 file changed, 1 insertion(+) diff --git a/mod-list.html b/mod-list.html index 78200bde..98b60f42 100644 --- a/mod-list.html +++ b/mod-list.html @@ -351,6 +351,7 @@ volcanic_expansion.jsObsidian, Pumice, and Andesite rocksJayd Fun & Games +3pms_mod.jsAdds random stuff and tools3pm 10kelements.jsCustomizable amount of randomly generated elementsnousernamefound all_around_fillers.jsDirectional Filler variantsidk73248 allliquids.jsMade all elements liquidsAdora From 8f6fdbb10fe31f8284e44603b44771fc3059f031 Mon Sep 17 00:00:00 2001 From: PogDog <121242106+P0gDog@users.noreply.github.com> Date: Thu, 9 Oct 2025 20:01:15 +0000 Subject: [PATCH 058/105] Added my mods so far to mod list (Industry and sensitive) --- mod-list.html | 3 +++ 1 file changed, 3 insertions(+) diff --git a/mod-list.html b/mod-list.html index 0c6543bd..d29479be 100644 --- a/mod-list.html +++ b/mod-list.html @@ -280,6 +280,7 @@ waterspout.jsRe-adds the old Water Spoutmollthecoder WhisperingTheory.jsMany more variants of heater and coolerkaeud wifi_draw.jsDraws connections between WiFi in wifi.js and logicgates.jsRedBirdly +industry.jsAdds conveyors and emittors for most energy typespogdog Weapons aircrafts.jsAircrafts and aircraft partsJayd @@ -398,6 +399,8 @@ triggerable_random_powders.jsPowders with different abilities, such as heating and coolingAlice troll.jsVarious dumb elements that iterate randomly on the entire screenAlice WhisperingTheory.jsPowder and gas variant of heater and coolerkaeud +sensitive.jsMakes all elements sensitive to airpogdog + Visual Effects acid_and_shapes.jsWeird visual effects enabled in settingsAlice From 7c5fac598006c4bb109b03fc48dc1fac6a80d14b Mon Sep 17 00:00:00 2001 From: slweeb <91897291+slweeb@users.noreply.github.com> Date: Thu, 9 Oct 2025 16:19:59 -0400 Subject: [PATCH 059/105] Update mod-list.html --- mod-list.html | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/mod-list.html b/mod-list.html index 1a44d3b3..d66c98aa 100644 --- a/mod-list.html +++ b/mod-list.html @@ -263,6 +263,7 @@ gameOfLife.jsConway's Game of Life on a screenggod heatshield.jsHeatshields, makes Plasma coolerTaterbob human_friendly_design.jsPipes, Portals, Drag, and Mix don't kill humansNekonico +industry.jsConveyors and emitters for most energy typespogdog logicgates.jsPredictable electricity and logic gatesnousernamefound note_block_advanced.jsEdit of Alice's note_block.js, adds different blocks with different frequenciesCharsonBurensen note_block.jsMusical Note BlocksAlice @@ -281,8 +282,7 @@ video.jsVideo playerggod waterspout.jsRe-adds the old Water Spoutmollthecoder WhisperingTheory.jsMany more variants of heater and coolerkaeud -wifi_draw.jsDraws connections between WiFi in wifi.js and logicgates.jsRedBirdly -industry.jsAdds conveyors and emittors for most energy typespogdog +wifi_draw.jsConnections between WiFi in wifi.js and logicgates.jsRedBirdly Weapons aircrafts.jsAircrafts and aircraft partsJayd @@ -398,6 +398,7 @@ random_liquids.jsRandomly generates liquids on game loadAlice sbmixup.jsSilly elements from a Mix-Up! gamestefanblox scp.jsCreatures and items from the SCP WikiNekonico +sensitive.jsMakes all elements sensitive to airpogdog sports_beta.jsSeveral sports itemsBluBun5193 star_wars.jsVarious items from Star Wars by DisneySeaPickle754 sus.jsAmong Us crewmateNv7 @@ -405,7 +406,6 @@ triggerable_random_powders.jsPowders with different abilities, such as heating and coolingAlice troll.jsVarious dumb elements that iterate randomly on the entire screenAlice WhisperingTheory.jsPowder and gas variant of heater and coolerkaeud -sensitive.jsMakes all elements sensitive to airpogdog Visual Effects From 58c12d10676c13c1d153b85032af482d3f232dd8 Mon Sep 17 00:00:00 2001 From: slweeb <91897291+slweeb@users.noreply.github.com> Date: Sat, 11 Oct 2025 13:00:18 -0400 Subject: [PATCH 060/105] Update devsnacks.js --- mods/devsnacks.js | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/mods/devsnacks.js b/mods/devsnacks.js index e63e7a54..20734dc8 100644 --- a/mods/devsnacks.js +++ b/mods/devsnacks.js @@ -133,4 +133,28 @@ elements.applesauce = { density: 750, isFood: true, hidden: true, -} \ No newline at end of file +} + +if (!elements.mayo.reactions) elements.mayo.reactions = {}; +elements.mayo.reactions.ketchup = { elem1:"mayochup", elem2:"mayochup" } + +elements.mayochup = { + color: "#FDCC94", + behavior: behaviors.LIQUID, + reactions: { + "rust": { elem2:"iron", chance:0.005 }, + "oxidized_copper": { elem2:"copper", chance:0.005 }, + "baking_soda": { "elem1":"carbon_dioxide", elem2:"foam", chance:0.005, attr2:{"foam":3} }, + "glue": { elem2:null, chance:0.005 }, + "oil": { elem2:null, chance:0.005 }, + "sap": { elem2:null, chance:0.005 } + }, + viscosity: 26745.5, + tempHigh: 180.3, + stateHigh: ["carbon_dioxide","methane","steam","salt","sugar","steam","carbon_dioxide","methane"], + category:"liquids", + state: "liquid", + density: 1072.5, + isFood: true, + hidden: true +}; \ No newline at end of file From 1cf69119a49f5e57d444eaaf46e42608baff2a2a Mon Sep 17 00:00:00 2001 From: Alexthetransfem <124483815+theenchantedsword@users.noreply.github.com> Date: Sat, 11 Oct 2025 22:09:08 -0500 Subject: [PATCH 061/105] Update morechemistry.js Adds support for solubility.js --- mods/morechemistry.js | 146 ++++++++++++++++++++---------------------- 1 file changed, 69 insertions(+), 77 deletions(-) diff --git a/mods/morechemistry.js b/mods/morechemistry.js index eb628940..5008b2e5 100644 --- a/mods/morechemistry.js +++ b/mods/morechemistry.js @@ -1,97 +1,78 @@ /* -*Version 2.2.0 +*Version 2.2.1 */ 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}; + elements.copper_sulfate.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"}, + } + elements.copper_sulfate.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})`; - } - 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}; + + } 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(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})`; - } - } } } 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'], @@ -806,6 +787,7 @@ dependOn("orchidslibrary.js", ()=>{ category: "salts", state: "solid", density: 3900, + solubility: {water: 3.5}, 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"]}, @@ -823,6 +805,7 @@ dependOn("orchidslibrary.js", ()=>{ state: "solid", color: ["#f2f2f2", "#f5f5f5", "#ebebeb", "#e6e6e6"], density: 2320, + solubility: {water: 0.543, color: ["#7a9ff0", "#7aa4ff", "#729bf2", "#6f9cfc"]}, reactions: { baking_soda: {elem1: "magnesium_carbonate", elem2: "salt"}, lye: {elem1: "magnesium_hydroxide", elem2: "salt"}, @@ -852,6 +835,7 @@ dependOn("orchidslibrary.js", ()=>{ behavior: behaviors.POWDER, state: "solid", color: ["#f2f2f2", "#f5f5f5", "#ebebeb", "#e6e6e6"], + solubility: {water: 0.745, color: ["#7a9ff0", "#7aa4ff", "#729bf2", "#6f9cfc"]}, reactions: { baking_soda: {elem1: "limestone", elem2: "salt"}, lye: {elem1: "slaked_lime", elem2: "salt"}, @@ -941,6 +925,7 @@ dependOn("orchidslibrary.js", ()=>{ state: "solid", color: ["#ffffff", "#fcfcfc", "#ffffff", "#ededed"], density: 2470, + solubility: {water: 0.8, color: ["#7a9ff0", "#7aa4ff", "#729bf2", "#6f9cfc"]}, reactions: { water: {elem1: "gallium", elem2: "acid"}, steam: {elem1: "gallium", elem2: "acid_gas"}, @@ -972,6 +957,7 @@ dependOn("orchidslibrary.js", ()=>{ density: 2480, tempHigh: 630, stateHigh: ["chlorine", "aluminum"], + solubility: {water: 0.458, color: ["#7a9ff0", "#7aa4ff", "#729bf2", "#6f9cfc"]}, } elements.acid.reactions.aluminum = {elem1: "hydrogen", elem2: "aluminum_chloride"}; elements.acid.reactions.purple_gold = {elem1: ["aluminum_chloride", "aluminum_chloride", "hydrogen"], elem2: "gold"}; @@ -1079,6 +1065,7 @@ dependOn("orchidslibrary.js", ()=>{ state: "solid", category: "salts", alias: "Mg(CH₃COO)₂", + solubility: {water: 0.53, color: ["#7a9ff0", "#7aa4ff", "#729bf2", "#6f9cfc"]}, reactions: { acid: {elem1: "magnesium_chloride", elem2: "vinegar"}, baking_soda: {elem1: "magnesium_carbonate", elem2: "sodium_acetate"}, @@ -1095,6 +1082,7 @@ dependOn("orchidslibrary.js", ()=>{ state: "solid", category: "salts", alias: "Ca(CH₃COO)₂", + solubility: {water: 0.347, color: ["#7a9ff0", "#7aa4ff", "#729bf2", "#6f9cfc"]}, reactions: { acid: {elem1: "calcium_chloride", elem2: "vinegar"}, baking_soda: {elem1: "limestone", elem2: "sodium_acetate"}, @@ -1113,6 +1101,7 @@ dependOn("orchidslibrary.js", ()=>{ state: "solid", category: "salts", alias: "CH₃COOK", + solubility: {water: 2.55, color: ["#7a9ff0", "#7aa4ff", "#729bf2", "#6f9cfc"]}, reactions: { acid: {elem1: "potassium_salt", elem2: "vinegar"}, baking_soda: {elem1: "caustic_potash", elem2: "sodium_acetate"}, @@ -1128,6 +1117,7 @@ dependOn("orchidslibrary.js", ()=>{ state: "solid", category: "salts", alias: "Cu(CH₃COO)₂", + solubility: {water: 0.072}, reactions: { sodium: {elem1: "copper", elem2: "sodium_acetate"}, potassium: {elem1: "copper", elem2: "potassium_acetate"}, @@ -1148,6 +1138,7 @@ dependOn("orchidslibrary.js", ()=>{ state: "solid", category: "salts", alias: "CuCl₂", + solubility: {water: 0.743}, reactions: { sodium: {elem1: "copper", elem2: "sodium_acetate"}, potassium: {elem1: "copper", elem2: "potassium_acetate"}, @@ -1265,6 +1256,7 @@ dependOn("orchidslibrary.js", ()=>{ alias: "H₂PtCl₆", tempHigh: 500, stateHigh: ["acid_gas", "chlorine", "platinum", "platinum"], + solubility: {water: 1, }, reactions: { sodium: {elem1: "salt", elem2: "platinum", color2: ["#404040", "#525252", "#454545", "#2e2e2e", "#262626"]}, potassium: {elem1: "potassium_salt", elem2: "platinum", color2: ["#404040", "#525252", "#454545", "#2e2e2e", "#262626"]}, From 63266938901374aef480915c90b77c343383f64f Mon Sep 17 00:00:00 2001 From: Alexthetransfem <124483815+theenchantedsword@users.noreply.github.com> Date: Sat, 11 Oct 2025 22:10:12 -0500 Subject: [PATCH 062/105] Create solubility.js First release of solubility.js --- mods/solubility.js | 286 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 286 insertions(+) create mode 100644 mods/solubility.js diff --git a/mods/solubility.js b/mods/solubility.js new file mode 100644 index 00000000..28e8fc0e --- /dev/null +++ b/mods/solubility.js @@ -0,0 +1,286 @@ +/* +* Version 1.0.0 +*/ + +dependOn("orchidslibrary.js", ()=>{ + elements.water.reactions.salt = undefined; + elements.water.reactions.sugar = undefined; + elements.water.properties = {capacity: 100, elemsDissolved: {}}; + elements.salt.solubility = {water: 0.36, color: ["#7ca3f7", "#7798e0", "#89abf5", "#96b8ff"]}; + elements.sugar.solubility = {water: 2, visc: 850, color: ["#9bb0de", "#a8bbe3", "#a2b8e8", "#a7b7d9"]}; + elements.lye.solubility = {water: 1.09, color: ["#7ca3f7", "#7798e0", "#89abf5", "#96b8ff"]}; + elements.caustic_potash.solubility = {water: 1.1, color: ["#7ca3f7", "#7798e0", "#89abf5", "#96b8ff"]}; + elements.potassium_salt.solubility = {water: 0.3397, color: ["#7ca3f7", "#7798e0", "#89abf5", "#96b8ff"]}; + elements.borax.solubility = {water: 0.041, color: ["#658ce0", "#7299ed", "#7597e0", "#78a1fa"]}; + elements.epsom_salt.solubility = {water: 0.351, color: ["#658ce0", "#7299ed", "#7597e0", "#78a1fa"]}; + elements.sodium_acetate.solubility = {water: 1.233, color: ["#7ca3f7", "#7798e0", "#89abf5", "#96b8ff"]}; + elements.baking_soda.solubility = {water: 0.097, color: ["#7ca3f7", "#7798e0", "#89abf5", "#96b8ff"]}; + elements.copper_sulfate.solubility = {water: 0.32, color: ["#4a68f0", "#3358ff", "#2948d6", "#2146ed"]}; + elements.lye.reactions.water = undefined; + elements.soap.reactions.water = undefined; + elements.ash.solubility = {water: 1.1, func: function(p1, p2){ + if(p1.elemsDissolved.caustic_potash != undefined){ + p1.elemsDissolved.caustic_potash += p1.elemsDissolved.ash; + p1.elemsDissolved.ash = 0; + } else { + p1.elemsDissolved.caustic_potash = p1.elemsDissolved.ash; + p1.elemsDissolved.ash = 0; + } + if(p2.dissolved >= 100){ + changePixel(p2, getItem(["limestone", "quicklime", "charcoal", "dust", "dust"])); + p2.dissolved = undefined; + } + }}; + elements.water.reactions.ash = undefined; + function getItem(obj){ + let res; + if(Array.isArray(obj)){ + res = obj[Math.round(Math.random()*obj.length)]; + while(res == null){ + res = obj[Math.round(Math.random()*obj.length)]; + } + } else { + res = obj; + } + return res; + } + function aqueousReaction(p1, p2){ + for(let elem in p1.elemsDissolved){ + if(elements[elem].reactions != null && p2.element != "water" && elements[elem].reactions[p2.element] != undefined){ + + let r = elements[elem].reactions[p2.element]; + if(r.tempMin && !((p1.temp >= r.tempMin) && (p2.temp >= r.tempMin))){ + return false; + } + if(r.tempMax && !((p1.temp <= r.tempMax) && (p2.temp <= r.tempMax))){ + return false; + } + if(r.charged && !(p1.charge || p2.charge)){ + return false; + } + let c = (r.chance != undefined) ? r.chance : 1; + c = c*((p1.elemsDissolved[elem]/100)/elements[elem].solubility.water); + if(Math.random() > c){ + return false; + } + if(r.aqFunc){ + r.aqFunc(p1, p2); + } + if(r.elem1 != undefined){ + let e = getItem(r.elem1); + if(elements[e].solubility != undefined && elements[e].solubility.water != undefined){ + p1.elemsDissolved[e] = p1.elemsDissolved[elem]; + p1.elemsDissolved[elem] = undefined; + } else { + if(e === null){ + deletePixel(p1.x, p1.y); + } else { + changePixel(p1, e); + } + } + } + if(r.elem2 != undefined){ + changePixel(p2, getItem(r.elem2)); + } + if(r.charge1){ + p1.charge = r.charge1; + } + if(r.charge2){ + p2.charge = r.charge2; + } + if(r.stain1){ + stainPixel(p1,r.stain1,0.05); + } + if(r.stain2){ + stainPixel(p2,r.stain2,0.05); + } + } else if (p2.element == "water"){ + for(let e2 in p2.elemsDissolved){ + if(elements[elem].reactions != undefined && elements[elem].reactions[e2] != undefined){ + let r = elements[elem].reactions[e2]; + if(r.tempMin && !((p1.temp >= r.tempMin) && (p2.temp >= r.tempMin))){ + return false; + } + if(r.tempMax && !((p1.temp <= r.tempMax) && (p2.temp <= r.tempMax))){ + return false; + } + if(r.charged && !(p1.charge || p2.charge)){ + return false; + } + let c = (r.chance != undefined) ? r.chance : 1; + c = c*((p1.elemsDissolved[elem]/100)/elements[elem].solubility.water); + if(Math.random() > c){ + return false; + } + if(r.aqFunc){ + r.aqFunc(p1, p2); + } + if(r.elem1 != undefined){ + let e = getItem(r.elem1); + if(elements[e].solubility != undefined && elements[e].solubility.water != undefined){ + p1.elemsDissolved[e] = p1.elemsDissolved[elem]; + p1.elemsDissolved[elem] = undefined; + } else { + if(e === null){ + deletePixel(p1.x, p1.y); + } else { + changePixel(p1, e); + } + } + } + if(r.elem2 != undefined){ + let e = getItem(r.elem2); + if(elements[e].solubility != undefined && elements[e].solubility.water != undefined){ + p2.elemsDissolved[e] = p1.elemsDissolved[elem]; + p2.elemsDissolved[elem] = undefined; + } else { + if(e === null){ + deletePixel(p2.x, p2.y); + } else { + changePixel(p2, e); + } + } + } + if(r.charge1){ + p1.charge = r.charge1; + } + if(r.charge2){ + p2.charge = r.charge2; + } + if(r.stain1){ + stainPixel(p1,r.stain1,0.05); + } + if(r.stain2){ + stainPixel(p2,r.stain2,0.05); + } + } + } + } + } + } + function updateColor(pixel){ + let c = pixel.oColor; + for(let element in pixel.elemsDissolved){ + //if(elements[element].solubility.color != undefined){ + let color = (elements[element].solubility.color != undefined) ? getItem(elements[element].solubility.color) : getItem(elements[element].color); + /*if(Array.isArray(elements[element].solubility.color)){ + color = elements[element].solubility.color[Math.round(Math.random()*elements[element].solubility.color.length)]; + while(color == undefined){ + color = elements[element].solubility.color[Math.round(Math.random()*elements[element].solubility.color.length)]; + } + } else { + color = elements[element].solubility.color; + }*/ + if(color.startsWith("#")){ + color = hexToRGB(color); + } else if(color.startsWith("rgb(")){ + color = getRGB(color); + } + c = interpolateRgb(getRGB(c), color, ((pixel.elemsDissolved[element]/100)/elements[element].solubility.water) || 0.01); + //console.log(rgb, color, getRGB(pixel.oColor), ((pixel.elemsDissolved[elem]/100)/elements[elem].solubility.water)); + + } + pixel.color = c; + //} + } + function solventTick(pixel) { + if(pixel.start = pixelTicks+5){ + pixel.oColor = pixel.color; + } + pixel.capacity = (1+((pixel.temp-20)/80))*100; + for(let coords of adjacentCoords){ + let x = pixel.x+coords[0], y = pixel.y+coords[1]; + let p2 = getPixel(x,y); + let total = 0; + for(let elem in pixel.elemsDissolved){ + total += pixel.capacity*((pixel.elemsDissolved[elem]/100)/elements[elem].solubility.water); + } + if(p2 != null){ + aqueousReaction(pixel, p2); + } + if(p2 != null && total < pixel.capacity){ + if(elements[p2.element].solubility != null && elements[p2.element].solubility[pixel.element] != null){ + let solubilityObj = elements[p2.element].solubility; + p2.dissolved = (p2.dissolved == undefined) ? elements[p2.element].solubility[pixel.element] : p2.dissolved+elements[p2.element].solubility[pixel.element]; + + if(pixel.elemsDissolved[p2.element] == undefined){ + pixel.elemsDissolved[p2.element] = elements[p2.element].solubility[pixel.element]; + } else { + pixel.elemsDissolved[p2.element] += elements[p2.element].solubility[pixel.element]; + } + updateColor(pixel, p2.element); + if(solubilityObj.func != undefined){ + solubilityObj.func(pixel, p2); + } + if(p2.dissolved >= 100){ + deletePixel(p2.x, p2.y); + } + } + } else if(total > (pixel.capacity+20) && p2 == null) { + let solArr = [], elemArr = []; + for(let elem in pixel.elemsDissolved){ + elemArr.push(elem); + solArr.push(elements[elem].solubility[pixel.element]); + } + let index = solArr.indexOf(Math.min(...solArr)); + if(isEmpty(x,y) && !outOfBounds(x,y)){ + createPixel(elemArr[index], x, y); + let max = (pixel.elemsDissolved[elemArr[index]] > (total-pixel.capacity)) ? total-pixel.capacity : pixel.elemsDissolved[elemArr[index]]; + pixelMap[x][y].dissolved = 100-max; + updateColor(pixel); + pixel.elemsDissolved[elemArr[index]] -= max; + } + } + else if (p2 != null && p2.element == "water"){ + for(let elem in pixel.elemsDissolved){ + if(p2.elemsDissolved[elem] == undefined) {p2.elemsDissolved[elem] = 0;}; + if(p2.elemsDissolved[elem] > pixel.elemsDissolved[elem] && pixel.elemsDissolved[elem]/100 < elements[elem].solubility[pixel.element]){ + p2.elemsDissolved[elem]--; + pixel.elemsDissolved[elem]++; + updateColor(pixel); + updateColor(p2); + } else if (p2.elemsDissolved[elem] < pixel.elemsDissolved[elem] && p2.elemsDissolved[elem]/100 < elements[elem].solubility[pixel.element]) { + p2.elemsDissolved[elem]++; + pixel.elemsDissolved[elem]--; + updateColor(pixel); + updateColor(p2); + } + } + } + } + if(pixel.temp >= elements[pixel.element].solventTempHigh){ + let elem = null; + let num = Math.random(); + if(elem === null){ + for(let e in pixel.elemsDissolved){ + if(num <= ((pixel.elemsDissolved[e]/100)/elements[e].solubility.water)){ + elem = e; + } + } + } + elem = (elem == null) ? "steam" : elem; + changePixel(pixel, elem); + pixel.dissolvedElems = {}; + } + } + behaviors.SOLVENT = function(pixel){ + let visc = 0; + for(let elem in pixel.elemsDissolved){ + if(elements[elem].solubility.visc != undefined){ + visc += ((pixel.elemsDissolved[elem]/100)/elements[elem].solubility[pixel.element])*elements[elem].solubility.visc; + } + } + if(elements[pixel.element].viscosity != undefined){ + visc = visc*(elements[pixel.element].viscosity/1000); + } + let chance = 1-(visc/1000); + let dir = (Math.random() Date: Sat, 11 Oct 2025 22:15:31 -0500 Subject: [PATCH 063/105] Update mod-list.html Added solubility.js under science and chemistry --- mod-list.html | 1 + 1 file changed, 1 insertion(+) diff --git a/mod-list.html b/mod-list.html index d66c98aa..d9ed8b19 100644 --- a/mod-list.html +++ b/mod-list.html @@ -243,6 +243,7 @@ radioactive.jsRadioactive elements on the periodic table [WIP]kaeud random_rocks.jsRandomly generates rocks on game loadAlice roseyiede.jsSeveral variants of a substance called roseyiedeAlice +solubility.jsAdds solubility and a simple-to-use format for other mods to use with itOrchid some_tf_liquids.jsVarious liquids from the Thermal Foundation Minecraft modAlice stickystuff.jsSlime, Honey, and others can stick to other elementsSuss the_ground.jsSeveral rocks, worldgen types, and gemstonesAlice From bb63d6b89f95ede168970ea8a9763c2483e0973c Mon Sep 17 00:00:00 2001 From: Cube14yt Date: Wed, 15 Oct 2025 21:46:02 +0800 Subject: [PATCH 064/105] Update cubesstuff.js --- mods/cubesstuff.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/mods/cubesstuff.js b/mods/cubesstuff.js index ccf3b56f..f623c65e 100644 --- a/mods/cubesstuff.js +++ b/mods/cubesstuff.js @@ -3231,7 +3231,7 @@ elements.element_line = { } } if (pixel.dir === 1) { - if (!tryMove(pixel, pixel.x, pixel.y - 1, pixel.clone)) { + if (!tryMove(pixel, pixel.x, pixel.y + 1, pixel.clone)) { changePixel(pixel, pixel.clone, true) } } @@ -3241,7 +3241,7 @@ elements.element_line = { } } if (pixel.dir === 3) { - if (!tryMove(pixel, pixel.x, pixel.y + 1, pixel.clone)) { + if (!tryMove(pixel, pixel.x, pixel.y - 1, pixel.clone)) { changePixel(pixel, pixel.clone, true) } } @@ -3326,3 +3326,4 @@ elements.replace_all_of_element = { } + From eaf1ca58f3ba128ad39c95f405629119c0d494af Mon Sep 17 00:00:00 2001 From: Nekonico <163950752+DBNekonico@users.noreply.github.com> Date: Wed, 15 Oct 2025 18:44:07 -0700 Subject: [PATCH 065/105] a lot more stuff and bugfixes and 001 --- mods/scp.js | 1149 +++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 1116 insertions(+), 33 deletions(-) diff --git a/mods/scp.js b/mods/scp.js index 1d479699..8b9a6a7d 100644 --- a/mods/scp.js +++ b/mods/scp.js @@ -1,6 +1,12 @@ /* by nekonico */ window.addEventListener("load", () => { + document.getElementById("elementButton-scp_001_light")?.remove() + document.getElementById("elementButton-melted_head")?.remove() + document.getElementById("elementButton-melted_body")?.remove() + document.getElementById("elementButton-melted_animal")?.remove() + document.getElementById("elementButton-melted_plant")?.remove() + document.getElementById("elementButton-fused_organism")?.remove() document.getElementById("elementButton-head_008")?.remove() document.getElementById("elementButton-body_008")?.remove() document.getElementById("elementButton-head_012_1")?.remove() @@ -15,6 +21,8 @@ window.addEventListener("load", () => { document.getElementById("elementButton-head_173")?.remove() document.getElementById("elementButton-body_173")?.remove() document.getElementById("elementButton-scp_229")?.remove() + document.getElementById("elementButton-packet")?.remove() + document.getElementById("elementButton-can")?.remove() document.getElementById("elementButton-head_457")?.remove() document.getElementById("elementButton-body_457")?.remove() document.getElementById("elementButton-head_1000")?.remove() @@ -34,9 +42,25 @@ window.addEventListener("load", () => { document.getElementById("elementButton-scp_009_plant")?.remove() document.getElementById("elementButton-red_cloud")?.remove() document.getElementById("elementButton-red_rain")?.remove() - document.getElementById("elementButton-shy_head")?.remove() - document.getElementById("elementButton-shy_body")?.remove() + document.getElementById("elementButton-head_096")?.remove() + document.getElementById("elementButton-body_096")?.remove() document.getElementById("elementButton-REDACTED")?.remove() + +vendingNormD = Object.keys(elements).filter(function(e) { + return elements[e].state == "liquid" && elements[e].movable == true && elements[e].category != "scp" && (elements[e].category == "food" || (elements[e].id == elements.water.id || elements[e].id == elements.sugar_water.id || elements[e].id == elements.seltzer.id || elements[e].id == elements.dirty_water.id || elements[e].id == elements.slime.id || elements[e].id == elements.neutral_acid.id || elements[e].id == elements.blood.id || elements[e].id == elements.sap.id || elements[e].id == elements.dye.id) || elements[e].isFood) && !elements[e].tool; +}); + +vendingNormF = Object.keys(elements).filter(function(e) { + return (elements[e].state != "liquid" && elements[e].state != "gas") && elements[e].category != "scp" && elements[e].movable == true && (elements[e].category == "food" || elements[e].isFood) && !elements[e].tool; +}); + +vendingWeirdD = Object.keys(elements).filter(function(e) { + return (elements[e].state == "liquid" || elements[e].state == "gas") && elements[e].movable == true && (elements[e].category == "food" || elements[e].category == "liquids" || elements[e].category == "life" || elements[e].category == "gases" || elements[e].category == "energy") && !elements[e].tool; +}); + +vendingWeirdF = Object.keys(elements).filter(function(e) { + return elements[e].state != "gas" && elements[e].movable == true && (elements[e].id != elements.armageddon.id && elements[e].id != elements.blaster.id && elements[e].id != elements.false_vacuum_decay_bomb.id && elements[e].id != elements.earthquake.id && elements[e].id != elements.tsunami.id && elements[e].id != elements.volcano.id && elements[e].id != elements.sinkhole.id) && (elements[e].category == "food" || elements[e].category == "life" || elements[e].category == "land" || elements[e].category == "weapons" || elements[e].category == "energy" || elements[e].isFood) && !elements[e].tool; +}); }) async function _scpAskPrompt(message, defaultValue = "") { @@ -229,7 +253,7 @@ elements.access_door = { if (!isEmpty(pixel.x-1, pixel.y, true) && !outOfBounds(pixel.x-1, pixel.y) && Math.random() > 0.9){ let neighbor = pixelMap[pixel.x-1][pixel.y] if (pixel.levelReq && elements[neighbor.element].level < pixel.levelReq) {} - else if (neighbor.level >= pixel.levelReq && (neighbor.element == "body" || neighbor.element == "body_1000" || neighbor.element == "body_008" || neighbor.element == "body_1015" || neighbor.element == "body_035" || neighbor.element == "body_012_1")) { + else if (neighbor.level >= pixel.levelReq && (neighbor.element == "body" || neighbor.element == "melted_body" || neighbor.element == "fused_organism" && Math.random() > 0.75 || neighbor.element == "body_1000" || neighbor.element == "body_008" || neighbor.element == "body_1015" || neighbor.element == "body_035" || neighbor.element == "body_012_1")) { if (neighbor.dir == 1 && !isEmpty(neighbor.x,neighbor.y-1) && !outOfBounds(neighbor.x,neighbor.y-1)) { if (isEmpty(pixel.x+1,pixel.y) && isEmpty(pixel.x+1,pixel.y-1)) { if (tryMove(pixelMap[neighbor.x][neighbor.y-1],pixel.x+1,pixel.y-1)) { @@ -246,7 +270,7 @@ elements.access_door = { movePixel(neighbor,pixel.x+1,pixel.y+1) } } - else if (!isEmpty(pixel.x+1,pixel.y) && !isEmpty(pixel.x+1,pixel.y-1) && isEmpty(pixel.x+2,pixel.y+1) && isEmpty(pixel.x+2,pixel.y)) { + else if (!isEmpty(pixel.x+1,pixel.y) && !isEmpty(pixel.x+1,pixel.y-1) && isEmpty(pixel.x+2,pixel.y) && isEmpty(pixel.x+2,pixel.y-1)) { let doorB = pixelMap[pixel.x+1][pixel.y] let doorH = pixelMap[pixel.x+1][pixel.y-1] if (doorB.levelReq <= pixel.levelReq && doorH.levelReq <= pixel.levelReq) { @@ -257,6 +281,26 @@ elements.access_door = { } } } + else if (neighbor.level >= pixel.levelReq && neighbor.element == "fused_organism" && Math.random() > 0.5) { + if (neighbor.dir == 1 && !isEmpty(neighbor.x,neighbor.y-1) && !outOfBounds(neighbor.x,neighbor.y-1)) { + if (isEmpty(pixel.x+1,pixel.y)) { + tryMove(pixelMap[neighbor.x][neighbor.y],pixel.x+1,pixel.y) + } + else if (isEmpty(pixel.x+1,pixel.y-1)) { + tryMove(pixelMap[neighbor.x][neighbor.y],pixel.x+1,pixel.y-1) + } + else if (isEmpty(pixel.x+1,pixel.y+1)) { + tryMove(pixelMap[neighbor.x][neighbor.y],pixel.x+1,pixel.y+1) + } + else if (!isEmpty(pixel.x+1,pixel.y) && isEmpty(pixel.x+2,pixel.y)) { + let doorB = pixelMap[pixel.x+1][pixel.y] + let doorH = pixelMap[pixel.x+1][pixel.y-1] + if (doorB.levelReq <= pixel.levelReq && doorH.levelReq <= pixel.levelReq) { + tryMove(pixelMap[neighbor.x][neighbor.y],pixel.x+2,pixel.y) + } + } + } + } } else if (!isEmpty(pixel.x+1, pixel.y, true) && !outOfBounds(pixel.x+1, pixel.y) && Math.random() > 0.9){ let neighbor = pixelMap[pixel.x+1][pixel.y] @@ -307,6 +351,40 @@ elements.access_door = { density: 7850, } +elements.alarm = { + color: "#ff2222", + buttonColor: "#660000", + behavior: behaviors.WALL, + renderer: renderPresets.LED, + properties: { + radius: 8, + }, + tick: function(pixel) { + doDefaults(pixel) + if (!pixel.radius || pixel.radius != 8) { + pixel.radius = 8 + } + if (pixel.radius > 0 && (pixel.charge || pixel.chargeCD)) { + var coords = circleCoords(pixel.x,pixel.y,pixel.radius); + for (var i = 0; i < coords.length; i++) { + if (!isEmpty(coords[i].x,coords[i].y) && !outOfBounds(coords[i].x,coords[i].y)) { + var panic = pixelMap[coords[i].x][coords[i].y] + if (panic.panic != undefined && (panic.element == "body" || panic.element == "body_1000" || panic.element == "body_1015")) { + panic.panic += 0.025 + } + } + } + } + }, + category: "scp", + tempHigh: 1500, + stateHigh: ["molten_glass","molten_glass","molten_glass","molten_gallium","molten_aluminum","molten_copper","molten_plastic","molten_plastic"], + conduct: 1, + breakInto: ["glass_shard","bead","glass_shard","bead","copper"], + breakIntoColorMultiplier: [1.1,1,0.86], + forceSaveColor: true +} + elements.level_0 = { color: ["#635957","#AB9D9C","#D3CCCC"], name: "Level 0 Keycard", @@ -496,6 +574,61 @@ elements.d_class = { forceSaveColor: true, } +elements.maintenance = { + // color: ["#f5eac6","#d4c594","#a89160","#7a5733","#523018","#361e0e"], + color: ["#f3e7db","#f7ead0","#eadaba","#d7bd96","#a07e56","#825c43","#604134","#3a312a"], + buttonColor: ["#111188","#1111dd","#047e99"], + name: "Technician", + category: "scp", + properties: { + dead: false, + dir: 1, + panic: 0 + }, + onPlace: function(pixel) { + if (isEmpty(pixel.x, pixel.y+1)) { + createPixel("body", pixel.x, pixel.y+1); + pixelMap[pixel.x][pixel.y+1].color = pixelColorPick(pixelMap[pixel.x][pixel.y+1], elements.maintenance.buttonColor) + pixelMap[pixel.x][pixel.y+1].level = 1 + var color = pixel.color; + changePixel(pixel,"head"); + pixel.color = color; + } + else if (isEmpty(pixel.x, pixel.y-1)) { + createPixel("head", pixel.x, pixel.y-1); + pixelMap[pixel.x][pixel.y-1].color = pixel.color; + changePixel(pixel,"body"); + pixel.color = pixelColorPick(pixel, elements.maintenance.buttonColor); + pixel.level = 1 + } + else { + deletePixel(pixel.x, pixel.y); + } + }, + reactions: { + "fire": { attr1:{panic:5} }, + "plasma": { attr1:{panic:5} }, + "cold_fire": { attr1:{panic:5} }, + "electric": { attr1:{panic:5} }, + "blood": { attr1:{panic:1} }, + "infection": { attr1:{panic:2} }, + "cancer": { attr1:{panic:3} }, + "plague": { attr1:{panic:5} }, + "radiation": { attr1:{panic:5} }, + "tnt": { attr1:{panic:5} }, + "dynamite": { attr1:{panic:5} }, + "c4": { attr1:{panic:5} }, + "grenade": { attr1:{panic:5} }, + "gunpowder": { attr1:{panic:5} }, + "acid": { attr1:{panic:5} }, + "acid_gas": { attr1:{panic:5} }, + "stench": { attr1:{panic:2} } + }, + related: ["body","head"], + cooldown: defaultCooldown, + forceSaveColor: true, +} + elements.scientist = { // color: ["#f5eac6","#d4c594","#a89160","#7a5733","#523018","#361e0e"], color: ["#f3e7db","#f7ead0","#eadaba","#d7bd96","#a07e56","#825c43","#604134","#3a312a"], @@ -661,6 +794,706 @@ elements.director = { forceSaveColor: true, } +elements.scp_001_sdl = { + name: "SCP-001 CN: Locke", + color: "#c12600", + tick: function(pixel) { + // minimum 1726 + // maximum 7726 + if (pixel.eclipse) { pixel.color = pixelColorPick(pixel,"#f68656"); var c=0.01} + else if (pixel.temp < 1500) { pixel.color = pixelColorPick(pixel,"#7a4e43"); } + else if (pixel.temp < 3600) { pixel.color = pixelColorPick(pixel,"#ffbdbd"); var c=0.05 } + else if (pixel.temp < 7000) { pixel.color = pixelColorPick(pixel,"#c12600"); var c=0.1 } + else if (pixel.temp < 11000) { pixel.color = pixelColorPick(pixel,"#ffb09c"); var c=0.25 } + else if (pixel.temp < 28000) { pixel.color = pixelColorPick(pixel,"#f7fff5"); var c=0.5 } + else { pixel.color = pixelColorPick(pixel,"#c3bdff"); var c=0.4 } + if (pixel.temp < 1500) { var c=0 } + for (var i = 0; i < adjacentCoords.length; i++) { + var x = pixel.x+adjacentCoords[i][0]; + var y = pixel.y+adjacentCoords[i][1]; + if (isEmpty(x,y)) { + if (Math.random() > c) {continue} + createPixel("scp_001_light", x, y); + pixelMap[x][y].color = pixel.color; + } + else if (!outOfBounds(x,y)) { + var newPixel = pixelMap[x][y]; + if (elements[newPixel.element].id === elements.scp_001_sdl.id) { + if (pixel.eclipse) { newPixel.eclipse = true } + if (pixel.temp!==newPixel.temp) { + var avg = (pixel.temp + newPixel.temp)/2; + pixel.temp = avg; + newPixel.temp = avg; + pixelTempCheck(pixel); + pixelTempCheck(newPixel); + } + } + else if (elements[newPixel.element].id === elements.sun.id) { + changePixel(newPixel, "scp_001_sdl"); + } + } + } + }, + tool: function(pixel) { + if (pixel.element === "light") { + deletePixel(pixel.x,pixel.y); + } + if (pixel.element === "scp_001_light") { + deletePixel(pixel.x,pixel.y); + } + }, + canPlace: true, + reactions: { + "hydrogen": { elem2:"helium", temp1:5 }, + "helium": { elem2:"carbon_dioxide", temp1:5, tempMax:3600 }, + "carbon_dioxide": { elem2:"neon", temp1:5, tempMax:1800 }, + "sun": { elem2:"scp_001_sdl", }, + "light": { elem2:"scp_001_light" }, + }, + temp: 5504, + tempLow: -100, + stateLow: "supernova", + category: "scp", + state: "gas", + //density: 1408, + insulate: true, + noMix: true, + movable: false +} + +elements.scp_001_light = { + hidden: true, + name: "light", + color: "#c12600", + tick: function(pixel) { + if (Math.random() < 0.01) { + deletePixel(pixel.x,pixel.y); + return; + } + if (pixel.bx===undefined) { + // choose 1, 0, or -1 + pixel.bx = Math.random() < 0.5 ? 1 : Math.random() < 0.5 ? 0 : -1; + pixel.by = Math.random() < 0.5 ? 1 : Math.random() < 0.5 ? 0 : -1; + // if both are 0, make one of them 1 or -1 + if (pixel.bx===0 && pixel.by===0) { + if (Math.random() < 0.5) { pixel.bx = Math.random() < 0.5 ? 1 : -1; } + else { pixel.by = Math.random() < 0.5 ? 1 : -1; } + } + } + // move and invert direction if hit + if (pixel.bx && !tryMove(pixel, pixel.x+pixel.bx, pixel.y)) { + var newX = pixel.x + pixel.bx; + if (!isEmpty(newX, pixel.y, true)) { + var newPixel = pixelMap[pixel.x+pixel.bx][pixel.y]; + if (!elements[newPixel.element].insulate) { + newPixel.temp += 1; + pixelTempCheck(newPixel); + } + if (!elements.light.reactions[newPixel.element]) { + pixel.color = newPixel.color; + } + else if (!elements.scp_001_light.reactions[newPixel.element]) { + pixel.color = newPixel.color; + } + } + pixel.bx = -pixel.bx; + } + if (pixel.by && !tryMove(pixel, pixel.x, pixel.y+pixel.by)) { + var newY = pixel.y + pixel.by; + if (!isEmpty(pixel.x, newY, true)) { + var newPixel = pixelMap[pixel.x][pixel.y+pixel.by]; + if (!elements[newPixel.element].insulate && newPixel.temp < 200) { + newPixel.temp += 0.1; + pixelTempCheck(newPixel); + } + if (!elements.light.reactions[newPixel.element]) { + pixel.color = newPixel.color; + } + else if (!elements.scp_001_light.reactions[newPixel.element]) { + pixel.color = newPixel.color; + } + } + pixel.by = -pixel.by; + } + }, + onCollide: function(pixel1,pixel2) { + if (pixel2.element == "head") { + pixel2.origElem = pixel2.element + pixel2.element = "melted_head" + } + else if (pixel2.element == "body") { + pixel2.origElem = pixel2.element + pixel2.element = "melted_body" + } + else if (pixel2.element == "plant" || pixel2.element == "grass" || pixel2.element == "lichen" || pixel2.element == "kelp" || pixel2.element == "evergreen" || pixel2.element == "pistil" || pixel2.element == "petal" || pixel2.element == "bamboo" || pixel2.element == "bamboo_plant" || pixel2.element == "cactus" || pixel2.element == "corn" || pixel2.element == "wheat" || pixel2.element == "dead_plant" || pixel2.element == "sapling" || pixel2.element == "pinecone") { + pixel2.origElem = pixel2.element + pixel2.element = "melted_plant" + } + else if (pixel2.element == "tree_branch") { + pixel2.element = "wood" + } + else if (pixel2.element == "cell" || pixel2.element == "cancer" || pixel2.element == "worm" || pixel2.element == "flea" || pixel2.element == "termite" || pixel2.element == "ant" || pixel2.element == "spider" || pixel2.element == "fly" || pixel2.element == "firefly" || pixel2.element == "bee" || pixel2.element == "stink_bug" || pixel2.element == "dead_bug" || pixel2.element == "bird" || pixel2.element == "rat" || pixel2.element == "frog" || pixel2.element == "tadpole" || pixel2.element == "fish" || pixel2.element == "slug" || pixel2.element == "snail" || pixel2.element == "coral") { + pixel2.origElem = pixel2.element + pixel2.element = "melted_animal" + } + else if (pixel2.element == "head_008" || pixel2.element == "head_012_1" || pixel2.element == "head_035" || pixel2.element == "head_049" || pixel2.element == "head_096" || pixel2.element == "head_1000" || pixel2.element == "head_1015") { + pixel2.origElem = pixel2.element + pixel2.element = "melted_head" + } + else if (pixel2.element == "body_008" || pixel2.element == "body_012_1" || pixel2.element == "body_035" || pixel2.element == "body_049" || pixel2.element == "body_096" || pixel2.element == "body_1000" || pixel2.element == "body_1015") { + pixel2.origElem = pixel2.element + pixel2.element = "melted_body" + } + else if (pixel2.element == "scp_236" || pixel2.element == "scp_391" || pixel2.element == "scp_1424") { + pixel2.origElem = pixel2.element + pixel2.element = "melted_animal" + } + else if (pixel2.element == "skin" || pixel2.element == "meat" || pixel2.element == "cured_meat" || pixel2.element == "rotten_meat" || pixel2.element == "cooked_meat") { + pixel2.origElem = pixel2.element + pixel2.element = "fused_organism" + } + else if (pixel2.element == "dust" || pixel2.element == "cloth" || pixel2.element == "cloth_scrap" || pixel2.element == "hair" || pixel2.element == "loose_hair") { + deletePixel(pixel2.x,pixel2.y) + } + if (elements[pixel2.element].isBio) { + pixel2.origElem = pixel2.element + if (pixel2.con) { + delete pixel2.con + } + pixel2.element = "melted_animal" + } + else if (elements[pixel2.element].isHair || pixel2.element == "loose_hair" || pixel2.element == "gaseous_material" || pixel2.element == "digested_material" || pixel2.element == "urine" || pixel2.element == "excrement" || pixel2.element == "brain_jar_juice") { + deletePixel(pixel2.x,pixel2.y) + } + }, + reactions: { + "glass": { "color1":["#ff0000","#ff0000","#ff0000","#ff8800","#ffff00","#00ff00","#00ffff","#0000ff","#ff00ff"] }, + "glass_shard": { "color1":["#ff0000","#ff0000","#ff0000","#ff8800","#ffff00","#00ff00","#00ffff","#0000ff","#ff00ff"] }, + "rad_glass": { "color1":["#ff0000","#ff0000","#9f6060","#9f8260","#9f9f60","#609f60","#609f9f","#60609f","#9f609f"] }, + "rad_shard": { "color1":["#ff0000","#ff0000","#9f6060","#9f8260","#9f9f60","#609f60","#609f9f","#60609f","#9f609f"] }, + "steam": { "color1":["#ff0000","#ff0000","#ff0000","#ff8800","#ffff00","#00ff00","#00ffff","#0000ff","#ff00ff"] }, + "rain_cloud": { "color1":["#ff0000","#ff0000","#ff0000","#ff8800","#ffff00","#00ff00","#00ffff","#0000ff","#ff00ff"] }, + "cloud": { "color1":["#ff0000","#ff0000","#ff0000","#ff8800","#ffff00","#00ff00","#00ffff","#0000ff","#ff00ff"] }, + "smog": { "color1":["#ff0000","#ff0000","#9f6060","#9f8260","#9f9f60","#609f60","#609f9f","#60609f","#9f609f"] }, + "ice": { "color1":["#ff0000","#c2fff9"] }, + "rime": { "color1":["#ff0000","#c2fff9"] }, + "water": { "color1":["#ff0000","#a1bac9"] }, + "salt_water": { "color1":["#ff0000","#a1bac9"] }, + "sugar_water": { "color1":["#ff0000","#a1bac9"] }, + "dirty_water": { "color1":["#ff0000","#a1c9a8"] }, + "seltzer": { "color1":["#ff0000","#c2fff9"] }, + "diamond": { "color1":["#ff0000","#c2c5ff","#c2d9ff"] }, + "rainbow": { "color1":["#ff0000","#ff0000","#ff8800","#ffff00","#00ff00","#00ffff","#0000ff","#ff00ff"] }, + "static": { "color1":["#ff0000","#ffffff","#bdbdbd","#808080","#424242","#1c1c1c"] }, + "light": { elem2:"scp_001_light" }, + }, + temp: 35, + tempLow: -273, + stateLow: ["liquid_light",null], + stateLowColorMultiplier: 0.8, + category: "scp", + state: "gas", + density: 0.00001, + ignoreAir: true, + insulate: true +} + +elements.melted_body = { + color: ["#f3e7db","#f7ead0","#eadaba","#d7bd96","#a07e56","#825c43","#604134","#3a312a"], + name: "SCP-001-A", + category: "scp", + hidden: true, + density: 1500, + state: "solid", + conduct: .05, + temp: 37, + tempHigh: 150, + stateHigh: "cooked_meat", + tempLow: -30, + stateLow: "frozen_meat", + burn: 10, + burnTime: 250, + burnInto: "cooked_meat", + breakInto: ["blood","meat","bone"], + forceSaveColor: true, + pickElement: "human", + onCollide: function(pixel1,pixel2) { + if (elements[pixel2.element].melteda && pixel2.element != "melted_head" && Math.random() > 0.9 && pixel2.origElem != pixel1.origElem) { + pixel2.element = "fused_organism" + pixel1.element = "fused_organism" + } + }, + melteda: true, + stain: 0.01875, + stainSelf: true, + reactions: { + "cancer": { elem1:"cancer", chance:0.005 }, + "radiation": { elem1:["ash","meat","rotten_meat","cooked_meat"], chance:0.4 }, + "neutron": { elem1:["ash","meat","rotten_meat","cooked_meat"], chance:0.01 }, + "fallout": { elem1:["ash","meat","rotten_meat","cooked_meat"], chance:0.01 }, + "plague": { elem1:"plague", chance:0.05 }, + "egg": { elem2:"yolk", chance:0.5, oneway:true }, + "grape": { elem2:"juice", chance:0.5, color2:"#291824", oneway:true }, + "ant": { elem2:"dead_bug", chance:0.05, oneway:true }, + "spider": { elem2:"dead_bug", oneway:true }, + "fly": { elem2:"dead_bug", oneway:true }, + "firefly": { elem2:"dead_bug", oneway:true }, + "bee": { elem2:"dead_bug", oneway:true }, + "flea": { elem2:"dead_bug", oneway:true }, + "termite": { elem2:"dead_bug", oneway:true }, + "worm": { elem2:"slime", chance:0.05, oneway:true }, + "stink_bug": { elem2:"stench", oneway:true }, + "grass_seed": { elem2:null, chance:0.05 }, + "sun": { elem1:"cooked_meat" }, + "alcohol": { chance:0.2, attr1:{"panic":0} }, + "anesthesia": { attr1:{"panic":0} }, + "alcohol_gas": { chance:0.2, attr1:{"panic":0} }, + }, + properties: { + dead: false, + dir: 1, + panic: 0, + }, + tick: function(pixel) { + if (tryMove(pixel, pixel.x, pixel.y+1)) { // Fall + if (!isEmpty(pixel.x, pixel.y-2, true)) { // Drag head down + var headpixel = pixelMap[pixel.x][pixel.y-2]; + if (headpixel.element === "melted_head") { + if (isEmpty(pixel.x, pixel.y-1)) { + movePixel(pixelMap[pixel.x][pixel.y-2], pixel.x, pixel.y-1); + } + else { + swapPixels(pixelMap[pixel.x][pixel.y-2], pixelMap[pixel.x][pixel.y-1]); + } + } + } + } + doHeat(pixel); + doBurning(pixel); + doElectricity(pixel); + if (pixel.dead) { + // Turn into rotten_meat if pixelTicks-dead > 500 + if (pixelTicks-pixel.dead > 200 && Math.random() < 0.1) { + pixel.element = "rotten_meat" + } + return + } + + // Find the head + if (!isEmpty(pixel.x, pixel.y-1, true) && pixelMap[pixel.x][pixel.y-1].element == "melted_head") { + var head = pixelMap[pixel.x][pixel.y-1]; + if (pixel.color != head.color) { + pixel.color = head.color + pixel.shirtless = true + } + else { + pixel.shirtless = true + } + if (head.dead) { // If head is dead, kill body + pixel.dead = head.dead; + } + else if (head.panic > 0) { + delete head.panic; + } + } + else if (!isEmpty(pixel.x, pixel.y-1, true) && (pixelMap[pixel.x][pixel.y-1].element == "head" || pixelMap[pixel.x][pixel.y-1].element == "head_008" || pixelMap[pixel.x][pixel.y-1].element == "head_012_1" || pixelMap[pixel.x][pixel.y-1].element == "head_035" || pixelMap[pixel.x][pixel.y-1].element == "head_049" || pixelMap[pixel.x][pixel.y-1].element == "head_1000" || pixelMap[pixel.x][pixel.y-1].element == "head_1015")) { + var head = pixelMap[pixel.x][pixel.y-1]; + if (pixel.color != head.color) { + pixel.color = head.color + } + head.element = "melted_head" + } + else { var head = null } + + if (isEmpty(pixel.x, pixel.y-1)) { + // create blood if decapitated 10% chance + if (Math.random() < 0.05 && !pixel.charge) { + createPixel("blood", pixel.x, pixel.y-1); + } + if (Math.random() < 0.15) { + pixel.dead = pixelTicks; + } + } + else if (head === null) { return } + else if (Math.random() < 0.1*(isEmpty(pixel.x, pixel.y+1) ? 1 : pixel.panic+1)) { // Move 10% chance + var movesToTry = [ + [1*pixel.dir,0], + [1*pixel.dir,-1], + ]; + let moved = false; + // While movesToTry is not empty, tryMove(pixel, x, y) with a random move, then remove it. if tryMove returns true, break. + while (movesToTry.length > 0) { + var move = movesToTry.splice(Math.floor(Math.random() * movesToTry.length), 1)[0]; + if (isEmpty(pixel.x+move[0], pixel.y+move[1]-1)) { + var origx = pixel.x+move[0]; + var origy = pixel.y+move[1]; + if (tryMove(pixel, pixel.x+move[0], pixel.y+move[1]) && pixel.x===origx && pixel.y===origy) { + movePixel(head, head.x+move[0], head.y+move[1]); + moved = true; + break; + } + } + else if (!isEmpty(pixel.x+move[0], pixel.y+move[1], true)) { + var hitPixel = pixelMap[pixel.x+move[0]][pixel.y+move[1]]; + if (elements[hitPixel.element].melteda == true) { + hitPixel.element == "fused_organism" + pixel.element == "fused_organism" + } + } + } + // 15% chance to change direction + if (Math.random() < 0.2 || !moved) { + pixel.dir *= -1; + } + } + + } +} + +elements.melted_head = { + color: ["#f3e7db","#f7ead0","#eadaba","#d7bd96","#a07e56","#825c43","#604134","#3a312a"], + name: "SCP-001-A", + category: "scp", + hidden: true, + density: 1080, + state: "solid", + conduct: .05, + temp: 37, + tempHigh: 150, + stateHigh: "cooked_meat", + tempLow: -30, + stateLow: "frozen_meat", + burn: 10, + burnTime: 250, + burnInto: "cooked_meat", + breakInto: ["blood","meat","bone"], + forceSaveColor: true, + pickElement: "human", + onCollide: function(pixel1,pixel2) { + if (elements[pixel2.element].melteda && pixel2.element != "melted_body" && Math.random() > 0.9 && pixel2.origElem != pixel1.origElem) { + pixel2.element = "fused_organism" + pixel1.element = "fused_organism" + } + }, + melteda: true, + stain: 0.0375, + stainSelf: true, + reactions: { + "cancer": { elem1:"cancer", chance:0.005 }, + "radiation": { elem1:["ash","meat","rotten_meat","cooked_meat"], chance:0.4 }, + "neutron": { elem1:["ash","meat","rotten_meat","cooked_meat"], chance:0.03 }, + "fallout": { elem1:["ash","meat","rotten_meat","cooked_meat"], chance:0.03 }, + "plague": { elem1:"plague", chance:0.05 }, + "oxygen": { elem2:"carbon_dioxide", chance:0.5 }, + "beans": { elem2:[null,null,null,null,null,null,null,null,"stench"], chance:0.2 }, + "sun": { elem1:"cooked_meat" }, + "light": { stain1:"#825043" }, + "bee": { stain1:"#cc564b", chance:0.2 }, + "water": { elem2:"bubble", attr2:{"clone":"water"}, chance:0.001 }, + "salt_water": { elem2:"bubble", attr2:{"clone":"salt_water"}, chance:0.001 }, + "pool_water": { elem2:"bubble", attr2:{"clone":"pool_water"}, chance:0.001 }, + "alcohol": { chance:0.2, attr1:{"panic":0} }, + "anesthesia": { attr1:{"panic":0} }, + "alcohol_gas": { chance:0.2, attr1:{"panic":0} } + }, + properties: { + dead: false, + }, + tick: function(pixel) { + doHeat(pixel); + doBurning(pixel); + doElectricity(pixel); + if (pixel.dead) { + // Turn into rotten_meat if pixelTicks-dead > 500 + if (pixelTicks-pixel.dead > 200 && Math.random() < 0.1) { + pixel.element = "rotten_meat" + return + } + } + + // Find the body + if (!isEmpty(pixel.x, pixel.y+1, true) && pixelMap[pixel.x][pixel.y+1].element == "melted_body") { + var body = pixelMap[pixel.x][pixel.y+1]; + if (body.dead) { // If body is dead, kill head + pixel.dead = body.dead; + } + } + else if (!isEmpty(pixel.x, pixel.y+1, true) && (pixelMap[pixel.x][pixel.y+1].element == "body" || pixelMap[pixel.x][pixel.y+1].element == "body_008" || pixelMap[pixel.x][pixel.y+1].element == "body_012_1" || pixelMap[pixel.x][pixel.y+1].element == "body_035" || pixelMap[pixel.x][pixel.y+1].element == "body_049" || pixelMap[pixel.x][pixel.y+1].element == "body_1000" || pixelMap[pixel.x][pixel.y+1].element == "body_1015")) { + var body = pixelMap[pixel.x][pixel.y+1]; + body.element = "melted_body" + } + else { var body = null } + + // check for eating food + if (body && !pixel.dead && Math.random() < 0.1) { + shuffleArray(interactCoordsShuffle); + for (var i = 0; i < interactCoordsShuffle.length; i++) { + var x = pixel.x+interactCoordsShuffle[i][0]; + var y = pixel.y+interactCoordsShuffle[i][1]; + if (!isEmpty(x,y,true) && elements[pixelMap[x][y].element].isFood && pixelMap[x][y].panic === undefined) { + deletePixel(x,y); + break; + } + if (!isEmpty(x,y,true) && elements[pixelMap[x][y].element].melteda == true && pixelMap[pixel.x][pixel.y+1] != pixelMap[x][y] && Math.random() > 0.9) { + pixelMap[x][y].element = "fused_organism" + break; + } + } + } + + if (tryMove(pixel, pixel.x, pixel.y+1)) { + // create blood if severed 10% chance + if (isEmpty(pixel.x, pixel.y+1) && !pixel.dead && Math.random() < 0.5 && !pixel.charge) { + // set dead to true 15% chance + if (Math.random() < 0.15) { + pixel.dead = pixelTicks; + } + } + } + }, +} + +elements.melted_animal = { + color: ["#997457","#a698a9","#ac8650","#997457","#a698a9","#ac8650","#997457","#a698a9","#ac8650","#4c4e42","#5e0b04","#4c4e42","#5e0b04","#56482d","#52472c","#635443"], + name: "SCP-001-A", + behavior: [ + "XX|M2%0.5|M2%2.5", + "XX|FX%2|M2%25 AND BO", + "XX|M1|M2", + ], + tick: function(pixel) { + if (pixel.r != undefined) { + delete pixel.r + } + }, + reactions: { + "oxygen": { elem2:"carbon_dioxide", chance:0.5 }, + "meat": { color2: ["#9e4839","#ba6449","#d2856c","#a14940"], elem2:"melted_animal", chance:0.1 }, + "sun": { elem2:"scp_001_sdl", elem1:"cooked_meat" }, + }, + onCollide: function(pixel1,pixel2) { + if (elements[pixel2.element].melteda || pixel1.origElem != pixel2.origElem) { + pixel1.element = "fused_organism" + pixel2.element = "fused_organism" + } + }, + melteda: true, + stain: 0.04, + stainSelf: true, + tempHigh: 275, + stateHigh: "cooked_meat", + tempLow: -20, + stateLow: "frozen_meat", + burn: 10, + burnTime: 300, + burnInto: "cooked_meat", + state: "liquid", + density: 900, + category: "scp", +} + +elements.melted_plant = { + color: ["#00bf00","#439809","#258b08","#118511","#127b12","#136d14"], + name: "SCP-001-A", + behavior: [ + "XX|ST|XX", + "SP|XX|SP", + "M2%0.1|M1|M2%0.1", + ], + reactions: { + "sun": { elem2:"scp_001_sdl", elem1:"dead_plant" }, + "light": { elem2:"scp_001_light" }, + "carbon_dioxide": { elem2:"oxygen" }, + "tree_branch": { elem2:"wood" }, + }, + onCollide: function(pixel1,pixel2) { + if (elements[pixel2.element].melteda && pixel2.element != "melted_plant" && pixel2.origElem != pixel1.origElem) { + pixel2.element = "fused_organism" + pixel1.element = "fused_organism" + } + }, + melteda: true, + stain: 0.025, + stainSelf: true, + tempHigh: 250, + stateHigh: "dead_plant", + tempLow: -20, + stateLow: "frozen_plant", + burn: 10, + burnTime: 200, + burnInto: ["dead_plant","fire","fire","fire","ash"], + state: "liquid", + density: 1200, + category: "scp", + isFood: true, +} + +elements.fused_organism = { + color: ["#E5D6C7","#f7ead0"], + name: "SCP-001-A", + behavior: behaviors.LIQUID, + viscosity: 6000, + reactions: { + "meat": { color2: ["#9e4839","#ba6449","#d2856c","#a14940"], elem2:"fused_organism", chance:0.1 }, + "blood": { color2: ["#9e4839","#ba6449","#d2856c","#a14940"], elem2:"fused_organism", chance:0.1 }, + "infection": { color2: ["#9e4839","#ba6449","#d2856c","#a14940"], elem2:"fused_organism", chance:0.1 }, + "cooked_meat": { color2: ["#9e4839","#ba6449","#d2856c","#a14940"], elem2:"fused_organism", chance:0.1 }, + "sun": { elem2:"scp_001_sdl", elem1:"cooked_meat" }, + "light": { elem2:"scp_001_light" }, + }, + tick: function(pixel) { + if (Math.random() < 0.45) { + let y = Math.random() < 0.5 ? 0 : -1; + let xDir = Math.random() < 0.5 ? 1 : -1; + for (let x = 1; x < 20; x++) { + let x2 = pixel.x+(x*xDir); + let y2 = pixel.y+y; + if (!isEmpty(x2,y2,true)) { + let seenPixel = pixelMap[x2][y2]; + if (elements[seenPixel.element].category == "life") { + if (pixel.dir != 1 && pixelMap[x2][y2].x > pixel.x) { + pixel.dir = 1 + } + else if (pixel.dir != -1 && pixelMap[x2][y2].x < pixel.x) { + pixel.dir = -1 + } + } + if (elements[seenPixel.element].id != elements.glass.id && elements[seenPixel.element].id != elements.stained_glass.id && elements[seenPixel.element].id != elements.glass_shard.id) { + break; + } + } + } + } + + if (!pixel.dir || pixel.dir == undefined) { + pixel.dir = 0; + } + + if (pixel.panic > 0 || !pixel.panic || pixel.panic == undefined) { + pixel.panic = 0; + } + if (Math.random() < 0.05) { // Move 5% chance + var movesToTry = [ + [1*pixel.dir,0], + [1*pixel.dir,-1], + ]; + let moved = false; + // While movesToTry is not empty, tryMove(pixel, x, y) with a random move, then remove it. if tryMove returns true, break. + while (movesToTry.length > 0) { + var move = movesToTry.splice(Math.floor(Math.random() * movesToTry.length), 1)[0]; + if (isEmpty(pixel.x+move[0], pixel.y+move[1]-1)) { + var origx = pixel.x+move[0]; + var origy = pixel.y+move[1]; + tryMove(pixel, pixel.x+move[0], pixel.y+move[1]) && pixel.x===origx && pixel.y===origy + } + if (!isEmpty(pixel.x+move[0], pixel.y+move[1], true)) { + var hitPixel = pixelMap[pixel.x+move[0]][pixel.y+move[1]]; + if (hitPixel.element == "fused_organism" && hitPixel.dir != pixel.dir) { + hitPixel.dir = pixel.dir; + } + if (hitPixel.element == "fused_organism" && pixel.level && (hitPixel.level < pixel.level || !hitPixel.level )) { + hitPixel.level = pixel.level; + } + } + } + // 5% chance to change direction + if (Math.random() < 0.05 || !moved) { + pixel.dir *= -1; + } + } + // homeostasis + if (pixel.temp > 47) { pixel.temp -= 1; } + else if (pixel.temp < 20) { pixel.temp += 1; } + for (var i = 0; i < adjacentCoords.length; i++) { + var coords = adjacentCoords[i]; + var x = pixel.x + coords[0]; + var y = pixel.y + coords[1]; + if (!isEmpty(x,y) && !outOfBounds(x,y) && Math.random() > 0.05) { + var shatter = pixelMap[x][y] + let old = shatter.element; + if (shatter.element == "glass" || shatter.element == "rad_glass" || shatter.element == "stained_glass") { + breakPixel(shatter) + } + } + } + }, + onCollide: function(pixel1,pixel2) { + if (elements[pixel2.element].category == "life") { + if (pixel2.element == "head") { + pixel2.origElem = pixel2.element + pixel2.element = "melted_head" + } + else if (pixel2.element == "body") { + pixel2.origElem = pixel2.element + pixel2.element = "melted_body" + } + else if (pixel2.element == "plant" || pixel2.element == "grass" || pixel2.element == "kelp" || pixel2.element == "coral" || pixel2.element == "evergreen" || pixel2.element == "pistil" || pixel2.element == "petal" || pixel2.element == "bamboo" || pixel2.element == "bamboo_plant" || pixel2.element == "cactus" || pixel2.element == "corn" || pixel2.element == "wheat" || pixel2.element == "dead_plant" || pixel2.element == "sapling" || pixel2.element == "pinecone") { + pixel2.origElem = pixel2.element + pixel2.element = "melted_plant" + } + else if (pixel2.element == "tree_branch") { + pixel2.element = "wood" + } + else { + pixel2.element = "fused_organism" + } + } + if (elements[pixel2.element].category == "food") { + if (pixel2.element != "salt" && pixel2.element != "sugar" && pixel2.element != "broth" && pixel2.element != "hard_yolk" && pixel2.element != "sauce" && pixel2.element != "popcorn" && pixel2.element != "baked_potato" && pixel2.element != "mashed_potato" && pixel2.element != "bread" && pixel2.element != "toast" && pixel2.element != "gingerbread" && pixel2.element != "crumb" && pixel2.element != "baked_batter" && pixel2.element != "candy" && pixel2.element != "coffee_ground" && pixel2.element != "nut_oil" && pixel2.element != "baking_soda" && pixel2.element != "yogurt" && pixel2.element != "frozen_yogurt" && pixel2.element != "ice_cream" && pixel2.element != "ramen" && pixel2.element != "frosting" && pixel2.element != "soy_sauce" && pixel2.element != "corn_starch" && pixel2.element != "boba" && pixel2.element != "curry_powder" && pixel2.element != "olive_oil" && pixel2.element != "tatorade" && pixel2.element != "plain_cookie" && pixel2.element != "cookie") { + pixel2.element = "fused_organism" + } + } + if (pixel2.element == "paper" || pixel2.element == "confetti") { + pixel2.origElem = pixel2.element + pixel2.element = "melted_plant" + } + if (pixel2.element == "head_008" || pixel2.element == "head_012_1" || pixel2.element == "head_035" || pixel2.element == "head_1000" || pixel2.element == "head_1015") { + pixel2.origElem = pixel2.element + pixel2.element = "melted_head" + } + else if (pixel2.element == "body_008" || pixel2.element == "body_012_1" || pixel2.element == "body_035" || pixel2.element == "body_1000" || pixel2.element == "body_1015") { + pixel2.origElem = pixel2.element + pixel2.element = "melted_body" + } + else if (pixel2.element == "scp_236" || pixel2.element == "scp_391" || pixel2.element == "scp_1424") { + pixel2.origElem = pixel2.element + pixel2.element = "melted_animal" + } + else if (pixel2.element == "skin" || pixel2.element == "meat" || pixel2.element == "cured_meat" || pixel2.element == "rotten_meat" || pixel2.element == "cooked_meat" ) { + pixel2.element = "fused_organism" + } + else if (pixel2.element == "dust" || pixel2.element == "cloth" || pixel2.element == "cloth_scrap" || pixel2.element == "hair" || pixel2.element == "loose_hair") { + deletePixel(pixel2.x,pixel2.y) + } + if (elements[pixel2.element].melteda && (pixel2.element != "melted_body" || pixel2.shirtless == true && Math.random() > 0.5) && pixel2.element != "fused_organism") { + pixel2.element = "fused_organism" + } + else if (elements[pixel2.element].isBio == true) { + pixel2.origElem = pixel2.element + if (pixel2.con) { + delete pixel2.con + } + pixel2.element = "melted_animal" + } + else if (elements[pixel2.element].isHair == true || pixel2.element == "gaseous_material" || pixel2.element == "digested_material" || pixel2.element == "urine" || pixel2.element == "excrement" || pixel2.element == "brain_jar_juice") { + deletePixel(pixel2.x,pixel2.y) + } + }, + melteda: true, + stain: 0.125, + stainSelf: true, + tempHigh: 300, + stateHigh: "cooked_meat", + tempLow: -15, + stateLow: "frozen_meat", + burn: 5, + burnTime: 400, + burnInto: "cooked_meat", + state: "liquid", + density: 2000, + category: "scp", +} + elements.scp_008 = { name: "SCP-008", color: "#11111f", @@ -741,7 +1574,7 @@ elements.frozen_008 = { elements.body_008 = { name: "SCP-008-1", color: ["#069469","#047e99","#7f5fb0"], - category: "life", + category: "scp", hidden: true, density: 1500, state: "solid", @@ -915,7 +1748,7 @@ elements.body_008 = { elements.head_008 = { color: ["#75816B","#4D6B53"], name: "SCP-008-1", - category: "life", + category: "scp", hidden: true, density: 1080, state: "solid", @@ -2174,7 +3007,7 @@ elements.scp_035 = { color: ["#f7ead0","#faf9f6","#e9e6db"], buttonColor: ["#11111f","#f7ead0","#f7ead0","#f7ead0","#f7ead0","#11111f","#faf9f6","#faf9f6","#faf9f6","#faf9f6","#11111f","#e9e6db","#e9e6db","#e9e6db","#e9e6db","#11111f"], name: "SCP-035", - hardness: 0.9, + hardness: 0.98, category: "scp", behavior: [ "CR:black_acid%0.05|CR:black_acid%0.25|CR:black_acid%0.05", @@ -2215,7 +3048,7 @@ elements.scp_035 = { elements.body_035 = { color: ["#069469","#047e99","#7f5fb0"], - name: "SCP-035-1", + name: "SCP-035", category: "life", hidden: true, density: 1500, @@ -2377,7 +3210,7 @@ elements.body_035 = { } elements.head_035 = { - name: "SCP-035-1", + name: "SCP-035", color: ["#f7ead0","#faf9f6","#e9e6db"], category: "life", hidden: true, @@ -2483,7 +3316,7 @@ elements.black_acid = { "DB%3 AND M2%10|DL%1|DB%3 AND M2%10", "DB%3 AND M2%10|DB%5.5 AND M1|DB%3 AND M2%10", ], - ignore: [/*"scp_804"*/"shy_head","shy_body","scp_055","head","body","body_008","head_008","scp_035","body_035","head_035","glass_shard","porcelain_shard","rad_shard","color_sand","sand","iron","steel","glass","rad_glass","stained_glass","acid_gas","neutral_acid","acid_cloud","water","salt_water","sugar_water","dirty_water","copper","gold","porcelain","plastic","bead","microplastic","molten_plastic","pool_water","chlorine","hydrogen","oxygen","ozone","gold_coin","silver","nickel","calcium"], + ignore: [/*"scp_804"*/"head_096","body_096","scp_055","head","body","body_008","head_008","scp_035","body_035","head_035","glass_shard","porcelain_shard","rad_shard","color_sand","sand","iron","steel","glass","rad_glass","stained_glass","acid_gas","neutral_acid","acid_cloud","water","salt_water","sugar_water","dirty_water","copper","gold","porcelain","plastic","bead","microplastic","molten_plastic","pool_water","chlorine","hydrogen","oxygen","ozone","gold_coin","silver","nickel","calcium"], reactions: { "caustic_potash": { elem1:null, elem2:"potassium_salt" }, "water": { elem1:null, elem2:"dirty_water" }, @@ -3169,7 +4002,7 @@ elements.scp_063 = { "DL|XX|DL", "M2%80 AND DL|M1 AND DL|M2%80 AND DL", ], - ignore: ["scp_063","head_049","body_049","shy_head","shy_body","head_049_1","body_049_1","head_008_1","body_008_1","head_012_1","body_012_1","scp_999","scp_682","head","body","plant","grass","algae","cell","cancer","worm","flea","termite","ant","spider","fly","firefly","bee","stink_bug","human","bird","rat","frog","tadpole","fish","slug","snail","sapling","evergreen","cactus","kelp","coral","pistil","tree_branch","vine","bamboo_plant","mushroom_stalk","mushroom_gill","mushroom_cap","lichen","homunculus","root","hyphae","skin","porcelain"], + ignore: ["scp_063","head_049","body_049","head_096","body_096","head_049_1","body_049_1","head_008","body_008","head_012_1","body_012_1","scp_999","scp_682","head","body","plant","grass","algae","cell","cancer","worm","flea","termite","ant","spider","fly","firefly","bee","stink_bug","human","bird","rat","frog","tadpole","fish","slug","snail","sapling","evergreen","cactus","kelp","coral","pistil","tree_branch","vine","bamboo_plant","mushroom_stalk","mushroom_gill","mushroom_cap","lichen","homunculus","root","hyphae","skin","porcelain"], category: "scp", tempHigh: 190, stateHigh: ["molten_plastic","molten_plastic","fire","dioxin"], @@ -3194,24 +4027,24 @@ elements.scp_096 = { }, onPlace: function(pixel) { if (isEmpty(pixel.x, pixel.y+1)) { - createPixel("shy_body", pixel.x, pixel.y+1); - pixel.element = "shy_head"; + createPixel("body_096", pixel.x, pixel.y+1); + pixel.element = "head_096"; } else if (isEmpty(pixel.x, pixel.y-1)) { - createPixel("shy_head", pixel.x, pixel.y-1); + createPixel("head_096", pixel.x, pixel.y-1); pixelMap[pixel.x][pixel.y-1].color = pixel.color; - pixel.element = "shy_body"; + pixel.element = "body_096"; pixel.color = pixelColorPick(pixel) } else { deletePixel(pixel.x, pixel.y); } }, - related: ["shy_body","shy_head"], + related: ["body_096","head_096"], cooldown: defaultCooldown } -elements.shy_head = { +elements.head_096 = { hidden: true, name: "SCP-096", color: ["#ddd2d6","#C9BCC2","#b6adb2"], @@ -3234,7 +4067,7 @@ elements.shy_head = { } // Find the body - if (!isEmpty(pixel.x, pixel.y+1, true) && pixelMap[pixel.x][pixel.y+1].element == "shy_body") { + if (!isEmpty(pixel.x, pixel.y+1, true) && pixelMap[pixel.x][pixel.y+1].element == "body_096") { var body = pixelMap[pixel.x][pixel.y+1]; if (body.dead) { // If body is dead, kill head pixel.dead = body.dead; @@ -3294,7 +4127,7 @@ elements.shy_head = { }, }, -elements.shy_body = { +elements.body_096 = { name: "SCP-096", hidden: true, color: ["#ddd2d6","#C9BCC2","#b6adb2"], @@ -3311,7 +4144,7 @@ elements.shy_body = { if (tryMove(pixel, pixel.x, pixel.y+1)) { // Fall if (!isEmpty(pixel.x, pixel.y-2, true)) { // Drag head down var headpixel = pixelMap[pixel.x][pixel.y-2]; - if (headpixel.element == "shy_head") { + if (headpixel.element == "head_096") { if (isEmpty(pixel.x, pixel.y-1)) { movePixel(pixelMap[pixel.x][pixel.y-2], pixel.x, pixel.y-1); } @@ -3326,7 +4159,7 @@ elements.shy_body = { doElectricity(pixel); // Find the head - if (!isEmpty(pixel.x, pixel.y-1, true) && pixelMap[pixel.x][pixel.y-1].element == "shy_head") { + if (!isEmpty(pixel.x, pixel.y-1, true) && pixelMap[pixel.x][pixel.y-1].element == "head_096") { var head = pixelMap[pixel.x][pixel.y-1]; } else { var head = null } @@ -3417,7 +4250,7 @@ elements.shy_body = { if (seenPixel.y < pixel.y) { if (!isEmpty(pixel.x, pixel.y-1, true)) { var headpixel = pixelMap[pixel.x][pixel.y-1]; - if (headpixel.element == "shy_head") { + if (headpixel.element == "head_096") { if (isEmpty(pixel.x, pixel.y-3)) { tryMove(headpixel, pixel.x, pixel.y-3); if (isEmpty(pixel.x, pixel.y-2)) { @@ -3455,7 +4288,7 @@ elements.shy_body = { if (seenPixel.y > pixel.y) { if (!isEmpty(pixel.x, pixel.y-1, true)) { var headpixel = pixelMap[pixel.x][pixel.y-1]; - if (headpixel.element == "shy_head") { + if (headpixel.element == "head_096") { if (isEmpty(pixel.x, pixel.y+1)) { tryMove(headpixel, pixel.x, pixel.y+1); if (isEmpty(pixel.x, pixel.y+2)) { @@ -3482,16 +4315,16 @@ elements.shy_body = { } } } - if (isEmpty(pixel.x, pixel.y-1) || !isEmpty(pixel.x,pixel.y-1) && pixelMap[pixel.x][pixel.y-1].element != "shy_head") { + if (isEmpty(pixel.x, pixel.y-1) || !isEmpty(pixel.x,pixel.y-1) && pixelMap[pixel.x][pixel.y-1].element != "head_096") { // create blood if decapitated 5% chance if (Math.random() < 0.05 && !pixel.charge) { createPixel("blood", pixel.x, pixel.y-1); } if (Math.random() < 0.9 && isEmpty(pixel.x,pixel.y-1)) { - createPixel("shy_head",pixel.x,pixel.y-1) + createPixel("head_096",pixel.x,pixel.y-1) } else if (Math.random() < 0.025 && !isEmpty(pixel.x,pixel.y-1,true) && !outOfBounds(pixel.x,pixel.y-1) ) { - changePixel(pixelMap[pixel.x][pixel.y-1],"shy_head") + changePixel(pixelMap[pixel.x][pixel.y-1],"head_096") } } else if (head == null) { return } @@ -3577,7 +4410,7 @@ elements.shy_body = { } // if (Math.random() > ((1-(elements[pixel.element].hardness || 1)) * (shiftDown ? 0.5 : 1))) { } - else if (old === pixel2.element && elements[pixel2.element].movable && !isEmpty(pixel2.x,pixel2.y+1) && !paused && pixel2.element != "shy_head" && pixel2.element != "shy_body") { + else if (old === pixel2.element && elements[pixel2.element].movable && !isEmpty(pixel2.x,pixel2.y+1) && !paused && pixel2.element != "head_096" && pixel2.element != "body_096") { let x = 0; let y = 0; if (Math.random() < 0.66) x = Math.random() < 0.5 ? 1 : -1; if (Math.random() < 0.66) y = Math.random() < 0.5 ? 1 : -1; @@ -3587,16 +4420,16 @@ elements.shy_body = { } } else { - if (isEmpty(pixel.x, pixel.y-1) || !isEmpty(pixel.x,pixel.y-1) && pixelMap[pixel.x][pixel.y-1].element != "shy_head") { + if (isEmpty(pixel.x, pixel.y-1) || !isEmpty(pixel.x,pixel.y-1) && pixelMap[pixel.x][pixel.y-1].element != "head_096") { // create blood if decapitated 5% chance if (Math.random() < 0.05 && !pixel.charge) { createPixel("blood", pixel.x, pixel.y-1); } if (Math.random() < 0.2 && isEmpty(pixel.x,pixel.y-1)) { - createPixel("shy_head",pixel.x,pixel.y-1) + createPixel("head_096",pixel.x,pixel.y-1) } else if (!isEmpty(pixel.x,pixel.y-1,true) && !outOfBounds(pixel.x,pixel.y-1) && (Math.random() < 0.1 || elements[pixelMap[pixel.x][pixel.y].element].state != "solid")) { - changePixel(pixelMap[pixel.x][pixel.y-1],"shy_head") + changePixel(pixelMap[pixel.x][pixel.y-1],"head_096") } } else if (head == null) { return } @@ -3719,7 +4552,6 @@ elements.body_173 = { hidden: true, density: 2400, state: "solid", - conduct: .025, tempHigh: 15050, hardness: 1, stateHigh: ["magma","magma","magma","magma","rust","rust","rust","magma","magma","magma","magma","rust","rust","rust","spray_paint"], @@ -3999,7 +4831,6 @@ elements.head_173 = { hidden: true, density: 2400, state: "solid", - conduct: .025, tempHigh: 15050, hardness: 1, stateHigh: ["magma","magma","magma","magma","rust","rust","rust","magma","magma","magma","magma","rust","rust","rust","spray_paint"], @@ -4420,6 +5251,258 @@ elements.scp_236 = { conduct: 0.2, } +elements.scp_261 = { + name: "SCP-261", + color: ["#2E312E","#252623","#120F10"], + properties: { + db: 0, + strange: 0, + }, + tick: function(pixel) { + if (typeof pixel.db == "undefined"){pixel.db = 0} + for (var i = 0; i < adjacentCoords.length; i++) { + var coord = adjacentCoords[i]; + var x = pixel.x+coord[0]; + var y = pixel.y+coord[1]; + if (!isEmpty(x, y, true)){ + let newPixel = pixelMap[x][y] + if (newPixel.charge || newPixel.chargeCD){ + pixel.db = 10 + } + } + } + for (var i = 0; i < squareCoords.length; i++) { + var coord = squareCoords[i]; + var x = pixel.x+coord[0]; + var y = pixel.y+coord[1]; + if (!isEmpty(x, y, true)){ + let newPixel = pixelMap[x][y] + if ((newPixel.element == "gold_coin" || newPixel.element == "penny" || newPixel.element == "bronze_coin" || newPixel.element == "money") && Math.random() > 0.15) { + pixel.strange++ + deletePixel(newPixel.x,newPixel.y) + if (pixel.strange > 25 && (Math.random() > (pixel.db*0.1))) { + let count = 1 + for (var i = 0; i < squareCoords.length; i++) { + var coord = squareCoords[i]; + var x = pixel.x+coord[0]; + var y = pixel.y+coord[1]; + if (isEmpty(x,y)) { + if (Math.random() < 0.3) { + createPixel("packet",x,y); + pixelMap[x][y].has = vendingWeirdF[Math.floor(Math.random() * vendingWeirdF.length)] + } + else if (Math.random() < 0.65) { + createPixel("can",x,y); + pixelMap[x][y].has = vendingWeirdD[Math.floor(Math.random() * vendingWeirdD.length)] + } + else if (Math.random() < 0.78) { + createPixel(vendingNormF[Math.floor(Math.random() * vendingNormF.length)],x,y); + } + else { + createPixel(vendingNormD[Math.floor(Math.random() * vendingNormD.length)],x,y); + } + count--; + if (count <= 0) { + return pixelMap[x][y]; + } + } + else if (!isEmpty(x,y,true) && (elements[pixelMap[x][y].element].state === "liquid" || elements[pixelMap[x][y].element].state === "gas")) { + if (Math.random() < 0.3) { + changePixel(pixelMap[x][y],"packet"); + pixelMap[x][y].has = vendingWeirdF[Math.floor(Math.random() * vendingWeirdF.length)] + } + else if (Math.random() < 0.65) { + changePixel(pixelMap[x][y],"can"); + pixelMap[x][y].has = vendingWeirdD[Math.floor(Math.random() * vendingWeirdD.length)] + } + else if (Math.random() < 0.78) { + changePixel(pixelMap[x][y],vendingNormF[Math.floor(Math.random() * vendingNormF.length)]); + } + else { + changePixel(pixelMap[x][y],vendingNormD[Math.floor(Math.random() * vendingNormD.length)]); + } + count--; + if (count <= 0) { + return pixelMap[x][y]; + } + } + } + } + else { + let count = 1 + for (var i = 0; i < squareCoords.length; i++) { + var coord = squareCoords[i]; + var x = pixel.x+coord[0]; + var y = pixel.y+coord[1]; + if (isEmpty(x,y)) { + if (Math.random() < 0.5) { + createPixel("packet",x,y); + if (Math.random() < 0.06666) { + pixelMap[x][y].has = "crumb" + } + else if (Math.random() < 0.23333) { + pixelMap[x][y].has = "toast" + } + else if (Math.random() < 0.4) { + pixelMap[x][y].has = "bread" + } + else if (Math.random() < 0.56666) { + pixelMap[x][y].has = "cooked_meat" + } + else if (Math.random() < 0.73333) { + pixelMap[x][y].has = "chocolate" + } + else { + pixelMap[x][y].has = vendingNormF[Math.floor(Math.random() * vendingNormF.length)] + } + } + else if (Math.random() < 0.9) { + createPixel("can",x,y); + if (Math.random() < 0.23333) { + pixelMap[x][y].has = "soda" + } + else if (Math.random() < 0.4) { + pixelMap[x][y].has = "seltzer" + } + else if (Math.random() < 0.56666) { + pixelMap[x][y].has = "juice" + } + else if (Math.random() < 0.73333) { + pixelMap[x][y].has = "poison" + } + else { + pixelMap[x][y].has = vendingNormD[Math.floor(Math.random() * vendingNormD.length)] + } + } + else { + createPixel(vendingNormF[Math.floor(Math.random() * vendingNormF.length)],x,y); + } + count--; + if (count <= 0) { + return pixelMap[x][y]; + } + } + else if (!isEmpty(x,y,true) && (elements[pixelMap[x][y].element].state === "liquid" || elements[pixelMap[x][y].element].state === "gas")) { + if (Math.random() < 0.5) { + changePixel(pixelMap[x][y],"packet"); + if (Math.random() < 0.06666) { + pixelMap[x][y].has = "crumb" + } + else if (Math.random() < 0.23333) { + pixelMap[x][y].has = "toast" + } + else if (Math.random() < 0.4) { + pixelMap[x][y].has = "bread" + } + else if (Math.random() < 0.56666) { + pixelMap[x][y].has = "cooked_meat" + } + else if (Math.random() < 0.73333) { + pixelMap[x][y].has = "chocolate" + } + else { + pixelMap[x][y].has = vendingNormF[Math.floor(Math.random() * vendingNormF.length)] + } + } + else if (Math.random() < 0.9) { + changePixel(pixelMap[x][y],"can"); + if (Math.random() < 0.23333) { + pixelMap[x][y].has = "soda" + } + else if (Math.random() < 0.4) { + pixelMap[x][y].has = "seltzer" + } + else if (Math.random() < 0.56666) { + pixelMap[x][y].has = "juice" + } + else if (Math.random() < 0.73333) { + pixelMap[x][y].has = "poison" + } + else { + pixelMap[x][y].has = vendingNormD[Math.floor(Math.random() * vendingNormD.length)] + } + } + else { + changePixel(pixelMap[x][y],vendingNormF[Math.floor(Math.random() * vendingNormF.length)]); + } + count--; + if (count <= 0) { + return pixelMap[x][y]; + } + } + } + } + } + } + } + if (pixel.db > 0) { + pixel.db-- + } + if (Math.random() > 0.95 && pixel.strange > 0) { + pixel.strange-- + } + tryMove(pixel, pixel.x, pixel.y+1); + doDefaults(pixel); + }, + grain: 0.5, + behavior: behaviors.WALL, + tempHigh: 1200, + stateHigh: ["molten_galvanized_steel","molten_galvanized_steel","molten_galvanized_steel","molten_galvanized_steel","armageddon"], + stateHighColorMultiplier: 0.86, + hardness: 0.99, + breakInto: ["galvanized_steel","galvanized_steel","galvanized_steel","galvanized_steel","armageddon"], + breakIntoColorMultiplier: [1.1,1,0.86], + category: "scp", + state: "solid", + density: 7850, +} + +elements.packet = { + behavior: behaviors.POWDER, + category: "powders", + hidden: true, + state: "solid", + color: ["#dc2c37","#edce66","#0dbf62","#0679ea","#7144b2","#d92097","#dc2c37","#edce66","#0dbf62","#0679ea","#7144b2","#d92097","#c5dede","#c5dede","#c5dede","#c5dede","#c5dede","#c5dede","#c5dede","#c5dede","#c5dede","#dbbfe3", "#cc95db","#c477d9","#b85cd1", "#8d5cd1","#9e77d9","#cc95db", "#95a4db","#7789d9","#5c68d1", "#c1bfe3"], + tempHigh: 250, + stateHigh: ["metal_scrap","metal_scrap","confetti","glitter","confetti","glitter","confetti","glitter","confetti","glitter","confetti","glitter","sawdust","dust","glass_shard","confetti","glitter","confetti","glitter","confetti","glitter","confetti","glitter","confetti","glitter","sawdust","dust","glass_shard"], + burn: 10, + burnTime: 200, + burnInto: ["metal_scrap","metal_scrap","confetti","glitter","confetti","glitter","confetti","glitter","confetti","glitter","confetti","glitter","sawdust","dust","glass_shard","confetti","glitter","confetti","glitter","confetti","glitter","confetti","glitter","confetti","glitter","sawdust","dust","glass_shard"], + breakInto: ["metal_scrap","metal_scrap","confetti","glitter","confetti","glitter","confetti","glitter","confetti","glitter","confetti","glitter","sawdust","dust","glass_shard","confetti","glitter","confetti","glitter","confetti","glitter","confetti","glitter","confetti","glitter","sawdust","dust","glass_shard"], + properties: { + has: "dust", + }, + onChange: function(pixel) { + releaseElement(pixel,pixel.has,4,true) + }, + onDelete: function(pixel) { + releaseElement(pixel,pixel.has,4,true) + }, + breakIntoColorMultiplier: [1.1,1,0.86], +} + +elements.can = { + behavior: behaviors.POWDER, + category: "powders", + hidden: true, + state: "solid", + color: ["#ff5e5e","#ffcc5e","#76ff5e","#5ed4ff","#5e61ff","#cf5eff","#d1c6be","#b5c0ad","#b9b8bc","#d1c6be","#b5c0ad","#b9b8bc","#ff5e5e","#ffcc5e","#76ff5e","#5ed4ff","#5e61ff","#cf5eff","#5e807d","#5e807d","#679e99","#5e807d","#5e807d"], + tempHigh: 250, + stateHigh: ["metal_scrap","metal_scrap","metal_scrap","metal_scrap","metal_scrap","rust","metal_scrap","rust","oxidized_copper","bead","glass_shard","glitter","glass_shard"], + breakInto: ["metal_scrap","metal_scrap","metal_scrap","metal_scrap","metal_scrap","rust","metal_scrap","rust","oxidized_copper","bead","glass_shard","glitter","glass_shard"], + hardness: 0.266, + properties: { + has: "foam", + }, + onChange: function(pixel) { + releaseElement(pixel,pixel.has,4,true) + }, + onDelete: function(pixel) { + releaseElement(pixel,pixel.has,4,true) + }, + breakIntoColorMultiplier: [1.1,1,0.86], +} + elements.scp_391 = { name: "SCP-391", color: ["#D7D0CA","#D7BFB5","#B49171","#986536","#B49171","#623613"], @@ -6708,7 +7791,7 @@ elements.scp_1600 = { pixel.color = "rgb("+avg.join(",")+")"; } }, - ignore: ["scp_1600_1","gallium","brass","zinc","sulfur","body_173","head_173","shy_body","shy_head","body_049","head_049","scp_035","scp_1015","scp_999","scp_063","scp_055"], + ignore: ["scp_261","scp_1600_1","gallium","brass","zinc","sulfur","body_173","head_173","body_096","head_096","body_049","head_049","scp_035","scp_1015","scp_999","scp_063","scp_055"], canPlace: true, reactions: { "scp_682":{ stain2:"#CA8E2F", chance:0.05,}, From 7ff1be2ae68a7b570572e8d60ddacbc0cad4dd76 Mon Sep 17 00:00:00 2001 From: Nekonico <163950752+DBNekonico@users.noreply.github.com> Date: Wed, 15 Oct 2025 18:44:41 -0700 Subject: [PATCH 066/105] Delete mods/daybreak.js --- mods/daybreak.js | 426 ----------------------------------------------- 1 file changed, 426 deletions(-) delete mode 100644 mods/daybreak.js diff --git a/mods/daybreak.js b/mods/daybreak.js deleted file mode 100644 index fb85815c..00000000 --- a/mods/daybreak.js +++ /dev/null @@ -1,426 +0,0 @@ -elements.beautiful_sun = { - color: "#c12600", - tick: function(pixel) { - // minimum 1726 - // maximum 7726 - if (pixel.eclipse) { pixel.color = pixelColorPick(pixel,"#f68656"); var c=0.01} - else if (pixel.temp < 1500) { pixel.color = pixelColorPick(pixel,"#7a4e43"); } - else if (pixel.temp < 3600) { pixel.color = pixelColorPick(pixel,"#ffbdbd"); var c=0.05 } - else if (pixel.temp < 7000) { pixel.color = pixelColorPick(pixel,"#c12600"); var c=0.1 } - else if (pixel.temp < 11000) { pixel.color = pixelColorPick(pixel,"#ffb09c"); var c=0.25 } - else if (pixel.temp < 28000) { pixel.color = pixelColorPick(pixel,"#f7fff5"); var c=0.5 } - else { pixel.color = pixelColorPick(pixel,"#c3bdff"); var c=0.4 } - if (pixel.temp < 1500) { var c=0 } - for (var i = 0; i < adjacentCoords.length; i++) { - var x = pixel.x+adjacentCoords[i][0]; - var y = pixel.y+adjacentCoords[i][1]; - if (isEmpty(x,y)) { - if (Math.random() > c) {continue} - createPixel("beautiful_light", x, y); - pixelMap[x][y].color = pixel.color; - } - else if (!outOfBounds(x,y)) { - var newPixel = pixelMap[x][y]; - if (elements[newPixel.element].id === elements.beautiful_sun.id) { - if (pixel.eclipse) { newPixel.eclipse = true } - if (pixel.temp!==newPixel.temp) { - var avg = (pixel.temp + newPixel.temp)/2; - pixel.temp = avg; - newPixel.temp = avg; - pixelTempCheck(pixel); - pixelTempCheck(newPixel); - } - } - else if (elements[newPixel.element].id === elements.sun.id) { - changePixel(newPixel, "beautiful_sun"); - } - } - } - }, - tool: function(pixel) { - if (pixel.element === "light") { - deletePixel(pixel.x,pixel.y); - } - if (pixel.element === "beautiful_light") { - deletePixel(pixel.x,pixel.y); - } - }, - canPlace: true, - reactions: { - "hydrogen": { elem2:"helium", temp1:5 }, - "helium": { elem2:"carbon_dioxide", temp1:5, tempMax:3600 }, - "carbon_dioxide": { elem2:"neon", temp1:5, tempMax:1800 }, - "sun": { elem2:"beautiful_sun", }, - "light": { elem2:"beautiful_light" }, - }, - temp: 5504, - tempLow: -100, - stateLow: "supernova", - category: "brokenday", - state: "gas", - //density: 1408, - insulate: true, - noMix: true, - alias: "hateful_star", - movable: false -}, - -elements.beautiful_light = { - hidden: true, - name: "light", - color: "#c12600", - tick: function(pixel) { - if (Math.random() < 0.01) { - deletePixel(pixel.x,pixel.y); - return; - } - if (pixel.bx===undefined) { - // choose 1, 0, or -1 - pixel.bx = Math.random() < 0.5 ? 1 : Math.random() < 0.5 ? 0 : -1; - pixel.by = Math.random() < 0.5 ? 1 : Math.random() < 0.5 ? 0 : -1; - // if both are 0, make one of them 1 or -1 - if (pixel.bx===0 && pixel.by===0) { - if (Math.random() < 0.5) { pixel.bx = Math.random() < 0.5 ? 1 : -1; } - else { pixel.by = Math.random() < 0.5 ? 1 : -1; } - } - } - // move and invert direction if hit - if (pixel.bx && !tryMove(pixel, pixel.x+pixel.bx, pixel.y)) { - var newX = pixel.x + pixel.bx; - if (!isEmpty(newX, pixel.y, true)) { - var newPixel = pixelMap[pixel.x+pixel.bx][pixel.y]; - if (!elements[newPixel.element].insulate) { - newPixel.temp += 1; - pixelTempCheck(newPixel); - } - if (!elements.light.reactions[newPixel.element]) { - pixel.color = newPixel.color; - } - else if (!elements.beautiful_light.reactions[newPixel.element]) { - pixel.color = newPixel.color; - } - } - pixel.bx = -pixel.bx; - } - if (pixel.by && !tryMove(pixel, pixel.x, pixel.y+pixel.by)) { - var newY = pixel.y + pixel.by; - if (!isEmpty(pixel.x, newY, true)) { - var newPixel = pixelMap[pixel.x][pixel.y+pixel.by]; - if (!elements[newPixel.element].insulate) { - newPixel.temp += 0.05; - pixelTempCheck(newPixel); - } - if (!elements.light.reactions[newPixel.element]) { - pixel.color = newPixel.color; - } - else if (!elements.beautiful_light.reactions[newPixel.element]) { - pixel.color = newPixel.color; - } - } - pixel.by = -pixel.by; - } - }, - reactions: { - "glass": { "color1":["#ff0000","#ff8800","#ffff00","#00ff00","#00ffff","#0000ff","#ff00ff"] }, - "glass_shard": { "color1":["#ff0000","#ff8800","#ffff00","#00ff00","#00ffff","#0000ff","#ff00ff"] }, - "rad_glass": { "color1":["#9f6060","#9f8260","#9f9f60","#609f60","#609f9f","#60609f","#9f609f"] }, - "rad_shard": { "color1":["#9f6060","#9f8260","#9f9f60","#609f60","#609f9f","#60609f","#9f609f"] }, - "steam": { "color1":["#ff0000","#ff8800","#ffff00","#00ff00","#00ffff","#0000ff","#ff00ff"] }, - "rain_cloud": { "color1":["#ff0000","#ff8800","#ffff00","#00ff00","#00ffff","#0000ff","#ff00ff"] }, - "cloud": { "color1":["#ff0000","#ff8800","#ffff00","#00ff00","#00ffff","#0000ff","#ff00ff"] }, - "smog": { "color1":["#9f6060","#9f8260","#9f9f60","#609f60","#609f9f","#60609f","#9f609f"] }, - "ice": { "color1":"#c2fff9" }, - "rime": { "color1":"#c2fff9" }, - "water": { "color1":"#a1bac9" }, - "salt_water": { "color1":"#a1bac9" }, - "sugar_water": { "color1":"#a1bac9" }, - "dirty_water": { "color1":"#a1c9a8" }, - "seltzer": { "color1":"#c2fff9" }, - "diamond": { "color1":["#c2c5ff","#c2d9ff"] }, - "rainbow": { "color1":["#ff0000","#ff8800","#ffff00","#00ff00","#00ffff","#0000ff","#ff00ff"] }, - "static": { "color1":["#ffffff","#bdbdbd","#808080","#424242","#1c1c1c"] }, - "sun": { elem2:"beautiful_sun", }, - "light": { elem2:"beautiful_light" }, - "meat": { elem2:"fused_organism" }, - "head": { elem2:"melted_human" }, - "body": { elem2:"melted_human" }, - "dead_bug": { elem2:"melted_insect" }, - "worm": { elem2:"melted_insect" }, - "ant": { color2:"#5E0B04", elem2:"melted_insect" }, - "bee": { elem2:"melted_insect" }, - "fly": { elem2:"melted_insect" }, - "firefly": { elem2:"melted_insect" }, - "stinkbug": { elem2:"melted_insect" }, - "slug": { color2:["#997e12","#997e12","#997e12","#997e12","#997e12","#997e12","#403314","#403314","#403314","#403314","#403314","#403314","#124a44"], elem2:"melted_insect" }, - "snail": { color2:"#5c3104", elem2:"melted_insect", chance:0.5 }, - "tree_branch": { elem2:"wood" }, - "plant": { elem2:"melted_plant" }, - "grass": { elem2:"melted_plant" }, - "evergreen": { color2:"#006300", elem2:"melted_plant" }, - "pistil": { elem2:"melted_plant" }, - "petal": { color2:["#ff0000","#ff8800","#ffff00","#88ff00","#00ff00","#00ff88","#00ffff","#0088ff","#0000ff","#8800ff","#ff00ff"], elem2:"melted_plant" }, - "bamboo": { elem2:"melted_plant" }, - "bamboo_plant": { elem2:"melted_plant" }, - "cactus": { elem2:"melted_plant" }, - "corn": { color2:["#f8d223","#d6ba2a","#f7f5ba","#dbd281","#cdb12d"], elem2:"melted_plant" }, - "wheat": { color2:["#f1b569","#edb864","#de9c45","#c2853d"], elem2:"melted_plant" }, - "dead_plant": { elem2:"melted_plant" }, - "sapling": { elem2:"melted_plant" }, - "pinecone": { color2:["#5c3e33","#472f27","#31211b"], elem2:"melted_plant" }, - "bird": { color2:"#997457", elem2:"melted_animal" }, - "rat": { color2:["#a698a9","#8c7d82","#ccc3cf"], elem2:"melted_animal" }, - "fish": { elem2:"melted_fish", chance:0.2 }, - "tadpole": { color2:"#87b574", elem2:"melted_fish", chance:0.2 }, - "frog": { color2:"#607300", elem2:"melted_fish", chance:0.2 }, - }, - temp: 35, - tempLow: -273, - stateLow: ["liquid_light",null], - stateLowColorMultiplier: 0.8, - category: "brokenday", - state: "gas", - density: 0.00001, - ignoreAir: true, - insulate: true -}, - -elements.melted_human = { - color: ["#f3e7db","#eadaba","#d7bd96","#a07e56"], - behavior: behaviors.LIQUID, - viscosity: 7500, - reactions: { - "oxygen": { elem2:"carbon_dioxide", chance:0.5 }, - "meat": { elem2:null, chance:0.1 }, - "cooked_meat": { elem2:null, chance:0.1 }, - "sun": { elem2:"beautiful_sun", elem1:"cooked_meat" }, - "light": { elem2:"beautiful_light" }, - "dead_bug": { color2:"#CEC5B9", elem2:"fused_organism", chance:0.1 }, - "ant": { color2:"#D2B6AB", elem2:"fused_organism", chance:0.2 }, - "bee": { color2:"#E9DBAA", elem2:"fused_organism", chance:0.2 }, - "fly": { color2:"#CEC5B9", elem2:"fused_organism", chance:0.2 }, - "firefly": { color2:"#CEC5B9", elem2:"fused_organism", chance:0.2 }, - "stinkbug": { color2:"#CEC5B9", elem2:"fused_organism", chance:0.2 }, - "slug": { color2:["#DFD0AE","#E5D6C7"], elem2:"fused_organism", chance:0.2 }, - "snail": { color2:"#E5D6C7", elem2:"fused_organism", chance:0.15 }, - "head": { elem2:"melted_human", chance:0.1 }, - "body": { elem2:"melted_human", chance:0.1 }, - "bird": { color2:"#DAC8B7", elem2:"fused_organism", chance:0.1 }, - "rat": { color2:["#E2D5D0","#EADFD8"], elem2:"fused_organism", chance:0.1 }, - "fish": { color2:"#E3D1BC", elem2:"fused_organism", chance:0.2 }, - "tadpole": { color2:"#DBDCC4", elem2:"fused_organism", chance:0.2 }, - "frog": { color2:"#D2CDAA", elem2:"fused_organism", chance:0.2 }, - "melted_fish": { color2:"#E3D1BC",elem2:"fused_organism", chance:0.1 }, - "melted_animal": { color2:["#E2D5D0","#EADFD8","#DAC8B7"], elem2:"fused_organism", chance:0.1 }, - "melted_insect": { color2:"#CEC5B9", elem2:"fused_organism", chance:0.1 }, - }, - tempHigh: 300, - stateHigh: "cooked_meat", - tempLow: -20, - stateLow: "frozen_meat", - burn: 10, - burnTime: 300, - burnInto: "cooked_meat", - state: "liquid", - density: 1900, - category: "brokenday", -}, - -elements.melted_animal = { - color: ["#997457","#a698a9"], - behavior: behaviors.LIQUID, - viscosity: 7500, - reactions: { - "oxygen": { elem2:"carbon_dioxide", chance:0.5 }, - "meat": { elem2:"fused_organism", chance:0.1 }, - "sun": { elem2:"beautiful_sun", elem1:"cooked_meat" }, - "light": { elem2:"beautiful_light" }, - "dead_bug": { color2:"#CEC5B9", elem2:"fused_organism", chance:0.1 }, - "ant": { color2:"#D2B6AB", elem2:"fused_organism", chance:0.2 }, - "bee": { color2:"#E9DBAA", elem2:"fused_organism", chance:0.2 }, - "fly": { color2:"#CEC5B9", elem2:"fused_organism", chance:0.2 }, - "firefly": { color2:"#CEC5B9", elem2:"fused_organism", chance:0.2 }, - "stinkbug": { color2:"#CEC5B9", elem2:"fused_organism", chance:0.2 }, - "slug": { color2:["#DFD0AE","#E5D6C7"], elem2:"fused_organism", chance:0.2 }, - "snail": { color2:"#E5D6C7", elem2:"fused_organism", chance:0.15 }, - "head": { color2:["#F1E4D4","#EDDECC"], elem2:"fused_organism", chance:0.1 }, - "body": { color2:["#F1E4D4","#EDDECC"], elem2:"fused_organism", chance:0.1 }, - "bird": { color2:"#997457", elem2:"melted_animal", chance:0.2 }, - "rat": { color2:["#a698a9","#8c7d82","#ccc3cf"], elem2:"melted_animal", chance:0.2 }, - "fish": { color2:"#E3D1BC", elem2:"fused_organism", chance:0.2 }, - "tadpole": { color2:"#DBDCC4", elem2:"fused_organism", chance:0.2 }, - "frog": { color2:"#D2CDAA", elem2:"fused_organism", chance:0.2 }, - "melted_fish": { color2:"#E3D1BC",elem2:"fused_organism", chance:0.1 }, - "melted_human": { color2:["#F1E4D4","#EDDECC"], elem2:"fused_organism", chance:0.1 }, - "melted_insect": { color2:"#CEC5B9", elem2:"fused_organism", chance:0.1 }, - }, - tempHigh: 275, - stateHigh: "cooked_meat", - tempLow: -20, - stateLow: "frozen_meat", - burn: 10, - burnTime: 300, - burnInto: "cooked_meat", - state: "liquid", - density: 900, - category: "brokenday", -}, - -elements.melted_fish = { - color: "#ac8650", - behavior: [ - "XX|XX|SW:water,salt_water,sugar_water,dirty_water,seltzer,pool_water,primordial_soup%5", - "M2%0.5|FX%0.5|M2%0.5 AND BO", - "M2%10|M1|M2%10 AND SW:water,salt_water,sugar_water,dirty_water,seltzer,pool_water,primordial_soup%14", - ], - reactions: { - "oxygen": { elem2:"carbon_dioxide", chance:0.5 }, - "sun": { elem2:"beautiful_sun", elem1:"cooked_meat" }, - "light": { elem2:"beautiful_light" }, - "dead_bug": { color2:"#CEC5B9", elem2:"fused_organism", chance:0.1 }, - "ant": { color2:"#D2B6AB", elem2:"fused_organism", chance:0.2 }, - "bee": { color2:"#E9DBAA", elem2:"fused_organism", chance:0.2 }, - "fly": { color2:"#CEC5B9", elem2:"fused_organism", chance:0.2 }, - "firefly": { color2:"#CEC5B9", elem2:"fused_organism", chance:0.2 }, - "stinkbug": { color2:"#CEC5B9", elem2:"fused_organism", chance:0.2 }, - "head": { color2:["#F1E4D4","#EDDECC"], elem2:"fused_organism", chance:0.1 }, - "body": { color2:["#F1E4D4","#EDDECC"], elem2:"fused_organism", chance:0.1 }, - "bird": { color2:"#DAC8B7", elem2:"fused_organism", chance:0.2 }, - "rat": { color2:["#E2D5D0","#EADFD8"], elem2:"fused_organism", chance:0.2 }, - "slug": { color2:["#DFD0AE","#E5D6C7"], elem2:"fused_organism", chance:0.2 }, - "snail": { color2:"#E5D6C7", elem2:"fused_organism", chance:0.15 }, - "fish": { elem2:"melted_fish", chance:0.2 }, - "tadpole": { color2:"#87b574", elem2:"melted_fish", chance:0.2 }, - "frog": { color2:"#607300", elem2:"melted_fish", chance:0.2 }, - "melted_animal": { color2:["#E2D5D0","#EADFD8","#DAC8B7"], elem2:"fused_organism", chance:0.1 }, - "melted_human": { color2:["#F1E4D4","#EDDECC"], elem2:"fused_organism", chance:0.1 }, - "melted_insect": { color2:"#CEC5B9", elem2:"fused_organism", chance:0.1 }, - }, - tempHigh: 275, - stateHigh: "cooked_meat", - tempLow: -20, - stateLow: "frozen_meat", - burn: 10, - burnTime: 300, - burnInto: "cooked_meat", - state: "liquid", - density: 800, - category: "brokenday", -}, - -elements.melted_insect = { - color: ["#4c4e42","#5e0b04","#4c4e42","#5e0b04","#56482d","#52472c","#635443"], - behavior: behaviors.LIQUID, - viscosity: 4500, - reactions: { - "meat": { elem2:"fused_organism", chance:0.1 }, - "cooked_meat": { elem2:"fused_organism", chance:0.1 }, - "sun": { elem2:"beautiful_sun", elem1:"cooked_meat" }, - "light": { elem2:"beautiful_light" }, - "dead_bug": { elem2:"melted_insect", chance:0.1 }, - "ant": { color2:"#5E0B04", elem2:"melted_insect", chance:0.2 }, - "bee": { color2:"#c4b100", elem2:"melted_insect", chance:0.2 }, - "fly": { elem2:"melted_insect", chance:0.2 }, - "firefly": { elem2:"melted_insect", chance:0.2 }, - "stinkbug": { elem2:"melted_insect", chance:0.2 }, - "slug": { color2:["#997e12","#997e12","#997e12","#997e12","#997e12","#997e12","#403314","#403314","#403314","#403314","#403314","#403314","#124a44"], elem2:"melted_insect", chance:0.2 }, - "snail": { color2:"#5c3104", elem2:"melted_insect", chance:0.15 }, - "fish": { color2:"#E3D1BC", elem2:"fused_organism", chance:0.2 }, - "tadpole": { color2:"#DBDCC4", elem2:"fused_organism", chance:0.2 }, - "frog": { color2:"#D2CDAA", elem2:"fused_organism", chance:0.2 }, - "head": { color2:["#F1E4D4","#EDDECC"], elem2:"fused_organism", chance:0.1 }, - "body": { color2:["#F1E4D4","#EDDECC"], elem2:"fused_organism", chance:0.1 }, - "melted_human": { color2:["#F1E4D4","#EDDECC"], elem2:"fused_organism", chance:0.1 }, - "bird": { color2:"#DAC8B7", elem2:"fused_organism", chance:0.1 }, - "rat": { color2:["#E2D5D0","#EADFD8"], elem2:"fused_organism", chance:0.1 }, - "melted_animal": { color2:["#E2D5D0","#EADFD8","#DAC8B7"], elem2:"fused_organism", chance:0.1 }, - "melted_fish": { color2:"#E3D1BC",elem2:"fused_organism", chance:0.1 }, - }, - tempHigh: 100, - stateHigh: "dead_bug", - tempLow: -20, - stateLow: "dead_bug", - burn: 10, - burnTime: 150, - burnInto: "ash", - state: "liquid", - density: 500, - category: "brokenday", -}, - -elements.melted_plant = { - color: ["#00bf00","#439809","#258b08","#118511","#127b12","#136d14"], - behavior: behaviors.LIQUID, - viscosity: 50000, - reactions: { - "sun": { elem2:"beautiful_sun", elem1:"dead_plant" }, - "light": { elem2:"beautiful_light" }, - "carbon_dioxide": { elem2:"oxygen" }, - "tree_branch": { elem2:"wood" }, - "plant": { elem2:"melted_plant", chance:0.2 }, - "grass": { elem2:"melted_plant", chance:0.2 }, - "evergreen": { color2:"#006300", elem2:"melted_plant", chance:0.2 }, - "pistil": { elem2:"melted_plant", chance:0.2 }, - "petal": { color2:["#CC9978","#CD8C6F","#BE785E","#CC9978","#CD8C6F","#BE785E","#A9D475","#5AF353","#8E5FA5"], elem2:"melted_plant", chance:0.1 }, - "bamboo": { elem2:"melted_plant", chance:0.1 }, - "bamboo_plant": { elem2:"melted_plant", chance:0.1 }, - "cactus": { elem2:"melted_plant", chance:0.1 }, - "corn": { color2:["#f8d223","#d6ba2a","#f7f5ba","#dbd281","#cdb12d"], elem2:"melted_plant", chance:0.1 }, - "wheat": { color2:["#f1b569","#edb864","#de9c45","#c2853d"], elem2:"melted_plant", chance:0.1 }, - "dead_plant": { elem2:"melted_plant", chance:0.1 }, - "sapling": { elem2:"melted_plant", chance:0.05 }, - "pinecone": { color2:["#5c3e33","#472f27","#31211b"], elem2:"melted_plant", chance:0.05 }, - }, - tempHigh: 250, - stateHigh: "dead_plant", - tempLow: -20, - stateLow: "frozen_plant", - burn: 10, - burnTime: 200, - burnInto: ["dead_plant","fire","fire","fire","ash"], - state: "liquid", - density: 1200, - category: "brokenday", -}; - -elements.fused_organism = { - color: ["#E5D6C7","#f7ead0"], - behavior: behaviors.LIQUID, - viscosity: 6000, - reactions: { - "meat": { elem2:"fused_organism", chance:0.1 }, - "cooked_meat": { elem2:"fused_organism", chance:0.1 }, - "sun": { elem2:"beautiful_sun", elem1:"cooked_meat" }, - "light": { elem2:"beautiful_light" }, - "dead_bug": { color2:"#CEC5B9", elem2:"fused_organism", chance:0.1 }, - "ant": { color2:"#D2B6AB", elem2:"fused_organism", chance:0.2 }, - "bee": { color2:"#E9DBAA", elem2:"fused_organism", chance:0.2 }, - "fly": { color2:"#CEC5B9", elem2:"fused_organism", chance:0.2 }, - "firefly": { color2:"#CEC5B9", elem2:"fused_organism", chance:0.2 }, - "stinkbug": { color2:"#CEC5B9", elem2:"fused_organism", chance:0.2 }, - "slug": { color2:["#DFD0AE","#E5D6C7"], elem2:"fused_organism", chance:0.2 }, - "snail": { color2:"#E5D6C7", elem2:"fused_organism", chance:0.15 }, - "head": { color2:["#F1E4D4","#EDDECC"], elem2:"fused_organism", chance:0.1 }, - "body": { color2:["#F1E4D4","#EDDECC"], elem2:"fused_organism", chance:0.1 }, - "melted_human": { color2:["#F1E4D4","#EDDECC"], elem2:"fused_organism", chance:0.1 }, - "melted_insect": { color2:"#CEC5B9", elem2:"fused_organism", chance:0.1 }, - "bird": { color2:"#DAC8B7", elem2:"fused_organism", chance:0.1 }, - "rat": { color2:["#E2D5D0","#EADFD8"], elem2:"fused_organism", chance:0.1 }, - "fish": { color2:"#E3D1BC", elem2:"fused_organism", chance:0.2 }, - "tadpole": { color2:"#DBDCC4", elem2:"fused_organism", chance:0.2 }, - "frog": { color2:"#D2CDAA", elem2:"fused_organism", chance:0.2 }, - "melted_animal": { color2:["#E2D5D0","#EADFD8","#DAC8B7"], elem2:"fused_organism", chance:0.1 }, - "melted_fish": { color2:"#E3D1BC", elem2:"fused_organism", chance:0.1 }, - }, - tempHigh: 300, - stateHigh: "cooked_meat", - tempLow: -20, - stateLow: "frozen_meat", - burn: 10, - burnTime: 400, - burnInto: "cooked_meat", - state: "liquid", - density: 2000, - category: "brokenday", -}; - -HighNumber = "36 41 20 36 46 20 36 41 20 36 46 20 32 30 20 33 44 20 32 30 20 36 37 20 36 31 20 37 39" From bdaeb77cf546bfb3e9d7aba617a5f285e9a21835 Mon Sep 17 00:00:00 2001 From: slweeb <91897291+slweeb@users.noreply.github.com> Date: Thu, 16 Oct 2025 14:20:17 -0400 Subject: [PATCH 067/105] . --- mod-list.html | 2 ++ mods/rich_grain.js | 54 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 56 insertions(+) create mode 100644 mods/rich_grain.js diff --git a/mod-list.html b/mod-list.html index d9ed8b19..754017b0 100644 --- a/mod-list.html +++ b/mod-list.html @@ -147,6 +147,7 @@ mustard.jsMustard and Mustard SeedsR74n rainbow_cursor.jsMakes your cursor multicoloredR74n random_everything.jsAllows every element to be spawned with RandomR74n +rich_grain.jsChanges pixel grain to create richer colorsR74n smooth_water.jsChanges water mechanics so that it flows in one direction until it bounces off of somethingR74n souls.jsHuman Souls, Ectoplasm, and TombstonesR74n spring.jsMany nature elements, like sakura trees, butterflies, beehives, and moreR74n @@ -430,6 +431,7 @@ paint_event.jsRandom event that randomly paints a circleAlice rainbow_tests.jsVariants of the rainbow element with different mathsAlice real_light.jsEverything is dark unless hit with a photon (Light) pixel, hot, or glowingNekonico +rich_grain.jsChanges pixel grain to create richer colorsR74n shader_by_jayd.jsGlow around light elementsJayd Shroomboxels.jsVariant of acid_and_shapes.js that uses a different trigonometric functionAlice singleColor.jsElements pick one color each time they're drawnstefanblox diff --git a/mods/rich_grain.js b/mods/rich_grain.js new file mode 100644 index 00000000..93532af2 --- /dev/null +++ b/mods/rich_grain.js @@ -0,0 +1,54 @@ +pixelColorPick = function(pixel,customColor=null) { + let element = pixel.element; + let elementInfo = elements[element]; + //if (elementInfo.behavior instanceof Array) { + + if (pixel.charge && elementInfo.colorOn) { + customColor = elementInfo.colorOn; + } + let rgb; + if (customColor !== null) { + if (Array.isArray(customColor)) { + customColor = customColor[Math.floor(Math.random() * customColor.length)]; + } + if (customColor.startsWith("#")) { + customColor = hexToRGB(customColor); + } + rgb = customColor; + } + else { + rgb = elements[element].colorObject; // {r, g, b} + // If rgb is an array, choose a random item + if (Array.isArray(rgb)) { + rgb = rgb[Math.floor(Math.random() * rgb.length)]; + } + } + // Randomly darken or lighten the RGB color + let grain = 15; + if (elementInfo.grain !== undefined) { grain = grain * elementInfo.grain } + let coloroffset = Math.floor(Math.random() * (Math.random() > 0.5 ? -1 : 1) * Math.random() * grain); + let r = rgb.r + coloroffset; + let g = rgb.g + coloroffset; + let b = rgb.b + coloroffset; + // better_grain.js changes begin + let hsl = RGBToHSL([r,g,b]); + hsl[0] += coloroffset/1.5/255; + // console.log(hsl) + let rgb2 = HSLtoRGB(hsl); + r = Math.round(rgb2[0]); g = Math.round(rgb2[1]); b = Math.round(rgb2[2]); + // better_grain.js changes end + // Make sure the color is within the RGB range + r = Math.max(0, Math.min(255, r)); + g = Math.max(0, Math.min(255, g)); + b = Math.max(0, Math.min(255, b)); + let color = "rgb("+r+","+g+","+b+")"; + + /*} + else { + var color = elementInfo.color; + if (Array.isArray(color)) { + color = color[Math.floor(Math.random() * color.length)]; + } + }*/ + return color; +} \ No newline at end of file From 5183a9b0b3b09d03b3645adb66c348f988a2d18c Mon Sep 17 00:00:00 2001 From: Mnem42 <177770058+Mnem42@users.noreply.github.com> Date: Fri, 17 Oct 2025 15:49:04 +0100 Subject: [PATCH 068/105] Create zoom.js --- mods/zoom.js | 72 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 mods/zoom.js diff --git a/mods/zoom.js b/mods/zoom.js new file mode 100644 index 00000000..dc8b2b0d --- /dev/null +++ b/mods/zoom.js @@ -0,0 +1,72 @@ +// IIFE because paranoid +(() => { + let canvas_div = document.getElementById("canvasDiv") + + keybinds["9"] = () => handle_zoom("in") + keybinds["0"] = () => handle_zoom("out") + + const controls_table = document.getElementById("controlsTable").lastElementChild + controls_table.insertAdjacentHTML("beforeBegin",` + + Zoom in/out + 9/0 + + `) + + const zoom_levels = [ + 0.5, + 1, + 2, + 3, + 6, + 12 + ] + + window.zoom_level = 1 + + function handle_zoom(direction){ + switch (direction){ + case "in": + if (!(zoom_level+1 in zoom_levels)) { break; } + window.zoom_level += 1 + break; + case "out": + if (!(zoom_level-1 in zoom_levels)) { break; } + window.zoom_level -= 1 + break; + } + + logMessage(`${zoom_levels[zoom_level]}x`) + rescale() + } + + function rescale(){ + const scale = zoom_levels[zoom_level]; + gameCanvas.style.transform = `scale(${scale})` + + canvas_div.style.overflow = scale > 1 ? "scroll" : "unset" + } + + // Redefine to give correct numbers when zoomed + window.getMousePos = (canvas, evt) => { + if (evt.touches) { + evt.preventDefault(); + evt = evt.touches[0]; + isMobile = true; + } + const rect = canvas.getBoundingClientRect(); + + let x = (evt.clientX - rect.left) / zoom_levels[window.zoom_level]; + let y = (evt.clientY - rect.top) / zoom_levels[window.zoom_level]; + + x = Math.floor((x / canvas.clientWidth) * (width+1)); + y = Math.floor((y / canvas.clientHeight) * (height+1)); + + return {x:x, y:y}; + } + + runAfterReset(() => { + window.zoom_level = 1 + rescale() + }) +})() From dc29ee6a685e42b1d1bc9792393a5d86d4fd0563 Mon Sep 17 00:00:00 2001 From: Mnem42 <177770058+Mnem42@users.noreply.github.com> Date: Fri, 17 Oct 2025 15:55:15 +0100 Subject: [PATCH 069/105] slight keybind change --- mods/zoom.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/mods/zoom.js b/mods/zoom.js index dc8b2b0d..8c02e817 100644 --- a/mods/zoom.js +++ b/mods/zoom.js @@ -2,14 +2,14 @@ (() => { let canvas_div = document.getElementById("canvasDiv") - keybinds["9"] = () => handle_zoom("in") - keybinds["0"] = () => handle_zoom("out") + keybinds["0"] = () => handle_zoom("in") + keybinds["9"] = () => handle_zoom("out") const controls_table = document.getElementById("controlsTable").lastElementChild controls_table.insertAdjacentHTML("beforeBegin",` Zoom in/out - 9/0 + 0/9 `) From 9bbaaa3784ddce396ec8fbb27d42c1e19894a00c Mon Sep 17 00:00:00 2001 From: Mnem42 <177770058+Mnem42@users.noreply.github.com> Date: Mon, 20 Oct 2025 15:14:56 +0100 Subject: [PATCH 070/105] General UI changes + a proper panning implementation --- mods/zoom.js | 100 +++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 85 insertions(+), 15 deletions(-) diff --git a/mods/zoom.js b/mods/zoom.js index 8c02e817..bd08a89d 100644 --- a/mods/zoom.js +++ b/mods/zoom.js @@ -2,16 +2,56 @@ (() => { let canvas_div = document.getElementById("canvasDiv") - keybinds["0"] = () => handle_zoom("in") - keybinds["9"] = () => handle_zoom("out") + // Be more granular at higher zoom levels + const speed_a = () => zoom_level > 3 ? 5 : 10 + const speed_b = () => zoom_level > 3 ? 10 : 20 + + keybinds["9"] = () => handle_zoom("in") + keybinds["0"] = () => handle_zoom("out") + + keybinds["w"] = () => handle_pan("up", speed_a()) + keybinds["a"] = () => handle_pan("left", speed_a()) + keybinds["s"] = () => handle_pan("down", speed_a()) + keybinds["d"] = () => handle_pan("right", speed_a()) + + keybinds["W"] = () => handle_pan("up", speed_b()) + keybinds["A"] = () => handle_pan("left", speed_b()) + keybinds["S"] = () => handle_pan("down", speed_b()) + keybinds["D"] = () => handle_pan("right", speed_b()) const controls_table = document.getElementById("controlsTable").lastElementChild + controls_table.insertAdjacentHTML("beforeBegin",` - - Zoom in/out - 0/9 - + + Zoom in/out + + 9/ + 0 + + + + Pan + + W + A + S + D + + + + Pan (fast) + + Shift + + W + A + S + D + + `) + + const zoom_data_div = document.createElement("div") + document.getElementById("logDiv").appendChild(zoom_data_div) const zoom_levels = [ 0.5, @@ -23,6 +63,7 @@ ] window.zoom_level = 1 + window.zoom_panning = [0,0] function handle_zoom(direction){ switch (direction){ @@ -34,17 +75,46 @@ if (!(zoom_level-1 in zoom_levels)) { break; } window.zoom_level -= 1 break; - } - - logMessage(`${zoom_levels[zoom_level]}x`) + } rescale() } - function rescale(){ - const scale = zoom_levels[zoom_level]; - gameCanvas.style.transform = `scale(${scale})` + function handle_pan(direction, speed){ + switch (direction){ + case "right": + zoom_panning[0] -= speed + break; + case "left": + zoom_panning[0] += speed + break; + case "up": + zoom_panning[1] += speed + break; + case "down": + zoom_panning[1] -= speed + break; + } + rescale() + } - canvas_div.style.overflow = scale > 1 ? "scroll" : "unset" + function rescale(){ + log_info() + + const scale = zoom_levels[zoom_level] + const x = zoom_panning[0] * (pixelSize * scale) + const y = zoom_panning[1] * (pixelSize * scale) + + gameCanvas.style.transform = `translate(${x}px,${y}px) scale(${scale})` + } + + function log_info(){ + // Values are negated to make them more intuitive + const x_pan = (-zoom_panning[0]).toString().padEnd(4) + const y_pan = (-zoom_panning[1]).toString().padEnd(4) + + zoom_data_div.innerText = "" + zoom_data_div.innerText += `Scale: ${zoom_levels[zoom_level]}x\n` + zoom_data_div.innerText += `Pan : ${x_pan}, ${y_pan}` } // Redefine to give correct numbers when zoomed @@ -56,8 +126,8 @@ } const rect = canvas.getBoundingClientRect(); - let x = (evt.clientX - rect.left) / zoom_levels[window.zoom_level]; - let y = (evt.clientY - rect.top) / zoom_levels[window.zoom_level]; + let x = (evt.clientX - rect.left) / zoom_levels[zoom_level]; + let y = (evt.clientY - rect.top) / zoom_levels[zoom_level]; x = Math.floor((x / canvas.clientWidth) * (width+1)); y = Math.floor((y / canvas.clientHeight) * (height+1)); From b1dce5423e8931c9ac0471ba4af18399124dee2c Mon Sep 17 00:00:00 2001 From: slweeb <91897291+slweeb@users.noreply.github.com> Date: Sat, 25 Oct 2025 10:22:19 -0400 Subject: [PATCH 071/105] Update mod-list.html --- mod-list.html | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/mod-list.html b/mod-list.html index 754017b0..6777ef38 100644 --- a/mod-list.html +++ b/mod-list.html @@ -217,10 +217,10 @@ clf3.jsChlorine TrifluorideAlice cmur.jsCharsonsModUno (???)CharsonBurensen debrisable.jsExpands the number of breakable elements, changes erosion, and adds way to craft certain elements from breaking other elementsNekonico +eklegems.jsLarge amouunt of gemstones and other crystalsekle24 fire_extinguisher.jsFire extinguisher blocks and realistic firefighting foam to put out nearly anythingDr_Lego fire_mod.jsVarious properties to change fire behavior and radioactive fireAlice fire_slime.jsPyrogenic version of slimeAlice -Gemstones.jsGemstonesSchweeny glenn_gases.jsMost gases from the Glenn's Gases mod into SandboxelsAlice grav_mudstones.jsVarious forms of mudstone with different gravitiesAlice halogen.jsThe missing halogensnousernamefound @@ -335,6 +335,7 @@ colonies.jsRockets that contain settlers to terraform a planetNekonico crimson.jsElements relating to the Crimson from TerrariaAlice dogs.jsSimple dog and dog foodhedera-ivy +eklegems.jsLarge amouunt of gemstones and other crystalsekle24 fairy_chain.jsWay too many fairies to fey_and_more.jsAlice fantastic_creatures.jsVarious animalsMelecie fantasy_elements.jsFantasy creatures and substancespixelegend4 From f09e9fe5de551ec1a3d4a9e406e24b928ff2993b Mon Sep 17 00:00:00 2001 From: eliwhitfield-dot Date: Sun, 26 Oct 2025 12:33:16 -0600 Subject: [PATCH 072/105] Create black_hole.js --- mods/black_hole.js | 43 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 mods/black_hole.js diff --git a/mods/black_hole.js b/mods/black_hole.js new file mode 100644 index 00000000..dd64dc6c --- /dev/null +++ b/mods/black_hole.js @@ -0,0 +1,43 @@ +elements.black_hole = { + color: "#000000", + tick: function(pixel) { + // Attract other pixels within a 9-pixel radius + for (let dx = -9; dx <= 9; dx++) { + for (let dy = -9; dy <= 9; dy++) { + let x = pixel.x + dx; + let y = pixel.y + dy; + + // Ignore out-of-bounds + if (!isEmpty(x, y, true)) { + let other = pixelMap[x]?.[y]; + if (other && other.element !== "black_hole") { + // Attraction: move other pixel towards the black hole + let stepX = Math.sign(pixel.x - other.x); + let stepY = Math.sign(pixel.y - other.y); + tryMove(other, other.x + stepX, other.y + stepY); + } + } + } + } + + // Convert touching pixels into black holes + const dirs = [ + [1, 0], [-1, 0], [0, 1], [0, -1], + [1, 1], [-1, -1], [1, -1], [-1, 1] + ]; + for (let d of dirs) { + let nx = pixel.x + d[0]; + let ny = pixel.y + d[1]; + if (isEmpty(nx, ny, true)) continue; + + let touching = pixelMap[nx]?.[ny]; + if (touching && touching.element !== "black_hole") { + changePixel(touching, "black_hole"); + } + } + }, + category: "special", + state: "solid", + density: 99999, // Very dense (optional) + hardness: 1, // Can't be destroyed easily +}; From e714af6319d67556ed84084546a4962e5d2f1f68 Mon Sep 17 00:00:00 2001 From: Mnem42 <177770058+Mnem42@users.noreply.github.com> Date: Sun, 26 Oct 2025 20:38:30 +0000 Subject: [PATCH 073/105] Potential fix and reorganising Fix the mod sometimes failing to load if it loads before the relevant parts of the UI --- mods/zoom.js | 112 +++++++++++++++++++++++++++------------------------ 1 file changed, 59 insertions(+), 53 deletions(-) diff --git a/mods/zoom.js b/mods/zoom.js index bd08a89d..a83fea4d 100644 --- a/mods/zoom.js +++ b/mods/zoom.js @@ -1,58 +1,5 @@ // IIFE because paranoid (() => { - let canvas_div = document.getElementById("canvasDiv") - - // Be more granular at higher zoom levels - const speed_a = () => zoom_level > 3 ? 5 : 10 - const speed_b = () => zoom_level > 3 ? 10 : 20 - - keybinds["9"] = () => handle_zoom("in") - keybinds["0"] = () => handle_zoom("out") - - keybinds["w"] = () => handle_pan("up", speed_a()) - keybinds["a"] = () => handle_pan("left", speed_a()) - keybinds["s"] = () => handle_pan("down", speed_a()) - keybinds["d"] = () => handle_pan("right", speed_a()) - - keybinds["W"] = () => handle_pan("up", speed_b()) - keybinds["A"] = () => handle_pan("left", speed_b()) - keybinds["S"] = () => handle_pan("down", speed_b()) - keybinds["D"] = () => handle_pan("right", speed_b()) - - const controls_table = document.getElementById("controlsTable").lastElementChild - - controls_table.insertAdjacentHTML("beforeBegin",` - - Zoom in/out - - 9/ - 0 - - - - Pan - - W - A - S - D - - - - Pan (fast) - - Shift + - W - A - S - D - - - `) - - const zoom_data_div = document.createElement("div") - document.getElementById("logDiv").appendChild(zoom_data_div) - const zoom_levels = [ 0.5, 1, @@ -117,6 +64,60 @@ zoom_data_div.innerText += `Pan : ${x_pan}, ${y_pan}` } + function patch_keybinds(){ + // Be more granular at higher zoom levels + const speed_a = () => zoom_level > 3 ? 5 : 10 + const speed_b = () => zoom_level > 3 ? 10 : 20 + + keybinds["9"] = () => handle_zoom("in") + keybinds["0"] = () => handle_zoom("out") + + keybinds["w"] = () => handle_pan("up", speed_a()) + keybinds["a"] = () => handle_pan("left", speed_a()) + keybinds["s"] = () => handle_pan("down", speed_a()) + keybinds["d"] = () => handle_pan("right", speed_a()) + + keybinds["W"] = () => handle_pan("up", speed_b()) + keybinds["A"] = () => handle_pan("left", speed_b()) + keybinds["S"] = () => handle_pan("down", speed_b()) + keybinds["D"] = () => handle_pan("right", speed_b()) + } + + function patch_ui(){ + const zoom_data_div = document.createElement("div") + document.getElementById("logDiv").appendChild(zoom_data_div) + + const controls_table = document.getElementById("controlsTable").lastElementChild + controls_table.insertAdjacentHTML("beforeBegin",` + + Zoom in/out + + 9/ + 0 + + + + Pan + + W + A + S + D + + + + Pan (fast) + + Shift + + W + A + S + D + + + `) + } + // Redefine to give correct numbers when zoomed window.getMousePos = (canvas, evt) => { if (evt.touches) { @@ -139,4 +140,9 @@ window.zoom_level = 1 rescale() }) + + runAfterLoad(() => { + patch_keybinds() + patch_ui() + }) })() From 7984b01c3f9f6365546f193c8abef6bb65302f5e Mon Sep 17 00:00:00 2001 From: Alexthetransfem <124483815+theenchantedsword@users.noreply.github.com> Date: Sun, 26 Oct 2025 18:10:52 -0500 Subject: [PATCH 074/105] New salts and updated acidTick Added nitrates and made acidTick function as it should --- mods/morechemistry.js | 231 +++++++++++++++++++++++++++++++++++++++--- 1 file changed, 219 insertions(+), 12 deletions(-) diff --git a/mods/morechemistry.js b/mods/morechemistry.js index 5008b2e5..bedb5260 100644 --- a/mods/morechemistry.js +++ b/mods/morechemistry.js @@ -1,5 +1,5 @@ /* -*Version 2.2.1 +*Version 2.2.2 */ dependOn("orchidslibrary.js", ()=>{ @@ -683,23 +683,38 @@ dependOn("orchidslibrary.js", ()=>{ for(let coords of adjacentCoords){ let x = pixel.x+coords[0], y = pixel.y+coords[1]; let p2 = getPixel(x,y); - let ignore = false; - for(let item of elements[pixel.element].ignore){ + //let ignore = false; + /*for(let item of elements[pixel.element].ignore){ if(p2 != null && item.startsWith("*")&&p2.element.endsWith(item.split("*")[1])){ ignore = true; } else if (p2 != null && item.endsWith("*")&&p2.element.startsWith(item.split("*")[0])){ ignore = true; + } else if(p2 != null){ + ignore = (elements[pixel.element].ignore.includes(p2.element)) ? true : ignore; + } + }*/ + if(p2 != null){ + let ignore = elements[pixel.element].ignore.some(item=>{ + let res = false; + if(p2.element === item){ + res = true; + } else if(item.startsWith("*") && p2.element.endsWith(item.slice(1))) { + res = true; + } else if(item.endsWith("*") && p2.element.startsWith(item.slice(0,-1))){ + res = true; } + return res; + }); + if(!ignore){ + deletePixel(x,y); + deletePixel(pixel.x, pixel.y); } - if(p2 != null && !(elements[pixel.element].ignore.includes(p2.element) || ignore || p2.element == pixel.element)){ - deletePixel(x,y); - deletePixel(pixel.x, pixel.y); } } } elements.acid.behavior = behaviors.LIQUID; elements.acid.tick = acidTick; - elements.acid.ignore = elements.acid.ignore.concat(["nitric_acid", "aqua_regia", "nitrogen_dioxide", "nitric_acid_ice", "nitrogen_dioxide_ice", "acid", "chloroauric_acid", "*chloride", "*carbonate", "*acetate", "*sulfate", "*gallium", "*hydroxide", "salt", "*aluminum", "target_portal_in", "*magnesium", "*copper", "*iron", "*calcium", "sulfuric_acid", "*vinegar", "*gypsum", "*wall", "epsom_salt", "*platinum", "chloroplatinic_acid", "*sulfur*"]); + elements.acid.ignore = elements.acid.ignore.concat(["nitric_acid", "aqua_regia", "nitrogen_dioxide", "nitric_acid_ice", "nitrogen_dioxide_ice", "acid", "chloroauric_acid", "*chloride", "*carbonate", "*acetate", "*sulfate", "*gallium", "*hydroxide", "salt", "*aluminum", "target_portal_in", "*magnesium", "*copper*", "*iron", "*calcium", "sulfuric_acid", "*vinegar", "*gypsum", "*wall", "epsom_salt", "platinum", "chloroplatinic_acid", "*sulfur*", "wall", "porcelain", "plastic", "glass", "*sulfate", "*nitrate"]); elements.nitric_acid = { alias: "HNO₃", behavior: behaviors.LIQUID, @@ -710,6 +725,12 @@ dependOn("orchidslibrary.js", ()=>{ stateLow: "nitric_acid_ice", reactions: { acid: {elem1: null, elem2: "aqua_regia"}, + copper: {elem1: "hydrogen", elem2: "copper_nitrate"}, + sodium: {elem1: "hydrogen", elem2: "sodium_nitrate"}, + aluminum: {elem1: "hydrogen", elem2: "aluminum_nitrate"}, + potassium: {elem1: "hydrogen", elem2: "potassium_nitrate"}, + calcium: {elem1: "hydrogen", elem2: "calcium_nitrate"}, + magnesium: {elem1: "hydrogen", elem2: "magnesium_nitrate"}, }, density: 1510, category: "liquids", @@ -873,6 +894,8 @@ dependOn("orchidslibrary.js", ()=>{ density: 2960, reactions: { acid: {elem1: "magnesium_chloride", elem2: ["carbon_dioxide", "foam", "seltzer", "seltzer"]}, + sulfuric_acid: {elem1: "epsom_salt", elem2: ["carbon_dioxide", "foam", "seltzer", "seltzer"]}, + nitric_acid: {elem1: "magnesium_nitrate", elem2: ["carbon_dioxide", "foam", "seltzer", "seltzer"]}, vinegar: {elem1: "magnesium_acetate", elem2: ["carbon_dioxide", "foam", "seltzer", "seltzer"]} } } @@ -1140,11 +1163,11 @@ dependOn("orchidslibrary.js", ()=>{ alias: "CuCl₂", solubility: {water: 0.743}, reactions: { - sodium: {elem1: "copper", elem2: "sodium_acetate"}, - potassium: {elem1: "copper", elem2: "potassium_acetate"}, - magnesium: {elem1: "copper", elem2: "magnesium_acetate"}, - calcium: {elem1: "copper", elem2: "calcium_acetate"}, - aluminum: {elem1: "copper", elem2: "aluminum_acetate"}, + sodium: {elem1: "copper", elem2: "salt"}, + potassium: {elem1: "copper", elem2: "potassium_salt"}, + magnesium: {elem1: "copper", elem2: "magnesium_chloride"}, + calcium: {elem1: "copper", elem2: "calcium_chloride"}, + aluminum: {elem1: "copper", elem2: "aluminum_chloride"}, wood: {stain2: "#043023"}, }, properties: { @@ -1554,4 +1577,188 @@ dependOn("orchidslibrary.js", ()=>{ stateLow: "bismuth", temp: 270, }; + + elements.copper_nitrate = { + density: 3050, + tempHigh: 145, + stateHigh: ["oxidized_copper", "nitrogen_dioxide", "nitrogen_dioxide"], + color: ["#1717ff", "#2121ff", "#1b1bf5", "#0f0ff2", "#0707f7"], + behavior: behaviors.POWDER, + state: "solid", + category: "salts", + alias: "Cu(NO₃)₂", + solubility: {water: 1.25}, + reactions: { + sodium: {elem1: "copper", elem2: "sodium_nitrate"}, + potassium: {elem1: "copper", elem2: "potassium_nitrate"}, + calcium: {elem1: "copper", elem2: "calcium_nitrate"}, + aluminum: {elem1: "copper", elem2: "aluminum_nitrate"}, + wood: {stain2: "#043023"}, + ash: {elem1: "copper_carbonate", elem2: "potassium_nitrate"}, + baking_soda: {elem1: "copper_carbonate", elem2: "sodium_nitrate"}, + acid: {elem1: "copper_chloride", elem2: "nitric_acid"}, + sulfuric_acid: {elem1: "copper_sulfate", elem2: "nitric_acid"}, + }, + properties: { + anhydrous: false + }, + fireColor: "#19abff", + tick: function(pixel){ + if(pixelTicks-pixel.start == 2 && xDown){ + pixel.anhydrous = true; + let rgb = {r: 51, g: 158, b: 61}; + let num = 6 - (Math.round(Math.random()*12)); + for(let key in rgb){ + rgb[key] += num; + } + pixel.color = `rgb(${rgb.r},${rgb.g},${rgb.b})`; + } + let multi = (pixel.temp-70)/100; + multi = (multi < 0) ? 0 : ((multi > 1) ? 1 : multi); + if(Math.random() < 0.05*multi){ + pixel.anhydrous = true; + let rgb = {r: 51, g: 158, b: 61}; + let num = 6 - (Math.round(Math.random()*12)); + for(let key in rgb){ + rgb[key] += num; + } + pixel.color = `rgb(${rgb.r},${rgb.g},${rgb.b})`; + } + if(pixel.anhydrous){ + let neighbors = []; + for(let coords of squareCoords){ + let x = pixel.x+coords[0], y = pixel.y+coords[1]; + neighbors[neighbors.length] = (isEmpty(x,y) && !outOfBounds(x,y)) ? "air" : (!outOfBounds(x,y)) ? pixelMap[x][y].element : undefined; + } + if(neighbors.includes("air") && pixel.temp < 50 && Math.random() < 0.00035){ + pixel.anhydrous = false; + let rgb = (Math.random() > 0.5) ? {r: 7, g: 7, b: 247} : {r: 26, g: 26, b: 240}; + let num = 6 - (Math.round(Math.random()*12)); + for(let key in rgb){ + rgb[key] += num; + } + pixel.color = `rgb(${rgb.r},${rgb.g},${rgb.b})`; + + } else if (neighbors.includes("steam") || neighbors.includes("water") || neighbors.includes("salt_water") || neighbors.includes("sugar_water") || neighbors.includes("dirty_water") || neighbors.includes("seltzer") || neighbors.includes("pool_water") || neighbors.includes("slush")){ + pixel.anhydrous = false; + let rgb = (Math.random() > 0.5) ? {r: 7, g: 7, b: 247} : {r: 26, g: 26, b: 240}; + let num = 6 - (Math.round(Math.random()*12)); + for(let key in rgb){ + rgb[key] += num; + } + pixel.color = `rgb(${rgb.r},${rgb.g},${rgb.b})`; + } + } + } + }; + + elements.sodium_nitrate = { + color: ["#f5f5f5", "#e8e8e8", "#ededed", "#e3e3e3"], + density: 2260, + category: "salts", + tempHigh: 650, + stateHigh: ["sodium", "nitrogen_dioxide"], + reactions: { + ash: {elem1: "baking_soda", elem2: "potassium_nitrate"}, + potassium: {elem1: "sodium", elem2: "potassium_nitrate"}, + //sulfuric_acid: {elem1: "sodium_sulfate", elem2: "nitric_acid"}, + acid: {elem1: "salt", elem2: "nitric_acid"}, + }, + solubility: {water: 0.86}, + alias: "NaNO₃", + behavior: behaviors.POWDER + }; + + elements.potassium_nitrate = { + color: ["#f5f5f5", "#e8e8e8", "#ededed", "#e3e3e3"], + density: 2106, + category: "salts", + tempHigh: 800, + stateHigh: ["potassium", "nitrogen_dioxide"], + reactions: { + //sulfuric_acid: {elem1: "potassium_sulfate", elem2: "nitric_acid"}, + acid: {elem1: "potassium_salt", elem2: "nitric_acid"}, + }, + solubility: {water: 0.316}, + alias: "KNO₃", + behavior: behaviors.POWDER + }; + elements.magnesium_nitrate = { + color: ["#f5f5f5", "#e8e8e8", "#ededed", "#e3e3e3"], + density: 2300, + category: "salts", + tempHigh: 290, + stateHigh: ["magnesium", "nitrogen_dioxide"], + reactions: { + potassium: {elem1: "magnesium", elem2: "potassium_nitrate"}, + sodium: {elem1: "magnesium", elem2: "sodium_nitrate"}, + sulfuric_acid: {elem1: "epsom_salt", elem2: "nitric_acid"}, + acid: {elem1: "magnesium_chloride", elem2: "nitric_acid"}, + }, + solubility: {water: 0.42}, + alias: "Mg(NO₃)₂", + behavior: behaviors.POWDER + }; + elements.calcium_nitrate = { + color: ["#f5f5f5", "#e8e8e8", "#ededed", "#e3e3e3"], + density: 2504, + category: "salts", + tempHigh: 650, + stateHigh: ["calcium", "nitrogen_dioxide"], + reactions: { + potassium: {elem1: "calcium", elem2: "potassium_nitrate"}, + sodium: {elem1: "calcium", elem2: "sodium_nitrate"}, + magnesium: {elem1: "calcium", elem2: "magnesium_nitrate"}, + sulfuric_acid: {elem1: "gypsum", elem2: "nitric_acid"}, + acid: {elem1: "calcium_chloride", elem2: "nitric_acid"}, + }, + solubility: {water: 1.21}, + alias: "Ca(NO₃)₂", + behavior: behaviors.POWDER + }; + elements.aluminum_nitrate = { + color: ["#f5f5f5", "#e8e8e8", "#ededed", "#e3e3e3"], + density: 1720, + category: "salts", + tempHigh: 150, + stateHigh: ["aluminum", "nitrogen_dioxide"], + reactions: { + sodium: {elem1: "aluminum", elem2: "sodium_nitrate"}, + potassium: {elem1: "aluminum", elem2: "potassium_nitrate"}, + calcium: {elem1: "aluminum", elem2: "calcium_nitrate"}, + magnesium: {elem1: "aluminum", elem2: "magnesium_nitrate"}, + //sulfuric_acid: {elem1: "aluminum_sulfate", elem2: "nitric_acid"}, + acid: {elem1: "aluminum_chloride", elem2: "nitric_acid"}, + }, + solubility: {water: 0.739}, + alias: "Al(NO₃)₃", + behavior: behaviors.POWDER + }; + elements.limestone.reactions.sulfuric_acid = {elem1: "gypsum", elem2: ["carbon_dioxide", "foam", "seltzer", "seltzer"]}; + elements.slaked_lime.reactions.sulfuric_acid = {elem1: "gypsum", elem2: "water"}; + elements.quicklime.reactions.sulfuric_acid = {elem1: "gypsum", elem2: "oxygen"}; + elements.limestone.reactions.nitric_acid = {elem1: "calcium_nitrate", elem2: ["carbon_dioxide", "foam", "seltzer", "seltzer"]}; + elements.slaked_lime.reactions.nitric_acid = {elem1: "calcium_nitrate", elem2: "water"}; + elements.quicklime.reactions.nitric_acid = {elem1: "calcium_nitrate", elem2: "oxygen"}; + elements.copper_carbonate = { + color: ["#5ee092", "#54d186", "#52de8a", "#44c97a"], + category: "salts", + alias: "CuCO₃", + behavior: behaviors.POWDER, + reactions: { + vinegar: {elem1: "copper_acetate", elem2: ["carbon_dioxide", "foam", "seltzer", "seltzer"]}, + acid: {elem1: "copper_chloride", elem2: ["carbon_dioxide", "foam", "seltzer", "seltzer"]}, + sulfuric_acid: {elem1: "copper_sulfate", elem2: ["carbon_dioxide", "foam", "seltzer", "seltzer"]}, + nitric_acid: {elem1: "copper_nitrate", elem2: ["carbon_dioxide", "foam", "seltzer", "seltzer"]}, + aqua_regia: {elem1: ["copper_nitrate", "copper_chloride"], elem2: ["carbon_dioxide", "foam", "seltzer", "seltzer"]}, + }, + density: 4000, + tempHigh: 290, + stateHigh: ["oxidized_copper", "carbon_dioxide"], + }; + elements.aqua_regia.solubility = {water: 1}; + elements.acid.solubility = {water: 1}; + elements.vinegar.solubility = {water: 1}; + elements.nitric_acid.solubility = {water: 1}; + elements.sulfuric_acid.solubility = {water: 1}; }, true); From 17a0a62ed218b77f834ba98a8f16967f571afd8f Mon Sep 17 00:00:00 2001 From: Alexthetransfem <124483815+theenchantedsword@users.noreply.github.com> Date: Sun, 26 Oct 2025 18:13:38 -0500 Subject: [PATCH 075/105] Update solubility.js Changed the tempHigh of water and tempLow of steam, and changed the chances for dissolved salts to be placed when water evaporates --- mods/solubility.js | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/mods/solubility.js b/mods/solubility.js index 28e8fc0e..95aefb36 100644 --- a/mods/solubility.js +++ b/mods/solubility.js @@ -1,5 +1,5 @@ /* -* Version 1.0.0 +* Version 1.1.0 */ dependOn("orchidslibrary.js", ()=>{ @@ -46,15 +46,15 @@ dependOn("orchidslibrary.js", ()=>{ } function aqueousReaction(p1, p2){ for(let elem in p1.elemsDissolved){ - if(elements[elem].reactions != null && p2.element != "water" && elements[elem].reactions[p2.element] != undefined){ + if(elements[elem].reactions != null && p2.element != "water" && (elements[elem].reactions[p2.element] != undefined || (elements[p2.element].reactions != null && elements[p2.element].reactions[elem] != undefined))){ - let r = elements[elem].reactions[p2.element]; + let r = elements[elem].reactions[p2.element] || elements[p2.element].reactions[elem]; if(r.tempMin && !((p1.temp >= r.tempMin) && (p2.temp >= r.tempMin))){ return false; } if(r.tempMax && !((p1.temp <= r.tempMax) && (p2.temp <= r.tempMax))){ return false; - } + <<<<<<<<< } if(r.charged && !(p1.charge || p2.charge)){ return false; } @@ -253,13 +253,13 @@ dependOn("orchidslibrary.js", ()=>{ let num = Math.random(); if(elem === null){ for(let e in pixel.elemsDissolved){ - if(num <= ((pixel.elemsDissolved[e]/100)/elements[e].solubility.water)){ + if(num <= ((pixel.elemsDissolved[e]/100)/elements[e].solubility.water)/4){ elem = e; } } } elem = (elem == null) ? "steam" : elem; - changePixel(pixel, elem); + changePixel(pixel, elem, 110); pixel.dissolvedElems = {}; } } @@ -282,5 +282,6 @@ dependOn("orchidslibrary.js", ()=>{ elements.water.tick = solventTick; elements.water.behavior = behaviors.SOLVENT; elements.water.tempHigh = undefined; - elements.water.solventTempHigh = 100; + elements.water.solventTempHigh = 101; + elements.steam.tempLow = 99 }, true); From 4f9ce8173e53cbdce75356283b6e669af6fc9496 Mon Sep 17 00:00:00 2001 From: Alexthetransfem <124483815+theenchantedsword@users.noreply.github.com> Date: Mon, 27 Oct 2025 08:01:24 -0500 Subject: [PATCH 076/105] Removed conflict header from git conflicts --- mods/solubility.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/solubility.js b/mods/solubility.js index 95aefb36..64400bad 100644 --- a/mods/solubility.js +++ b/mods/solubility.js @@ -54,7 +54,7 @@ dependOn("orchidslibrary.js", ()=>{ } if(r.tempMax && !((p1.temp <= r.tempMax) && (p2.temp <= r.tempMax))){ return false; - <<<<<<<<< } + } if(r.charged && !(p1.charge || p2.charge)){ return false; } From 626d4b8ec8734a2b79a899bc709a4760343b7bb6 Mon Sep 17 00:00:00 2001 From: TaterbobYT <167204207+TaterbobYT@users.noreply.github.com> Date: Tue, 28 Oct 2025 05:38:12 -0500 Subject: [PATCH 077/105] Update mod list --- mod-list.html | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/mod-list.html b/mod-list.html index 6777ef38..9055dcad 100644 --- a/mod-list.html +++ b/mod-list.html @@ -408,6 +408,7 @@ thiquovite.jsThiquovite and wall buildersCharsonBurensen triggerable_random_powders.jsPowders with different abilities, such as heating and coolingAlice troll.jsVarious dumb elements that iterate randomly on the entire screenAlice +war.jsadds two countries that fight over land and waterTaterbob WhisperingTheory.jsPowder and gas variant of heater and coolerkaeud @@ -527,4 +528,4 @@ - + From a50f4dc380b5b2d60d57653624147c6688329995 Mon Sep 17 00:00:00 2001 From: TaterbobYT <167204207+TaterbobYT@users.noreply.github.com> Date: Tue, 28 Oct 2025 05:43:56 -0500 Subject: [PATCH 078/105] Create war.js Yeah --- mods/war.js | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 mods/war.js diff --git a/mods/war.js b/mods/war.js new file mode 100644 index 00000000..967d5767 --- /dev/null +++ b/mods/war.js @@ -0,0 +1,51 @@ +elements.land = { +color: "#096600", +category: "war", +behavior: behaviors.WALL, +}; +elements.red = { +name: "redville", +color: "#880000", +category: "war", +behavior: [ +"XX|CH:land>red%50 AND CH:blu>land%25 AND CH:kerdly>suselle%5|XX", +"CH:land>red%50 AND CH:blu>land%25 AND CH:kerdly>suselle%5|XX|CH:land>red%50 AND CH:blu>land%25 AND CH:kerdly>suselle%5", +"XX|CH:land>red%50 AND CH:blu>land%25 AND CH:kerdly>suselle%5|XX", +], +}; +elements.blu = { +name: "blue city", +color: "#000088", +category: "war", +behavior: [ +"XX|CH:land>blu%50 AND CH:red>land%25 AND CH:kerdly>kralsei%5|XX", +"CH:land>blu%50 AND CH:red>land%25 AND CH:kerdly>kralsei%5|XX|CH:land>blu%50 AND CH:red>land%25 AND CH:kerdly>kralsei%5", +"XX|CH:land>blu%50 AND CH:red>land%25 AND CH:kerdly>kralsei%5|XX", +], +}; +elements.kerdly = { +name: "water", +category: "war", +color: "#5599ff", +behavior: behaviors.WALL, +}; +elements.suselle = { +name: "redville water", +category: "war", +color: "#7777dd", +behavior: [ +"XX|CH:land>red%50 AND CH:blu>land%25 AND CH:kerdly>suselle%5 AND CH:kralsei>suselle%1|XX", +"CH:land>red%50 AND CH:blu>land%25 AND CH:kerdly>suselle%5 AND CH:kralsei>suselle%1|XX|CH:land>red%50 AND CH:blu>land%25 AND CH:kerdly>suselle%5 AND CH:kralsei>suselle%1", +"XX|CH:land>red%50 AND CH:blu>land%25 AND CH:kerdly>suselle%5 AND CH:kralsei>suselle%1|XX", +], +}; +elements.kralsei = { +name: "blue city water", +category: "war", +color: "#3377ff", +behavior: [ +"XX|CH:land>blu%50 AND CH:red>land%25 AND CH:kerdly>kralsei%5 AND CH:suselle>kralsei%1|XX", +"CH:land>blu%50 AND CH:red>land%25 AND CH:kerdly>kralsei%5 AND CH:suselle>kralsei%1|XX|CH:land>blu%50 AND CH:red>land%25 AND CH:kerdly>kralsei%5 AND CH:suselle>kralsei%1", +"XX|CH:land>blu%50 AND CH:red>land%25 AND CH:kerdly>kralsei%5 AND CH:suselle>kralsei%1|XX", +], +}; From 5ff4e96d3a700cf678462fd5034a9436ba5f7295 Mon Sep 17 00:00:00 2001 From: slweeb <91897291+slweeb@users.noreply.github.com> Date: Tue, 28 Oct 2025 07:41:58 -0400 Subject: [PATCH 079/105] Update mod-list.html --- mod-list.html | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/mod-list.html b/mod-list.html index 9055dcad..6777ef38 100644 --- a/mod-list.html +++ b/mod-list.html @@ -408,7 +408,6 @@ thiquovite.jsThiquovite and wall buildersCharsonBurensen triggerable_random_powders.jsPowders with different abilities, such as heating and coolingAlice troll.jsVarious dumb elements that iterate randomly on the entire screenAlice -war.jsadds two countries that fight over land and waterTaterbob WhisperingTheory.jsPowder and gas variant of heater and coolerkaeud @@ -528,4 +527,4 @@ - + From eef7fb9756bc2615ca72177e6b9f981510af0d4b Mon Sep 17 00:00:00 2001 From: Alexthetransfem <124483815+theenchantedsword@users.noreply.github.com> Date: Wed, 29 Oct 2025 15:57:45 -0500 Subject: [PATCH 080/105] Faster and more random generation By replacing a for loop with Math.log(), it is able to generate a world in ~3 or less seconds compared to the 20+ seconds using a loop. additionally, the use of pseudorandom within the parameters of another pseudorandom function makes it appear more random and unpredictable. --- mods/PRNGworldgenlib.js | 64 ++++++++++++++++++++++++++--------------- 1 file changed, 41 insertions(+), 23 deletions(-) diff --git a/mods/PRNGworldgenlib.js b/mods/PRNGworldgenlib.js index 39aa13d3..ecb610b1 100644 --- a/mods/PRNGworldgenlib.js +++ b/mods/PRNGworldgenlib.js @@ -1,11 +1,7 @@ -/*Version 1.0.0 Pseudorandom world generator*/ -function pseudorandom(key, max = 10){ - let num = max; - for(let i = 0; i < key; i++){ - num = ((num+(max*0.6))**1.8312312-2) % (max+1); - } - return num; -} +/*Version 1.1.0 Pseudorandom world generator*/ +function pseudorandom(key, num, max = 1){ + return (Math.log(key)*(num*Math.log(1625.4986772154357))) % max; +}; eLists.STONEELEMS = ["rock", "gravel", "tuff", "basalt", "rock_wall"]; let oreChances = { diamond: 0.045, @@ -31,13 +27,17 @@ class biome { if(!paused){togglePause();} let fraction = seed/(2**32); for(let level of this.yLevels){ - for(let x = 0; x <= width; x++){ - let heightIncrease = (fraction < 0.5) ? -3*(pseudorandom(((1-fraction)*x)*100)/11) : 3*(pseudorandom((fraction*x)*100)/11); + for(let x = 0; x <= width+2; x++){ + //console.log(x); + let heightIncrease = (fraction < 0.5) ? -3*pseudorandom(((1-fraction)*(x+1))*(100*pseudorandom(x, 1241, 500)), 1) : 3*pseudorandom(((fraction)*(x+1))*(100*pseudorandom(x, 1241, 500)), 1); let h = level + heightIncrease; for(let y = 0; y <= h; y++){ + //console.log(x,y); let elementsArr = this.layers[this.yLevels.indexOf(level)]; - let elem = elementsArr[Math.floor(((fraction < 0.5) ? elementsArr.length*pseudorandom(((1-fraction)*((x*y)*13))/11) : elementsArr.length*(pseudorandom((fraction*(x*y*17)))/11))%elementsArr.length)]; - let placed = tryCreate(elem, x, height-y); + let elem = elementsArr[Math.floor(elementsArr.length*pseudorandom((1-fraction)*pseudorandom((x+15)*(y+5), 65343, 500), 2) % elementsArr.length)] || elementsArr[0]; + //if(x == 0 || x == 1){console.log(elem);}; + let placed = tryCreate(elem, x-2, height-y); + if(placed != null && this.temp != null){ placed.temp = this.temp; } @@ -75,9 +75,9 @@ class biome { generateOreVeins(seed, multi = 1){ for(let x = 0; x <= width; x++){ for(let y = 0; y <= height; y++){ - let c = pseudorandom((seed/2**32)*x*y)/11; + let c = pseudorandom((seed/2**32)*pseudorandom(x*y, 657345, 600), 3); if(c <= 0.3){ - let c2 = pseudorandom((seed/2**32)*(x*y)*3)/11; + let c2 = pseudorandom((seed/2**32)*pseudorandom(x*y, 98755, 750), 4); let ore; for(let e in oreChances){ if(c2 <= oreChances[e]){ @@ -96,11 +96,11 @@ class biome { x2 += coords[0]; y2 += coords[1]; let p2 = getPixel(x2,y2); - if(p2 != null && eLists.STONEELEMS.includes(p2.element) && (pseudorandom((seed/2**32)*x2*y2)/11) < (0.35*multi)){ + if(p2 != null && eLists.STONEELEMS.includes(p2.element) && (pseudorandom((seed/2**32)*pseudorandom(x2,y2, 350), x2*y2) < (0.35*multi))){ hasStone = true; tryCreate(ore, x2, y2, true); } - if((pseudorandom((seed/2**32)*(x2*y2)*8)/11) < 0.15){ + if(pseudorandom((seed/2**32)*x2*y2, 6) < 0.15){ a = false; break; } @@ -128,7 +128,7 @@ enabledMods.forEach((item)=>{ biomes.orchard = new biome([["rock","rock","rock","gravel"], ["dirt", "dirt", "dirt", "rock", "gravel"], ["dirt", "dirt", "dirt", "dirt", "mud", "clay_soil", "gravel"]], [25, 30, 38], {afterFunc: (seed)=>{ for(let i = 0; i < width; i++){ console.log(i, width); - let elem = ((pseudorandom((seed/2**32)*i)/11) < 0.15) ? plants.tree[(Math.round(Math.random()*plants.tree.length)) % plants.tree.length] : "grass"; + let elem = (pseudorandom((seed/2**32)*pseudorandom(i, 6544, 500), 7) < 0.15) ? plants.tree[(Math.round(Math.random()*plants.tree.length)) % plants.tree.length] : "grass"; if(elem != undefined && elem != "grass"){elem += "_seed"}; elem = (elem == undefined) ? "apple_seed" : elem; tryCreate(elem, i, 42); @@ -140,15 +140,33 @@ elements.PRNGgenerate = { category: "tools", onSelect: function(){ let arr = []; + let txt = shiftDown; 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 = (i != null && i.toLowerCase() == "c") ? seed : parseFloat(i) || Math.random()*(2**32); seed = seed % (2**32); - promptChoose("", arr, (choice)=>{ - biomes[choice].generate(seed); - promptText("World generation complete."); - selectElement('dirt'); - }, "Select a biome to generate: "); + if(!txt){ + promptChoose("", arr, (choice)=>{ + biomes[choice].generate(seed); + promptText("World generation complete."); + selectElement('dirt'); + }, "Select a biome to generate: "); + } else { + let str = ""; + for(let key in biomes){ + str += `${key},`; + } + str = str.replace(/^,|,$/g, ''); + promptInput("Enter the name of a biome (caps-insensetive) \nBiomes Available: " + str, function(inp){ + if(!arr.includes(inp.toLowerCase())){ + promptText("Invalid selection."); + }else { + biomes[inp.toLowerCase()].generate(seed); + promptText("World generation complete."); + selectElement('dirt'); + } + }, "Enter Biome") + } }, "Enter seed:"); } } From f342ecf551bafc7991124e0fa83837aaacfaee91 Mon Sep 17 00:00:00 2001 From: Vito Date: Thu, 30 Oct 2025 09:32:35 -0500 Subject: [PATCH 081/105] added automatic text input detection and vein multipliers --- mods/PRNGworldgenlib.js | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/mods/PRNGworldgenlib.js b/mods/PRNGworldgenlib.js index ecb610b1..14b110ab 100644 --- a/mods/PRNGworldgenlib.js +++ b/mods/PRNGworldgenlib.js @@ -118,9 +118,9 @@ class biome { } let biomes = { plains: new biome([["rock", "rock", "rock", "gravel"], ["dirt", "dirt", "dirt", "dirt", "mud", "gravel"], ["grass","flower_seed","grass","grass","grass","grass","sapling","grass","grass","grass","grass","grass","grass","grass","grass"]], [25, 38, 40]), - desert: new biome([["rock", "rock", "rock", "gravel"], ["rock", "packed_sand","rock", "packed_sand", "sand"], ["sand"], [null, null, null, null, null, null, null, null, null, "cactus"]], [17, 26, 40, 42]), - savanna: new biome([["rock", "rock", "rock", "gravel"], ["dirt", "dirt", "clay_soil", "dirt", "dirt"], ["grass",null,null, null, null, null, "sapling",null,null,null,null]], [25, 38, 40], {lc: ["#6fde26", "#8eed34", "#8cdb42", "#7bd12a", "#96e81c", "#a9e64e", "#a0d94c", "#a9d63e"], wc: ["#bdab7e", "#b09c6a", "#ab996d", "#998a63", "#917959", "#877051"]}), - tundra: new biome([["rock", "rock", "rock", "gravel"], ["dirt", "dirt", "rock", "permafrost"], ["permafrost", "permafrost", "permafrost", "permafrost", "permafrost", "permafrost", "ice", "snow"], [null,null,null,null,null,"pinecone",null,null,null,null,null,null]], [25, 30, 38, 40], {temp: -15}), + desert: new biome([["rock", "rock", "rock", "gravel"], ["rock", "packed_sand","rock", "packed_sand", "sand"], ["sand"], [null, null, null, null, null, null, null, null, null, "cactus"]], [17, 26, 40, 42], {vMulti: 1.2}), + savanna: new biome([["rock", "rock", "rock", "gravel"], ["dirt", "dirt", "clay_soil", "dirt", "dirt"], ["grass",null,null, null, null, null, "sapling",null,null,null,null]], [25, 38, 40], {lc: ["#6fde26", "#8eed34", "#8cdb42", "#7bd12a", "#96e81c", "#a9e64e", "#a0d94c", "#a9d63e"], wc: ["#bdab7e", "#b09c6a", "#ab996d", "#998a63", "#917959", "#877051"], vMulti: 1.5}), + tundra: new biome([["rock", "rock", "rock", "gravel"], ["dirt", "dirt", "rock", "permafrost"], ["permafrost", "permafrost", "permafrost", "permafrost", "permafrost", "permafrost", "ice", "snow"], [null,null,null,null,null,"pinecone",null,null,null,null,null,null]], [25, 30, 38, 40], {temp: -15, vMulti: 2}), } let seed = Math.random()*(2**32); enabledMods.forEach((item)=>{ @@ -141,7 +141,8 @@ elements.PRNGgenerate = { onSelect: function(){ let arr = []; let txt = shiftDown; - Object.keys(biomes).forEach(function(b){arr.push(b);}) + Object.keys(biomes).forEach(function(b){arr.push(b);}); + txt = (arr.length >= 7) ? true : txt; promptInput("Leave blank to generate new seed. Your current seed is: " + seed, function(i){ seed = (i != null && i.toLowerCase() == "c") ? seed : parseFloat(i) || Math.random()*(2**32); seed = seed % (2**32); From 88b2f45ac7e94045a13aaffd244935fea7bc90f0 Mon Sep 17 00:00:00 2001 From: ggodpl <46885632+ggodpl@users.noreply.github.com> Date: Sat, 1 Nov 2025 00:30:30 +0100 Subject: [PATCH 082/105] update elementsManager.js to the new dependency system --- mods/elementsManager.js | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/mods/elementsManager.js b/mods/elementsManager.js index 064f2df3..e118628e 100644 --- a/mods/elementsManager.js +++ b/mods/elementsManager.js @@ -1,4 +1,4 @@ -if (enabledMods.includes("mods/betterMenuScreens.js")) { +dependOn("betterMenuScreens.js", () => { const properties = { meta: [ {name: "name", type: "string", viewOnly: true, required: true}, @@ -1209,8 +1209,4 @@ if (enabledMods.includes("mods/betterMenuScreens.js")) { } runAfterLoadList.push(cssInject, loadChanges); -} else { - enabledMods.unshift("mods/betterMenuScreens.js"); - localStorage.setItem("enabledMods", JSON.stringify(enabledMods)); - window.location.reload(); -} +}, true); \ No newline at end of file From e776ea1ba1bd19e6be93406cb09bbd79abda17ee Mon Sep 17 00:00:00 2001 From: slweeb <91897291+slweeb@users.noreply.github.com> Date: Tue, 4 Nov 2025 11:50:42 -0500 Subject: [PATCH 083/105] GenTown! --- index.html | 4 ++-- presskit.html | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/index.html b/index.html index abba45f1..acefad53 100644 --- a/index.html +++ b/index.html @@ -19668,7 +19668,7 @@ window.onload = function() {
-