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 1/5] 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 2/5] 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 3/5] 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 4/5] 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 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 5/5] 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