Files
lifeEngine/src/Organism/RandomOrganismGenerator.js
Chris Gallegos 0bdea0843c Tabs to spaces
2021-11-24 00:55:59 -08:00

77 lines
2.8 KiB
JavaScript

const CellStates = require("./Cell/CellStates");
const Organism = require("./Organism");
const Brain = require("./Perception/Brain")
class RandomOrganismGenerator {
static generate(env) {
var center = env.grid_map.getCenter();
var organism = new Organism(center[0], center[1], env, null);
organism.anatomy.addDefaultCell(CellStates.mouth, 0, 0);
var outermostLayer = RandomOrganismGenerator.organismLayers;
var x, y;
// iterate from center to edge of organism
// layer 0 is the central cell of the organism
for (var layer = 1; layer <= outermostLayer; layer++) {
var someCellSpawned = false;
var spawnChance = RandomOrganismGenerator.cellSpawnChance * 1 - ((layer - 1) / outermostLayer);
// top
y = -layer;
for (x = -layer; x <= layer; x++)
someCellSpawned = RandomOrganismGenerator.trySpawnCell(organism, x, y, spawnChance);
// bottom
y = layer;
for (x = -layer; x <= layer; x++)
someCellSpawned = RandomOrganismGenerator.trySpawnCell(organism, x, y, spawnChance);
// left
x = -layer;
for (y = -layer + 1; y <= layer - 1; y++)
someCellSpawned = RandomOrganismGenerator.trySpawnCell(organism, x, y, spawnChance);
// right
x = layer;
for (y = -layer + 1; y < layer - 1; y++)
someCellSpawned = RandomOrganismGenerator.trySpawnCell(organism, x, y, spawnChance);
if (!someCellSpawned)
break;
}
// randomize the organism's brain
var decisions = organism.brain.decisions;
decisions[CellStates.empty.name] = Brain.Decision.getRandom();
decisions[CellStates.food.name] = Brain.Decision.getRandom();
decisions[CellStates.wall.name] = Brain.Decision.getRandom();
decisions[CellStates.mouth.name] = Brain.Decision.getRandom();
decisions[CellStates.producer.name] = Brain.Decision.getRandom();
decisions[CellStates.mover.name] = Brain.Decision.getRandom();
decisions[CellStates.killer.name] = Brain.Decision.getRandom();
decisions[CellStates.armor.name] = Brain.Decision.getRandom();
decisions[CellStates.eye.name] = Brain.Decision.getRandom();
return organism;
}
static trySpawnCell(organism, x, y, spawnChance) {
var neighbors = organism.anatomy.getNeighborsOfCell(x, y);
if (neighbors.length && Math.random() < spawnChance) {
organism.anatomy.addRandomizedCell(CellStates.getRandomLivingType(), x, y);
return true;
}
return false;
}
}
RandomOrganismGenerator.organismLayers = 2;
RandomOrganismGenerator.cellSpawnChance = 0.75;
module.exports = RandomOrganismGenerator;