diff --git a/mods/a_mod_by_alice.js b/mods/a_mod_by_alice.js index 7c7b0582..1c67752c 100644 --- a/mods/a_mod_by_alice.js +++ b/mods/a_mod_by_alice.js @@ -5734,6 +5734,13 @@ color1 and color2 spread through striped paint like dye does with itself. col } function tryMove(pixel,nx,ny,leaveBehind,force) { if(!pixel) { return false }; + if ((typeof(pixel.tempDrag) !== "undefined") && (!force)) { + if(typeof(pixel.tempDrag) === "number" && pixel.tempDrag >= pixelTicks) { + return true + } else { + delete pixel.tempDrag + } + }; if (pixel.drag && !force) { return true; } var info = elements[pixel.element]; var oob = outOfBounds(nx,ny); @@ -8606,13 +8613,13 @@ color1 and color2 spread through striped paint like dye does with itself. col for (var i = 0; i < targets.length; i++) { var newPixel = pixelMap[targets[i][0]]?.[targets[i][1]]; if ((!newPixel) || newPixel.del) { continue }; - if((newPixel.element == pixel.element) || ((newPixel.x == pixel.x) && (newPixel.y == pixel.y))) { continue }; - newPixel.drag = true; + if(((newPixel.element == pixel.element) || (elements[pixel.element].ignore && elements[pixel.element].ignore.includes(newPixel.element))) || ((newPixel.x == pixel.x) && (newPixel.y == pixel.y))) { continue }; + newPixel.tempDrag = pixelTicks + 1; var [mX, mY] = [pixel.x, pixel.y]; var distanceComplement = (range / 2) - pyth(mX,mY,newPixel.x,newPixel.y); var distanceProportion = 0.2 + (distanceComplement / (range / 2)); var distanceModifier = distanceProportion ** 2; - var pullCount = (4 * distanceModifier) * (commonMovableCriteria(pixel.element) ? 1 : 0.8); + var pullCount = (4 * distanceModifier) * (commonMovableCriteria(newPixel.element) ? 1 : 0.8); var pullCountIntegerPart = Math.floor(pullCount); var pullCountFractionalPart = pullCount % 1; var truePullCount = Math.min(3,pullCountIntegerPart + (Math.random() < pullCountFractionalPart)); @@ -8649,7 +8656,76 @@ color1 and color2 spread through striped paint like dye does with itself. col state: undefined, density: 1797.69313486e305, //about as close to Infinity as we can serializably get category: "special", - hardness: 1 + hardness: 1, + ignore: ["amba_white_hole"] + }; + + elements.amba_white_hole = { + color: "#ffffff", + maxColorOffset: 0, + excludeRandom: true, + insulate: true, + tick: function(pixel) { + pixel.color = "rgb(255,255,255)"; + var range = (pixel.range ?? 30) * 2; + var targets = mouseRange(pixel.x,pixel.y,range,"circle",true); + shuffleArray(targets); + for (var i = 0; i < targets.length; i++) { + var newPixel = pixelMap[targets[i][0]]?.[targets[i][1]]; + if ((!newPixel) || newPixel.del) { continue }; + if(((newPixel.element == pixel.element) || (elements[pixel.element].ignore && elements[pixel.element].ignore.includes(newPixel.element))) || ((newPixel.x == pixel.x) && (newPixel.y == pixel.y))) { continue }; + newPixel.tempDrag = pixelTicks + 1; + var [mX, mY] = [pixel.x, pixel.y]; + var distanceComplement = (range / 2) - pyth(mX,mY,newPixel.x,newPixel.y); + var distanceProportion = 0.2 + (distanceComplement / (range / 2)); + var distanceModifier = distanceProportion ** 2; + var pullCount = (4 * distanceModifier) * (commonMovableCriteria(newPixel.element) ? 1 : 0.8); + var pullCountIntegerPart = Math.floor(pullCount); + var pullCountFractionalPart = pullCount % 1; + var truePullCount = Math.min(3,pullCountIntegerPart + (Math.random() < pullCountFractionalPart)); + for(var j = 0; j < truePullCount; j++) { + if((pullCountIntegerPart >= 1) && (Math.random() < pullCount / 3)) { tryBreak(newPixel) }; + var x = newPixel.x; + var y = newPixel.y; + var empty = checkForEmptyPixels(x, y); + let bestVal = Math.sqrt(Math.pow(mX - x, 2) + Math.pow(mY - y, 2)); + let best = null; + for (const pixelPair of empty) { + const x_ = x + pixelPair[0]; + const y_ = y + pixelPair[1]; + const c = Math.sqrt(Math.pow(mX - x_, 2) + Math.pow(mY - y_, 2)); + if (c < bestVal) { + bestVal = c; + best = pixelPair; + } + } + if (best) { + var destCoords = [x - best[0], y - best[1]]; + newPixel.vx = -(truePullCount * (best[0])); + newPixel.vy = -(truePullCount * (best[1])); + var moveResult = tryMoveAndReturnBlockingPixel(newPixel, destCoords[0], destCoords[1], undefined, true); + if((moveResult !== true) && !(outOfBounds(...destCoords))) { + swapPixels(newPixel,moveResult); + tryMove(newPixel, destCoords[0] - best[0], destCoords[1] - best[1], undefined, true) + }; + heatNeighbors(newPixel,20); + var a0 = settings.abszero ?? -273.15; + if(pixel.temp >= a0) { + if(pixel.temp <= (a0 + 20)) { + pixel.temp = a0 + } else { + pixel.temp -= 20 + } + } + } + } + } + }, + state: undefined, + density: -(1797.69313486e305), //about as close to -Infinity as we can serializably get + category: "special", + hardness: 1, + ignore: ["amba_black_hole"] }; //ASSORTED RAINBOW VARIANTS ##