/* TODO: Soils More sedimentary rocks Metamorphic rocks Ersatz pressure Merge crimson? Proper classification of limestone within these code comments */ var modName = "mods/the_ground.js"; var libraryMod = "mods/code_library.js"; if(!enabledMods.includes(libraryMod)) { enabledMods.splice(enabledMods.indexOf(modName),0,libraryMod); localStorage.setItem("enabledMods", JSON.stringify(enabledMods)); alert(`The ${libraryMod} mod is required and has been automatically inserted (reload for this to take effect).`); } else { //Variables //var vitreousInterfelsicName = "obsidian"; var vitreousInterfelsicName = "dacidian"; var vitreousIntermediateName = "andesidian"; var vitreousMaficName = "basalidian"; var vitreousUltramaficName = "komatidian"; var sandSimplification = ["gravel","granite_gravel","granodiorite_gravel","diorite_gravel","basalt_gravel","peridotite_gravel","rhyolite_gravel","dacite_gravel","andesite_gravel","komatiite_gravel","pumice_gravel","intermediate_pumice_gravel","scoria_gravel","mafic_scoria_gravel","ultramafic_scoria_gravel", "dacidian_shard", "andesidian_shard", "basalidian_shard", "komatidian_shard"]; var rocks = [ "granite", "granodiorite", "diorite", "rock", "peridotite", "rhyolite", "dacite", "andesite", "basalt", "komatiite", "pumice", "intermediate_pumice", "scoria", "mafic_scoria", "ultramafic_scoria", "obsidian", "dacidian", "andesidian", "basalidian", "komatidian"]; var gravels = [ "granite_gravel", "granodiorite_gravel", "diorite_gravel", "gravel", "peridotite_gravel", "rhyolite_gravel", "dacite_gravel", "andesite_gravel", "basalt_gravel", "komatiite_gravel", "pumice_gravel", "intermediate_pumice_gravel", "scoria_gravel", "mafic_scoria_gravel", "ultramafic_scoria_gravel", "obsidian_shard", "dacidian_shard", "andesidian_shard", "basalidian_shard", "komatidian_shard" ]; //Functions //Star world matter function var stellarPlasmaSpreadWhitelist = ["stellar_plasma","liquid_stellar_plasma","liquid_degenerate_neutronium","gaseous_degenerate_neutronium","neutron_star"]; function starColor(pixel) { if (pixel.temp < 0) { pixel.color = pixelColorPick(pixel,"#615e5e"); var c=0 } else if (pixel.temp < 200) { pixel.color = pixelColorPick(pixel,"#6e4c4b"); var c=0 } else if (pixel.temp < 400) { pixel.color = pixelColorPick(pixel,"#944340"); var c=0.00003 } else if (pixel.temp < 650) { pixel.color = pixelColorPick(pixel,"#d14c47"); var c=0.0001 } else if (pixel.temp < 900) { pixel.color = pixelColorPick(pixel,"#e35b56"); var c=0.0004 } else if (pixel.temp < 1300) { pixel.color = pixelColorPick(pixel,"#eb6a6a"); var c=0.001 } else if (pixel.temp < 1500) { pixel.color = pixelColorPick(pixel,"#f27e7e"); var c=0.0025 } else if (pixel.temp < 1700) { pixel.color = pixelColorPick(pixel,"#f58e8e"); var c=0.004 } else if (pixel.temp < 2400) { pixel.color = pixelColorPick(pixel,"#f59a9a"); var c=0.007 } else if (pixel.temp < 3000) { pixel.color = pixelColorPick(pixel,"#faaaaa"); var c=0.01 } else if (pixel.temp < 3600) { pixel.color = pixelColorPick(pixel,"#ffbdbd"); var c=0.015 } else if (pixel.temp < 5000) { pixel.color = pixelColorPick(pixel,"#ffd5bd"); var c=0.025 } else if (pixel.temp < 6000) { pixel.color = pixelColorPick(pixel,"#ffe7bd"); var c=0.035 } //new in-between state because the transition is too jarring else if (pixel.temp < 7000) { pixel.color = pixelColorPick(pixel,"#ffffbd"); var c=0.05 } //most of these are not real because of the kid named Planckian locus, but it makes it more fun else if (pixel.temp < 9000) { pixel.color = pixelColorPick(pixel,"#feffd6"); var c=0.07 } else if (pixel.temp < 11000) { pixel.color = pixelColorPick(pixel,"#f7fff5"); var c=0.1 } else if (pixel.temp < 14000) { pixel.color = pixelColorPick(pixel,"#e3fcfc"); var c=0.125 } else if (pixel.temp < 17000) { pixel.color = pixelColorPick(pixel,"#d1f6ff"); var c=0.15 } else if (pixel.temp < 20000) { pixel.color = pixelColorPick(pixel,"#d1f0ff"); var c=0.175 } else if (pixel.temp < 27000) { pixel.color = pixelColorPick(pixel,"#bde0ff"); var c=0.2 } else if (pixel.temp < 34000) { pixel.color = pixelColorPick(pixel,"#bdd3ff"); var c=0.25 } else if (pixel.temp < 43500) { pixel.color = pixelColorPick(pixel,"#bdc7ff"); var c=0.3 } else if (pixel.temp < 50000) { pixel.color = pixelColorPick(pixel,"#c3bdff"); var c=0.4 } else if (pixel.temp < 56000) { pixel.color = pixelColorPick(pixel,"#c3bdff"); var c=0.45 } else if (pixel.temp < 61000) { pixel.color = pixelColorPick(pixel,"#bba9fc"); var c=0.5 } else if (pixel.temp < 66000) { pixel.color = pixelColorPick(pixel,"#a590f5"); var c=0.6 } else if (pixel.temp < 71000) { pixel.color = pixelColorPick(pixel,"#a68af2"); var c=0.7 } else { pixel.color = pixelColorPick(pixel,"#a26ffc"); var c=0.8 } return c; }; function starLightAndConduction(pixel,c,whitelist=["sun"]) { 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)) { if (Math.random() <= c) { createPixel("light", x, y); pixelMap[x][y].color = pixel.color; }; } else if (!outOfBounds(x,y)) { var newPixel = pixelMap[x][y]; //console.log(whitelist,newPixel.element,whitelist.includes(newPixel.element)); if (pixel.temp!==newPixel.temp && whitelist.includes(newPixel.element)) { var avg = (pixel.temp + newPixel.temp)/2; pixel.temp = avg; newPixel.temp = avg; pixelTempCheck(pixel); pixelTempCheck(newPixel); } } } }; ferromagneticMaterials = ["iron", "cobalt", "nickel", "steel", "hematite"]; if(!enabledMods.includes("mods/code_library.js")) { //x = real number //L = maximum value //x_0 = "the x value of the sigmoid midpoint" i.e. the x center of the bendy part //k = steepness function logisticCurve(x,L,k,x0) { return L/( 1 + ( Math.E ** ( -k * (x - x0) ) ) ); }; // https://stackoverflow.com/questions/10756313/javascript-jquery-map-a-range-of-numbers-to-another-range-of-numbers // Function from August Miller function scale (number, inMin, inMax, outMin, outMax) { return (number - inMin) * (outMax - outMin) / (inMax - inMin) + outMin; }; }; function neutronStarLightAndConduction(pixel,c,whitelist=["neutron_star"]) { var pixelAge = pixelTicks - pixel.start; var coolingFactor; var logistic = logisticCurve(pixelAge/1000, 1, 0.6, -7.7); if(pixel.temp > 1000000) { //console.log('case 1'); coolingFactor = logistic }; if(pixel.temp <= 1000000 && pixel.temp > 100000) { //console.log('case 2'); //console.log("l",logistic); coolingFactor = scale(pixel.temp,1000000,100000,logistic,0.99999); //if(pixelAge % 10 == 0 || pixel.temp < 100500) { console.log(coolingFactor) }; }; if(pixel.temp < 100000) { //console.log('case 3'); coolingFactor = 0.99999 }; //console.log(coolingFactor); pixel.temp = ((pixel.temp + 273.15) * coolingFactor) - 273.15; 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)) { if (Math.random() <= c) { createPixel(Math.random() < 0.995 ? "light" : "neutron", x, y); pixelMap[x][y].color = pixel.color; }; } else if (!outOfBounds(x,y)) { var newPixel = pixelMap[x][y]; //console.log(elements[newPixel.element].conduct); if(ferromagneticMaterials.includes(newPixel.element) && (Math.random() < 0.1)) { newPixel.charge = 20 }; //no magnetism in sb //console.log(whitelist,newPixel.element,whitelist.includes(newPixel.element)); if (pixel.temp!==newPixel.temp && whitelist.includes(newPixel.element)) { var avg = (pixel.temp + newPixel.temp)/2; pixel.temp = avg; newPixel.temp = avg; pixelTempCheck(pixel); pixelTempCheck(newPixel); } } } }; function almostSun(pixel,lightScale=1,whitelist=["sun"]) { starLightAndConduction(pixel,starColor(pixel) * lightScale,whitelist); }; function nsTick(pixel,lightScale=1,whitelist=["sun"]) { neutronStarLightAndConduction(pixel,starColor(pixel) * lightScale,whitelist); }; elements.sun.tick = function(pixel) { almostSun(pixel); }; //Generalized sedimentation function function sedimentation(pixel,sedimentNeighborTable,finalRock,chance=0.0003) { if(Math.random() < chance) { var validNeighborArray = Array.apply(null, Array(adjacentCoords.length)).map(function() {return false}); //sedimentSandstoneTries++; for(i = 0; i < adjacentCoords.length; i++) { //sedimentSandstoneTryIterations++; if(isEmpty(pixel.x+adjacentCoords[i][0],pixel.y+adjacentCoords[i][1],true)) { validNeighborArray[i] = false; //sedimentSandstoneNoDetects++; } else if(!isEmpty(pixel.x+adjacentCoords[i][0],pixel.y+adjacentCoords[i][1],true)) { /*if(sedimentNeighborTable.includes(pixelMap[pixel.x+adjacentCoords[i][0]][pixel.y+adjacentCoords[i][1]].element)) { validNeighborArray[i] = true; //sedimentSandstoneDetects++; } else { validNeighborArray[i] = false; //sedimentSandstoneNoDetects++; };*/ validNeighborArray[i] = sedimentNeighborTable.includes(pixelMap[pixel.x+adjacentCoords[i][0]][pixel.y+adjacentCoords[i][1]].element); }; }; if(validNeighborArray.includes(true)) { //sandstoneFormations++; changePixel(pixel,finalRock); }/* else { sandstoneFailures++; }*/; }; }; //Function for mass replacement according to an object function transformAround(pixel,range,substitutionObject,reverse=false) { var radius1 = (-1 * range); var radius2 = (range + 1); for (let i = radius1; i < radius2; i++) { for (let j = radius1; j < radius2; j++) { if(reverse) { if (!isEmpty(pixel.x+j,pixel.y+i) && !outOfBounds(pixel.x+j,pixel.y+i)) { var destPixel = pixelMap[pixel.x+j][pixel.y+i]; var elementToCheck = destPixel.element; if(getKeyByValue(radioactiveObject,elementToCheck)) { changePixel(destPixel,getKeyByValue(radioactiveObject,elementToCheck)); }; }; } else { if (!isEmpty(pixel.x+j,pixel.y+i) && !outOfBounds(pixel.x+j,pixel.y+i)) { var destPixel = pixelMap[pixel.x+j][pixel.y+i]; var elementToCheck = destPixel.element; if(substitutionObject[elementToCheck]) { changePixel(destPixel,substitutionObject[elementToCheck]); }; }; }; }; }; }; //Previous function with adjacentPixels function transformAdjacent(pixel,substitutionObject,reverse=false) { for(k = 0; k < adjacentCoords.length; k++) { var i = adjacentCoords[k][0] var j = adjacentCoords[k][1] if(reverse) { if (!isEmpty(pixel.x+j,pixel.y+i) && !outOfBounds(pixel.x+j,pixel.y+i)) { var destPixel = pixelMap[pixel.x+j][pixel.y+i]; var elementToCheck = destPixel.element; if(getKeyByValue(radioactiveObject,elementToCheck)) { changePixel(destPixel,getKeyByValue(radioactiveObject,elementToCheck)); }; }; } else { if (!isEmpty(pixel.x+j,pixel.y+i) && !outOfBounds(pixel.x+j,pixel.y+i)) { var destPixel = pixelMap[pixel.x+j][pixel.y+i]; var elementToCheck = destPixel.element; if(substitutionObject[elementToCheck]) { changePixel(destPixel,substitutionObject[elementToCheck]); }; }; }; }; }; //Cooling rate-varied magma solidification function magmaRateBasedCooling(pixel,freezingPoint,vitriteName,vitriteThreshold,aphaniteName,aphaniteThreshold,phaneriteName) { pixel.lastTemperatures ??= []; pixel.lastTemperatures.push(pixel.temp); //due to how it's structured, last temp will always equal pixel.temp; while(pixel.lastTemperatures.length > 2) { pixel.lastTemperatures.shift(); }; if(pixel.lastTemperatures.length > 1) { var overallTemperatureChangeRate = (pixel.temp - pixel.lastTemperatures[0]) / (pixel.lastTemperatures.length - 1); //console.log(overallTemperatureChangeRate); if(overallTemperatureChangeRate >= 0) { return; }; if(pixel.temp > freezingPoint) { return; }; //console.log(pixel.x,pixel.y,overallTemperatureChangeRate) if(overallTemperatureChangeRate < vitriteThreshold) { //numbers made up //console.log("f99fd90"); changePixel(pixel,vitriteName,false); } else if(overallTemperatureChangeRate < aphaniteThreshold) { //console.log("aaaaaaaaaa"); changePixel(pixel,aphaniteName,false); } else { //console.log("03"); changePixel(pixel,phaneriteName,false); }; }; }; //Gravel finder function getGravelElementName(rockName) { if(rockName == "rock") { return "gravel"; }; var gravelBasedName = rockName + "_gravel"; if(elements[gravelBasedName]) { return gravelBasedName; }; var shardBasedName = rockName + "_shard"; if(elements[shardBasedName]) { return shardBasedName; }; return false; }; //Sand finder function getSandElementName(sandName) { var theName = sandName; if(getGravelElementName(theName)) { //will fire if it was a rock with a valid gravel theName = getGravelElementName(theName) }; if(["komatiite","peridotite","komatiite_gravel","peridotite_gravel"].includes(theName)) { return "olivine_sand"; }; if(theName == "gravel" || sandSimplification.includes(theName)) { return "sand"; }; theName = theName.replace(/(gravel|shard)/,"sand"); if(elements[theName]) { return theName; }; return false; }; /*//Erosion function toGravelErodeOtmi(pixel,otherPixel,erosionChanceDivisor=5500) { var gravelName = getGravelElementName(pixel.element); //console.log(gravelName); if(!gravelName) { return false }; var otherState = elements[otherPixel.element].state ?? "solid"; if(otherState == "solid") { return false; }; //console.log(otherState); var otherDensity = elements[otherPixel.element].density ?? otherState == "gas" ? 1.3 : 1000; var erosionChance = ((otherState == "gas" ? otherDensity * 5 : otherDensity) ** 1/1.7) / erosionChanceDivisor; if(Math.random() < erosionChance) { changePixel(pixel,gravelName,false); //changePixelReturn(pixel,gravelName,false).color = "rgb(255,0,0)"; }; }; function toSandErodeOtmi(pixel,otherPixel,erosionChanceDivisor=5500) { var sandName = getSandElementName(pixel.element); //console.log(sandName); if(!sandName) { return false }; var otherState = elements[otherPixel.element].state ?? "solid"; if(otherState == "solid") { return false; }; var otherDensity = elements[otherPixel.element].density ?? otherState == "gas" ? 1.3 : 1000; var erosionChance = ((otherState == "gas" ? otherDensity * 5 : otherDensity) ** 1/1.7) / erosionChanceDivisor; if(Math.random() < erosionChance) { changePixel(pixel,sandName,false); //changePixelReturn(pixel,sandName,false).color = "rgb(255,255,0)"; }; };*/ //I really hate boilerplate //Array maker function twoPartRepeatedArray(value1,amount1,value2,amount2) { var array1 = Array(amount1).fill(value1); var array2 = Array(amount2).fill(value2); return array1.concat(array2) }; //Color gen //Gravels function gravelizeToHex(colorIn) { //console.log("gravelizeToHex called",colorIn); var colorInput = colorIn; //side effects? //make sure in is array if(!colorInput instanceof Array) { colorInput = [colorInput]; }; //console.log(colorInput); //prepare final color var finalColor = []; //console.log(colorInput); for(var i = 0; i < colorInput.length; i++) { finalColor.push(colorInput[i]); finalColor.push(colorInput[i]); finalColor.push(colorInput[i]); }; //vary luminance for(i = 0; i < finalColor.length; i+=3) { finalColor[i] = changeLuminance(finalColor[i],1.25,"multiply","hsljson"); }; //leave offset-1 colors as-is for(i = 2; i < finalColor.length; i+=3) { finalColor[i] = changeLuminance(finalColor[i],0.85,"multiply","hsljson"); }; //desaturate for(i = 0; i < finalColor.length; i++) { finalColor[i] = changeSaturation(finalColor[i],0.9,"multiply","hex"); }; //finish //console.log(finalColor); return finalColor; }; //Sands function sandizeToHex(rockName,type="normal") { //console.log(rockName); if(!["normal","n","wet","w","packed","p"].includes(type.toLowerCase())) { throw new Error("Type must be 'normal', 'wet', or 'packed'"); }; var rockInfo = elements[rockName]; if(!rockInfo) { throw new Error("No such element '" + rockName + "'") }; var sandColor = []; //var sandColorObject = []; var rockColor = rockInfo.color; if(!rockColor instanceof Array) { rockColor = [rockColor]; }; for(i = 0; i < rockColor.length; i++) { var colorAsHsl = normalizeColorToHslObject(rockColor[i]); colorAsHsl.l = 60 + (-0.5 * (60 - colorAsHsl.l)); //bring towards 60 colorAsHsl.s = 31 + (-0.5 * (31 - colorAsHsl.s)); //bring towards 31; switch(type.toLowerCase()) { case "normal": case "n": break; case "wet": case "w": colorAsHsl.s += 2; colorAsHsl.l -= 13; break; case "packed": case "p": colorAsHsl.s -= 10; colorAsHsl.l += 5; break; default: break; }; sandColor.push(convertHslObjects(colorAsHsl,"hex")); //sandColorObject.push(convertHslObjects(colorAsHsl,"rgbjson")); }; return sandColor; }; //Magmas function makeMoltenColor(colorIn) { //Edited vanilla code var newcolor = colorIn; var moltenColorFactors = [ [2,1.25,0.5], [2,1,0.5], [2,0.75,0] ]; var colorList = []; var colorObjectList = []; // if newcolor is not an array, put it in an array if (!(newcolor instanceof Array)) { newcolor = [newcolor]; } newcolor = newcolor.map(x => convertColorFormats(x,"json")); // for every color in the newcolor array, add a new color with the same value, but with the r and g values increased for (var i = 0; i < newcolor.length; i++) { var c = newcolor[i]; for (var j = 0; j < moltenColorFactors.length; j++) { var newc = moltenColorFactors[j]; //console.log(c,newc); r = Math.floor(c.r * newc[0]); g = Math.floor(c.g * newc[1]); b = Math.floor(c.b * newc[2]); if (r > 255) {r = 255}; if (g > 255) {g = 255}; //edit: to hex var rHex = r.toString(16); if(rHex.length == 1) { rHex = "0" + rHex }; var gHex = g.toString(16); if(gHex.length == 1) { gHex = "0" + gHex }; var bHex = b.toString(16); if(bHex.length == 1) { bHex = "0" + bHex }; colorList.push("#"+rHex+gHex+bHex); } } return colorList; } //Generate an entire composition family at once function newIgneousCompositionFamily( compositionFamilyName, magmaViscosity, magmaDensity, vitriteCoolingRateThreshold, aphaniteCoolingRateThreshold, phaneriteName, phaneriteColor, phaneriteMeltingPoint, phaneriteDensity, aphaniteName, aphaniteColor, aphaniteMeltingPoint, aphaniteDensity, vesiculiteName, vesiculiteColor, vesiculiteMeltingPoint, vesiculiteDensity, vitriteName, vitriteColor, vitriteMeltingPoint, vitriteDensity, sandFormationReactionRegularSandCount, sandFormationReactionSpecificSandCount, ) { //console.log(compositionFamilyName,vesiculiteMeltingPoint,vitriteMeltingPoint); var phaneriteSandName = compositionFamilyName == "mafic" ? "gabbro_sand" : phaneriteName + "_sand"; var aphaniteSandName = aphaniteName + "_sand"; var vesiculiteSandName = vesiculiteName + "_sand"; var vitriteSandName = vitriteName + "_sand"; var magmaName = compositionFamilyName + "_magma"; if(compositionFamilyName !== "mafic") { //skip phanerite, phangravel, and aphanite for mafic rocks (rock, gravel, basalt) elements[phaneriteName] = { color: phaneriteColor, behavior: behaviors.POWDER, category: "land", state: "solid", tempHigh: phaneriteMeltingPoint, stateHigh: magmaName, density: phaneriteDensity, hardness: 0.75, breakInto: phaneriteName + "_gravel", }; elements.water.reactions[phaneriteName] = { "elem2": phaneriteName + "_gravel", "chance": 0.00035 } elements[phaneriteName + "_gravel"] = { color: gravelizeToHex(phaneriteColor), behavior: behaviors.POWDER, category: "land", state: "solid", tempHigh: phaneriteMeltingPoint, stateHigh: magmaName, density: phaneriteDensity * 0.55, }; elements.water.reactions[phaneriteName + "_gravel"] = { "elem2": twoPartRepeatedArray(phaneriteSandName,sandFormationReactionSpecificSandCount,"sand",sandFormationReactionRegularSandCount), "chance": 0.0005 }; elements[aphaniteName] = { color: aphaniteColor, behavior: behaviors.POWDER, category: "land", state: "solid", tempHigh: aphaniteMeltingPoint, stateHigh: magmaName, density: aphaniteDensity, hardness: 0.75, breakInto: aphaniteName + "_gravel", }; } else { phaneriteName = "rock"; aphaniteName = "basalt"; magmaName = "magma"; }; elements.water.reactions[aphaniteName] = { "elem2": aphaniteName + "_gravel", "chance": 0.00035 } elements[phaneriteSandName] = { color: sandizeToHex(phaneriteName,"normal"), behavior: behaviors.POWDER, category: "land", state: "solid", tempHigh: phaneriteMeltingPoint, stateHigh: vitriteName, density: phaneriteDensity * 0.595, }; //console.log(phaneriteSandName, elements[phaneriteSandName].color); elements["wet_" + phaneriteSandName] = { color: sandizeToHex(phaneriteName,"wet"), behavior: behaviors.STURDYPOWDER, category: "land", reactions: { "dirt": { "elem1":"sand", "elem2":"mud", "chance":0.0005, "oneway":true }, }, state: "solid", tempHigh: 100, stateHigh: "packed_" + phaneriteSandName, tempLow: -50, stateLow:"packed_" + phaneriteSandName, density: phaneriteDensity * 0.595 + 150, }; elements["packed_" + phaneriteSandName] = { color: sandizeToHex(phaneriteName,"packed"), behavior: behaviors.SUPPORT, category: "land", state: "solid", tempHigh: phaneriteMeltingPoint, stateHigh: vitriteName, density: phaneriteDensity * 0.59, breakInto: phaneriteSandName, }; elements.water.reactions[phaneriteSandName] = { "elem1": null, "elem2": "wet_" + phaneriteSandName, }; elements[aphaniteName + "_gravel"] = { color: gravelizeToHex(aphaniteColor), behavior: behaviors.POWDER, category: "land", state: "solid", tempHigh: aphaniteMeltingPoint, stateHigh: magmaName, density: aphaniteDensity * 0.55, }; elements.water.reactions[aphaniteName + "_gravel"] = { "elem2": twoPartRepeatedArray(aphaniteSandName,sandFormationReactionSpecificSandCount,"sand",sandFormationReactionRegularSandCount), "chance": 0.0005 }; elements[aphaniteName + "_sand"] = { color: sandizeToHex(aphaniteName), behavior: behaviors.POWDER, category: "land", state: "solid", tempHigh: aphaniteMeltingPoint, stateHigh: magmaName, density: aphaniteDensity * 0.595, }; elements[aphaniteSandName] = { color: sandizeToHex(aphaniteName,"normal"), behavior: behaviors.POWDER, category: "land", state: "solid", tempHigh: aphaniteMeltingPoint, stateHigh: vitriteName, density: aphaniteDensity * 0.595, }; elements["wet_" + aphaniteSandName] = { color: sandizeToHex(aphaniteName,"wet"), behavior: behaviors.STURDYPOWDER, category: "land", reactions: { "dirt": { "elem1":"sand", "elem2":"mud", "chance":0.0005, "oneway":true }, }, state: "solid", tempHigh: 100, stateHigh: "packed_" + aphaniteSandName, tempLow: -50, stateLow:"packed_" + aphaniteSandName, density: aphaniteDensity * 0.595 + 150, }; elements["packed_" + aphaniteSandName] = { color: sandizeToHex(aphaniteName,"packed"), behavior: behaviors.SUPPORT, category: "land", state: "solid", tempHigh: aphaniteMeltingPoint, stateHigh: vitriteName, density: aphaniteDensity * 0.59, breakInto: aphaniteSandName, }; elements.water.reactions[aphaniteSandName] = { "elem1": null, "elem2": "wet_" + aphaniteSandName, }; elements[vesiculiteName] = { color: vesiculiteColor, behavior: behaviors.POWDER, category: "land", state: "solid", tempHigh: vesiculiteMeltingPoint, stateHigh: magmaName, density: vesiculiteDensity, hardness: 0.75, breakInto: vesiculiteName + "_gravel", }; elements.water.reactions[vesiculiteName] = { "elem2": vesiculiteName + "_gravel", "chance": 0.00035 } elements[vesiculiteName + "_gravel"] = { color: gravelizeToHex(vesiculiteColor), behavior: behaviors.POWDER, category: "land", state: "solid", tempHigh: vesiculiteMeltingPoint, stateHigh: magmaName, density: vesiculiteDensity * 3.2, }; elements.water.reactions[vesiculiteName + "_gravel"] = { "elem2": twoPartRepeatedArray(vesiculiteSandName,sandFormationReactionSpecificSandCount,"sand",sandFormationReactionRegularSandCount), "chance": 0.0005 }; elements[vesiculiteSandName] = { color: sandizeToHex(vesiculiteName,"normal"), behavior: behaviors.POWDER, category: "land", state: "solid", tempHigh: vesiculiteMeltingPoint, stateHigh: vitriteName, density: vesiculiteDensity * 1.9, }; elements["wet_" + vesiculiteSandName] = { color: sandizeToHex(vesiculiteName,"wet"), behavior: behaviors.STURDYPOWDER, category: "land", reactions: { "dirt": { "elem1":"sand", "elem2":"mud", "chance":0.0005, "oneway":true }, }, state: "solid", tempHigh: 100, stateHigh: "packed_" + vesiculiteSandName, tempLow: -50, stateLow:"packed_" + vesiculiteSandName, density: vesiculiteDensity * 1.9 + 150, }; elements["packed_" + vesiculiteSandName] = { color: sandizeToHex(vesiculiteName,"packed"), behavior: behaviors.SUPPORT, category: "land", state: "solid", tempHigh: vesiculiteMeltingPoint, stateHigh: vitriteName, density: vesiculiteDensity * 1.888, breakInto: vesiculiteSandName, }; elements.water.reactions[vesiculiteSandName] = { "elem1": null, "elem2": "wet_" + vesiculiteSandName, }; elements[vitriteName] = { color: vitriteColor, behavior: behaviors.POWDER, category: "land", state: "solid", tempHigh: vitriteMeltingPoint, stateHigh: magmaName, density: vitriteDensity, hardness: 0.75, breakInto: vitriteName + "_shard", }; elements.water.reactions[vitriteName] = { "elem2": vitriteName + "_shard", "chance": 0.00035 } elements[vitriteName + "_shard"] = { color: gravelizeToHex(vitriteColor), behavior: behaviors.POWDER, category: "land", state: "solid", tempHigh: vitriteMeltingPoint, stateHigh: magmaName, density: vitriteDensity * 0.55, }; elements.water.reactions[vitriteName + "_shard"] = { "elem2": twoPartRepeatedArray(vitriteSandName,sandFormationReactionSpecificSandCount,"sand",sandFormationReactionRegularSandCount), "chance": 0.0005 }; elements[vitriteSandName] = { color: sandizeToHex(vitriteName,"normal"), behavior: behaviors.POWDER, category: "land", state: "solid", tempHigh: vitriteMeltingPoint, stateHigh: vitriteName, density: vitriteDensity * 0.595, }; elements["wet_" + vitriteSandName] = { color: sandizeToHex(vitriteName,"wet"), behavior: behaviors.STURDYPOWDER, category: "land", reactions: { "dirt": { "elem1":"sand", "elem2":"mud", "chance":0.0005, "oneway":true }, }, state: "solid", tempHigh: 100, stateHigh: "packed_" + vitriteSandName, tempLow: -50, stateLow:"packed_" + vitriteSandName, density: vitriteDensity * 0.595 + 150, }; elements["packed_" + vitriteSandName] = { color: sandizeToHex(vitriteName,"packed"), behavior: behaviors.SUPPORT, category: "land", state: "solid", tempHigh: vitriteMeltingPoint, stateHigh: vitriteName, density: vitriteDensity * 0.59, breakInto: vitriteSandName, }; elements.water.reactions[vitriteSandName] = { "elem1": null, "elem2": "wet_" + vitriteSandName, }; if(compositionFamilyName !== "mafic") { elements[magmaName] = { "reactions": { "ash": { "elem1": null, "elem2": "molten_slag" }, "dust": { "elem1": null, "elem2": "molten_slag" }, "foam": { "elem1": vesiculiteName, "elem2": vesiculiteName }, }, _magmaCoolingPassToElement: { vitreous: [vitriteCoolingRateThreshold,vitriteName], aphanitic: [aphaniteCoolingRateThreshold,aphaniteName], phaneritic: [Infinity,phaneriteName], meltingPoints: { vitreous: vitriteMeltingPoint, vesicular: vesiculiteMeltingPoint, aphanitic: aphaniteMeltingPoint, phaneritic: phaneriteMeltingPoint, }, }, tick: function(pixel) { var coolingInfo = elements[pixel.element]._magmaCoolingPassToElement; magmaRateBasedCooling( pixel, Math.min( coolingInfo.meltingPoints.vitreous, coolingInfo.meltingPoints.vesicular, coolingInfo.meltingPoints.aphanitic, coolingInfo.meltingPoints.phaneritic ) - 20, coolingInfo.vitreous[1], coolingInfo.vitreous[0], coolingInfo.aphanitic[1], coolingInfo.aphanitic[0], coolingInfo.phaneritic[1] ); }, "color": makeMoltenColor(phaneriteColor), "behavior": behaviors.MOLTEN, "temp": Math.max(phaneriteMeltingPoint,aphaniteMeltingPoint,vesiculiteMeltingPoint,vitriteMeltingPoint) + 100, "tempLow": -Infinity, //cosmetic info "stateLow": [aphaniteName,phaneriteName,vitriteName], "viscosity": magmaViscosity, "hidden": true, "state": "liquid", "category": "molten", "density": magmaDensity, }; }; }; //Terrain //Soils //Dry //Warning: Crippling lack of online information on the properties of the various soils by texture //Clay //Clay exists //Silty clay //TODO //Silty Clay Loam //TODO //Silty Loam //TODO //Silt //TODO //Clay Loam //TODO //elements.clay_soil.name = "Clay Loam" //Medium Loam //TODO //elements.dirt.name = "Medium Loam"; //Sandy Clay /*elements.sandy_clay = { color: "#DDCD8A", behavior: behaviors.POWDER, tempHigh: 1710, tempLow: -50, stateLow: "sandy_clay_permafrost", category:"land", state: "solid", density: 1220, };*/ //Sandy Clay Loam //TODO //Sandy Loam //TODO //Loamy Sand //TODO //Sand //Sand exists //Wet //Wet Clay //TODO //Wet Silty clay //TODO //Wet Silty Clay Loam //TODO //Wet Silty Loam //TODO //Wet Silt //TODO //Wet Clay Loam //TODO //Wet Medium Loam //Mud exists //Wet Sandy Clay //TODO //Wet Sandy Clay Loam //TODO //Wet Sandy Loam //TODO //Wet Loamy Sand //TODO //Wet Sand //Wet Sand exists //Permafrost //Clay Permafrost //TODO //Silty clay Permafrost //TODO //Silty Clay Loam Permafrost //TODO //Silty Loam Permafrost //TODO //Silt Permafrost //TODO //Clay Loam Permafrost //TODO //Medium Loam Permafrost //Permafrost exists //Sandy Clay Permafrost //TODO //Sandy Clay Loam Permafrost //TODO //Sandy Loam Permafrost //TODO //Loamy Sand Permafrost //TODO //Sand Permafrost //TODO //Radioactive (unmoved/TODO) //Dry //Radioactive Clay //Clay exists //Radioactive Silty clay //TODO //Radioactive Silty Clay Loam //TODO //Radioactive Silty Loam //TODO //Radioactive Silt //TODO //Radioactive Clay Loam //Clay Soil exists //Radioactive Medium Loam //Dirt exists //Radioactive Sandy Clay //TODO //Radioactive Sandy Clay Loam //TODO //Radioactive Sandy Loam //TODO //Radioactive Loamy Sand //TODO //Radioactive Sand //Sand exists //Wet //Radioactive Wet Clay //TODO //Radioactive Wet Silty clay //TODO //Radioactive Wet Silty Clay Loam //TODO //Radioactive Wet Silty Loam //TODO //Radioactive Wet Silt //TODO //Radioactive Wet Clay Loam //TODO //Radioactive Wet Medium Loam //Mud exists //Radioactive Wet Sandy Clay //TODO //Radioactive Wet Sandy Clay Loam //TODO //Radioactive Wet Sandy Loam //TODO //Radioactive Wet Loamy Sand //TODO //Radioactive Wet Sand //Wet Sand exists //Permafrost //Radioactive Clay Permafrost //TODO //Radioactive Silty clay Permafrost //TODO //Radioactive Silty Clay Loam Permafrost //TODO //Radioactive Silty Loam Permafrost //TODO //Radioactive Silt Permafrost //TODO //Radioactive Clay Loam Permafrost //TODO //Radioactive Medium Loam Permafrost //Permafrost exists //Radioactive Sandy Clay Permafrost //TODO //Radioactive Sandy Clay Loam Permafrost //TODO //Radioactive Sandy Loam Permafrost //TODO //Radioactive Loamy Sand Permafrost //TODO //Radioactive Sand Permafrost //TODO //Rocks //Igneous //Felsic newIgneousCompositionFamily( "felsic", 1e12, 2200, -85, -20, "granite", ["#F3C3AD", "#F0AB75", "#DDA888", "#BD927E", "#998473", "#5C5E53", "#BD8366"], 1215, 2691, "rhyolite", ["#A67153","#BF967E","#D9B5A0","#8C533E","#C99F86","#C5997E","#BB8A69"], 800, 1254, "pumice", ["#ebe1c3", "#ada386", "#f0bd9e", "#ab846c", "#bfbebd", "#75726f", "#f5e595", "#ab9e60", "#ad683d", "#633d25", "#6e6d6d", "#3b3a39"], 1350, 641, "obsidian", ["#252422", "#171616", "#161915", "#161018"], 1000, 2488, 7,3 ); elements.water.reactions.obsidian_shard.elem2 = ["obsidian_sand","obsidian_sand","obsidian_sand","sand","sand"] elements.obsidian_sand.color = ["#3b3730", "#211e1e", "#293321", "#31133b"]; //Intermediate felsic newIgneousCompositionFamily( "intermediate_felsic", 1e10, 2320, -95, -23, "granodiorite", ["#B1AB9D", "#262001", "#A6A292", "#D6C5BC", "#F2F2F2", "#DED8C2", "#978871", "#A8AAA7"], //From image: By Rudolf Pohl - Own work, CC BY-SA 3.0, https://commons.wikimedia.org/w/index.php?curid=7788350 1277, //made-up/interpolated from granite and diorite 2644, //last 2 digits made up again "dacite", ["#D9CCC5", "#F2E9E4", "#877670", "#A69B97"], 1050, 2654, //https://books.google.ca/books?id=ObUPAAAAIAAJ&pg=PA181&lpg=PA181&dq=dacite+specific+gravity&source=bl&ots=qn8B4sirWi&sig=Wp_MHqPuUGPNQobcuNP5c5wqkpU&hl=en&sa=X&ei=cimtUaH8Eab7yAH8joDABQ#v=onepage&q=dacite%20specific%20gravity&f=false "intermediate_pumice", ["#dbd4bd", "#b5ad94", "#e3ceb6", "#bda891", "#c2c2c2", "#a1a1a1", "#e6c8a1", "#b8a48c"], 1190, 991, vitreousInterfelsicName, ["#4f4b42", "#474646", "#4a4d49", "#342f36"], 1040, 2640, 6,4 ); //Intermediate newIgneousCompositionFamily( "intermediate", 1e8, 2450, -105, -26, "diorite", ["#E1E1E1","#B0A696","#707271","#434459","#242424"], //Extracted from image and blended; Michael C. Rygel - Own work, CC BY-SA 3.0, https://commons.wikimedia.org/w/index.php?curid=31124755 https://commons.wikimedia.org/w/index.php?curid=7788350 1300, 2822, //last 2 digits made up again "andesite", ["#6F7575", "#C5C9CB", "#818787", "#797F7F", "#B5B9BA", "#6D7371", "#909696"], 1215, 2474, //https://books.google.ca/books?id=ObUPAAAAIAAJ&pg=PA181&lpg=PA181&dq=dacite+specific+gravity&source=bl&ots=qn8B4sirWi&sig=Wp_MHqPuUGPNQobcuNP5c5wqkpU&hl=en&sa=X&ei=cimtUaH8Eab7yAH8joDABQ#v=onepage&q=dacite%20specific%20gravity&f=false "scoria", ["#594545", "#573b31", "#522e28"], 1085, 2550, vitreousIntermediateName, ["#636059", "#707070", "#5f615f", "#504b52"], 1085, 2710, 5,5 ); elements.scoria_gravel.density = 2790; //Mafic elements.rock.name = "gabbro"; elements.rock.tempHigh = 1200; elements.rock.density = 3300; elements.rock.breakInto = ["gravel"]; delete elements.wet_sand.reactions.gravel; elements.magma.name = "mafic magma"; elements.magma.density = 2650; elements.magma.tick = function(pixel) { magmaRateBasedCooling(pixel,1180,vitreousMaficName,-115,"basalt",-29,"rock"); }; elements.magma.temp = 1400; elements.magma.tempLow = -Infinity; elements.magma.stateLow = ["basalt","gabbro",vitreousMaficName] elements.magma.reactions ??= {}; elements.magma.reactions.foam = { "elem1": "mafic_scoria", "elem2": "mafic_scoria" }; elements.basalt.tempHigh = 1122; elements.basalt.density = 2949; elements.basalt.breakInto = "basalt_gravel", newIgneousCompositionFamily( "mafic", 10000, 2200, -115, -29, "rock", ["#808080","#4f4f4f","#949494"], 1474, 3300, "basalt", ["#2e2e2e","#333333","#3d3d3d"], 1122, 2949, "mafic_scoria", ["#756666", "#695751", "#737272"], 1298, 2717, vitreousMaficName, ["#6e615d", "#706767", "#6a6b63", "#6e5e68"], 1200, 2900, 3,7 ); elements.mafic_scoria.tempHigh = 1298; elements.mafic_scoria.stateHigh = "magma"; elements.mafic_scoria_gravel.density = 2993; //Ultramafic newIgneousCompositionFamily( "ultramafic", 800, 2800, -125, -32, "peridotite", ["#908557","#A29E78","#7F8044","#C6BC87","#8C8656","#7C7C40","#837840","#8B8B69"], 1400, 3347, //appr from https://agupubs.onlinelibrary.wiley.com/doi/abs/10.1029/GL003i009p00509#:~:text=Abstract,and%20the%20bulk%20rock%20analyses. "komatiite", ["#AEB5AE","#A9B8B5","#7B8881","#858B87","#949F97","#505B55"], 1600, 3100, "ultramafic_scoria", ["#737565", "#7a7761", "#727372"], 1400, 2924, vitreousUltramaficName, ["#6e6d5e", "#626659", "#54574b", "#665d55"], 1300, 3200, 2,8 ); elements.ultramafic_scoria_gravel.density =.3132; /* //Rocks //Igneous //Phaneritic //Ultramafic: peridotite var molten_olivine = ["molten_fayalite","molten_forsterite","molten_forsterite"]; //apparently olivine sand exists elements.olivine_sand = { color: ['#b5a773', '#b5af78', '#b2b471', '#bab07b', '#b4ae74', '#b4b471', '#b5a970', '#b4b476'], behavior: behaviors.POWDER, tempHigh: 1750, //https://www.indiamart.com/olivineindia/olivine-sand.html stateHigh: molten_olivine, category: "land", state: "solid", density: 1720, }; elements.wet_olivine_sand = { color: ["#a08d4b","#918949","999c49","#aa9b50","#8f8743","#adad53","#9d8f48","#838f43"], behavior: behaviors.STURDYPOWDER, reactions: { "sand": { "elem1":"sand", "elem2":"wet_olivine_sand", "chance":0.0005, "oneway":true }, "olivine_sand": { "elem1":"olivine_sand", "elem2":"wet_olivine_sand", "chance":0.0005, "oneway":true }, "dirt": { "elem1":"olivine_sand", "elem2":"mud", "chance":0.0005, "oneway":true }, }, tempHigh: 100, stateHigh: "packed_olivine_sand", tempLow: -50, stateLow: "packed_olivine_sand", category: "land", state: "solid", density: 2002, }; elements.packed_olivine_sand = { color: ["#968f64","#969669","#8d9362","#9d996c","#959465","#8f9362","#949061","#909366"], behavior: behaviors.SUPPORT, tempHigh: 1700, stateHigh: molten_olivine, category: "land", state: "solid", density: 1811, breakInto: "olivine_sand", }; elements.water.reactions.olivine_sand = { "elem1": null, "elem2": "wet_olivine_sand" }; newPowder("fayalite",["#bf7432","#ad8e3e"],4390,1200,null,null); newPowder("forsterite","#cccccc",3270,1890,null,null); elements.molten_forsterite = { reactions: { "molten_fayalite": { elem1: "olivine", elem2: ["molten_fayalite","olivine"], tempMax: 1890 }, }, }; elements.olivine = { color: ["#7fa14f","#7dba52"], behavior: behaviors.POWDER, tempHigh: 1890, stateHigh: molten_olivine, category: "solids", state: "solid", density: 2700, breakInto: "olivine_shard", }, newPowder("olivine_shard",["#97ba65","#7a994e","#99d96c","#7cb553"],2811,1890,molten_olivine,null); */ //Sedimentary //Chemical //Clastic //Grains < 1/16 mm //Grains 1/16-2 mm //Partly intermingled with the radiation cult //Dummied-out debug counters /*sedimentSandstoneTries = 0; sedimentSandstoneTryIterations = 0; sedimentSandstoneDetects = 0; sedimentSandstoneNoDetects = 0; sandstoneFormations = 0; sandstoneFailures = 0;*/ //Elements from which simplified lithification can spread sandstoneLithificationElements = ["sand_sediment", "sandstone", "radioactive_sand_sediment", "radioactive_sandstone"/*, "crimson_sandstone", "crimson_sand_sediment"*/] //Water reaction to pick up the fine material (this is very simplified) elements.water.reactions.wet_sand = { "elem1": "sandy_water", "elem2": ["wet_sand","wet_sand","wet_sand","sandy_water"], chance: 0.01 }; elements.water.reactions.radioactive_wet_sand = { "elem1": "radioactive_sandy_water", "elem2": ["radioactive_wet_sand","radioactive_wet_sand","radioactive_wet_sand","radioactive_wet_sand","radioactive_wet_sand",null], chance: 0.01 }; /*elements.water.reactions.crimson_wet_sand = { / "elem1": "crimson_sandy_water", "elem2": ["crimson_wet_sand","crimson_wet_sand","crimson_wet_sand","crimson_wet_sand","crimson_wet_sand",null], chance: 0.01 };*/ //Sediment suspension elements.sandy_water = { color: ["#768485", "#849294"], behavior: behaviors.LIQUID, tempHigh: 100, stateHigh: ["steam","steam","sand"], //tempLow: 0, //stateLow: "sandy_ice", category: "liquids", heatCapacity: 4.184, //unimplemented reactions: { "dirt": { // React with (water reacts with dirt to make mud) "elem1": [null,null,"wet_sand"], // First element transforms into; in this case, water deletes itself "elem2": "mud", // Second element transforms into; in this case, dirt turns to mud }, "water": { "elem1":"water", "elem2":"sandy_water", "chance":0.025 }, //swap reaction "sand": { "elem1": [null,null,"wet_sand"], "elem2": "wet_sand", }, "sandy_water": { "elem1":"water", "elem2":"sand_sediment", "chance": 0.001 }, "wet_sand": { "elem1": "water", "elem2":"sand_sediment", "chance": 0.0005 }, //"salt": { "elem1": "salt_water", "elem2": null }, //"sugar": { "elem1": "sugar_water", "elem2": null, }, "dust": { "elem1": "dirty_water", "elem2": null, }, "ash": { "elem1": "dirty_water", "elem2": null, }, "cyanide": { "elem1": "dirty_water", "elem2": null, }, //"carbon_dioxide": { "elem1": "seltzer", "elem2": null, "oneway":true }, "sulfur": { "elem1": "dirty_water", "elem2": null, }, "rat": { "elem1": "dirty_water", chance:0.005 }, "plague": { "elem1": "dirty_water", "elem2": null, }, "rust": { "elem1": "dirty_water", chance:0.005 }, "fallout": { "elem1": "dirty_water", chance:0.25 }, "radiation": { "elem1": "dirty_water", chance:0.25 }, "uranium": { "elem1": "dirty_water", chance:0.25 }, "rotten_meat": { "elem1": "dirty_water", chance:0.25 }, "quicklime": { "elem1": [null,null,"wet_sand"], "elem2": "slaked_lime", }, "rock": { "elem2": "wet_sand", "chance": 0.00035 }, "ruins": { "elem2": "rock", "chance": 0.00035 }, "mudstone": { "elem2": "mud", "chance": 0.00035 }, //"methane": { "elem1":"primordial_soup", "elem2":"primordial_soup", tempMin:60, charged:true }, //"ammonia": { "elem1":"primordial_soup", "elem2":"primordial_soup", tempMin:60, charged:true }, "fly": { "elem2":"dead_bug", "chance":0.1, "oneway":true }, "firefly": { "elem2":"dead_bug", "chance":0.1, "oneway":true }, "bee": { "elem2":"dead_bug", "chance":0.05, "oneway":true }, "stink_bug": { "elem2":"dead_bug", "chance":0.1, "oneway":true }, }, state: "liquid", density: 1097, conduct: 0.02, stain: 0.01, } //Sediment element where lithification code resides elements.sand_sediment = { hidden: true, color: "#d3b387", hardness: 0.2, behavior: [ "XX|XX|XX", "XX|XX|XX", "SW:wet_sand%1.5 AND M2|SW:wet_sand%2.5 AND M1|SW:wet_sand%1.5 AND M2" ], reactions: { "water": { "elem1":"sandy_water", "elem2":"sandy_water", "chance":0.001 }, "sand": { "elem1": [null,null,"wet_sand"], "elem2": "wet_sand", }, "sandy_water": { "elem1":["water","water","sand_sediment"], "chance":0.001 }, "wet_sand": { "elem2": "sand_sediment", "chance": 0.0005 }, }, tempHigh: 1700, stateHigh: "molten_glass", category: "land", state: "solid", state: "solid", density: 1602, breakInto: "sand", tick: function(pixel) { sedimentation(pixel,sandstoneLithificationElements,"sandstone") }, } //Reactions to add elements.wet_sand.reactions.sand_sediment = { elem1: "sand_sediment", chance: 0.0003 }; elements.wet_sand.reactions.wet_sand = { elem1: "sand_sediment", chance: 0.0003 }; //Final rock elements.sandstone = { color: ["#b27853", "#d1a784", "#d1a784", "#d4996e"], behavior: behaviors.WALL, tempHigh: 1500, stateHigh: "molten_glass", category: "land", state: "solid", state: "solid", density: 2323, //wide range hardness: 0.5, breakInto: "sand", } //Worldgen preset for testing worldgentypes.sandstone_test_ocean = { layers: [ [0.9, "wet_sand", 0.2], [0.9, "sand", 0.2], [0.8, "sandy_water", 0.7], [0.25, "water"], [0.1, "sand", 0.1], [0.1, "clay", 0.1], [0.1, "gravel", 0.2], [0.1, "wet_sand"], [0.03, "gravel", 0.5], [0.03, "rock"], [0, "basalt"], ] }; //Changes to vanilla desert worldgentypes.desert = { layers: [ [0.95, "gravel", 0.6], [0.65, "bone", 0.03], [0.65, "sand"], [0.55, "bone", 0.02], [0.3, "sandstone"], [0.05, "rock"], [-0.78, "basalt"] ], temperature: 38 }; //Grains > 2 mm //Angular fragments //Breccia //Rounded fragments //Conglomerate //Gems //There is a mineral classification scheme, but it will take a while to implement if I ever get around to it. //We're assuming that the crystal structures reform properly because I don't want to have to research and implement refrozen amorphous forms. //Emerald elements.emerald = { color: ["#31e31e", "#88fa5a", "#28d419", "#54e823", "#64f235"], tempHigh: 1287, //1: I can't be arsed to find out what happens to emerald in extreme heat. Apparently, neither can anyone else, and Google is useless for this. //2: So I'm just assuming that the chromium impurities are polite and remain in solution with the molten beryl. behavior: behaviors.POWDER, category: "powders", state: "solid", density: 2710, //within natural variation hardness: 0.8, //Mohs scaled to diamond }; //Amethyst elements.amethyst = { color: ["#c569e0", "#bd43e0", "#e37aeb", "#ab2fe0", "#b05bd4", "#9b2cdb"], tempHigh: 1650, //1: Gee, another quartz-like... //2: Like with emerald, I'm trusting the impurities to stay dissolved because I don't exactly have any amethyst laying around to melt. behavior: behaviors.POWDER, category: "powders", state: "solid", density: 2650, hardness: 0.7, }; //Sapphire elements.sapphire = { color: ["#2d43e3", "#4d5fe3", "#1f30cc", "#375fdb", "#2d39e3"], tempHigh: 2040, //1: You can actually grow corundum-based gems through the Verneuil process behavior: behaviors.POWDER, category: "powders", state: "solid", density: 3980, hardness: 0.9, } //Ruby elements.ruby = { //Corundum with different impurities, so I can copy/paste everything but the color color: ["#ff1222", "#ff4545", "#e30b13", "#fa253b", "#f2120f"], tempHigh: 2040, behavior: behaviors.POWDER, category: "powders", state: "solid", density: 3980, hardness: 0.9, } //Topaz elements.topaz = { color: ["#f7f431", "#ffff5c", "#f7e048", "#fae43e", "#fff86e", "#ede321"], tempHigh: 1340, stateHigh: "mullite", //thermal decomposition behavior: behaviors.POWDER, category: "powders", state: "solid", density: 3500, hardness: 0.8, }; //Mullite elements.mullite = { color: ["#f2d7bf", "#f5cbdc", "#f2dfd3"], //hardly a gemstone, but i will color it like the others regardless tempHigh: 1840, behavior: behaviors.POWDER, category: "powders", state: "solid", density: 3110, hardness: 0.7, }; //Onyx elements.onyx = { color: ["#1a1919", "#070605", "#111313"], tempHigh: 1650, //another silicate mineral behavior: behaviors.POWDER, category: "powders", state: "solid", density: 2650, hardness: 0.7, }; //Opal elements.opal = { color: ["#ffcfcf", "#fff0d9", "#fcf7c5", "#e4ffd4", "#d1fff5", "#dcecfa", "#dfdbff", "#f5e0ff", "#f7d0f1"], tempHigh: 100, stateHigh: ["broken_opal", "broken_opal", "broken_opal", "broken_opal", "broken_opal", "broken_opal", "broken_opal", "broken_opal", "broken_opal", "steam"], behavior: behaviors.POWDER, category: "powders", state: "solid", density: 2090, hardness: 0.6, breakInto: ["quartz", "quartz", "quartz", "quartz", "quartz", "quartz", "quartz", "quartz", "quartz", "water"], }; elements.broken_opal = { color: ["#f5e6e6", "#ebe2d5", "#f7f6ed", "#e4eddf", "#d8ebe7", "#d8e0e8", "#e4e3e8", "#f4edf7", "#ebebeb"], tempHigh: 1650, stateHigh: "molten_quartz", behavior: behaviors.POWDER, category: "powders", state: "solid", density: 2322, hardness: 0.55, //it cracks }; //Quartz elements.quartz = { //silicates, silicates, and more silicates color: ["#f0f0f0", "#e3e3e3", "#f7f7f7"], tempHigh: 1650, behavior: behaviors.POWDER, category: "powders", state: "solid", density: 2650, hardness: 0.7, }; //Re-add molten quartz because it stopped auto-generating elements.molten_quartz = {"behavior":behaviors.MOLTEN,"hidden":true,"state":"liquid","category":"states","color":['#ffff78', '#fff078', '#ffb400', '#ffff71', '#ffe371', '#ffaa00', '#ffff7b', '#fff77b', '#ffb900'],"temp":1650,"tempLow":1550,"stateLow":"quartz","density":2385,"viscosity":10000,"reactions":{"ash":{"elem1":null,"elem2":"molten_slag"},"dust":{"elem1":null,"elem2":"molten_slag"},"magma":{"elem1":null,"elem2":"molten_slag"}},"movable":true} //Use in glass elements.molten_quartz.reactions = { quicklime: { elem1: "molten_glass", elem2: ["quicklime", "quicklime", "quicklime", "quicklime", "quicklime", "quicklime", "quicklime", "quicklime", "quicklime", null]} //lack of vanilla washing soda, lack of tripartite reactions }; /* elements.elem1.reactions = { elem2: { elem1: "elem1_becomes", elem2: "elem2_becomes"} }; */ //Pearl (not a mineral) elements.pearl = { color: ["#e3e3e3", "#e3e0d1", "#eddbce", "#eef2c9", "#d5f5dc", "#d8f2ec", "#fadcf9", "#e3d1c1", "#f2edc9", "#e0f5d7", "#e2beeb", "#e3e3e3", "#e3e0d1", "#eddbce", "#eef2c9", "#d5f5dc", "#d8f2ec", "#fadcf9", "#e3d1c1", "#f2edc9", "#e0f5d7", "#e2beeb", "#38332e"], tempHigh: 1340, //yay, more thermal decomposition elements behavior: behaviors.POWDER, category: "powders", state: "solid", density: 772, //It is partly made of proteins and is said to burn, but I can't find an ignition point, so here it melts. hardness: 0.45, }; //Soil //Dry dirt elements.dry_dirt = { color: ["#a88e5e","#8f7950","#8a7045","#9e804c"], behavior: [ "XX|SW:dirt%3 AND SW:mud%6|XX", "XX|XX|XX", "M2|M1|M2", ], tempHigh:1200, stateHigh: "molten_dirt", tempLow: -50, stateLow: "dry_permafrost", category:"land", state: "solid", density: 1100, }, elements.molten_dirt = { //added manually because the change to dirt will prevent molten_dirt from being auto-generated "behavior": behaviors.MOLTEN, "hidden": true, "state": "liquid", "category": "states", "color": ["#EC6A15", "#EC5515", "#EC3F00", "#B85210", "#B84210", "#B83100", "#AE4B0D", "#AE3C0D", "#AE2D00", "#D65A0F", "#D6480F", "#D63600"], "temp": 1200, "tempLow": 1100, "stateLow": "dry_dirt", "density": 1098, "viscosity": 10000 } if(enabledMods.includes("mods/boiling_rock.js")) { elements.molten_dirt.tempHigh = 3000; elements.molten_dirt.stateHigh = "vaporized_rock"; }; elements.dry_permafrost = { color: ["#5B7870","#535D51","#52746A","#5A7A6F"], behavior: behaviors.POWDER, //not enough water for cementing temp: -50, tempHigh: 10, stateHigh: "dry_dirt", category: "land", state: "solid", state: "solid", density: 1200, } elements.dirt.tempHigh = 110; elements.dirt.stateHigh = "dry_dirt"; elements.water.reactions.dry_dirt = { elem1: null, elem2: "dirt", chance: 0.1 } elements.water.reactions.radioactive_dry_dirt = { elem1: null, elem2: "radioactive_dirt", chance: 0.1 } if(!elements.mud.reactions) { elements.mud.reactions = {}; }; elements.mud.reactions.dry_dirt = { elem1: "dirt", elem2: "dirt", chance: 0.06 } elements.mud.reactions.radioactive_dry_dirt = { elem1: "radioactive_dirt", elem2: "radioactive_dirt", chance: 0.06 } //Land Element Cults /* "Cult" is used similarly to its EoD sense; here, it signifies a set of elements that systematically replicates another set of elements except for a given modification. In this case, they replicate some land elements; a "yellow" cult, for example, would have yellow_dirt, yellow_mud, yellow_mudstone, yellow_permafrost, yellow_sand... */ //Radioactive land //Radioactive behavior cult (see above) behaviors.RAD_POWDER = [ "XX|CR:radiation%2|XX", "CR:radiation%2|HT%1.5|CR:radiation%2", "M2|M1 AND CR:radiation%2|M2", ], behaviors.RAD_STURDYPOWDER = [ "XX|CR:radiation%2|XX", "CR:radiation%2|HT%1.5|CR:radiation%2", "XX|M1 AND CR:radiation%2|XX", ], behaviors.RAD_SUPPORT = [ "CR:radiation%1|CR:radiation%2|CR:radiation%1", "SP AND CR:radiation%2|HT%1.5|SP AND CR:radiation%2", "XX|M1 AND CR:radiation%2|XX", ], behaviors.RAD_SUPPORTPOWDER = [ "CR:radiation%1|CR:radiation%2|CR:radiation%1", "SP AND CR:radiation%2|HT%1.5|SP AND CR:radiation%2", "M2|M1 AND CR:radiation%2|M2", ], behaviors.RAD_LIQUID = [ "XX|CR:radiation%2|XX", "M2 AND CR:radiation%2|HT%1.5|M2 AND CR:radiation%2", "M1|M1 AND CR:radiation%2|M1", ], behaviors.RAD_WALL = [ "CR:radiation%0.7|CR:radiation%1.4|CR:radiation%0.7", "CR:radiation%1.4|HT%1.50000000000|CR:radiation%1.4", "CR:radiation%0.7|CR:radiation%1.4|CR:radiation%0.7", ], behaviors.RAD_GAS = [ "M2 AND CR:radiation%1.0|M1 AND CR:radiation%2|M2 AND CR:radiation%1", "M1 AND CR:radiation%2|HT%1 AND CR:radiation%2|M1 AND CR:radiation%2", "M2 AND CR:radiation%1.0|M1 AND CR:radiation%2|M2 AND CR:radiation%1", ], behaviors.RAD_MOLTEN = [ "XX|CR:radiation%2.5 AND CR:fire%2.5|XX", "M2 AND CR:radiation%1|HT%2|M2 AND CR:radiation%1", "M1|M1 AND CR:radiation%1|M1", ] //console.log(behaviors.RAD_POWDER) //forcing it to acknowledge the behaviors i just added instead of giving me "undefined" //Setting reactions (we'll define the elements later) var namelessArray = ["dirt","sand","mud","wet_sand"]; for(i = 0; i < namelessArray.length; i++) { var elementt = namelessArray[i]; if(!elements[elementt].reactions) { elements[elementt].reactions = {}; }; }; elements.water.reactions.radiation = { elem1: "radioactive_water", elem2: null, chance:0.25 }, elements.radiation.reactions.water = { elem2: "radioactive_water", elem1: null, chance:0.25 }, elements.dirt.reactions.radiation = { elem1: "radioactive_dirt", elem2: null, chance:0.25 }, elements.radiation.reactions.dirt = { elem2: "radioactive_dirt", elem1: null, chance:0.25 }, elements.sand.reactions.radiation = { elem1: "radioactive_sand", elem2: null, chance:0.25 }, elements.radiation.reactions.sand = { elem2: "radioactive_sand", elem1: null, chance:0.25 }, elements.mud.reactions.radiation = { elem1: "radioactive_mud", elem2: null, chance:0.25 }, elements.radiation.reactions.mud = { elem2: "radioactive_mud", elem1: null, chance:0.25 }, elements.wet_sand.reactions.radiation = { elem1: "radioactive_wet_sand", elem2: null, chance:0.25 }, elements.radiation.reactions.wet_sand = { elem2: "radioactive_wet_sand", elem1: null, chance:0.25 }, //Substitution table radioactiveObject = { dirt: "radioactive_dirt", dry_dirt: "radioactive_dry_dirt", molten_dirt: "molten_radioactive_dirt", glass: "radioactive_glass", molten_glass: "molten_radioactive_glass", glass_shard: "radioactive_glass_shard", sand: "radioactive_sand", mud: "radioactive_mud", wet_sand: "radioactive_wet_sand", water: "radioactive_water", permafrost: "radioactive_permafrost", dry_permafrost: "radioactive_dry_permafrost", mudstone: "radioactive_mudstone", packed_sand: "radioactive_packed_sand", ice: "radioactive_ice", snow: "radioactive_snow", packed_snow: "radioactive_packed_snow", rain_cloud: "rad_cloud", snow_cloud: "rad_snow_cloud", snow_cloud_floater: "rad_snow_cloud_floater", rock: "radioactive_rock", gravel: "radioactive_gravel", basalt: "radioactive_basalt", magma: "radioactive_magma", sandstone: "radioactive_sandstone", sand_sediment: "radioactive_sand_sediment" }; if(enabledMods.includes("mods/glenn_gases.js")) { radioactiveObject.rock_dust = "radioactive_rock_dust"; }; if(enabledMods.includes("mods/fire_mod.js")) { radioactiveObject.fire = "rad_fire"; radioactiveObject.torch = "rad_torch"; }; if(enabledMods.includes("mods/structure_test.js")) { radioactiveObject.glass = "rad_glass"; radioactiveObject.glass_pane = "rad_glass_pane"; radioactiveObject.glass_shard = "rad_glass_shard"; }; //Reverse lookup function function getKeyByValue(object, value) { return Object.keys(object).find(key => object[key] === value); } //getKeyByValue code by UncleLaz on StackOverflow: https://stackoverflow.com/questions/9907419/how-to-get-a-key-in-a-javascript-object-by-its-value" //Main elements elements.radioactive_dirt = { color: ["#70762b","#4c5c21","#50571a","#4c6b1e"], behavior: behaviors.RAD_POWDER, tempHigh:110, stateHigh: "radioactive_dry_dirt", reactions: { "dirt": { "elem1":"dirt", "elem2":"radioactive_dirt", "chance":0.0005, "oneway":true }, "dry_dirt": { "elem1":"radioactive_dry_dirt", "elem2":"radioactive_dirt", "chance":0.0005, "oneway":true }, "radioactive_dry_dirt": { "elem1":"radioactive_dry_dirt", "elem2":"radioactive_dirt", "chance":0.0005, "oneway":true }, }, tempLow: -50, stateLow: "radioactive_permafrost", category: "Radioactive", state: "solid", density: 1220, }; elements.radioactive_dry_dirt = { color: ["#8aa85e","#999c5d","#7f8a45","#b5ad59"], behavior: [ "XX|SW:radioactive_dirt%3 AND SW:radioactive_mud%6 AND CR:radiation%2|XX", "AND CR:radiation%2|HT%1.5|CR:radiation%2", "M2|M1 AND CR:radiation%2|M2", ], tempHigh:1200, stateHigh: "molten_radioactive_dirt", tempLow: -50, stateLow: "radioactive_dry_permafrost", category:"land", state: "solid", density: 1100, }, elements.molten_radioactive_dirt = { "behavior": behaviors.RAD_MOLTEN, "hidden": true, "state": "liquid", "category": "Radioactive", "color": ["#e09315", "#e07615", "#e05800", "#987310", "#985c10", "#984500", "#a06c0d", "#a0570d", "#a04100", "#98850f", "#986b0f", "#985000"], "temp": 1250, "tempLow": 1100, "stateLow": "radioactive_dirt", "density": 1098, "viscosity": 10000 } elements.radioactive_glass = { color: ["#597a58","#719171"], colorOn: ["#6dab67","#88b567"], behavior: behaviors.RAD_WALL, tempHigh: 1500, category: "solids", state: "solid", density: 2500, breakInto: "radioactive_glass_shard", conduct: 0.01, }; elements.molten_radioactive_glass = { behavior: behaviors.RAD_MOLTEN, category: "Radioactive", }; elements.radioactive_glass_shard = { color: ["#597a58","#719171", "#628263"], colorOn: ["#6dab67","#88b567", "#7bad6f"], behavior: behaviors.RAD_POWDER, tempHigh: 1500, stateHigh: "molten_radioactive_glass", category: "powders", state: "solid", density: 2500, conduct: 0.01, }; elements.radioactive_sand = { color: "#cbdb7b", behavior: behaviors.RAD_POWDER, tempHigh: 1700, stateHigh: "molten_radioactive_glass", category: "Radioactive", state: "solid", density: 1602 }; elements.radioactive_mud = { color: "#3c401c", behavior: behaviors.RAD_STURDYPOWDER, reactions: { "dry_dirt": { "elem1": "radioactive_dirt", "elem2": "radioactive_dirt", chance: 0.06 }, "radioactive_dirt": { "elem1":"radioactive_dirt", "elem2":"radioactive_mud", "chance":0.0005, "oneway":true }, "radioactive_sand": { "elem1":"radioactive_dirt", "elem2":"radioactive_wet_sand", "chance":0.0005, "oneway":true }, "sand": { "elem1":"radioactive_dirt", "elem2":"radioactive_wet_sand", "chance":0.0005, "oneway":true }, "dirt": { "elem1":"radioactive_dirt", "elem2":"radioactive_mud", "chance":0.0005, "oneway":true }, }, tempHigh: 100, stateHigh: "radioactive_mudstone", tempLow: -50, stateLow: "radioactive_permafrost", category: "Radioactive", state: "solid", density: 1730, stain: 0.02, }; elements.radioactive_wet_sand = { color: ["#848c3a","#969e4c"], behavior: behaviors.RAD_STURDYPOWDER, reactions: { "radioactive_sand": { "elem1":"radioactive_sand", "elem2":"radioactive_wet_sand", "chance":0.0005, "oneway":true }, "radioactive_dirt": { "elem1":"radioactive_sand", "elem2":"radioactive_mud", "chance":0.0005, "oneway":true }, "sand": { "elem1":"radioactive_sand", "elem2":"radioactive_wet_sand", "chance":0.0005, "oneway":true }, "dirt": { "elem1":"radioactive_sand", "elem2":"radioactive_mud", "chance":0.0005, "oneway":true }, "wet_sand": { "elem1":"radioactive_sand", "elem2":"radioactive_sand_sediment", "chance":0.0005, "oneway":true }, "sand_sediment": { "elem1":"radioactive_sand", "elem2":"radioactive_sand_sediment", "chance":0.0005, "oneway":true }, "radioactive_wet_sand": { "elem1":"radioactive_sand", "elem2":"radioactive_sand_sediment", "chance":0.0005, "oneway":true }, "radioactive_sand_sediment": { "elem1":"radioactive_sand", "elem2":"radioactive_sand_sediment", "chance":0.0005, "oneway":true }, }, tempHigh: 100, stateHigh: "radioactive_packed_sand", category: "Radioactive", state: "solid", density: 1905, }; elements.radioactive_sandy_water = { color: ["#84A244", "#90AE50"], behavior: behaviors.RAD_LIQUID, tempHigh: 100, stateHigh: ["rad_steam","rad_steam","radioactive_sand"], //tempLow: 0, //stateLow: "radioactive_sandy_ice", category: "Radioactive", heatCapacity: 4.184, //unimplemented reactions: { "dirt": { // React with (water reacts with dirt to make mud) "elem1": [null,null,"radioactive_wet_sand"], // First element transforms into; in this case, water deletes itself "elem2": "radioactive_mud", // Second element transforms into; in this case, dirt turns to mud }, "radioactive_dirt": { // React with (water reacts with dirt to make mud) "elem1": [null,null,"radioactive_wet_sand"], // First element transforms into; in this case, water deletes itself "elem2": "radioactive_mud", // Second element transforms into; in this case, dirt turns to mud }, "water": { "elem1":"radioactive_water", "elem2":"radioactive_sandy_water", "chance":0.025 }, "radioactive_water": { "elem1":"radioactive_water", "elem2":"radioactive_sandy_water", "chance":0.025 }, "sand": { "elem1": [null,null,"radioactive_wet_sand"], "elem2": "radioactive_wet_sand", }, "radioactive_sand": { "elem1": [null,null,"radioactive_wet_sand"], "elem2": "radioactive_wet_sand", }, "sandy_water": { "elem1":"radioactive_wet_sand", "elem2":"radioactive_sand_sediment", "chance": 0.001 }, "radioactive_sandy_water": { "elem1":"radioactive_wet_sand", "elem2":"radioactive_sand_sediment", "chance": 0.001 }, "wet_sand": { "elem1": "radioactive_water", "elem2":"radioactive_sand_sediment", "chance": 0.0005 }, "radioactive_wet_sand": { "elem1": "radioactive_water", "elem2":"radioactive_sand_sediment", "chance": 0.0005 }, /*"salt": { "elem1": "salt_water", "elem2": null }, "sugar": { "elem1": "sugar_water", "elem2": null, }, "dust": { "elem1": "dirty_water", "elem2": null, }, "ash": { "elem1": "dirty_water", "elem2": null, }, "cyanide": { "elem1": "dirty_water", "elem2": null, }, "carbon_dioxide": { "elem1": "seltzer", "elem2": null, "oneway":true }, "sulfur": { "elem1": "dirty_water", "elem2": null, }, "rat": { "elem1": "dirty_water", chance:0.005 }, "plague": { "elem1": "dirty_water", "elem2": null, }, "rust": { "elem1": "dirty_water", chance:0.005 }, "fallout": { "elem1": "dirty_water", chance:0.25 }, "radiation": { "elem1": "dirty_water", chance:0.25 }, "uranium": { "elem1": "dirty_water", chance:0.25 }, "rotten_meat": { "elem1": "dirty_water", chance:0.25 }, "quicklime": { "elem1": [null,null,"wet_sand"], "elem2": "slaked_lime", }, "rock": { "elem2": "wet_sand", "chance": 0.00035 }, "ruins": { "elem2": "rock", "chance": 0.00035 },*/ "mudstone": { "elem2": "radioactive_mud", "chance": 0.00035 }, "radioactive_mudstone": { "elem2": "radioactive_mud", "chance": 0.00035 }, //"methane": { "elem1":"primordial_soup", "elem2":"primordial_soup", tempMin:60, charged:true }, //"ammonia": { "elem1":"primordial_soup", "elem2":"primordial_soup", tempMin:60, charged:true }, "fly": { "elem2":"dead_bug", "chance":0.1, "oneway":true }, "firefly": { "elem2":"dead_bug", "chance":0.1, "oneway":true }, "bee": { "elem2":"dead_bug", "chance":0.05, "oneway":true }, "stink_bug": { "elem2":"dead_bug", "chance":0.1, "oneway":true }, }, state: "liquid", density: 1097, conduct: 0.02, stain: 0.01, } elements.radioactive_sand_sediment = { hidden: true, color: "#afd182", hardness: 0.2, behavior: [ "XX|XX|XX", "XX|XX|XX", "SW:wet_sand,radioactive_wet_sand%1.5 AND M2|SW:wet_sand,radioactive_wet_sand%2.5 AND M1|SW:wet_sand,radioactive_wet_sand%1.5 AND M2" ], reactions: { "water": { "elem1":"radioactive_sandy_water", "elem2":"radioactive_sandy_water", "chance":0.025 }, "radioactive_water": { "elem1":"radioactive_sandy_water", "elem2":"radioactive_sandy_water", "chance":0.025 }, "sand": { "elem1": [null,null,"radioactive_wet_sand"], "elem2": "radioactive_wet_sand", }, "radioactive_sand": { "elem1": [null,null,"radioactive_wet_sand"], "elem2": "radioactive_wet_sand", }, "sandy_water": { "elem1":["radioactive_water","radioactive_water","radioactive_sand_sediment"], "chance":0.001 }, "radioactive_sandy_water": { "elem1":["radioactive_water","radioactive_water","radioactive_sand_sediment"], "chance":0.001 }, "wet_sand": { "elem2": "radioactive_sand_sediment", "chance": 0.0005 }, "radioactive_wet_sand": { "elem2": "radioactive_sand_sediment", "chance": 0.0005 }, }, tempHigh: 1700, stateHigh: "molten_radioactive_glass", category: "Radioactive", state: "solid", density: 1602, breakInto: "radioactive_sand", tick: function(pixel) { sedimentation(pixel,sandstoneLithificationElements,"radioactive_sandstone") }, } elements.radioactive_sandstone = { color: ["#85b357", "#b5d177", "#9cd184", "#7bc25f"], behavior: behaviors.RAD_WALL, tempHigh: 1500, stateHigh: "molten_radioactive_glass", category: "Radioactive", state: "solid", density: 2323, //wide range hardness: 0.5, breakInto: "radioactive_sand", } elements.radioactive_water = { color: "#85cf57", behavior: behaviors.RAD_LIQUID, tempHigh: 100, stateHigh: ["rad_steam","rad_steam","fallout"], tempLow: -5, stateLow: "radioactive_ice", category: "Radioactive", heatCapacity: 4.184, reactions: { "water": { elem1: "water", elem2: "radioactive_water", chance:0.05 }, //swap "dirt": { // React with (water reacts with dirt to make mud) "elem1": null, // First element transforms into; in this case, water deletes itself "elem2": "radioactive_dirt", // Second element transforms into; in this case, dirt turns to mud }, "dry_dirt": { "elem1": null, "elem2": "radioactive_dirt", }, "radioactive_dirt": { "elem1": null, "elem2": "radioactive_dirt", }, "sand": { "elem1": null, "elem2": "radioactive_wet_sand", }, "wet_sand": { "elem1": "radioactive_sandy_water", "elem2": ["radioactive_wet_sand","radioactive_wet_sand","radioactive_wet_sand","radioactive_wet_sand","radioactive_wet_sand",null], chance: 0.01 }, "radioactive_wet_sand": { "elem1": "radioactive_sandy_water", "elem2": ["radioactive_wet_sand","radioactive_wet_sand","radioactive_wet_sand","radioactive_wet_sand","radioactive_wet_sand",null], chance: 0.01 }, "rat": { "elem2": "rotten_meat", chance:0.005 }, "plague": { "elem2": null, chance: 0.3, }, //"quicklime": { "elem1": null, "elem2": "slaked_lime", }, "rock": { "elem2": "radioactive_wet_sand", "chance": 0.00035 }, //"ruins": { "elem2": "rock", "chance": 0.00035 }, "mudstone": { "elem2": "radioactive_mud", "chance": 0.00035 }, "radioactive_mudstone": { "elem2": "radioactive_mud", "chance": 0.00035 }, "packed_sand": { "elem2": "radioactive_wet_sand", "chance": 0.00035 }, "radioactive_packed_sand": { "elem2": "radioactive_wet_sand", "chance": 0.00035 }, "fly": { "elem2":"dead_bug", "chance":0.1, "oneway":true }, "firefly": { "elem2":"dead_bug", "chance":0.1, "oneway":true }, "bee": { "elem2":"dead_bug", "chance":0.05, "oneway":true }, "stink_bug": { "elem2":"dead_bug", "chance":0.1, "oneway":true }, }, state: "liquid", density: 997, conduct: 0.03, stain: 0.02, } elements.rad_steam.behavior = behaviors.RAD_GAS; elements.rad_steam.stateLow = "radioactive_water"; elements.rad_cloud.behavior = [ "XX|XX|XX", "XX|CH:fallout,radiation,radioactive_water%0.025|M1%2.5 AND BO", "CR:radiation%0.05|CR:radiation%0.05|CR:radiation%0.05", ]; elements.rad_cloud.tempLow = 0; elements.rad_cloud.stateLow = "rad_snow_cloud"; elements.fallout.behavior = behaviors.RAD_POWDER; elements.radioactive_permafrost = { color: ["#51613d","#495234","#3b4a30","#4a4f35"], behavior: behaviors.RAD_SUPPORT, temp: -50, tempHigh: 10, stateHigh: "radioactive_mudstone", category: "Radioactive", state: "solid", density: 700, }; elements.radioactive_dry_permafrost = { color: ["#6e9970","#64756a","#4e7864", "#5f8a78"], behavior: behaviors.POWDER, //not enough water for cementing temp: -50, tempHigh: 10, stateHigh: "radioactive_dry_dirt", category: "land", state: "solid", state: "solid", density: 1200, } elements.radioactive_mudstone = { color: "#4f5e25", behavior: behaviors.RAD_SUPPORT, tempHigh:1200, stateHigh: "molten_radioactive_dirt", tempLow: -50, stateLow: "radioactive_permafrost", category: "Radioactive", state: "solid", density: 1250, breakInto: "radioactive_dirt", }; elements.radioactive_packed_sand = { color: "#79945c", behavior: behaviors.RAD_SUPPORT, tempHigh: 1700, stateHigh: "molten_radioactive_glass", category: "Radioactive", state: "solid", density: 1682, breakInto: "radioactive_sand", }; elements.radioactive_ice = { color: "#b7e0b4", behavior: behaviors.RAD_WALL, temp: 0, tempHigh: 5, stateHigh: "radioactive_water", category: "solids", state: "solid", density: 917, breakInto: "radioactive_snow", }; elements.radioactive_snow = { color: "#d5f2d3", behavior: behaviors.RAD_POWDER, temp: 0, tempHigh: 5, tempLow: -100, stateLow: "radioactive_packed_snow", stateHigh: "radioactive_water", category: "Radioactive", state: "solid", density: 100, }; elements.radioactive_packed_snow = { color: "#a7d4a3", behavior: behaviors.RAD_SUPPORTPOWDER, temp: 0, tempHigh: 20, tempLow: -200, stateLow: "radioactive_ice", stateHigh: "radioactive_water", category: "Radioactive", state: "solid", density: 400, hidden: true, }; elements.rad_snow_cloud = { color: ["#2d6e31","#416e21"], behavior: [ "XX|XX|XX", "XX|CH:fallout,radiation,radioactive_snow%0.025|M1%2.5 AND BO", "CR:radiation%0.05|CR:radiation%0.05|CR:radiation%0.05", ], category:"Radioactive", hidden: true, state: "gas", density: 0.5, ignoreAir: true, temp: -20, tempHigh: 0, stateHigh: "rad_cloud", }; elements.rad_snow_cloud_floater = { color: ["#2d6e31","#416e21"], behavior: [ "M2|M1|M2", "M1%80|CH:rad_snow_cloud_%0.2|M1%80", "M%60|XX|M2%60", ], reactions: { "rad_snow_cloud_floater": { elem1: "rad_snow_cloud", elem2: "rad_snow_cloud", chance: 0.003 }, "rad_snow_cloud": { elem1: "rad_snow_cloud", elem2: "rad_snow_cloud", chance: 0.01 } }, category:"Radioactive", hidden: true, state: "gas", density: 0.5, temp: -20, tempHigh: 0, stateHigh: "rad_cloud", }; elements.radioactive_rock = { color: ["#768063","#444f3f","#7a9476"], behavior: behaviors.RAD_POWDER, tempHigh: 950, stateHigh: "radioactive_magma", category: "Radioactive", state: "solid", density: 2550, hardness: 0.5, breakInto: ["radioactive_sand","radioactive_gravel"], }; elements.radioactive_gravel = { color: ["#d1e3c8","#a6b090","#657360","#4d523f"], behavior: behaviors.RAD_POWDER, category: "Radioactive", tempHigh: 950, stateHigh: "radioactive_magma", state: "solid", density: 1680, hardness: 0.2, breakInto: "radioactive_sand", }; elements.radioactive_basalt = { color: ["#262e20","#23331f","#3f4235"], behavior: behaviors.RAD_STURDYPOWDER, tempHigh: 1262.5, stateHigh: "radioactive_magma", category: "Radioactive", state: "solid", density: 3000, hardness: 0.65, breakInto: "radioactive_gravel", }; elements.radioactive_magma = { color: ["#ff9100","#ffae00","#ff8400"], behavior: behaviors.RAD_MOLTEN, reactions: { "ice": { "elem1": "radioactive_basalt" }, "radioactive_ice": { "elem1": "radioactive_basalt" }, "magma": { "elem1":"magma", "elem2":"radioactive_magma", "chance":0.0005, "oneway":true }, }, temp: 1500, tempLow: 850, stateLow: ["radioactive_basalt","radioactive_basalt","radioactive_basalt","radioactive_rock"], viscosity: 5000, category: "Radioactive", state: "liquid", density: 2725, }; //(Just for fun) elements.super_irradiator = { color: "#66ee33", tick: function(pixel) { var twentiethOfTemp = pixel.temp / 20; var roundOf20th = Math.round(twentiethOfTemp); var boundedR20 = Math.max(1,Math.min(roundOf20th,11)); transformAround(pixel,boundedR20,radioactiveObject) }, category:"machines", insulate: true, state: "solid", }; elements.super_deirradiator = { color: "#dd33ee", tick: function(pixel) { var twentiethOfTemp = pixel.temp / 20; var roundOf20th = Math.round(twentiethOfTemp); var boundedR20 = Math.max(1,Math.min(roundOf20th,11)); transformAround(pixel,boundedR20,radioactiveObject,reverse=true) }, category:"machines", insulate: true, state: "solid", }; elements.liquid_irradium = { color: "#5499FF", behavior: behaviors.RAD_LIQUID, tick: function(pixel) { for(i = 0; i < adjacentCoords.length; i++) { transformAdjacent(pixel,radioactiveObject) } }, //Becomes rainbow sand by water or poison, as well as by protocite, or bio-ooze //Becomes sulfuric acid on contact with it //Becomes corrupt slime by elder fluid //Converts black tar and organic soup into itself //Turns either grav liquid into aether dust, as well as liquid crystal //Turns blood into bloodstone //Turns blue slime into black slime //Made by {mercury or bio-ooze} and protocite category:"liquids", state: "liquid", density: 18180, //Cherry-picked from a Tumblr headcanon //https://omniblog-of-starbound.tumblr.com/post/188424072728/starbound-element-headcannon-modded-metals viscosity: 80.1, //probably misinterpreting tickDelta, and w/o the game assets, I can't compare against water, so this is in relation to H2SO4 scaled to its density in cP and under the assumption that water visc = 1 }; //Inter-mod compatibility if(enabledMods.includes("mods/some_tf_liquids.js")) { elements.radioactive_basalt_gravel = { color: ["#394d37", "#3b452f", "#3f452a", "#2d3d2c"], behavior: behaviors.RAD_POWDER, tempHigh: 1262.5, stateHigh: "radioactive_magma", category: "Radioactive", state: "solid", density: 1975, hardness: 0.26, } elements.radioactive_basalt.breakInto = "radioactive_basalt_gravel"; }; //Worldgen preset for testing worldgentypes.radioactive_sandstone_test_ocean = { layers: [ [0.9, "radioactive_wet_sand", 0.2], [0.9, "radioactive_sand", 0.2], [0.8, "radioactive_sandy_water", 0.7], [0.25, "radioactive_water"], [0.1, "radioactive_sand", 0.1], [0.1, "clay", 0.1], [0.1, "radioactive_gravel", 0.2], [0.1, "radioactive_wet_sand"], [0.03, "radioactive_gravel", 0.5], [0.03, "radioactive_rock"], [0, "radioactive_basalt"], ] }; /*/Water irradiation reactions (must be done last) waterIrradiationExclusionArray = ["radioactive_water", "radioactive_wet_sand"] filteredWaterIrradiationArray = Object.keys(elements).filter(function(e) { return elements[e].category === "Radioactive" && (!waterIrradiationExclusionArray.includes(e)); }); for(i = 0; i < filteredWaterIrradiationArray.length; i++) { elements.water.reactions[filteredWaterIrradiationArray[i]] = { "elem1":"radioactive_water", chance: 0.01 } };*/ //Generation //TNT world //Supplementary elements elements.oil_cloud = { color: "#8c4331", behavior: [ "XX|XX|XX", "XX|CH:oil%0.05|M1%2.5 AND BO", "XX|XX|XX", ], category:"gases", temp: 30, state: "gas", density: 0.5, burn: 60, burnTime: 15, burnInto: "explosion", //atomization moment ignoreAir: true, stain: 0.02, }; elements.oil_cloud_floater = { color: "#8c4331", behavior: [ "M2|M1|M2", "M1%80|CH:oil_cloud%0.2|M1%80", "M%60|XX|M2%60", ], reactions: { "oil_cloud_floater": { elem1: "oil_cloud", elem2: "oil_cloud", chance: 0.003 }, "oil_cloud": { elem1: "oil_cloud", elem2: "oil_cloud", chance: 0.01 } }, category:"gases", temp: 30, //otherwise identical state: "gas", density: 0.5, burn: 60, burnTime: 15, burnInto: "explosion", //atomization moment stain: 0.02, }; //Main preset worldgentypes.tnt_world = { name: "TNT World", //unimplemented layers: [ [0.9, "oil_cloud_floater"], [0.65, "coal", 0.1], [0.65, "nitroglycerin"], [0.55, "nitroglycerin", 0.5], [0.2, "coal", 0.2], [0.2, "tnt"], [0.05, "coal", 0.3], [0.05, "c4"], [0.0, "coal", 0.4], [0.0, "lamp_oil"] ] }; //Inter-mod compatibility runAfterLoad(function() { if(enabledMods.includes("mods/glenn_gases.js")) { worldgentypes.tnt_world.layers.unshift([0.9, "red_gas", 0.50]) }; }); //Ice world //Supplementary elements elements.snow_cloud_floater = { color: "#7e8691", behavior: [ "M2|M1|M2", "M1%80|CH:snow_cloud%0.2|M1%80", "M%60|XX|M2%60", ], reactions: { "snow_cloud_floater": { elem1: "snow_cloud", elem2: "snow_cloud", chance: 0.003 }, "snow_cloud": { elem1: "snow_cloud", elem2: "snow_cloud", chance: 0.01 } }, category:"gases", temp:-10, tempHigh:30, stateHigh:"rain_cloud", tempLow:-200, stateLow:"hail_cloud", state:"gas", density:0.55, conduct:0.01, movable:true, isGas:true }; //Main preset worldgentypes.ice = { layers: [ //[0.95, "snow_cloud_floater"], //le cutting room floor has arrived [0.9, "snow"], [0.65, "ice"], [0.6, "gravel"], [0.35, "permafrost"], [0, "rock"] ], temperature: -20 }; //Nuclear wasteland //Elements defined above //Main preset worldgentypes.nuclear_wasteland = { layers: [ [0.9, "smoke", 0.5], [0.9, "rad_snow_cloud_floater", 0.75], [0.82, "fallout", 0.4], [0.7, "liquid_irradium", 0.05], [0.7, "dead_plant", 0.12], [0.55, "radioactive_dirt"], [0.45, "radioactive_rock"], [0.25, "uranium", 0.4], [0.35, "radioactive_rock", 0.5], [0.3, "radioactive_gravel", 0.5], [0.2, "uranium", 0.2], [0.05, "rock"], [0, "basalt"], ], temperature: -5 //nuclear winter }; //Dark world worldgentypes.dark = { layers: [ [0.8, "carbon_dioxide"], [0.65, "ink"], [0.5, "charcoal"], [0, "basalt"] ] }; //Money world worldgentypes.money = { layers: [ [0.9, "emerald"], [0.6, "diamond"], [0.3, "gold_coin"], [0.1, "ruby", 1/3], [0.1, "amethyst", 1/2], [0.1, "sapphire"], [-0.1, "pearl", 0.4], [-0.1, "onyx"] ] }; //Star world //If GWSN can have a decidedly Earth-y name and a space concept, then I should be able to do the same //Supplementary elements elements.liquid_stellar_plasma = { color: "#ffffbd", colorOn: "#ffffbd", behavior: [ "XX|M2%5 AND CR:plasma%1|XX", "M2|XX|M2", "M1|M1|M1", ], behaviorOn: [ "XX|M2%10 AND M1%0.5 AND CR:plasma%2.3|XX", "M2|XX|M2", "M1|M1|M1", ], tick: function(pixel) { almostSun(pixel,0.6,stellarPlasmaSpreadWhitelist); }, temp:5500, isGas: true, tempLow:2300, stateLow: "plasma", category: "liquids", state: "liquid", density: 1000, //density actually depends on depth in the star: https://astronomy.stackexchange.com/a/32734 conduct: 0.5, }; elements.stellar_plasma = { color: "#ffffbd", colorOn: "#ffffbd", behavior: [ "M2|M1 AND CR:plasma%0.6|M2", "M1 AND CR:plasma%0.6|XX|M1 AND CR:plasma%0.6", "M2|M1 AND CR:plasma%0.6|M2", ], behaviorOn: [ "M2|M1 AND CR:plasma%1|M2", "M1 AND CR:plasma%1|XX|M1 AND CR:plasma%1", "M2|M1 AND CR:plasma%1|M2", ], tick: function(pixel) { almostSun(pixel,0.5,stellarPlasmaSpreadWhitelist); }, temp:5500, tempLow:2300, stateLow: "plasma", category: "gases", state: "gas", density: 10, conduct: 0.5, }; elements.neutron_star = { color: "#e9eaf7", colorOn: "#ffffbd", behavior: [ "XX|CR:neutron%0.1|XX", //no neutrinos though "CR:neutron%0.1|XX|CR:neutron%0.1", "XX|CR:neutron%0.1|XX" ], tick: function(pixel) { nsTick(pixel,0.7,stellarPlasmaSpreadWhitelist); }, temp: 1e12, category: "special", state: "gas", density: 1e17, insulate: true, conduct: 1, }; elements.liquid_degenerate_neutronium = { color: "#e9eaf7", behavior: [ "XX|M2%5 AND CR:neutron%0.6|XX", "M2|XX|M2", "M1|M1|M1", ], behaviorOn: [ "XX|M2%10 AND M1%0.5 AND CR:neutron%1.2|XX", "M2|XX|M2", "M1|M1|M1", ], tick: function(pixel) { nsTick(pixel,0.7,stellarPlasmaSpreadWhitelist); }, temp:1e6, isGas: true, tempLow:2300, stateLow: elements.liquid_neutronium ? "liquid_neutronium" : "neutron", category: "liquids", state: "liquid", density: 100000, //i'm not doing any more research on these neutron stars because google is useless conduct: 1, }; elements.gaseous_degenerate_neutronium = { color: "#e9eaf7", behavior: [ "M2|M1 AND CR:neutron%0.6|M2", "M1 AND CR:neutron%0.6|XX|M1 AND CR:neutron%0.6", "M2|M1 AND CR:neutron%0.6|M2", ], behaviorOn: [ "M2|M1 AND CR:neutron%1|M2", "M1 AND CR:neutron%1|XX|M1 AND CR:neutron%1", "M2|M1 AND CR:neutron%1|M2", ], tick: function(pixel) { nsTick(pixel,0.6,stellarPlasmaSpreadWhitelist); }, temp:1e6, isGas: true, tempLow:2300, stateLow: "neutron", category: "gases", state: "gas", density: 10000, //i'm not doing any more research on these neutron stars because google is useless conduct: 1, }; if(enabledMods.includes("mods/chem.js")) { elements.supernova.behavior = [ "XX|XX|XX", "XX|EX:80>plasma,plasma,plasma,plasma,plasma,plasma,plasma,plasma,plasma,plasma,molten_iron,molten_uranium,molten_lead AND CH:neutron_star,neutron_star,neutron_star,neutronium,quark_matter,void|XX", "XX|XX|XX", ] }; elements.plasma.noConduct = ["stellar_plasma","liquid_stellar_plasma","liquid_degenerate_neutronium","gaseous_degenerate_neutronium","neutron_star"]; //I can't suppress the charge overlay and keep the tick color, only effective with noConduct.js but not strictly required //Main preset worldgentypes.star = { layers: [ [0.9, "stellar_plasma"], [0.65, "liquid_stellar_plasma"], [0.4, "liquid_stellar_plasma", 1/2], [0, "sun"], ], complexity: 100, baseHeight: 0.3, temperature: 6500, }; //Radioactive Desert //Main preset worldgentypes.nuclear_wasteland_desert = { layers: [ [0.97, "fallout", 0.4], [0.95, "radioactive_gravel", 0.6], [0.65, "liquid_irradium", 0.01], [0.65, "cancer", 0.02], [0.65, "bone", 0.02], [0.65, "radioactive_sand"], [0.55, "cancer", 0.01], [0.55, "bone", 0.01], [0.3, "radioactive_sandstone"], [0.05, "radioactive_rock"], [-0.78, "radioactive_basalt"] ], temperature: -13 }; };