diff --git a/mods/anmm.js b/mods/anmm.js index dd5512b3..c506cb5c 100644 --- a/mods/anmm.js +++ b/mods/anmm.js @@ -1,4 +1,3 @@ -//alice's new mini mod urlParams = new URLSearchParams(window.location.search); function elementExists(elementName) { @@ -58,15 +57,17 @@ window.addEventListener("load",function() { };*/ }); -function getEmptyVonNeumannNeighbors(pixel) { +function getEmptyVonNeumannNeighbors(pixel,returnOffsets=false) { var neighbors = []; var x = pixel.x; var y = pixel.y; for(var i = 0; i < adjacentCoords.length; i++) { - var finalX = pixel.x + adjacentCoords[i][0]; - var finalY = pixel.y + adjacentCoords[i][1]; + var offsetX = adjacentCoords[i][0]; + var offsetY = adjacentCoords[i][1]; + var finalX = pixel.x + offsetX; + var finalY = pixel.y + offsetY; if(isEmpty(finalX,finalY,false)) { - neighbors.push([finalX,finalY]) + neighbors.push(returnOffsets ? [offsetX,offsetY] : [finalX,finalY]) }; }; return neighbors @@ -93,15 +94,17 @@ function getPixelMooreNeighbors(pixel) { return neighbors }; -function getEmptyMooreNeighbors(pixel) { +function getEmptyMooreNeighbors(pixel,returnOffsets=false) { var neighbors = []; var x = pixel.x; var y = pixel.y; for(var i = 0; i < mooreDonutCoords.length; i++) { - var finalX = pixel.x + mooreDonutCoords[i][0]; - var finalY = pixel.y + mooreDonutCoords[i][1]; + var offsetX = mooreDonutCoords[i][0]; + var offsetY = mooreDonutCoords[i][1]; + var finalX = pixel.x + offsetX; + var finalY = pixel.y + offsetY; if(isEmpty(finalX,finalY,false)) { - neighbors.push([finalX,finalY]) + neighbors.push(returnOffsets ? [offsetX,offsetY] : [finalX,finalY]) }; }; return neighbors @@ -187,17 +190,17 @@ var argonChance; if(hasArgon == true) { argonChance = ((1.204 * 0.0093) / elemen var condensationMultiplierScaling = Math.abs(-273.15 - (-190)); -function glaciliteBase(pixel,coolingAmount,minimumTemperature,cmsScaling=1.5) { - if(pixel.temp > minimumTemperature) { - if(pixel.temp - coolingAmount <= minimumTemperature) { - pixel.temp = minimumTemperature +function glaciliteBase(pixel,coolingAmount,maximumTemperature,cmsScaling=1.5) { + if(pixel.temp > maximumTemperature) { + if(pixel.temp - coolingAmount <= maximumTemperature) { + pixel.temp = maximumTemperature } else { pixel.temp = pixel.temp - coolingAmount; } }; var condensationMultiplier = 1; - if(pixel.temp < -190) { //NOT scaled to minimum temperature OR absolute zero + if(pixel.temp < -190) { //NOT scaled to maximum temperature OR absolute zero var distanceFromNegative190 = Math.abs((-190) - pixel.temp); condensationMultiplier = Math.max(6,1 + (distanceFromNegative190 / (condensationMultiplierScaling / cmsScaling))); } @@ -243,7 +246,7 @@ elements.glacilite = { breakInto: "glacilite_shard", color: ["#17BBF6","#70A4FE","#6ADCEE","#8EA9FF"], tempHigh: 1200, - stateHigh: "molten_glacilite", + stateHigh: "liquified_glacilite", tick: function(pixel) { glaciliteBase(pixel,5,-190) } @@ -259,13 +262,13 @@ elements.glacilite_shard = { temp: -190, color: ["#17BBF6","#70A4FE","#6ADCEE","#8EA9FF"], tempHigh: 1200, - stateHigh: "liquid_glacilite", + stateHigh: "liquified_glacilite", tick: function(pixel) { glaciliteBase(pixel,5,-190) } } -elements.liquid_glacilite = { +elements.liquified_glacilite = { behavior: behaviors.LIQUID, state: "liquid", category: "liquids", @@ -275,21 +278,21 @@ elements.liquid_glacilite = { hardness: 0.99, color: ["#01BFE1","#2404C3","#0763DB","#04308F","#3AF0F3"], tempHigh: 1200, - stateHigh: "molten_glacilite", + stateHigh: "liquified_glacilite", tick: function(pixel) { - var minimumTemperature = (settings.abszero ?? -273.15); + var maximumTemperature = (settings.abszero ?? -273.15); var coolingAmount = 14; var cmsScaling = 3.5; - if(pixel.temp > minimumTemperature) { - if(pixel.temp - coolingAmount <= minimumTemperature) { - pixel.temp = minimumTemperature + if(pixel.temp > maximumTemperature) { + if(pixel.temp - coolingAmount <= maximumTemperature) { + pixel.temp = maximumTemperature } else { pixel.temp = pixel.temp - coolingAmount; } }; var condensationMultiplier = 1; - if(pixel.temp < -150) { //NOT scaled to minimum temperature OR absolute zero + if(pixel.temp < -150) { //NOT scaled to maximum temperature OR absolute zero var distanceFromNegative190 = Math.abs((-190) - pixel.temp); condensationMultiplier = Math.max(6,1 + (distanceFromNegative190 / (condensationMultiplierScaling / cmsScaling))); }; @@ -344,6 +347,159 @@ elements.liquid_glacilite = { } } +function igniscidBase(pixel,heatingAmount,minimumTemperature,nerfExponent) { + if(pixel.temp < minimumTemperature) { + if(pixel.temp + heatingAmount >= minimumTemperature) { + pixel.temp = minimumTemperature + } else { + pixel.temp = pixel.temp + heatingAmount; + } + }; + + var nerfFactor = 1; + if(pixel.temp > minimumTemperature) { nerfFactor = 1 / (Math.log10((pixel.temp - (minimumTemperature - 1))) + 1) ** nerfExponent }; + if(Math.random() < (0.04 * nerfFactor)) { pixel.temp += heatingAmount }; + + var emptyNeighbors = getEmptyVonNeumannNeighbors(pixel,true); + var element = "fire"; + var temp = pixel.temp; + if(pixel.temp >= 7000) { + element = "plasma"; + temp = Math.max(temp,5000); + } else if(pixel.temp < 100) { + element = "smoke"; + pixel.temp += 1.5; + }; + for(var i = 0; i < emptyNeighbors.length; i++) { + var coords = emptyNeighbors[i]; + var distance = coords.map(x => Math.abs(x)).reduce((a,b) => a + b); + coords = [coords[0]+pixel.x,coords[1]+pixel.y]; + var chance = 1/distance; + var newPixel = createPixelReturn(element,...coords); + if(newPixel && (newPixel.temp < pixel.temp)) { + newPixel.temp = temp + } + } +} + +elements.igniscid = { + behavior: behaviors.WALL, + state: "solid", + category: "solids", + density: 3300, + hardness: 0.44, + temp: 1200, + breakInto: "igniscid_shard", + color: ["#f68317","#f6b317","#eeea6a","#ffa38e"], + tempHigh: 11000, + stateHigh: "liquified_igniscid", + tick: function(pixel) { + igniscidBase(pixel,4,1200,1.2) + } +} + +elements.igniscid_shard = { + behavior: behaviors.POWDER, + state: "solid", + category: "powders", + hidden: true, + density: 3100, + hardness: 0.89, + temp: 1200, + color: ["#f68317","#f6b317","#eeea6a","#ffa38e"], + tempHigh: 11000, + stateHigh: "liquified_igniscid", + tick: function(pixel) { + igniscidBase(pixel,4,1200,1.2) + } +} + +elements.liquified_igniscid = { + behavior: behaviors.LIQUID, + state: "liquid", + category: "liquids", + hidden: true, + density: 2790, + temp: 12000, + hardness: 0.99, + color: ["#f77b0f","#e0410b","#db4a07","#f5ac7f","#f3593a"], + tick: function(pixel) { + igniscidBase(pixel,12,100000,0.5) + } +} + +elements.frozen_fertilizer = { + color: ["#4d341d","#40301c","#3d2814"], + behavior: [ + "CR:stench,stench,methane%0.25|CR:stench,stench,methane%0.5|CR:stench,stench,methane%0.25", + "CR:stench,stench,methane%0.5|XX|CR:stench,stench,methane%0.5", + "CR:stench,stench,methane%0.25|CR:stench,stench,methane%0.5|CR:stench,stench,methane%0.25" + ], + behavior: behaviors.WALL, + tempHigh: 0, + stateHigh: "fertilizer", + category: "solids", + hardness: 0.35, + breakInto: "fertilizer", + state: "solid", + density: 1060, + stain: 0.01, + hidden: true, +}, + +elements.fertilizer = { + color: ["#451f0a","#542b07","#593317"], + behavior: [ + "CR:stench,stench,methane%0.25|CR:stench,stench,methane%0.5|CR:stench,stench,methane%0.25", + "M2 AND CR:stench,stench,methane%0.5|XX|M2 AND CR:stench,stench,methane%0.5", + "M1|M1|M1" + ], + viscosity: 8000, + tempHigh: 40, + stateHigh: ["poison","stench","methane","dried_fertilizer","dried_fertilizer","dried_fertilizer","dried_fertilizer","dried_fertilizer","dried_fertilizer","dried_fertilizer","dried_fertilizer"], + tempLow: 0, + stateLow: "frozen_fertilizer", + category: "solids", + state: "liquid", + density: 1060, + stain: 0.07 +}, + +elements.dried_fertilizer = { + color: ["#4f382b","#66462b","#704a2b"], + behavior: [ + "CR:stench,stench,methane%0.15|CR:stench,stench,methane%0.3|CR:stench,stench,methane%0.15", + "CR:stench,stench,methane%0.3|XX|CR:stench,stench,methane%0.3", + "M2|M1|M2" + ], + tempHigh: 100, + stateHigh: ["steam","steam","steam","steam","steam","steam","steam","steam","steam","steam","steam","steam","steam","steam","steam","steam","steam","steam","stench","poison","stench","poison","methane","methane","cooked_fertilizer","cooked_fertilizer","cooked_fertilizer","cooked_fertilizer","cooked_fertilizer","cooked_fertilizer","cooked_fertilizer","cooked_fertilizer","cooked_fertilizer","cooked_fertilizer","cooked_fertilizer","cooked_fertilizer",], + category: "solids", + state: "solid", + density: 1100, + stain: 0.045, + hidden: true +}, + +elements.cooked_fertilizer = { + color: ["#473931","#594636","#4f3621"], + behavior: [ + "CR:stench,stench,methane%0.1|CR:stench,stench,methane%0.2|CR:stench,stench,methane%0.1", + "CR:stench,stench,methane%0.2|XX|CR:stench,stench,methane%0.2", + "M2|M1|M2" + ], + tempHigh: 550, + stateHigh: ["charcoal","hydrogen","oxygen","nitrogen","sulfur_gas","metal_scrap","calcium","stench","poison_gas","steam","dust"], + category: "solids", + state: "solid", + density: 1240, + burn: 3, + burnTime: 260, + fireElement: ["stench","smoke","carbon_dioxide","poison_gas","fire","fire","fire","fire"], + burnInto: ["charcoal","hydrogen","oxygen","nitrogen","molten_sulfur","metal_scrap","calcium","stench","poison_gas","steam","dust","stench","poison_gas","smoke"], + hidden: true +}, + elements.fartium = { behavior: behaviors.LIQUID, state: "liquid", @@ -356,7 +512,7 @@ elements.fartium = { stateHigh: ["fire","explosion","fire","stench","stench"], burn: 0.8, burnTime: 150, - burnInto: ["stench","stench","stench","stench","fire","fire","fire","fire","molten_sulfur","explosion"], + burnInto: ["stench","stench","stench","stench","fire","fire","fire","fire","liquified_sulfur","explosion"], tick: function(pixel) { var chanceModifier = Math.min(0.22,(pixel.temp - 20) / 750); if(chanceModifier < 0) { chanceModifier *= 2 }; @@ -407,4 +563,3 @@ elements.fartium = { } } } -