diff --git a/mods/more_cells.js b/mods/more_cells.js new file mode 100644 index 00000000..9ff56ebc --- /dev/null +++ b/mods/more_cells.js @@ -0,0 +1,414 @@ +viewInfo[4] = { // energy view + name: "enrg", + pixel: function (pixel, ctx) { + if (elements[pixel.element].isCell === true) { + var stat = pixel.energy + var ratio = Math.log(stat) / Math.log(3000) + var hue = Math.round(ratio * 240) + if (hue < 0) hue = 0 + if (hue > 240) hue = 240 + drawSquare(ctx, `hsl(${hue},100%,50%)`, pixel.x, pixel.y) + } + } +} + +viewInfo[5] = { // breath view + name: "brth", + pixel: function (pixel, ctx) { + if (elements[pixel.element].isCell === true) { + var stat = pixel.breath + var ratio = Math.log(stat) / Math.log(3000) + var hue = Math.round(ratio * 240) + if (hue < 0) hue = 0 + if (hue > 240) hue = 240 + drawSquare(ctx, `hsl(${hue},100%,50%)`, pixel.x, pixel.y) + } + } +} + + +function baseCellTick(px) { + if (!elements[px.element].isCell) { return } + + if (px.energy > 3000) { px.energy = 3000 } + if (px.breath > 3000) { px.breath = 3000 } + + if (!px.static && Math.random() < 0.115) { + px.energy-- + px.breath-- + } + + if (px.energy < 1 || px.breath < 1) { + changePixel(px, "cancer") + return + } + + const ns = getNeighbors(px) + ns.forEach(n => { + if (!elements[n.element].isCell) { return } + + if (n.energy < px.energy) { + let transfer = (px.energy - n.energy) / 4 + transfer = Math.floor(Math.min(transfer, (px.transfer + n.transfer) / 2)) + px.energy -= transfer + n.energy += transfer + } + + if (n.breath < px.breath) { + let transfer = Math.floor((px.breath - n.breath) / 4) + transfer = Math.min(transfer, (px.transfer + n.transfer) / 2) + px.breath -= transfer + n.breath += transfer + } + + }) +} + +elements.chlorocyte = { + color: ["#00ff00", "#00a500", "#008a00", "#26a026", "#3eff3e"], + behavior: behaviors.WALL, + noMix: true, + properties: { + energy: 300, + breath: 300, + transfer: 1 + }, + isCell: true, + hoverStat: function (px) { + return `E:${px.energy} B:${px.breath}` + }, + tick: (px) => { + px.energy += (4 - getNeighbors(px).length) * 3 + baseCellTick(px) + doDefaults(px) + }, + tempHigh: 102, + stateHigh: ["steam", "steam", "steam", "sugar"], + tempLow: -2, + stateLow: ["ice", "ice", "ice", "sugar_ice"], + state: "solid", + density: 1000.1, + category: "cells", + breakInto: ["water", "dna", "dna", "dna"], + reactions: { + ...elements.cell.reactions, + cancer: { elem1: "cancer", chance: 0.005 } + } +} + +elements.nucleolyte = { + color: "#FF6F3C", + behavior: behaviors.WALL, + noMix: true, + properties: { + energy: 300, + breath: 300, + transfer: 1 + }, + isCell: true, + hoverStat: function (px) { + return `E:${px.energy} B:${px.breath}` + }, + tick: (px) => { + const ns = getNeighbors(px) + for (let n of ns) { + if (n.element == "vena" && n.charge) { + px.breath += 80 + px.energy += 80 + break + } + } + baseCellTick(px) + doDefaults(px) + }, + tempHigh: 102, + stateHigh: ["steam", "steam", "steam", "sugar"], + tempLow: -2, + stateLow: ["ice", "ice", "ice", "sugar_ice"], + state: "solid", + density: 1000.1, + category: "cells", + breakInto: ["sugar_water", "dna", "dna", "dna"], + reactions: { + ...elements.cell.reactions, + cancer: { elem1: "cancer", chance: 0.005 } + } +} + +elements.respira = { + color: ["#8888ff"], + behavior: behaviors.WALL, + noMix: true, + properties: { + energy: 300, + breath: 300, + transfer: 1 + }, + isCell: true, + hoverStat: function (px) { + return `E:${px.energy} B:${px.breath}` + }, + tick: (px) => { + px.breath += (4 - getNeighbors(px).length) * 3 + baseCellTick(px) + doDefaults(px) + }, + tempHigh: 102, + stateHigh: ["steam", "steam", "steam", "sugar"], + tempLow: -2, + stateLow: ["ice", "ice", "ice", "sugar_ice"], + state: "solid", + density: 1000.1, + category: "cells", + breakInto: ["water", "dna", "dna", "dna"], + reactions: { + ...elements.cell.reactions, + cancer: { elem1: "cancer", chance: 0.005 } + } +} + +elements.structura = { + color: ["#535353"], + behavior: behaviors.WALL, + noMix: true, + properties: { + energy: 300, + breath: 300, + transfer: 0, + static: true, + }, + isCell: true, + hoverStat: function (px) { + return `E:${px.energy} B:${px.breath}` + }, + tick: (px) => { + baseCellTick(px) + doDefaults(px) + }, + tempHigh: 102, + stateHigh: ["steam", "steam", "steam", "sugar"], + tempLow: -2, + stateLow: ["ice", "ice", "ice", "sugar_ice"], + state: "solid", + density: 1000.1, + category: "cells", + breakInto: ["water", "dna", "dna", "dna"], + reactions: { + ...elements.cell.reactions, + cancer: { elem1: "cancer", chance: 0.005 } + } +} + +elements.vena = { + color: ["#a85e5e"], + behavior: behaviors.WALL, + noMix: true, + properties: { + energy: 300, + breath: 300, + transfer: 0, + static: false, + }, + conduct: 1, + isCell: true, + hoverStat: function (px) { + return `E:${px.energy} B:${px.breath}` + }, + tick: (px) => { + if (px.charge) { + px.transfer = 500 + px.static = true + } else { + transfer = 0 + px.static = false + } + baseCellTick(px) + doDefaults(px) + }, + tempHigh: 102, + stateHigh: ["steam", "steam", "sugar_water", "sugar_water"], + tempLow: -2, + stateLow: ["ice", "ice", "sugar_ice", "sugar_ice"], + state: "solid", + density: 1010, + category: "cells", + breakInto: ["sugar_water", "sugar_water", "dna", "dna"], + reactions: { + ...elements.cell.reactions, + cancer: { elem1: "cancer", chance: 0.005 } + } +} + +elements.neurocell = { + color: ["#5e5fa8"], + behavior: behaviors.WALL, + noMix: true, + properties: { + energy: 300, + breath: 300, + transfer: 50, + cd: 1 + }, + conduct: 1, + isCell: true, + hoverStat: function (px) { + return `E:${px.energy} B:${px.breath}` + }, + tick: (px) => { + px.cd-- + if (px.cd < 1) { + px.cd = 20 + px.charge = 1 + } + baseCellTick(px) + doDefaults(px) + }, + tempHigh: 102, + stateHigh: ["steam", "steam", "sugar_water", "sugar_water"], + tempLow: -2, + stateLow: ["ice", "ice", "sugar_ice", "sugar_ice"], + state: "solid", + density: 1010, + category: "cells", + breakInto: ["sugar_water", "sugar_water", "dna", "dna"], + reactions: { + ...elements.cell.reactions, + cancer: { elem1: "cancer", chance: 0.005 } + } +} + +elements.insulon = { + color: ["#cadf7e"], + behavior: behaviors.WALL, + noMix: true, + properties: { + energy: 300, + breath: 300, + transfer: 1 + }, + conduct: 1, + isCell: true, + hoverStat: function (px) { + return `E:${px.energy} B:${px.breath}` + }, + tick: (px) => { + if (px.temp > 20) { + px.temp -= 6 + } + baseCellTick(px) + doDefaults(px) + }, + tempHigh: 300, + stateHigh: ["steam", "steam", "steam", "sugar"], + tempLow: -2, + stateLow: ["ice", "ice", "ice", "sugar_ice"], + state: "solid", + density: 1000.1, + category: "cells", + breakInto: ["water", "dna", "dna", "dna"], + reactions: { + ...elements.cell.reactions, + cancer: { elem1: "cancer", chance: 0.005 } + } +} + +elements.carapace = { + color: ["#46065a"], + behavior: behaviors.WALL, + noMix: true, + properties: { + energy: 300, + breath: 300, + transfer: 0 + }, + isCell: true, + hoverStat: function (px) { + return `E:${px.energy} B:${px.breath}` + }, + tick: (px) => { + baseCellTick(px) + doDefaults(px) + }, + tempHigh: 1200, + stateHigh: ["steam", "molten_copper", "steam", "sugar"], + state: "solid", + density: 1800, + category: "cells", + breakInto: ["water", "oxidized_copper", "dna", "dna"], +} + +elements.phagocyte = { + color: ["#a3d9a6"], + behavior: behaviors.WALL, + noMix: true, + properties: { + energy: 300, + breath: 300, + transfer: 0 + }, + isCell: true, + hoverStat: function (px) { + return `E:${px.energy} B:${px.breath}` + }, + tick: (px) => { + baseCellTick(px) + doDefaults(px) + }, + tempHigh: 102, + stateHigh: ["steam", "steam", "sugar", "sugar"], + tempLow: -2, + stateLow: ["ice", "ice", "sugar_ice", "sugar_ice"], + state: "solid", + density: 1010, + category: "cells", + breakInto: ["dna", "sugar", "dna", "dna"], + reactions: { + ...elements.cell.reactions, + cancer: { elem2: "stem_cell", chance: 0.055 }, + infection: { elem2: "stem_cell", chance: 0.075 }, + poison: { elem2: "stem_cell", chance: 0.025 }, + } +} + +elements.stem_cell = { + color: ["#c0c0c0"], + behavior: behaviors.LIQUID, + noMix: true, + hoverStat: function (px) { + return `E:${px.energy} B:${px.breath}` + }, + tick: (px) => { + const ns = getNeighbors(px) + if (ns.length > 0) { + const elem = ns[Math.floor(Math.random() * ns.length)].element + if (elements[elem].isCell) { + changePixel(px, elem) + } + } + doDefaults(px) + }, + tempHigh: 102, + stateHigh: ["steam", "steam", "sugar", "sugar"], + tempLow: -2, + stateLow: ["ice", "ice", "sugar_ice", "sugar_ice"], + state: "solid", + density: 1010, + category: "cells", + breakInto: ["dna", "sugar", "dna", "dna"], + reactions: { + ...elements.cell.reactions, + cancer: { elem1: "cancer", chance: 0.005 } + } +} + +elements.cancer.reactions.chlorocyte = { elem2: "cancer", chane: 0.005 } +elements.cancer.reactions.respira = { elem2: "cancer", chane: 0.005 } +elements.cancer.reactions.insulon = { elem2: "cancer", chane: 0.005 } +elements.cancer.reactions.neurocell = { elem2: "cancer", chane: 0.005 } +elements.cancer.reactions.vena = { elem2: "cancer", chane: 0.005 } + +elements.infection.reactions.chlorocyte = { elem2: "infection", chane: 0.0015 } +elements.infection.reactions.respira = { elem2: "infection", chane: 0.0015 } +elements.infection.reactions.insulon = { elem2: "infection", chane: 0.0015 } +elements.infection.reactions.neurocell = { elem2: "infection", chane: 0.0015 } +elements.infection.reactions.vena = { elem2: "infection", chane: 0.0015 } \ No newline at end of file