runAfterLoad(function(){ tryMove = function(pixel,nx,ny,leaveBehind,force) { if (pixel.drag && !force) { return true; } var info = elements[pixel.element]; var oob = outOfBounds(nx,ny); if (isEmpty(nx,ny,false,oob)) { // If coords is empty, move to coords movePixel(pixel,nx,ny,leaveBehind); return true; } else if (!oob) { // Reactions newPixel = pixelMap[nx][ny]; if (info.density !== undefined) { newPixel.pressure = info.density/5000 + (pixel.pressure ? pixel.pressure : 0); } var rr1 = false; if (info.reactions !== undefined && info.reactions[newPixel.element] !== undefined) { rr1 = reactPixels(pixel,newPixel) if (rr1) { return true; } } if (!rr1 && elements[newPixel.element].reactions !== undefined && elements[newPixel.element].reactions[pixel.element] !== undefined && !elements[newPixel.element].reactions[pixel.element].oneway) { if (reactPixels(newPixel,pixel)) { return true; } } // Density if (elements[pixel.element].id !== elements[newPixel.element].id) { if (info.density !== undefined && elements[newPixel.element].density !== undefined) { // if the pixel's state + ">" + newPixel's state is in validDensitySwaps, and the pixel's density is larger than the newPixel's density, swap the pixels if (validDensitySwaps[info.state][elements[newPixel.element].state] && info.density >= elements[newPixel.element].density) { // chance depending on the difference in density if (Math.random() < (info.density - elements[newPixel.element].density)/(info.density + elements[newPixel.element].density)) { swapPixels(pixel,newPixel); return true; } } } } // else { // same-element density swapping // if (info.density !== undefined) { // if (validDensitySwaps[info.state][info.state]) { // if (Math.random() < 0.01) { // swapPixels(pixel,newPixel); // return true; // } // } // } // } } return false; } doVelocity = function(pixel) { if ((pixel.vx||pixel.vy) && elements[pixel.element].movable) { if (pixel.vx) { // move the pixel vx times for (var i = 0; i < Math.floor(Math.abs(pixel.vx)); i++) { var x = pixel.x+Math.sign(pixel.vx); var y = pixel.y; if (!tryMove(pixel,x,y)) { // if (!isEmpty(x,y,true)) { // var newPixel = pixelMap[x][y]; // if (elements[newPixel.element].movable) { // newPixel.vx = (newPixel.vx||0) + pixel.vx - Math.sign(pixel.vx); // if (elements[pixel.element].breakInto && Math.random() 0.9) { if (Array.isArray(fire)) { var newfire = fire[Math.floor(Math.random() * fire.length)]; } else { var newfire = fire; } changePixel(pixel,newfire); continue; } else if (damage > 0.25) { if (info.breakInto !== undefined) { breakPixel(pixel); continue; } else { if (Array.isArray(fire)) { var newfire = fire[Math.floor(Math.random() * fire.length)]; } else { var newfire = fire; } changePixel(pixel,newfire); continue; } } if (damage > 0.75 && info.burn) { pixel.burning = true; pixel.burnStart = pixelTicks; } pixel.temp += damage*radius*power; pixelTempCheck(pixel); // set the pixel.vx and pixel.vy depending on the angle and power if (!elements[pixel.element].excludeRandom) { var angle = Math.atan2(pixel.y-y,pixel.x-x); pixel.vx = Math.round((pixel.vx|0) + Math.cos(angle) * (radius * power)); pixel.vy = Math.round((pixel.vy|0) + Math.sin(angle) * (radius * power)); } } } }