77 lines
2.8 KiB
JavaScript
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; |