Merge pull request #1049 from DBNekonico/main

New Human Safety Mod
This commit is contained in:
slweeb 2025-03-16 17:45:44 -04:00 committed by GitHub
commit 32f097ff46
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 1944 additions and 311 deletions

View File

@ -3729,7 +3729,7 @@ elements.brain = {
if (!isEmpty(pixel.x, pixel.y-1, true)) {
var hitPixel = pixelMap[pixel.x][pixel.y-1]
doElectricity(hitPixel);
if (elements[hitPixel.element].id === elements.nerve.id && Math.random() > 0.75 && Math.random() > (1 - ((pixel.nutrition + pixel.oxygen + pixel.speed - pixel.alcoDepri) / 2050))) {
if (elements[hitPixel.element].id === elements.nerve.id && Math.random() > 0.75 && Math.random() > (1 - ((pixel.nutrition + pixel.oxygen + pixel.speed) / 2050))) {
pixel.chargeCD = 16
hitPixel.charge = 0.5
}
@ -3757,7 +3757,7 @@ elements.brain = {
hitPixel.darkcharge = true
}
}
if (elements[hitPixel.element].id === elements.nerve.id && Math.random() > 0.75 && Math.random() > (1 - ((pixel.nutrition + pixel.oxygen + pixel.speed - pixel.alcoDepri) / 2050))) {
if (elements[hitPixel.element].id === elements.nerve.id && Math.random() > 0.75 && Math.random() > (1 - ((pixel.nutrition + pixel.oxygen + pixel.speed) / 2050))) {
pixel.chargeCD = 16
hitPixel.charge = 0.5
}
@ -3768,7 +3768,7 @@ elements.brain = {
if (!isEmpty(pixel.x-1, pixel.y, true)) {
var hitPixel = pixelMap[pixel.x-1][pixel.y]
doElectricity(hitPixel);
if (elements[hitPixel.element].id === elements.nerve.id && Math.random() > 0.75 && Math.random() > (1 - ((pixel.nutrition + pixel.oxygen + pixel.speed - pixel.alcoDepri) / 2050))) {
if (elements[hitPixel.element].id === elements.nerve.id && Math.random() > 0.75 && Math.random() > (1 - ((pixel.nutrition + pixel.oxygen + pixel.speed) / 2050))) {
pixel.chargeCD = 16
hitPixel.charge = 0.5
}
@ -3779,7 +3779,7 @@ elements.brain = {
if (!isEmpty(pixel.x+1, pixel.y, true)) {
var hitPixel = pixelMap[pixel.x+1][pixel.y]
doElectricity(hitPixel);
if (elements[hitPixel.element].id === elements.nerve.id && Math.random() > 0.75 && Math.random() > (1 - ((pixel.nutrition + pixel.oxygen + pixel.speed - pixel.alcoDepri) / 2050))) {
if (elements[hitPixel.element].id === elements.nerve.id && Math.random() > 0.75 && Math.random() > (1 - ((pixel.nutrition + pixel.oxygen + pixel.speed) / 2050))) {
pixel.chargeCD = 16
hitPixel.charge = 0.5
}
@ -3920,7 +3920,7 @@ elements.hypothalamus = {
if (!isEmpty(pixel.x, pixel.y-1, true)) {
var hitPixel = pixelMap[pixel.x][pixel.y-1]
doElectricity(hitPixel);
if (elements[hitPixel.element].id === elements.nerve.id && Math.random() > 0.75 && Math.random() > (1 - ((pixel.nutrition + pixel.oxygen + pixel.speed - pixel.alcoDepri) / 2050))) {
if (elements[hitPixel.element].id === elements.nerve.id && Math.random() > 0.75 && Math.random() > (1 - ((pixel.nutrition + pixel.oxygen + pixel.speed) / 2050))) {
pixel.chargeCD = 16
hitPixel.charge = 0.5
}
@ -3931,7 +3931,7 @@ elements.hypothalamus = {
if (!isEmpty(pixel.x, pixel.y+1, true)) {
var hitPixel = pixelMap[pixel.x][pixel.y+1]
doElectricity(hitPixel);
if (elements[hitPixel.element].id === elements.nerve.id && Math.random() > 0.75 && Math.random() > (1 - ((pixel.nutrition + pixel.oxygen + pixel.speed - pixel.alcoDepri) / 2050))) {
if (elements[hitPixel.element].id === elements.nerve.id && Math.random() > 0.75 && Math.random() > (1 - ((pixel.nutrition + pixel.oxygen + pixel.speed) / 2050))) {
pixel.chargeCD = 16
hitPixel.charge = 0.5
}
@ -3942,7 +3942,7 @@ elements.hypothalamus = {
if (!isEmpty(pixel.x-1, pixel.y, true)) {
var hitPixel = pixelMap[pixel.x-1][pixel.y]
doElectricity(hitPixel);
if (elements[hitPixel.element].id === elements.nerve.id && Math.random() > 0.75 && Math.random() > (1 - ((pixel.nutrition + pixel.oxygen + pixel.speed - pixel.alcoDepri) / 2050))) {
if (elements[hitPixel.element].id === elements.nerve.id && Math.random() > 0.75 && Math.random() > (1 - ((pixel.nutrition + pixel.oxygen + pixel.speed) / 2050))) {
pixel.chargeCD = 16
hitPixel.charge = 0.5
}
@ -3953,7 +3953,7 @@ elements.hypothalamus = {
if (!isEmpty(pixel.x+1, pixel.y, true)) {
var hitPixel = pixelMap[pixel.x+1][pixel.y]
doElectricity(hitPixel);
if (elements[hitPixel.element].id === elements.nerve.id && Math.random() > 0.75 && Math.random() > (1 - ((pixel.nutrition + pixel.oxygen + pixel.speed - pixel.alcoDepri) / 2050))) {
if (elements[hitPixel.element].id === elements.nerve.id && Math.random() > 0.75 && Math.random() > (1 - ((pixel.nutrition + pixel.oxygen + pixel.speed) / 2050))) {
pixel.chargeCD = 16
hitPixel.charge = 0.5
}

View File

@ -125,7 +125,7 @@ elements.microplastic_water = {
"mudstone": { elem2: ["mud","mud","clay"], chance: 0.00035 },
"glass_shard": { elem2: "glass_pebble", color2:"#7BAECB", chance: 0.0005 },
"rad_shard": { elem2: "glass_pebble", color2:"#AECB83", chance: 0.00025 },
"glass": { elem2: "glass_pebble", color2:"#7BAECB", chance: 0.00005 },
"glass": { elem2: "glass_pebble", color2:"#7BAECB", chance: 0.0000025 },
"rad_glass": { elem2: "glass_pebble", color2:"#AECB83", chance: 0.000025 },
"rust": { elem1:"dirty_water", elem2: "rust_dust", chance: 0.0025 },
"plastic": { elem2: ["microplastic",null,null], chance: 0.00005 },
@ -186,6 +186,7 @@ elements.silver_debris = {
color: "#cacaca",
behavior: behaviors.SUPPORT,
tempHigh: 961.8,
stateHigh: "molten_silver",
category: "powders",
density: 9297,
conduct: 0.99,
@ -216,6 +217,7 @@ elements.iron_debris = {
},
breakInto: "iron_dust",
tempHigh: 1538,
stateHigh: "molten_iron",
category: "powders",
density: 7660,
conduct: 0.47,
@ -248,6 +250,7 @@ elements.steel_debris = {
},
breakInto: "iron_debris",
tempHigh: 1455.5,
stateHigh: "molten_steel",
category: "powders",
density: 7750,
conduct: 0.42,
@ -1060,7 +1063,7 @@ elements.water.reactions.glass_shard = { elem2: "glass_pebble", color2:"#7BAECB"
elements.water.reactions.rad_shard = { elem2: "glass_pebble", color2:"#AECB83", chance: 0.00025 }
elements.water.reactions.glass = { elem2: "glass_pebble", color2:"#7BAECB", chance: 0.00005 }
elements.water.reactions.glass = { elem2: "glass_pebble", color2:"#7BAECB", chance: 0.0000025 }
elements.water.reactions.rad_glass = { elem2: "glass_pebble", color2:"#AECB83", chance: 0.000025 }
@ -1068,7 +1071,7 @@ elements.water.reactions.rust = { elem1:"dirty_water", elem2: "rust_dust", chanc
elements.water.reactions.rust_dust = { elem1:"dirty_water", chance: 0.0025 }
elements.water.reactions.plastic = { elem1: "microplastic_water", elem2: ["microplastic",null,null], chance: 0.00005 }
elements.water.reactions.plastic = { elem1: "microplastic_water", elem2: ["microplastic",null,null], chance: 0.000005 }
elements.salt_water.reactions.mudstone = { elem2: ["mud","mud","clay"], chance: 0.00035 }
@ -1076,7 +1079,7 @@ elements.salt_water.reactions.glass_shard = { elem2: "glass_pebble", color2:"#7B
elements.salt_water.reactions.rad_shard = { elem2: "glass_pebble", color2:"#AECB83", chance: 0.00025 }
elements.salt_water.reactions.glass = { elem2: "glass_pebble", color2:"#7BAECB", chance: 0.00005 }
elements.salt_water.reactions.glass = { elem2: "glass_pebble", color2:"#7BAECB", chance: 0.0000025 }
elements.salt_water.reactions.rad_glass = { elem2: "glass_pebble", color2:"#AECB83", chance: 0.000025 }
@ -1084,7 +1087,7 @@ elements.salt_water.reactions.rust = { elem1:"dirty_water", elem2: "rust_dust",
elements.salt_water.reactions.rust_dust = { elem1:"dirty_water", chance: 0.0025 }
elements.salt_water.reactions.plastic = { elem1: "microplastic_water", elem2: ["microplastic",null,null], chance: 0.00005 }
elements.salt_water.reactions.plastic = { elem1: "microplastic_water", elem2: ["microplastic",null,null], chance: 0.000005 }
elements.sugar_water.reactions.mudstone = { elem2: ["mud","mud","clay"], chance: 0.00035 }
@ -1092,7 +1095,7 @@ elements.sugar_water.reactions.glass_shard = { elem2: "glass_pebble", color2:"#7
elements.sugar_water.reactions.rad_shard = { elem2: "glass_pebble", color2:"#AECB83", chance: 0.00025 }
elements.sugar_water.reactions.glass = { elem2: "glass_pebble", color2:"#7BAECB", chance: 0.00005 }
elements.sugar_water.reactions.glass = { elem2: "glass_pebble", color2:"#7BAECB", chance: 0.0000025 }
elements.sugar_water.reactions.rad_glass = { elem2: "glass_pebble", color2:"#AECB83", chance: 0.000025 }
@ -1100,7 +1103,7 @@ elements.sugar_water.reactions.rust = { elem1:"dirty_water", elem2: "rust_dust",
elements.sugar_water.reactions.rust_dust = { elem1:"dirty_water", chance: 0.0025 }
elements.sugar_water.reactions.plastic = { elem1: "microplastic_water", elem2: ["microplastic",null,null], chance: 0.00005 }
elements.sugar_water.reactions.plastic = { elem1: "microplastic_water", elem2: ["microplastic",null,null], chance: 0.000005 }
elements.dirty_water.reactions.mudstone = { elem2: ["mud","mud","clay"], chance: 0.00035 }
@ -1108,13 +1111,13 @@ elements.dirty_water.reactions.glass_shard = { elem2: "glass_pebble", color2:"#7
elements.dirty_water.reactions.rad_shard = { elem2: "glass_pebble", color2:"#AECB83", chance: 0.00025 }
elements.dirty_water.reactions.glass = { elem2: "glass_pebble", color2:"#7BAECB", chance: 0.00005 }
elements.dirty_water.reactions.glass = { elem2: "glass_pebble", color2:"#7BAECB", chance: 0.0000025 }
elements.dirty_water.reactions.rad_glass = { elem2: "glass_pebble", color2:"#AECB83", chance: 0.000025 }
elements.dirty_water.reactions.rust = { elem1:"dirty_water", elem2: "rust_dust", chance: 0.0025 }
elements.dirty_water.reactions.plastic = { elem1: "microplastic_water", elem2: ["microplastic",null,null], chance: 0.00005 }
elements.dirty_water.reactions.plastic = { elem1: "microplastic_water", elem2: ["microplastic",null,null], chance: 0.000005 }
elements.smash.tool = function(pixel) {
let old = pixel.element;

View File

@ -0,0 +1,899 @@
elements.human.tick = function(pixel) {
if (isEmpty(pixel.x, pixel.y+1)) {
createPixel("body", pixel.x, pixel.y+1);
var color = pixel.color;
changePixel(pixel,"head");
pixel.color = color;
if (pixel.bodyColor) {
pixelMap[pixel.x][pixel.y+1].color = pixel.bodyColor;
}
}
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");
if (pixel.bodyColor) {
pixel.color = pixel.bodyColor;
}
}
}
elements.body.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") {
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") {
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.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" && 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.portal_in.tick = function(pixel) {
// if (Math.random() > 0.1) return;
if (!ticktemp.portal_out) ticktemp.portal_out = {};
let channel = parseInt(pixel.channel) || 0;
if (!ticktemp.portal_out[channel]) {
ticktemp.portal_out[channel] = currentPixels.filter((p) => {
return elements[p.element].id === elements.portal_out.id && (
isEmpty(p.x,p.y+1) || isEmpty(p.x,p.y-1) ||
isEmpty(p.x+1,p.y) || isEmpty(p.x-1,p.y)
) &&
(parseInt(p.channel) || 0) === parseInt(channel)
});
}
if (ticktemp.portal_out[channel].length) {
shuffleArray(squareCoordsShuffle);
let r;
for (var i = 0; i < squareCoordsShuffle.length; i++) {
var coord = squareCoordsShuffle[i];
var x = pixel.x+coord[0];
var y = pixel.y+coord[1];
if (!isEmpty(x,y,true) && elements[pixelMap[x][y].element].movable) {
r = pixelMap[x][y];
break;
}
}
if (r !== undefined || pixel.charge) {
let portal_out = choose(ticktemp.portal_out[channel]);
if (portal_out.del) return;
if (r !== undefined) {
shuffleArray(squareCoordsShuffle);
for (var j = 0; j < squareCoordsShuffle.length; j++) {
var coord2 = squareCoordsShuffle[j];
var x2 = portal_out.x+coord2[0];
var y2 = portal_out.y+coord2[1];
if (isEmpty(x2,y2) && r.element !== "head" && r.element !== "body") {
tryMove(r,x2,y2);
}
else if (isEmpty(x2,y2) && (r.element === "head" || r.element === "body")) {
if (r.element === "head" && !isEmpty(r.x,r.y+1)) {
if (pixelMap[r.x][r.y+1].element === "body") {
r.element = "human"
r.bodyColor = pixelMap[r.x][r.y+1].color
deletePixel(r.x,r.y+1)
tryMove(r,x2,y2);
}
else {
tryMove(r,x2,y2);
}
}
else if (r.element === "body" && !isEmpty(r.x,r.y-1)) {
if (pixelMap[r.x][r.y-1].element === "head") {
r.element = "human"
r.bodyColor = r.color
r.color = pixelMap[r.x][r.y-1].color
deletePixel(r.x,r.y-1)
tryMove(r,x2,y2);
}
else {
tryMove(r,x2,y2);
}
}
}
break;
}
}
if (pixel.charge && !portal_out.charge && !portal_out.chargeCD) {
portal_out.charge = pixel.charge;
}
}
};
doElectricity(pixel);
}
elements.pipe.tick = function(pixel) {
if (!pixel.stage && pixelTicks-pixel.start > 60) {
for (var i = 0; i < squareCoords.length; i++) {
var coord = squareCoords[i];
var x = pixel.x+coord[0];
var y = pixel.y+coord[1];
if (!isEmpty(x,y,true) && elements[pixelMap[x][y].element].movable) {
deletePixel(x,y)
}
if (isEmpty(x,y)) {
createPixel("pipe_wall",x,y);
}
}
pixel.stage = 1;
}
else if (pixel.stage === 1 && pixelTicks-pixel.start > 70) { //uninitialized
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)) {
pixel.stage = 2; //blue
pixel.color = pixelColorPick(pixel,"#000036");
break;
}
}
}
else if (pixel.stage > 1 && pixelTicks % 3 === pixel.stage-2) { //initialized
for (var i = 0; i < squareCoords.length; i++) {
var coord = squareCoords[i];
var x = pixel.x+coord[0];
var y = pixel.y+coord[1];
if (!isEmpty(x,y,true) && pixelMap[x][y].element === "pipe") {
var newPixel = pixelMap[x][y];
if (newPixel.stage === 1) {
var newColor;
switch (pixel.stage) {
case 2: newPixel.stage = 3; newColor = "#003600"; break; //green
case 3: newPixel.stage = 4; newColor = "#360000"; break; //red
case 4: newPixel.stage = 2; newColor = "#000036"; break; //blue
}
newPixel.color = pixelColorPick(newPixel,newColor);
}
}
}
var moved = false;
shuffleArray(squareCoordsShuffle);
for (var i = 0; i < squareCoordsShuffle.length; i++) {
var coord = squareCoordsShuffle[i];
var x = pixel.x+coord[0];
var y = pixel.y+coord[1];
if (!isEmpty(x,y,true)) {
var newPixel = pixelMap[x][y];
if (newPixel.element === "pipe") {
var nextStage;
switch (pixel.stage) {
case 2: nextStage = 4; break; //green
case 3: nextStage = 2; break; //red
case 4: nextStage = 3; break; //blue
}
if (pixel.con && !newPixel.con && newPixel.stage === nextStage) { //transfer to adjacent pipe
newPixel.con = pixel.con;
newPixel.con.x = newPixel.x;
newPixel.con.y = newPixel.y;
pixel.con = null;
moved = true;
break;
}
}
else if (!pixel.con && elements[newPixel.element].movable && newPixel.element !== "head" && newPixel.element !== "body") { //suck up pixel
pixel.con = newPixel;
deletePixel(newPixel.x,newPixel.y);
pixel.con.x = pixel.x;
pixel.con.y = pixel.y;
pixel.con.del;
moved = true;
break;
}
else if (!pixel.con && elements[newPixel.element].movable && (newPixel.element === "head" || newPixel.element === "body")) {
if (newPixel.element === "head") {
if (!isEmpty(newPixel.x,newPixel.y+1)) {
if (pixelMap[newPixel.x][newPixel.y+1].element === "body") {
newPixel.element = "human"
newPixel.bodyColor = pixelMap[newPixel.x][newPixel.y+1].color
deletePixel(newPixel.x,newPixel.y+1)
pixel.con = newPixel;
deletePixel(newPixel.x,newPixel.y);
pixel.con.x = pixel.x;
pixel.con.y = pixel.y;
pixel.con.del;
moved = true;
break;
}
else {
pixel.con = newPixel;
deletePixel(newPixel.x,newPixel.y);
pixel.con.x = pixel.x;
pixel.con.y = pixel.y;
pixel.con.del;
moved = true;
break;
}
}
else {
pixel.con = newPixel;
deletePixel(newPixel.x,newPixel.y);
pixel.con.x = pixel.x;
pixel.con.y = pixel.y;
pixel.con.del;
moved = true;
break;
}
}
else if (newPixel.element === "body") {
if (!isEmpty(newPixel.x,newPixel.y-1)) {
if (pixelMap[newPixel.x][newPixel.y-1].element === "head") {
newPixel.element = "human"
newPixel.bodyColor = newPixel.color
newPixel.color = pixelMap[newPixel.x][newPixel.y-1].color
deletePixel(newPixel.x,newPixel.y-1)
pixel.con = newPixel;
deletePixel(newPixel.x,newPixel.y);
pixel.con.x = pixel.x;
pixel.con.y = pixel.y;
pixel.con.del;
moved = true;
break;
}
else {
pixel.con = newPixel;
deletePixel(newPixel.x,newPixel.y);
pixel.con.x = pixel.x;
pixel.con.y = pixel.y;
pixel.con.del;
moved = true;
break;
}
}
else {
pixel.con = newPixel;
deletePixel(newPixel.x,newPixel.y);
pixel.con.x = pixel.x;
pixel.con.y = pixel.y;
pixel.con.del;
moved = true;
break;
}
}
else {
pixel.con = newPixel;
deletePixel(newPixel.x,newPixel.y);
pixel.con.x = pixel.x;
pixel.con.y = pixel.y;
pixel.con.del;
moved = true;
break;
}
}
}
}
if (pixel.con && !moved) { // move to same stage if none other
for (var i = 0; i < squareCoordsShuffle.length; i++) {
var coord = squareCoordsShuffle[i];
var x = pixel.x+coord[0];
var y = pixel.y+coord[1];
if (isEmpty(x,y)) {
delete pixel.con.del;
pixel.con.x = x;
pixel.con.y = y;
pixelMap[x][y] = pixel.con;
currentPixels.push(pixel.con);
pixel.con = null;
break;
}
if (!isEmpty(x,y,true) && pixelMap[x][y].element === "pipe") {
var newPixel = pixelMap[x][y];
if (pixel.con && !newPixel.con && newPixel.stage === pixel.stage) {
newPixel.con = pixel.con;
newPixel.con.x = newPixel.x;
newPixel.con.y = newPixel.y;
pixel.con = null;
break;
}
}
}
}
}
doDefaults(pixel);
}
elements.drag.tool = function(pixel) {
if (dragStart === null) {
dragStart = pixelTicks;
draggingPixels = [];
}
if (pixelTicks === dragStart && !pixel.drag && (elements[pixel.element].movable || shiftDown) && pixel.element !== "head") {
pixel.drag = true;
draggingPixels.push(pixel);
}
}
elements.drag.perTick = function() {
if (!draggingPixels) { return; }
for (var j = 0; j < (shiftDown ? 3 : 1); j++) {
for (var i = 0; i < draggingPixels.length; i++) {
var pixel = draggingPixels[i];
if (pixel.del) { continue }
const x = pixel.x;
const y = pixel.y;
const [mX, mY] = [mousePos.x, mousePos.y];
const empty = checkForEmptyPixels(x, y);
let bestVal = Math.sqrt(Math.pow(mX - x, 2) + Math.pow(mY - y, 2));
let best = null;
for (const pixelPair of empty) {
const x_ = x + pixelPair[0];
const y_ = y + pixelPair[1];
const c = Math.sqrt(Math.pow(mX - x_, 2) + Math.pow(mY - y_, 2));
if (c < bestVal) {
bestVal = c;
best = pixelPair;
}
}
if (best) {
if (pixel.element !== "body") {
tryMove(pixel, x + best[0], y + best[1], undefined, true);
}
else if (pixel.element === "body") {
if (!isEmpty(pixel.x,pixel.y-1)) {
var headPixel = pixelMap[pixel.x][pixel.y-1]
if (headPixel.element === "head") {
if (isEmpty(x + best[0], y + best[1] - 1)) {
tryMove(headPixel, x + best[0], y + best[1] - 1, undefined, true);
tryMove(pixel, x + best[0], y + best[1], undefined, true);
}
}
}
else {tryMove(pixel, x + best[0], y + best[1], undefined, true);}
}
}
}
}
}
mouse1Action = function(e,mouseX=undefined,mouseY=undefined,startPos) {
if (currentElement === "erase") { mouse2Action(e,mouseX,mouseY,startPos); return; }
else if (currentElement === "pick") { mouseMiddleAction(e,mouseX,mouseY); return; }
// If x and y are undefined, get the mouse position
if (mouseX === undefined && mouseY === undefined) {
// var canvas = document.getElementById("game");
// var ctx = canvas.getContext("2d");
lastPos = mousePos;
mousePos = getMousePos(canvas, e);
var mouseX = mousePos.x;
var mouseY = mousePos.y;
}
var cooldowned = false;
if (mouseSize===1 && elements[currentElement].cooldown && !paused) {
if (pixelTicks-lastPlace < elements[currentElement].cooldown) {
return;
}
cooldowned = true;
}
lastPlace = pixelTicks;
if (cooldowned && !startPos) {
var coords = mouseRange(mouseX,mouseY);
}
else {
startPos = startPos || lastPos
var coords = lineCoords(startPos.x,startPos.y,mouseX,mouseY);
}
// if (!((cooldowned && startPos.x===lastPos.x && startPos.y===lastPos.y) || ((elements[currentElement].tool || elements[currentElement].category==="tools") && !elements[currentElement].canPlace))) {
// }
// else { var coords = mouseRange(mouseX,mouseY); }
var element = elements[currentElement];
var mixList = [];
// For each x,y in coords
var done = {};
for (var i = 0; i < coords.length; i++) {
var x = coords[i][0];
var y = coords[i][1];
if (!done[x]) {
done[x] = {}
}
if (done[x][y]) { continue; }
done[x][y] = true;
if (mode === "replace" && (!elements[currentElement].tool || elements[currentElement].canPlace)) {
if (outOfBounds(x,y)) {
continue;
}
// Remove pixel at position from currentPixels
if (!isEmpty(x,y,true)) {
if (!(currentElement === pixelMap[x][y].element && pixelMap[x][y].start === pixelTicks-1)) {
deletePixel(x,y);
}
}
}
if (currentElement === "mix") {
if (!isEmpty(x,y,true)) {
var pixel = pixelMap[x][y];
if (!(elements[pixel.element].movable !== true || elements[pixel.element].noMix === true) || shiftDown) {
mixList.push(pixel);
}
}
continue;
}
else if (elements[currentElement].tool && !(elements[currentElement].canPlace && isEmpty(x,y))) {
// run the tool function on the pixel
if (!isEmpty(x,y,true)) {
var pixel = pixelMap[x][y];
// if the current element has an ignore property and the pixel's element is in the ignore property, don't do anything
if (elements[currentElement].ignore && elements[currentElement].ignore.indexOf(pixel.element) !== -1) {
continue;
}
elements[currentElement].tool(pixel);
}
continue;
}
if (isEmpty(x, y)) {
if (currentPixels.length < maxPixelCount) {
createPixel(currentElement,x,y);
if (pixelMap[x][y] && currentElement === pixelMap[x][y].element && (elements[currentElement].customColor || elements[currentElement].singleColor)) {
pixelMap[x][y].color = pixelColorPick(pixelMap[x][y],currentColorMap[currentElement]);
}
if (currentElementProp) {
for (var key in currentElementProp) {
pixelMap[x][y][key] = currentElementProp[key]
}
}
}
}
else if (!outOfBounds(x,y)) {
if (elements[currentElement].extinguish) {
var pixel = pixelMap[x][y];
if (pixel.burning && elements[pixel.element].burning !== true) {
delete pixel.burning;
delete pixel.burnStart;
}
}
}
}
if (currentElement === "mix") {
// 1. repeat for each pixel in mixList
// 2. choose 2 random pixels and swap their x and y
// 3. remove pixel from mixList
for (var i = 0; i < mixList.length; i++) {
var pixel1 = mixList[Math.floor(Math.random()*mixList.length)];
var pixel2 = mixList[Math.floor(Math.random()*mixList.length)];
if (pixel1.element !== "head" && pixel2.element !== "head" && pixel1.element !== "body" && pixel2.element !== "body") {
swapPixels(pixel1,pixel2);
}
else if (pixel1.element !== "head" && pixel2.element !== "head" && (pixel1.element === "body" || pixel2.element === "body")) {
if (pixel1.element === "body") {
if (!isEmpty(pixel1.x,pixel1.y-1, true)) {
var headPixel1 = pixelMap[pixel1.x][pixel1.y-1]
if (headPixel1.element === "head") {
if (!isEmpty(pixel2.x,pixel2.y-1, true)) {
var headPixel2 = pixelMap[pixel2.x][pixel2.y-1]
if (headPixel2.element !== "body" && !(elements[headPixel2.element].movable !== true || elements[headPixel2.element].noMix === true)) {
swapPixels(pixel1,pixel2);
swapPixels(headPixel1,headPixel2);
}
}
else if (isEmpty(pixel2.x,pixel2.y-1)) {
swapPixels(pixel1,pixel2)
tryMove(headPixel1, pixel1.x, pixel1.y-1)
}
}
}
}
else if (pixel2.element === "body") {
if (!isEmpty(pixel2.x,pixel2.y-1, true)) {
var headPixel1 = pixelMap[pixel2.x][pixel2.y-1]
if (headPixel1.element === "head") {
if (!isEmpty(pixel1.x,pixel1.y-1, true)) {
var headPixel2 = pixelMap[pixel1.x][pixel1.y-1]
if (headPixel2.element !== "body" && !(elements[headPixel2.element].movable !== true || elements[headPixel2.element].noMix === true)) {
swapPixels(pixel1,pixel2);
swapPixels(headPixel1,headPixel2);
}
}
else if (isEmpty(pixel1.x,pixel1.y-1)) {
swapPixels(pixel1,pixel2);
tryMove(headPixel1, pixel2.x,pixel2.y-1)
}
}
}
}
}
mixList.splice(mixList.indexOf(pixel1),1);
mixList.splice(mixList.indexOf(pixel2),1);
if (elements[pixel1.element].onMix) {
elements[pixel1.element].onMix(pixel1,pixel2);
}
if (elements[pixel2.element].onMix) {
elements[pixel2.element].onMix(pixel2,pixel1);
}
}
}
}
pixelTick = function(pixel,custom=null) {
if (pixel.start === pixelTicks) {return}
btemp = {};
if (elements[pixel.element] === undefined) {
pixel.invalidElement = pixel.element;
changePixel(pixel,"unknown");
return;
}
var info = elements[pixel.element];
btemp.info = info;
btemp.pixel = pixel;
if (custom) { var behavior = custom; }
else if (pixel.charge && info.behaviorOn) { var behavior = info.behaviorOn; }
else { var behavior = info.behavior; }
if (pixel.flipX) { behavior = flipBehavior(behavior,"x"); }
if (pixel.flipY) { behavior = flipBehavior(behavior,"y"); }
if (pixel.r) { behavior = rotateBehavior(behavior,pixel.r); }
var x = pixel.x;
var y = pixel.y;
var move1Spots = []; btemp.move1Spots = move1Spots;
var move2Spots = []; btemp.move2Spots = move2Spots;
var supportSpots = []; btemp.supportSpots = supportSpots;
var swapSpots = []; btemp.swapSpots = swapSpots;
btemp.mixSpots = [];
btemp.move = true;
// Parse behavior
var height = behavior.length;
for (var by = 0; by < behavior.length; by++) {
var behaviorby = behavior[by];
var width = behaviorby.length;
for (var bx = 0; bx < behaviorby.length; bx++) {
var b0 = behaviorby[bx];
if (b0 === "XX") {continue}
//if (b.includes(" OR ")) {
// b = b.split(" OR ")[Math.floor(Math.random()*b.split(" OR ").length)];
//}
// Loop through b0.split(" AND ")
if (b0.indexOf(" AND ") !== -1) { var andsplit = b0.split(" AND "); }
else { var andsplit = [b0]; }
for (var i = 0; i < andsplit.length; i++) {
var b = andsplit[i];
if (b.indexOf(":") !== -1) {
var arg = b.split(":")[1].split(/[\:\%]/)[0];
if (b.indexOf("%") === -1) {
b = b.split(/[\:\%]/)[0];
}
}
else { var arg = null;}
btemp.arg = arg;
// If b has "%" followed by a number in it, it's a chance to move
if (b.indexOf("%") !== -1) {
// Split the string at the "%" and use the second half as the chance (float)
var chance = parseFloat(b.split("%")[1]);
//console.log(b+": "+(Math.random()*100 < chance));
b = b.split(/[\:\%]/)[0];
}
else { var chance = 100; }
if (chance===100 || Math.random()*100 < chance) {
var newCoords = behaviorCoords(x,y,bx,by,width,height);
btemp.newCoords = newCoords;
if (behaviorRules[b]) {
behaviorRules[b]();
continue;
}
}
}
}
}
if (btemp.deleted) {return;}
if (supportSpots.length > 0) {
var supportCount = 0;
var allEmpty = true;
for (var i = 0; i < supportSpots.length; i++) {
var bx = supportSpots[i].x;
var by = supportSpots[i].y;
var arg = supportSpots[i].arg;
if (!isEmpty(bx,by,true)) {
if (info.ignore && info.ignore.indexOf(pixelMap[bx][by].element) !== -1) {continue;}
if ((arg === null && !validDensitySwaps[info.state][elements[pixelMap[bx][by].element].state]) || pixelMap[bx][by].element == arg) {
supportCount++;
}
}
}
if (supportCount == supportSpots.length) {
btemp.move = false;
}
}
var moved = false;
if (swapSpots.length > 0) {
var coords = swapSpots[Math.floor(Math.random()*swapSpots.length)];
if (pixelMap[coords.x][coords.y] !== undefined) {
swapPixels(pixel,pixelMap[coords.x][coords.y]);
btemp.move = false;
moved = true;
}
}
if (btemp.mixSpots.length > 0) {
for (var i = 0; i < btemp.mixSpots.length; i++) {
var coord1 = choose(btemp.mixSpots);
var coord2 = choose(btemp.mixSpots);
var exists1 = !isEmpty(coord1.x,coord1.y,true);
var exists2 = !isEmpty(coord2.x,coord2.y,true);
if (isEmpty(coord1.x,coord1.y) && exists2) {
var pixel1 = pixelMap[coord2.x][coord2.y]
if (pixel1.element !== "head" && pixel1.element !== "body") {
tryMove(pixel1,coord1.x,coord1.y);
}
else if (pixel1.element !== "head" && pixel1.element === "body") {
if (!isEmpty(pixel1.x,pixel1.y-1, true)) {
var headPixel1 = pixelMap[pixel1.x][pixel1.y-1]
if (headPixel1.element === "head") {
if (!isEmpty(coord1.x,coord1.y-1, true)) {
var headPixel2 = pixelMap[coord1.x][coord1.y-1]
if (headPixel2.element !== "body" && !(elements[headPixel2.element].movable !== true || elements[headPixel2.element].noMix === true)) {
tryMove(pixel1,coord1.x,coord1.y);
swapPixels(headPixel1,headPixel2);
}
}
else if (isEmpty(coord1.x,coord1.y-1)) {
tryMove(pixel1,coord1.x,coord1.y);
tryMove(headPixel1, pixel1.x, pixel1.y-1)
}
}
}
}
}
else if (exists1 && isEmpty(coord2.x,coord2.y)) {
var pixel1 = pixelMap[coord1.x][coord1.y]
if (pixel1.element !== "head" && pixel1.element !== "body") {
tryMove(pixel1,coord2.x,coord2.y);
}
else if (pixel1.element !== "head" && pixel1.element === "body") {
if (!isEmpty(pixel1.x,pixel1.y-1, true)) {
var headPixel1 = pixelMap[pixel1.x][pixel1.y-1]
if (headPixel1.element === "head") {
if (!isEmpty(coord2.x,coord2.y-1, true)) {
var headPixel2 = pixelMap[coord2.x][coord2.y-1]
if (headPixel2.element !== "body" && !(elements[headPixel2.element].movable !== true || elements[headPixel2.element].noMix === true)) {
tryMove(pixel1,coord2.x,coord2.y);
swapPixels(headPixel1,headPixel2);
}
}
else if (isEmpty(coord2.x,coord2.y-1)) {
tryMove(pixel1,coord2.x,coord2.y);
tryMove(headPixel1, pixel1.x, pixel1.y-1)
}
}
}
}
}
else if (exists1 && exists2) {
var pixel1 = pixelMap[coord1.x][coord1.y];
var pixel2 = pixelMap[coord2.x][coord2.y];
if (pixel1.element !== "head" && pixel2.element !== "head" && pixel1.element !== "body" && pixel2.element !== "body") {
swapPixels(pixel1,pixel2);
}
else if (pixel1.element !== "head" && pixel2.element !== "head" && (pixel1.element === "body" || pixel2.element === "body")) {
if (pixel1.element === "body") {
if (!isEmpty(pixel1.x,pixel1.y-1, true)) {
var headPixel1 = pixelMap[pixel1.x][pixel1.y-1]
if (headPixel1.element === "head") {
if (!isEmpty(pixel2.x,pixel2.y-1, true)) {
var headPixel2 = pixelMap[pixel2.x][pixel2.y-1]
if (headPixel2.element !== "body" && !(elements[headPixel2.element].movable !== true || elements[headPixel2.element].noMix === true)) {
swapPixels(pixel1,pixel2);
swapPixels(headPixel1,headPixel2);
}
}
else if (isEmpty(pixel2.x,pixel2.y-1)) {
swapPixels(pixel1,pixel2)
tryMove(headPixel1, pixel1.x, pixel1.y-1)
}
}
}
}
else if (pixel2.element === "body") {
if (!isEmpty(pixel2.x,pixel2.y-1, true)) {
var headPixel1 = pixelMap[pixel2.x][pixel2.y-1]
if (headPixel1.element === "head") {
if (!isEmpty(pixel1.x,pixel1.y-1, true)) {
var headPixel2 = pixelMap[pixel1.x][pixel1.y-1]
if (headPixel2.element !== "body" && !(elements[headPixel2.element].movable !== true || elements[headPixel2.element].noMix === true)) {
swapPixels(pixel1,pixel2);
swapPixels(headPixel1,headPixel2);
}
}
else if (isEmpty(pixel1.x,pixel1.y-1)) {
swapPixels(pixel1,pixel2);
tryMove(headPixel1, pixel2.x,pixel2.y-1)
}
}
}
}
}
if (elements[pixel1.element].onMix) {
elements[pixel1.element].onMix(pixel1,pixel2);
}
if (elements[pixel2.element].onMix) {
elements[pixel2.element].onMix(pixel2,pixel1);
}
}
}
}
if (btemp.sticking) {
btemp.move = false;
}
// Move First Priority
if (btemp.move) {
if (move1Spots.length > 0) {
// While move1Spots is not empty
while (move1Spots.length > 0) {
// coords = random item of move1Spots
var j = Math.floor(Math.random()*move1Spots.length);
var coords = move1Spots[j];
var nx = coords.x;
var ny = coords.y;
moved = tryMove(pixel,nx,ny,btemp.leaveBehind1 || btemp.leaveBehind);
if (moved) {
break;
}
else {
// remove coords from move1Spots
move1Spots.splice(j,1);
}
}
}
// Move Second Priority
if (!moved && move2Spots.length > 0) {
// While move2Spots is not empty
while (move2Spots.length > 0) {
// coords = random item of move2Spots
var j = Math.floor(Math.random()*move2Spots.length);
var coords = move2Spots[j];
var nx = coords.x;
var ny = coords.y;
moved = tryMove(pixel,nx,ny,btemp.leaveBehind2 || btemp.leaveBehind);
if (moved) {
if (btemp.C2 && elements[btemp.C2]) {
changePixel(pixel,btemp.C2);
}
break;
}
else {
// remove coords from move2Spots
move2Spots.splice(j,1);
}
}
}
}
doAirDensity(pixel);
// Change tempearture if needed (unused)
/*if (info.tempChange != undefined) {
pixel.temp += info.tempChange;
pixelTempCheck(pixel);
}*/
// Burning
doBurning(pixel);
// Heat Transfer
if (info.insulate !== true) {
doHeat(pixel);
}
// Electricity Transfer
doElectricity(pixel);
// Staining
if (info.stain) {
doStaining(pixel);
}
}

File diff suppressed because it is too large Load Diff

View File

@ -1,6 +1,19 @@
// by nekonico
elements.true_flashbang = {
isEven = function(num) {
if (num % 2) {
return (true)
}
else {return (false)}
}
isOdd = function(num) {
if (num % 1) {
return (true)
}
else {return (false)}
}
elements.flashy_flashbang = {
color: "#65665c",
onSelect: function() {
logMessage("Caution: If you have epilepsy or any similar vision issues, do not place this element for your own safety.");
@ -16,7 +29,8 @@ elements.true_flashbang = {
tempHigh: 1455.5,
stateHigh: "molten_steel",
excludeRandom: true,
cooldown: defaultCooldown
cooldown: defaultCooldown,
maxSize: 1,
}
elements.flashbang_flash = {
@ -36,7 +50,7 @@ elements.flashbang_flash = {
done = false;
}
}
if ((Math.random() < 0.75 && done) || pixel.alpha < 0.05) {
if ((Math.random() < 0.75 && done) || pixel.alpha < 0.060784314) {
deletePixel(pixel.x, pixel.y)
settings.bg = "#000000";
}
@ -57,5 +71,450 @@ elements.flashbang_flash = {
insulate: true,
hidden: true,
noMix: true,
excludeRandom: true
excludeRandom: true,
cooldown: defaultCooldown,
maxSize: 1,
}
elements.flashy_nuke = {
onSelect: function() {
logMessage("Caution: If you have epilepsy or any similar vision issues, do not place this element for your own safety.");
},
color: "#534636",
behavior: [
"XX|XX|XX",
"XX|XX|XX",
"M2|M1 AND EX:65>plasma,plasma,plasma,plasma,radiation,rad_steam,plasma,plasma,plasma,plasma,radiation,rad_steam,plasma,plasma,plasma,plasma,radiation,rad_steam,nuke_flash|M2",
],
category: "weapons",
state: "solid",
density: 1500,
excludeRandom: true,
cooldown: defaultCooldown,
maxSize: 1,
}
elements.nuke_flash = {
color: "#ffffff",
properties: {
delay: 60
},
tick: function(pixel) {
settings.bg = pixel.color;
let hex = Math.round(255 * pixel.alpha).toString(16);
pixel.color = `#${hex}ff${hex}` // credits to therazzler in the R74n discord for this code :3
var done = true;
if (pixel.delay) {
var delayR = pixel.delay % 1;
var delay = pixel.delay - delayR;
if (!(pixelTicks - pixel.start > (pixel.delay||1) && Math.random() < 1-delayR)) {
done = false;
}
}
if ((Math.random() < 0.75 && done) || pixel.alpha < 0.061) {
changePixel(pixel, "nuke_overflash")
}
if (pixel.delay) {
pixel.alpha = Math.max(0,1-(pixelTicks - pixel.start)/pixel.delay)
}
doHeat(pixel);
},
category: "energy",
temp: 40,
tempLow: -270,
stateLow: ["liquid_light",null],
state: "gas",
category: "energy",
density: 0.00001,
ignoreAir: true,
insulate: true,
hidden: true,
noMix: true,
excludeRandom: true,
cooldown: defaultCooldown,
maxSize: 1,
}
elements.nuke_overflash = {
color: "#00ff00",
properties: {
delay: 40
},
tick: function(pixel) {
settings.bg = pixel.color;
let hex = Math.round(255 * pixel.alpha).toString(16);
pixel.color = `#00${hex}00` // credits to therazzler in the R74n discord for this code :3
var done = true;
if (pixel.delay) {
var delayR = pixel.delay % 1;
var delay = pixel.delay - delayR;
if (!(pixelTicks - pixel.start > (pixel.delay||1) && Math.random() < 1-delayR)) {
done = false;
}
}
if ((Math.random() < 0.75 && done) || pixel.alpha < 0.061) {
deletePixel(pixel.x, pixel.y)
settings.bg = "#000000";
}
if (pixel.delay) {
pixel.alpha = Math.max(0,1-(pixelTicks - pixel.start)/pixel.delay)
}
doHeat(pixel);
},
category: "energy",
temp: 40,
tempLow: -270,
stateLow: ["liquid_light",null],
state: "gas",
category: "energy",
density: 0.00001,
ignoreAir: true,
insulate: true,
hidden: true,
noMix: true,
excludeRandom: true,
cooldown: defaultCooldown,
maxSize: 1,
}
elements.flashy_h_bomb = {
onSelect: function() {
logMessage("Caution: If you have epilepsy or any similar vision issues, do not place this element for your own safety.");
},
color: "#533636",
behavior: [
"XX|XX|XX",
"XX|XX|XX",
"M2|M1 AND EX:90>plasma,plasma,plasma,plasma,fire,plasma,plasma,plasma,plasma,fire,plasma,plasma,plasma,plasma,fire,h_bomb_flash|M2",
],
category: "weapons",
state: "solid",
density: 1600,
excludeRandom: true,
alias: "hydrogen bomb",
cooldown: defaultCooldown,
maxSize: 1,
}
elements.h_bomb_flash = {
color: "#ffffff",
properties: {
delay: 30
},
tick: function(pixel) {
settings.bg = pixel.color;
let hex = Math.round(255 * pixel.alpha).toString(16);
pixel.color = `#ff${hex}${hex}` // credits to therazzler in the R74n discord for this code :3
var done = true;
if (pixel.delay) {
var delayR = pixel.delay % 1;
var delay = pixel.delay - delayR;
if (!(pixelTicks - pixel.start > (pixel.delay||1) && Math.random() < 1-delayR)) {
done = false;
}
}
if ((Math.random() < 0.75 && done) || pixel.alpha < 0.061) {
changePixel(pixel, "h_bomb_overflash")
}
if (pixel.delay) {
pixel.alpha = Math.max(0,1-(pixelTicks - pixel.start)/pixel.delay)
}
doHeat(pixel);
},
category: "energy",
temp: 40,
tempLow: -270,
stateLow: ["liquid_light",null],
state: "gas",
category: "energy",
density: 0.00001,
ignoreAir: true,
insulate: true,
hidden: true,
noMix: true,
excludeRandom: true,
cooldown: defaultCooldown,
maxSize: 1,
}
elements.h_bomb_overflash = {
color: "#ff0000",
properties: {
delay: 70
},
tick: function(pixel) {
settings.bg = pixel.color;
let hex = Math.round(255 * pixel.alpha).toString(16);
pixel.color = `#${hex}0000` // credits to therazzler in the R74n discord for this code :3
var done = true;
if (pixel.delay) {
var delayR = pixel.delay % 1;
var delay = pixel.delay - delayR;
if (!(pixelTicks - pixel.start > (pixel.delay||1) && Math.random() < 1-delayR)) {
done = false;
}
}
if ((Math.random() < 0.75 && done) || pixel.alpha < 0.061) {
deletePixel(pixel.x, pixel.y)
settings.bg = "#000000";
}
if (pixel.delay) {
pixel.alpha = Math.max(0,1-(pixelTicks - pixel.start)/pixel.delay)
}
doHeat(pixel);
},
category: "energy",
temp: 40,
tempLow: -270,
stateLow: ["liquid_light",null],
state: "gas",
category: "energy",
density: 0.00001,
ignoreAir: true,
insulate: true,
hidden: true,
noMix: true,
excludeRandom: true,
cooldown: defaultCooldown,
maxSize: 1,
}
elements.flashy_firework = {
color: "#c44f45",
onSelect: function() {
logMessage("Caution: If you have epilepsy or any similar vision issues, do not place this element for your own safety.");
},
tick: function(pixel) {
if ((pixel.temp > 1000 || pixel.charge) && !pixel.burning) {
pixel.burning = true;
pixel.burnStart = pixelTicks;
}
if (pixel.burning) {
if (!tryMove(pixel, pixel.x, pixel.y-1)) {
// tryMove again to the top left or top right
tryMove(pixel, pixel.x+(Math.random() < 0.5 ? -1 : 1), pixel.y-1);
}
if (pixelTicks-pixel.burnStart > 50 && Math.random() < 0.1) {
if (Math.random() > 0.5) {
explodeAt(pixel.x, pixel.y, 10, "fw_flash1");
}
else if (Math.random() > 0.5) {
explodeAt(pixel.x, pixel.y, 10, "fw_flash2");
}
else if (Math.random() > 0.5) {
explodeAt(pixel.x, pixel.y, 10, "fw_flash3");
}
else {
explodeAt(pixel.x, pixel.y, 10, "fw_flash4");
}
}
}
else {
if (!tryMove(pixel, pixel.x, pixel.y+1)) {
// tryMove again to the bottom left or bottom right
tryMove(pixel, pixel.x+(Math.random() < 0.5 ? -1 : 1), pixel.y+1);
}
}
doDefaults(pixel);
},
burn: 90,
burnTime: 100,
properties: { burning:false },
burning: true,
density: 2000,
conduct: 1,
state: "solid",
category: "weapons"
}
elements.fw_flash1 = {
properties: {
delay: 5
},
color: ["#ff00ff","#00ffff"],
behavior: [
"XX|XX|XX",
"XX|DL%25|M2",
"XX|M2|M1",
],
tick: function(pixel) {
let hex = Math.round(255 * pixel.alpha).toString(16);
pixel.color = `#00${hex}${hex}`
settings.bg = pixel.color;
var done = true;
if (pixel.delay) {
var delayR = pixel.delay % 1;
var delay = pixel.delay - delayR;
if (!(pixelTicks - pixel.start > (pixel.delay||1) && Math.random() < 1-delayR)) {
done = false;
}
}
if ((Math.random() < 0.75 && done) || pixel.alpha < 0.062) {
changePixel(pixel, "smoke")
settings.bg = "#000000";
}
if (pixel.delay) {
pixel.alpha = Math.max(0,1-(pixelTicks - pixel.start)/pixel.delay)
}
doHeat(pixel);
},
burning: true,
burnInto: "ash",
burnTime: 100,
fireElement: ["smoke","smoke","smoke","smoke","carbon_dioxide"],
rotatable: true,
temp: 649,
tempLow: 0,
stateLow: "carbon_dioxide",
category: "energy",
hidden: true,
state: "gas",
density: 700,
alias: "flashy firework ember"
}
elements.fw_flash2 = {
properties: {
delay: 5
},
color: ["#ff00ff","#00ffff"],
behavior: [
"XX|XX|XX",
"XX|DL%25|M2",
"XX|M2|M1",
],
tick: function(pixel) {
let hex = Math.round(255 * pixel.alpha).toString(16);
pixel.color = `#${hex}00${hex}`
settings.bg = pixel.color;
var done = true;
if (pixel.delay) {
var delayR = pixel.delay % 1;
var delay = pixel.delay - delayR;
if (!(pixelTicks - pixel.start > (pixel.delay||1) && Math.random() < 1-delayR)) {
done = false;
}
}
if ((Math.random() < 0.75 && done) || pixel.alpha < 0.062) {
changePixel(pixel, "smoke")
settings.bg = "#000000";
}
if (pixel.delay) {
pixel.alpha = Math.max(0,1-(pixelTicks - pixel.start)/pixel.delay)
}
doHeat(pixel);
},
burning: true,
burnInto: "ash",
burnTime: 100,
fireElement: ["smoke","smoke","smoke","smoke","carbon_dioxide"],
rotatable: true,
temp: 649,
tempLow: 0,
stateLow: "carbon_dioxide",
category: "energy",
hidden: true,
state: "gas",
density: 700,
alias: "flashy firework ember"
}
elements.fw_flash3 = {
properties: {
delay: 5
},
color: ["#ff00ff","#00ffff"],
behavior: [
"XX|XX|XX",
"XX|DL%25|M2",
"XX|M2|M1",
],
tick: function(pixel) {
let hex = Math.round(255 * pixel.alpha).toString(16);
pixel.color = `#00${hex}00`
settings.bg = pixel.color;
var done = true;
if (pixel.delay) {
var delayR = pixel.delay % 1;
var delay = pixel.delay - delayR;
if (!(pixelTicks - pixel.start > (pixel.delay||1) && Math.random() < 1-delayR)) {
done = false;
}
}
if ((Math.random() < 0.75 && done) || pixel.alpha < 0.062) {
changePixel(pixel, "smoke")
settings.bg = "#000000";
}
if (pixel.delay) {
pixel.alpha = Math.max(0,1-(pixelTicks - pixel.start)/pixel.delay)
}
doHeat(pixel);
},
burning: true,
burnInto: "ash",
burnTime: 100,
fireElement: ["smoke","smoke","smoke","smoke","carbon_dioxide"],
rotatable: true,
temp: 649,
tempLow: 0,
stateLow: "carbon_dioxide",
category: "energy",
hidden: true,
state: "gas",
density: 700,
alias: "flashy firework ember"
}
elements.fw_flash4 = {
properties: {
delay: 5
},
color: "#ff00ff",
behavior: [
"XX|XX|XX",
"XX|DL%25|M2",
"XX|M2|M1",
],
tick: function(pixel) {
let hex = Math.round(255 * pixel.alpha).toString(16);
pixel.color = `#0000${hex}`
settings.bg = pixel.color;
var done = true;
if (pixel.delay) {
var delayR = pixel.delay % 1;
var delay = pixel.delay - delayR;
if (!(pixelTicks - pixel.start > (pixel.delay||1) && Math.random() < 1-delayR)) {
done = false;
}
}
if ((Math.random() < 0.75 && done) || pixel.alpha < 0.062) {
changePixel(pixel, "smoke")
settings.bg = "#000000";
}
if (pixel.delay) {
pixel.alpha = Math.max(0,1-(pixelTicks - pixel.start)/pixel.delay)
}
doHeat(pixel);
},
burning: true,
burnInto: "ash",
burnTime: 100,
fireElement: ["smoke","smoke","smoke","smoke","carbon_dioxide"],
rotatable: true,
temp: 649,
tempLow: 0,
stateLow: "carbon_dioxide",
category: "energy",
hidden: true,
state: "gas",
density: 700,
alias: "flashy firework ember"
}