sandboxels/mods/scp.js

1303 lines
47 KiB
JavaScript
Raw Normal View History

window.addEventListener("load", () => {
document.getElementById("elementButton-mask_head")?.remove()
})
window.addEventListener("load", () => {
document.getElementById("elementButton-mask_body")?.remove()
})
window.addEventListener("load", () => {
document.getElementById("elementButton-008_meat")?.remove()
})
window.addEventListener("load", () => {
document.getElementById("elementButton-frozen_008_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-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 past this point
// also hi jonny ray
elements.anomalous_essence = {
hidden: true,
color: "#f7ead0",
behavior: behaviors.GAS,
category: "scp",
state: "gas",
density: 0.50,
};
elements.SCP_008 = {
color: "#11111f",
behavior: [
"M2|M1|M2",
"M1|XX|M1",
"M2|M1|M2",
],
reactions: {
"head": { elem1:null, elem2:"z_head" , chance:0.5 },
"body": { elem1:null, elem2:"z_body" , chance:0.5 },
"meat": { elem1:null, elem2:"008_meat" , chance:0.4 },
"rotten_meat": { elem1:null, elem2:"008_meat" , chance:0.5 },
"frozen_meat": { elem1:null, elem2:"frozen_008_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 },
2024-05-06 14:54:58 -04:00
"chlorine": { elem1: [null,null,null,null,null,null,null,null,"anomalous_essence"] , chance:0.01 },
"liquid_chlorine": { elem1: [null,null,null,null,null,null,null,null,"anomalous_essence"] , chance:0.01 },
"light": { elem1: [null,null,null,null,null,null,null,null,"anomalous_essence"] , chance:0.01 },
},
tempHigh: 750,
2024-05-06 14:54:58 -04:00
stateHigh: [null,null,null,null,null,null,null,null,"anomalous_essence"],
tempLow: -100,
stateLow: "frozen_008",
category: "scp",
state: "gas",
density: 100,
},
elements.frozen_008 = {
color: "#242424",
behavior: [
"XX|XX|XX",
"XX|DL%0.001|X",
"M2%1.0|M1%1.0|M2%1.0",
],
reactions: {
"head": { elem1:null, elem2:"z_head" , chance:0.4 },
"body": { elem1:null, elem2:"z_body" , chance:0.4 },
"meat": { elem1:null, elem2:"frozen_008_meat" , chance:0.4 },
"rotten_meat": { elem1:null, elem2:"frozen_008_meat" , chance:0.5 },
"frozen_meat": { elem1:null, elem2:"frozen_008_meat" , chance:0.4 },
2024-05-06 14:54:58 -04:00
"chlorine": { elem1: [null,null,null,null,null,null,null,null,"anomalous_essence"] , chance:0.01 },
"liquid_chlorine": { elem1: [null,null,null,null,null,null,null,null,"anomalous_essence"] , chance:0.01 },
"light": { elem1: [null,null,null,null,null,null,null,null,"anomalous_essence"] , chance:0.01 },
},
temp: -50,
tempHigh: 0,
stateHigh: "SCP_008",
category: "scp",
state: "solid",
density: 95,
},
elements.008_meat = {
color: ["#b8b165","#b89765"],
behavior: [
"XX|CR:plague,stench,stench,SCP_008,fly%0.25 AND CH:rotten_meat,meat>008_meat%1|XX",
"SP%99 AND CH:rotten_meat,meat>008_meat%1|XX|SP%99 AND CH:rotten_meat,meat>008_meat%1",
"XX|M1 AND CH:rotten_meat,meat>008_meat%1|XX",
],
reactions: {
"water": { elem2:"dirty_water" },
"salt_water": { elem2:"dirty_water" },
"sugar_water": { elem2:"dirty_water" },
"dirty_water": { elem2:"broth", tempMin:70, color2:"#d7db69" },
"seltzer": { elem2:"dirty_water" },
"fly": { elem1: [null,null,"SCP_008"] , elem2: ["dead_bug","dead_bug","SCP_008"] , chance:0.2},
},
tempHigh: 300,
stateHigh: ["SCP_008","ash","ammonia"],
tempLow: -20,
stateLow: "frozen_008_meat",
category:"scp",
hidden: true,
burn:12,
burnTime:200,
burnInto:["SCP_008","ash","ammonia"],
state: "solid",
density: 1005,
conduct: 0.1,
isFood: true
},
elements.frozen_008_meat = {
color: "#242424",
behavior: [
"XX|CH:rotten_meat,frozen_meat>frozen_008_meat%1|XX",
"SP%99 AND CH:rotten_meat,frozen_meat>frozen_008_meat%1|XX|SP%99 AND CH:rotten_meat,frozen_meat>frozen_008_meat%1",
"XX|M1 AND CH:rotten_meat,frozen_meat>frozen_008_meat%1|XX",
],
reactions: {
"water": { elem2:"dirty_water" },
"salt_water": { elem1:"008_meat",elem2:"dirty_water" , chance:0.5 },
"sugar_water": { elem2:"dirty_water" },
"seltzer": { elem2:"dirty_water" },
"fly": { elem2: ["dead_bug","dead_bug","SCP_008"] , chance:0.2},
},
temp: -20,
tempHigh: 10,
stateHigh: "008_meat",
category:"scp",
hidden: true,
state: "solid",
density: 1005,
conduct: 0.05,
},
elements.possessive_mask = {
color: ["#f7ead0","#faf9f6","#e9e6db"],
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",
],
breakInto: ["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]);
}
}
}
}
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;
}
}
}
},
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
},
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",
],
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
}
}
// 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 }
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; }
}
},
elements.black_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",
],
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"],
reactions: {
"caustic_potash": { elem1:null, elem2:"potassium_salt" },
"water": { elem1:null, elem2:"dirty_water" },
"salt_water": { elem1:null, elem2:"water" },
"sugar_water": { elem1:null, elem2:"water" },
"pool_water": { elem1:null, elem2:"water" },
"plant": { elem1:null, elem2:"dead_plant" },
"tree_branch": { elem1:null, elem2:"wood" },
"charcoal": { elem1:null, elem2:"carbon_dioxide" },
"rock": { elem1:null, elem2:"sand", chance:0.05 },
"baking_soda": { elem1:null, elem2:["carbon_dioxide","foam"] },
"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 },
"copper": { elem1:null, elem2: null , chance:0.02 },
"gold": { elem1:null, elem2: null , chance:0.02 },
"porcelain": { elem1:null, elem2: null , chance:0.01 },
"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 },
"silver": { elem1:null, elem2: null , chance:0.02 },
"nickel": { elem1:null, elem2: null , chance:0.02 },
"calcium": { elem1:null, elem2: null , chance:0.02 },
"iron": { elem1:null, elem2: null , chance:0.02 },
"steel": { elem1:null, elem2: null , chance:0.02 },
"concrete": { elem1:null, elem2: null , chance:0.05 },
"rock": { elem1:null, elem2: null , chance:0.04 },
"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": { 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 },*/
},
category: "scp",
tempHigh: 1000,
stateHigh: null,
tempLow: -58.88,
burn: 30,
burnTime: 10,
2024-05-06 14:54:58 -04:00
burnInto: ["fire","fire","fire","fire","fire","fire","fire","fire","ash","ash","fire","fire","fire","fire","ash","ash","anomalous_essence"],
fireColor: "#111111",
state: "liquid",
density: 1105,
stain: 0.5,
},
elements.SCP_055 = {
color: "#00000f",
excludeRandom: true,
behavior: [
["XX","XX","XX"],
["XX","CH:REDACTED","XX"],
["XX","XX","XX"]
],
category: "scp",
state: "solid",
tempHigh: 55055055055,
2024-05-06 14:54:58 -04:00
stateHigh: ["metal_scrap","metal_scrap","smoke","smoke","smoke","smoke","smoke","smoke","smoke",null,"anomalous_essence"],
},
elements.REDACTED = {
hidden: true,
color: "#00000f",
excludeRandom: true,
behavior: [
["XX","xx","XX"],
["XX","EX","XX"],
["XX","XX","XX"]
],
category: "scp",
state: "solid",
},
elements.plague_doctor = {
category: "scp",
color: ["#f7ead0","#faf9f6","#e9e6db"],
category: "scp",
properties: {
dead: false,
dir: 1,
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";
2024-05-03 16:56:38 -04:00
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","anomalous_essence"],
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","anomalous_essence"],
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","anomalous_essence"],
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","anomalous_essence"],
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) {
if (isEmpty(pixel.x, pixel.y+1)) {
createPixel("shy_body", pixel.x, pixel.y+1);
pixel.element = "shy_head";
}
else if (isEmpty(pixel.x, pixel.y-1)) {
createPixel("shy_head", pixel.x, pixel.y-1);
pixelMap[pixel.x][pixel.y-1].color = pixel.color;
pixel.element = "shy_body";
pixel.color = pixelColorPick(pixel)
}
else {
deletePixel(pixel.x, pixel.y);
}
},
related: ["shy_body","shy_head"],
cooldown: defaultCooldown
},
elements.shy_head = {
hidden: true,
color: ["#f7ead0","#faf9f6","#e9e6db"],
category: "scp",
2024-05-06 14:54:58 -04:00
breakInto: ["bone","bone","blood","bone","bone","blood","bone","bone","blood","bone","bone","blood","anomalous_essence"],
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,"bone");
return
}
}
// Find the body
if (!isEmpty(pixel.x, pixel.y+1, true) && pixelMap[pixel.x][pixel.y+1].element == "shy_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;
}
}
2024-05-06 15:25:23 -04:00
}
if (!isEmpty(pixel.x+2, pixel.y, true) && pixelMap[pixel.x+2][pixel.y].element == "head") {
var target = pixelMap[pixel.x+2][pixel.y];
if (target.dead) { // If target is dead, ignore
var target = null;
}
else { body.panic += 0.1; }
}
else { var target = null }
if (target.dead) { // If target is dead, ignore
var target = null;
body.panic -= 0.1;
}
// homeostasis
if (pixel.temp > 37) { pixel.temp -= 1; }
else if (pixel.temp < 37) { pixel.temp += 1; }
},
density: 1070,
state: "solid",
conduct: .05,
tempHigh: 3500,
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 },
},
},
elements.shy_body = {
hidden: true,
color: ["#f7ead0","#faf9f6","#e9e6db"],
category: "scp",
2024-05-06 14:54:58 -04:00
breakInto: ["bone","bone","blood","bone","bone","blood","bone","bone","blood","bone","bone","blood","anomalous_essence"],
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 == "shy_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 == "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) {
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: 1080,
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 },
},
},
elements.SCP_682 = {
color: ["#424242","#75816B","#4D6B53"],
behavior: [
"M2%0.5|M2%0.3|M2%0.5",
"M1%10|XX|M1%10",
"XX|M1|XX",
],
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 },
},
state: "solid",
hardness: 1,
conduct: .1,
},
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",
],
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 },
},
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",
"M1%10 AND CH:concrete>dust AND DL:dust|CH:SCP_682%0.3|M1%10 AND CH:concrete>dust AND DL:dust",
"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:0.1 },
"dust": { elem2 : null , chance:0.1 },
},
hidden: true,
state: "solid",
hardness: 1,
conduct: .1,
},
// SCP-804 WIP template
/*
elements.SCP_804 = {
color:"#beigeish",
category: "scp",
excludeRandom: true,
state: "solid",
},
*/
elements.tickle_monster = {
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",
],
category: "scp",
density: 550,
reactions: {
"sugar_water": { elem2 : "water" , chance:0.2 },
"dirty_water": { elem2 : "water" , chance:0.2 },
"candy": { elem2 : null },
"sugar": { elem2 : null },
"sauce": { elem2 : null },
"salt": { elem2 : null , chance:0.2 },
"cheese": { elem2 : null , chance:0.2 },
"melted_cheese": { elem2 : null },
"baked_potato": { elem2 : null , chance:0.2 },
"mashed_potato": { elem2 : null , chance:0.2 },
"bread": { elem2 : null , chance:0.2 },
"toast": { elem2 : null , chance:0.2 },
"jelly": { elem2 : null },
"nut_butter": { elem2 : null },
"grape": { elem2 : null , chance:0.2 },
"ice_cream": { elem2 : null },
"juice": { elem2 : null },
"milk": { elem2 : null },
"gingerbread": { elem2 : null , chance:0.2 },
"crumb": { elem2 : null , chance:0.2 },
"cream": { elem2 : null },
"baked_batter": { elem2 : null },
"frozen_yogurt": { elem2 : null },
"yogurt": { elem2 : null },
"popcorn": { elem2 : null , chance:0.2 },
"chocolate": { elem2 : null },
"chocolate_milk": { elem2 : null },
"melted_chocolate": { elem2 : null },
"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 },
},
state: "liquid",
conduct: .5,
temp: 20,
tempHigh: 350,
stateHigh: ["smoke","smoke","smoke","slime","anomalous_essence"],
burn: .1,
burnTime: 300,
burnInto: ["smoke","smoke","smoke","slime","anomalous_essence"],
stain: 0.03,
},
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,
temp: 20,
tempHigh: 350,
stateHigh: ["smoke","smoke","smoke","slime","anomalous_essence"],
burn: .1,
burnTime: 300,
burnInto: ["smoke","smoke","smoke","slime","anomalous_essence"],
stain: 0.08,
};
// SCPs with ID over 999 here