sandboxels/mods/noita.js

4895 lines
135 KiB
JavaScript

function isASecond(number) {
if (number % 30 === 0 || number % 29 === 0 || number % 31 === 0) {
return true;
} else {
return false;
}
}
doNHeat = function(pixel) {
// Check right and bottom adjacent pixels
for (var i = 0; i < biCoords.length; i++) {
var x = pixel.x+biCoords[i][0];
var y = pixel.y+biCoords[i][1];
if (!isEmpty(x,y,true)) {
var newPixel = pixelMap[x][y];
// Skip if both temperatures are the same
if (pixel.temp === newPixel.temp || elements[newPixel.element].insulate === true) {
continue;
}
// Set both pixel temperatures to their average
var avg = (pixel.temp + newPixel.temp)/2;
pixel.temp = avg;
newPixel.temp = avg;
pixelTempCheck(pixel);
pixelTempCheck(newPixel);
}
}
}
doNBurning = function(pixel) {
if (pixel.NBurning) { // Burning
if (pixel.NBurnStart === undefined) { pixel.NBurnStart = pixelTicks }
var info = elements[pixel.element];
if (pixel.temp < -50) {
pixel.NBurning = undefined;
pixel.NBurnStart = undefined;
return;
}
for (var i = 0; i < adjacentCoords.length; i++) { // Burn adjacent pixels
var x = pixel.x+adjacentCoords[i][0];
var y = pixel.y+adjacentCoords[i][1];
if (!isEmpty(x,y,true)) {
var newPixel = pixelMap[x][y]
if (elements[newPixel.element].burnable === true && elements[newPixel.element].nburnTime === true && Math.random() > 0.8) {
newPixel.NBurning = true
}
else if (elements[newPixel.element].burnableFast === true && Math.random() > 0.25) {
changePixel(newPixel,"noita_fire")
newPixel.NBurning = true
}
}
}
if ((pixelTicks - pixel.NBurnStart > (info.nburnTime || 200)) && Math.floor(Math.random()*100)<(info.nburn || 10) && !(info.nburnTime === undefined && info.hardness >= 1)) {
if (elements[pixel.element].nburnInto !== undefined) {
if (Math.random() > 0.5) {
deletePixel(pixel.x,pixel.y)
}
else {
changePixel(pixel,elements[pixel.element].nburnInto);
}
}
else {
changePixel(pixel,"noita_fire");
pixel.NBurning = true;
}
}
else if (Math.floor(Math.random()*100)<10 && info.id !== elements.noita_fire.id) { // Spawn fire
if (isEmpty(pixel.x,pixel.y-1)) {
createPixel(("noita_fire"),pixel.x,pixel.y-1);
pixelMap[pixel.x][pixel.y-1].temp = pixel.temp//+(pixelTicks - (pixel.burnStart || 0));
pixelMap[pixel.x][pixel.y-1].NBurning = true
}
// same for below if top is blocked
else if (isEmpty(pixel.x,pixel.y+1)) {
createPixel(("noita_fire"),pixel.x,pixel.y+1);
pixelMap[pixel.x][pixel.y+1].temp = pixel.temp//+(pixelTicks - (pixel.burnStart || 0));
pixelMap[pixel.x][pixel.y+1].NBurning = true
}
}
}
}
NExplode = function(x,y,radius,damage,fire="noita_fire") {
// if fire contains , split it into an array
if (fire.indexOf(",") !== -1) {
fire = fire.split(",");
}
var coords = circleCoords(x,y,radius);
var power = radius/10;
//for (var p = 0; p < Math.round(radius/10+1); p++) {
for (var i = 0; i < coords.length; i++) {
if (isEmpty(coords[i].x,coords[i].y)) {
// if fire is an array, choose a random item
if (Array.isArray(fire)) {
createPixel(fire[Math.floor(Math.random() * fire.length)],coords[i].x,coords[i].y);
}
else {
createPixel(fire,coords[i].x,coords[i].y);
}
}
else if (!outOfBounds(coords[i].x,coords[i].y)) {
// damage the pixel
var pixel = pixelMap[coords[i].x][coords[i].y];
var info = elements[pixel.element];
if (pixel.hp) { // lower hp
DoDamage(pixel,"explosion",damage)
var damaged = true
}
if (info.hardness && damaged != true) { // lower damage depending on hardness(0-1)
if (info.hardness < 1) {
// more hardness = less damage, logarithmic
damage *= Math.pow((1-info.hardness),info.hardness);
}
else { damage = 0; }
}
if (damage > 0.9 && damaged != true) {
if (Array.isArray(fire)) {
var newfire = fire[Math.floor(Math.random() * fire.length)];
}
else {
var newfire = fire;
}
changePixel(pixel,newfire);
continue;
}
else if (damage > 0.25 && damaged != true) {
if (isBreakable(pixel)) {
breakPixel(pixel);
continue;
}
else {
if (Array.isArray(fire)) {
var newfire = fire[Math.floor(Math.random() * fire.length)];
}
else {
var newfire = fire;
}
if (elements[pixel.element].onBreak !== undefined) {
elements[pixel.element].onBreak(pixel);
}
changePixel(pixel,newfire);
continue;
}
}
}
}
}
DoDamage = function(pixel,type,damage,damageMultiplier={ "melee": 1, "projectile": 1, "explosion": 1, "fire": 1, "electricity": 1, "drill": 1, "slice": 1, "ice": 1, "healing": 1, "radioactive": 1, "poison": 1, "curse": 1, "holy": 1, "material": 1 }) {
if (pixel.immunities[type] != true) {
pixel.hp = (pixel.hp - (damage * damageMultiplier[type]))
}
}
DoNoitaCreature = function(pixel) {
if (!pixel.stains) {
pixel.stains = []
}
if (pixel.stains.wet && isASecond(pixelTicks)) {
if ((pixel.stains.wet[1] + pixel.stains.wet[0]) < pixelTicks) {
delete pixel.stains.wet
}
}
if (pixel.stains.bloody && isASecond(pixelTicks)) {
if ((pixel.stains.bloody[1] + pixel.stains.bloody[0]) < pixelTicks) {
delete pixel.stains.bloody
}
}
if (pixel.stains.onFire && isASecond(pixelTicks)) {
if (pixel.stains.wet || pixel.stains.bloody) {
if (pixel.stains.onFire) {
delete pixel.onFire
}
if (pixel.stains.wet[1]) {
pixel.stains.wet[1] -= 10
}
else if (pixel.stains.bloody[1]) {
pixel.stains.bloody[1] -= 10
}
}
DoDamage(pixel,"fire",(Math.ceil(pixel.maxhp / 50)))
pixel.panic++
if ((pixel.stains.onFire[1] + pixel.stains.onFire[0]) < pixelTicks) {
delete pixel.stains.onFire
}
}
if (pixel.stains.poisoned && isASecond(pixelTicks)) {
DoDamage(pixel,"poison",(Math.ceil(pixel.maxhp / 50)))
pixel.panic++
if ((pixel.stains.poisoned[1] + pixel.stains.poisoned[0]) < pixelTicks) {
delete pixel.stains.poisoned
}
}
if (pixel.stains.teleportitis && isASecond(pixelTicks)) {
var x = Math.floor(Math.random()*(width))+1;
var y = Math.floor(Math.random()*(height))+1;
if (isEmpty(x,y)) {
tryMove(pixel,x,y)
}
pixel.panic++
if ((pixel.stains.teleportitis[1] + pixel.stains.teleportitis[0]) < pixelTicks) {
delete pixel.stains.teleportitis
}
}
if (!pixel.immunities) {
pixel.immunities = { "melee": false, "projectile": false, "explosion": false, "fire": false, "electricity": false, "drill": false, "slice": false, "ice": false, "healing": false, "radioactive": false, "poison": false, "curse": false, "holy": false, "material": false }
}
}
DoNoitaHumanoid = function(pixel) {
if (!pixel.stains) {
pixel.stains = []
}
if (pixel.stains.wet && isASecond(pixelTicks)) {
if ((pixel.stains.wet[1] + pixel.stains.wet[0]) < pixelTicks) {
delete pixel.stains.wet
}
}
if (pixel.stains.bloody && isASecond(pixelTicks)) {
if ((pixel.stains.bloody[1] + pixel.stains.bloody[0]) < pixelTicks) {
delete pixel.stains.bloody
}
}
if (pixel.stains.onFire && isASecond(pixelTicks)) {
if (pixel.stains.wet || pixel.stains.bloody) {
if (pixel.stains.onFire) {
delete pixel.onFire
}
if (pixel.stains.wet[1]) {
pixel.stains.wet[1] -= 10
}
else if (pixel.stains.bloody[1]) {
pixel.stains.bloody[1] -= 10
}
}
DoDamage(pixel,"fire",(Math.ceil(pixel.maxhp / 50)))
pixel.panic++
if ((pixel.stains.onFire[1] + pixel.stains.onFire[0]) < pixelTicks) {
delete pixel.stains.onFire
}
}
if (pixel.stains.poisoned && isASecond(pixelTicks)) {
DoDamage(pixel,"poison",(Math.ceil(pixel.maxhp / 50)))
pixel.panic++
if ((pixel.stains.poisoned[1] + pixel.stains.poisoned[0]) < pixelTicks) {
delete pixel.stains.poisoned
}
}
if (pixel.stains.teleportitis && isASecond(pixelTicks)) {
var x = Math.floor(Math.random()*(width))+1;
var y = Math.floor(Math.random()*(height))+1;
if (isEmpty(x,y) && isEmpty(x,y-1)) {
tryMove(pixel,x,y)
if (pixel.head)
tryMove(pixel.head,x,y-1)
}
pixel.panic++
if ((pixel.stains.teleportitis[1] + pixel.stains.teleportitis[0]) < pixelTicks) {
delete pixel.stains.teleportitis
}
}
if (!pixel.immunities) {
pixel.immunities = { "melee": false, "projectile": false, "explosion": false, "fire": false, "electricity": false, "drill": false, "slice": false, "ice": false, "healing": false, "radioactive": false, "poison": false, "curse": false, "holy": false, "material": false }
}
}
DoNoitaStaining = function(pixel,damagePixel) {
if (elements[damagePixel.element].id === elements.noita_acid.id) {
DoDamage(pixel,"material",750)
}
else if (elements[damagePixel.element].id === elements.lava.id) {
DoDamage(pixel,"material",450)
if (!pixel.stains.onFire) {
pixel.stains.onFire = [pixelTicks,1000]
}
}
else if (elements[damagePixel.element].id === elements.noita_fire.id) {
if (!pixel.stains.onFire) {
pixel.stains.onFire = [pixelTicks,1000]
}
}
else if (elements[damagePixel.element].id === elements.noita_poison.id) {
if (!pixel.stains.poisoned) {
pixel.stains.poisoned = [pixelTicks,1000]
}
}
else if ((elements[damagePixel.element].id === elements.noita_mud.id || elements[damagePixel.element].id === elements.noita_water.id || elements[damagePixel.element].id === elements.brine.id)) {
for (i = 0; i < pixel.stains.length; i++) {
if (pixel.stains[i] != pixel.stains.wet) {
delete pixel.stains[i]
}
}
if (!pixel.stains.wet) {
pixel.stains.wet = [pixelTicks,1000]
}
}
else if (elements[damagePixel.element].id === elements.noita_blood.id) {
if (!pixel.stains.bloody) {
pixel.stains.bloody = [pixelTicks,1000]
}
}
else if (elements[damagePixel.element].id === elements.healthium.id) {
pixel.hp += 100
if (!pixel.stains.regeneration) {
pixel.stains.regeneration = [pixelTicks,1000]
}
}
else if (elements[damagePixel.element].id === elements.teleportatium.id || elements[damagePixel.element].id === elements.unstable_teleportatium.id) {
if (!pixel.stains.teleportitis) {
pixel.stains.teleportitis = [pixelTicks,1000]
}
}
if (elements[damagePixel.element].state === "liquid") {
for (i = 0; i < pixel.stains.length; i++) {
if (pixel.stains[i] == pixel.stains.onFire) {
delete pixel.stains[i]
}
}
}
}
requiresAir = function(pixel) {
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.85) {
var neighbors = getNeighbors(pixel)
for (i = 0; i < neighbors.length; i++) {
if (elements[neighbors[i].element].living) {
var organism = true
}
}
if (!organism) {
changePixel(pixel,"soil")
}
}
}
textures.BRICKWORK = [ // bricky squary minecraftey
"ssssssssgsgwgsssgsssssswggggssss",
"gggsgggsgsgwgswwsgwwwwswggggswgg",
"sggsgggsggwwgswgswggggsgggggsgss",
"gwgsgggsgggggswwswggggssssgssgsw",
"gwggssssssssssssswggggswwwwwsgsw",
"wwgswwwwwgggggggswggggswwwwgsggw",
"gggswwwwwgggggggswggggsgwwwgsggg",
"sssssgssssssssssswggggsssssswsss",
"gggwgsggggggggggswggggsggggggggg",
"gggggsgwwgggggggsgggggsgggssssss",
"wggggsgwwggggggggsssssgwggsggggg",
"wggggsggggggggggsgggggsgggsggggg",
"wggggsggggggggggsgwgggsgggsggggg",
"wgssssssgssssssssgggggsgggsggggg",
"wgsgggggswggggggssssssgssggwwwww",
"ggsgggggsggwwggggsggggggsggggggg",
"sssssssssggwwggggsggggggsssgssss",
"wwwwswwwsggggggggswwggggwggswwsw",
"wwwwswwwsgggggsssgsssssssssswwsw",
"wwwwsgggsggggswwwwsgggggggggsssw",
"wwwwsgggsggggswwwwsggwwgggggggsw",
"wwwwsggssssssswwwwsggwwgggggggsw",
"ssssgssswggggswwwwsgggggggggggss",
"wggggggsgggggsssssssssssssssssss",
"gggggggsgggggsgwwwwwwwgsggggswgs",
"gggggggsgggggswggggggggsggggsggs",
"gggggggsggggsswggggggggsggggsggs",
"ggggggggsssssswggggggggsggggssss",
"gggggggswwwggswggggggggswgggswws",
"ggwgwwgsgssggswggggggggsssssswws",
"ggggwwgsgsgwgswgggggggsgwwwgswws",
"gggggggsgsgwgsggggggggswggggswws",
]
textures.ALTGROUND = [ // groundy and dirt alt
"Sgsssgssggssggg",
"ggsssgggggsggss",
"ggssSgggsggggsS",
"ssggggsggggsggg",
"sSggsgggssggggs",
"ggggggggsggssgg",
"ssgggssggggsSgg",
"ssgsgsSggsggggg",
"sSggggggggggssg",
"ggggssgsgssgsgg",
"ggsgsggggsggggg",
"gggggggggggggsg",
"ssgggsgsssgsggg",
"sggsgggsssggggs",
"ggggssgssSgssgs",
]
textures.GROUND = [ // groundy and dirt
"sggggggggs",
"ggsgssgggg",
"ggggssgggg",
"ssggggggsg",
"ssgssggggg",
"gggssggggg",
"ggggggsggg",
"gssggggggg",
"gssggggggg",
"gggggggggs",
]
textures.WOOD = [ // planks
"gsgsgggggggggggggggggggggggggggggggggggggg",
"gsgggggggggggggggggggggggggggggggggggggggg",
"ssssssssssssssssssssssssssssssssssssssssss",
"SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSsSSSSSSSSSSS",
"gggggggggggggggggggggggggggsggsggggggggggg",
"gggggggggggggggggggggggggggggssggggggggggg",
"ssssssssssssssssssssssssssssssssssssssssss",
"SSSSSSSSSSSSSSSSSssSSSSSSSSSSSSSSSSSSSSSSS",
"gggggggggggggggggssggggggggggggggggggggggg",
"ggggggggggggggggggsggggggggggggggggggggggg",
"ssssssssssssssssssssssssssssssssssssssssss",
"SSsSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS",
"sgsggggggggggggggggggggggggggggggggggggggg",
"ggsggggggggggggggggggsgggggggggggggggggggg",
"ssssssssssssssssssssssssssssssssssssssssss",
"ggggggggggggggggggsggggggggggggggggggsgggg",
"ggggggggggggggggggsggggggggggggggggggsgggg",
"ssssssssssssssssssssssssssssssssssssssssss",
"SSSSSSSSSsSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS",
"gggggggggsgggggggggggggggggggggggggggggggg",
"gggggggggsgggggggggggggggggggggggggggggggg",
"ssssssssssssssssssssssssssssssssssssssssss",
"sssSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS",
"gsgggggggggggggggggggggggggggggggggggggggg",
"gsgggggggggggggggggggggggggggggggggggggggg",
"ssssssssssssssssssssssssssssssssssssssssss",
"SsSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS",
]
textures.STEEL = [ // boxy panels
"ggwwgggggGgggwgsgggw",
"wwgsgggggGgggggsgggw",
"wgwggggggGgggggsgggg",
"swwggggggGggwwgsgggg",
"swwggggggGgggwgsgwgg",
"wggggwgggGgggwgsgwgg",
"wggggggggGggwwwsgwgg",
"gggwgggggGggwwwsgwgg",
"gwwwgggggGggwswswwwg",
"gwgggggggGgwwwwswggg",
"gggggggGgGggwgssgssg",
"ggggggsggGggwgwsgssgg",
"gggggggggGggwgwsgggg",
"sssssssssgggggwsssss",
"gggggggggggggswggggg",
"wgggggggggggwwwggggg",
"ggGGGGGGgggwwGGggggg",
"gsgggggGgggwsgGggggg",
"gsgggGgGggwgssgggggg",
"gsgggggGggwwwggwgwgg",
"gsgsgggGgwwgwggwwwgg",
"gsgggggGgggwsggwwwgg",
"gssssssgggwwggwgwggg",
"ggggggggwwwwggwgwggg",
"gggggswwwsgggggggggg",
"GGGGGGGGGGggwwggGGGG",
"gggggggggGgwwwgsggww",
]
textures.STATICSHINE = [ // diagonalish stripes
"gwgssgGs",
"sgwgssgG",
"Gsgwgssg",
"gGsgwgss",
"sgGsgwgs",
"ssgGsgwg",
"gssgGsgw",
"wgssgGsg",
]
elements.ground = {
color: ["#464128","#464128","#5f5731","#464128"],
colorPattern: textures.GROUND,
colorKey: {
"g": "#464128",
"s": "#5f5731",
},
grain:0.25,
behavior: behaviors.WALL,
reactions: {
},
tempHigh: 1500,
stateHigh: "lava",
category: "land",
state: "solid",
density: 10000,
hardness: 0.5,
breakInto: "noita_sand",
corrodible: true,
static: true,
earth: true,
meltableLava: true,
}
elements.noita_rock = {
color: ["#27282d","#27282d","#3e4555","#27282d"],
colorPattern: textures.GROUND,
colorKey: {
"g": "#27282d",
"s": "#3e4555",
},
tick: function(pixel) {
if (isEmpty(pixel.x+1,pixel.y) && Math.random() > 0.99 && (pixel.start + 25) < pixelTicks) {
createPixel("moss",pixel.x+1,pixel.y)
pixelMap[pixel.x+1][pixel.y].settled = true
}
else if (isEmpty(pixel.x-1,pixel.y) && Math.random() > 0.99 && (pixel.start + 25) < pixelTicks) {
createPixel("moss",pixel.x-1,pixel.y)
pixelMap[pixel.x-1][pixel.y].settled = true
}
else if (isEmpty(pixel.x,pixel.y+1) && Math.random() > 0.99 && (pixel.start + 25) < pixelTicks) {
createPixel("moss",pixel.x,pixel.y+1)
pixelMap[pixel.x][pixel.y+1].settled = true
}
else if (isEmpty(pixel.x,pixel.y-1) && Math.random() > 0.99 && (pixel.start + 25) < pixelTicks) {
createPixel("moss",pixel.x,pixel.y-1)
pixelMap[pixel.x][pixel.y-1].settled = true
}
doDefaults(pixel);
},
movable: false,
grain:0.25,
name: "rock",
reactions: {
},
tempHigh: 1500,
stateHigh: "lava",
category: "land",
state: "solid",
density: 10000,
hardness: 0.5,
corrodible: true,
static: true,
earth: true,
meltableLava: true,
}
elements.volcanic_rock = {
color: ["#441e1f","#441e1f","#5f2621","#441e1f"],
colorPattern: textures.ALTGROUND,
colorKey: {
"g": "#441e1f",
"s": "#5f2621",
"S": "#52201c",
},
grain:0.25,
behavior: behaviors.WALL,
reactions: {
},
tempHigh: 1500,
stateHigh: "lava",
category: "land",
state: "solid",
density: 10000,
hardness: 0.5,
corrodible: true,
static: true,
earth: true,
meltableLava: true,
}
elements.fools_gold = {
color: ["#ffef42","#ffef42","#ffff86","#ffef42"],
name: "fool's gold",
colorPattern: textures.BRICKWORK,
colorKey: {
"g": "#ffef42",
"s": "#ffb81b",
"S": "#bb8632",
"w": "#ffff86"
},
grain:0.1,
behavior: behaviors.WALL,
reactions: {
},
tempHigh: 1500,
stateHigh: "lava",
category: "land",
state: "solid",
density: 10000,
hardness: 0.5,
corrodible: true,
static: true,
earth: true,
meltableLava: true,
}
elements.glowing_matter = {
color: ["#234630","#234630","#3b6e53","#234630"],
colorPattern: textures.GROUND,
colorKey: {
"g": "#234630",
"s": "#3b6e53",
},
tick: function(pixel) {
if (isEmpty(pixel.x+1,pixel.y) && Math.random() > 0.9 && (pixel.start + 25) < pixelTicks) {
createPixel("green_slime",pixel.x+1,pixel.y)
}
else if (isEmpty(pixel.x-1,pixel.y) && Math.random() > 0.9 && (pixel.start + 25) < pixelTicks) {
createPixel("green_slime",pixel.x-1,pixel.y)
}
else if (isEmpty(pixel.x,pixel.y+1) && Math.random() > 0.9 && (pixel.start + 25) < pixelTicks) {
createPixel("green_slime",pixel.x,pixel.y+1)
}
else if (isEmpty(pixel.x,pixel.y-1) && Math.random() > 0.9 && (pixel.start + 25) < pixelTicks) {
createPixel("green_slime",pixel.x,pixel.y-1)
}
doDefaults(pixel);
},
movable: false,
grain:0.25,
behavior: behaviors.WALL,
reactions: {
},
tempHigh: 1500,
stateHigh: "lava",
category: "land",
state: "solid",
density: 10000,
hardness: 0.5,
corrodible: true,
static: true,
earth: true,
meltableLava: true,
}
elements.poisonous_rock = {
color: ["#662e83","#662e83","#8b45ac","#662e83"],
colorPattern: textures.GROUND,
colorKey: {
"g": "#662e83",
"s": "#8b45ac",
},
grain:0.25,
behavior: behaviors.WALL,
reactions: {
},
tempHigh: 1500,
stateHigh: "lava",
category: "land",
state: "solid",
density: 10000,
hardness: 0.5,
corrodible: true,
static: true,
earth: true,
meltableLava: true,
}
elements.grey_rock = {
color: ["#4e4e4e","#545454","#616161","#464646"],
colorPattern: textures.GROUND,
colorKey: {
"g": "#4e4e4e",
"s": "#616161",
},
grain:0.3,
behavior: behaviors.WALL,
reactions: {
},
tempHigh: 1500,
stateHigh: "lava",
category: "land",
state: "solid",
density: 10000,
hardness: 0.5,
corrodible: true,
static: true,
earth: true,
meltableLava: true,
}
elements.dense_rock = {
color: ["#37221d","#37221d","#623b32","#37221d"],
colorPattern: textures.GROUND,
colorKey: {
"g": "#37221d",
"s": "#623b32",
},
grain:0.25,
behavior: behaviors.WALL,
reactions: {
},
tempHigh: 1500,
stateHigh: "lava",
category: "land",
state: "solid",
density: 2550,
hardness: 0.9,
static: true,
earth: true,
}
elements.extremely_dense_rock = {
color: ["#251511","#251511","#40231c","#251511"],
colorPattern: textures.GROUND,
colorKey: {
"g": "#251511",
"s": "#40231c",
},
grain:0.25,
behavior: behaviors.WALL,
reactions: {
},
category: "land",
state: "solid",
density: 2550,
hardness: 0.995,
static: true,
earth: true,
}
elements.brickwork = {
color: ["#514a31","#514a31","#403a29","#514a31"],
colorPattern: textures.BRICKWORK,
colorKey: {
"g": "#514a31",
"s": "#403a29",
"S": "#59533b",
"w": "#59533b",
},
grain:0.15,
behavior: behaviors.WALL,
reactions: {
},
category: "solids",
state: "solid",
density: 2550,
hardness: 0.95,
static: true,
earth: true,
corrodible: true
}
elements.noita_wood = {
color: ["#433821","#564832","#322b18","#473c23","#473c23","#473c23","#473c23","#564832","#433821"],
colorPattern: textures.WOOD,
colorKey: {
"g": "#473c23",
"s": "#322b18",
"S": "#564832",
},
renderer: function(pixel,ctx) {
if (!viewInfo[view].colorEffects) { drawDefault(ctx,pixel); return }
if (pixel.alpha === 0) return;
let edge1 = false;
let edge2 = false;
let edge3 = false;
for (var i = 0; i < adjacentCoords.length; i++) {
var coords = adjacentCoords[i];
var x = pixel.x + coords[0];
var y = pixel.y;
if (isEmpty(x,y) || (!outOfBounds(x,y) && elements[pixelMap[x][y].element].movable !== elements[pixel.element].movable)) {
edge1 = true;
break;
}
}
for (var i = 0; i < adjacentCoords.length; i++) {
var coords = adjacentCoords[i];
var x = pixel.x + coords[0];
var y = pixel.y;
if ((isEmpty(x-1,y) || isEmpty(x+1,y)) || (!outOfBounds(x-1,y) && elements[pixelMap[x-1][y].element].movable !== elements[pixel.element].movable) || (!outOfBounds(x+1,y) && elements[pixelMap[x+1][y].element].movable !== elements[pixel.element].movable)) {
edge2 = true;
break;
}
}
for (var i = 0; i < adjacentCoords.length; i++) {
var coords = adjacentCoords[i];
var x = pixel.x + coords[0];
var y = pixel.y;
if (isEmpty(x-2,y) || isEmpty(x+2,y) || (!outOfBounds(x-2,y) && elements[pixelMap[x-2][y].element].movable !== elements[pixel.element].movable) || (!outOfBounds(x+2,y) && elements[pixelMap[x+2][y].element].movable !== elements[pixel.element].movable)) {
edge3 = true;
break;
}
}
if (edge1) { drawSquare(ctx,"#302917",pixel.x,pixel.y) }
else if (edge2) { drawSquare(ctx,"#433821",pixel.x,pixel.y) }
else if (edge3) { drawSquare(ctx,"#302917",pixel.x,pixel.y) }
else { drawSquare(ctx,pixel.color,pixel.x,pixel.y) }
},
grain:0.5,
name: "wood",
behavior: behaviors.WALL,
movable: false,
reactions: {
},
tempHigh: 1500,
stateHigh: "noita_fire",
category: "solids",
burn: 5,
burnTime: 300,
burnInto: ["ember","charcoal","noita_fire"],
burnable: true,
nburnTime: 300,
tick: function(pixel) {
doNHeat(pixel)
doNBurning(pixel)
},
state: "solid",
hardness: 0.2,
breakInto: "sawdust",
forceSaveColor: true,
corrodible: true,
static: true,
}
elements.noita_sand = {
color: ["#c4b999","#c0b287","#baa565","#b59843","#c7c1ad"],
name: "sand",
behavior: behaviors.POWDER,
tempHigh: 1500,
stateHigh: "lava",
reactions: {
"mystery_fungus": { elem2:"mystery_fungus", chance:0.45 },
},
category: "powders",
state: "solid",
density: 6000,
hardness: 0.2,
corrodible: true,
sandGround: true,
meltableLavaFast: true,
}
elements.noita_water = {
color: "#366158",
name: "water",
behavior: behaviors.LIQUID,
tick: function(pixel) {
var coords = rectCoords(pixel.x-1,pixel.y-1,pixel.x+1,pixel.y+1);
for (var i = 0; i < coords.length; i++) {
var x = coords[i].x;
var y = coords[i].y;
if (!isEmpty(x,y,true)) {
if (!outOfBounds(x,y) && (elements[pixelMap[x][y].element].fire === true)) {
changePixel(pixel,"noita_steam")
}
else if (!outOfBounds(x,y) && elements[pixelMap[x][y].element].id === elements.lava.id) {
changePixel(pixel,"noita_steam")
changePixel(pixelMap[x][y],"noita_rock")
}
}
}
},
tempHigh: 150,
stateHigh: "noita_steam",
tempLow: 0,
stateLow: "noita_ice",
category: "liquids",
reactions: {
"fire": { elem1: "noita_steam" },
"noita_fire": { elem1: "noita_steam" },
},
state: "liquid",
density: 4000,
conduct: 0.02,
stain: -0.5,
extinguish: true,
corrodible: true,
water: true,
freezable: true,
}
elements.peat = {
color: ["#6e8c3b","#617d3c"],
behavior: behaviors.LIQUID,
burnable: true,
nburnTime: 35,
tick: function(pixel) {
doNHeat(pixel)
doNBurning(pixel)
doDefaults(pixel)
},
viscosity: 100,
tempHigh: 150,
stateHigh: "noita_fire",
category: "liquids",
reactions: {
},
state: "liquid",
density: 3400,
extinguish: true,
corrodible: true,
impure: true,
plant: true,
}
elements.swamp = {
color: ["#2f2f0a","#272707"],
behavior: behaviors.LIQUID,
tick: function(pixel) {
var coords = rectCoords(pixel.x-1,pixel.y-1,pixel.x+1,pixel.y+1);
for (var i = 0; i < coords.length; i++) {
var x = coords[i].x;
var y = coords[i].y;
if (!isEmpty(x,y,true)) {
if (!outOfBounds(x,y) && (elements[pixelMap[x][y].element].fire === true)) {
changePixel(pixel,"noita_steam")
}
else if (!outOfBounds(x,y) && elements[pixelMap[x][y].element].id === elements.lava.id) {
changePixel(pixel,"noita_steam")
changePixel(pixelMap[x][y],"noita_rock")
}
}
}
},
viscosity: 100,
tempHigh: 150,
stateHigh: "noita_steam",
tempLow: 0,
stateLow: "noita_ice",
category: "liquids",
reactions: {
"fire": { elem1: "noita_steam" },
"noita_fire": { elem1: "noita_steam" },
"toxic_sludge": { elem2:"swamp_water", chance:0.15 },
"noita_water": { elem2:"swamp_water", chance:0.01 },
},
state: "liquid",
density: 3500,
conduct: 0.02,
stain: -0.5,
meltableWater: true,
extinguish: true,
corrodible: true,
water: true,
freezable: true,
soluble: true,
impure: true,
}
elements.swamp_water = {
color: "#2e542c",
name: "swamp",
behavior: behaviors.LIQUID,
tick: function(pixel) {
var coords = rectCoords(pixel.x-1,pixel.y-1,pixel.x+1,pixel.y+1);
for (var i = 0; i < coords.length; i++) {
var x = coords[i].x;
var y = coords[i].y;
if (!isEmpty(x,y,true)) {
if (!outOfBounds(x,y) && (elements[pixelMap[x][y].element].fire === true)) {
changePixel(pixel,"noita_steam")
}
else if (!outOfBounds(x,y) && elements[pixelMap[x][y].element].id === elements.lava.id) {
changePixel(pixel,"noita_steam")
changePixel(pixelMap[x][y],"noita_rock")
}
}
}
if (isEmpty(pixel.x,pixel.y-1) && Math.random() > 0.94 && (pixel.start + 100) < pixelTicks) {
changePixel(pixel, "peat")
}
},
tempHigh: 150,
stateHigh: "noita_steam",
tempLow: 0,
stateLow: "noita_ice",
category: "liquids",
reactions: {
"fire": { elem1: "noita_steam" },
"noita_fire": { elem1: "noita_steam" },
"toxic_sludge": { elem2:"swamp_water", chance:0.17 },
},
state: "liquid",
density: 3400,
conduct: 0.02,
stain: -0.5,
extinguish: true,
corrodible: true,
water: true,
impure: true,
}
elements.noita_steam = {
color: ["#61617d","#61617d","#47475c","#47475c","#61617d"],
name: "steam",
behavior: behaviors.GAS,
tick: function(pixel) {
if (Math.random() > 0.95 && Math.random() > 0.95 && (pixel.start + 500) < pixelTicks) {
changePixel(pixel,"noita_water")
}
var coords = rectCoords(pixel.x-1,pixel.y-1,pixel.x+1,pixel.y+1);
for (var i = 0; i < coords.length; i++) {
var x = coords[i].x;
var y = coords[i].y;
if (!isEmpty(x,y,true)) {
if (!outOfBounds(x,y) && elements[pixelMap[x][y].element].static === true && Math.random() > 0.97) {
changePixel(pixel,"noita_water")
}
}
}
doDefaults(pixel);
},
reactions: {
},
tempLow: 10,
stateLow: "noita_water",
category: "gases",
state: "gas",
density: 0.6,
conduct: 0.002,
stain: -0.05,
alias: "water vapor",
extinguish: true
}
elements.noita_ice = {
color: ["#4c8fb0","#4c8fb0","#4c8fb0","#55a7bf","#80b6d1","#55a7bf","#4c8fb0"],
name: "ice",
behavior: behaviors.WALL,
tempHigh: 25,
stateHigh: "noita_water",
category: "solids",
state: "solid",
density: 917,
breakInto: "noita_snow",
corrodible: true,
static: true,
meltableWater: true,
frozen: true,
}
elements.noita_snow = {
color: ["#a6c2d8","#81b0d2"],
name: "snow",
behavior: behaviors.POWDER,
tick: function(pixel) {
var coords = rectCoords(pixel.x-1,pixel.y-1,pixel.x+1,pixel.y+1);
for (var i = 0; i < coords.length; i++) {
var x = coords[i].x;
var y = coords[i].y;
if (!isEmpty(x,y,true)) {
if (!outOfBounds(x,y) && elements[pixelMap[x][y].element].fire === true) {
changePixel(pixel,"noita_steam")
}
}
}
},
reactions: {
"fire": { elem1: "noita_steam" },
},
tempHigh: 25,
tempLow: -100,
stateLow: "noita_packed_snow",
stateHigh: "noita_water",
category: "land",
state: "solid",
density: 100,
corrodible: true,
static: true,
frozen: true,
meltableWater: true,
}
elements.noita_packed_snow = {
color: ["#a6c2d8","#a6c2d8","#81b0d2","#a6c2d8"],
name: "packed_snow",
behavior: behaviors.WALL,
tick: function(pixel) {
var coords = rectCoords(pixel.x-1,pixel.y-1,pixel.x+1,pixel.y+1);
for (var i = 0; i < coords.length; i++) {
var x = coords[i].x;
var y = coords[i].y;
if (!isEmpty(x,y,true)) {
if (!outOfBounds(x,y) && elements[pixelMap[x][y].element].fire === true) {
changePixel(pixel,"noita_steam")
}
}
}
},
reactions: {
"fire": { elem1: "noita_steam" },
},
tempHigh: 25,
tempLow: -200,
stateLow: "noita_ice",
stateHigh: "noita_water",
breakInto: "noita_snow",
category: "land",
state: "solid",
density: 400,
static: true,
frozen: true,
meltableWater: true,
}
elements.noita_poison = {
color: "#cb42ff",
name: "poison",
behavior: behaviors.LIQUID,
tick: function(pixel) {
if (isEmpty(pixel.x+1,pixel.y) && Math.random() > 0.95 && (pixel.start + 25) < pixelTicks) {
createPixel("noita_poison_gas",pixel.x+1,pixel.y)
}
else if (isEmpty(pixel.x-1,pixel.y) && Math.random() > 0.95 && (pixel.start + 25) < pixelTicks) {
createPixel("noita_poison_gas",pixel.x-1,pixel.y)
}
else if (isEmpty(pixel.x,pixel.y+1) && Math.random() > 0.95 && (pixel.start + 25) < pixelTicks) {
createPixel("noita_poison_gas",pixel.x,pixel.y+1)
}
else if (isEmpty(pixel.x,pixel.y-1) && Math.random() > 0.95 && (pixel.start + 25) < pixelTicks) {
createPixel("noita_poison_gas",pixel.x,pixel.y-1)
}
doDefaults(pixel);
},
tempHigh: 150,
stateHigh: "noita_poison_gas",
tempLow: 0,
stateLow: "noita_poison_ice",
category: "liquids",
reactions: {
"noita_blood": { elem1: "pink_slime", elem2: "noita_smoke", chance:0.10 },
"noita_meat": { elem2: "noita_rotten_meat", chance:0.50 },
"noita_poison": { elem2: "poisonous_rock", elem1: "noita_poison_gas", chance:0.70 },
},
state: "liquid",
density: 3000,
conduct: 0.8,
corrodible: true,
water: true,
impure: true,
soluble: true,
}
elements.noita_poison_gas = {
color: ["#59147d","#59147d","#59147d","#410b5c","#410b5c"],
name: "poison_gas",
behavior: behaviors.GAS,
tick: function(pixel) {
if (Math.random() > 0.9 && (pixel.start + 225) < pixelTicks) {
deletePixel(pixel.x,pixel.y)
}
doDefaults(pixel);
},
reactions: {
"noita_blood": { elem1: "pink_slime", elem2: "noita_smoke", chance:0.10 },
},
tempLow: 10,
stateLow: "noita_poison",
category: "gases",
state: "gas",
density: 2000,
burnableFast: true,
}
elements.noita_poison_ice = {
color: ["#4c8fb0","#4c8fb0","#4c8fb0","#55a7bf","#80b6d1","#55a7bf","#4c8fb0"],
name: "ice",
behavior: behaviors.WALL,
reactions: {
},
tempHigh: 25,
stateHigh: "noita_poison",
category: "solids",
state: "solid",
density: 10000,
corrodible: true,
static: true,
meltablePoison: true,
frozen: true,
}
elements.urine = {
color: "#ffeb00",
behavior: behaviors.LIQUID,
tempHigh: 150,
stateHigh: "noita_steam",
tempLow: 0,
stateLow: "noita_ice",
category: "liquids",
reactions: {
"noita_snow": { elem1: "noita_water", elem2: "noita_steam", chance:0.20 },
"lava": { elem1: "noita_steam", elem2: "fools_gold", chance:0.70 },
},
state: "liquid",
density: 4000,
conduct: 0.02,
stain: -0.5,
extinguish: true,
corrodible: true,
soluble: true,
}
elements.brine = {
color: "#2e744b",
behavior: behaviors.LIQUID,
tempHigh: 150,
stateHigh: "noita_steam",
tempLow: 0,
stateLow: "noita_ice",
category: "liquids",
tick: function(pixel) {
var coords = rectCoords(pixel.x-1,pixel.y-1,pixel.x+1,pixel.y+1);
for (var i = 0; i < coords.length; i++) {
var x = coords[i].x;
var y = coords[i].y;
if (!isEmpty(x,y,true)) {
if (!outOfBounds(x,y) && elements[pixelMap[x][y].element].fire === true) {
if (Math.random() > 0.5) {
changePixel(pixel,"noita_steam")
}
else {
changePixel(pixel,"noita_salt")
}
}
}
}
},
reactions: {
"lava": { elem1: "noita_steam", elem2: "glowing_matter", chance:0.20 },
"toxic_sludge": { elem2: "noita_water", chance:0.20 },
},
state: "liquid",
density: 4000,
conduct: 0.02,
stain: -0.5,
extinguish: true,
corrodible: true,
freezable: true,
water: true,
}
elements.pink_slime = {
color: ["#bb2f83","#942769"],
name: "slime",
behavior: behaviors.LIQUID,
viscosity: 1000,
tempHigh: 1000,
stateHigh: "noita_fire",
tempLow: 0,
category: "liquids",
reactions: {
"noita_water": { elem1: "slime_mist", chance:0.10 },
"whiskey": { elem1: "noita_smoke", chance:0.30 },
"lava": { elem1: "static_hell_slime", elem2: "static_hell_slime", chance:0.70 },
},
state: "liquid",
density: 5000,
conduct: 0.02,
stain: -0.5,
isFood: true,
corrodible: true,
meltableLava: true,
slime: true,
}
elements.green_slime = {
color: ["#6d8b3b","#607c3b"],
name: "slime",
behavior: behaviors.LIQUID,
tick: function(pixel) {
if (isEmpty(pixel.x+1,pixel.y) && Math.random() > 0.95 && (pixel.start + 25) < pixelTicks) {
deletePixel(pixel.x,pixel.y)
}
else if (isEmpty(pixel.x-1,pixel.y) && Math.random() > 0.95 && (pixel.start + 25) < pixelTicks) {
deletePixel(pixel.x,pixel.y)
}
else if (isEmpty(pixel.x,pixel.y+1) && Math.random() > 0.95 && (pixel.start + 25) < pixelTicks) {
deletePixel(pixel.x,pixel.y)
}
else if (isEmpty(pixel.x,pixel.y-1) && Math.random() > 0.95 && (pixel.start + 25) < pixelTicks) {
deletePixel(pixel.x,pixel.y)
}
doDefaults(pixel);
},
viscosity: 1000,
tempHigh: 1000,
stateHigh: "noita_fire",
tempLow: 0,
category: "liquids",
reactions: {
"lava": { elem1: "fungal_gas", elem1: "green_fungus", chance:0.70 },
},
state: "liquid",
density: 5000,
conduct: 0.02,
stain: -0.5,
isFood: true,
corrodible: true,
meltableLava: true,
slime: true,
}
elements.yellow_slime = {
color: ["#bec538","#92982c"],
name: "slime",
behavior: behaviors.LIQUID,
tick: function(pixel) {
if (isEmpty(pixel.x+1,pixel.y) && Math.random() > 0.95 && (pixel.start + 25) < pixelTicks) {
deletePixel(pixel.x,pixel.y)
}
else if (isEmpty(pixel.x-1,pixel.y) && Math.random() > 0.95 && (pixel.start + 25) < pixelTicks) {
deletePixel(pixel.x,pixel.y)
}
else if (isEmpty(pixel.x,pixel.y+1) && Math.random() > 0.95 && (pixel.start + 25) < pixelTicks) {
deletePixel(pixel.x,pixel.y)
}
else if (isEmpty(pixel.x,pixel.y-1) && Math.random() > 0.95 && (pixel.start + 25) < pixelTicks) {
deletePixel(pixel.x,pixel.y)
}
doDefaults(pixel);
},
viscosity: 1000,
tempHigh: 1000,
stateHigh: "noita_fire",
tempLow: 0,
category: "liquids",
reactions: {
"lava": { elem1: "fungal_gas", elem1: "yellow_fungus", chance:0.70 },
},
state: "liquid",
density: 5000,
conduct: 0.02,
stain: -0.5,
isFood: true,
corrodible: true,
meltableLava: true,
slime: true,
}
elements.hell_slime = {
color: ["#714242","#784747"],
behavior: behaviors.LIQUID,
viscosity: 1000,
tempHigh: 1000,
stateHigh: "noita_fire",
tempLow: 0,
category: "liquids",
reactions: {
},
state: "liquid",
density: 4000,
conduct: 0.02,
stain: -0.5,
isFood: true,
earth: true,
static: true,
slime: true,
corrodible: true,
}
elements.static_hell_slime = {
color: ["#714242","#784747"],
name: "hell_slime",
behavior: behaviors.WALL,
tempHigh: 1000,
stateHigh: "noita_fire",
tempLow: 0,
category: "liquids",
reactions: {
},
state: "liquid",
density: 5000,
conduct: 0.02,
stain: -0.5,
isFood: true,
static: true,
slime: true,
corrodible: true,
}
elements.pus = {
color: ["#8d504b","#8f6046","#8d5249","#7d5044","#915449"],
behavior: behaviors.LIQUID,
tick: function(pixel) {
var coords = rectCoords(pixel.x-1,pixel.y-1,pixel.x+1,pixel.y+1);
for (var i = 0; i < coords.length; i++) {
var x = coords[i].x;
var y = coords[i].y;
if (!isEmpty(x,y,true)) {
if (!outOfBounds(x,y) && (elements[pixelMap[x][y].element].fungus === true) && Math.random() > 0.60) {
changePixel(pixel,"weird_fungus")
changePixel(pixelMap[x][y],"weird_fungus")
}
if (!outOfBounds(x,y) && (elements[pixelMap[x][y].element].sandMetal === true || elements[pixelMap[x][y].element].gold === true) && Math.random() > 0.80) {
changePixel(pixelMap[x][y],"noita_smoke")
}
}
}
},
viscosity: 1000,
tempHigh: 150,
stateHigh: "noita_steam",
tempLow: 0,
category: "liquids",
reactions: {
"noita_water": { elem2: "pus", chance:0.80 },
"toxic_sludge": { elem2: "pus", chance:0.80 },
"noita_aluminium": { elem2: "noita_smoke", chance:0.10 },
"noita_grass": { elem2: "noita_smoke", chance:0.80 },
},
state: "liquid",
density: 1243.4,
conduct: 0.02,
stain: -0.5,
isFood: true,
corrodible: true,
impure: true,
water: true,
}
elements.noita_oil = {
color: "#3d3628",
name: "oil",
behavior: behaviors.LIQUID,
burnable: true,
nburnTime: 500,
tick: function(pixel) {
doNHeat(pixel)
doNBurning(pixel)
},
tempHigh: 1000,
category: "liquids",
reactions: {
"noita_meat": { func:function(pixel1,pixel2){ if (pixel1.NBurning === true && Math.random()> 0.9) {changePixel(pixel2,"lightly_cooked_meat");} } },
"lightly_cooked_meat": { func:function(pixel1,pixel2){ if (pixel1.NBurning === true && ((pixel1.NBurnStart - pixelTicks) < -100) && Math.random()> 0.8) {changePixel(pixel2,"noita_cooked_meat");} } },
"noita_cooked_meat": { func:function(pixel1,pixel2){ if (pixel1.NBurning === true && ((pixel1.NBurnStart - pixelTicks) < -225) && Math.random()> 0.9) {changePixel(pixel2,"fully_cooked_meat");} } },
"fully_cooked_meat": { func:function(pixel1,pixel2){ if (pixel1.NBurning === true && ((pixel1.NBurnStart - pixelTicks) < -450) && Math.random()> 0.95) {changePixel(pixel2,"burned_meat");} } },
},
state: "liquid",
density: 1000,
corrodible: true,
impure: true,
}
elements.noita_gold = {
color: ["#ffd785","#f9bb50","#e18c68","#ffd785","#f9bb50","#e18c68","#ffffb5","#ffd785","#f9bb50","#e18c68","#ffffb5","#ffffff"],
name: "gold",
behavior: behaviors.POWDER,
tempHigh: 1500,
stateHigh: "noita_molten_gold",
reactions: {
"flummoxium": { elem1:"levitatium", elem2:"levitatium", chance:0.45 },
"diminution": { elem1:"noita_silver" },
},
category: "powders",
state: "solid",
density: 8000,
conduct: 0.8,
hardness: 0.25,
sandMetal: true,
corrodible: true,
meltableMetal: true,
}
elements.noita_molten_gold = {
color: ["#ffd785","#f9bb50","#e18c68","#ffd785","#f9bb50","#e18c68","#ffffb5","#ffd785","#f9bb50","#e18c68","#ffffb5","#ffffff"],
name: "molten_gold",
behavior: behaviors.LIQUID,
viscosity: 100,
tempLow: 10,
stateLow: "noita_gold",
reactions: {
},
density: 3000,
conduct: 0.8,
corrodible: true,
molten: true,
}
elements.metal_dust = {
color: ["#606d70","#3e4555","#758582","#bec8c1"],
behavior: behaviors.POWDER,
reactions: {
},
tempHigh: 1500,
stateHigh:"molten_metal",
category: "powders",
density: 8000,
state: "solid",
conduct: 0.8,
hardness: 0.25,
sandMetal: true,
corrodible: true,
meltableMetal: true,
}
elements.molten_metal = {
color: ["#7d8a8d","#dbe5de","#5b6272","#92a29f"],
behavior: behaviors.LIQUID,
viscosity: 100,
tempLow: 10,
stateLow: "metal_dust",
reactions: {
},
density: 3000,
conduct: 0.8,
corrodible: true,
molten: true,
}
elements.noita_brass = {
color: ["#c7632e","#ae4a54","#d68b67","#f5dc99","#c7632e","#ae4a54","#d68b67","#f5dc99","#ffffff"],
name:"brass",
behavior: behaviors.POWDER,
tick: function(pixel) {
var coords = rectCoords(pixel.x-1,pixel.y-1,pixel.x+1,pixel.y+1);
for (var i = 0; i < coords.length; i++) {
var x = coords[i].x;
var y = coords[i].y;
if (!isEmpty(x,y,true)) {
if (!outOfBounds(x,y) && (elements[pixelMap[x][y].element].fungus === true)) {
changePixel(pixel,"funky_cloud")
changePixel(pixelMap[x][y],"funky_cloud")
}
}
}
},
reactions: {
"noita_diamond": { elem1:"purifying_powder", elem2:"purifying_powder", chance:0.5, },
"unstable_teleportatium": { elem2:"noita_smoke", elem1:"metal_dust", chance:0.50 },
"pus": { elem1:"noita_smoke", chance:0.20 },
},
tempHigh: 1500,
stateHigh:"noita_molten_brass",
category: "powders",
density: 8000,
state: "solid",
conduct: 0.8,
hardness: 0.275,
sandMetal: true,
corrodible: true,
meltableMetal: true,
}
elements.noita_molten_brass = {
color: ["#ffffc1","#ff937c","#ffac56","#ffd48f","#ffffc1","#ff937c","#ffac56","#ffd48f","#ffffff"],
name: "molten_brass",
behavior: behaviors.LIQUID,
viscosity: 100,
tempLow: 10,
stateLow: "noita_brass",
reactions: {
},
density: 3000,
conduct: 0.8,
corrodible: true,
molten: true,
}
elements.noita_copper = {
color: ["#58444d","#915861","#b2947a","#cfbf9d"],
name:"copper",
behavior: behaviors.POWDER,
reactions: {
"teleportatium": { elem1:"noita_brass", elem2:"noita_smoke", chance:0.5, },
"polymorphine": { elem1:"polymorphine_cloud", elem2:"polymorphine_cloud", chance:0.5, },
"flummoxium": { elem1:"levitatium", elem2:"levitatium", chance:0.45, },
"pus": { elem1:"noita_smoke", chance:0.20 },
},
tempHigh: 1500,
stateHigh:"noita_molten_copper",
category: "powders",
density: 8000,
state: "solid",
conduct: 0.8,
hardness: 0.3,
sandMetal: true,
corrodible: true,
meltableMetal: true,
}
elements.noita_molten_copper = {
color: ["#ad8d75","#ffffc5","#e6a189","#ffdda2"],
name: "molten_copper",
behavior: behaviors.LIQUID,
viscosity: 100,
tempLow: 10,
stateLow: "noita_copper",
reactions: {
},
density: 3000,
conduct: 0.8,
corrodible: true,
molten: true,
}
elements.noita_silver = {
color: ["#94938f","#f9f9f2","#c1c0bb","#ffffff"],
name:"silver",
behavior: behaviors.POWDER,
reactions: {
"polymorphine": { elem1:"noita_copper", elem2:"noita_smoke", chance:0.5, },
"teleportatium": { elem1:"teleportatium_cloud", elem2:"teleportatium_cloud", chance:0.1, },
"pus": { elem1:"noita_smoke", chance:0.20 },
},
tempHigh: 1500,
stateHigh:"noita_molten_silver",
category: "powders",
density: 8000,
state: "solid",
conduct: 0.8,
hardness: 0.25,
sandMetal: true,
corrodible: true,
meltableMetal: true,
}
elements.noita_molten_silver = {
color: ["#e0dbca","#b3ae9e","#ffffff"],
name: "molten_silver",
behavior: behaviors.LIQUID,
viscosity: 100,
tempLow: 10,
stateLow: "noita_silver",
reactions: {
},
density: 3000,
conduct: 0.8,
corrodible: true,
molten: true,
}
elements.noita_steel = {
color: ["#907e55","#4c4137","#695b4b","#695b4b","#695b4b","#6e5f4e","#5d5043","#84744e","#6e5f4e","#6e5f4e","#6e5f4e","#6e5f4e","#5d5043","#84744e","#4c4137","#907e55"],
colorPattern: textures.STEEL,
colorKey: {
"g": "#6e5f4e",
"s": "#5d5043",
"G": "#84744e",
"w": "#695b4b"
},
renderer: function(pixel,ctx) {
if (!viewInfo[view].colorEffects) { drawDefault(ctx,pixel); return }
if (pixel.alpha === 0) return;
let edge1 = false;
let edge2 = false;
let edge3 = false;
for (var i = 0; i < adjacentCoords.length; i++) {
var coords = adjacentCoords[i];
var x = pixel.x + coords[0];
var y = pixel.y + coords[1];
if (isEmpty(x,y) || (!outOfBounds(x,y) && elements[pixelMap[x][y].element].movable !== elements[pixel.element].movable)) {
edge1 = true;
break;
}
}
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-1,y) || isEmpty(x,y-1) || isEmpty(x+1,y) || isEmpty(x,y+1) || (!outOfBounds(x-1,y) && elements[pixelMap[x-1][y].element].movable !== elements[pixel.element].movable) || (!outOfBounds(x+1,y) && elements[pixelMap[x+1][y].element].movable !== elements[pixel.element].movable) || (!outOfBounds(x,y-1) && elements[pixelMap[x][y-1].element].movable !== elements[pixel.element].movable) || (!outOfBounds(x,y+1) && elements[pixelMap[x][y+1].element].movable !== elements[pixel.element].movable)) {
edge2 = true;
break;
}
}
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-2,y) || isEmpty(x,y-2) || isEmpty(x+2,y) || isEmpty(x,y+2) || (!outOfBounds(x-2,y) && elements[pixelMap[x-2][y].element].movable !== elements[pixel.element].movable) || (!outOfBounds(x+2,y) && elements[pixelMap[x+2][y].element].movable !== elements[pixel.element].movable) || (!outOfBounds(x,y-2) && elements[pixelMap[x][y-2].element].movable !== elements[pixel.element].movable) || (!outOfBounds(x,y+2) && elements[pixelMap[x][y+2].element].movable !== elements[pixel.element].movable)) {
edge3 = true;
break;
}
}
if (edge1) { drawSquare(ctx,"#4c4137",pixel.x,pixel.y) }
else if (edge2) { drawSquare(ctx,"#6e5f4e",pixel.x,pixel.y) }
else if (edge3) { drawSquare(ctx,"#907e55",pixel.x,pixel.y) }
else { drawSquare(ctx,pixel.color,pixel.x,pixel.y) }
},
grain: 0.1,
name:"steel",
behavior: behaviors.WALL,
reactions: {
},
tempHigh: 1500,
stateHigh:"molten_metal",
category: "solids",
density: 8000,
state: "solid",
conduct: 0.8,
hardness: 0.8,
static: true,
meltableMetalGeneric: true,
corrodible: true,
rust: true,
}
elements.noita_prop_steel = {
color: ["#c1c8be","#606d70","#3e4555","#758582","#bec8c1","#25333b"],
colorPattern: textures.STATICSHINE,
colorKey: {
"g": "#606d70",
"s": "#3e4555",
"G": "#758582",
"w": "#bec8c1"
},
renderer: function(pixel,ctx) {
if (!viewInfo[view].colorEffects) { drawDefault(ctx,pixel); return }
if (pixel.alpha === 0) return;
let edge1 = false;
let edge2 = false;
let edge3 = false;
if ((isEmpty(pixel.x-1,pixel.y) || isEmpty(pixel.x,pixel.y-1)) && !isEmpty(pixel.x,pixel.y+1,true) && !isEmpty(pixel.x+1,pixel.y,true)) {
edge1 = true;
}
else if ((isEmpty(pixel.x+1,pixel.y) || isEmpty(pixel.x,pixel.y+1)) && !isEmpty(pixel.x,pixel.y-1,true) && !isEmpty(pixel.x-1,pixel.y,true)) {
edge2 = true;
}
else 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)) {
edge3 = true;
}
if (edge1) { drawSquare(ctx,"#c1c8be",pixel.x,pixel.y) }
else if (edge2) { drawSquare(ctx,"#25333b",pixel.x,pixel.y) }
else if (edge3) { drawSquare(ctx,"#4f5eab",pixel.x,pixel.y) }
else { drawSquare(ctx,pixel.color,pixel.x,pixel.y) }
},
name:"steel",
behavior: behaviors.STURDYPOWDER,
reactions: {
},
tempHigh: 1500,
stateHigh:"noita_molten_prop_steel",
category: "solids",
density: 8000,
state: "solid",
conduct: 0.8,
hardness: 0.8,
meltableMetal: true,
corrodible: true,
rust: true,
}
elements.noita_steel_sand = {
color: ["#3e4555","#758582","#606d70","#bec8c1"],
name:"steel",
behavior: behaviors.POWDER,
reactions: {
"polymorphine": { elem1:"noita_copper", elem2:"noita_smoke", chance:0.5, },
"teleportatium": { elem1:"teleportatium_cloud", elem2:"teleportatium_cloud", chance:0.1, },
"pus": { elem1:"noita_smoke", chance:0.20 },
},
tempHigh: 1500,
stateHigh:"noita_molten_steel",
category: "powders",
density: 8000,
state: "solid",
conduct: 0.8,
hardness: 0.8,
sandMetal: true,
corrodible: true,
}
elements.noita_molten_prop_steel = {
color: ["#b5b698","#ffffe9","#938e7d","#caceaa"],
name: "molten metal",
behavior: behaviors.LIQUID,
viscosity: 100,
tempLow: 10,
stateLow: "noita_steel_sand",
reactions: {
},
density: 2000,
conduct: 0.8,
corrodible: true,
nmolten: true,
}
elements.noita_molten_steel = {
color: ["#7a6d60","#867868","#a1916b","#7a6d60"],
name: "molten steel",
behavior: behaviors.LIQUID,
viscosity: 100,
tempLow: 10,
stateLow: "metal_dust",
reactions: {
},
density: 5000,
conduct: 0.8,
corrodible: true,
moltenMetal: true,
gold: true
}
elements.noita_aluminium = {
color: ["#c1c8be","#606d70","#3e4555","#758582","#bec8c1","#25333b"],
colorPattern: textures.STATICSHINE,
colorKey: {
"g": "#606d70",
"s": "#3e4555",
"G": "#758582",
"w": "#bec8c1"
},
name:"aluminium",
behavior: behaviors.WALL,
reactions: {
},
tempHigh: 1500,
stateHigh:"noita_molten_prop_steel",
category: "solids",
density: 8000,
state: "solid",
conduct: 0.8,
hardness: 0.8,
earth: true,
meltableMetal: true,
corrodible: true,
rustOxide: true,
}
elements.aluminium_oxide = {
color: ["#d1d1d2","#c5c1b8","#bdb59c","#ccc49f"],
name:"aluminium",
behavior: behaviors.WALL,
reactions: {
},
tempHigh: 1500,
stateHigh:"noita_molten_prop_steel",
category: "solids",
density: 8000,
state: "solid",
conduct: 0.8,
hardness: 0.8,
earth: true,
meltableMetal: true,
corrodible: true,
rustOxide: true,
}
elements.noita_diamond = {
color: ["#97ebff","#97ebff","#ffffff","#c4ffff","#78b7d5","#78b7d5"],
name:"diamond",
behavior: behaviors.POWDER,
reactions: {
"noita_brass": { elem1:"purifying_powder", elem2:"purifying_powder", chance:0.5, },
"chaotic_polymorphine": { elem1:"silver", elem2:"smoke", chance:0.5, },
"noita_honey": { elem2:"ambrosia", elem1:"noita_poison", chance:0.5, },
"flummoxium": { elem1:"levitatium", elem2:"levitatium", chance:0.45, },
"diminution": { elem1:"toxic_sludge" },
},
category: "powders",
state: "solid",
density: 8000,
hardness: 0.99,
sandMetal: true,
}
elements.noita_glass = {
color: ["#76bed1","#6aabc3","#83dbe2"],
renderer: renderPresets.BORDER,
name:"glass",
behavior: behaviors.WALL,
reactions: {
"concentrated_mana": { elem1:"noita_steam", chance:0.25 },
},
tempHigh: 1500,
stateHigh:"noita_molten_glass",
category: "solids",
density: 6000,
state: "solid",
hardness: 0.2,
meltableMetal: true,
static: true,
earth: true,
}
elements.glass_broken = {
color: ["#74bed0","#74bed0","#82dbe2","#69aac2"],
name:"glass",
behavior: behaviors.POWDER,
reactions: {
"concentrated_mana": { elem1:"noita_steam", chance:0.25 },
},
tempHigh: 1500,
stateHigh:"noita_molten_glass",
category: "powders",
density: 6000,
state: "solid",
conduct: 0.8,
hardness: 0.1,
sandOther: true,
meltableMetal: true,
earth: true
}
elements.noita_molten_glass = {
color: ["#d7ffff","#d7ffff","#bef4eb"],
name: "molten_glass",
behavior: behaviors.LIQUID,
viscosity: 100,
tempLow: 10,
stateLow: "noita_glass",
reactions: {
},
density: 5000,
conduct: 0.8,
molten: true,
meltableLava: true,
earth: true
}
elements.lava = {
color: "#ff8100",
behavior: behaviors.LIQUID,
onCollide: function(pixel1,pixel2) {
if (elements[pixel2.element].burnable === true && Math.random() < 0.08) {
changePixel(pixel2,"noita_fire")
pixel2.NBurning = true
}
else if (elements[pixel2.element].burnableFast === true && Math.random() < 0.8) {
changePixel(pixel2,"noita_fire")
pixel2.NBurning = true
}
else if (elements[pixel2.element].meltableLava === true && Math.random() < 0.03) {
changePixel(pixel2,"noita_fire")
pixel2.NBurning = true
changePixel(pixel1,"noita_smoke")
}
else if (elements[pixel2.element].meltableLavaFast === true && Math.random() < 0.8) {
changePixel(pixel2,"lava")
changePixel(pixel1,"noita_smoke")
}
else if (elements[pixel2.element].meltableMetal === true && Math.random() < 0.8) {
changePixel(pixel2,elements[pixel2.element].stateHigh)
}
},
reactions: {
"freezing_liquid": { elem1: "dense_rock", elem2: "freezing_vapour", chance:0.80 },
"frozen_steel": { elem1: "volcanic_rock", elem2: "noita_steel", chance:0.80 },
"noita_poison": { elem1: "poisonous_rock", elem2: "noita_poison_gas", chance:0.70 },
"brine": { elem1: "glowing_matter", elem2: "noita_steam", chance:0.80 },
"urine": { elem1: "fools_gold", elem2: "noita_steam", chance:0.70 },
"noita_water": { elem1: "noita_rock", elem2: "noita_steam", chance:0.80 },
"noita_mud": { elem1: "ground", elem2: "noita_steam", chance:0.80 },
"noita_blood": { elem1: "volcanic_rock", elem2: "noita_steam", chance:0.70 },
"noita_gunpowder": { elem2: "noita_fire", chance:0.70 },
"teleportatium": { elem2:"teleportatium_cloud", chance:0.80 },
},
tempLow: 10,
stateLow: "noita_rock",
viscosity: 100,
category: "liquids",
state: "liquid",
density: 6000,
}
elements.noita_fire = {
color: "#ff9700",
name: "fire",
tick: function(pixel){
if (!pixel.NBurning) {pixel.NBurning = true}
if (pixel.start === pixelTicks) {return}
let move1Spots = adjacentCoords.slice(0);
let moved = false;
for (var i = 0; i < move1Spots.length; i++) {
const j = Math.random()*move1Spots.length | 0;
const coords = move1Spots[j];
const x = pixel.x+coords[0];
const y = pixel.y+coords[1];
if (tryMove(pixel, x, y)) { 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);
}
}
if (pixel.del !== true) {
doNHeat(pixel);
doAirDensity(pixel);
doNBurning(pixel);
if (settings.burn===0 && (pixelTicks-pixel.start > 70) && Math.random() < 0.1) {
changePixel(pixel,"noita_smoke")
}
}
},
onCollide: function(pixel1,pixel2) {
if (elements[pixel2.element].burnable === true) {
pixel2.NBurning = true
}
else if (elements[pixel2.element].burnableFast === true) {
changePixel(pixel2,"noita_fire")
}
if (pixel2.hp && !pixel2.stains.onFire) {
pixel2.stains.onFire = [pixelTicks,1000]
}
},
reactions: {
},
NBurning: true,
nburnTime: 15,
nburnInto: "noita_smoke",
tempLow:10,
stateLow: "noita_smoke",
category: "energy",
state: "gas",
density: 0.1,
noMix: true,
fire: true,
hot: true,
}
elements.spark = {
color: "#ffee00",
behavior: behaviors.GAS,
tick: function(pixel) {
if (isEmpty(pixel.x+1,pixel.y) && Math.random() > 0.80 && (pixel.start + 3) < pixelTicks) {
deletePixel(pixel.x,pixel.y)
}
else if (isEmpty(pixel.x-1,pixel.y) && Math.random() > 0.80 && (pixel.start + 3) < pixelTicks) {
deletePixel(pixel.x,pixel.y)
}
else if (isEmpty(pixel.x,pixel.y+1) && Math.random() > 0.80 && (pixel.start + 3) < pixelTicks) {
deletePixel(pixel.x,pixel.y)
}
else if (isEmpty(pixel.x,pixel.y-1) && Math.random() > 0.80 && (pixel.start + 3) < pixelTicks) {
deletePixel(pixel.x,pixel.y)
}
doDefaults(pixel);
},
category: "energy",
temp: 40,
tempLow: -270,
stateLow: ["liquid_light",null],
state: "gas",
density: 1000,
hidden: true,
noMix: true,
fire: true,
hot: true,
}
elements.electric_spark = {
color: "#3dffff",
behavior: behaviors.GAS,
charge: 3,
tick: function(pixel) {
if (isEmpty(pixel.x+1,pixel.y) && Math.random() > 0.80 && (pixel.start + 3) < pixelTicks) {
deletePixel(pixel.x,pixel.y)
}
else if (isEmpty(pixel.x-1,pixel.y) && Math.random() > 0.80 && (pixel.start + 3) < pixelTicks) {
deletePixel(pixel.x,pixel.y)
}
else if (isEmpty(pixel.x,pixel.y+1) && Math.random() > 0.80 && (pixel.start + 3) < pixelTicks) {
deletePixel(pixel.x,pixel.y)
}
else if (isEmpty(pixel.x,pixel.y-1) && Math.random() > 0.80 && (pixel.start + 3) < pixelTicks) {
deletePixel(pixel.x,pixel.y)
}
doDefaults(pixel);
},
category: "energy",
temp: 40,
tempLow: -270,
stateLow: ["liquid_light",null],
state: "gas",
density: 1000,
hidden: true,
noMix: true,
fire: true,
hot: true,
}
elements.noita_smoke = {
color: ["#414141","#414141","#313131","#313131","#414141",],
name: "smoke",
behavior: behaviors.GAS,
tick: function(pixel) {
if (Math.random() > 0.9 && (pixel.start + 175) < pixelTicks) {
deletePixel(pixel.x,pixel.y)
}
doDefaults(pixel);
},
reactions: {
},
tempHigh: 1000,
stateHigh: "noita_fire",
category: "gases",
state: "gas",
density: 0.1,
stain: 0.075,
noMix: true
}
elements.freezing_liquid = {
color: ["#6681e5","#607ad7","#7290ff",],
behavior: behaviors.LIQUID,
tick: function(pixel) {
if (isEmpty(pixel.x+1,pixel.y) && Math.random() > 0.80 && (pixel.start + 200) < pixelTicks) {
changePixel(pixel,"freezing_vapour")
}
else if (isEmpty(pixel.x-1,pixel.y) && Math.random() > 0.80 && (pixel.start + 200) < pixelTicks) {
changePixel(pixel,"freezing_vapour")
}
else if (isEmpty(pixel.x,pixel.y+1) && Math.random() > 0.80 && (pixel.start + 200) < pixelTicks) {
changePixel(pixel,"freezing_vapour")
}
else if (isEmpty(pixel.x,pixel.y-1) && Math.random() > 0.80 && (pixel.start + 200) < pixelTicks) {
changePixel(pixel,"freezing_vapour")
}
doDefaults(pixel);
},
onCollide: function(pixel1,pixel2) {
if (elements[pixel2.element].freezable === true) {
changePixel(pixel2,"noita_ice")
}
},
tempHigh: 150,
stateHigh: "freezing_vapour",
tempLow: -10,
stateLow: "ice_cold",
category: "liquids",
reactions: {
"worm_blood": { elem1: "worm_blood", chance:0.20 },
},
state: "liquid",
density: 3000,
conduct: 0.02,
stain: -0.5,
extinguish: true,
corrodible: true,
impure: true
}
elements.freezing_vapour = {
color: ["#63a6de","#63a6de","#5691c4","#5691c4","#63a6de",],
behavior: behaviors.GAS,
tick: function(pixel) {
if (isEmpty(pixel.x+1,pixel.y) && Math.random() > 0.80 && (pixel.start + 125) < pixelTicks) {
deletePixel(pixel.x,pixel.y)
}
else if (isEmpty(pixel.x-1,pixel.y) && Math.random() > 0.80 && (pixel.start + 125) < pixelTicks) {
deletePixel(pixel.x,pixel.y)
}
else if (isEmpty(pixel.x,pixel.y+1) && Math.random() > 0.80 && (pixel.start + 125) < pixelTicks) {
deletePixel(pixel.x,pixel.y)
}
else if (isEmpty(pixel.x,pixel.y-1) && Math.random() > 0.80 && (pixel.start + 125) < pixelTicks) {
deletePixel(pixel.x,pixel.y)
}
doDefaults(pixel);
},
category: "gases",
tempLow: -10,
stateLow: "freezing_liquid",
state: "gas",
density: 2,
}
elements.ice_cold = {
color: ["#8a9bdd","#8a9bdd","#788bd5","#788bd5","#a0b0e5","#a0b0e5","#8a9bdd"],
name: "ice",
behavior: behaviors.WALL,
tempHigh: 25,
stateHigh: "freezing_liquid",
category: "solids",
state: "solid",
density: 917,
corrodible: true,
static: true,
}
elements.funky_cloud = {
color: ["#ff68b1","#f75998","#ff5ea1","#c3487c","#b44373",],
behavior: behaviors.GAS,
tick: function(pixel) {
if (isEmpty(pixel.x+1,pixel.y) && Math.random() > 0.70 && (pixel.start + 125) < pixelTicks) {
deletePixel(pixel.x,pixel.y)
}
else if (isEmpty(pixel.x-1,pixel.y) && Math.random() > 0.70 && (pixel.start + 125) < pixelTicks) {
deletePixel(pixel.x,pixel.y)
}
else if (isEmpty(pixel.x,pixel.y+1) && Math.random() > 0.70 && (pixel.start + 125) < pixelTicks) {
deletePixel(pixel.x,pixel.y)
}
else if (isEmpty(pixel.x,pixel.y-1) && Math.random() > 0.70 && (pixel.start + 125) < pixelTicks) {
deletePixel(pixel.x,pixel.y)
}
doDefaults(pixel);
},
category: "gases",
tempHigh: 1000,
stateHigh: "noita_fire",
tempLow: -45,
state: "gas",
density: 2,
alias: "gas"
}
elements.fungal_gas = {
color: ["#710c55","#710c55","#710c55","#57053c","#57053c",],
behavior: behaviors.GAS,
tick: function(pixel) {
if (isEmpty(pixel.x+1,pixel.y) && Math.random() > 0.70 && (pixel.start + 225) < pixelTicks) {
deletePixel(pixel.x,pixel.y)
}
else if (isEmpty(pixel.x-1,pixel.y) && Math.random() > 0.70 && (pixel.start + 225) < pixelTicks) {
deletePixel(pixel.x,pixel.y)
}
else if (isEmpty(pixel.x,pixel.y+1) && Math.random() > 0.70 && (pixel.start + 225) < pixelTicks) {
deletePixel(pixel.x,pixel.y)
}
else if (isEmpty(pixel.x,pixel.y-1) && Math.random() > 0.70 && (pixel.start + 225) < pixelTicks) {
deletePixel(pixel.x,pixel.y)
}
doDefaults(pixel);
},
burnableFast: true,
category: "gases",
tempHigh: 1000,
stateHigh: "noita_fire",
tempLow: -45,
burn: 100,
burnTime: 1,
fireColor: ["#00ffff","#00ffdd"],
state: "gas",
density: 2,
alias: "gas",
fungus: true,
}
elements.weird_fungus = {
color: ["#ff70bf","#ff6bb6","#ff7acf"],
burnable: true,
nburnTime: 25,
tick: function(pixel) {
doNHeat(pixel)
doNBurning(pixel)
if (pixel.start === pixelTicks) {return}
if (pixel.settled != true) {
if (!tryMove(pixel, pixel.x, pixel.y+1)) {
if (Math.random() < 0.5) {
if (!tryMove(pixel, pixel.x+1, pixel.y+1)) {
if (!tryMove(pixel, pixel.x-1, pixel.y+1) && Math.random() > 0.95) {
pixel.settled = true
}
}
} else if (!tryMove(pixel, pixel.x-1, pixel.y+1)) {
if (!tryMove(pixel, pixel.x+1, pixel.y+1) && Math.random() > 0.95) {
pixel.settled = true
}
}
}
if (isEmpty(pixel.x, pixel.y-1)) {
createPixel(pixel.element,pixel.x,pixel.y-1)
}
if (isEmpty(pixel.x, pixel.y+1)) {
createPixel(pixel.element,pixel.x,pixel.y+1)
}
}
if (pixel.settled == true) {
if (isEmpty(pixel.x, pixel.y-1) && isEmpty(pixel.x-1, pixel.y) && isEmpty(pixel.x+1, pixel.y)) {
tryMove(pixel, pixel.x, pixel.y+1)
}
if (!isEmpty(pixel.x, pixel.y-1, true) && !outOfBounds(pixel.x, pixel.y-1, true)) {
if (elements[pixelMap[pixel.x][pixel.y-1].element].movable === true && (!pixelMap[pixel.x][pixel.y-1].settled || pixelMap[pixel.x][pixel.y-1].settled != true)) {
pixel.settled = false
}
}
if (isEmpty(pixel.x, pixel.y-1)) {
createPixel(pixel.element,pixel.x,pixel.y-1)
pixelMap[pixel.x][pixel.y-1].settled = true
}
if (isEmpty(pixel.x, pixel.y+1)) {
createPixel(pixel.element,pixel.x,pixel.y+1)
pixelMap[pixel.x][pixel.y+1].settled = true
}
}
doDefaults(pixel);
},
reactions: {
},
tempHigh: 1500,
stateHigh: "noita_fire",
category:"powders",
state: "solid",
density: 6000,
corrodible: true,
impure: true,
earth: true,
fungus: true,
plant: true,
}
elements.green_fungus = {
color: ["#89ff64","#96ff63"],
burnable: true,
nburnTime: 25,
tick: function(pixel) {
doNHeat(pixel)
doNBurning(pixel)
if (pixel.start === pixelTicks) {return}
if (pixel.settled != true) {
if (!tryMove(pixel, pixel.x, pixel.y+1)) {
if (Math.random() < 0.5) {
if (!tryMove(pixel, pixel.x+1, pixel.y+1)) {
if (!tryMove(pixel, pixel.x-1, pixel.y+1) && Math.random() > 0.95) {
pixel.settled = true
}
}
} else if (!tryMove(pixel, pixel.x-1, pixel.y+1)) {
if (!tryMove(pixel, pixel.x+1, pixel.y+1) && Math.random() > 0.95) {
pixel.settled = true
}
}
}
if (isEmpty(pixel.x, pixel.y-1)) {
createPixel(pixel.element,pixel.x,pixel.y-1)
}
if (isEmpty(pixel.x, pixel.y+1)) {
createPixel(pixel.element,pixel.x,pixel.y+1)
}
}
if (pixel.settled == true) {
if (isEmpty(pixel.x, pixel.y-1) && isEmpty(pixel.x-1, pixel.y) && isEmpty(pixel.x+1, pixel.y)) {
tryMove(pixel, pixel.x, pixel.y+1)
}
if (!isEmpty(pixel.x, pixel.y-1, true) && !outOfBounds(pixel.x, pixel.y-1, true)) {
if (elements[pixelMap[pixel.x][pixel.y-1].element].movable === true && (!pixelMap[pixel.x][pixel.y-1].settled || pixelMap[pixel.x][pixel.y-1].settled != true)) {
pixel.settled = false
}
}
if (isEmpty(pixel.x, pixel.y-1)) {
createPixel(pixel.element,pixel.x,pixel.y-1)
pixelMap[pixel.x][pixel.y-1].settled = true
}
if (isEmpty(pixel.x, pixel.y+1)) {
createPixel(pixel.element,pixel.x,pixel.y+1)
pixelMap[pixel.x][pixel.y+1].settled = true
}
}
doDefaults(pixel);
},
reactions: {
},
tempHigh: 1500,
stateHigh: "noita_fire",
category:"powders",
state: "solid",
density: 6000,
corrodible: true,
impure: true,
earth: true,
fungus: true,
plant: true,
}
elements.yellow_fungus = {
color: ["#ffff59","#ffff51"],
burnable: true,
nburnTime: 25,
tick: function(pixel) {
doNHeat(pixel)
doNBurning(pixel)
if (pixel.start === pixelTicks) {return}
if (pixel.settled != true) {
if (!tryMove(pixel, pixel.x, pixel.y+1)) {
if (Math.random() < 0.5) {
if (!tryMove(pixel, pixel.x+1, pixel.y+1)) {
if (!tryMove(pixel, pixel.x-1, pixel.y+1) && Math.random() > 0.95) {
pixel.settled = true
}
}
} else if (!tryMove(pixel, pixel.x-1, pixel.y+1)) {
if (!tryMove(pixel, pixel.x+1, pixel.y+1) && Math.random() > 0.95) {
pixel.settled = true
}
}
}
if (isEmpty(pixel.x, pixel.y-1)) {
createPixel(pixel.element,pixel.x,pixel.y-1)
}
if (isEmpty(pixel.x, pixel.y+1)) {
createPixel(pixel.element,pixel.x,pixel.y+1)
}
}
if (pixel.settled == true) {
if (isEmpty(pixel.x, pixel.y-1) && isEmpty(pixel.x-1, pixel.y) && isEmpty(pixel.x+1, pixel.y)) {
tryMove(pixel, pixel.x, pixel.y+1)
}
if (!isEmpty(pixel.x, pixel.y-1, true) && !outOfBounds(pixel.x, pixel.y-1, true)) {
if (elements[pixelMap[pixel.x][pixel.y-1].element].movable === true && (!pixelMap[pixel.x][pixel.y-1].settled || pixelMap[pixel.x][pixel.y-1].settled != true)) {
pixel.settled = false
}
}
if (isEmpty(pixel.x, pixel.y-1)) {
createPixel(pixel.element,pixel.x,pixel.y-1)
pixelMap[pixel.x][pixel.y-1].settled = true
}
if (isEmpty(pixel.x, pixel.y+1)) {
createPixel(pixel.element,pixel.x,pixel.y+1)
pixelMap[pixel.x][pixel.y+1].settled = true
}
}
doDefaults(pixel);
},
reactions: {
},
tempHigh: 1500,
stateHigh: "noita_fire",
category:"powders",
state: "solid",
density: 6000,
corrodible: true,
impure: true,
earth: true,
fungus: true,
plant: true,
}
elements.corpse_fungus = {
color: ["#933051","#a2355a","#bf3f6a"],
name: "weird_fungus",
behavior: behaviors.POWDER,
burnable: true,
nburnTime: 25,
tick: function(pixel) {
doNHeat(pixel)
doNBurning(pixel)
},
reactions: {
},
tempHigh: 1500,
stateHigh: "noita_fire",
category:"solids",
state: "solid",
density: 6000,
corrodible: true,
earth: true,
fungus: true,
}
elements.noita_grass = {
color: ["#739c45","#84b53c"],
name:"grass",
behavior: behaviors.POWDER,
burnable: true,
nburnTime: 25,
tick: function(pixel) {
doNHeat(pixel)
doNBurning(pixel)
requiresAir(pixel);
doDefaults(pixel);
},
reactions: {
"pus": { elem1:"noita_smoke", chance:0.80 },
"healthium": { elem1:"holy_grass", elem2: null, chance:0.80 },
},
tempHigh: 1000,
stateHigh: "dry_grass",
category:"powders",
state: "solid",
density: 6000,
corrodible: true,
impure: true,
plant: true,
}
elements.holy_grass = {
color: ["#aeff73","#bfff6a"],
name:"divine_ground",
behavior: behaviors.POWDER,
burnable: true,
nburnTime: 30,
tick: function(pixel) {
doNHeat(pixel)
doNBurning(pixel)
requiresAir(pixel);
doDefaults(pixel);
},
reactions: {
"urine": { elem1:"noita_grass", elem2:"healium", chance:0.80 },
},
tempHigh: 1000,
stateHigh: "dry_grass",
category:"powders",
state: "solid",
density: 6000,
corrodible: true,
plant: true,
}
elements.dry_grass = {
color: ["#877836","#6b6638"],
name:"grass",
behavior: behaviors.POWDER,
burnable: true,
nburnTime: 20,
tick: function(pixel) {
doNHeat(pixel)
doNBurning(pixel)
requiresAir(pixel);
doDefaults(pixel);
},
reactions: {
"pus": { elem1:"noita_smoke", chance:0.80 },
},
tempHigh: 1500,
stateHigh: "noita_fire",
category:"powders",
state: "solid",
density: 6000,
corrodible: true,
impure: true,
plant: true,
}
elements.frozen_grass = {
color: ["#2a3c48","#36434a"],
name:"ice",
behavior: behaviors.POWDER,
burnable: true,
nburnTime: 30,
tick: function(pixel) {
doNHeat(pixel)
doNBurning(pixel)
},
reactions: {
"pus": { elem1:"noita_smoke", chance:0.80 },
},
tempHigh: 750,
stateHigh: "noita_grass",
category:"powders",
state: "solid",
density: 6000,
corrodible: true,
impure: true,
plant: true,
}
elements.plant_material = {
color: ["#84b53c","#739c45"],
burnable: true,
nburnTime: 25,
tick: function(pixel) {
doNHeat(pixel)
doNBurning(pixel)
if (pixel.start === pixelTicks) {return}
if (pixel.settled != true) {
if (!tryMove(pixel, pixel.x, pixel.y+1)) {
if (Math.random() < 0.5) {
if (!tryMove(pixel, pixel.x+1, pixel.y+1)) {
if (!tryMove(pixel, pixel.x-1, pixel.y+1) && Math.random() > 0.95) {
pixel.settled = true
}
}
} else if (!tryMove(pixel, pixel.x-1, pixel.y+1)) {
if (!tryMove(pixel, pixel.x+1, pixel.y+1) && Math.random() > 0.95) {
pixel.settled = true
}
}
}
}
if (pixel.settled == true) {
if (isEmpty(pixel.x, pixel.y-1) && isEmpty(pixel.x-1, pixel.y) && isEmpty(pixel.x+1, pixel.y)) {
tryMove(pixel, pixel.x, pixel.y+1)
}
if (!isEmpty(pixel.x, pixel.y-1, true) && !outOfBounds(pixel.x, pixel.y-1, true)) {
if (elements[pixelMap[pixel.x][pixel.y-1].element].movable === true && (!pixelMap[pixel.x][pixel.y-1].settled || pixelMap[pixel.x][pixel.y-1].settled != true)) {
pixel.settled = false
}
}
}
requiresAir(pixel);
doDefaults(pixel);
},
reactions: {
},
tempHigh: 1500,
stateHigh: "noita_fire",
category:"powders",
state: "solid",
density: 3400,
corrodible: true,
plant: true,
}
elements.moss = {
color: ["#739c45","#84b53c"],
burnable: true,
nburnTime: 25,
tick: function(pixel) {
doNHeat(pixel)
doNBurning(pixel)
if (pixel.start === pixelTicks) {return}
if (pixel.settled != true) {
if (!tryMove(pixel, pixel.x, pixel.y+1)) {
if (Math.random() < 0.5) {
if (!tryMove(pixel, pixel.x+1, pixel.y+1)) {
if (!tryMove(pixel, pixel.x-1, pixel.y+1) && Math.random() > 0.95) {
pixel.settled = true
}
}
} else if (!tryMove(pixel, pixel.x-1, pixel.y+1)) {
if (!tryMove(pixel, pixel.x+1, pixel.y+1) && Math.random() > 0.95) {
pixel.settled = true
}
}
}
}
if (pixel.settled == true) {
if (isEmpty(pixel.x, pixel.y-1) && isEmpty(pixel.x-1, pixel.y) && isEmpty(pixel.x+1, pixel.y)) {
tryMove(pixel, pixel.x, pixel.y+1)
}
if (!isEmpty(pixel.x, pixel.y-1, true) && !outOfBounds(pixel.x, pixel.y-1, true)) {
if (elements[pixelMap[pixel.x][pixel.y-1].element].movable === true && (!pixelMap[pixel.x][pixel.y-1].settled || pixelMap[pixel.x][pixel.y-1].settled != true)) {
pixel.settled = false
}
}
}
doDefaults(pixel);
},
reactions: {
},
tempHigh: 1500,
stateHigh: "noita_fire",
category:"powders",
state: "solid",
density: 3400,
corrodible: true,
impure: true,
plant: true,
}
elements.noita_salt = {
color: ["#a7b6c4","#9cc1ba","#adb0ae","#c4b5c4","#a2b6c3","#9daabc","#c4c4b1"],
behavior: behaviors.POWDER,
reactions: {
"noita_water": { elem1: null, elem2:"brine", chance:0.05 },
"chilly_water": { elem1: null, elem2:"brine", chance:0.05 },
"diminution": { elem1: "noita_smoke" }
},
tempHigh: 1500,
category:"powders",
state: "solid",
density: 6000,
corrodible: true
}
elements.noita_honey = {
color: ["#e8bd5a","#eac947","#e8bd5a","#eac947","#f0d99a"],
name: "honey",
behavior: behaviors.POWDER,
tempHigh: 1000,
stateHigh: "noita_fire",
tempLow: 0,
category: "liquids",
reactions: {
"noita_fire": { elem1: "lava", elem2: "noita_smoke" },
"noita_diamond": { elem1: "ambrosia", elem2: "noita_poison", chance:0.50 },
},
state: "liquid",
density: 10000,
stain: -0.5,
isFood: true,
corrodible: true,
meltableLavaFast: true,
}
elements.ambrosia = {
color: "#ffcc34",
behavior: behaviors.LIQUID,
viscosity: 100,
tempHigh: 1000,
stateHigh: "noita_fire",
tempLow: 0,
category: "liquids",
reactions: {
"diminution": { elem1: "noita_acid", elem2: "noita_smoke" },
},
state: "liquid",
density: 5120,
conduct: 0.8,
stain: -0.5,
water: true,
impure: true,
}
elements.frog.breakInto = ["slime","frog_meat"]
elements.frog_meat = {
color: ["#cc4c4c","#b2588b","#c996e6","#cd7d8a","#c4a4a9","#8f4d53"],
behavior: behaviors.STURDYPOWDER,
onBreak: function(pixel) {
if (Math.random() > 0.95) {
changePixel(pixel,"frog_meat")
}
else if (Math.random() > 0.90) {
changePixel(pixel,"noita_blood")
}
},
burnable: true,
reactions: {
"whiskey": { elem2:"berserkium", chance:0.1 }
},
meat: true,
tempHigh: 200,
stateHigh: "cooked_meat",
category:"food",
burn:15,
burnTime:200,
burnInto:"cooked_meat",
state: "solid",
density: 6000,
conduct: 0.2,
isFood: true,
corrodible: true
}
elements.ambiguous_meat = {
color: ["#cc4c4c","#b2588b","#c996e6","#cd7d8a","#c4a4a9","#8f4d53"],
behavior: behaviors.STURDYPOWDER,
onBreak: function(pixel) {
if (Math.random() > 0.95) {
changePixel(pixel,"ambiguous_meat")
}
else if (Math.random() > 0.90) {
changePixel(pixel,"noita_blood")
}
},
burnable: true,
reactions: {
},
meat: true,
tempHigh: 200,
stateHigh: "cooked_meat",
category:"food",
burn:15,
burnTime:200,
burnInto:"cooked_meat",
state: "solid",
density: 6000,
conduct: 0.2,
isFood: true,
corrodible: true,
}
elements.worm_meat = {
color: ["#6fa0c3","#6599bf","#b9d3dd","#94b9d0","#aac9d8","#5582a1"],
behavior: behaviors.STURDYPOWDER,
onBreak: function(pixel) {
if (Math.random() > 0.95) {
changePixel(pixel,"worm_meat")
}
else if (Math.random() > 0.90) {
changePixel(pixel,"worm_blood")
}
},
burnable: true,
reactions: {
},
meat: true,
tempHigh: 200,
stateHigh: "cooked_meat",
category:"food",
burn:15,
burnTime:200,
burnInto:"cooked_meat",
state: "solid",
density: 6000,
conduct: 0.2,
isFood: true,
corrodible: true,
}
elements.helpless_meat = {
color: ["#cc4c4c","#b2588b","#c996e6","#cd7d8a","#c4a4a9","#8f4d53"],
name: "meat of an innocent creature",
behavior: behaviors.STURDYPOWDER,
onBreak: function(pixel) {
if (Math.random() > 0.95) {
changePixel(pixel,"helpless_meat")
}
else if (Math.random() > 0.90) {
changePixel(pixel,"noita_blood")
}
},
burnable: true,
reactions: {
},
meat: true,
tempHigh: 200,
stateHigh: "cooked_meat",
category:"food",
burn:15,
burnTime:200,
burnInto:"cooked_meat",
state: "solid",
density: 6000,
conduct: 0.2,
isFood: true,
corrodible: true,
desc: "You monster. How dare you."
}
elements.noita_meat = {
color: ["#cc4c4c","#b2588b","#c996e6","#cd7d8a","#c4a4a9","#8f4d53"],
name: "meat",
behavior: behaviors.STURDYPOWDER,
onBreak: function(pixel) {
if (Math.random() > 0.95) {
changePixel(pixel,"noita_meat")
}
else if (Math.random() > 0.90) {
changePixel(pixel,"noita_blood")
}
},
burnable: true,
reactions: {
},
meat: true,
tempHigh: 200,
stateHigh: "cooked_meat",
category:"food",
burn:15,
burnTime:200,
burnInto:"cooked_meat",
state: "solid",
density: 6000,
conduct: 0.2,
isFood: true,
corrodible: true,
}
elements.lightly_cooked_meat = {
color: ["#b8a26e","#a67971","#e2dbb4","#c3af96","#c6beb4","#88785e"],
behavior: behaviors.STURDYPOWDER,
onBreak: function(pixel) {
if (Math.random() > 0.95) {
changePixel(pixel,"lightly_cooked_meat")
}
else if (Math.random() > 0.90) {
changePixel(pixel,"noita_oil")
}
},
burnable: true,
reactions: {
"noita_meat": { func:function(pixel1,pixel2){ if (Math.random()> 0.9) {changePixel(pixel2,"lightly_cooked_meat");} } },
},
meat: true,
tempHigh: 200,
stateHigh: "cooked_meat",
category:"food",
burn:15,
burnTime:200,
burnInto:"cooked_meat",
state: "solid",
density: 6000,
conduct: 0.2,
isFood: true,
corrodible: true,
}
elements.noita_cooked_meat = {
color: ["#a17858","#8e5f65","#cbb18d","#ac8779","#ab9b95","#715d52"],
name: "cooked meat",
behavior: behaviors.STURDYPOWDER,
onBreak: function(pixel) {
if (Math.random() > 0.95) {
changePixel(pixel,"noita_cooked_meat")
}
else if (Math.random() > 0.90) {
changePixel(pixel,"noita_oil")
}
},
burnable: true,
reactions: {
"noita_meat": { func:function(pixel1,pixel2){ if (Math.random()> 0.9) {changePixel(pixel2,"noita_cooked_meat");} } },
"lightly_cooked_meat": { func:function(pixel1,pixel2){ if (Math.random()> 0.9) {changePixel(pixel2,"noita_cooked_meat");} } },
},
meat: true,
tempHigh: 200,
stateHigh: "cooked_meat",
category:"food",
burn:15,
burnTime:200,
burnInto:"cooked_meat",
state: "solid",
density: 6000,
conduct: 0.2,
isFood: true,
corrodible: true,
}
elements.fully_cooked_meat = {
color: ["#6f533d","#624246","#a37e4a","#7d5a4d","#7b6962","#4e4039"],
behavior: behaviors.STURDYPOWDER,
onBreak: function(pixel) {
if (Math.random() > 0.95) {
changePixel(pixel,"fully_cooked_meat")
}
else if (Math.random() > 0.90) {
changePixel(pixel,"noita_oil")
}
},
burnable: true,
reactions: {
"noita_meat": { func:function(pixel1,pixel2){ if (Math.random()> 0.9) {changePixel(pixel2,"fully_cooked_meat");} } },
"lightly_cooked_meat": { func:function(pixel1,pixel2){ if (Math.random()> 0.9) {changePixel(pixel2,"fully_cooked_meat");} } },
"noita_cooked_meat": { func:function(pixel1,pixel2){ if (Math.random()> 0.9) {changePixel(pixel2,"fully_cooked_meat");} } },
},
meat: true,
tempHigh: 200,
stateHigh: "cooked_meat",
category:"food",
burn:15,
burnTime:200,
burnInto:"cooked_meat",
state: "solid",
density: 6000,
conduct: 0.2,
isFood: true,
corrodible: true,
}
elements.burned_meat = {
color: ["#403a35","#3c3435","#5b5246","#4a423f","#4e4a48","#302d2b"],
behavior: behaviors.STURDYPOWDER,
onBreak: function(pixel) {
if (Math.random() > 0.95) {
changePixel(pixel,"burned_meat")
}
else if (Math.random() > 0.90) {
changePixel(pixel,"noita_oil")
}
},
burnable: true,
reactions: {
"noita_meat": { func:function(pixel1,pixel2){ if (Math.random()> 0.9) {changePixel(pixel2,"lightly_cooked_meat");} } },
"lightly_cooked_meat": { func:function(pixel1,pixel2){ if ( Math.random()> 0.9) {changePixel(pixel2,"noita_cooked_meat");} } },
"noita_cooked_meat": { func:function(pixel1,pixel2){ if (Math.random()> 0.9) {changePixel(pixel2,"fully_cooked_meat");} } },
"fully_cooked_meat": { func:function(pixel1,pixel2){ if (Math.random()> 0.995) {changePixel(pixel2,"burned_meat");} } },
},
meat: true,
tempHigh: 200,
stateHigh: "cooked_meat",
category:"food",
burn:15,
burnTime:200,
burnInto:"cooked_meat",
state: "solid",
density: 6000,
conduct: 0.2,
isFood: true,
corrodible: true,
}
elements.acid.impure = true
elements.dirty_water.impure = true
elements.alcohol.impure = true
elements.blood.impure = true
elements.cement.impure = true
elements.melted_wax.impure = true
elements.slime.impure = true
elements.glue.impure = true
elements.seeds.impure = true
elements.potato_seed.impure = true
elements.grass_seed.impure = true
elements.wheat_seed.impure = true
elements.pumpkin_seed.impure = true
elements.corn_seed.impure = true
elements.mushroom_spore.impure = true
elements.grass.impure = true
elements.mushroom_stalk.impure = true
elements.mushroom_cap.impure = true
elements.mushroom_gill.impure = true
elements.hyphae.impure = true
elements.meat.meat = true
elements.rotten_meat.meat = true
elements.cured_meat.meat = true
elements.cooked_meat.meat = true
elements.purifying_powder = {
color: ["#a7b6c4","#a9c4c3","#c4b5c4","#b1c4c4","#a2b4b0","#bec4b6","#ababb2"],
behavior: behaviors.POWDER,
tick: function(pixel) {
var coords = rectCoords(pixel.x-1,pixel.y-1,pixel.x+1,pixel.y+1);
for (var i = 0; i < coords.length; i++) {
var x = coords[i].x;
var y = coords[i].y;
if (!isEmpty(x,y,true)) {
elements.purifying_powder.tool(pixelMap[x][y]);
}
}
},
tool: function(impure) {
if (elements[impure.element].impure === true) {
changePixel(impure, "noita_water")
}
},
canPlace: true,
reactions: {
},
category: "powders",
state: "solid",
density: 6000,
hardness: 0.99,
corrodible: true
}
elements.alchemic_precursor = {
color: ["#0843ec","#2b52e4","#2568db","#2250df","#1542e4"],
behavior: behaviors.LIQUID,
tick: function(pixel) {
var coords = rectCoords(pixel.x-1,pixel.y-1,pixel.x+1,pixel.y+1);
for (var i = 0; i < coords.length; i++) {
var x = coords[i].x;
var y = coords[i].y;
if (!isEmpty(x,y,true)) {
elements.alchemic_precursor.tool(pixelMap[x][y]);
}
}
},
tool: function(meat) {
if (elements[meat.element].meat === true) {
changePixel(meat, "draught_of_midas")
}
},
canPlace: true,
tempLow: -10,
burn: 100,
burnTime: 3,
fireColor: ["#80acf0","#96cdfe","#bee6d4"],
category: "liquids",
reactions: {
"magma": { elem1:"gas_of_midas" },
},
state: "liquid",
density: 3500,
conduct: 0.02,
stain: -0.5,
extinguish: true
}
elements.noita_acid = {
name: "acid",
color: "#00ff3c",
behavior: behaviors.LIQUID,
tick: function(pixel) {
for (var i = 0; i < adjacentCoords.length; i++) {
var x = pixel.x+adjacentCoords[i][0];
var y = pixel.y+adjacentCoords[i][1];
if (!isEmpty(x,y,true)) {
var newPixel = pixelMap[x][y];
if ((elements[newPixel.element].corrodible !== true || elements.acid.ignore.indexOf(newPixel.element) !== -1 && elements.noita_acid.ignore.indexOf(newPixel.element) !== -1)) {
}
else {
changePixel(newPixel,"flammable_gas");
}
}
}
if (isEmpty(pixel.x+1,pixel.y) && Math.random() > 0.92 && (pixel.start + 225) < pixelTicks) {
changePixel(pixel,"flammable_gas")
}
else if (isEmpty(pixel.x-1,pixel.y) && Math.random() > 0.92 && (pixel.start + 225) < pixelTicks) {
changePixel(pixel,"flammable_gas")
}
else if (isEmpty(pixel.x,pixel.y+1) && Math.random() > 0.92 && (pixel.start + 225) < pixelTicks) {
changePixel(pixel,"flammable_gas")
}
else if (isEmpty(pixel.x,pixel.y-1) && Math.random() > 0.92 && (pixel.start + 225) < pixelTicks) {
changePixel(pixel,"flammable_gas")
}
doDefaults(pixel);
},
ignore:["noita_acid","acid"],
reactions: {
"flammable_gas": {elem1:"flammable_gas",elem2:null, chance:0.12}
},
category: "liquids",
tempHigh: 150,
stateHigh: "flammable_gas",
tempLow: -58.88,
burn: 30,
burnTime: 1,
state: "liquid",
density: 2900,
stain: -0.1,
impure: true,
}
elements.flammable_gas = {
color: ["#357d22","#357d22","#357d22","#357d22","#285e1a",],
behavior: behaviors.GAS,
tick: function(pixel) {
if (isEmpty(pixel.x+1,pixel.y) && Math.random() > 0.70 && (pixel.start + 225) < pixelTicks) {
deletePixel(pixel.x,pixel.y)
}
else if (isEmpty(pixel.x-1,pixel.y) && Math.random() > 0.70 && (pixel.start + 225) < pixelTicks) {
deletePixel(pixel.x,pixel.y)
}
else if (isEmpty(pixel.x,pixel.y+1) && Math.random() > 0.70 && (pixel.start + 225) < pixelTicks) {
deletePixel(pixel.x,pixel.y)
}
else if (isEmpty(pixel.x,pixel.y-1) && Math.random() > 0.70 && (pixel.start + 225) < pixelTicks) {
deletePixel(pixel.x,pixel.y)
}
doDefaults(pixel);
},
burnableFast: true,
category: "gases",
tempHigh: 1000,
stateHigh: "noita_fire",
tempLow: -45,
burn: 100,
burnTime: 1,
fireColor: ["#00ffff","#00ffdd"],
state: "gas",
density: 2,
alias: "gas"
}
elements.draught_of_midas = {
color: ["#ffea47","#ffde5a","#ffea47","#ffde5a","#fffa9a","#ffea47","#ffde5a",],
behavior: behaviors.LIQUID,
tick: function(pixel) {
var coords = rectCoords(pixel.x-1,pixel.y-1,pixel.x+1,pixel.y+3);
for (var i = 0; i < coords.length; i++) {
var x = coords[i].x;
var y = coords[i].y;
if (!isEmpty(x,y,true)) {
elements.draught_of_midas.tool(pixelMap[x][y]);
}
}
},
tool: function(pixel) {
if (elements[pixel.element].id === elements.midas_touch.id) { return; }
if (elements[pixel.element].id === elements.draught_of_midas.id) { return; }
if (elements[pixel.element].id === elements.gas_of_midas.id) { return; }
if (elements.midas_touch.reactions[pixel.element]) { return; }
if (elements.draught_of_midas.reactions[pixel.element]) { return; }
if (elements.gas_of_midas.reactions[pixel.element]) { return; }
if (Math.random() < (elements[pixel.element].hardness || 0.25)) { return; }
if (elements[pixel.element].state === "gas" && elements[pixel.element].id !== elements.mud.id && elements[pixel.element].id !== elements.noita_mud.id) {
changePixel(pixel,"gold_coin");
pixel.color = pixelColorPick(pixel,["#ffdf5e","#ffe682"]);
}
else if (elements[pixel.element].movable && elements[pixel.element].id !== elements.mud.id && elements[pixel.element].id !== elements.noita_mud.id) {
changePixel(pixel,"gold_coin");
}
else if (elements[pixel.element].id === elements.alchemic_precursor.id) {
changePixel(pixel, "draught_of_midas");
}
else if (elements[pixel.element].id !== elements.mud.id && elements[pixel.element].id !== elements.noita_mud.id) {
changePixel(pixel,"gold_coin");
}
},
canPlace: true,
reactions: {
"gold":{}, "gold_coin":{}, "rose_gold":{}, "blue_gold":{}, "purple_gold":{}, "electrum":{},
"molten_gold":{}, "pipe":{},
"paper": { stain2:"#54803d" },
"head": { elem2:"gold" },
"body": { elem2:"gold" },
"copper": { elem2:"rose_gold" },
"gallium": { elem2:"blue_gold" },
"molten_gallium": { elem2:"blue_gold" },
"aluminum": { elem2:"purple_gold" },
"silver": { elem2:"electrum" }
},
density: 997,
state: "liquid",
category:"liquids",
}
elements.gas_of_midas = {
color: ["#ffea47","#ffde5a","#ffea47","#ffde5a","#fffa9a","#ffea47","#ffde5a",],
behavior: behaviors.GAS,
tick: function(pixel) {
var coords = rectCoords(pixel.x-1,pixel.y-1,pixel.x+1,pixel.y+1);
for (var i = 0; i < coords.length; i++) {
var x = coords[i].x;
var y = coords[i].y;
if (!isEmpty(x,y,true)) {
if (!outOfBounds(x,y) && elements[pixelMap[x][y].element].id !== elements.gold.id && elements[pixelMap[x][y].element].id !== elements.gold_coin.id && elements[pixelMap[x][y].element].id !== elements.midas_touch.id && elements[pixelMap[x][y].element].id !== elements.draught_of_midas.id && elements[pixelMap[x][y].element].id !== elements.gas_of_midas.id) {
elements.draught_of_midas.tool(pixelMap[x][y]);
changePixel(pixel,"gold_coin")
}
}
}
if (isEmpty(pixel.x+1,pixel.y) && Math.random() > 0.70 && (pixel.start + 204) < pixelTicks) {
deletePixel(pixel.x,pixel.y)
}
else if (isEmpty(pixel.x-1,pixel.y) && Math.random() > 0.70 && (pixel.start + 204) < pixelTicks) {
deletePixel(pixel.x,pixel.y)
}
else if (isEmpty(pixel.x,pixel.y+1) && Math.random() > 0.70 && (pixel.start + 204) < pixelTicks) {
deletePixel(pixel.x,pixel.y)
}
else if (isEmpty(pixel.x,pixel.y-1) && Math.random() > 0.70 && (pixel.start + 204) < pixelTicks) {
deletePixel(pixel.x,pixel.y)
}
},
tool: function(pixel) {
if (elements[pixel.element].id === elements.midas_touch.id) { return; }
if (elements[pixel.element].id === elements.draught_of_midas.id) { return; }
if (elements[pixel.element].id === elements.gas_of_midas.id) { return; }
if (elements.midas_touch.reactions[pixel.element]) { return; }
if (elements.draught_of_midas.reactions[pixel.element]) { return; }
if (elements.gas_of_midas.reactions[pixel.element]) { return; }
if (Math.random() < (elements[pixel.element].hardness || 0.25)) { return; }
if (elements[pixel.element].state === "gas" && elements[pixel.element].id !== elements.mud.id && elements[pixel.element].id !== elements.noita_mud.id && Math.random() > 0.90) {
changePixel(pixel,"gold_coin");
pixel.color = pixelColorPick(pixel,["#ffdf5e","#ffe682"]);
}
else if (elements[pixel.element].movable && elements[pixel.element].id !== elements.mud.id && elements[pixel.element].id !== elements.noita_mud.id && Math.random() > 0.90) {
changePixel(pixel,"gold_coin");
}
else if (elements[pixel.element].id !== elements.mud.id && elements[pixel.element].id !== elements.noita_mud.id && Math.random() > 0.90) {
changePixel(pixel,"gold_coin");
}
},
canPlace: true,
reactions: {
"gold":{}, "gold_coin":{}, "rose_gold":{}, "blue_gold":{}, "purple_gold":{}, "electrum":{},
"molten_gold":{}, "pipe":{},
"paper": { stain2:"#54803d" },
"head": { elem2:"gold" },
"body": { elem2:"gold" },
"copper": { elem2:"rose_gold" },
"gallium": { elem2:"blue_gold" },
"molten_gallium": { elem2:"blue_gold" },
"aluminum": { elem2:"purple_gold" },
"silver": { elem2:"electrum" }
},
tempLow: -50,
stateLow: "draught_of_midas",
density: 997,
state: "gas",
category:"liquids",
}
elements.noita_blood = {
color: "#820000",
name: "blood",
behavior: behaviors.LIQUID,
reactions: {
},
viscosity: 10,
tempHigh: 150,
stateHigh: "noita_steam",
tempLow: -50,
category:"liquids",
state: "liquid",
density: 1060,
stain: 0.05,
impure: true,
blood: true,
}
elements.worm_blood = {
color: ["#a0a72f","#92982c","#bec538"],
behavior: behaviors.LIQUID,
reactions: {
"freezing_liquid": { elem2: "worm_blood", chance:0.20 },
"worm_pheremone": { elem1: "flummoxium", elem2: "flummoxium", chance:0.15 },
},
viscosity: 10,
tempHigh: 150,
stateHigh: "noita_steam",
tempLow: -10,
category:"liquids",
state: "liquid",
density: 1060,
stain: 0.05,
impure: true,
blood: true,
}
elements.soil = {
color: ["#272618","#232018","#27282d","#36311e"],
behavior: behaviors.POWDER,
reactions: {
},
tick: function(pixel) {
if (isEmpty(pixel.x,pixel.y-1) && Math.random() > 0.98 && (pixel.start + 100) < pixelTicks) {
changePixel(pixel, "noita_grass")
}
},
tempHigh: 1500,
tempLow: -50,
stateLow: "permafrost",
category:"land",
state: "solid",
density: 1220,
corrodible: true
}
elements.noita_mud = {
color: ["#464128","#686841","#5f5731","#3b3325"],
name: "mud",
behavior: behaviors.POWDER,
reactions: {
"toxic_sludge": { elem2:"swamp_water", chance:0.15 },
},
tempHigh: 1500,
stateHigh: "molten_soil",
onStateHigh: function(pixel) {
releaseElement(pixel,"noita_steam");
},
tempLow: -50,
stateLow: "permafrost",
category: "land",
state: "solid",
density: 2000,
stain: 0.025,
impure: true,
corrodible: true
}
elements.whiskey = {
color: "#e87106",
behavior: behaviors.LIQUID,
tick: function(pixel) {
if (isEmpty(pixel.x+1,pixel.y) && Math.random() > 0.96 && (pixel.start + 25) < pixelTicks) {
createPixel("whiskey_fumes",pixel.x+1,pixel.y)
}
else if (isEmpty(pixel.x-1,pixel.y) && Math.random() > 0.96 && (pixel.start + 25) < pixelTicks) {
createPixel("whiskey_fumes",pixel.x-1,pixel.y)
}
else if (isEmpty(pixel.x,pixel.y+1) && Math.random() > 0.96 && (pixel.start + 25) < pixelTicks) {
createPixel("whiskey_fumes",pixel.x,pixel.y+1)
}
else if (isEmpty(pixel.x,pixel.y-1) && Math.random() > 0.96 && (pixel.start + 25) < pixelTicks) {
createPixel("whiskey_fumes",pixel.x,pixel.y-1)
}
doDefaults(pixel);
},
reactions: {
"frog_meat": { elem1:"berserkium", chance:0.1 }
},
tempHigh: 150,
stateHigh: "whiskey_fumes",
tempLow: -100,
burn: 100,
burnTime: 3,
fireColor: ["#80acf0","#96cdfe","#bee6d4"],
category: "liquids",
state: "liquid",
density: 785.1,
stain: -0.25,
isFood: true,
darkText: true,
alias: "alcohol",
impure: true,
}
elements.whiskey_fumes = {
color: ["#994d0a","#994d0a","#994d0a","#994d0a","#7f4004",],
behavior: behaviors.GAS,
tick: function(pixel) {
if (isEmpty(pixel.x+1,pixel.y) && Math.random() > 0.75 && (pixel.start + 25) < pixelTicks) {
deletePixel(pixel.x,pixel.y)
}
else if (isEmpty(pixel.x-1,pixel.y) && Math.random() > 0.75 && (pixel.start + 25) < pixelTicks) {
deletePixel(pixel.x,pixel.y)
}
else if (isEmpty(pixel.x,pixel.y+1) && Math.random() > 0.75 && (pixel.start + 25) < pixelTicks) {
deletePixel(pixel.x,pixel.y)
}
else if (isEmpty(pixel.x,pixel.y-1) && Math.random() > 0.75 && (pixel.start + 25) < pixelTicks) {
deletePixel(pixel.x,pixel.y)
}
doNHeat(pixel)
doNBurning(pixel)
doDefaults(pixel);
},
burnable: true,
nburnTime: 25,
category: "gases",
tempHigh: 1000,
stateHigh: "noita_fire",
tempLow: -45,
burn: 100,
burnTime: 1,
fireColor: ["#00ffff","#00ffdd"],
state: "gas",
density: 2,
alias: "gas"
}
elements.beer = {
color: "#bb7e03",
behavior: behaviors.LIQUID,
reactions: {
},
tempHigh: 150,
tempLow: -100,
burn: 100,
burnTime: 3,
fireColor: ["#80acf0","#96cdfe","#bee6d4"],
category: "liquids",
state: "liquid",
density: 785.1,
stain: -0.25,
isFood: true,
darkText: true,
alias: "alcohol",
impure: true
}
elements.concentrated_mana = {
color: "#0cffff",
behavior: behaviors.LIQUID,
onCollide: function(pixel1,pixel2) {
if (elements[pixel2.element].meltableMetal === true && Math.random() < 0.25) {
changePixel(pixel2,"noita_steam")
}
},
reactions: {
"noita_water": { elem2:"concentrated_mana", chance:0.25 },
"noita_gold": { elem2:"noita_steam", chance:0.25 },
"noita_glass": { elem2:"noita_steam", chance:0.25 },
"glass_broken": { elem2:"noita_steam", chance:0.25 },
"teleportatium": { elem2:"noita_fire", chance:0.10 },
"unstable_teleportatium": { elem2:"noita_fire", chance:0.10 },
"diminution": { elem1:"noita_steam", elem2:"noita_steam", chance:0.60 },
},
tempHigh: 150,
tempLow: -100,
category: "liquids",
state: "liquid",
density: 2412,
stain: -0.05,
isFood: true,
darkText: true,
impure: true
}
elements.berserkium = {
color: "#ff989b",
behavior: behaviors.LIQUID,
reactions: {
"flummoxium": { elem1:"pheremone", elem2:"pheremone", chance:0.25 }
},
tempHigh: 150,
tempLow: -113.88,
category: "liquids",
state: "liquid",
density: 2412,
stain: -0.05,
isFood: true,
darkText: true,
impure: true
}
elements.flummoxium = {
color: ["#8c83c2","#ed7cc2","#8ce4bb","#f4dd5a","#f47c61"],
behavior: behaviors.LIQUID,
reactions: {
"berserkium": { elem1:"pheremone", elem2:"pheremone", chance:0.25 },
"noita_brass": { elem1:"levitatium", elem2:"levitatium", chance:0.25 },
"noita_copper": { elem1:"levitatium", elem2:"levitatium", chance:0.25 },
"noita_diamond": { elem1:"levitatium", elem2:"levitatium", chance:0.25 },
"noita_gold": { elem1:"levitatium", elem2:"levitatium", chance:0.25 },
"metal_dust": { elem1:"levitatium", elem2:"levitatium", chance:0.25 },
"noita_silver": { elem1:"levitatium", elem2:"levitatium", chance:0.25 },
"noita_steel": { elem1:"levitatium", elem2:"levitatium", chance:0.25 },
"toxic_gold": { elem1:"levitatium", elem2:"levitatium", chance:0.25 },
},
tempHigh: 150,
tempLow: -10,
category: "liquids",
state: "liquid",
density: 1200,
stain: -0.05,
isFood: true,
darkText: true,
impure: true
}
elements.diminution = {
color: ["#0cce2c","#0fdb2f","#19e738",],
behavior: behaviors.LIQUID,
tick: function(pixel) {
var coords = rectCoords(pixel.x-1,pixel.y-1,pixel.x+1,pixel.y+1);
for (var i = 0; i < coords.length; i++) {
var x = coords[i].x;
var y = coords[i].y;
if (!isEmpty(x,y,true)) {
if (!outOfBounds(x,y) && (elements[pixelMap[x][y].element].fungus === true)) {
changePixel(pixelMap[x][y],"noita_sand")
}
}
}
},
reactions: {
"berserkium": { elem2:"noita_water", chance:0.60 },
"mycelium": { elem2:"soil" },
"levitatium": { elem1:"toxic_sludge", elem2:"toxic_sludge", chance:0.60 },
"ambrosia": { elem1:"noita_smoke", elem2:"noita_acid", chance:0.80 },
"noita_gold": { elem2:"noita_silver" },
"noita_molten_gold": { elem2:"noita_molten_silver" },
"noita_diamond": { elem1:"noita_steam", elem2:"toxic_sludge" },
"noita_salt": { elem2:"noita_smoke" },
"flammable_gas": { elem2:"diminution" },
},
tempHigh: 150,
stateHigh: "diminution_cloud",
tempLow: -10,
category: "liquids",
state: "liquid",
density: 1872,
stain: -0.05,
isFood: true,
darkText: true,
impure: true
}
elements.diminution_cloud = {
color: ["#1cf53b","#0fdc2f","#12e932","#0f961f","#15a425"],
tick: function(pixel) {
if (isEmpty(pixel.x+1,pixel.y) && Math.random() > 0.70 && (pixel.start + 125) < pixelTicks) {
deletePixel(pixel.x,pixel.y)
}
else if (isEmpty(pixel.x-1,pixel.y) && Math.random() > 0.70 && (pixel.start + 125) < pixelTicks) {
deletePixel(pixel.x,pixel.y)
}
else if (isEmpty(pixel.x,pixel.y+1) && Math.random() > 0.70 && (pixel.start + 125) < pixelTicks) {
deletePixel(pixel.x,pixel.y)
}
else if (isEmpty(pixel.x,pixel.y-1) && Math.random() > 0.70 && (pixel.start + 125) < pixelTicks) {
deletePixel(pixel.x,pixel.y)
}
doDefaults(pixel);
},
behavior: behaviors.GAS,
tempLow: -10,
stateLow: "diminution",
category: "gases",
state: "gas",
density: 1000,
isFood: true,
darkText: true,
}
elements.healthium = {
color: "#d8ffba",
behavior: behaviors.LIQUID,
reactions: {
"noita_grass": { elem2:"holy_grass", elem1: null, chance:0.80 },
"purifying_powder": { elem1:"noita_gunpowder", elem2:"noita_gunpowder", chance:0.80 },
"lava": { elem1:"healium", chance:0.70 },
},
tempHigh: 150,
stateHigh: "healium",
tempLow: -10,
category: "liquids",
state: "liquid",
density: 1872,
stain: -0.05,
isFood: true,
darkText: true,
water: true,
}
elements.healium = {
color: ["#adff99","#adff99","#adff99","#98e786","#98e786"],
tick: function(pixel) {
if (isEmpty(pixel.x+1,pixel.y) && Math.random() > 0.70 && (pixel.start + 125) < pixelTicks) {
deletePixel(pixel.x,pixel.y)
}
else if (isEmpty(pixel.x-1,pixel.y) && Math.random() > 0.70 && (pixel.start + 125) < pixelTicks) {
deletePixel(pixel.x,pixel.y)
}
else if (isEmpty(pixel.x,pixel.y+1) && Math.random() > 0.70 && (pixel.start + 125) < pixelTicks) {
deletePixel(pixel.x,pixel.y)
}
else if (isEmpty(pixel.x,pixel.y-1) && Math.random() > 0.70 && (pixel.start + 125) < pixelTicks) {
deletePixel(pixel.x,pixel.y)
}
doDefaults(pixel);
},
behavior: behaviors.GAS,
tempLow: -10,
stateLow: "healthium",
category: "gases",
state: "gas",
density: 1000,
isFood: true,
darkText: true,
}
elements.teleportatium = {
color: "#aaffff",
behavior: behaviors.LIQUID,
reactions: {
"noita_copper": { elem1:"noita_smoke", elem2:"noita_brass", chance:0.50 },
"noita_silver": { elem1:"teleportatium_cloud", elem2:"teleportatium_cloud", chance:0.1, },
"whiskey": { elem1:"unstable_teleportatium", chance:0.21 },
"concentrated_mana": { elem1:"noita_fire", chance:0.10 },
"lava": { elem1:"freezing_vapour", chance:0.70 },
},
tempHigh: 150,
stateHigh: "teleportatium_cloud",
tempLow: -10,
category: "liquids",
state: "liquid",
density: 1872,
stain: -0.05,
isFood: true,
darkText: true,
impure: true
}
elements.teleportatium_cloud = {
color: ["#74bcda","#74bcda","#74bcda","#63a2b9","#63a2b9"],
tick: function(pixel) {
if (isEmpty(pixel.x+1,pixel.y) && Math.random() > 0.70 && (pixel.start + 125) < pixelTicks) {
deletePixel(pixel.x,pixel.y)
}
else if (isEmpty(pixel.x-1,pixel.y) && Math.random() > 0.70 && (pixel.start + 125) < pixelTicks) {
deletePixel(pixel.x,pixel.y)
}
else if (isEmpty(pixel.x,pixel.y+1) && Math.random() > 0.70 && (pixel.start + 125) < pixelTicks) {
deletePixel(pixel.x,pixel.y)
}
else if (isEmpty(pixel.x,pixel.y-1) && Math.random() > 0.70 && (pixel.start + 125) < pixelTicks) {
deletePixel(pixel.x,pixel.y)
}
doDefaults(pixel);
},
behavior: behaviors.GAS,
tempLow: -10,
category: "gases",
state: "gas",
density: 2000,
isFood: true,
darkText: true,
}
elements.unstable_teleportatium = {
color: "#3fffff",
behavior: behaviors.LIQUID,
tick: function(pixel) {
var coords = rectCoords(pixel.x-1,pixel.y-1,pixel.x+1,pixel.y+1);
for (var i = 0; i < coords.length; i++) {
var x = coords[i].x;
var y = coords[i].y;
if (!isEmpty(x,y,true)) {
if (!outOfBounds(x,y) && (elements[pixelMap[x][y].element].slime === true)) {
changePixel(pixel,"teleportatium")
changePixel(pixelMap[x][y],"teleportatium")
}
}
}
},
reactions: {
"noita_brass": { elem1:"noita_smoke", elem2:"metal_dust", chance:0.50 },
"flummoxium": { elem1:"noita_smoke", elem2:"guiding_powder" },
"concentrated_mana": { elem1:"noita_fire", chance:0.10 },
"lava": { elem1:"freezing_vapour", chance:0.70 },
},
tempHigh: 150,
stateHigh: "teleportatium_cloud",
tempLow: -10,
category: "liquids",
state: "liquid",
density: 1872,
stain: -0.05,
isFood: true,
darkText: true,
impure: true
}
elements.toxic_sludge = {
color: "#cbff11",
behavior: behaviors.LIQUID,
reactions: {
"brine": { elem1:"noita_water", chance:0.20 },
"water": { elem1:"noita_water", chance:0.13 },
"noita_water": { elem1:"noita_water", chance:0.13 },
"noita_mud": { elem1:"swamp_water", chance:0.15 },
},
viscosity: 5,
tempLow: -10,
category: "liquids",
state: "liquid",
density: 1872,
stain: -0.05,
isFood: true,
darkText: true,
impure: true,
corrodible: true,
soluble: true,
}
elements.levitatium = {
color: "#f5f5f5",
behavior: behaviors.LIQUID,
reactions: {
"diminution": { elem1:"toxic_sludge", elem2:"toxic_sludge", chance:0.25 },
"acceleratium": { elem1:"hastium", elem2:"hastium", chance:0.25 },
},
tempHigh: 150,
tempLow: -10,
category: "liquids",
state: "liquid",
density: 1200,
stain: -0.05,
isFood: true,
darkText: true,
impure: true
}
elements.pheremone = {
color: "#ff4072",
behavior: behaviors.LIQUID,
reactions: {
},
tempHigh: 150,
tempLow: -10,
category: "liquids",
state: "liquid",
density: 3513,
stain: -0.05,
isFood: true,
darkText: true,
water: true,
impure: true
}
// substances above
// creatures below
elements.noita = {
color: ["#2b2429","#151515"],
category: "life",
properties: {
dead: false,
dir: 1,
panic: 0
},
onPlace: function(pixel) {
if (isEmpty(pixel.x, pixel.y+1)) {
createPixel("noita_body", pixel.x, pixel.y+1);
var color = pixel.color;
changePixel(pixel,"noita_head");
pixel.color = color;
}
else if (isEmpty(pixel.x, pixel.y-1)) {
createPixel("noita_head", pixel.x, pixel.y-1);
pixelMap[pixel.x][pixel.y-1].color = pixel.color;
changePixel(pixel,"noita_body");
}
else {
deletePixel(pixel.x, pixel.y);
}
},
reactions: {
},
related: ["noita_body","noita_head"],
cooldown: defaultCooldown,
forceSaveColor: true,
blood: "noita_blood",
living: true,
}
elements.noita_body = {
color: ["#996e98","#6a406a","#d69f34","#996e98","#6a406a"],
category: "life",
hidden: true,
density: 6000,
state: "solid",
conduct: .05,
tempHigh: 150,
stateHigh: "cooked_meat",
tempLow: -30,
stateLow: "noita_meat",
burn: 10,
burnTime: 250,
burnInto: "cooked_meat",
breakInto: "noita_meat",
forceSaveColor: true,
pickElement: "noita",
reactions: {
},
properties: {
maxhp: 10000,
hp: 10000,
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 === "noita_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.hp < 1) {
pixel.element = "noita_meat"
if (pixel.head) {
pixel.head.element = "noita_meat"
}
return
}
// Find the head
if (!isEmpty(pixel.x, pixel.y-1, true) && pixelMap[pixel.x][pixel.y-1].element == "noita_head") {
pixel.head = pixelMap[pixel.x][pixel.y-1];
if (pixel.head.hp < 1) { // If head is dead, kill body
pixel.hp = pixel.head.hp;
}
else if (pixel.head.panic > 0) {
pixel.panic = pixel.head.panic;
delete pixel.head.panic;
}
}
else { pixel.head = null }
if (pixel.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("noita_blood", pixel.x, pixel.y-1);
// set dead to true 15% chance
if (Math.random() < 0.15) {
pixel.dead = pixelTicks;
}
}
}
else if (pixel.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(pixel.head, pixel.head.x+move[0], pixel.head.y+move[1]);
moved = true;
break;
}
}
}
// 15% chance to change direction
if (Math.random() < 0.10 || !moved) {
pixel.dir *= -1;
}
}
if (pixel.temp > 150 && Math.random() > 0.75) {
DoDamage(pixel,"fire",10)
pixel.panic++
}
if (pixel.temp < -25) {
DoDamage(pixel,"ice",10)
pixel.panic++
}
DoNoitaHumanoid(pixel)
},
onCollide: function(pixel,damagePixel) {
DoNoitaStaining(pixel,damagePixel)
},
onBreak: function(pixel) {
releaseElement(pixel,elements[pixel.element].blood,4);
},
blood: "noita_blood",
living: true,
}
elements.noita_head = {
color: ["#996e98","#6a406a","#996e98","#6a406a","#2b2429","#151515","#2b2429","#151515","#2b2429","#151515","#2b2429","#151515","#2b2429","#151515","#2b2429","#151515"],
category: "life",
hidden: true,
density: 6000,
state: "solid",
conduct: .05,
tempHigh: 150,
stateHigh: "noita_cooked_meat",
tempLow: -30,
stateLow: "noita_meat",
burn: 10,
burnTime: 250,
burnInto: "cooked_meat",
breakInto: "noita_meat",
forceSaveColor: true,
pickElement: "noita",
reactions: {
},
properties: {
hp: 10000,
maxhp: 10000,
},
tick: function(pixel) {
doHeat(pixel);
doBurning(pixel);
doElectricity(pixel);
if (pixel.hp < 1) {
pixel.element = "noita_meat"
return
}
// Find the body
if (!isEmpty(pixel.x, pixel.y+1, true) && pixelMap[pixel.x][pixel.y+1].element == "noita_body") {
var body = pixelMap[pixel.x][pixel.y+1];
if (body.hp !== pixel.hp) {
pixel.hp = body.hp;
}
}
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("noita_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;
}
}
},
onBreak: function(pixel) {
releaseElement(pixel,elements[pixel.element].blood,4);
},
blood: "noita_blood",
living: true,
}
elements.lammas = {
color: ["#cbcbcb","#ebebeb","#fffffe","#cbcbcb","#ebebeb","#fffffe","#ffcf93","#ffb373","#cbcbcb","#ebebeb","#fffffe"],
properties: {
maxhp: 250,
hp: 250,
dir: 1,
panic: 0,
},
tick: function(pixel) {
if (tryMove(pixel, pixel.x, pixel.y+1)) {} // Fall
doDefaults(pixel);
if (pixel.hp < 1) {
pixel.element = "helpless_meat"
return
}
if (pixel.panic > 0) {
pixel.panic -= 0.1;
if (pixel.panic < 0) { pixel.panic = 0; }
}
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])) {
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 (!isEmpty(pixel.x+move[0], pixel.y+move[1], true)) {
var hitPixel = pixelMap[pixel.x+move[0]][pixel.y+move[1]];
if (hitPixel.element === "lammas" && hitPixel.panic < pixel.panic) {
hitPixel.panic = pixel.panic;
}
}
}
// 15% chance to change direction
if (Math.random() < 0.15 || !moved) {
pixel.dir *= -1;
}
if (pixel.temp > 150 && Math.random() > 0.75) {
DoDamage(pixel,"fire",10)
pixel.panic++
}
if (pixel.temp < -25) {
DoDamage(pixel,"ice",10)
pixel.panic++
}
DoNoitaCreature(pixel)
}
},
onCollide: function(pixel,damagePixel) {
DoNoitaStaining(pixel,damagePixel)
},
onBreak: function(pixel) {
releaseElement(pixel,elements[pixel.element].blood,4);
},
reactions: {
},
category: "life",
tempLow: -50,
stateLow: "helpless_meat",
tempHigh: 200,
stateHigh: "helpless_meat",
breakInto: "helpless_meat",
breakIntoColor: ["#cbcbcb","#ebebeb","#fffffe","#cbcbcb","#ebebeb","#fffffe","#ffcf93","#ffb373","#cbcbcb","#ebebeb","#fffffe"],
blood: "noita_blood",
burn:80,
burnTime:150,
state: "solid",
density: 6000,
conduct: 0.25,
living: true,
}
elements.evakas = {
properties: {
maxhp: 250,
hp: 250,
dir: 1,
panic: 0,
},
tick: function(pixel) {
if (tryMove(pixel, pixel.x, pixel.y+1)) {} // Fall
doDefaults(pixel);
if (pixel.hp < 1) {
pixel.element = "helpless_meat"
return
}
if (pixel.panic > 0) {
pixel.panic -= 0.1;
if (pixel.panic < 0) { pixel.panic = 0; }
}
if (Math.random() < 0.1*((!isEmpty(pixel.x, pixel.y+1,true) && !outOfBounds(pixel.x, pixel.y+1,true) && elements[pixelMap[pixel.x][pixel.y+1].element].id === elements.noita_water.id) ? 1 : pixel.panic+1)) { // Move 10% chance
var movesToTry = [
[1*pixel.dir,1],
[1*pixel.dir,-1],
];
let moved = false;
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],true) && !outOfBounds(pixel.x+move[0], pixel.y+move[1],true) && elements[pixelMap[pixel.x+move[0]][pixel.y+move[1]].element].id === elements.noita_water.id) {
var origx = pixel.x+move[0];
var origy = pixel.y+move[1];
swapPixels(pixel, pixelMap[pixel.x+move[0]][pixel.y+move[1]])
if (pixel.x===origx && pixel.y===origy) {
moved = true;
break;
}
}
else if (isEmpty(pixel.x+move[0], pixel.y+move[1]) || outOfBounds(pixel.x+move[0], pixel.y+move[1]) || elements[pixelMap[pixel.x+move[0]][pixel.y+move[1]].element].id !== elements.noita_water.id) {
}
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 === "evakas" && hitPixel.panic < pixel.panic) {
hitPixel.panic = pixel.panic;
}
}
}
// 15% chance to change direction
if (Math.random() < 0.15 || !moved || outOfBounds(pixel.x+1, pixel.y) || outOfBounds(pixel.x-1, pixel.y)) {
pixel.dir *= -1;
}
if (pixel.temp > 150 && Math.random() > 0.75) {
DoDamage(pixel,"fire",10)
pixel.panic++
}
if (pixel.temp < -25) {
DoDamage(pixel,"ice",10)
pixel.panic++
}
DoNoitaCreature(pixel)
}
},
onCollide: function(pixel,damagePixel) {
DoNoitaStaining(pixel,damagePixel)
},
onBreak: function(pixel) {
releaseElement(pixel,elements[pixel.element].blood,4);
},
color: ["#313540","#4e5b95","#4e5b95","#4c89ab"],
name:"eväkäs",
reactions: {
},
tempHigh: 200,
tempLow: -50,
stateLow: "helpless_meat",
category:"life",
stateHigh: "helpless_meat",
breakInto: "helpless_meat",
breakIntoColor: ["#313540","#4e5b95","#4e5b95","#4c89ab"],
blood: "noita_blood",
burn:20,
burnTime:200,
state: "solid",
density: 1080,
conduct: 0.2,
living: true,
}
elements.hamis = {
color: ["#52316f","#52316f","#beda65","#52316f","#52316f","#beda65","#52316f","#52316f","#beda65","#2d1b3d","#2d1b3d","#2d1b3d","#2d1b3d","#634c7e"],
name: "hämis",
properties: {
maxhp: 275,
hp: 275,
dir: 1,
panic: 0,
},
tick: function(pixel) {
if (tryMove(pixel, pixel.x, pixel.y+1)) {} // Fall
doDefaults(pixel);
if (pixel.hp < 1) {
pixel.element = "noita_meat"
return
}
if (pixel.panic > 0) {
pixel.panic -= 0.1;
if (pixel.panic < 0) { pixel.panic = 0; }
}
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])) {
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 (!isEmpty(pixel.x+move[0], pixel.y+move[1], true)) {
var hitPixel = pixelMap[pixel.x+move[0]][pixel.y+move[1]];
if (hitPixel.element === "hamis") {
DoDamage(pixel,"melee",750)
}
}
}
// 15% chance to change direction
if (Math.random() < 0.15 || !moved) {
pixel.dir *= -1;
}
if (pixel.temp > 150 && Math.random() > 0.75) {
DoDamage(pixel,"fire",10)
pixel.panic++
}
if (pixel.temp < -25) {
DoDamage(pixel,"ice",10)
pixel.panic++
}
DoNoitaCreature(pixel)
}
},
onCollide: function(pixel,damagePixel) {
DoNoitaStaining(pixel,damagePixel)
},
onBreak: function(pixel) {
releaseElement(pixel,elements[pixel.element].blood,4);
},
reactions: {
},
category: "life",
tempLow: -50,
stateLow: "noita_meat",
tempHigh: 200,
stateHigh: "noita_meat",
breakInto: "noita_meat",
breakIntoColor: ["#52316f","#52316f","#beda65","#52316f","#52316f","#beda65","#52316f","#52316f","#beda65","#2d1b3d","#2d1b3d","#2d1b3d","#2d1b3d","#634c7e"],
blood: "noita_blood",
burn:80,
burnTime:150,
state: "solid",
density: 6000,
conduct: 0.25,
living: true,
}
// creatures above
// props below
elements.lantern = {
color: ["#524526","#6c9ccc","#6c9ccc","#efd97d","#6c9ccc","#6c9ccc","#6d5c2e","#524526","#6c9ccc","#647cdc","#efd97d","#6c9ccc","#647cdc","#6d5c2e","#23211b"],
properties: {
maxhp: 375,
hp: 375,
},
tick: function(pixel) {
if (!tryMove(pixel, pixel.x, pixel.y+1)) {
tryMove(pixel, pixel.x+(Math.random() < 0.5 ? -1 : 1), pixel.y+1);
}
doDefaults(pixel);
if (pixel.hp < 1) {
pixel.element = "glass_broken"
return
}
if (pixel.temp > 150 && Math.random() > 0.75) {
DoDamage(pixel,"fire",10)
}
if (pixel.temp < -25) {
DoDamage(pixel,"ice",10)
}
},
onBreak: function(pixel) {
releaseElement(pixel,elements[pixel.element].blood,4);
},
reactions: {
},
category: "props",
tempLow: -50,
stateLow: "glass_broken",
tempHigh: 200,
stateHigh: "glass_broken",
breakInto: "glass_broken",
breakIntoColor: ["#524526","#6c9ccc","#efd97d","#6c9ccc","#6d5c2e","#524526","#6c9ccc","#efd97d","#6c9ccc","#6d5c2e","#23211b"],
blood: "noita_oil",
burnTime:150,
state: "solid",
density: 6000,
conduct: 0.25,
living: true,
}
elements.propane_tank = {
color: ["#60547a","#78669d","#ccbc6c","#78669d","#8777ae","#78669d","#8f7340","#78669d","#60547a"],
properties: {
maxhp: 5000,
hp: 5000,
},
tick: function(pixel) {
if (!tryMove(pixel, pixel.x, pixel.y+1)) {
tryMove(pixel, pixel.x+(Math.random() < 0.5 ? -1 : 1), pixel.y+1);
}
doDefaults(pixel);
if (pixel.hp < 1) {
pixel.element = "noita_prop_steel"
releaseElement(pixel,"freezing_vapour")
NExplode(pixel.x,pixel.y,6,32500,["freezing_vapour"])
return
}
if (pixel.temp > 150 && Math.random() > 0.75) {
DoDamage(pixel,"fire",10)
}
if (pixel.temp < -25) {
DoDamage(pixel,"ice",10)
}
},
onBreak: function(pixel) {
releaseElement(pixel,elements[pixel.element].blood,4);
changePixel(pixel,"propane_tank_spell")
},
reactions: {
},
category: "props",
tempLow: -50,
stateLow: "noita_prop_steel",
tempHigh: 200,
stateHigh: "noita_prop_steel",
breakInto: "noita_prop_steel",
breakIntoColor: ["#60547a","#78669d","#ccbc6c","#78669d","#8777ae","#78669d","#8f7340","#78669d","#60547a"],
blood: "freezing_liquid",
burnTime:150,
state: "solid",
density: 6000,
conduct: 0.25,
living: true,
}
// props above
// spells below
elements.square_of_fire = {
color: "#ff9700",
category: "spells",
hidden: true,
tick: function(pixel){
if (!pixel.expandedT){
pixel.expandedT = 0
}
if (pixel.expandedT === 0){
for (i = 0; i < squareCoords.length; i++){
let x = squareCoords[i][0] + pixel.x;
let y = squareCoords[i][1] + pixel.y;
if (isEmpty(x, y)){
createPixel(pixel.element, x, y)
}
}
}
pixel.expandedT ++;
if (pixel.expandedT > 2){
if (Math.random() > 0.5) {
changePixel(pixel, "noita_fire")
return
}
else {
deletePixel(pixel.x,pixel.y)
return
}
}
},
movable: false,
hardness: 0.8
}
elements.square_of_acid = {
color: "#00ff3c",
category: "spells",
hidden: true,
tick: function(pixel){
if (!pixel.expandedT){
pixel.expandedT = 0
}
if (pixel.expandedT === 0){
for (i = 0; i < squareCoords.length; i++){
let x = squareCoords[i][0] + pixel.x;
let y = squareCoords[i][1] + pixel.y;
if (isEmpty(x, y)){
createPixel(pixel.element, x, y)
}
}
}
pixel.expandedT ++;
if (pixel.expandedT > 2){
if (Math.random() > 0.5) {
changePixel(pixel, "noita_acid")
return
}
else {
deletePixel(pixel.x,pixel.y)
return
}
}
},
movable: false,
hardness: 0.8
}
elements.square_of_oil = {
color: "#3d3628",
category: "spells",
hidden: true,
tick: function(pixel){
if (!pixel.expandedT){
pixel.expandedT = 0
}
if (pixel.expandedT === 0){
for (i = 0; i < squareCoords.length; i++){
let x = squareCoords[i][0] + pixel.x;
let y = squareCoords[i][1] + pixel.y;
if (isEmpty(x, y)){
createPixel(pixel.element, x, y)
}
}
}
pixel.expandedT ++;
if (pixel.expandedT > 2) {
if (Math.random() > 0.5) {
changePixel(pixel, "noita_oil")
return
}
else {
deletePixel(pixel.x,pixel.y)
return
}
}
},
movable: false,
hardness: 0.8
}
elements.square_of_water = {
color: "#366158",
category: "spells",
hidden: true,
tick: function(pixel){
if (!pixel.expandedT){
pixel.expandedT = 0
}
if (pixel.expandedT === 0){
for (i = 0; i < squareCoords.length; i++){
let x = squareCoords[i][0] + pixel.x;
let y = squareCoords[i][1] + pixel.y;
if (isEmpty(x, y)){
createPixel(pixel.element, x, y)
}
}
}
pixel.expandedT ++;
if (pixel.expandedT > 2){
if (Math.random() > 0.5) {
changePixel(pixel, "noita_water")
return
}
else {
deletePixel(pixel.x,pixel.y)
return
}
}
},
movable: false,
hardness: 0.8
}
elements.acid_ball = {
color: ["#84b44c","#cce464","#5c7c4c"],
tick: function(pixel) {
if (!pixel.xDir && !pixel.Dirx) {
let Brandom = Math.random()
if (Brandom > 0.5) {
pixel.xDir = 1
pixel.Dirx = true
}
else {
pixel.xDir = -1
pixel.Dirx = true
}
}
if (!pixel.yDir && !pixel.Diry) {
let Brandom = Math.random()
if (Brandom > 0.66) {
pixel.yDir = 1
pixel.Diry = true
}
else if (Brandom < 0.33) {
pixel.yDir = -1
pixel.Diry = true
}
else {
pixel.yDir = 0
pixel.Diry = true
}
}
if (!tryMove(pixel, pixel.x+pixel.xDir, pixel.y+pixel.yDir)) {
NExplode(pixel.x,pixel.y,5,0,["noita_acid"])
deletePixel(pixel.x,pixel.y)
}
if ((pixel.start + 330) < pixelTicks) {
NExplode(pixel.x,pixel.y,5,0,["noita_acid"])
deletePixel(pixel.x,pixel.y)
}
},
state: "solid",
category:"spells",
density: 1300,
excludeRandom: true,
maxSize: 1,
cooldown: defaultCooldown,
hardness: 0.8,
}
elements.bullet = {
color: ["#f7e787","#f7e787","#f7c34f"],
name: "???",
tick: function(pixel) {
if (!pixel.xDir && !pixel.Dirx) {
let Brandom = Math.random()
if (Brandom > 0.5) {
pixel.xDir = 1
pixel.Dirx = true
}
else {
pixel.xDir = -1
pixel.Dirx = true
}
}
if (!pixel.yDir && !pixel.Diry) {
let Brandom = Math.random()
if (Brandom > 0.66) {
pixel.yDir = 1
pixel.Diry = true
}
else if (Brandom < 0.33) {
pixel.yDir = -1
pixel.Diry = true
}
else {
pixel.yDir = 0
pixel.Diry = true
}
}
if (!tryMove(pixel, pixel.x+pixel.xDir, pixel.y+pixel.yDir)) {
NExplode(pixel.x,pixel.y,2,1000,["spark"])
deletePixel(pixel.x,pixel.y)
}
if ((pixel.start + 330) < pixelTicks) {
NExplode(pixel.x,pixel.y,2,1000,["spark"])
deletePixel(pixel.x,pixel.y)
}
},
state: "solid",
category:"spells",
density: 1300,
excludeRandom: true,
maxSize: 1,
cooldown: defaultCooldown,
hardness: 0.8,
}
elements.arrow = {
color: ["#953232","#654f2e","#9a7946","#deddd7"],
tick: function(pixel) {
if (!pixel.xDir && !pixel.Dirx) {
let Brandom = Math.random()
if (Brandom > 0.5) {
pixel.xDir = 1
pixel.Dirx = true
}
else {
pixel.xDir = -1
pixel.Dirx = true
}
}
if (!pixel.yDir && !pixel.Diry) {
let Brandom = Math.random()
if (Brandom > 0.66) {
pixel.yDir = 1
pixel.Diry = true
}
else if (Brandom < 0.33) {
pixel.yDir = -1
pixel.Diry = true
}
else {
pixel.yDir = 0
pixel.Diry = true
}
}
if (!tryMove(pixel, pixel.x+pixel.xDir, pixel.y+pixel.yDir)) {
if (pixel.bouncy == true) {
if (pixel.xDir != pixel.yDir) { pixel.xDir = -pixel.xDir; }
if (pixel.yDir != (-pixel.xDir)) { pixel.yDir = -pixel.yDir; }
}
if (!outOfBounds(pixel.x+pixel.xDir,pixel.y+pixel.yDir) && !isEmpty(pixel.x+pixel.xDir,pixel.y+pixel.yDir, true)) {
var hitPixel = pixelMap[pixel.x+pixel.xDir][pixel.y+pixel.yDir]
if (hitPixel.hp) { // lower hp
DoDamage(hitPixel,"ice",500)
}
}
pixel.element = "plant_material"
pixel.settled = true
}
if ((pixel.start + 330) < pixelTicks) {
pixel.element = "plant_material"
pixel.settled = true
}
},
state: "solid",
category:"spells",
density: 1300,
excludeRandom: true,
maxSize: 1,
cooldown: defaultCooldown,
hardness: 0.8,
}
elements.bouncing_burst = {
color: ["#4db73a","#358627","#95ed57"],
tick: function(pixel) {
if (!pixel.xDir && !pixel.Dirx) {
let Brandom = Math.random()
if (Brandom > 0.5) {
pixel.xDir = 1
pixel.Dirx = true
}
else {
pixel.xDir = -1
pixel.Dirx = true
}
}
if (!pixel.yDir && !pixel.Diry) {
let Brandom = Math.random()
if (Brandom > 0.66) {
pixel.yDir = 1
pixel.Diry = true
}
else if (Brandom < 0.33) {
pixel.yDir = -1
pixel.Diry = true
}
else {
pixel.yDir = 0
pixel.Diry = true
}
}
if (pixel.bounces > 10) {
pixel.bouncy = false
}
if (!tryMove(pixel, pixel.x+pixel.xDir, pixel.y+pixel.yDir)) {
if (pixel.bouncy == true) {
if (pixel.xDir != pixel.yDir) { pixel.xDir = -pixel.xDir; }
if (pixel.yDir != (-pixel.xDir)) { pixel.yDir = -pixel.yDir; }
if (!pixel.bounces) { pixel.bounces = 1 }
else { pixel.bounces ++ }
}
if (!outOfBounds(pixel.x+pixel.xDir,pixel.y+pixel.yDir) && !isEmpty(pixel.x+pixel.xDir,pixel.y+pixel.yDir, true)) {
var hitPixel = pixelMap[pixel.x+pixel.xDir][pixel.y+pixel.yDir]
if (hitPixel.hp) { // lower hp
DoDamage(hitPixel,"ice",300)
}
deletePixel(pixel.x,pixel.y)
}
if (!pixel.bouncy || (pixel.start + 330) < pixelTicks) {
deletePixel(pixel.x,pixel.y)
}
}
},
properties: {
"bouncy": true
},
state: "solid",
category:"spells",
density: 1300,
excludeRandom: true,
maxSize: 1,
cooldown: defaultCooldown,
hardness: 0.8,
}
elements.propane_tank_spell = {
name: "propane_tank",
color: ["#60547a","#78669d","#ccbc6c","#78669d","#8777ae","#78669d","#8f7340","#78669d","#60547a"],
tick: function(pixel) {
if (!pixel.xDir && !pixel.Dirx) {
let Brandom = Math.random()
if (Brandom > 0.5) {
pixel.xDir = 1
pixel.Dirx = true
}
else {
pixel.xDir = -1
pixel.Dirx = true
}
}
if (!pixel.yDir && !pixel.Diry) {
let Brandom = Math.random()
if (Brandom > 0.66) {
pixel.yDir = 1
pixel.Diry = true
}
else if (Brandom < 0.33) {
pixel.yDir = -1
pixel.Diry = true
}
else {
pixel.yDir = 0
pixel.Diry = true
}
}
if (pixel.bounces > 5) {
pixel.bouncy = false
}
releaseElement(pixel,"freezing_vapour")
if (!tryMove(pixel, pixel.x+pixel.xDir, pixel.y+pixel.yDir)) {
if (pixel.bouncy == true) {
if (pixel.xDir != pixel.yDir) { pixel.xDir = -pixel.xDir; }
if (pixel.yDir != (-pixel.xDir)) { pixel.yDir = -pixel.yDir; }
if (!pixel.bounces) { pixel.bounces = 1 }
else { pixel.bounces ++ }
}
if (!outOfBounds(pixel.x+pixel.xDir,pixel.y+pixel.yDir) && !isEmpty(pixel.x+pixel.xDir,pixel.y+pixel.yDir, true)) {
var hitPixel = pixelMap[pixel.x+pixel.xDir][pixel.y+pixel.yDir]
if (hitPixel.hp) { // lower hp
DoDamage(hitPixel,"explosion",32500)
NExplode(pixel.x,pixel.y,6,32500,["freezing_vapour"])
deletePixel(pixel.x,pixel.y)
}
}
if (!pixel.bouncy) {
NExplode(pixel.x,pixel.y,6,32500,["freezing_vapour"])
deletePixel(pixel.x,pixel.y)
}
}
},
properties: {
"bouncy": true
},
state: "solid",
category:"spells",
density: 1300,
excludeRandom: true,
maxSize: 1,
cooldown: defaultCooldown,
hardness: 0.8,
}
elements.black_hole = {
color: ["#251b35","#251b35","#251b35","#997bc6","#997bc6","#251b35","#251b35"],
tick: function(pixel) {
if (!pixel.xDir && !pixel.Dirx) {
let Brandom = Math.random()
if (Brandom > 0.5) {
pixel.xDir = 1
pixel.Dirx = true
}
else {
pixel.xDir = -1
pixel.Dirx = true
}
}
if (!pixel.yDir && !pixel.Diry) {
let Brandom = Math.random()
if (Brandom > 0.66) {
pixel.yDir = 1
pixel.Diry = true
}
else if (Brandom < 0.33) {
pixel.yDir = -1
pixel.Diry = true
}
else {
pixel.yDir = 0
pixel.Diry = true
}
}
for (let i = -10; i < 11; i++) {
if (!isEmpty(pixel.x+i,pixel.y+i,true) && !outOfBounds(pixel.x+i,pixel.y+i) && elements[pixelMap[pixel.x+i][pixel.y+i].element].state == "solid" && elements[pixelMap[pixel.x+i][pixel.y+i].element].movable == true) {
if (pixel.x > pixel.x+i) {
var dirx = 1
}
else if (pixel.x < pixel.x+i) {
var dirx = -1
}
else {
var diry = 0
}
if (pixel.y > pixel.y+i) {
var diry = 1
}
else if (pixel.y < pixel.y+i) {
var diry = -1
}
else {
var diry = 0
}
if (dirx != undefined && diry != undefined && !((dirx==0) && (diry==0))) {
tryMove(pixelMap[pixel.x+i][pixel.y+i], (pixel.x+i)+dirx, (pixel.y+i)+diry)
}
}
}
for (let i = -6; i < 7; i++) {
for (j = -6; j < 7; j++) {
if (!isEmpty(pixel.x+j,pixel.y+i) && !outOfBounds(pixel.x+j,pixel.y+i) && !((i==0) && (j==0))) {
if (elements[pixelMap[pixel.x+j][pixel.y+i].element].state == "solid") {
deletePixel(pixel.x+j,pixel.y+i)
}
}
}
}
if (!tryMove(pixel, pixel.x+pixel.xDir, pixel.y+pixel.yDir)) {
if (!isEmpty(pixel.x+pixel.xDir, pixel.y+pixel.yDir) && !outOfBounds(pixel.x+pixel.xDir, pixel.y+pixel.yDir)) {
swapPixels(pixel,pixelMap[pixel.x+pixel.xDir][pixel.y+pixel.yDir])
}
else {
deletePixel(pixel.x,pixel.y)
}
}
if ((pixel.start + 130) < pixelTicks) {
deletePixel(pixel.x,pixel.y)
}
},
renderer: function(pixel,ctx) {
drawSquare(ctx,"#60bbf7",pixel.x-3,pixel.y-3,7,0.5);
drawSquare(ctx,pixel.color,pixel.x-2,pixel.y-2,5,1);
drawDefault(ctx,pixel);
},
state: "solid",
category:"spells",
density: 1300,
excludeRandom: true,
maxSize: 1,
cooldown: defaultCooldown,
hardness: 0.8,
}
worldgentypes.noita_surface = {
layers: [
[0.8, "soil"],
[0.3, "noita_rock"],
[0.1, "dense_rock"],
[0, "extremely_dense_rock"],
],
decor: [
["lammas", 0.1],
]
} /*
worldgentypes.noita_lava = {
layers: [
[0.3, "lava"],
[0.1, "dense_rock"],
[0, "extremely_dense_rock"],
],
}
worldgentypes.noita_holy_mountain = {
layers: [
[0.9, "extremely_dense_rock"],
[0.8, "dense_rock"],
[0.7, "brickwork"],
[0.3, "flash"],
[0.2, "brickwork"],
[0.1, "dense_rock"],
[0, "extremely_dense_rock"],
],
baseHeight: 0.9,
heightVariance: 0.05,
complexity: 1,
} */