diff --git a/mods/ants.js b/mods/ants.js new file mode 100644 index 00000000..20c742ff --- /dev/null +++ b/mods/ants.js @@ -0,0 +1,137 @@ +// Define food element (simple for ants to carry) +elements.food = { + color: ["#a0522d", "#deb887"], // brownish food + behavior: behaviors.FALL, + category: "items", + state: "solid", + density: 800, +}; + +// Queen ant definition +elements.queen_ant = { + color: ["#a0522d", "#8b4513", "#d2691e"], // brownish shades + behavior: behaviors.WALK, + category: "life", + tempHigh: 50, + tempLow: 0, + state: "solid", + density: 1200, + tick: function(pixel) { + // Move randomly a bit + if (Math.random() < 0.3) { + tryMove(pixel, pixel.x + (Math.random() < 0.5 ? -1 : 1), pixel.y); + } + if (Math.random() < 0.1) { + tryMove(pixel, pixel.x, pixel.y + (Math.random() < 0.5 ? -1 : 1)); + } + + // Lay eggs sometimes (egg will hatch into worker or male ant) + if (Math.random() < 0.02) { + let x = pixel.x + (Math.random() < 0.5 ? -1 : 1); + let y = pixel.y + 1; + if (isEmpty(x, y)) { + createPixel("ant_egg", x, y); + } + } + } +}; + +// Egg element that hatches into worker or male ant +elements.ant_egg = { + color: ["#f5deb3", "#deb887"], + behavior: behaviors.WALL, + category: "life", + tempHigh: 50, + tempLow: 0, + state: "solid", + density: 500, + tick: function(pixel) { + // Hatch after some time randomly + if (pixel.age > 100 && Math.random() < 0.1) { + // 80% worker, 20% male + if (Math.random() < 0.8) { + changePixel(pixel, "worker_ant"); + } else { + changePixel(pixel, "male_ant"); + } + } else { + pixel.age = (pixel.age || 0) + 1; + } + } +}; + +// Worker ant tries to stay near queen and bring food +elements.worker_ant = { + color: ["#000000", "#333333"], + behavior: behaviors.WALK, + category: "life", + tempHigh: 50, + tempLow: 0, + state: "solid", + density: 1000, + hasFood: false, + tick: function(pixel) { + // Try to find queen nearby (within 5 blocks) + let queenNearby = false; + for(let dx=-5; dx<=5; dx++) { + for(let dy=-5; dy<=5; dy++) { + let target = pixelMap[pixel.x + dx]?.[pixel.y + dy]; + if (target && target.element === "queen_ant") { + queenNearby = true; + // If holding food, deliver it (simulate by deleting food) + if(pixel.hasFood && Math.abs(dx) <= 1 && Math.abs(dy) <= 1) { + pixel.hasFood = false; + // You could add some effect here like increase queen health + } else if (!pixel.hasFood) { + // Move towards queen to deliver food + tryMove(pixel, pixel.x + Math.sign(dx), pixel.y + Math.sign(dy)); + } + } + } + } + + // If no queen nearby, wander randomly + if (!queenNearby) { + if (Math.random() < 0.5) { + tryMove(pixel, pixel.x + (Math.random() < 0.5 ? -1 : 1), pixel.y); + } + if (Math.random() < 0.3) { + tryMove(pixel, pixel.x, pixel.y + (Math.random() < 0.5 ? -1 : 1)); + } + } + + // If not carrying food, try to pick up food nearby + if (!pixel.hasFood) { + for(let dx=-1; dx<=1; dx++) { + for(let dy=-1; dy<=1; dy++) { + let nearby = pixelMap[pixel.x + dx]?.[pixel.y + dy]; + if (nearby && nearby.element === "food") { + deletePixel(nearby.x, nearby.y); + pixel.hasFood = true; + } + } + } + } + } +}; + +// Male ant with small wings (color difference) +elements.male_ant = { + color: ["#8b4513", "#d2b48c", "#fff8dc"], // wings lighter colors + behavior: behaviors.WALK, + category: "life", + tempHigh: 50, + tempLow: 0, + state: "solid", + density: 900, + tick: function(pixel) { + // Fly-ish movement: higher chance to move up + if (Math.random() < 0.6) { + tryMove(pixel, pixel.x + (Math.random() < 0.5 ? -1 : 1), pixel.y - 1); + } else if (Math.random() < 0.5) { + tryMove(pixel, pixel.x + (Math.random() < 0.5 ? -1 : 1), pixel.y); + } else { + tryMove(pixel, pixel.x, pixel.y + 1); + } + } +};