Pressure Update

This commit is contained in:
An Orbit 2024-07-02 20:34:31 -04:00 committed by GitHub
parent 89a9cf03ff
commit f27a5b4683
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
1 changed files with 733 additions and 57 deletions

View File

@ -171,6 +171,15 @@ try {
throw new TypeError(`Unexpected type: ${typeof(stringOrArray)}`); throw new TypeError(`Unexpected type: ${typeof(stringOrArray)}`);
}; };
}; };
//Shuffle not-in-place
function arrayToShuffled(array) {
var _array = structuredClone ? structuredClone(array) : JSON.parse(JSON.stringify(array));
for (let i = _array.length - 1; i > 0; i--) {
const j = Math.floor(Math.random() * (i + 1));
[_array[i], _array[j]] = [_array[j], _array[i]];
};
return _array
};
//Checks //Checks
//Element exists in the elements object //Element exists in the elements object
function elementExists(elementName) { function elementExists(elementName) {
@ -391,6 +400,10 @@ try {
function addTwoNumbers(number1,number2) { //reducer function addTwoNumbers(number1,number2) { //reducer
return number1 + number2 return number1 + number2
} }
//Linear interpolation
function lerp(a,b,t) {
return (b * t) + (a * (1 - t))
};
//Logistic curve //Logistic curve
//x = real number //x = real number
//L = maximum value //L = maximum value
@ -1747,6 +1760,16 @@ try {
function getCirclePixels(x,y,radius) { function getCirclePixels(x,y,radius) {
return circleCoords(x,y,radius).map(coordinates => pixelMap[coordinates.x]?.[coordinates.y]).filter(function(pixelOrUndefined) { return typeof(pixelOrUndefined) == "object" }) return circleCoords(x,y,radius).map(coordinates => pixelMap[coordinates.x]?.[coordinates.y]).filter(function(pixelOrUndefined) { return typeof(pixelOrUndefined) == "object" })
}; };
function getPixelsInRegion(x1,y1,x2,y2) {
var result = [];
for(var x = x1; x <= x2; x++) {
for(var y = y1; y <= y2; y++) {
var p = pixelMap[x]?.[y];
if(p && !(p.del)) { result.push(p) }
}
};
return result
};
function getPixelMooreNeighbors(pixel) { function getPixelMooreNeighbors(pixel) {
var coordsToCheck = mooreDonutCoords.map(function(offsets) { return {x: offsets[0]+pixel.x, y: offsets[1]+pixel.y} } ); var coordsToCheck = mooreDonutCoords.map(function(offsets) { return {x: offsets[0]+pixel.x, y: offsets[1]+pixel.y} } );
var neighbors = []; var neighbors = [];
@ -2323,7 +2346,11 @@ td.inputCell {
sweepingLaserRotationSpeed: -0.03, sweepingLaserRotationSpeed: -0.03,
sweepingLaserBeamLength: 10, sweepingLaserBeamLength: 10,
sweepingLaserBeamTemperature: 2000, sweepingLaserBeamTemperature: 2000,
sweepingLaserBeamBrevity: 5 sweepingLaserBeamBrevity: 5,
noteBlockFrequency: 440,
noteBlockLength: 1,
noteBlockVolume: 1,
noteBlockDelay: 0
}; };
hidePropertySetter(); hidePropertySetter();
@ -4056,15 +4083,19 @@ color1 and color2 spread through striped paint like dye does with itself. <u>col
quickSlDetectorLastKeys = []; quickSlDetectorLastKeys = [];
}; };
}); });
/*if(urlParams.get("pause") !== null) {
paused = true;
document.getElementById("pauseButton").setAttribute("on","true")
};*/
gameLoaded = true; gameLoaded = true;
}; };
//MORE CONFIGURABLE EXPLOSIONS (explodeAtPlus) ## //MORE CONFIGURABLE EXPLOSIONS (explodeAtPlus) ##
velocityBlacklist = []; velocityBlacklist = [];
function explodeAtPlus(x,y,radius,firee="fire",smokee="smoke",beforeFunction=null,afterFunction=null,changeTemp=true) { function explodeAtPlus(x,y,radius,firee="fire",smokee="smoke",beforeFunction=null,afterFunction=null,changeTemp=true) {
var message = "Explosion "; //var message = "Explosion ";
var pixel = pixelMap[x]?.[y]; var pixel = pixelMap[x]?.[y];
if(pixel) { message += `of ${pixel.element} ` }; //if(pixel) { message += `of ${pixel.element} ` };
message += `with radius ${radius} at (${x},${y})`; //message += `with radius ${radius} at (${x},${y})`;
// if fire contains , split it into an array // if fire contains , split it into an array
if(firee !== null) { if(firee !== null) {
if (firee.indexOf(",") !== -1) { if (firee.indexOf(",") !== -1) {
@ -4078,6 +4109,7 @@ color1 and color2 spread through striped paint like dye does with itself. <u>col
}; };
var coords = circleCoords(x,y,radius); var coords = circleCoords(x,y,radius);
var power = radius/10; var power = radius/10;
changePressure(x,y,radius ** 2,operationType="+",true);
//for (var p = 0; p < Math.round(radius/10+1); p++) { //for (var p = 0; p < Math.round(radius/10+1); p++) {
for (var i = 0; i < coords.length; i++) { for (var i = 0; i < coords.length; i++) {
var fire = firee; var fire = firee;
@ -5461,6 +5493,7 @@ color1 and color2 spread through striped paint like dye does with itself. <u>col
} }
//FIND MODE, PIXEL PROPERTIES LINKED TO SPECIAL CODE, CONFIGURABLE VISUAL DISTORTION AND VISUAL PIXEL SHAPE SETTINGS (acid_and_shapes.js) ## //FIND MODE, PIXEL PROPERTIES LINKED TO SPECIAL CODE, CONFIGURABLE VISUAL DISTORTION AND VISUAL PIXEL SHAPE SETTINGS (acid_and_shapes.js) ##
//two separate things i.e. not "pixel properties linked to special code, configurable visual distortion, and visual pixel shape settings" though there's basically no semantic difference //two separate things i.e. not "pixel properties linked to special code, configurable visual distortion, and visual pixel shape settings" though there's basically no semantic difference
//And also all other changes to drawPixels
var style = document.createElement('style'); var style = document.createElement('style');
style.type = 'text/css'; style.type = 'text/css';
style.id = 'findStatusStylesheet'; style.id = 'findStatusStylesheet';
@ -5806,6 +5839,35 @@ color1 and color2 spread through striped paint like dye does with itself. <u>col
ctx.fillRect(0, 0, canvas.width, canvas.height); ctx.fillRect(0, 0, canvas.width, canvas.height);
} }
if(!hiding) { if(!hiding) {
if(settings.dopressure && settings.drawpressure) {
for(var x = 0; x < pressureMap.length; x++) {
for(var y = 0; y < pressureMap[x].length; y++) {
var pressureValue = pressureMap[x][y];
if(typeof(pressureValue) == "number") {
var pressureSign = Math.sign(pressureValue);
pressureValue = bound(Math.abs(pressureValue),0,255) / 255;
switch(pressureSign) {
case -0:
case 0:
ctx.fillStyle = `rgb(0,0,0)`;
break
case 1:
ctx.fillStyle = `rgb(255,0,0)`;
break
case -1:
ctx.fillStyle = `rgb(0,0,255)`;
break
default: // covers NaN, since NaN != NaN
ctx.fillStyle = `rgb(255,255,0)`;
break
};
ctx.globalAlpha = isNaN(pressureSign) ? 0.5 : pressureValue;
ctx.fillRect(x*pixelSize*pressureCellSize, y*pixelSize*pressureCellSize, pixelSize*pressureCellSize, pixelSize*pressureCellSize)
}
}
}
ctx.globalAlpha = 1;
};
var pixelDrawList = pixelsFirst.concat(pixelsLast); var pixelDrawList = pixelsFirst.concat(pixelsLast);
for (var i = 0; i < pixelDrawList.length; i++) { for (var i = 0; i < pixelDrawList.length; i++) {
var pixel = pixelDrawList[i]; var pixel = pixelDrawList[i];
@ -6135,6 +6197,48 @@ color1 and color2 spread through striped paint like dye does with itself. <u>col
rankineSettingSpan.appendChild(settingInput); rankineSettingSpan.appendChild(settingInput);
rankineSettingSpan.appendChild(newHelpMark); rankineSettingSpan.appendChild(newHelpMark);
acidSettingSpan.after(rankineSettingSpan); acidSettingSpan.after(rankineSettingSpan);
var pressureSettingSpan = document.createElement("span");
pressureSettingSpan.setAttribute("setting","dopressure");
pressureSettingSpan.setAttribute("title","Default: OFF");
pressureSettingSpan.classList.add("setting-span","multisetting");
var settingInput = document.createElement("input");
settingInput.setAttribute("type","button");
settingInput.setAttribute("value",'Pressure simulation');
settingInput.setAttribute("state","0");
settingInput.classList.add("toggleInput");
settingInput.setAttribute("onclick","toggleInput(this,'dopressure',false)");
var options = {
"false": "Disabled",
"true": "Enabled"
};
var newHelpMark = document.createElement("span");
newHelpMark.setAttribute("title","Simplified pressure simulation (which may lag).");
newHelpMark.classList.add("helpMark");
newHelpMark.innerText = "?";
pressureSettingSpan.appendChild(settingInput);
pressureSettingSpan.appendChild(newHelpMark);
rankineSettingSpan.after(pressureSettingSpan);
var showPressureSettingSpan = document.createElement("span");
showPressureSettingSpan.setAttribute("setting","drawpressure");
showPressureSettingSpan.setAttribute("title","Default: OFF");
showPressureSettingSpan.classList.add("setting-span","multisetting");
var settingInput = document.createElement("input");
settingInput.setAttribute("type","button");
settingInput.setAttribute("value",'Show pressure');
settingInput.setAttribute("state","0");
settingInput.classList.add("toggleInput");
settingInput.setAttribute("onclick","toggleInput(this,'drawpressure',false)");
var options = {
"false": "Disabled",
"true": "Enabled"
};
var newHelpMark = document.createElement("span");
newHelpMark.setAttribute("title","Draw pressure (only applies if pressure simulation is enabled).");
newHelpMark.classList.add("helpMark");
newHelpMark.innerText = "?";
showPressureSettingSpan.appendChild(settingInput);
showPressureSettingSpan.appendChild(newHelpMark);
pressureSettingSpan.after(showPressureSettingSpan);
var sizeSetting = document.querySelector('span[setting="pixelsize"]'); var sizeSetting = document.querySelector('span[setting="pixelsize"]');
var sizeDropdown = sizeSetting.querySelector("select"); var sizeDropdown = sizeSetting.querySelector("select");
sizeDropdown.setAttribute("onchange","var size = (this.value === 'null' ? null : parseFloat(this.value)); console.log(size); if((size >= 0.05) && (size <= 194.73749999999999) && (size !== null) && (size !== false) && !(isNaN(size))) { console.log(size); setSetting('pixelsize',size);this.nextElementSibling.innerText='Reset Scene' }"); sizeDropdown.setAttribute("onchange","var size = (this.value === 'null' ? null : parseFloat(this.value)); console.log(size); if((size >= 0.05) && (size <= 194.73749999999999) && (size !== null) && (size !== false) && !(isNaN(size))) { console.log(size); setSetting('pixelsize',size);this.nextElementSibling.innerText='Reset Scene' }");
@ -9207,6 +9311,7 @@ color1 and color2 spread through striped paint like dye does with itself. <u>col
//if(pixelTicks == pixel.start) { console.log("this range",pixel.range) }; //if(pixelTicks == pixel.start) { console.log("this range",pixel.range) };
if(pixel.range <= 0) { deletePixel(pixel.x,pixel.y); return }; if(pixel.range <= 0) { deletePixel(pixel.x,pixel.y); return };
var range = (pixel.range ?? (ambaPlaceProperties?.blackHoleRange ?? 15)) * 2; var range = (pixel.range ?? (ambaPlaceProperties?.blackHoleRange ?? 15)) * 2;
if(settings.dopressure) { changePressure(pixel.x,pixel.y,10 + ((range / 2) ** 2),"-",true) };
var targets = mouseLikeRange(pixel.x,pixel.y,range,"circle",true); var targets = mouseLikeRange(pixel.x,pixel.y,range,"circle",true);
shuffleArray(targets); shuffleArray(targets);
for (var i = 0; i < targets.length; i++) { for (var i = 0; i < targets.length; i++) {
@ -9256,7 +9361,7 @@ color1 and color2 spread through striped paint like dye does with itself. <u>col
var taxicabDistance = Math.abs(newPixel.x - pixel.x) + Math.abs(newPixel.y - pixel.y); var taxicabDistance = Math.abs(newPixel.x - pixel.x) + Math.abs(newPixel.y - pixel.y);
if((taxicabDistance <= 3) && (taxicabDistance > 0)) { if((taxicabDistance <= 3) && (taxicabDistance > 0)) {
pixel.temp += (newPixel.temp - (settings.abszero ?? 273.15)); pixel.temp += (newPixel.temp - (settings.abszero ?? 273.15));
if(["amba_black_hole","amba_white_hole"].includes(newPixel.element) && (newPixel.range ?? 15) > 0) { if(["amba_black_hole","amba_white_hole"].includes(newPixel.element) && ((newPixel.range ?? 15) > 0) && (newPixel !== pixel)) {
//console.log("adding range on tick",pixelTicks); //console.log("adding range on tick",pixelTicks);
pixel.range ??= (ambaPlaceProperties?.blackHoleRange ?? 15); pixel.range ??= (ambaPlaceProperties?.blackHoleRange ?? 15);
var rangeChange = (newPixel.range ?? (ambaPlaceProperties?.blackHoleRange ?? 15)); var rangeChange = (newPixel.range ?? (ambaPlaceProperties?.blackHoleRange ?? 15));
@ -9378,6 +9483,29 @@ color1 and color2 spread through striped paint like dye does with itself. <u>col
maxSize: 1 maxSize: 1
}; };
elements.pus = {
color: "#bfba71",
behavior: behaviors.LIQUID,
reactions: {
"water": { elem1:["pus","pus","pus","pus","pus","pus","dirty_water"], elem2:"dirty_water", chance:0.01 },
"blood": { elem1:["pus","pus","pus","pus","pus","pus","infection"], elem2:"infection", chance:0.01 },
"poison": { elem1:"bio_ooze", elem2:"bio_ooze", chance:0.2 },
"bio_ooze": { elem1:"bio_ooze", chance:0.2 },
"frog": { elem2:"rotten_meat", chance:0.005 },
"fish": { elem2:"rotten_meat", chance:0.005 },
"meat": { elem2:"rotten_meat", chance:0.005 },
"alcohol": { elem1:"dirty_water", chance:0.2 }
},
viscosity: 30,
tempHigh: 124.55,
stateHigh: ["plague","stench","steam","steam","steam","salt"],
tempLow: -2,
category:"liquids",
hidden: true,
state: "liquid",
density: 1100,
stain: 0.08
};
//ASSORTED RAINBOW VARIANTS ## //ASSORTED RAINBOW VARIANTS ##
elements.concoction.reactions.diorite_gravel = { elements.concoction.reactions.diorite_gravel = {
elem1: "static", elem2: null elem1: "static", elem2: null
@ -13138,6 +13266,9 @@ color1 and color2 spread through striped paint like dye does with itself. <u>col
version: 1, version: 1,
enabledMods: localStorage.enabledMods enabledMods: localStorage.enabledMods
}; };
if(settings.dopressure) {
simulationState.pressureMap = pressureMap
};
for(i = 0; i < simulationState.pixelMap.length; i++) { for(i = 0; i < simulationState.pixelMap.length; i++) {
var column = simulationState.pixelMap[i]; var column = simulationState.pixelMap[i];
for(j = 0; j < column.length; j++) { for(j = 0; j < column.length; j++) {
@ -13371,6 +13502,7 @@ color1 and color2 spread through striped paint like dye does with itself. <u>col
} }
saveSettings saveSettings
}; };
if((settings.dopressure) && json.pressureMap) { pressureMap = json.pressureMap };
//enabledMods handling { //enabledMods handling {
var enMods = "[]"; var enMods = "[]";
if(typeof(json.enabledMods) !== "undefined") { if(typeof(json.enabledMods) !== "undefined") {
@ -13498,6 +13630,9 @@ Pixel size (rendering only): <input id="pixelSize"> (Use if the save looks cut o
if(enabledMods.includes("mods/betterStats.js") && typeof(realTps) !== "undefined") { stats += "<span id='stat-realtps' class='stat'>" + realTps + "tps</span>" }; //i'm sorry but there's no other way to add compatibility if(enabledMods.includes("mods/betterStats.js") && typeof(realTps) !== "undefined") { stats += "<span id='stat-realtps' class='stat'>" + realTps + "tps</span>" }; //i'm sorry but there's no other way to add compatibility
//THAT CODE WAS MADE BY MOLLTHECODER FROM THEIR betterStats.js MOD //THAT CODE WAS MADE BY MOLLTHECODER FROM THEIR betterStats.js MOD
stats += "<span id='stat-ticks' class='stat'>" + pixelTicks+"</span>"; stats += "<span id='stat-ticks' class='stat'>" + pixelTicks+"</span>";
if((typeof(width) == "number") && (!outOfBounds(mousePos.x,mousePos.y))) {
stats += "<span id='stat-pressure' class='stat'>P:" + getPressureAtPixelCoords(mousePos.x,mousePos.y).toFixed(2).replace(/\.?0+$/,"")+"</span>";
};
if ((typeof pixelMap).length === 9) { return; } if ((typeof pixelMap).length === 9) { return; }
if (pixelMap[mousePos.x] !== undefined) { if (pixelMap[mousePos.x] !== undefined) {
var currentPixel = pixelMap[mousePos.x][mousePos.y]; var currentPixel = pixelMap[mousePos.x][mousePos.y];
@ -16336,13 +16471,13 @@ Pixel size (rendering only): <input id="pixelSize"> (Use if the save looks cut o
return elements[e].category == "life"; return elements[e].category == "life";
}) })
}); });
elements.bioooze = { elements.bio_ooze = { //a.k.a. the water in the River Thames during July and August of 1858
name: "Bio-Ooze",
color: ["#53FF4F", "#53FF4F", "#06DE00", "#04A600", "#036E00"], color: ["#53FF4F", "#53FF4F", "#06DE00", "#04A600", "#036E00"],
behavior: behaviors.LIQUID, behavior: behaviors.LIQUID,
tempHigh: 100, tempHigh: 100,
stateHigh: ["plague","slime","steam","poison"], stateHigh: ["plague","slime","steam","poison"],
//tempLow: -4, tempLow: -4,
//stateLow: "bioooze_ice",
category: "liquids", category: "liquids",
heatCapacity: 3.52, //unimplemented feature heatCapacity: 3.52, //unimplemented feature
name: "bio-ooze", name: "bio-ooze",
@ -16353,34 +16488,34 @@ Pixel size (rendering only): <input id="pixelSize"> (Use if the save looks cut o
//"elder_fluid": { "elem1":"corrupt_slime" }, //acid should be sulfuric acid and product should be wastestone //"elder_fluid": { "elem1":"corrupt_slime" }, //acid should be sulfuric acid and product should be wastestone
//"mercury": { "elem1":"liquid_protocite" }, //acid should be sulfuric acid and product should be wastestone //"mercury": { "elem1":"liquid_protocite" }, //acid should be sulfuric acid and product should be wastestone
//"blue_grav_liquid": { "elem1":"blue_grav_liquid" }, //bgl would set gravity to upwards gravity //"blue_grav_liquid": { "elem1":"blue_grav_liquid" }, //bgl would set gravity to upwards gravity
"blood": { "elem1": ["bioooze","bioooze","poison","slime",null], "elem2": "infection" }, "blood": { "elem1": ["bio_ooze","bio_ooze","poison","slime",null], "elem2": "infection" },
"soap": { "elem1": "slime", "chance": 0.02 }, "soap": { "elem1": "slime", "chance": 0.02 },
"plant": { "elem1": ["bioooze","bioooze","poison","slime",null], "elem2": "dead_plant" }, "plant": { "elem1": ["bio_ooze","bio_ooze","poison","slime",null], "elem2": "dead_plant" },
"grass": { "elem1": ["bioooze","bioooze","poison","slime",null], "elem2": "dead_plant" }, "grass": { "elem1": ["bio_ooze","bio_ooze","poison","slime",null], "elem2": "dead_plant" },
"algae": { "elem1": ["bioooze","bioooze","poison","slime",null], "elem2": "dead_plant" }, "algae": { "elem1": ["bio_ooze","bio_ooze","poison","slime",null], "elem2": "dead_plant" },
"mushroom_spore": { "elem1": ["bioooze","bioooze","poison","slime",null], "elem2": "dead_plant" }, "mushroom_spore": { "elem1": ["bio_ooze","bio_ooze","poison","slime",null], "elem2": "dead_plant" },
"lichen": { "elem1": ["bioooze","bioooze","poison","slime",null], "elem2": "dead_plant" }, "lichen": { "elem1": ["bio_ooze","bio_ooze","poison","slime",null], "elem2": "dead_plant" },
"rat": { "elem1": ["bioooze","bioooze","poison","slime",null], "elem2": "rotten_meat" }, "rat": { "elem1": ["bio_ooze","bio_ooze","poison","slime",null], "elem2": "rotten_meat" },
"frog": { "elem1": ["bioooze","bioooze","poison","slime",null], "elem2": "rotten_meat" }, "frog": { "elem1": ["bio_ooze","bio_ooze","poison","slime",null], "elem2": "rotten_meat" },
"fish": { "elem1": ["bioooze","bioooze","poison","slime",null], "elem2": "rotten_meat" }, "fish": { "elem1": ["bio_ooze","bio_ooze","poison","slime",null], "elem2": "rotten_meat" },
"bird": { "elem1": ["bioooze","bioooze","poison","slime",null], "elem2": "rotten_meat" }, "bird": { "elem1": ["bio_ooze","bio_ooze","poison","slime",null], "elem2": "rotten_meat" },
"head": { "elem1": ["bioooze","bioooze","poison","slime",null], "elem2": "rotten_meat" }, "head": { "elem1": ["bio_ooze","bio_ooze","poison","slime",null], "elem2": "rotten_meat" },
"body": { "elem1": ["bioooze","bioooze","poison","slime",null], "elem2": "rotten_meat" }, "body": { "elem1": ["bio_ooze","bio_ooze","poison","slime",null], "elem2": "rotten_meat" },
"ant": { "elem1": ["bioooze","bioooze","bioooze","bioooze","poison","slime",null], "elem2": "dust" }, "ant": { "elem1": ["bio_ooze","bio_ooze","bio_ooze","bio_ooze","poison","slime",null], "elem2": "dust" },
"worm": { "elem1": ["bioooze","bioooze","bioooze","bioooze","poison","slime",null], "elem2": "dust" }, "worm": { "elem1": ["bio_ooze","bio_ooze","bio_ooze","bio_ooze","poison","slime",null], "elem2": "dust" },
"fly": { "elem1": ["bioooze","bioooze","bioooze","bioooze","poison","slime",null], "elem2": "dust" }, "fly": { "elem1": ["bio_ooze","bio_ooze","bio_ooze","bio_ooze","poison","slime",null], "elem2": "dust" },
"firefly": { "elem1": ["bioooze","bioooze","bioooze","bioooze","poison","slime",null], "elem2": "dust" }, "firefly": { "elem1": ["bio_ooze","bio_ooze","bio_ooze","bio_ooze","poison","slime",null], "elem2": "dust" },
"bee": { "elem1": ["bioooze","bioooze","bioooze","bioooze","poison","slime",null], "elem2": "dust" }, "bee": { "elem1": ["bio_ooze","bio_ooze","bio_ooze","bio_ooze","poison","slime",null], "elem2": "dust" },
"slug": { "elem1": ["bioooze","bioooze","bioooze","bioooze","poison","slime",null], "elem2": "dust" }, "slug": { "elem1": ["bio_ooze","bio_ooze","bio_ooze","bio_ooze","poison","slime",null], "elem2": "dust" },
"snail": { "elem1": ["bioooze","bioooze","bioooze","bioooze","poison","slime",null], "elem2": "calcium" }, "snail": { "elem1": ["bio_ooze","bio_ooze","bio_ooze","bio_ooze","poison","slime",null], "elem2": "calcium" },
"sapling": { "elem1": ["bioooze","bioooze","poison","slime",null], "elem2": "dead_plant" }, "sapling": { "elem1": ["bio_ooze","bio_ooze","poison","slime",null], "elem2": "dead_plant" },
"root": { "elem1": ["bioooze","bioooze","poison","slime",null], "elem2": "dead_plant" }, "root": { "elem1": ["bio_ooze","bio_ooze","poison","slime",null], "elem2": "dead_plant" },
"flower_seed": { "elem1": ["bioooze","bioooze","poison","slime",null], "elem2": "dead_plant" }, "flower_seed": { "elem1": ["bio_ooze","bio_ooze","poison","slime",null], "elem2": "dead_plant" },
"pistil": { "elem1": ["bioooze","bioooze","poison","slime",null], "elem2": "dead_plant" }, "pistil": { "elem1": ["bio_ooze","bio_ooze","poison","slime",null], "elem2": "dead_plant" },
"petal": { "elem1": ["bioooze","bioooze","poison","slime",null], "elem2": "dead_plant" }, "petal": { "elem1": ["bio_ooze","bio_ooze","poison","slime",null], "elem2": "dead_plant" },
"grass_seed": { "elem1": ["bioooze","bioooze","poison","slime",null], "elem2": "dead_plant" }, "grass_seed": { "elem1": ["bio_ooze","bio_ooze","poison","slime",null], "elem2": "dead_plant" },
"meat": { "elem1": ["bioooze","bioooze","poison","slime",null], "elem2": "rotten_meat" }, "meat": { "elem1": ["bio_ooze","bio_ooze","poison","slime",null], "elem2": "rotten_meat" },
"wood": { "elem1": ["bioooze","bioooze","poison","slime",null], "elem2": "sawdust", "chance": 0.25 } "wood": { "elem1": ["bio_ooze","bio_ooze","poison","slime",null], "elem2": "sawdust", "chance": 0.25 }
}, },
/*reactions: { /*reactions: {
"dirt": { // React with (water reacts with dirt to make mud) "dirt": { // React with (water reacts with dirt to make mud)
@ -19227,7 +19362,7 @@ Pixel size (rendering only): <input id="pixelSize"> (Use if the save looks cut o
conduct: 0.23, conduct: 0.23,
}; };
elements.haseulite_gas = { elements.haseulite_gas = {
color: ["#ffff9d", _cc.w.h, "#e9ffe6", "#ffffe5"], color: ["#ffff9d", _cc.w.h, "#e9ffe6", "#ffffe5"],
fireColor: ["#08a953", "#2ea332", "#d1e0d3"], fireColor: ["#08a953", "#2ea332", "#d1e0d3"],
properties: { properties: {
oldColor: null oldColor: null
@ -19376,7 +19511,7 @@ Pixel size (rendering only): <input id="pixelSize"> (Use if the save looks cut o
conduct: 0.22, conduct: 0.22,
}; };
elements.heejinite_gas = { elements.heejinite_gas = {
color: ["#fffab8", "#ffdab3", "#ffd1d1", "#ffc4df", "#ffb0eb"], color: ["#fffab8", "#ffdab3", "#ffd1d1", "#ffc4df", "#ffb0eb"],
fireColor: ["#a9085e", "#a32e61", "#fca7c6"], fireColor: ["#a9085e", "#a32e61", "#fca7c6"],
properties: { properties: {
oldColor: null oldColor: null
@ -19652,7 +19787,7 @@ Pixel size (rendering only): <input id="pixelSize"> (Use if the save looks cut o
conduct: 0.34, conduct: 0.34,
}; };
elements.jinsoulite_gas = { elements.jinsoulite_gas = {
color: ["#c0f0ef", "#c2c1db", "#c0bff5", "#cdcce6"], color: ["#c0f0ef", "#c2c1db", "#c0bff5", "#cdcce6"],
behavior: [ behavior: [
"XX|CR:steam%0.5|XX", "XX|CR:steam%0.5|XX",
"CR:steam%0.5|XX|CR:steam%0.5", "CR:steam%0.5|XX|CR:steam%0.5",
@ -19832,7 +19967,7 @@ Pixel size (rendering only): <input id="pixelSize"> (Use if the save looks cut o
conduct: 0.22, conduct: 0.22,
}; };
elements.yvesite_gas = { elements.yvesite_gas = {
color: ["#e34070", "#d13060", "#c2234a", "#db4866"], color: ["#e34070", "#d13060", "#c2234a", "#db4866"],
fireColor: ["#b5103f", "#ab3254", "#cc2157", "#ba0936"], fireColor: ["#b5103f", "#ab3254", "#cc2157", "#ba0936"],
behavior: behaviors.GAS, behavior: behaviors.GAS,
state: "gas", state: "gas",
@ -20154,8 +20289,8 @@ Pixel size (rendering only): <input id="pixelSize"> (Use if the save looks cut o
stain: 0.04 stain: 0.04
}; };
elements.vivite_gas = { elements.vivite_gas = {
color: ["#ffedfe", "#ffe0fd", "#ffd9f9", "#ffd1f0", "#ffccdf"], color: ["#ffedfe", "#ffe0fd", "#ffd9f9", "#ffd1f0", "#ffccdf"],
colorOn: ["#eec7fc", "#f5b1fc", "#faa2f1", "#fa93c3", "#ff99b1"], colorOn: ["#eec7fc", "#f5b1fc", "#faa2f1", "#fa93c3", "#ff99b1"],
fireColor: ["#ff66ba", "#ff85ef", "#ff99f7"], fireColor: ["#ff66ba", "#ff85ef", "#ff99f7"],
tick: function(pixel) { tick: function(pixel) {
if(Math.random() < 0.032 && exposedToAir(pixel)) { if(Math.random() < 0.032 && exposedToAir(pixel)) {
@ -26102,7 +26237,7 @@ Pixel size (rendering only): <input id="pixelSize"> (Use if the save looks cut o
//Metamorphism will be driven using solely temperature. //Metamorphism will be driven using solely temperature.
//Pressure simulation, due to how the game is coded, will be limited to requiring the rock to be surrounded. //Pressure simulation, due to how the game is coded, will be limited to requiring the rock to be surrounded.
elements.slate = { elements.slate = {
color: ["#787B80", "#535557", "#695E58", "#696969", "#6B5D5B"], color: ["#787B80", "#535557", "#695E58", "#696969", "#6B5D5B"],
tempHigh: 200, tempHigh: 200,
stateHigh: "felsic_magma", stateHigh: "felsic_magma",
category: "solid rock", category: "solid rock",
@ -28593,7 +28728,7 @@ Make sure to save your command in a file if you want to add this preset again.`
elements.bless.reactions.toxin = { elem2: "antidote" }; elements.bless.reactions.toxin = { elem2: "antidote" };
elements.bless.reactions.dead = { elem2: null }; elements.bless.reactions.dead = { elem2: null };
elements.bless.reactions.brain = { elem2: null }; elements.bless.reactions.brain = { elem2: null };
elements.bless.reactions.bioooze = { elem2: null }; elements.bless.reactions.bio_ooze = { elem2: null };
elements.bless.tool = function(pixel) { elements.bless.tool = function(pixel) {
if (elements.bless.ignore.indexOf(pixel.element) !== -1) { return; } if (elements.bless.ignore.indexOf(pixel.element) !== -1) { return; }
if (pixel.burning) { // stop burning if (pixel.burning) { // stop burning
@ -36355,7 +36490,7 @@ Make sure to save your command in a file if you want to add this preset again.`
amalgamatedBombFire += ",resonant_ender".repeat(5); amalgamatedBombFire += ",resonant_ender".repeat(5);
amalgamatedBombFire += ",foof".repeat(8); amalgamatedBombFire += ",foof".repeat(8);
amalgamatedBombFire += ",liquid_irradium".repeat(7); amalgamatedBombFire += ",liquid_irradium".repeat(7);
amalgamatedBombFire += ",bioooze".repeat(8); amalgamatedBombFire += ",bio_ooze".repeat(8);
}); });
//Fairies //Fairies
runAfterLoad(function() { runAfterLoad(function() {
@ -41622,10 +41757,14 @@ Make sure to save your command in a file if you want to add this preset again.`
elements.molten_steel ??= {}; elements.molten_steel ??= {};
elements.molten_steel.tempHigh = 2727; elements.molten_steel.tempHigh = 2727;
elements.molten_steel.stateHigh = ["molten_iron","molten_iron","molten_iron","molten_iron","molten_iron","molten_iron","molten_iron","molten_iron","molten_iron","molten_iron","molten_iron","molten_iron","molten_iron","molten_iron","molten_iron","molten_iron","molten_iron","molten_iron","molten_iron","carbon"]; //it may be FAR LESS than that irl; sus-304 steel has 0.08% elements.molten_steel.stateHigh = ["molten_iron","molten_iron","molten_iron","molten_iron","molten_iron","molten_iron","molten_iron","molten_iron","molten_iron","molten_iron","molten_iron","molten_iron","molten_iron","molten_iron","molten_iron","molten_iron","molten_iron","molten_iron","molten_iron","carbon"]; //it may be FAR LESS than that irl; sus-304 steel has 0.08%
if(elements.carbon) {
elements.carbon.reactions ??= {}; elements.carbon.reactions ??= {};
elements.carbon.reactions.molten_iron = { elements.carbon.reactions.molten_iron = {
elem1: ["carbon","carbon","carbon","carbon","carbon","carbon","carbon","carbon","carbon","carbon","carbon","carbon","carbon","carbon","carbon","carbon","carbon","carbon","carbon",null], elem1: ["carbon","carbon","carbon","carbon","carbon","carbon","carbon","carbon","carbon","carbon","carbon","carbon","carbon","carbon","carbon","carbon","carbon","carbon","carbon",null],
elem2: "molten_steel" elem2: "molten_steel"
}
} else {
logMessage("The mod that adds carbon failed to load in time. This is likely due to a race condition in the way Sandboxels applies mods, and not the fault of said mod's author, and will usually be fixed by reloading")
}; };
elements.support_steel = { elements.support_steel = {
color: elements.steel.color, color: elements.steel.color,
@ -42176,7 +42315,7 @@ Make sure to save your command in a file if you want to add this preset again.`
audioObject[oscillatorNodeName].connect(audioObject[gainNodeName]) audioObject[oscillatorNodeName].connect(audioObject[gainNodeName])
audioObject[oscillatorNodeName].frequency.value = parameterObject.frequency audioObject[oscillatorNodeName].frequency.value = parameterObject.frequency
audioObject[gainNodeName].connect(audioContext.destination) audioObject[gainNodeName].connect(audioContext.destination)
audioObject[oscillatorNodeName].start(audioContext.currentTime + parameterObject.delay) audioObject[oscillatorNodeName].start(audioContext.currentTime + (parameterObject.delay))
//stopping handler //stopping handler
if(parameterObject.endType === "exponential") { //starts fading immediately if(parameterObject.endType === "exponential") { //starts fading immediately
audioObject[gainNodeName].gain.exponentialRampToValueAtTime( audioObject[gainNodeName].gain.exponentialRampToValueAtTime(
@ -42200,16 +42339,71 @@ Make sure to save your command in a file if you want to add this preset again.`
breakInto: ["plastic","metal_scrap","metal_scrap","metal_scrap"], breakInto: ["plastic","metal_scrap","metal_scrap","metal_scrap"],
conduct: 1, conduct: 1,
properties: { properties: {
frequency: 440,
type: "sine", type: "sine",
endType: "none", endType: "none",
length: 1,
volume: 1,
delay: 0,
debounce: 0, debounce: 0,
debounceLength: tps debounceLength: tps
}, },
onSelect: function() {
showPropertySetter();
showSetterColumn("numeric",0);
var p0 = document.getElementById("propertynumeric0input");
var p0h = document.getElementById("propertynumeric0heading");
if(p0) {
p0.setAttribute("set","noteBlockFrequency");
p0.setAttribute("min","1");
p0.value = ambaPlaceProperties.noteBlockFrequency;
};
if(p0h) {
p0h.innerText = "Frequency";
};
showSetterColumn("numeric",1);
var p1 = document.getElementById("propertynumeric1input");
var p1h = document.getElementById("propertynumeric1heading");
if(p1) {
p1.setAttribute("set","noteBlockLength");
p1.setAttribute("min","0");
p1.value = ambaPlaceProperties.noteBlockLength;
};
if(p1h) {
p1h.innerText = "Length";
};
showSetterColumn("numeric",2);
var p2 = document.getElementById("propertynumeric2input");
var p2h = document.getElementById("propertynumeric2heading");
if(p2) {
p2.setAttribute("set","noteBlockVolume");
p2.setAttribute("min","0");
p2.value = ambaPlaceProperties.noteBlockVolume;
};
if(p2h) {
p2h.innerText = "Volume";
};
showSetterColumn("numeric",3);
var p3 = document.getElementById("propertynumeric3input");
var p3h = document.getElementById("propertynumeric3heading");
if(p3) {
p3.setAttribute("set","noteBlockDelay");
p3.setAttribute("min","0");
p3.value = ambaPlaceProperties.noteBlockDelay;
};
if(p3h) {
p3h.innerText = "Delay";
};
},
onUnselect: function() {
hideAllSetterColumns();
hidePropertySetter()
},
tick: function(pixel) { tick: function(pixel) {
pixel.frequency ??= (ambaPlaceProperties?.noteBlockFrequency ?? 440);
pixel.length ??= (ambaPlaceProperties?.noteBlockLength ?? 1);
pixel.volume ??= (ambaPlaceProperties?.noteBlockVolume ?? 1);
pixel.delay ??= (ambaPlaceProperties?.noteBlockDelay ?? 0);
var pixelSoundName = `x${pixel.x}y${pixel.y}`; //Generate unique-enough name var pixelSoundName = `x${pixel.x}y${pixel.y}`; //Generate unique-enough name
var pixelPropertyObject = { //Load sound properties from pixel as object; var pixelPropertyObject = { //Load sound properties from pixel as object;
frequency: pixel.frequency, frequency: pixel.frequency,
@ -44292,6 +44486,11 @@ maxPixels (default 1000): Maximum amount of pixels/changes (if xSpacing and ySpa
} }
}); });
//SPECIFY CURRENT ELEMENT, MOUSE SIZE, AND TPS ON LOAD ## //SPECIFY CURRENT ELEMENT, MOUSE SIZE, AND TPS ON LOAD ##
/*if(urlParams.get("pause") !== null) {
paused = true;
document.getElementById("pauseButton").setAttribute("on","true")
};*/
window.addEventListener("load",function() { window.addEventListener("load",function() {
currentElement = urlParams.get("currentElement") ?? "sand"; currentElement = urlParams.get("currentElement") ?? "sand";
if(!elementExists(currentElement)) { if(!elementExists(currentElement)) {
@ -44316,15 +44515,491 @@ maxPixels (default 1000): Maximum amount of pixels/changes (if xSpacing and ySpa
if(shapeOrder.indexOf(shape) == -1) { if(shapeOrder.indexOf(shape) == -1) {
shape = "square" shape = "square"
}; };
currentShape = shape currentShape = shape;
/*if(urlParams.get("pause") !== null) {
paused = true;
document.getElementById("pauseButton").setAttribute("on","true")
};*/
}); });
//PRESSURE SYSTEM ##
loadSettings();
settings.dopressure ??= false;
settings.drawpressure ??= false;
saveSettings();
pressureCellSize = 4;
function getPressureAtPixelCoords(pixelX,pixelY) {
var pressureCellX = Math.floor(pixelX / pressureCellSize);
var pressureCellY = Math.floor(pixelY / pressureCellSize);
return pressureMap?.[pressureCellX]?.[pressureCellY] ?? null
};
function regeneratePressureMap(_width,_height) {
pressureMap.forEach(function(x) {
x.forEach(y => y = null);
x.length = 0;
x = null
});
pressureMap.length = 0;
pressureMap = null;
pressureMap = new Array(_width);
for(var i = 0; i < pressureMap.length; i++) {
pressureMap[i] = new Array(height).fill(0)
};
};
pressureChangeDivisor = 2;
minimumPressure = -9999999;
elements.sand.pressurePermeability = 0.44;
elements.snow.pressurePermeability = 0.7;
elements.ice.pressureHigh = 800;
elements.gravel.pressurePermeability = 0.53;
elements.rock.pressurePermeability = 0.56,
elements.wall.blockPressure = true;
elements.brick.pressurePermeability = 0.002; //given in L/s*m^2 //at 150Pa //per https://www.astm.org/stp157720130132.html //i don't know how to unit the pressure because it's not scaled to anything in reality
elements.brick.pressureHigh = 90; //arbitrary
elements.wood.pressureHigh = 60; //arbitrary
runAfterLoad(function() {
var gravels = Object.keys(elements).filter(n => n.endsWith("gravel"));
for(var i = 0; i < gravels.length; i++) {
var gravelName = gravels[i];
elements[gravelName].pressureHigh ??= 400;
};
eLists.GRAVEL = gravels;
var shards = Object.keys(elements).filter(n => n.endsWith("shards"));
for(var i = 0; i < shards.length; i++) {
var shardName = shards[i];
var data = elements[shardName];
if(data.breakInto) {
data.pressureHigh ??= 400;
}
};
eLists.SHARD = shards;
var elementsThatBreakIntoScrap = Object.keys(elements).filter(n => elements[n].breakInto?.endsWith?.("scrap"));
for(var i = 0; i < elementsThatBreakIntoScrap.length; i++) {
var etbisName = elementsThatBreakIntoScrap[i];
var data = elements[etbisName]
var _hardness = data.hardness ?? 0.5;
data.pressureHigh ??= (_hardness * 625);
};
var rocks = Object.keys(elements).filter(n => elements[n]._data?.[2]?.endsWith?.("rock"));
for(var i = 0; i < rocks.length; i++) {
var rockName = rocks[i];
elements[rockName].pressureHigh ??= 250;
};
eLists.ROCK = rocks
});
function pressureTick(forceTick=false) {
if(!(settings.dopressure)) {
return
};
if(paused && !(forceTick)) {
return
} else if((!paused) || forceTick) { //shouldn't be necessary
var positions = [];
for(var x = 0; x < pressureMap.length; x++) {
for(var y = 0; y < pressureMap[x].length; y++) {
positions.push([x,y])
};
};
shuffleArray(positions);
for(var i = 0; i < positions.length; i++) {
var [x,y] = positions[i];
// yes i took this from doHeat lol
var v0 = pressureMap[x]?.[y];
if(typeof(v0) !== "undefined") {
var _ac = arrayToShuffled(mooreDonutCoords);
if(isNaN(v0) || (v0 < minimumPressure)) { pressureMap[x][y] = 0; v0 = 0 };
var cellLeftCoord = x * pressureCellSize;
var cellTopCoord = y * pressureCellSize;
var cellRightCoord = ((x + 1) * pressureCellSize) - 1;
var cellBottomCoord = ((y + 1) * pressureCellSize) - 1;
var pixels = getPixelsInRegion(cellLeftCoord,cellTopCoord,cellRightCoord,cellBottomCoord);
var howManyPixelsFitPerCell = (pressureCellSize ** 2);
var thisCellPermeability = 1;
if(pixels.length > 0) {
var pixelWasDeleted = false;
pixels.forEach(function(pixel) {
//var pressure = v0;
var data = elements[pixel.element];
if(!data) { return };
var highResult = data.highPressureTransition ?? data.breakInto
var lowResult = data.lowPressureTransition ?? data.breakInto
if((typeof(data.pressureHigh) == "number") && (typeof(highResult) !== "undefined")) {
//console.log(data.pressureHigh,highResult);
if(v0 >= data.pressureHigh) {
while(Array.isArray(highResult)) {
highResult = randomChoice(highResult)
};
if(highResult === null) {
deletePixel(pixel.x,pixel.y)
return
} else {
changePixel(pixel,highResult)
};
return
}
};
if((typeof(data.pressureLow) == "number") && (typeof(lowResult) !== "undefined")) {
if(v0 <= data.pressureLow) {
while(Array.isArray(lowResult)) {
lowResult = randomChoice(lowResult)
};
if(lowResult === null) {
deletePixel(pixel.x,pixel.y)
return
} else {
changePixel(pixel,lowResult)
};
return
}
}
});
if(pixelWasDeleted) {
pixels = getPixelsInRegion(cellLeftCoord,cellTopCoord,cellRightCoord,cellBottomCoord)
};
var emptySpaces = howManyPixelsFitPerCell - pixels.length;
var preThisCellPermeability = pixels.map(x => getElementPressurePermeability(x.element));
thisCellPermeability = (sumNumericArray(preThisCellPermeability) + emptySpaces) / howManyPixelsFitPerCell;
};
for (var j = 0; j < _ac.length; j++) {
var offsets = _ac[j];
var nx = x+(offsets[0]);
var ny = y+(offsets[1]);
var taxicabDistance = sumNumericArray(offsets.map(Math.abs));
var adjustment = 1/Math.sqrt(taxicabDistance);
var v1 = pressureMap[nx]?.[ny];
if(typeof(v1) === "number") {
if(isNaN(v1) || (v1 < minimumPressure)) { pressureMap[nx][ny] = 0; v1 = 0 };
if(v0 == v1) { continue }
//coords of new cell
var newCellLeftCoord = nx * pressureCellSize;
var newCellTopCoord = ny * pressureCellSize;
var newCellRightCoord = ((nx + 1) * pressureCellSize) - 1;
var newCellBottomCoord = ((ny + 1) * pressureCellSize) - 1;
var pixels = getPixelsInRegion(newCellLeftCoord,newCellTopCoord,newCellRightCoord,newCellBottomCoord);
var permeability = 1;
if(pixels.length > 0) {
var pixelWasDeleted = false;
pixels.forEach(function(pixel) {
//var pressure = v0;
var data = elements[pixel.element];
if(!data) { return };
var highResult = data.highPressureTransition ?? data.breakInto
var lowResult = data.lowPressureTransition ?? data.breakInto
if((typeof(data.pressureHigh) == "number") && (typeof(highResult) !== "undefined")) {
//console.log(data.pressureHigh,highResult);
if(v0 >= data.pressureHigh) {
while(Array.isArray(highResult)) {
highResult = randomChoice(highResult)
};
if(highResult === null) {
deletePixel(pixel.x,pixel.y);
pixelWasDeleted = true
} else {
changePixel(pixel,highResult)
};
return
}
};
if((typeof(data.pressureLow) == "number") && (typeof(lowResult) !== "undefined")) {
if(v0 <= data.pressureLow) {
while(Array.isArray(lowResult)) {
lowResult = randomChoice(lowResult)
};
if(lowResult === null) {
deletePixel(pixel.x,pixel.y);
pixelWasDeleted = true
} else {
changePixel(pixel,lowResult)
};
return
}
}
});
if(pixelWasDeleted) {
pixels = getPixelsInRegion(newCellLeftCoord,newCellTopCoord,newCellRightCoord,newCellBottomCoord)
};
var emptySpaces = howManyPixelsFitPerCell - pixels.length;
var prePermeability = pixels.map(x => getElementPressurePermeability(x.element));
permeability = (sumNumericArray(prePermeability) + emptySpaces) / howManyPixelsFitPerCell;
//console.log(" with pixels",permeability);
}/* else {
console.log("without pixels",permeability)
}*/;
if((thisCellPermeability == 0) || (permeability == 0)) {
continue
} else {
permeability = (thisCellPermeability + permeability) / 2; //average of source and destination permeabilities because it's simpler
var avg = (v0 + v1)/2;
// Set both cell araes to their average, permeability permitting
//console.log(pixelTicks,"c",change);
pressureMap[x][y] = lerp(pressureMap[x][y],avg,permeability);
pressureMap[nx][ny] = lerp(pressureMap[nx][ny],avg,permeability);
//set again the variables to the cell values
v0 = pressureMap[x][y];
v1 = pressureMap[nx][ny];
var change = avg - v1;
var direction = _ac[j];
var intensity = ((Math.sqrt(Math.abs(change)) / pressureChangeDivisor) * adjustment) * Math.sign(change);
//console.log(intensity);
if(Math.abs(intensity) >= 0.01) {
var baseMovement = direction.map(x => x * intensity); //Will be turned into an int when it's added to the pixels' velocities
if(!((baseMovement[0] === 0) && (baseMovement[1] === 0))) {
pixels.forEach(function(pixel) {
var drag = Math.min(4,1000/(elements[pixel.element]?.density ?? 1000)); //no more than 4 times the effect
var trueMovementX = Math.trunc(baseMovement[0] * drag);
var trueMovementY = Math.trunc(baseMovement[1] * drag);
pixel.vx ??= 0;
pixel.vy ??= 0;
pixel.vx += trueMovementX;
pixel.vy += trueMovementY;
})
}
}
}
}
}
}
}
}
};
function getElementPressurePermeability(elementName) {
if(typeof(elementName) == "object" && elementName.element) {
elementName = elementName.element
};
if(!(elementExists(elementName))) {
return 0
};
var elementData = elements[elementName];
if(elementData.blockPressure) {
return 0
} else {
if(elementData.state == "gas") {
return 1
} else {
return elementData.pressurePermeability ?? 0
};
};
};
function changePressure(x,y,value,operationType="+",trueIfPixelCoordinates_FalseIfPressureGridCoordinates=false) {
if(trueIfPixelCoordinates_FalseIfPressureGridCoordinates) {
x = Math.floor(x / pressureCellSize);
y = Math.floor(y / pressureCellSize);
};
if(typeof(pressureMap?.[x]?.[y]) === "number") {
switch(operationType.toLowerCase()) {
default:
case "+":
case "add":
case "addition":
case "plus":
case "increase":
case "increment":
if(typeof(pressureMap?.[x]?.[y]) === "number") {
pressureMap[x][y] += value
};
break;
case "-":
case "subtract":
case "subtraction":
case "minus":
case "take away":
case "takeaway":
case "decrease":
case "decrement":
if(typeof(pressureMap?.[x]?.[y]) === "number") {
pressureMap[x][y] -= value
};
break;
case "*":
case "x":
case "×":
case "multiply":
case "multiplication":
case "times":
case "by":
if(typeof(pressureMap?.[x]?.[y]) === "number") {
pressureMap[x][y] *= value
};
break;
case "/":
case "÷":
case "divide":
case "division":
case "divided by":
if(typeof(pressureMap?.[x]?.[y]) === "number") {
pressureMap[x][y] /= value
};
break;
case "%":
case "mod":
case "modulo":
case "modulus":
case "modulo by":
if(typeof(pressureMap?.[x]?.[y]) === "number") {
pressureMap[x][y] %= value
};
break;
case "=":
case "set":
case "equals":
case "assign":
case "assignment":
if(typeof(pressureMap?.[x]?.[y]) === "number") {
pressureMap[x][y] = value
};
break;
case ">": //lower-bounds the color
case ">=":
case "min":
case "minimum":
if(typeof(pressureMap?.[x]?.[y]) === "number") {
pressureMap[x][y] = Math.max(value,pressureMap[x][y])
};
break;
case "<":
case "<=":
case "max": //upper-bounds the color
case "maximum":
if(typeof(pressureMap?.[x]?.[y]) === "number") {
pressureMap[x][y] = Math.min(value,pressureMap[x][y])
};
break;
case "^":
case "**":
case "exp":
case "exponent":
case "exponentiate":
case "raise":
case "raise to":
case "raised to":
if(typeof(pressureMap?.[x]?.[y]) === "number") {
var sign1 = Math.sign(pressureMap[x][y]);
var sign2 = Math.sign(value);
pressureMap[x][y] = (Math.abs(pressureMap[x][y]) ** Math.abs(value)) * sign1 * sign2;
};
break;
case "√":
case "n√":
case "root":
case "nth root":
if(typeof(pressureMap?.[x]?.[y]) === "number") {
var sign1 = Math.sign(pressureMap[x][y]);
var sign2 = Math.sign(value);
pressureMap[x][y] = (Math.abs(pressureMap[x][y]) ** Math.abs(1 / value)) * sign1 * sign2;
};
};
if(isNaN(pressureMap[x][y])) { pressureMap[x][y] = 0 };
return pressureMap[x][y];
} else {
return false
}
};
function setGlobalPressure(value) {
for(var x = 0; x < pressureMap.length; x++) {
for(var y = 0; y < pressureMap[x].length; y++) {
pressureMap[x][y] = value
}
}
}
function alertIfPressureDisabled() {
if(!(settings.dopressure)) {
logMessage("Pressure simulation is disabled")
}
};
elements.add_pressure = {
color: "#FF0000",
behavior: behaviors.WALL,
category: "special",
tool: function(pixel) {
changePressure(pixel.x,pixel.y,3 ** (shiftDown + 1),"+",true);
}
};
elements.subtract_pressure = {
color: "#0000FF",
behavior: behaviors.WALL,
category: "special",
tool: function(pixel) {
changePressure(pixel.x,pixel.y,3 ** (shiftDown + 1),"-",true);
}
};
elements.zero_pressure = {
color: "#000000",
behavior: behaviors.WALL,
category: "special",
tool: function(pixel) {
changePressure(pixel.x,pixel.y,0,"=",true);
}
};
elements.reset_pressure = {
color: "#000000",
maxSize: 1,
behavior: behaviors.WALL,
category: "special",
tool: function(pixel) {
setGlobalPressure(0)
}
};
function pressureTicker(forceTick=false) {
if(settings.dopressure && ((!paused) || forceTick)) {
pressureTick(forceTick)
}
};
oldDoFrame = doFrame;
doFrame = function() {
oldDoFrame();
pressureTicker(true)
};
runAfterButtons(function() {
//WIDTH AND HEIGHT AREN'T DEFINED UNTIL THEN FOR SOME FUCKING REASON
oldClearAll = clearAll;
clearAll = function() {
oldClearAll();
regeneratePressureMap(Math.ceil(width / pressureCellSize),Math.ceil(height / pressureCellSize)) // use the global width and height
};
pressureMap = new Array(Math.ceil(width / pressureCellSize));
for(var i = 0; i < pressureMap.length; i++) {
pressureMap[i] = new Array(Math.ceil(height / pressureCellSize)).fill(0)
};
afterEveryTick(pressureTicker)
})
//FIX ## //FIX ##
//fsr it's pausing silently on load now so this should fix that by silently unpausing it on load //fsr it's pausing silently on load now so this should fix that by silently unpausing it on load
window.addEventListener("load",function() { window.addEventListener("load",function() {
if(urlParams.get("paused") !== null) {
paused = true;
document.getElementById("pauseButton").setAttribute("on","true");
} else {
paused = false; paused = false;
document.getElementById("pauseButton").setAttribute("on","false");
}
crimsonObject.dirt = "crimsoil"; //something is changing it to sand crimsonObject.dirt = "crimsoil"; //something is changing it to sand
}); });
//
//MISCELLANEOUS CHANGES ## //MISCELLANEOUS CHANGES ##
eLists.PIPE = ['pipe', 'destroyable_pipe', 'e_pipe', 'destroyable_e_pipe', 'channel_pipe', 'destroyable_channel_pipe', 'bridge_pipe']; eLists.PIPE = ['pipe', 'destroyable_pipe', 'e_pipe', 'destroyable_e_pipe', 'channel_pipe', 'destroyable_channel_pipe', 'bridge_pipe'];
elements.pipe_stage_shifter = { elements.pipe_stage_shifter = {
@ -44442,7 +45117,7 @@ maxPixels (default 1000): Maximum amount of pixels/changes (if xSpacing and ySpa
//aChefsDream fix: (re-)define juice reactions //aChefsDream fix: (re-)define juice reactions
elements.juice.reactions ??= {}; elements.juice.reactions ??= {};
gigadebugMode = false; gigadebugMode = false; //fights every-tick log spam by limiting each message to being logged 50 times
if(gigadebugMode) { if(gigadebugMode) {
logLimit = 50; logLimit = 50;
logLimitCache = {}; logLimitCache = {};
@ -44455,6 +45130,7 @@ maxPixels (default 1000): Maximum amount of pixels/changes (if xSpacing and ySpa
logLimitCache[argsKey]++ logLimitCache[argsKey]++
} }
} }
//END ## //END ##
} catch (error) { } catch (error) {
alert(`Load failed (try reloading).\nThis is likely a sporadic failure caused by inconsistencies in how mods are loaded, and will likely fix itself in a refresh or two. If it persists, then it's an issue.\nError: ${error.stack}`); alert(`Load failed (try reloading).\nThis is likely a sporadic failure caused by inconsistencies in how mods are loaded, and will likely fix itself in a refresh or two. If it persists, then it's an issue.\nError: ${error.stack}`);