diff --git a/mods/a_mod_by_alice.js b/mods/a_mod_by_alice.js index f5224482..435d9ef4 100644 --- a/mods/a_mod_by_alice.js +++ b/mods/a_mod_by_alice.js @@ -1348,15 +1348,15 @@ try { return (isEmpty(pixel.x+1,pixel.y) || isEmpty(pixel.x-1,pixel.y) || isEmpty(pixel.x,pixel.y+1) || isEmpty(pixel.x,pixel.y-1)); }; - function tryTarnish(pixel,element,chance) { + function tryTarnish(pixel,element,chance,changeTemp=true) { if(exposedToAir(pixel)) { if(Array.isArray(element)) { if(Math.random() < chance) { - changePixel(pixel,randomChoice(element)); + changePixel(pixel,randomChoice(element),changeTemp); }; } else { if(Math.random() < chance) { - changePixel(pixel,element); + changePixel(pixel,element,changeTemp); }; }; }; @@ -2803,7 +2803,7 @@ color1 and color2 spread through striped paint like dye does with itself. col } else { rgbs.push(c); rgbos.push(convertColorFormats(c,"json")); - console.log(key,rgbs,rgbos) + //console.log(key,rgbs,rgbos) } } elements[key].color = rgbs; @@ -5536,7 +5536,7 @@ color1 and color2 spread through striped paint like dye does with itself. col }); //CONFIGURABLE MAXIMUM COLOR OFFSET (maxColorOffset) ## defaultColorOffset = 15; - pixelColorPick = function(pixel,customColor=null,maxOffset=null,dontForceColorsToNulls=false) { + pixelColorPick = function(pixel,customColor=null,maxOffset=null) { var element = pixel.element; var elementInfo = elements[element]; //if (elementInfo.behavior instanceof Array) { @@ -5544,9 +5544,10 @@ color1 and color2 spread through striped paint like dye does with itself. col customColor = elementInfo.colorOn; } if (customColor !== null) { - if (Array.isArray(customColor)) { + while (Array.isArray(customColor)) { customColor = customColor[Math.floor(Math.random() * customColor.length)]; - } else if (customColor.startsWith?.("#")) { + }; + if (customColor.startsWith?.("#")) { customColor = hexToRGB(customColor); } var rgb = customColor; @@ -5559,46 +5560,22 @@ color1 and color2 spread through striped paint like dye does with itself. col } } // Randomly darken or lighten the RGB color - //try maxOffset parameter, then info maxColorOffset, then default 15 - var offsetAmount; - if(maxOffset !== null) { - offsetAmount = maxOffset; - } else { - offsetAmount = elementInfo?.maxColorOffset ?? defaultColorOffset; - }; - if(typeof(rgb) !== "object") { rgb = convertColorFormats(rgb,"json") }; //somehow rgb can be a hex triplet even though it's pulled from the f*cking JSON color object and there's no logical way that that should be able to happen - var maxColorOffset = Math.floor(Math.random() * (Math.random() > 0.5 ? -1 : 1) * Math.random() * offsetAmount); - var maxRepickTries = 10; - var repickTries = 0; - var rgbWasNull = (rgb === null); - if(rgb == null || (typeof(rgb?.r) !== "number") || (typeof(rgb?.g) !== "number") || (typeof(rgb?.b) !== "number")) { - //console.log(pixel.element,pixel.color,"\n",rgb,customColor,Array.isArray(elementInfo.colorObject) ? elementInfo.colorObject.indexOf(rgb) : elementInfo.colorObject); - //this SHOULDN'T be necessary but SOMEHOW IT IS - while(rgb == null && repickTries < maxRepickTries) { - var color_also_fxck_you = elementInfo.colorObject; - while(Array.isArray(color_also_fxck_you)) { color_also_fxck_you = randomChoice(color_also_fxck_you) }; - rgb = color_also_fxck_you - }; - //console.log(pixel.element,pixel.color,rgb,customColor); - }; - var r = rgb.r + maxColorOffset; - var g = rgb.g + maxColorOffset; - var b = rgb.b + maxColorOffset; + //try vanilla grain paremeter, then info.maxColorOffset, then default 15 + let grain = maxOffset ?? settings.defaultColorOffset ?? 15; + if (elementInfo.grain !== undefined) { + grain = grain * elementInfo.grain + } else if(elementInfo.maxOffset) { + grain = elementInfo.maxOffset + } + let coloroffset = Math.floor(Math.random() * (Math.random() > 0.5 ? -1 : 1) * Math.random() * grain); + let r = rgb.r + coloroffset; + let g = rgb.g + coloroffset; + let b = rgb.b + coloroffset; // Make sure the color is within the RGB range r = Math.max(0, Math.min(255, r)); g = Math.max(0, Math.min(255, g)); b = Math.max(0, Math.min(255, b)); - var color = "rgb("+r+","+g+","+b+")"; - /*} - else { - var color = elementInfo.color; - if (Array.isArray(color)) { - color = color[Math.floor(Math.random() * color.length)]; - } - }*/ - if((!dontForceColorsToNulls) && rgbWasNull && rgb !== null) { - pixel.color = convertColorFormats(rgb,"rgb") - }; + let color = "rgb("+r+","+g+","+b+")"; return color; } //FIND MODE AND PIXEL PROPERTIES LINKED TO SPECIAL CODE (acid_and_shapes.js functionality removed) ## @@ -18359,9 +18336,18 @@ Pixel size (rendering only): (Use if the save looks cut o conduct: 0.19, hardness: 0.5, }, - elements.molten_zirconium = { + newPowder("zirconia",["#F0ECDB","#FBF8EC"],5680,2715) + elements.solid_zirconia = newPowder("zirconia",["#F0ECDB","#FBF8EC"],5680,2715,null,"zirconia",0.85,true) + elements.molten_zirconia = { + tempHigh: 4300, + viscosity: 13, + density: 4700, //https://pmc.ncbi.nlm.nih.gov/articles/PMC6658727/#:~:text=The%20density%20of%20liquid%20ZrO2%20was%20found%20to%20be,mPa%20at%20its%20melting%20point. it's surprising that someone could be arsed to measure it, even more so with the whole extremely high temperature thing + stateLow: "solid_zirconia" + }; + elements.molten_zircon = { density: 5803, - tempHigh: 4409, + tempHigh: 2800, + stateHigh: ["molten_zirconia","silica_gas"], behavior: behaviors.MOLTEN, onTryMoveInto: function(pixel,otherPixel) { neutronAbsorbency(pixel,otherPixel); @@ -18369,6 +18355,7 @@ Pixel size (rendering only): (Use if the save looks cut o tick: function(pixel) { neutronMovement(pixel,zirconoids); }, + }; elements.zirconium_gas = { density: 3, //Unknown/Unmeasured value @@ -18383,19 +18370,6 @@ Pixel size (rendering only): (Use if the save looks cut o elements.neutron.state = "gas"; elements.neutron.ignoreAir = "true"; neighbors = [[-1,0],[0,-1],[1,0],[0,1]] - function tryTarnish(pixel,element,chance) { - if(exposedToAir(pixel)) { - if(Array.isArray(element)) { - if(Math.random() < chance) { - changePixel(pixel,randomChoice(element)) - } - } else { - if(Math.random() < chance) { - changePixel(pixel,element) - } - } - } - } //Non-element: Liquid ammonia elements.liquid_ammonia = { color: "#bab6a9", @@ -21745,13 +21719,13 @@ Pixel size (rendering only): (Use if the save looks cut o return array1.concat(array2) }; //Powder maker - function newPowder(name,color,density=null,tempHigh=null,stateHigh=null,breakInto=null) { //boilerplate my dick + function newPowder(name,color,density=null,tempHigh=null,stateHigh=null,breakInto=null,hardness=null,itsActuallySolidNotPowderLol=false) { //boilerplate my dick if(tempHigh == null) { stateHigh = null; }; elements[name] = { + behavior: itsActuallySolidNotPowderLol ? behaviors.WALL : behaviors.POWDER, color: color, - behavior: behaviors.POWDER, category: "solids", state: "solid", density: density ?? 1000, @@ -21759,6 +21733,9 @@ Pixel size (rendering only): (Use if the save looks cut o if(tempHigh !== null) { elements[name].tempHigh = tempHigh; }; + if(hardness !== null) { + elements[name].hardness = hardness; + }; if(tempHigh !== null && stateHigh !== null) { elements[name].stateHigh = stateHigh; }; @@ -23547,21 +23524,103 @@ Pixel size (rendering only): (Use if the save looks cut o }; }; }; - newPowder("silica","#faf9f0",2196,1713).hardness = 0.7; + let _s = newPowder("silicon",["#D7DDDF","#999FA1","#7A7E80","#535657"],2330,1414); _s.hardness = 0.7; _s.tick = function(pixel) { + if(pixel.temp >= 700) { + tryTarnish(pixel,"silica",0.02,false); + } + }; + elements.molten_silicon = { + tempHigh: 3265, + density: 2520, + viscosity: 1, + behavior: behaviors.MOLTEN, + tick: function(pixel) { + tryTarnish(pixel,"silica",0.02,false); + pixelTempCheck(pixel); + }, + reactions: { + oxygen: { elem1: ["molten_silicon","silica"], elem2: null, minTemp: 700 }, + liquid_oxygen: { elem1: ["molten_silicon","silica"], elem2: ["liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen",null], minTemp: 700 }, //real ratio is 862:1 + oxygen_ice: { elem1: ["molten_silicon","silica"], elem2: ["liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen","liquid_oxygen",null], minTemp: 700 } + } + }, + newPowder("silica","#faf9f0",2202,1713).hardness = 0.7; + elements.glass.alpha = 0.6; + elements.fused_silica = { + color: "#F8F5ED", + alpha: 0.5, + renderer: renderPresets.BORDER, + behavior: behaviors.WALL, + reactions: { + "radiation": { elem1:"rad_glass", chance:0.33 }, + "rad_steam": { elem1:"rad_glass", elem2:null, chance:0.33 }, + "fallout": { elem1:"rad_glass", elem2:"radiation", chance:0.1 } + }, + tempHigh: 1713, + stateHigh: "molten_silica", + hardness: 0.72, + category: "solids", + state: "solid", + density: 2202, + breakInto: "silica", + noMix: true, + grain: 0 + }; elements.silica.reactions = { - intermediate_felsic_magma: { elem1: "felsic_magma", elem2: "felsic_magma", chance: 0.9 }, - intermediate_magma: { elem1: "intermediate_felsic_magma", elem2: "intermediate_felsic_magma", chance: 0.9 }, - magma: { elem1: "intermediate_magma", elem2: "intermediate_felsic_magma", chance: 0.9 }, - ultramafic_magma: { elem1: "magma", elem2: "magma", chance: 0.9 }, + ultramafic_magma: { elem1:[ + "silica","silica","silica","silica","silica", + "silica","silica","silica","silica","silica", + "silica","silica","silica","silica","silica", + "silica","silica","silica","silica",null //the range of silica content from ultramafic to felsic is about 20%; this regarded as 4 even steps on top of ultramafic magma for simplicity's sake gives 5% or 1/20 + ], elem2: "magma", "chance":0.1 }, + magma: { elem1:[ + "silica","silica","silica","silica","silica", + "silica","silica","silica","silica","silica", + "silica","silica","silica","silica","silica", + "silica","silica","silica","silica",null + ], elem2: "intermediate_magma", "chance":0.09 }, + intermediate_magma: { elem1:[ + "silica","silica","silica","silica","silica", + "silica","silica","silica","silica","silica", + "silica","silica","silica","silica","silica", + "silica","silica","silica","silica",null + ], elem2: "intermediate_felsic_magma", "chance":0.08 }, + intermediate_felsic_magma: { elem1:[ + "silica","silica","silica","silica","silica", + "silica","silica","silica","silica","silica", + "silica","silica","silica","silica","silica", + "silica","silica","silica","silica",null + ], elem2: "felsic_magma", "chance":0.07 }, }; elements.molten_silica = { tempHigh: 2950, - viscosity: 1e14, //idk lol + viscosity: 2000000000, //2e7 centiPoise + stateLow: "fused_silica", reactions: { - intermediate_felsic_magma: { elem1: "felsic_magma", elem2: "felsic_magma", chance: 0.9 }, - intermediate_magma: { elem1: "intermediate_felsic_magma", elem2: "intermediate_felsic_magma", chance: 0.9 }, - magma: { elem1: "intermediate_magma", elem2: "intermediate_felsic_magma", chance: 0.9 }, - ultramafic_magma: { elem1: "magma", elem2: "magma", chance: 0.9 }, + ultramafic_magma: { elem1:[ + "molten_silica","molten_silica","molten_silica","molten_silica","molten_silica", + "molten_silica","molten_silica","molten_silica","molten_silica","molten_silica", + "molten_silica","molten_silica","molten_silica","molten_silica","molten_silica", + "molten_silica","molten_silica","molten_silica","molten_silica",null //the range of silica content from ultramafic to felsic is about 20%; this regarded as 4 even steps on top of ultramafic magma for simplicity's sake gives 5% or 1/20 + ], elem2: "magma", "chance":0.1 }, + magma: { elem1:[ + "molten_silica","molten_silica","molten_silica","molten_silica","molten_silica", + "molten_silica","molten_silica","molten_silica","molten_silica","molten_silica", + "molten_silica","molten_silica","molten_silica","molten_silica","molten_silica", + "molten_silica","molten_silica","molten_silica","molten_silica",null + ], elem2: "intermediate_magma", "chance":0.09 }, + intermediate_magma: { elem1:[ + "molten_silica","molten_silica","molten_silica","molten_silica","molten_silica", + "molten_silica","molten_silica","molten_silica","molten_silica","molten_silica", + "molten_silica","molten_silica","molten_silica","molten_silica","molten_silica", + "molten_silica","molten_silica","molten_silica","molten_silica",null + ], elem2: "intermediate_felsic_magma", "chance":0.08 }, + intermediate_felsic_magma: { elem1:[ + "molten_silica","molten_silica","molten_silica","molten_silica","molten_silica", + "molten_silica","molten_silica","molten_silica","molten_silica","molten_silica", + "molten_silica","molten_silica","molten_silica","molten_silica","molten_silica", + "molten_silica","molten_silica","molten_silica","molten_silica",null + ], elem2: "felsic_magma", "chance":0.07 } }, }; elements.felsic_magma.reactions ??= {}; @@ -25932,7 +25991,7 @@ Pixel size (rendering only): (Use if the save looks cut o behavior: behaviors.POWDER, category: "powders", state: "solid", - density: 3980, + density: 4010, hardness: 0.9, }; elements.molten_ruby ??= {}; elements.molten_ruby.tick = function(pixel) { @@ -25986,6 +26045,48 @@ Pixel size (rendering only): (Use if the save looks cut o density: 2650, hardness: 0.7, }; + //Zircon + blueZirconColors = ["#017cbc","#146ea0","#17b6c9","#3bbfd3"]; + goldenZirconColors = ["#e99209","#fcb111","#d88208","#b97605"]; + //heatTreated 0 = untreated, 1 = inertly (blue), 2 = with oxygen (golden) + elements.zircon = { + //Corundum with different impurities, so I can copy/paste everything but the color + color: ["#37130b","#a9301a","#3c1810"], + properties: { + heatTreated: 0 + }, + tick: function(pixel) { + pixel.heatTreated ??= 0; + if(pixel.temp > 900) { + if(pixel.heatTreated == 0) { + if(exposedToAir(pixel)) { + pixel.color = pixelColorPick(pixel,goldenZirconColors) + pixel.heatTreated = 2; + } else { + pixel.color = pixelColorPick(pixel,blueZirconColors) + pixel.heatTreated = 1; + } + } else if((pixel.heatTreated == 1) && (exposedToAir(pixel))) { + pixel.color = pixelColorPick(pixel,goldenZirconColors) + pixel.heatTreated = 2; + } + } + }, + onUnpaint: function(pixel) { + if(pixel.heatTreated == 1) { + pixel.color = pixelColorPick(pixel,blueZirconColors) + } else if(pixel.heatTreated = 2) { + pixel.color = pixelColorPick(pixel,goldenZirconColors) + } + }, + tempHigh: 2100, + behavior: behaviors.POWDER, + category: "powders", + state: "solid", + density: 4010, + hardness: 0.9, + }; + //Opal elements.opal = { color: ["#ffcfcf", "#fff0d9", "#fcf7c5", "#e4ffd4", "#d1fff5", "#dcecfa", "#dfdbff", "#f5e0ff", "#f7d0f1"], @@ -40092,6 +40193,21 @@ Make sure to save your command in a file if you want to add this preset again.` }; }; }; + elements.unpaint.tool = function(pixel) { + var r = elements.unpaint.reactions[pixel.element]; + if (r && r.elem2) { + changePixel(pixel,r.elem2) + } + if (!elements[pixel.element].customColor) { + pixel.color = pixelColorPick(pixel) + } + if (elements[pixel.element].alpha) { + pixel.alpha = elements[pixel.element].alpha + } + if(pixel.onUnpaint) { + pixel.onUnpaint(pixel) + } + }; elements.unpaint.tick = function(pixel) { var pX = pixel.x; var pY = pixel.y;