Randomized Creature Generation
Adds a random organism generator that is accessible through the editor control panel. This generator gives the user to generate an entire world of random organisms for selection to act upon.
This commit is contained in:
@@ -91,6 +91,22 @@ class Anatomy {
|
||||
getRandomCell() {
|
||||
return this.cells[Math.floor(Math.random() * this.cells.length)];
|
||||
}
|
||||
|
||||
getNeighborsOfCell(col, row) {
|
||||
|
||||
var neighbors = [];
|
||||
|
||||
for (var x = -1; x <= 1; x++) {
|
||||
for (var y = -1; y <= 1; y++) {
|
||||
|
||||
var neighbor = this.getLocalCell(col + x, row + y);
|
||||
if (neighbor)
|
||||
neighbors.push(neighbor)
|
||||
}
|
||||
}
|
||||
|
||||
return neighbors;
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = Anatomy;
|
||||
@@ -95,6 +95,7 @@ const CellStates = {
|
||||
return this.living[Math.floor(Math.random() * this.living.length)];
|
||||
}
|
||||
}
|
||||
|
||||
CellStates.defineLists();
|
||||
|
||||
module.exports = CellStates;
|
||||
|
||||
@@ -79,4 +79,6 @@ class Brain {
|
||||
}
|
||||
}
|
||||
|
||||
Brain.Decision = Decision;
|
||||
|
||||
module.exports = Brain;
|
||||
77
src/Organism/RandomOrganismGenerator.js
Normal file
77
src/Organism/RandomOrganismGenerator.js
Normal file
@@ -0,0 +1,77 @@
|
||||
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;
|
||||
Reference in New Issue
Block a user