@@ -183,7 +186,7 @@
Reset Options
-
+
diff --git a/src/Controllers/ControlPanel.js b/src/Controllers/ControlPanel.js
index f57b94b4..fddf3234 100644
--- a/src/Controllers/ControlPanel.js
+++ b/src/Controllers/ControlPanel.js
@@ -3,6 +3,7 @@ const Modes = require("./ControlModes");
const StatsPanel = require("../Stats/StatsPanel");
const RandomOrganismGenerator = require("../Organism/RandomOrganismGenerator")
const WorldConfig = require("../WorldConfig");
+const CellStates = require("../Organism/Cell/CellStates");
class ControlPanel {
constructor(engine) {
@@ -90,7 +91,10 @@ class ControlPanel {
case 'c':
$('#drop-org').click();
break;
- case 'v': // toggle hud
+ case 'v':
+ $('#copy-dc-code').click();
+ break;
+ case 'b': // toggle hud
if (this.no_hud) {
let control_panel_display = this.control_panel_active ? 'grid' : 'none';
let hot_control_display = !this.control_panel_active ? 'block' : 'none';
@@ -106,7 +110,7 @@ class ControlPanel {
}
this.no_hud = !this.no_hud;
break;
- case 'b':
+ case 'n':
$('#clear-walls').click();
}
});
@@ -361,6 +365,94 @@ class ControlPanel {
this.env_controller.resetView();
}.bind(this));
+ $('#copy-dc-code').click( function(){
+ let org = this.engine.organism_editor.organism;
+ let anatomy = org.anatomy;
+ let cells = anatomy.cells;
+ let code = "";
+ let startx = 0;
+ let starty = 0;
+ let endx = 0;
+ let endy = 0;
+
+ for (var cell of cells) {
+ if(cell.loc_col < startx) {
+ startx = cell.loc_col;
+ }
+ if(cell.loc_col > endx) {
+ endx = cell.loc_col;
+ }
+ if(cell.loc_row < starty) {
+ starty = cell.loc_row;
+ }
+ if(cell.loc_row > endy) {
+ endy = cell.loc_row;
+ }
+ }
+ //iterate from top left to bottom right
+ for(var i = starty; i <= endy; i++) {
+ for(var j = startx; j <= endx; j++) {
+ let cell = cells.find(c => c.loc_row == i && c.loc_col == j);
+ if(cell == undefined) {
+ code += CellStates.empty.dc_code;
+ }else {
+ if(cell.state.dc_code == ':eye:'){
+ switch (cell.direction) {
+ case 0://up
+ code += ':eyeu:';
+ break;
+ case 1://right
+ code += ':eyer:';
+ break;
+ case 2://down
+ code += ':eyed:';
+ break;
+ case 3://left
+ code += ':eyel:';
+ break;
+ default:
+ code += ':eye:';
+ break;
+ }
+ }else{
+ code += cell.state.dc_code;
+ }
+ }
+ }
+
+ code += '\n';
+ }
+
+ code += "Cell Count: " + cells.length + "\n";
+ if(anatomy.is_mover) code += "Move Range: " + org.move_range + "\n";
+ code += "Mutation Rate: " + org.mutability + "\n";
+ if(anatomy.is_mover && anatomy.has_eyes){
+ let brain = org.brain;
+
+ let chase_types = [];
+ let retreat_types = [];
+ for(let cell_name in brain.decisions) {
+ let decision = brain.decisions[cell_name];
+ if (decision == 1) {
+ retreat_types.push(cell_name)
+ }
+ else if (decision == 2) {
+ chase_types.push(cell_name);
+ }
+ }
+
+ if(chase_types.length > 0) {
+ code += "Move Towards: " + chase_types.join(', ') + "\n";
+ }
+ if(retreat_types.length > 0) {
+ code += "Move Away From: " + retreat_types.join(', ') + "\n";
+ }
+ }
+
+ console.log(code);
+ navigator.clipboard.writeText(code);
+ }.bind(this));
+
var env = this.engine.env;
$('#reset-env').click( function() {
env.reset();
diff --git a/src/Organism/Cell/CellStates.js b/src/Organism/Cell/CellStates.js
index 9bf54f8c..b94a61ae 100644
--- a/src/Organism/Cell/CellStates.js
+++ b/src/Organism/Cell/CellStates.js
@@ -1,8 +1,9 @@
// A cell state is used to differentiate type and render the cell
class CellState{
- constructor(name) {
+ constructor(name, dc_code = ':__:') {
this.name = name;
this.color = 'black';
+ this.dc_code = dc_code;
}
render(ctx, cell, size) {
@@ -13,47 +14,47 @@ class CellState{
class Empty extends CellState {
constructor() {
- super('empty');
+ super('empty',':vd:');
}
}
class Food extends CellState {
constructor() {
- super('food');
+ super('food',':food:');
}
}
class Wall extends CellState {
constructor() {
- super('wall');
+ super('wall',':wall:');
}
}
class Mouth extends CellState {
constructor() {
- super('mouth');
+ super('mouth',':eat:');
}
}
class Producer extends CellState {
constructor() {
- super('producer');
+ super('producer',':prod:');
}
}
class Mover extends CellState {
constructor() {
- super('mover');
+ super('mover',':mov:');
}
}
class Killer extends CellState {
constructor() {
- super('killer');
+ super('killer',':kill:');
}
}
class Armor extends CellState {
constructor() {
- super('armor');
+ super('armor',':arm:');
}
}
class Eye extends CellState {
constructor() {
- super('eye');
+ super('eye',':eye:');
this.slit_color = 'black';
}
render(ctx, cell, size) {