Merge pull request #1206 from jhaseandgus-byte/patch-1

ants.js
This commit is contained in:
slweeb 2025-08-15 20:03:01 -04:00 committed by GitHub
commit 8e5b03b9a0
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
1 changed files with 137 additions and 0 deletions

137
mods/ants.js Normal file
View File

@ -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);
}
}
};