diff --git a/mods/planet_cracker.js b/mods/planet_cracker.js new file mode 100644 index 00000000..20faaa03 --- /dev/null +++ b/mods/planet_cracker.js @@ -0,0 +1,82 @@ +function planetCrackerHeat(pixel,x,y,radius,fire,smoke,power,damage) { + //console.log(`Radius: ${radius}\nPower: ${power}\nPixel: (${pixel.x},${pixel.y})\nDamage: ${damage}`); + //console.log(`Expected temperature increase for pixel at (${pixel.x},${pixel.y}): ${800 * ((1 + (7 * damage)) ** 2) * ((power ** 2) * 1.5)}`); + var reversedCloseness = ((radius / 6) ** 0.5) - 1; //mathematically inaccurate but properly correlated + + pixel.temp += 500 * ((reversedCloseness * 2) + 1); + if(pixel.vx) { + pixel.vx *= 2; + }; + if(pixel.vy) { + pixel.vy *= 2; + }; +}; + +function planetCrackerFinale(doColorChange=true) { + var bottomFortyPercent = Math.round(height * 0.6); + var bottomTwentyPercent = Math.round(height * 0.8); + var bottomTenPercent = Math.round(height * 0.9); + for(x = 1; x < width; x++) { + for(y = bottomFortyPercent; y < height; y++) { + var chance = y > bottomTwentyPercent ? 0.03 : 0.01 + var radius = y > bottomTwentyPercent ? 8 : 6 + if(enabledMods.includes("velocity.js") && !isEmpty(x,y,true)) { + pixelMap[x][y].vy ??= 0; + pixelMap[x][y].vy -= 20; + }; + if(y > bottomTenPercent && !isEmpty(x,y,true)) { + pixelMap[x][y].temp += 2000; + }; + if(Math.random() < chance) { + explodeAt(x,y,radius,"plasma"); + }; + }; + }; + if(doColorChange) { + if(enabledMods.includes("mods/gradient_background_support.js")) { + settings.bg = ["#000000","#000000","#000000","#000000","#29180e","#663814","#9e6f19","#f7af2a"]; + settings.bgAngle = 90; + } else { + settings.bg = "#642402"; + }; + }; +}; + +elements.planet_cracker = { + color: ["#8f8f8f","3f3f3f"], + behavior: behaviors.WALL, + properties: { + active: true, + counter: 1, + changeTemp: true + }, + tick: function(pixel) { + if(!pixel?.active) { + return; + }; + if(outOfBounds(pixel.x,pixel.y+pixel.counter)) { + planetCrackerFinale(); + pixel.active = false; + changePixel(pixel,"metal_scrap"); + }; + if(pixel.active) { + var pixelDistanceFromBottom = height - pixel.y; + var counterDistanceFromBottom = height - (pixel.y + pixel.counter); + var closenessToBottom = 1 - (counterDistanceFromBottom / pixelDistanceFromBottom); + //console.log(closenessToBottom); + + var finalRadius = Math.round(((1 + closenessToBottom) ** 2) * 6); + + if(typeof(explodeAtPlus) === "function") { + explodeAtPlus(pixel.x,pixel.y+pixel.counter,finalRadius,"plasma","fire",null,planetCrackerHeat,pixel.changeTemp); + } else { + explodeAt(pixel.x,pixel.y+pixel.counter,finalRadius,"plasma"); + }; + pixel.counter++; + }; + }, + state: "solid", + density: 1000, + category: "weapons", + hardness: 1, +};