sandboxels/mods/Natural_disasters.js

208 lines
5.0 KiB
JavaScript
Raw Normal View History

2024-05-09 19:15:54 -04:00
//mod made by imilkflamingos
function countNeighbors(pixel,target){
var targeted = 0;
for (var i = 0; i < squareCoords.length; i++) {
var coord = squareCoords[i];
var x = pixel.x+coord[0];
var y = pixel.y+coord[1];
if (!isEmpty(x,y, true)) {
var otherPixel = pixelMap[x][y];
if (otherPixel.element == target){
targeted = targeted + 1
}
}
}
return targeted;
}
//made by Fioushemastor
function getDistance(x1, y1, x2, y2) {
return Math.sqrt(Math.pow(x2 - x1, 2) + Math.pow(y2 - y1, 2));
}
function getNearestPixel( posX,posY, targetElement) {
let nearestPixel
let minDistance = Infinity
//the stuff
for (let index in pixelMap) {
for (let pixel of pixelMap[index]) {
if (pixel == undefined) continue;
if (pixel.element == targetElement) {
let distance = getDistance(pixel.x, pixel.y, posX, posY);
if (distance < minDistance) {
minDistance = distance;
nearestPixel = pixel;
}
}
}
}
return nearestPixel
}
// Rest made me
function getRandomInt (min, max) {
return Math.floor(Math.random() * (max - min + 1)) + min;
}
function createEarthQuakeRand() {
const chance = Math.random();
if ( chance <= 0.005 ) {
var randY = getRandomInt(60,85)
var randX = getRandomInt(1,163)
if(isEmpty(randX,randY)) {
createPixel('earthquake',randX,randY)
}
else {
changePixel(pixelMap[randX][randY],'earthquake')
}
}
}
function createTsunamiRand(){
var randX = getRandomInt(1,163)
const ClosestPixel = getNearestPixel(randX,25,'water')
if(ClosestPixel) {
var neighbors = countNeighbors(ClosestPixel,'water')
if (isEmpty(ClosestPixel.x,ClosestPixel.y-1)) {
const chance = Math.random();
if ( chance <= 0.001 && countNeighbors(ClosestPixel,'water') >= 3) {
createPixel('tsunami',ClosestPixel.x,ClosestPixel.y-1)
}
}
}
}
function createWildFireRand(){
var randX = getRandomInt(1,163)
const ClosestPixel = getNearestPixel(randX,25,'plant')
if(ClosestPixel) {
if (!isEmpty(ClosestPixel.x,ClosestPixel.y)) {
const chance = Math.random();
if ( chance <= 0.0005) {
ClosestPixel.burning = true;
}
}
}
}
function createMetorShower(){
}
function createCloud(pixel, type) {
for (let i = 0; i < 70; i++) {
if(isEmpty(pixel.x-i,pixel.y) ) {
createPixel(type,pixel.x-i,pixel.y, );
}
if(isEmpty(pixel.x+i,pixel.y) ) {
createPixel(type,pixel.x+i,pixel.y, );
}
if(isEmpty(pixel.x-i,pixel.y-1) ) {
createPixel(type,pixel.x-i,pixel.y-1, );
}
if(isEmpty(pixel.x+i,pixel.y-1) ) {
createPixel(type,pixel.x+i,pixel.y-1, );
}
if(isEmpty(pixel.x-i,pixel.y+1) ) {
createPixel(type,pixel.x-i,pixel.y+1, );
}
if(isEmpty(pixel.x+i,pixel.y+1) ) {
createPixel(type,pixel.x+i,pixel.y+1, );
}
i+1
}
}
elements.Test_Element = {
hidden: true,
color: "#ff0000",
conduct: 0.1,
category:"test",
behavior: behaviors.WALL,
onSelect: function(pixel){},
tick: function(pixel) {
},
};
elements.Diaster_Spawner = {
maxSize : 1,
color: ["#8D8D8C", "#666666"],
category: "land",
behavior: behaviors.WALL,
properties : {
age: 0,
},
tick : function(pixel) {
const num = getRandomInt(1,3)
if (num == 1) {
createCloud(pixel, 'rain_cloud')
} else if(num == 2){
createCloud(pixel, 'thunder_cloud')
} else {
createCloud(pixel, 'tornado_cloud')
}
if(pixel.age > 100) {
changePixel(pixel,"cloud");
}
pixel.age++
doDefaults(pixel);
},
};
elements.tornado_cloud = {
color: ["#8D8D8C", "#666666"],
category: "land",
state : 'gas',
behavior: [
"XX|XX|XX",
"XX|DL%0.0001|M1%2.5 AND BO",
"XX|XX|XX",
],
tick : function(pixel) {
const chance = Math.random();
if ( chance <= 0.00001) {
if(isEmpty(pixel.x,pixel.y+1)) {
changePixel(pixel,"tornado")
}
}
},
density: 0.4,
ignoreAir: true,
conduct: 0.03
};
function createCloudRand() {
const chance = Math.random();
var randY = getRandomInt(7,19)
if(chance <= 0.001) {
if( isEmpty(83,randY)){
createPixel('Diaster_Spawner',83,randY)
}
}
}
function runEvents(){
if(!paused) {
createEarthQuakeRand();
createTsunamiRand();
createCloudRand();
createWildFireRand();
}
}
runAfterLoad(function() {
RunSimInterval = window.setInterval(runEvents, 75);
});