Files
lifeEngine/src/Organism/Anatomy.js
MaxRobinsonTheGreat dabeb4463d organism saving/loading
2022-04-10 13:07:10 -05:00

146 lines
4.0 KiB
JavaScript

const CellStates = require("./Cell/CellStates");
const BodyCellFactory = require("./Cell/BodyCells/BodyCellFactory");
const SerializeHelper = require("../Utils/SerializeHelper");
class Anatomy {
constructor(owner) {
this.owner = owner;
this.birth_distance = 4;
this.clear();
}
clear() {
this.cells = [];
this.is_producer = false;
this.is_mover = false;
this.has_eyes = false;
}
canAddCellAt(c, r) {
for (var cell of this.cells) {
if (cell.loc_col == c && cell.loc_row == r){
return false;
}
}
return true;
}
addDefaultCell(state, c, r) {
var new_cell = BodyCellFactory.createDefault(this.owner, state, c, r);
this.cells.push(new_cell);
return new_cell;
}
addRandomizedCell(state, c, r) {
if (state==CellStates.eye && !this.has_eyes) {
this.owner.brain.randomizeDecisions();
}
var new_cell = BodyCellFactory.createRandom(this.owner, state, c, r);
this.cells.push(new_cell);
return new_cell;
}
addInheritCell(parent_cell) {
var new_cell = BodyCellFactory.createInherited(this.owner, parent_cell);
this.cells.push(new_cell);
return new_cell;
}
replaceCell(state, c, r, randomize=true) {
this.removeCell(c, r, true);
if (randomize) {
return this.addRandomizedCell(state, c, r);
}
else {
return this.addDefaultCell(state, c, r);
}
}
removeCell(c, r, allow_center_removal=false) {
if (c == 0 && r == 0 && !allow_center_removal)
return false;
for (var i=0; i<this.cells.length; i++) {
var cell = this.cells[i];
if (cell.loc_col == c && cell.loc_row == r){
this.cells.splice(i, 1);
break;
}
}
this.checkTypeChange();
return true;
}
getLocalCell(c, r) {
for (var cell of this.cells) {
if (cell.loc_col == c && cell.loc_row == r){
return cell;
}
}
return null;
}
checkTypeChange() {
this.is_producer = false;
this.is_mover = false;
this.has_eyes = false;
for (var cell of this.cells) {
if (cell.state == CellStates.producer)
this.is_producer = true;
if (cell.state == CellStates.mover)
this.is_mover = true;
if (cell.state == CellStates.eye)
this.has_eyes = true;
}
}
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;
}
isEqual(anatomy) { // currently unused helper func. inefficient, avoid usage in prod.
if (this.cells.length !== anatomy.cells.length) return false;
for (let i in this.cells) {
let my_cell = this.cells[i];
let their_cell = anatomy.cells[i];
if (my_cell.loc_col !== their_cell.loc_col ||
my_cell.loc_row !== their_cell.loc_row ||
my_cell.state !== their_cell.state)
return false;
}
return true;
}
serialize() {
let anatomy = SerializeHelper.copyNonObjects(this);
anatomy.cells = [];
for (let cell of this.cells) {
let newcell = SerializeHelper.copyNonObjects(cell);
newcell.state = {name: cell.state.name};
anatomy.cells.push(newcell)
}
return anatomy;
}
loadRaw(anatomy) {
this.clear();
for (let cell of anatomy.cells){
this.addInheritCell(cell);
}
}
}
module.exports = Anatomy;