From c5e1bcb71ed69f705cd27a36698bfdb3cd263a68 Mon Sep 17 00:00:00 2001 From: bruhster8443 Date: Tue, 23 Dec 2025 09:57:26 -0500 Subject: [PATCH] Add files via upload --- mods/immune.js | 199 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 199 insertions(+) create mode 100644 mods/immune.js diff --git a/mods/immune.js b/mods/immune.js new file mode 100644 index 00000000..8870f476 --- /dev/null +++ b/mods/immune.js @@ -0,0 +1,199 @@ +// --- 1. THE FIREWALL --- + +elements.body_tissue = { + color: "#b06d67", + behavior: behaviors.WALL, + category: "land", + state: "solid", + density: 2000, +}; + +elements.cytokines = { + color: "#fff700", + behavior: behaviors.GAS, + category: "life", + state: "gas", + density: 1, + tick: function(pixel) { + if (Math.random() < 0.05) { deletePixel(pixel.x, pixel.y); } + } +}; + +// --- 2. THE TARGETS --- + +elements.body_cell = { + color: "#8b0000", + behavior: behaviors.STURDY, + category: "life", + state: "solid", + density: 1500, +}; + +// --- 3. CORE LOGIC (Movement & Targeting) --- + +function findTarget(pixel, targets, radius) { + for (var i = -radius; i <= radius; i++) { + for (var j = -radius; j <= radius; j++) { + var nx = pixel.x + i; + var ny = pixel.y + j; + if (!outOfBounds(nx, ny)) { + var check = pixelMap[nx][ny]; + if (check && targets.includes(check.element)) { + return {x: nx, y: ny}; + } + } + } + } + return null; +} + +function moveStep(pixel, tx, ty) { + var dx = Math.sign(tx - pixel.x); + var dy = Math.sign(ty - pixel.y); + var nx = pixel.x + dx; + var ny = pixel.y + dy; + + if (isEmpty(nx, ny)) { + tryMove(pixel, nx, ny); + } else { + var obs = pixelMap[nx][ny]; + // STRICT BARRIER: Cannot move through or swap with Tissue or Skin + if (obs && obs.element !== "body_tissue" && obs.element !== "skin" && obs.element !== "wall") { + var ox = pixel.x; var oy = pixel.y; + movePixel(pixel, nx, ny); + movePixel(obs, ox, oy); + } + } +} + +// --- 4. PATHOGENS --- + +elements.bacteria = { + color: "#2feb5b", + behavior: behaviors.LIQUID, + category: "life", + tick: function(pixel) { + if (!pixel.eatCD) { pixel.eatCD = 0; } + if (pixel.eatCD > 0) { pixel.eatCD--; return; } + + var target = findTarget(pixel, ["body_cell", "rbc", "stem_cell"], 8); + if (target) { + if (Math.abs(target.x - pixel.x) <= 1 && Math.abs(target.y - pixel.y) <= 1) { + // Kill with Cooldown + deletePixel(target.x, target.y); + if (Math.random() < 0.3) createPixel("cytokines", target.x, target.y); + createPixel("dna", target.x, target.y); + pixel.eatCD = 40; + } else { + moveStep(pixel, target.x, target.y); + } + } else { + if (Math.random() < 0.2) tryMove(pixel, pixel.x + Math.floor(Math.random()*3)-1, pixel.y + Math.floor(Math.random()*3)-1); + } + } +}; + +elements.virus = { + color: "#6a0dad", + behavior: behaviors.GAS, + category: "life", + reactions: { "body_cell": { elem2: "infected_cell", elem1: null } } +}; + +// --- 5. IMMUNE SYSTEM --- + +elements.phagocyte = { + color: "#e0f7fa", + category: "life", + tick: function(pixel) { + var target = findTarget(pixel, ["bacteria", "virus", "pus"], 12) || findTarget(pixel, ["cytokines"], 20); + if (target) { + moveStep(pixel, target.x, target.y); + } else { + if (Math.random() < 0.1) tryMove(pixel, pixel.x + Math.floor(Math.random()*3)-1, pixel.y + Math.floor(Math.random()*3)-1); + } + }, + reactions: { + "bacteria": { elem2: null, func: function(pixel) { pixel.ate = (pixel.ate || 0) + 1; if(pixel.ate > 5) changePixel(pixel, "pus"); }}, + "virus": { elem2: null, func: function(pixel) { pixel.ate = (pixel.ate || 0) + 1; if(pixel.ate > 5) changePixel(pixel, "pus"); }}, + "cytokines": { elem2: null } + } +}; + +elements.t_cell = { + color: "#2962ff", + category: "life", + tick: function(pixel) { + if (!pixel.killCD) { pixel.killCD = 0; } + if (pixel.killCD > 0) { pixel.killCD--; return; } + + var target = findTarget(pixel, ["infected_cell"], 12) || findTarget(pixel, ["cytokines"], 15); + if (target) { + var targetPixel = pixelMap[target.x][target.y]; + if (targetPixel.element === "infected_cell" && Math.abs(target.x - pixel.x) <= 1 && Math.abs(target.y - pixel.y) <= 1) { + changePixel(targetPixel, "pus"); + pixel.killCD = 30; + } else { + moveStep(pixel, target.x, target.y); + } + } else { + if (Math.random() < 0.1) tryMove(pixel, pixel.x + Math.floor(Math.random()*3)-1, pixel.y + Math.floor(Math.random()*3)-1); + } + } +}; + +elements.b_cell = { + color: "#ffaa00", + behavior: behaviors.CELL, + category: "life", + tick: function(pixel) { + if (!pixel.cd) { pixel.cd = 0; } + if (pixel.cd > 0) { pixel.cd--; } + + if (pixel.cd === 0 && Math.random() < 0.4) { + var enemy = findTarget(pixel, ["bacteria", "virus", "infected_cell"], 20); + if (enemy) { + var rx = Math.floor(Math.random() * 3) - 1; + var ry = Math.floor(Math.random() * 3) - 1; + if (isEmpty(pixel.x + rx, pixel.y + ry)) { + createPixel("antibody", pixel.x + rx, pixel.y + ry); + pixel.cd = 25; + } + } + } + if (Math.random() < 0.05) tryMove(pixel, pixel.x + Math.floor(Math.random()*3)-1, pixel.y + Math.floor(Math.random()*3)-1); + } +}; + +// --- 6. MISC --- + +elements.stem_cell = { + color: "#ffc0cb", + behavior: behaviors.CELL, + category: "life", + tick: function(pixel) { + if (Math.random() < 0.05) { + var rx = Math.floor(Math.random() * 3) - 1; + var ry = Math.floor(Math.random() * 3) - 1; + if (isEmpty(pixel.x + rx, pixel.y + ry)) { + createPixel(Math.random() < 0.8 ? "body_cell" : "body_tissue", pixel.x + rx, pixel.y + ry); + } + } + } +}; + +elements.rbc = { color: ["#ff0000", "#d10000", "#e62e2e"], behavior: behaviors.LIQUID, category: "life", state: "liquid", density: 1010 }; +elements.pus = { color: "#ebf2a0", behavior: behaviors.LIQUID, category: "life", state: "liquid", density: 1100 }; +elements.dna = { color: "#68c290", behavior: behaviors.POWDER, category: "life" }; +elements.infected_cell = { color: ["#5e8a38", "#496e2b"], behavior: behaviors.CELL, category: "life", reactions: { "body_cell": { elem2: "infected_cell", chance: 0.01 } } }; + +elements.antibody = { + color: "#ffe100", + category: "life", + tick: function(pixel) { + var target = findTarget(pixel, ["bacteria", "virus", "infected_cell"], 15); + if (target) moveStep(pixel, target.x, target.y); + else if (Math.random() < 0.1) tryMove(pixel, pixel.x, pixel.y + 1); + }, + reactions: { "bacteria": { elem1: null, elem2: null }, "virus": { elem1: null, elem2: null }, "infected_cell": { elem1: null, elem2: "pus" } } +}; \ No newline at end of file