From 40436449adb3e114dcc5d187cd083834ca5ec0f3 Mon Sep 17 00:00:00 2001 From: "Laetitia (O-01-67)" <68935009+O-01-67@users.noreply.github.com> Date: Sat, 10 Dec 2022 17:53:56 -0500 Subject: [PATCH] Haseulite MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Turns "Loona" into an ore of a green metal called "Haseulite". • Haseulite absorbs *something* from (in increasing order) light, radiation, fire, rad_fire, or plasma, as well as from nearby explosions. • If it absorbs too much, the haseulite will explode cryogenically. • "Haseulite Vent" vents this out of the haseulite, releasing cold fire. - They can be formed by treating steel with powdered haseulite at 1200°C. • If it is somehow ignited, it burns green. --- mods/haseulite.js | 308 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 308 insertions(+) create mode 100644 mods/haseulite.js diff --git a/mods/haseulite.js b/mods/haseulite.js new file mode 100644 index 00000000..29250091 --- /dev/null +++ b/mods/haseulite.js @@ -0,0 +1,308 @@ +var modName = "mods/haseulite.js"; +var loonaMod = "mods/funny elements 2022-11-15.js"; +var runAfterAutogenMod = "mods/runAfterAutogen and onload restructure.js"; +var explodeAtPlusMod = "mods/explodeAtPlus.js"; +var libraryMod = "mods/code_library.js"; + +if(enabledMods.includes(loonaMod) && enabledMods.includes(runAfterAutogenMod) && enabledMods.includes(explodeAtPlusMod) && enabledMods.includes(libraryMod)) { + //move explodeAt to YG Entertainment's dungeon + + oldExplodeAt = explodeAt; + explodeAt = explodeAtPlus; + haseuliteSpreadWhitelist = ["haseulite","haseulite_powder","molten_haseulite"]; + + function coldExplosionAfterCooling(pixel,x,y,radius,fire,smoke,power,damage) { + pixel.temp -= 2*damage*radius*power; + }; + + elements.loona = { + color: ["#6f7d54","#4f5d34","#7c8a61"], + behavior: behaviors.POWDER, + tempHigh: 1031, + category: "random rocks", + state: "solid", + density: 2466.73, + hardness: 0.56, + breakInto: ["rock","sulfur","loona_gravel","loona_gravel","loona_gravel","haseulite_powder"], + }, + + runAfterAutogen(function() { + elements.loona.stateHigh = ["molten_loona","rock","rock","rock","sulfur_gas","sulfur_gas","molten_haseulite"]; + }); + + elements.loona_gravel = { + color: ["#b3be98","#919a6f","#68744b","#515931"], + behavior: behaviors.POWDER, + tempHigh: 1031, + stateHigh: ["molten_loona","rock","rock","rock","sulfur_gas","sulfur_gas","molten_haseulite"], + category: "random rocks", + state: "solid", + density: 1625.14, + hardness: 0.97, + breakInto: ["rock","sulfur","rock","haseulite_powder"], + }; + + haseuliteValueObject = { + light: 1, + radiation: 4, + fire: [6, "smoke"], + rad_fire: [10, "rad_smoke"], + plasma: [15, "fire"] + }; + + function haseuliteValueSpreading(pixel) { + var randomNeighborOffset = adjacentCoords[Math.floor(Math.random() * adjacentCoords.length)]; + var rX = randomNeighborOffset[0]; + var rY = randomNeighborOffset[1]; + var rfX = pixel.x+rX; + var rfY = pixel.y+rY; + if(!isEmpty(rfX,rfY,true)) { + var rOtherPixel = pixelMap[rfX][rfY]; + var rOtherElement = rOtherPixel.element; + if(haseuliteSpreadWhitelist.includes(rOtherElement)) { + if(typeof(rOtherPixel.value) !== "number") { + rOtherPixel.value = 0; + }; + if(typeof(rOtherPixel) === "undefined" || isEmpty(rfX,rfY,true)) { + return false; + }; + var averageValue = (pixel.value + rOtherPixel.value) / 2; + pixel.value = averageValue; + rOtherPixel.value = averageValue; + }; + }; + return true; + }; + + function haseuliteValueAbsorbency(pixel) { + for(i = 0; i < adjacentCoords.length; i++) { + var oX = adjacentCoords[i][0]; + var oY = adjacentCoords[i][1]; + var fX = pixel.x+oX; + var fY = pixel.y+oY; + if(!isEmpty(fX,fY,true)) { + var otherPixel = pixelMap[fX][fY]; + var otherElement = otherPixel.element; + var otherInfo = elements[otherElement]; + if(haseuliteValueObject[otherElement]) { + if(typeof(otherPixel) === "undefined" || isEmpty(fX,fY,true)) { + return false; + }; + var haseuliteValueData = haseuliteValueObject[otherElement]; + if(haseuliteValueData instanceof Array) { + var finalElement = haseuliteValueData[1]; + if(finalElement instanceof Array) { finalElement = finalElement[Math.floor(Math.random() * finalElement.length)] }; + changePixel(otherPixel,haseuliteValueData[1]); + pixel.value += haseuliteValueData[0]; + } else if(typeof(haseuliteValueData) === "number") { + deletePixel(otherPixel.x,otherPixel.y); + pixel.value += haseuliteValueData[0]; + }; + }; + }; + }; + return true; + }; + + function haseuliteValueFunction(pixel) { + if(typeof(pixel.value) === "undefined") { + pixel.value = 0; + }; + + var oldValue = pixel.value; + if(!haseuliteValueAbsorbency(pixel) || isNaN(pixel.value)) { + pixel.value = oldValue; + }; + + var oldValue = pixel.value; + if(!haseuliteValueSpreading(pixel) || isNaN(pixel.value)) { + pixel.value = oldValue; + }; + } + + function haseulitoidTick(pixel) { + haseuliteValueFunction(pixel); + if(pixel.oldColor === null) { pixel.oldColor = pixel.color }; + pixel.color = lightenColor(pixel.oldColor,pixel.value / 3); + + if(pixel.value >= 350) { + var coldBoomChance = Math.max(0.008 * ((pixel.value - 350) / 100), 0.001); + if(Math.random() < coldBoomChance) { + var coldBoomRadius = Math.min(30,Math.floor(7 + ((pixel.value - 350) / 100))); + explodeAtPlus(pixel.x,pixel.y,coldBoomRadius,"cold_fire","cold_smoke",null,coldExplosionAfterCooling); + }; + }; + } + + elements.haseulite = { + color: ["#3cb00e", "#25d119", "#79f553"], + properties: { + value: 0, + oldColor: null + }, + behavior: behaviors.WALL, + tick: function(pixel) { haseulitoidTick(pixel) }, + excludeVelocity: true, //wall shouldn't move + tempHigh: 1757, + onExplosionBreakOrSurvive: function(pixel,x,y,radius) { + /*power is always radius/10 + r 5: value 7 + r 10: value 14 + r 15: value 28 + r 20: value 56 + r 25: value 112 + r 30: value 224 + */ + pixel.value += (2**(((radius) / 5) - 1) * 7); + }, + category: "solids", + state: "solid", + density: 7550, + hardness: 0.93, + breakInto: "haseulite_powder", + conduct: 0.84, + }; + + if(!elements.steel.reactions) { + elements.steel.reactions = {}; + }; + + elements.steel.reactions.haseulite_powder = { + elem1: "haseulite_vent", + elem2: null, + chance: 0.01, + tempMin: 1200, + }; + + adjacentCoordsInverted = [[0,-1],[0,1],[-1,0],[1,0]]; + + elements.haseulite_vent = { + color: "#88b058", + behavior: behaviors.WALL, + rotatable: true, + desc: "This uses rotation, so just use debug to see the r value. r 0 means it vents haseulite below it upwards, r 1 means it vents haseulite above it downwards, r 2 means it vents left, and r 3 means it vents right.", + tick: function(pixel) { + if(isNaN(pixel.r)) { + pixel.r = 0; + }; + pixel.r = pixel.r % 4; + var coord = adjacentCoords[pixel.r]; + var invertCoord = adjacentCoordsInverted[pixel.r]; + + var fX = pixel.x+coord[0]; + var fY = pixel.y+coord[1]; + + if(!isEmpty(fX,fY,true)) { + var otherPixel = pixelMap[fX][fY]; + var otherElement = otherPixel.element; + var otherInfo = elements[otherElement]; + if(typeof(otherPixel) === "undefined" || isEmpty(fX,fY,true)) { + return false; + }; + if(haseuliteSpreadWhitelist.includes(otherElement)) { + var ventLimit = Math.min(10,Math.floor(1 + (Math.sqrt(Math.max(otherPixel.value,1)) / 2))); + for(i = 1; i <= ventLimit; i++) { + if(otherPixel.value >= 3) { + var fIX = pixel.x+(invertCoord[0] * i); + var fIY = pixel.y+(invertCoord[1] * i); + if(isEmpty(fIX,fIY,false)) { + createPixel("cold_fire",fIX,fIY); + otherPixel.value -= 3; + } else { //if the pixel to place isn't empty + if(!outOfBounds(fIX,fIY)) { //if it isn't OoB + if(pixelMap[fIX][fIY].element !== "cold_fire") { //if it isn't cold fire + break; + }; + } else { //if it is OoB + break; + }; + }; + } else { + break; + }; + }; + }; + }; + return true; + }, + excludeVelocity: true, //wall shouldn't move + tempHigh: elements.steel.tempHigh, + stateHigh: ["molten_steel","haseulite_powder"], + breakInto: ["metal_scrap","haseulite_powder"], + category: "solids", + state: "solid", + density: 7550, + hardness: 0.93, + breakInto: "haseulite_powder", + conduct: 0.84, + } + + elements.haseulite_powder = { + color: ["#5fb33e", "#32ba29", "#63d141"], + properties: { + value: 0, + oldColor: null + }, + tempHigh: 1757, + behavior: behaviors.POWDER, + tick: function(pixel) { haseulitoidTick(pixel) }, + onExplosionBreakOrSurvive: function(pixel,x,y,radius) { + /*power is always radius/10 + r 5: value 7 + r 10: value 14 + r 15: value 28 + r 20: value 56 + r 25: value 112 + r 30: value 224 + */ + pixel.value += (2**(((radius) / 5) - 1) * 7); + }, + stateHigh: "molten_haseulite", + category: "powders", + state: "solid", + hidden: true, + density: 4512, + hardness: 0.7, + conduct: 0.43, + }; + + elements.molten_haseulite = { + color: ["#cbf569","#f1ffd6","#fdffb5", "#fffa99"], + fireColor: ["#08a953", "#2ea332", "#d1e0d3"], + properties: { + value: 0, + oldColor: null + }, + tick: function(pixel) { haseulitoidTick(pixel) }, + onExplosionBreakOrSurvive: function(pixel,x,y,radius) { + /*power is always radius/10 + r 5: value 7 + r 10: value 14 + r 15: value 28 + r 20: value 56 + r 25: value 112 + r 30: value 224 + */ + pixel.value += (2**(((radius) / 5) - 1) * 7); + }, + density: 7214, + hardness: 0.52, + breakInto: "haseulite_gas", + tempHigh: 3100, + conduct: 0.23, + }; + + elements.haseulite_gas = { + color: ["#ffff9d", "#ffffff", "#e9ffe6", "#ffffe5"], + density: 0.289, + hardness: 1, + conduct: 0.13, + }; +} else { + if(!enabledMods.includes(loonaMod)) { enabledMods.splice(enabledMods.indexOf(modName),0,loonaMod) }; + if(!enabledMods.includes(runAfterAutogenMod)) { enabledMods.splice(enabledMods.indexOf(modName),0,runAfterAutogenMod) }; + if(!enabledMods.includes(explodeAtPlusMod)) { enabledMods.splice(enabledMods.indexOf(modName),0,explodeAtPlusMod) }; + if(!enabledMods.includes(libraryMod)) { enabledMods.splice(enabledMods.indexOf(modName),0,libraryMod) }; + localStorage.setItem("enabledMods", JSON.stringify(enabledMods)); + alert(`The "${runAfterAutogenMod}", "${loonaMod}", "${libraryMod}", and "${explodeAtPlusMod}" mods are all required; any missing mods in this list have been automatically inserted (reload for this to take effect).`) +}; \ No newline at end of file