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:
Chris Gallegos
2021-11-21 01:36:20 -08:00
parent 2ef721682a
commit 869cc85d04
12 changed files with 227 additions and 28 deletions

View File

@@ -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;

View File

@@ -95,6 +95,7 @@ const CellStates = {
return this.living[Math.floor(Math.random() * this.living.length)];
}
}
CellStates.defineLists();
module.exports = CellStates;

View File

@@ -79,4 +79,6 @@ class Brain {
}
}
Brain.Decision = Decision;
module.exports = Brain;

View 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;