From dd7ee5a086d650d15dd6117eb8576fcc9a95dfe7 Mon Sep 17 00:00:00 2001 From: Trevor Sayre Date: Sun, 21 Nov 2021 13:56:00 -0500 Subject: [PATCH 01/51] Fix oranisms to organisms typos --- dist/index.html | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/dist/index.html b/dist/index.html index f833752..6748fe2 100644 --- a/dist/index.html +++ b/dist/index.html @@ -78,7 +78,7 @@
-
+
@@ -112,7 +112,7 @@
-
+
@@ -277,4 +277,4 @@ - \ No newline at end of file + From 549b11ad12c558e2194abce9c12873be73e0d42b Mon Sep 17 00:00:00 2001 From: Chris Gallegos Date: Tue, 23 Nov 2021 23:58:24 -0800 Subject: [PATCH 02/51] Quality of life changes - Hotkeys for all UI buttons - Consistent zooming - Better handling of mouse enter/leave - Middle-click for drag - Fixed bug where the hotbar buttons wouldn't light up when selecting a control mode --- dist/index.html | 36 +++---- src/Controllers/CanvasController.js | 32 ++++-- src/Controllers/ControlPanel.js | 121 ++++++++++++++++++----- src/Controllers/EnvironmentController.js | 28 +++++- 4 files changed, 164 insertions(+), 53 deletions(-) diff --git a/dist/index.html b/dist/index.html index f833752..5b160ed 100644 --- a/dist/index.html +++ b/dist/index.html @@ -19,12 +19,12 @@
- - - - - - + + + + + +

Simulation Speed

@@ -62,7 +62,7 @@

Simulation Controls

Stats

Challenges

- +
@@ -98,9 +98,9 @@
- - - + + +
@@ -261,19 +261,19 @@
- - - - - - - + + + + + + +
- +
diff --git a/src/Controllers/CanvasController.js b/src/Controllers/CanvasController.js index 95a03d9..e14cb2a 100644 --- a/src/Controllers/CanvasController.js +++ b/src/Controllers/CanvasController.js @@ -9,6 +9,7 @@ class CanvasController{ this.mouse_c; this.mouse_r; this.left_click = false; + this.middle_click = false; this.right_click = false; this.cur_cell = null; this.cur_org = null; @@ -30,16 +31,21 @@ class CanvasController{ evt.preventDefault(); this.updateMouseLocation(evt.offsetX, evt.offsetY) this.mouseUp(); - this.left_click=false; - this.right_click=false; + if (evt.button == 0) + this.left_click = false; + if (evt.button == 1) + this.middle_click = false; + if (evt.button == 2) + this.right_click = false; }.bind(this)); this.canvas.addEventListener('mousedown', function(evt) { evt.preventDefault(); this.updateMouseLocation(evt.offsetX, evt.offsetY) - if (evt.button == 0) { + if (evt.button == 0) this.left_click = true; - } + if (evt.button == 1) + this.middle_click = true; if (evt.button == 2) this.right_click = true; this.mouseDown(); @@ -50,11 +56,25 @@ class CanvasController{ }); this.canvas.addEventListener('mouseleave', function(){ - this.right_click = false; - this.left_click = false; + this.left_click = false; + this.middle_click = false; + this.right_click = false; this.env.renderer.clearAllHighlights(true); }.bind(this)); + this.canvas.addEventListener('mouseenter', function(evt) { + + this.left_click = !!(evt.buttons & 1); + this.right_click = !!(evt.buttons & 2); + this.middle_click = !!(evt.buttons & 4); + + this.updateMouseLocation(evt.offsetX, evt.offsetY); + this.start_x = this.mouse_x; + this.start_y = this.mouse_y; + + + }.bind(this)) + } updateMouseLocation(offsetX, offsetY) { diff --git a/src/Controllers/ControlPanel.js b/src/Controllers/ControlPanel.js index ab5eaa5..f57da67 100644 --- a/src/Controllers/ControlPanel.js +++ b/src/Controllers/ControlPanel.js @@ -6,6 +6,7 @@ class ControlPanel { constructor(engine) { this.engine = engine; this.defineMinMaxControls(); + this.defineHotkeys(); this.defineEngineSpeedControls(); this.defineGridSizeControls(); this.defineTabNavigation(); @@ -41,25 +42,7 @@ class ControlPanel { this.stats_panel.startAutoRender(); } }); - const V_KEY = 118; - $('body').keypress( (e) => { - if (e.which === V_KEY) { - if (this.no_hud) { - let control_panel_display = this.control_panel_active ? 'grid' : 'none'; - let hot_control_display = !this.control_panel_active ? 'block' : 'none'; - if (this.control_panel_active && this.tab_id == 'stats') { - this.stats_panel.startAutoRender(); - }; - $('.control-panel').css('display', control_panel_display); - $('.hot-controls').css('display', hot_control_display); - } - else { - $('.control-panel').css('display', 'none'); - $('.hot-controls').css('display', 'none'); - } - this.no_hud = !this.no_hud; - } - }); + // var self = this; // $('#minimize').click ( function() { // $('.control-panel').css('display', 'none'); @@ -75,6 +58,88 @@ class ControlPanel { // }); } + defineHotkeys() { + + $('body').keydown( (evt) => { + + //console.log(evt.which); + + switch (evt.which) { + + // hot bar controls + case 49: // 1 = Reset Camera + $('.reset-view')[0].click(); + break; + + case 50: // 2 = Drag View + $('#drag-view').click(); + break; + + case 51: // 3 = Drop Wall + $('#wall-drop').click(); + break; + + case 52: // 4 = Drop Food + $('#food-drop').click(); + break; + + case 53: // 5 = Kill + $('#click-kill').click(); + break; + + case 54: // 6 = Play/Pause + case 32: // Space = Play/Pause + $('.pause-button')[0].click(); + break; + + case 55: // 7 = Toggle Rendering + $('.headless')[0].click(); + break; + + // miscellaneous hotkeys + case 9: // tab = toggle control panel + evt.preventDefault(); + if (this.control_panel_active) + $('#minimize').click(); + else + $('#maximize').click(); + break; + + case 68: // d = drop organism + $('#drop-org').click(); + break; + + case 69: // e = edit organism + $('#edit').click(); + break; + + case 83: // s = select creature mode + $('#select').click(); + break; + + case 86: // v = 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'; + if (this.control_panel_active && this.tab_id == 'stats') { + this.stats_panel.startAutoRender(); + }; + $('.control-panel').css('display', control_panel_display); + $('.hot-controls').css('display', hot_control_display); + } + else { + $('.control-panel').css('display', 'none'); + $('.hot-controls').css('display', 'none'); + } + this.no_hud = !this.no_hud; + break; + + case 88: // x = clear all walls + $('#clear-walls').click(); + } + }); + } + defineEngineSpeedControls(){ this.slider = document.getElementById("slider"); this.slider.oninput = function() { @@ -261,20 +326,15 @@ class ControlPanel { break; case "edit": self.setMode(Modes.Edit); - self.editor_controller.setEditorPanel(); break; case "drop-org": self.setMode(Modes.Clone); - self.env_controller.org_to_clone = self.engine.organism_editor.getCopyOfOrg(); - self.env_controller.add_new_species = self.editor_controller.new_species; - self.editor_controller.new_species = false; - // console.log(self.env_controller.add_new_species) break; case "drag-view": self.setMode(Modes.Drag); } $('.edit-mode-btn').css('background-color', '#9099c2'); - $('#'+this.id).css('background-color', '#81d2c7'); + $('.'+this.id).css('background-color', '#81d2c7'); }); $('.reset-view').click( function(){ @@ -310,6 +370,17 @@ class ControlPanel { setMode(mode) { this.env_controller.mode = mode; this.editor_controller.mode = mode; + + if (mode == Modes.Edit) { + this.editor_controller.setEditorPanel(); + } + + if (mode == Modes.Clone) { + this.env_controller.org_to_clone = this.engine.organism_editor.getCopyOfOrg(); + this.env_controller.add_new_species = this.editor_controller.new_species; + this.editor_controller.new_species = false; + // console.log(this.env_controller.add_new_species) + } } setEditorOrganism(org) { diff --git a/src/Controllers/EnvironmentController.js b/src/Controllers/EnvironmentController.js index 451d2a9..3067ab3 100644 --- a/src/Controllers/EnvironmentController.js +++ b/src/Controllers/EnvironmentController.js @@ -28,22 +28,33 @@ class EnvironmentController extends CanvasController{ // Restrict scale scale = Math.max(0.5, this.scale+(sign*zoom_speed)); - if (scale != 0.5) { + //if (scale != 0.5) { + var cur_top = parseInt($('#env-canvas').css('top')); var cur_left = parseInt($('#env-canvas').css('left')); + + var diff_x = (this.canvas.width/2 - this.mouse_x) * (scale - this.scale); + var diff_y = (this.canvas.height/2 - this.mouse_y) * (scale - this.scale); + + /* -- Original Zoom procedure if (sign == 1) { // If we're zooming in, zoom towards wherever the mouse is - var diff_x = ((this.canvas.width/2-cur_left/this.scale) - this.mouse_x)*this.scale/1.5; - var diff_y = ((this.canvas.height/2-cur_top/this.scale) - this.mouse_y)*this.scale/1.5; + var diff_x = ((this.canvas.width/2-cur_left/this.scale) - this.mouse_x)*scale/1.5; + var diff_y = ((this.canvas.height/2-cur_top/this.scale) - this.mouse_y)*scale/1.5; + } else { // If we're zooming out, zoom out towards the center var diff_x = -cur_left/scale; var diff_y = -cur_top/scale; + var new_left = cur_left - cur_left / scale; + var new_top = cur_top - cur_top / scale; } + */ + $('#env-canvas').css('top', (cur_top+diff_y)+'px'); $('#env-canvas').css('left', (cur_left+diff_x)+'px'); - } + //} // Apply scale transform el.style.transform = `scale(${scale})`; @@ -149,6 +160,15 @@ class EnvironmentController extends CanvasController{ break; } } + else if (this.middle_click) { + //drag on middle click + var cur_top = parseInt($('#env-canvas').css('top'), 10); + var cur_left = parseInt($('#env-canvas').css('left'), 10); + var new_top = cur_top + ((this.mouse_y - this.start_y)*this.scale); + var new_left = cur_left + ((this.mouse_x - this.start_x)*this.scale); + $('#env-canvas').css('top', new_top+'px'); + $('#env-canvas').css('left', new_left+'px'); + } } dropCellType(col, row, state, killBlocking=false) { From 6ac80d44d1ffb3736f383d6ee0bbe1e513d4497a Mon Sep 17 00:00:00 2001 From: EvaisaGiac Date: Sun, 28 Nov 2021 04:16:49 +0100 Subject: [PATCH 03/51] Add ability to edit mutation rate to organism editor --- dist/index.html | 4 ++++ src/Controllers/EditorController.js | 11 ++++++++++- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/dist/index.html b/dist/index.html index 6748fe2..c0b9e04 100644 --- a/dist/index.html +++ b/dist/index.html @@ -143,6 +143,10 @@
+
+ + +

Brain

diff --git a/src/Controllers/EditorController.js b/src/Controllers/EditorController.js index e7c2152..3094557 100644 --- a/src/Controllers/EditorController.js +++ b/src/Controllers/EditorController.js @@ -93,6 +93,10 @@ class EditorController extends CanvasController{ $('#move-range-edit').change ( function() { this.env.organism.move_range = parseInt($('#move-range-edit').val()); }.bind(this)); + + $('#mutation-rate-edit').change ( function() { + this.env.organism.mutability = parseInt($('#mutation-rate-edit').val()); + }.bind(this)); $('#observation-type-edit').change ( function() { this.setBrainEditorValues($('#observation-type-edit').val()); this.setBrainDetails(); @@ -117,11 +121,14 @@ class EditorController extends CanvasController{ $('.cell-count').text("Cell count: "+org.anatomy.cells.length); $('#move-range').text("Move Range: "+org.move_range); $('#mutation-rate').text("Mutation Rate: "+org.mutability); - if (Hyperparams.useGlobalMutability) { + + if (Hyperparams.useGlobalMutability) { $('#mutation-rate').css('display', 'none'); + $('#mutation-rate-cont').css('display', 'none'); } else { $('#mutation-rate').css('display', 'block'); + $('#mutation-rate-cont').css('display', 'block'); } this.setMoveRangeVisibility(); @@ -141,6 +148,8 @@ class EditorController extends CanvasController{ if (this.setMoveRangeVisibility()){ $('#move-range-edit').val(org.move_range); } + + $('#mutation-rate-edit').val(org.mutability); if (this.setBrainPanelVisibility()){ this.setBrainEditorValues($('#observation-type-edit').val()); From 00875df083d136aa953f3a80b1e128533e8f7902 Mon Sep 17 00:00:00 2001 From: Max Robinson Date: Sun, 28 Nov 2021 13:31:33 -0600 Subject: [PATCH 04/51] removed mut prob balancing --- src/Controllers/ControlPanel.js | 3 --- src/Hyperparameters.js | 18 ---------------- src/Organism/Organism.js | 37 ++++++++++++++------------------- 3 files changed, 16 insertions(+), 42 deletions(-) diff --git a/src/Controllers/ControlPanel.js b/src/Controllers/ControlPanel.js index ab5eaa5..81b8ae2 100644 --- a/src/Controllers/ControlPanel.js +++ b/src/Controllers/ControlPanel.js @@ -192,15 +192,12 @@ class ControlPanel { switch(this.id){ case "add-prob": Hyperparams.addProb = this.value; - Hyperparams.balanceMutationProbs(1); break; case "change-prob": Hyperparams.changeProb = this.value; - Hyperparams.balanceMutationProbs(2); break; case "remove-prob": Hyperparams.removeProb = this.value; - Hyperparams.balanceMutationProbs(3); break; } $('#add-prob').val(Math.floor(Hyperparams.addProb)); diff --git a/src/Hyperparameters.js b/src/Hyperparameters.js index d7c34ed..64073f8 100644 --- a/src/Hyperparameters.js +++ b/src/Hyperparameters.js @@ -29,24 +29,6 @@ const Hyperparams = { this.foodDropProb = 0; }, - - balanceMutationProbs : function(choice) { - if (choice == 1) { - var remaining = 100 - this.addProb; - this.changeProb = remaining/2; - this.removeProb = remaining/2; - } - else if (choice == 2) { - var remaining = 100 - this.changeProb; - this.addProb = remaining/2; - this.removeProb = remaining/2; - } - else { - var remaining = 100 - this.removeProb; - this.changeProb = remaining/2; - this.addProb = remaining/2; - } - } } Hyperparams.setDefaults(); diff --git a/src/Organism/Organism.js b/src/Organism/Organism.js index 7046a59..eeada03 100644 --- a/src/Organism/Organism.js +++ b/src/Organism/Organism.js @@ -123,42 +123,37 @@ class Organism { } mutate() { - var choice = Math.floor(Math.random() * 100); - var mutated = false; - if (choice <= Hyperparams.addProb) { - // add cell - // console.log("add cell") - - var branch = this.anatomy.getRandomCell(); - var state = CellStates.getRandomLivingType();//branch.state; - var growth_direction = Neighbors.all[Math.floor(Math.random() * Neighbors.all.length)] - var c = branch.loc_col+growth_direction[0]; - var r = branch.loc_row+growth_direction[1]; + let mutated = false; + if (this.calcRandomChance(Hyperparams.addProb)) { + let branch = this.anatomy.getRandomCell(); + let state = CellStates.getRandomLivingType();//branch.state; + let growth_direction = Neighbors.all[Math.floor(Math.random() * Neighbors.all.length)] + let c = branch.loc_col+growth_direction[0]; + let r = branch.loc_row+growth_direction[1]; if (this.anatomy.canAddCellAt(c, r)){ mutated = true; this.anatomy.addRandomizedCell(state, c, r); } } - else if (choice <= Hyperparams.addProb + Hyperparams.changeProb){ - // change cell - var cell = this.anatomy.getRandomCell(); - var state = CellStates.getRandomLivingType(); - // console.log("change cell", state) + if (this.calcRandomChance(Hyperparams.changeProb)){ + let cell = this.anatomy.getRandomCell(); + let state = CellStates.getRandomLivingType(); this.anatomy.replaceCell(state, cell.loc_col, cell.loc_row); mutated = true; } - else if (choice <= Hyperparams.addProb + Hyperparams.changeProb + Hyperparams.removeProb){ - // remove cell - // console.log("remove cell") - + if (this.calcRandomChance(Hyperparams.removeProb)){ if(this.anatomy.cells.length > 1) { - var cell = this.anatomy.getRandomCell(); + let cell = this.anatomy.getRandomCell(); mutated = this.anatomy.removeCell(cell.loc_col, cell.loc_row); } } return mutated; } + calcRandomChance(prob) { + return (Math.random() * 100) <= prob; + } + attemptMove() { var direction = Directions.scalars[this.direction]; var direction_c = direction[0]; From ccb652545b3647d0fde1dfa23720bc6ef4c458bf Mon Sep 17 00:00:00 2001 From: Max Robinson Date: Sun, 28 Nov 2021 14:07:24 -0600 Subject: [PATCH 05/51] separated ui and sim delta time --- src/Controllers/ControlPanel.js | 3 +- src/Engine.js | 66 ++++++++++++++++++++++----------- 2 files changed, 46 insertions(+), 23 deletions(-) diff --git a/src/Controllers/ControlPanel.js b/src/Controllers/ControlPanel.js index ab5eaa5..e1b38a1 100644 --- a/src/Controllers/ControlPanel.js +++ b/src/Controllers/ControlPanel.js @@ -319,8 +319,7 @@ class ControlPanel { } changeEngineSpeed(change_val) { - this.engine.stop(); - this.engine.start(change_val) + this.engine.restart(change_val) this.fps = this.engine.fps; } diff --git a/src/Engine.js b/src/Engine.js index a74f693..ce32212 100644 --- a/src/Engine.js +++ b/src/Engine.js @@ -3,7 +3,9 @@ const ControlPanel = require('./Controllers/ControlPanel'); const OrganismEditor = require('./Environments/OrganismEditor'); const ColorScheme = require('./Rendering/ColorScheme'); -const render_speed = 60; +// If the simulation speed is below this value, a new interval will be created to handle ui rendering +// at a reasonable speed. If it is above, the simulation interval will be used to update the ui. +const min_render_speed = 60; class Engine { constructor(){ @@ -14,8 +16,13 @@ class Engine { this.colorscheme = new ColorScheme(this.env, this.organism_editor); this.colorscheme.loadColorScheme(); this.env.OriginOfLife(); - this.last_update = Date.now(); - this.delta_time = 0; + + this.sim_last_update = Date.now(); + this.sim_delta_time = 0; + + this.ui_last_update = Date.now(); + this.ui_delta_time = 0; + this.actual_fps = 0; this.running = false; } @@ -24,40 +31,57 @@ class Engine { if (fps <= 0) fps = 1; this.fps = fps; - this.game_loop = setInterval(function(){this.updateDeltaTime();this.environmentUpdate();}.bind(this), 1000/fps); + this.sim_loop = setInterval(()=>{ + this.updateSimDeltaTime(); + this.environmentUpdate(); + }, 1000/fps); this.running = true; - if (this.fps >= render_speed) { - if (this.render_loop != null) { - clearInterval(this.render_loop); - this.render_loop = null; + if (this.fps >= min_render_speed) { + if (this.ui_loop != null) { + clearInterval(this.ui_loop); + this.ui_loop = null; } } else - this.setRenderLoop(); + this.setUiLoop(); } stop() { - clearInterval(this.game_loop); + clearInterval(this.sim_loop); this.running = false; - this.setRenderLoop(); + this.setUiLoop(); } - setRenderLoop() { - if (this.render_loop == null) { - this.render_loop = setInterval(function(){this.updateDeltaTime();this.necessaryUpdate();}.bind(this), 1000/render_speed); + restart(fps) { + clearInterval(this.sim_loop); + this.start(fps); + } + + setUiLoop() { + if (!this.ui_loop) { + this.ui_loop = setInterval(()=> { + this.updateUIDeltaTime(); + this.necessaryUpdate(); + }, 1000/min_render_speed); } } - updateDeltaTime() { - this.delta_time = Date.now() - this.last_update; - this.last_update = Date.now(); + updateSimDeltaTime() { + this.sim_delta_time = Date.now() - this.sim_last_update; + this.sim_last_update = Date.now(); + if (!this.ui_loop) // if the ui loop isn't running, use the sim delta time + this.ui_delta_time = this.sim_delta_time; } + updateUIDeltaTime() { + this.ui_delta_time = Date.now() - this.ui_last_update; + this.ui_last_update = Date.now(); + } environmentUpdate() { - this.env.update(this.delta_time); - this.actual_fps = 1/this.delta_time*1000; - if(this.render_loop == null){ + this.actual_fps = (1000/this.sim_delta_time); + this.env.update(this.sim_delta_time); + if(this.ui_loop == null) { this.necessaryUpdate(); } @@ -65,7 +89,7 @@ class Engine { necessaryUpdate() { this.env.render(); - this.controlpanel.update(this.delta_time); + this.controlpanel.update(this.ui_delta_time); this.organism_editor.update(); } From 7e1a8bb2c2dfe18e548231a8e9d0d28b69cf7498 Mon Sep 17 00:00:00 2001 From: Max Robinson Date: Sun, 28 Nov 2021 14:46:55 -0600 Subject: [PATCH 06/51] removed ancestor tracking --- src/Stats/FossilRecord.js | 4 +++- src/Stats/Species.js | 8 +------- 2 files changed, 4 insertions(+), 8 deletions(-) diff --git a/src/Stats/FossilRecord.js b/src/Stats/FossilRecord.js index 16e58dd..c33b822 100644 --- a/src/Stats/FossilRecord.js +++ b/src/Stats/FossilRecord.js @@ -41,7 +41,9 @@ const FossilRecord = { if (species.cumulative_pop < this.min_pop) { return false; } - this.extinct_species.push(s); + // disabled for now, causes memory problems on long runs + // this.extinct_species.push(s); + // console.log("Extant species:", this.extant_species.length) // console.log("Extinct species:", this.extinct_species.length) return true; diff --git a/src/Stats/Species.js b/src/Stats/Species.js index 37daadd..f251844 100644 --- a/src/Stats/Species.js +++ b/src/Stats/Species.js @@ -3,17 +3,11 @@ const CellStates = require("../Organism/Cell/CellStates"); class Species { constructor(anatomy, ancestor, start_tick) { this.anatomy = anatomy; - this.ancestor = ancestor; + // this.ancestor = ancestor; // garbage collect ancestors to avoid memory problems this.population = 1; this.cumulative_pop = 1; this.start_tick = start_tick; this.end_tick = -1; - this.color = Math.floor(Math.random()*16777215).toString(16); - if (ancestor != null) { - // needs to be reworked, maybe removed - var mutator = Math.floor(Math.random()*16777215)-8000000; - this.color = (mutator + parseInt(ancestor.color, 16)).toString(16); - } this.name = '_' + Math.random().toString(36).substr(2, 9); this.extinct = false; this.calcAnatomyDetails(); From 299213ad6881f3519d44cdf4e5f283523920739c Mon Sep 17 00:00:00 2001 From: Max Robinson Date: Sun, 28 Nov 2021 16:22:36 -0600 Subject: [PATCH 07/51] rewrote tooltip --- dist/index.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dist/index.html b/dist/index.html index c0b9e04..31b123c 100644 --- a/dist/index.html +++ b/dist/index.html @@ -144,7 +144,7 @@
- +

From 12ca20cbf71f52c03aadd3013216805eb214d889 Mon Sep 17 00:00:00 2001 From: Max Robinson Date: Sun, 28 Nov 2021 16:23:37 -0600 Subject: [PATCH 08/51] editor now refreshes when opened --- src/Controllers/ControlPanel.js | 5 ++++- src/Controllers/EditorController.js | 15 +++++++++++++-- src/Rendering/Renderer.js | 4 ---- 3 files changed, 17 insertions(+), 7 deletions(-) diff --git a/src/Controllers/ControlPanel.js b/src/Controllers/ControlPanel.js index ab5eaa5..238dcdb 100644 --- a/src/Controllers/ControlPanel.js +++ b/src/Controllers/ControlPanel.js @@ -143,9 +143,12 @@ class ControlPanel { $(tab).css('display', 'grid'); self.engine.organism_editor.is_active = (this.id == 'editor'); self.stats_panel.stopAutoRender(); - if (this.id == 'stats') { + if (this.id === 'stats') { self.stats_panel.startAutoRender(); } + else if (this.id === 'editor') { + self.editor_controller.refreshDetailsPanel(); + } self.tab_id = this.id; }); } diff --git a/src/Controllers/EditorController.js b/src/Controllers/EditorController.js index 3094557..f0c101e 100644 --- a/src/Controllers/EditorController.js +++ b/src/Controllers/EditorController.js @@ -114,6 +114,13 @@ class EditorController extends CanvasController{ $('#edit-organism-details').css('display', 'none'); } + refreshDetailsPanel() { + if (this.mode === Modes.Edit) + this.setEditorPanel(); + else + this.setDetailsPanel(); + } + setDetailsPanel() { this.clearDetailsPanel(); var org = this.env.organism; @@ -124,11 +131,9 @@ class EditorController extends CanvasController{ if (Hyperparams.useGlobalMutability) { $('#mutation-rate').css('display', 'none'); - $('#mutation-rate-cont').css('display', 'none'); } else { $('#mutation-rate').css('display', 'block'); - $('#mutation-rate-cont').css('display', 'block'); } this.setMoveRangeVisibility(); @@ -150,6 +155,12 @@ class EditorController extends CanvasController{ } $('#mutation-rate-edit').val(org.mutability); + if (Hyperparams.useGlobalMutability) { + $('#mutation-rate-cont').css('display', 'none'); + } + else { + $('#mutation-rate-cont').css('display', 'block'); + } if (this.setBrainPanelVisibility()){ this.setBrainEditorValues($('#observation-type-edit').val()); diff --git a/src/Rendering/Renderer.js b/src/Rendering/Renderer.js index 647a9a8..41d04c5 100644 --- a/src/Rendering/Renderer.js +++ b/src/Rendering/Renderer.js @@ -105,8 +105,4 @@ class Renderer { } } -// $("body").mousemove(function(e) { -// console.log("hello"); -// }); - module.exports = Renderer; From 4f85e1cc9d4cea703c9482d19f8955aee2d56b05 Mon Sep 17 00:00:00 2001 From: Max Robinson Date: Sun, 28 Nov 2021 17:03:20 -0600 Subject: [PATCH 09/51] changed hotkeys, removed comments --- dist/index.html | 36 +++++------ src/Controllers/ControlPanel.js | 77 +++++++----------------- src/Controllers/EnvironmentController.js | 31 ++-------- 3 files changed, 47 insertions(+), 97 deletions(-) diff --git a/dist/index.html b/dist/index.html index 5b160ed..99f44d3 100644 --- a/dist/index.html +++ b/dist/index.html @@ -19,12 +19,12 @@
- - - - - - + + + + + +

Simulation Speed

@@ -62,7 +62,7 @@

Simulation Controls

Stats

Challenges

- +
@@ -98,9 +98,9 @@
- - - + + +
@@ -261,19 +261,19 @@
- - - - - - - + + + + + + +
- +
diff --git a/src/Controllers/ControlPanel.js b/src/Controllers/ControlPanel.js index f57da67..2da13ac 100644 --- a/src/Controllers/ControlPanel.js +++ b/src/Controllers/ControlPanel.js @@ -42,82 +42,52 @@ class ControlPanel { this.stats_panel.startAutoRender(); } }); - - // var self = this; - // $('#minimize').click ( function() { - // $('.control-panel').css('display', 'none'); - // $('.hot-controls').css('display', 'block'); - - // }.bind(this)); - // $('#maximize').click ( function() { - // $('.control-panel').css('display', 'grid'); - // $('.hot-controls').css('display', 'none'); - // if (self.tab_id == 'stats') { - // self.stats_panel.startAutoRender(); - // } - // }); } defineHotkeys() { - - $('body').keydown( (evt) => { - - //console.log(evt.which); - - switch (evt.which) { - + $('body').keydown( (e) => { + switch (e.key.toLowerCase()) { // hot bar controls - case 49: // 1 = Reset Camera + case 'a': $('.reset-view')[0].click(); break; - - case 50: // 2 = Drag View + case 's': $('#drag-view').click(); break; - - case 51: // 3 = Drop Wall + case 'd': $('#wall-drop').click(); break; - - case 52: // 4 = Drop Food + case 'f': $('#food-drop').click(); break; - - case 53: // 5 = Kill + case 'g': $('#click-kill').click(); break; - - case 54: // 6 = Play/Pause - case 32: // Space = Play/Pause - $('.pause-button')[0].click(); - break; - - case 55: // 7 = Toggle Rendering + case 'h': $('.headless')[0].click(); break; - + case 'j': + case ' ': + $('.pause-button')[0].click(); + break; // miscellaneous hotkeys - case 9: // tab = toggle control panel - evt.preventDefault(); + case 'q': // minimize/maximize control panel + e.preventDefault(); if (this.control_panel_active) $('#minimize').click(); else $('#maximize').click(); break; - - case 68: // d = drop organism - $('#drop-org').click(); - break; - - case 69: // e = edit organism - $('#edit').click(); - break; - - case 83: // s = select creature mode + case 'z': $('#select').click(); break; - - case 86: // v = Toggle HUD + case 'x': + $('#edit').click(); + break; + case 'c': + $('#drop-org').click(); + break; + case 'v': // 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'; @@ -133,8 +103,7 @@ class ControlPanel { } this.no_hud = !this.no_hud; break; - - case 88: // x = clear all walls + case 'b': $('#clear-walls').click(); } }); diff --git a/src/Controllers/EnvironmentController.js b/src/Controllers/EnvironmentController.js index 3067ab3..73aa0fc 100644 --- a/src/Controllers/EnvironmentController.js +++ b/src/Controllers/EnvironmentController.js @@ -28,33 +28,14 @@ class EnvironmentController extends CanvasController{ // Restrict scale scale = Math.max(0.5, this.scale+(sign*zoom_speed)); - //if (scale != 0.5) { + var cur_top = parseInt($('#env-canvas').css('top')); + var cur_left = parseInt($('#env-canvas').css('left')); - var cur_top = parseInt($('#env-canvas').css('top')); - var cur_left = parseInt($('#env-canvas').css('left')); + var diff_x = (this.canvas.width/2 - this.mouse_x) * (scale - this.scale); + var diff_y = (this.canvas.height/2 - this.mouse_y) * (scale - this.scale); - var diff_x = (this.canvas.width/2 - this.mouse_x) * (scale - this.scale); - var diff_y = (this.canvas.height/2 - this.mouse_y) * (scale - this.scale); - - /* -- Original Zoom procedure - if (sign == 1) { - // If we're zooming in, zoom towards wherever the mouse is - var diff_x = ((this.canvas.width/2-cur_left/this.scale) - this.mouse_x)*scale/1.5; - var diff_y = ((this.canvas.height/2-cur_top/this.scale) - this.mouse_y)*scale/1.5; - - } - else { - // If we're zooming out, zoom out towards the center - var diff_x = -cur_left/scale; - var diff_y = -cur_top/scale; - var new_left = cur_left - cur_left / scale; - var new_top = cur_top - cur_top / scale; - } - */ - - $('#env-canvas').css('top', (cur_top+diff_y)+'px'); - $('#env-canvas').css('left', (cur_left+diff_x)+'px'); - //} + $('#env-canvas').css('top', (cur_top+diff_y)+'px'); + $('#env-canvas').css('left', (cur_left+diff_x)+'px'); // Apply scale transform el.style.transform = `scale(${scale})`; From 347d590aa26966f8c9cc5bdb1a68d7fd0f043ddd Mon Sep 17 00:00:00 2001 From: Max Robinson Date: Sun, 28 Nov 2021 17:30:12 -0600 Subject: [PATCH 10/51] Created changelog --- Changelog.md | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 Changelog.md diff --git a/Changelog.md b/Changelog.md new file mode 100644 index 0000000..9615d8a --- /dev/null +++ b/Changelog.md @@ -0,0 +1,21 @@ +# Changelog + +## Current Dev (1.0.1) +Changes that are in the develop branch + +### Bug Fixes: +- Infinite FPS: [#42](https://github.com/MaxRobinsonTheGreat/LifeEngine/pull/45) +- Spelling Fix: [#31](https://github.com/MaxRobinsonTheGreat/LifeEngine/pull/31) + +### UI Enhancements: +- Hotkeys/improved zoom controls: [#47](https://github.com/MaxRobinsonTheGreat/LifeEngine/pull/47) +- Improved mutation probability controls: [#43](https://github.com/MaxRobinsonTheGreat/LifeEngine/pull/43) +- Ability to edit individual organism's mutability: [#46](https://github.com/MaxRobinsonTheGreat/LifeEngine/pull/46) + +### Simulation Enhancements: +- + +Thanks to contributors: @TrevorSayre @EvaisaGiac @Chrispykins + +## 1.0.0 +Initial release. From 6c41248bd6beaeb6dc5377c94d485babce9f4f2b Mon Sep 17 00:00:00 2001 From: Max Robinson Date: Sun, 28 Nov 2021 22:29:36 -0600 Subject: [PATCH 11/51] cleaned hotkeys and button coloring --- dist/css/style.css | 8 ++++---- dist/index.html | 36 ++++++++++++++++----------------- src/Controllers/ControlPanel.js | 5 +++-- 3 files changed, 25 insertions(+), 24 deletions(-) diff --git a/dist/css/style.css b/dist/css/style.css index f98f464..1714871 100644 --- a/dist/css/style.css +++ b/dist/css/style.css @@ -79,6 +79,9 @@ button { button:hover{ background-color: #81d2c7; } +button:active{ + background-color: #595e77; +} .icon-links { font-size: 35px; @@ -163,10 +166,7 @@ button:hover{ height: 30px; margin-top: 5px; } -.edit-mode-btn:hover{ - background-color: #81d2c7; -} -.edit-mode-btn#drag-view { +.edit-mode-btn.selected { background-color: #81d2c7; } #clear-walls { diff --git a/dist/index.html b/dist/index.html index 8b02b9d..0166f53 100644 --- a/dist/index.html +++ b/dist/index.html @@ -19,17 +19,17 @@
- - - - - - + + + + + +

Simulation Speed

- - + +

Target FPS: 60

@@ -98,9 +98,9 @@
- - - + + +
@@ -265,13 +265,13 @@
- - - - - - - + + + + + + +
diff --git a/src/Controllers/ControlPanel.js b/src/Controllers/ControlPanel.js index 17d3d84..5ec9e54 100644 --- a/src/Controllers/ControlPanel.js +++ b/src/Controllers/ControlPanel.js @@ -68,6 +68,7 @@ class ControlPanel { break; case 'j': case ' ': + e.preventDefault(); $('.pause-button')[0].click(); break; // miscellaneous hotkeys @@ -302,8 +303,8 @@ class ControlPanel { case "drag-view": self.setMode(Modes.Drag); } - $('.edit-mode-btn').css('background-color', '#9099c2'); - $('.'+this.id).css('background-color', '#81d2c7'); + $('.edit-mode-btn').removeClass('selected'); + $('.'+this.id).addClass('selected'); }); $('.reset-view').click( function(){ From 42957b0811cbeb3c5c267a00b094d2960d471344 Mon Sep 17 00:00:00 2001 From: Max Robinson Date: Sun, 28 Nov 2021 23:13:09 -0600 Subject: [PATCH 12/51] improved mutation chance calculation --- src/Organism/Organism.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Organism/Organism.js b/src/Organism/Organism.js index eeada03..672c302 100644 --- a/src/Organism/Organism.js +++ b/src/Organism/Organism.js @@ -151,7 +151,7 @@ class Organism { } calcRandomChance(prob) { - return (Math.random() * 100) <= prob; + return (Math.random() * 100) < prob; } attemptMove() { From 18ed47118263fb27b27d0243da6e4b741b0fba18 Mon Sep 17 00:00:00 2001 From: Max Robinson Date: Tue, 30 Nov 2021 18:33:57 -0600 Subject: [PATCH 13/51] Create feature_request.md --- .github/ISSUE_TEMPLATE/feature_request.md | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 .github/ISSUE_TEMPLATE/feature_request.md diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md new file mode 100644 index 0000000..3a22bcb --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -0,0 +1,11 @@ +--- +name: Feature request +about: Request a new feature for the life engine +title: '' +labels: +assignees: '' + +--- + + +# Do not make feature requests here, please go to the discussions tab: https://github.com/MaxRobinsonTheGreat/LifeEngine/discussions From 779d80a6e8055a637e6ebe742137c06163645e54 Mon Sep 17 00:00:00 2001 From: Max Robinson Date: Tue, 30 Nov 2021 18:35:29 -0600 Subject: [PATCH 14/51] Update feature_request.md --- .github/ISSUE_TEMPLATE/feature_request.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md index 3a22bcb..a2fcfa7 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.md +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -1,5 +1,5 @@ --- -name: Feature request +name: Feature request (Please Use discussion tab instead) about: Request a new feature for the life engine title: '' labels: From 7d99991f910c483b50975ee963e046af4579e347 Mon Sep 17 00:00:00 2001 From: Max Robinson Date: Thu, 2 Dec 2021 17:25:04 -0600 Subject: [PATCH 15/51] added clear button, food drop default mode --- dist/index.html | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/dist/index.html b/dist/index.html index 0166f53..99fba39 100644 --- a/dist/index.html +++ b/dist/index.html @@ -20,9 +20,9 @@
- + - +
@@ -32,12 +32,13 @@

Target FPS: 60

- - + + +
+

Auto reset count:

-

Grid Size

@@ -46,7 +47,6 @@
-
@@ -266,9 +266,9 @@
- + - + From baadda8a7598871577add1e335ab08388d64e854 Mon Sep 17 00:00:00 2001 From: Max Robinson Date: Thu, 2 Dec 2021 17:25:59 -0600 Subject: [PATCH 16/51] control panel minimized by default --- dist/css/style.css | 4 ++-- src/Controllers/EnvironmentController.js | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/dist/css/style.css b/dist/css/style.css index 1714871..3b15873 100644 --- a/dist/css/style.css +++ b/dist/css/style.css @@ -37,7 +37,7 @@ body{ bottom: 0; position: fixed; background-color: #3a4b68; - display: grid; + display: none; grid-template-columns: repeat(3, 1fr); /* opacity: 0.8; */ } @@ -236,7 +236,7 @@ button:active{ position: fixed; bottom: 10px; padding-left: 10px; - display: none; + /* display: none; */ } #headless-notification { diff --git a/src/Controllers/EnvironmentController.js b/src/Controllers/EnvironmentController.js index 73aa0fc..828fe08 100644 --- a/src/Controllers/EnvironmentController.js +++ b/src/Controllers/EnvironmentController.js @@ -9,7 +9,7 @@ const Hyperparams = require("../Hyperparameters"); class EnvironmentController extends CanvasController{ constructor(env, canvas) { super(env, canvas); - this.mode = Modes.Drag; + this.mode = Modes.FoodDrop; this.org_to_clone = null; this.add_new_species = false; this.defineZoomControls(); From 77a8b0530b594f38eaeb98ea7f9a5b5f87482eac Mon Sep 17 00:00:00 2001 From: Max Robinson Date: Thu, 2 Dec 2021 17:26:31 -0600 Subject: [PATCH 17/51] default food prod prob set to 5 from 4 --- src/Hyperparameters.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/Hyperparameters.js b/src/Hyperparameters.js index 64073f8..4199cd9 100644 --- a/src/Hyperparameters.js +++ b/src/Hyperparameters.js @@ -5,8 +5,7 @@ const Hyperparams = { this.headless = false; this.lifespanMultiplier = 100; - this.foodProdProb = 4; - this.foodProdProbScalar = 4; + this.foodProdProb = 5; this.killableNeighbors = Neighbors.adjacent; this.edibleNeighbors = Neighbors.adjacent; this.growableNeighbors = Neighbors.adjacent; From b4ca97902bdc7a5a3ad221b7a652ebd83f4f4c91 Mon Sep 17 00:00:00 2001 From: Max Robinson Date: Thu, 2 Dec 2021 17:27:05 -0600 Subject: [PATCH 18/51] implemented clear button and reset warning --- src/Controllers/ControlPanel.js | 68 ++++++++++++++++------------ src/Environments/WorldEnvironment.js | 11 +++-- 2 files changed, 47 insertions(+), 32 deletions(-) diff --git a/src/Controllers/ControlPanel.js b/src/Controllers/ControlPanel.js index 5ec9e54..b2dd295 100644 --- a/src/Controllers/ControlPanel.js +++ b/src/Controllers/ControlPanel.js @@ -23,6 +23,7 @@ class ControlPanel { this.headless_opacity = 1; this.opacity_change_rate = -0.8; this.paused=false; + this.setHyperparamDefaults(); } defineMinMaxControls(){ @@ -249,32 +250,36 @@ class ControlPanel { Hyperparams.foodBlocksReproduction = this.checked; }); $('#reset-rules').click( function() { - Hyperparams.setDefaults(); - $('#food-prod-prob').val(Hyperparams.foodProdProb); - $('#lifespan-multiplier').val(Hyperparams.lifespanMultiplier); - $('#mover-rot').prop('checked', Hyperparams.moversCanRotate); - $('#offspring-rot').prop('checked', Hyperparams.offspringRotate); - $('#insta-kill').prop('checked', Hyperparams.instaKill); - $('#evolved-mutation').prop('checked', !Hyperparams.useGlobalMutability); - $('#add-prob').val(Hyperparams.addProb); - $('#change-prob').val(Hyperparams.changeProb); - $('#remove-prob').val(Hyperparams.removeProb); - $('#movers-produce').prop('checked', Hyperparams.moversCanProduce); - $('#food-blocks').prop('checked', Hyperparams.foodBlocksReproduction); - $('#food-drop-rate').val(Hyperparams.foodDropProb); - $('#look-range').val(Hyperparams.lookRange); - - if (!Hyperparams.useGlobalMutability) { - $('.global-mutation-in').css('display', 'none'); - $('#avg-mut').css('display', 'block'); - } - else { - $('.global-mutation-in').css('display', 'block'); - $('#avg-mut').css('display', 'none'); - } + this.setHyperparamDefaults; }); } + setHyperparamDefaults() { + Hyperparams.setDefaults(); + $('#food-prod-prob').val(Hyperparams.foodProdProb); + $('#lifespan-multiplier').val(Hyperparams.lifespanMultiplier); + $('#mover-rot').prop('checked', Hyperparams.moversCanRotate); + $('#offspring-rot').prop('checked', Hyperparams.offspringRotate); + $('#insta-kill').prop('checked', Hyperparams.instaKill); + $('#evolved-mutation').prop('checked', !Hyperparams.useGlobalMutability); + $('#add-prob').val(Hyperparams.addProb); + $('#change-prob').val(Hyperparams.changeProb); + $('#remove-prob').val(Hyperparams.removeProb); + $('#movers-produce').prop('checked', Hyperparams.moversCanProduce); + $('#food-blocks').prop('checked', Hyperparams.foodBlocksReproduction); + $('#food-drop-rate').val(Hyperparams.foodDropProb); + $('#look-range').val(Hyperparams.lookRange); + + if (!Hyperparams.useGlobalMutability) { + $('.global-mutation-in').css('display', 'none'); + $('#avg-mut').css('display', 'block'); + } + else { + $('.global-mutation-in').css('display', 'block'); + $('#avg-mut').css('display', 'none'); + } + } + defineModeControls() { var self = this; $('.edit-mode-btn').click( function() { @@ -313,16 +318,20 @@ class ControlPanel { var env = this.engine.env; $('#reset-env').click( function() { - this.engine.env.reset(); + env.reset(); this.stats_panel.reset(); }.bind(this)); + $('#clear-env').click( () => { + env.reset(true, false); + this.stats_panel.reset(); + env.auto_reset = false; + $('#auto-reset').prop('checked', false);; + }); $('#auto-reset').change(function() { env.auto_reset = this.checked; }); $('#clear-walls').click( function() { - if (confirm("Are you sure you want to clear all the walls?")) { - this.engine.env.clearWalls(); - } + this.engine.env.clearWalls(); }.bind(this)); $('#clear-editor').click( function() { this.engine.organism_editor.clear(); @@ -367,9 +376,10 @@ class ControlPanel { updateHeadlessIcon(delta_time) { if (this.paused) return; + const min_opacity = 0.4; var op = this.headless_opacity + (this.opacity_change_rate*delta_time/1000); - if (op <= 0.4){ - op=0.4; + if (op <= min_opacity){ + op=min_opacity; this.opacity_change_rate = -this.opacity_change_rate; } else if (op >= 1){ diff --git a/src/Environments/WorldEnvironment.js b/src/Environments/WorldEnvironment.js index da7bb40..1da6c73 100644 --- a/src/Environments/WorldEnvironment.js +++ b/src/Environments/WorldEnvironment.js @@ -64,7 +64,7 @@ class WorldEnvironment extends Environment{ } if (this.organisms.length == 0 && this.auto_reset){ this.reset_count++; - this.reset(); + this.reset(false); } } @@ -130,14 +130,19 @@ class WorldEnvironment extends Environment{ } } - reset() { + reset(confirm_reset=true, reset_life=true) { + if (confirm_reset && !confirm('The current environment will be lost. Proceed?')) + return; + this.organisms = []; this.grid_map.fillGrid(CellStates.empty); this.renderer.renderFullGrid(this.grid_map.grid); this.total_mutability = 0; this.total_ticks = 0; FossilRecord.clear_record(); - this.OriginOfLife(); + if (reset_life) + this.OriginOfLife(); + } resizeGridColRow(cell_size, cols, rows) { From 754703a935a2d0b4aff6c65fd873fce6975133f6 Mon Sep 17 00:00:00 2001 From: Max Robinson Date: Thu, 2 Dec 2021 17:56:39 -0600 Subject: [PATCH 19/51] added warning on tab close/reload --- src/Controllers/ControlPanel.js | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/Controllers/ControlPanel.js b/src/Controllers/ControlPanel.js index b2dd295..a6e633b 100644 --- a/src/Controllers/ControlPanel.js +++ b/src/Controllers/ControlPanel.js @@ -336,7 +336,16 @@ class ControlPanel { $('#clear-editor').click( function() { this.engine.organism_editor.clear(); this.editor_controller.setEditorPanel(); - }.bind(this)); + }.bind(this)) + + window.onbeforeunload = function (e) { + e = e || window.event; + let return_str = 'this will cause a confirmation on page close' + if (e) { + e.returnValue = return_str; + } + return return_str; + }; } defineChallenges() { From f1897768bb3d4bb9e26e9d338238eb246f9b9660 Mon Sep 17 00:00:00 2001 From: Max Robinson Date: Thu, 2 Dec 2021 18:58:02 -0600 Subject: [PATCH 20/51] fixed hyperparams reset --- src/Controllers/ControlPanel.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Controllers/ControlPanel.js b/src/Controllers/ControlPanel.js index a6e633b..5396a9e 100644 --- a/src/Controllers/ControlPanel.js +++ b/src/Controllers/ControlPanel.js @@ -249,8 +249,8 @@ class ControlPanel { $('#food-blocks').change( function() { Hyperparams.foodBlocksReproduction = this.checked; }); - $('#reset-rules').click( function() { - this.setHyperparamDefaults; + $('#reset-rules').click(() => { + this.setHyperparamDefaults(); }); } From 3f5cf95d0b8f477125ce70b66590f5a1e944cecc Mon Sep 17 00:00:00 2001 From: Max Robinson Date: Sat, 4 Dec 2021 00:45:42 -0600 Subject: [PATCH 21/51] Update Changelog.md --- Changelog.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Changelog.md b/Changelog.md index 9615d8a..1804428 100644 --- a/Changelog.md +++ b/Changelog.md @@ -4,13 +4,14 @@ Changes that are in the develop branch ### Bug Fixes: -- Infinite FPS: [#42](https://github.com/MaxRobinsonTheGreat/LifeEngine/pull/45) +- Fixed actual FPS display: [#42](https://github.com/MaxRobinsonTheGreat/LifeEngine/pull/45) - Spelling Fix: [#31](https://github.com/MaxRobinsonTheGreat/LifeEngine/pull/31) ### UI Enhancements: - Hotkeys/improved zoom controls: [#47](https://github.com/MaxRobinsonTheGreat/LifeEngine/pull/47) - Improved mutation probability controls: [#43](https://github.com/MaxRobinsonTheGreat/LifeEngine/pull/43) - Ability to edit individual organism's mutability: [#46](https://github.com/MaxRobinsonTheGreat/LifeEngine/pull/46) +- Added clear button and improved reset warnings: [#46](https://github.com/MaxRobinsonTheGreat/LifeEngine/pull/64) ### Simulation Enhancements: - From 7ed46684f6fb9e0d786c3f998a8a2a6faaf4d4fa Mon Sep 17 00:00:00 2001 From: Max Robinson Date: Sat, 4 Dec 2021 14:36:12 -0600 Subject: [PATCH 22/51] Update Changelog.md --- Changelog.md | 31 +++++++++++++++++++++++-------- 1 file changed, 23 insertions(+), 8 deletions(-) diff --git a/Changelog.md b/Changelog.md index 1804428..b8ab8f8 100644 --- a/Changelog.md +++ b/Changelog.md @@ -1,20 +1,35 @@ # Changelog -## Current Dev (1.0.1) -Changes that are in the develop branch - -### Bug Fixes: -- Fixed actual FPS display: [#42](https://github.com/MaxRobinsonTheGreat/LifeEngine/pull/45) -- Spelling Fix: [#31](https://github.com/MaxRobinsonTheGreat/LifeEngine/pull/31) +## 1.0.1 (12/4/2021) ### UI Enhancements: - Hotkeys/improved zoom controls: [#47](https://github.com/MaxRobinsonTheGreat/LifeEngine/pull/47) + - `A` reset view + - `S/middle mouse button` pan + - `D` drop walls + - `F` drop food + - `G` click to kill + - `H` headless rendering toggle + - `Spacebar/J` pause/play toggle + - `Z` select organism + - `X` edit organism + - `C` drop organism + - `V` toggle hud + - `B` destroy all walls + - `Q` min/max control panel - Improved mutation probability controls: [#43](https://github.com/MaxRobinsonTheGreat/LifeEngine/pull/43) - Ability to edit individual organism's mutability: [#46](https://github.com/MaxRobinsonTheGreat/LifeEngine/pull/46) -- Added clear button and improved reset warnings: [#46](https://github.com/MaxRobinsonTheGreat/LifeEngine/pull/64) +- Added clear button and improved reset warnings: [#64](https://github.com/MaxRobinsonTheGreat/LifeEngine/pull/64) ### Simulation Enhancements: -- +- Default food prodcution probability increased from 4->5 + + +### Bug Fixes: +- Fixed actual FPS display: [#45](https://github.com/MaxRobinsonTheGreat/LifeEngine/pull/45) +- Fixed slow down/crash on very long runs: [#63](https://github.com/MaxRobinsonTheGreat/LifeEngine/pull/63) +- Spelling Fix: [#31](https://github.com/MaxRobinsonTheGreat/LifeEngine/pull/31) + Thanks to contributors: @TrevorSayre @EvaisaGiac @Chrispykins From 8346e56ac3d36655e24a908c989baad1bf6745f4 Mon Sep 17 00:00:00 2001 From: Max Robinson Date: Sat, 4 Dec 2021 14:39:52 -0600 Subject: [PATCH 23/51] Update Changelog.md --- Changelog.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Changelog.md b/Changelog.md index b8ab8f8..758168d 100644 --- a/Changelog.md +++ b/Changelog.md @@ -20,11 +20,11 @@ - Improved mutation probability controls: [#43](https://github.com/MaxRobinsonTheGreat/LifeEngine/pull/43) - Ability to edit individual organism's mutability: [#46](https://github.com/MaxRobinsonTheGreat/LifeEngine/pull/46) - Added clear button and improved reset warnings: [#64](https://github.com/MaxRobinsonTheGreat/LifeEngine/pull/64) +- Control Panel is minimized by default: [#64](https://github.com/MaxRobinsonTheGreat/LifeEngine/pull/64) ### Simulation Enhancements: - Default food prodcution probability increased from 4->5 - ### Bug Fixes: - Fixed actual FPS display: [#45](https://github.com/MaxRobinsonTheGreat/LifeEngine/pull/45) - Fixed slow down/crash on very long runs: [#63](https://github.com/MaxRobinsonTheGreat/LifeEngine/pull/63) From 455dedd1d23eb9fbeaac2d31e80d7113995665d1 Mon Sep 17 00:00:00 2001 From: M4YX0R Date: Fri, 10 Dec 2021 08:43:28 +0300 Subject: [PATCH 24/51] Allow dragging while not rendering (Fix) --- src/Controllers/EnvironmentController.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Controllers/EnvironmentController.js b/src/Controllers/EnvironmentController.js index 828fe08..8722d61 100644 --- a/src/Controllers/EnvironmentController.js +++ b/src/Controllers/EnvironmentController.js @@ -71,7 +71,7 @@ class EnvironmentController extends CanvasController{ } performModeAction() { - if (Hyperparams.headless) + if (Hyperparams.headless && this.mode != Modes.Drag) return; var mode = this.mode; var right_click = this.right_click; From f9da6ac81f35842ac08ec0cbbed75d115877aca2 Mon Sep 17 00:00:00 2001 From: M4YX0R Date: Sat, 11 Dec 2021 09:33:12 +0300 Subject: [PATCH 25/51] Organic looking random walls using noise start --- dist/index.html | 2 ++ src/Controllers/ControlPanel.js | 3 +++ src/Controllers/EnvironmentController.js | 20 ++++++++++++++++++++ src/Environments/WorldEnvironment.js | 6 +++--- 4 files changed, 28 insertions(+), 3 deletions(-) diff --git a/dist/index.html b/dist/index.html index 99fba39..d698074 100644 --- a/dist/index.html +++ b/dist/index.html @@ -35,6 +35,8 @@
+ +

diff --git a/src/Controllers/ControlPanel.js b/src/Controllers/ControlPanel.js index 5396a9e..fcbe8b3 100644 --- a/src/Controllers/ControlPanel.js +++ b/src/Controllers/ControlPanel.js @@ -327,6 +327,9 @@ class ControlPanel { env.auto_reset = false; $('#auto-reset').prop('checked', false);; }); + $('#random-walls').click( function() { + this.env_controller.randomizeWalls(); + }.bind(this)); $('#auto-reset').change(function() { env.auto_reset = this.checked; }); diff --git a/src/Controllers/EnvironmentController.js b/src/Controllers/EnvironmentController.js index 828fe08..2eeb27c 100644 --- a/src/Controllers/EnvironmentController.js +++ b/src/Controllers/EnvironmentController.js @@ -51,6 +51,26 @@ class EnvironmentController extends CanvasController{ this.scale = 1; } + /* + Iterate over grid from 0,0 to env.num_cols,env.num_rows and create random walls using perlin noise to create a more organic shape. + */ + randomizeWalls(thickness=1) { + var noise_scale = 0.05; + var noise_offset = 0.5; + var noise_threshold = 0.5; + var noise_multiplier = 0.5; + var noise_offset_x = this.env.num_cols/2; + var noise_offset_y = this.env.num_rows/2; + for (var r = 0; r < this.env.num_rows; r++) { + for (var c = 0; c < this.env.num_cols; c++) { + var noise = noise_multiplier * noise_offset + noise_scale * noise_offset * Math.sin(noise_scale * (c + noise_offset_x) + noise_scale * (r + noise_offset_y)); + if (noise > noise_threshold && noise < noise_threshold + thickness/10) { + this.dropCellType(c, r, CellStates.wall, true); + } + } + } + } + updateMouseLocation(offsetX, offsetY){ super.updateMouseLocation(offsetX, offsetY); diff --git a/src/Environments/WorldEnvironment.js b/src/Environments/WorldEnvironment.js index 1da6c73..039fcad 100644 --- a/src/Environments/WorldEnvironment.js +++ b/src/Environments/WorldEnvironment.js @@ -12,9 +12,9 @@ class WorldEnvironment extends Environment{ super(); this.renderer = new Renderer('env-canvas', 'env', cell_size); this.controller = new EnvironmentController(this, this.renderer.canvas); - var grid_rows = Math.ceil(this.renderer.height / cell_size); - var grid_cols = Math.ceil(this.renderer.width / cell_size); - this.grid_map = new GridMap(grid_cols, grid_rows, cell_size); + this.num_rows = Math.ceil(this.renderer.height / cell_size); + this.num_cols = Math.ceil(this.renderer.width / cell_size); + this.grid_map = new GridMap(num_cols, num_rows, cell_size); this.organisms = []; this.walls = []; this.total_mutability = 0; From efe93e258d469f71623faa4b77261c954d30223d Mon Sep 17 00:00:00 2001 From: M4YX0R Date: Sat, 11 Dec 2021 09:38:56 +0300 Subject: [PATCH 26/51] simple bug fix, this. --- src/Environments/WorldEnvironment.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Environments/WorldEnvironment.js b/src/Environments/WorldEnvironment.js index 039fcad..a57293e 100644 --- a/src/Environments/WorldEnvironment.js +++ b/src/Environments/WorldEnvironment.js @@ -14,7 +14,7 @@ class WorldEnvironment extends Environment{ this.controller = new EnvironmentController(this, this.renderer.canvas); this.num_rows = Math.ceil(this.renderer.height / cell_size); this.num_cols = Math.ceil(this.renderer.width / cell_size); - this.grid_map = new GridMap(num_cols, num_rows, cell_size); + this.grid_map = new GridMap(this.num_cols, this.num_rows, cell_size); this.organisms = []; this.walls = []; this.total_mutability = 0; From 566a9feca45502a5dd76ef30089d361832222f41 Mon Sep 17 00:00:00 2001 From: M4YX0R Date: Sat, 11 Dec 2021 09:51:52 +0300 Subject: [PATCH 27/51] typo fix --- dist/index.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dist/index.html b/dist/index.html index d698074..5585f26 100644 --- a/dist/index.html +++ b/dist/index.html @@ -35,7 +35,7 @@
- +
From 575207df8352b7f436d63a537d457e290d8a37a8 Mon Sep 17 00:00:00 2001 From: M4YX0R Date: Sat, 11 Dec 2021 09:55:34 +0300 Subject: [PATCH 28/51] Better look for random walls button --- dist/index.html | 1 + 1 file changed, 1 insertion(+) diff --git a/dist/index.html b/dist/index.html index 5585f26..62d700e 100644 --- a/dist/index.html +++ b/dist/index.html @@ -35,6 +35,7 @@
+

From 61a6bf9eea2f42f508036b5981b08d8b1fcc79b4 Mon Sep 17 00:00:00 2001 From: M4YX0R Date: Sat, 11 Dec 2021 09:57:40 +0300 Subject: [PATCH 29/51] Better look --- dist/css/style.css | 1 + 1 file changed, 1 insertion(+) diff --git a/dist/css/style.css b/dist/css/style.css index 3b15873..a0624dc 100644 --- a/dist/css/style.css +++ b/dist/css/style.css @@ -75,6 +75,7 @@ button { display: inline-block; font-size: 16px; min-width: 30px; + margin: 2px; } button:hover{ background-color: #81d2c7; From b24159539ef70696f56304cd935987cc0f4f9ce0 Mon Sep 17 00:00:00 2001 From: M4YX0R Date: Sat, 11 Dec 2021 09:59:12 +0300 Subject: [PATCH 30/51] Remove hr tag. --- dist/index.html | 1 - 1 file changed, 1 deletion(-) diff --git a/dist/index.html b/dist/index.html index 62d700e..5585f26 100644 --- a/dist/index.html +++ b/dist/index.html @@ -35,7 +35,6 @@
-

From 0b5209ad31baa2bdea13d00989d5e19f90dd683a Mon Sep 17 00:00:00 2001 From: M4YX0R Date: Sat, 11 Dec 2021 10:26:55 +0300 Subject: [PATCH 31/51] Better noise than stripes :D --- src/Controllers/EnvironmentController.js | 13 +++---- src/Utils/Perlin.js | 46 ++++++++++++++++++++++++ 2 files changed, 53 insertions(+), 6 deletions(-) create mode 100644 src/Utils/Perlin.js diff --git a/src/Controllers/EnvironmentController.js b/src/Controllers/EnvironmentController.js index 2eeb27c..c36571f 100644 --- a/src/Controllers/EnvironmentController.js +++ b/src/Controllers/EnvironmentController.js @@ -5,6 +5,7 @@ const CellStates = require("../Organism/Cell/CellStates"); const Neighbors = require("../Grid/Neighbors"); const FossilRecord = require("../Stats/FossilRecord"); const Hyperparams = require("../Hyperparameters"); +const Perlin = require("../Utils/Perlin"); class EnvironmentController extends CanvasController{ constructor(env, canvas) { @@ -55,20 +56,20 @@ class EnvironmentController extends CanvasController{ Iterate over grid from 0,0 to env.num_cols,env.num_rows and create random walls using perlin noise to create a more organic shape. */ randomizeWalls(thickness=1) { - var noise_scale = 0.05; - var noise_offset = 0.5; var noise_threshold = 0.5; - var noise_multiplier = 0.5; - var noise_offset_x = this.env.num_cols/2; - var noise_offset_y = this.env.num_rows/2; + var avg_noise = 0; + for (var r = 0; r < this.env.num_rows; r++) { for (var c = 0; c < this.env.num_cols; c++) { - var noise = noise_multiplier * noise_offset + noise_scale * noise_offset * Math.sin(noise_scale * (c + noise_offset_x) + noise_scale * (r + noise_offset_y)); + var noise = Perlin.get(c, r); + avg_noise += noise/(this.env.num_rows*this.env.num_cols); if (noise > noise_threshold && noise < noise_threshold + thickness/10) { this.dropCellType(c, r, CellStates.wall, true); } } } + + console.log("Average noise: " + avg_noise); } updateMouseLocation(offsetX, offsetY){ diff --git a/src/Utils/Perlin.js b/src/Utils/Perlin.js new file mode 100644 index 0000000..ab9b5ca --- /dev/null +++ b/src/Utils/Perlin.js @@ -0,0 +1,46 @@ +let perlin = { + rand_vect: function(){ + let theta = Math.random() * 2 * Math.PI; + return {x: Math.cos(theta), y: Math.sin(theta)}; + }, + dot_prod_grid: function(x, y, vx, vy){ + let g_vect; + let d_vect = {x: x - vx, y: y - vy}; + if (this.gradients[[vx,vy]]){ + g_vect = this.gradients[[vx,vy]]; + } else { + g_vect = this.rand_vect(); + this.gradients[[vx, vy]] = g_vect; + } + return d_vect.x * g_vect.x + d_vect.y * g_vect.y; + }, + smootherstep: function(x){ + return 6*x**5 - 15*x**4 + 10*x**3; + }, + interp: function(x, a, b){ + return a + this.smootherstep(x) * (b-a); + }, + seed: function(){ + this.gradients = {}; + this.memory = {}; + }, + get: function(x, y) { + if (this.memory.hasOwnProperty([x,y])) + return this.memory[[x,y]]; + let xf = Math.floor(x); + let yf = Math.floor(y); + //interpolate + let tl = this.dot_prod_grid(x, y, xf, yf); + let tr = this.dot_prod_grid(x, y, xf+1, yf); + let bl = this.dot_prod_grid(x, y, xf, yf+1); + let br = this.dot_prod_grid(x, y, xf+1, yf+1); + let xt = this.interp(x-xf, tl, tr); + let xb = this.interp(x-xf, bl, br); + let v = this.interp(y-yf, xt, xb); + this.memory[[x,y]] = v; + return v; + } +} +perlin.seed(); + +module.exports = perlin; \ No newline at end of file From 75d5b85953cdddfb8bf8c2e3433a4b9c058bed6a Mon Sep 17 00:00:00 2001 From: M4YX0R Date: Sat, 11 Dec 2021 10:38:27 +0300 Subject: [PATCH 32/51] Better noise and tweaks --- src/Controllers/EnvironmentController.js | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/Controllers/EnvironmentController.js b/src/Controllers/EnvironmentController.js index c36571f..d1ef2f8 100644 --- a/src/Controllers/EnvironmentController.js +++ b/src/Controllers/EnvironmentController.js @@ -56,14 +56,16 @@ class EnvironmentController extends CanvasController{ Iterate over grid from 0,0 to env.num_cols,env.num_rows and create random walls using perlin noise to create a more organic shape. */ randomizeWalls(thickness=1) { - var noise_threshold = 0.5; + this.env.clearWalls(); + var noise_threshold = -0.27399911269163185; var avg_noise = 0; + Perlin.seed(); for (var r = 0; r < this.env.num_rows; r++) { for (var c = 0; c < this.env.num_cols; c++) { - var noise = Perlin.get(c, r); + var noise = Perlin.get(c/this.env.num_cols, r/this.env.num_rows); avg_noise += noise/(this.env.num_rows*this.env.num_cols); - if (noise > noise_threshold && noise < noise_threshold + thickness/10) { + if (noise > noise_threshold && noise < noise_threshold + thickness/100) { this.dropCellType(c, r, CellStates.wall, true); } } From 8fcf5f2251f49a0dce591f4c41a77a0b0c9fdf17 Mon Sep 17 00:00:00 2001 From: M4YX0R Date: Sat, 11 Dec 2021 11:04:32 +0300 Subject: [PATCH 33/51] Better walls! Really better! --- src/Controllers/EnvironmentController.js | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/Controllers/EnvironmentController.js b/src/Controllers/EnvironmentController.js index d1ef2f8..bb19cc9 100644 --- a/src/Controllers/EnvironmentController.js +++ b/src/Controllers/EnvironmentController.js @@ -57,16 +57,20 @@ class EnvironmentController extends CanvasController{ */ randomizeWalls(thickness=1) { this.env.clearWalls(); - var noise_threshold = -0.27399911269163185; + var noise_threshold = -0.017; var avg_noise = 0; Perlin.seed(); for (var r = 0; r < this.env.num_rows; r++) { for (var c = 0; c < this.env.num_cols; c++) { - var noise = Perlin.get(c/this.env.num_cols, r/this.env.num_rows); + var noise = Perlin.get(c/this.env.num_cols*(20/this.env.renderer.cell_size), r/this.env.num_rows*(20/this.env.renderer.cell_size)); avg_noise += noise/(this.env.num_rows*this.env.num_cols); - if (noise > noise_threshold && noise < noise_threshold + thickness/100) { - this.dropCellType(c, r, CellStates.wall, true); + if (noise > noise_threshold && noise < noise_threshold + thickness/(4*this.env.renderer.cell_size)) { + var cell = this.env.grid_map.cellAt(c, r); + if (cell != null) { + if(cell.owner != null) cell.owner.die(); + this.env.changeCell(c, r, CellStates.wall, null); + } } } } From 95cf6b90b428db3b8460a93d155d7cb8f5e9b60a Mon Sep 17 00:00:00 2001 From: M4YX0R Date: Sat, 11 Dec 2021 11:06:21 +0300 Subject: [PATCH 34/51] Cell size based resize fix --- src/Environments/WorldEnvironment.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Environments/WorldEnvironment.js b/src/Environments/WorldEnvironment.js index a57293e..3db4c31 100644 --- a/src/Environments/WorldEnvironment.js +++ b/src/Environments/WorldEnvironment.js @@ -154,9 +154,9 @@ class WorldEnvironment extends Environment{ resizeFillWindow(cell_size) { this.renderer.cell_size = cell_size; this.renderer.fillWindow('env'); - var cols = Math.ceil(this.renderer.width / cell_size); - var rows = Math.ceil(this.renderer.height / cell_size); - this.grid_map.resize(cols, rows, cell_size); + this.num_cols = Math.ceil(this.renderer.width / cell_size); + this.num_rows = Math.ceil(this.renderer.height / cell_size); + this.grid_map.resize(this.num_cols, this.num_rows, cell_size); } } From 224ab1728c12bbf605f76b413666009d7df3ab68 Mon Sep 17 00:00:00 2001 From: M4YX0R Date: Sat, 11 Dec 2021 11:29:56 +0300 Subject: [PATCH 35/51] Wall gen screen w/h ratio and clearWalls null fix --- src/Controllers/EnvironmentController.js | 7 +++++-- src/Environments/WorldEnvironment.js | 3 ++- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/Controllers/EnvironmentController.js b/src/Controllers/EnvironmentController.js index bb19cc9..7f96b00 100644 --- a/src/Controllers/EnvironmentController.js +++ b/src/Controllers/EnvironmentController.js @@ -59,13 +59,16 @@ class EnvironmentController extends CanvasController{ this.env.clearWalls(); var noise_threshold = -0.017; var avg_noise = 0; + var resolution = 20; Perlin.seed(); for (var r = 0; r < this.env.num_rows; r++) { for (var c = 0; c < this.env.num_cols; c++) { - var noise = Perlin.get(c/this.env.num_cols*(20/this.env.renderer.cell_size), r/this.env.num_rows*(20/this.env.renderer.cell_size)); + var xval = c/this.env.num_cols*(resolution/this.env.renderer.cell_size*(this.env.num_cols/this.env.num_rows)); + var yval = r/this.env.num_rows*(resolution/this.env.renderer.cell_size*(this.env.num_rows/this.env.num_cols)); + var noise = Perlin.get(xval, yval); avg_noise += noise/(this.env.num_rows*this.env.num_cols); - if (noise > noise_threshold && noise < noise_threshold + thickness/(4*this.env.renderer.cell_size)) { + if (noise > noise_threshold && noise < noise_threshold + thickness/100*this.env.renderer.cell_size) { var cell = this.env.grid_map.cellAt(c, r); if (cell != null) { if(cell.owner != null) cell.owner.die(); diff --git a/src/Environments/WorldEnvironment.js b/src/Environments/WorldEnvironment.js index 3db4c31..791fc66 100644 --- a/src/Environments/WorldEnvironment.js +++ b/src/Environments/WorldEnvironment.js @@ -104,7 +104,8 @@ class WorldEnvironment extends Environment{ clearWalls() { for(var wall of this.walls){ - if (this.grid_map.cellAt(wall.col, wall.row).state == CellStates.wall) + var wcell = this.grid_map.cellAt(wall.col, wall.row); + if (wcell && wcell.state == CellStates.wall) this.changeCell(wall.col, wall.row, CellStates.empty, null); } } From 6d58a83a5e9bd5f9c4de179c83c4f1f31ad4faf3 Mon Sep 17 00:00:00 2001 From: M4YX0R Date: Sat, 11 Dec 2021 12:34:38 +0300 Subject: [PATCH 36/51] Noise theresold tweak for different cell sizes --- src/Controllers/EnvironmentController.js | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/Controllers/EnvironmentController.js b/src/Controllers/EnvironmentController.js index 7f96b00..8a75175 100644 --- a/src/Controllers/EnvironmentController.js +++ b/src/Controllers/EnvironmentController.js @@ -68,7 +68,7 @@ class EnvironmentController extends CanvasController{ var yval = r/this.env.num_rows*(resolution/this.env.renderer.cell_size*(this.env.num_rows/this.env.num_cols)); var noise = Perlin.get(xval, yval); avg_noise += noise/(this.env.num_rows*this.env.num_cols); - if (noise > noise_threshold && noise < noise_threshold + thickness/100*this.env.renderer.cell_size) { + if (noise > noise_threshold && noise < noise_threshold + thickness/resolution*(5/this.env.renderer.cell_size)) { var cell = this.env.grid_map.cellAt(c, r); if (cell != null) { if(cell.owner != null) cell.owner.die(); @@ -77,8 +77,6 @@ class EnvironmentController extends CanvasController{ } } } - - console.log("Average noise: " + avg_noise); } updateMouseLocation(offsetX, offsetY){ From 957385d9bf500d3d75513aaf0e3ddc768b7ccefc Mon Sep 17 00:00:00 2001 From: M4YX0R Date: Sat, 11 Dec 2021 12:42:09 +0300 Subject: [PATCH 37/51] Wall thickness tweak for different cell_size vals --- src/Controllers/EnvironmentController.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Controllers/EnvironmentController.js b/src/Controllers/EnvironmentController.js index 8a75175..db47cfc 100644 --- a/src/Controllers/EnvironmentController.js +++ b/src/Controllers/EnvironmentController.js @@ -68,7 +68,7 @@ class EnvironmentController extends CanvasController{ var yval = r/this.env.num_rows*(resolution/this.env.renderer.cell_size*(this.env.num_rows/this.env.num_cols)); var noise = Perlin.get(xval, yval); avg_noise += noise/(this.env.num_rows*this.env.num_cols); - if (noise > noise_threshold && noise < noise_threshold + thickness/resolution*(5/this.env.renderer.cell_size)) { + if (noise > noise_threshold && noise < noise_threshold + thickness/resolution) { var cell = this.env.grid_map.cellAt(c, r); if (cell != null) { if(cell.owner != null) cell.owner.die(); From b79ee47daf333b3bc9e5dea1c0e9b0c549a26226 Mon Sep 17 00:00:00 2001 From: MaxRobinsonTheGreat Date: Fri, 17 Dec 2021 18:20:43 -0600 Subject: [PATCH 38/51] removed armor reproduction bug --- src/Organism/Organism.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/Organism/Organism.js b/src/Organism/Organism.js index 672c302..589bfb9 100644 --- a/src/Organism/Organism.js +++ b/src/Organism/Organism.js @@ -243,8 +243,7 @@ class Organism { if (cell==null) { return false; } - // console.log(cell.owner == this) - if (cell.owner==this || cell.state==CellStates.empty || (!Hyperparams.foodBlocksReproduction && cell.state==CellStates.food) || (ignore_armor && loccell.state==CellStates.armor && cell.state==CellStates.food)){ + if (cell.owner==this || cell.state==CellStates.empty || (!Hyperparams.foodBlocksReproduction && cell.state==CellStates.food)){ continue; } return false; From b8b312bccb08190e9a541e79e8e9685a0aac73e5 Mon Sep 17 00:00:00 2001 From: MaxRobinsonTheGreat Date: Fri, 17 Dec 2021 18:22:14 -0600 Subject: [PATCH 39/51] added to changelog --- Changelog.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/Changelog.md b/Changelog.md index 758168d..c668d83 100644 --- a/Changelog.md +++ b/Changelog.md @@ -1,5 +1,18 @@ # Changelog +## 1.0.2 (current development) + +### UI Enhancements: + +### Simulation Enhancements: + +### Bug Fixes: +- Armor is no longer ignored when checking for clear reproduction space +- + + +Thanks to contributors: + ## 1.0.1 (12/4/2021) ### UI Enhancements: From 002d04958dbeade201a12b8a997262d2e5634c8b Mon Sep 17 00:00:00 2001 From: MaxRobinsonTheGreat Date: Fri, 17 Dec 2021 19:01:06 -0600 Subject: [PATCH 40/51] var -> let --- src/Controllers/EnvironmentController.js | 19 +++++++++---------- src/Environments/WorldEnvironment.js | 2 +- 2 files changed, 10 insertions(+), 11 deletions(-) diff --git a/src/Controllers/EnvironmentController.js b/src/Controllers/EnvironmentController.js index db47cfc..75b903d 100644 --- a/src/Controllers/EnvironmentController.js +++ b/src/Controllers/EnvironmentController.js @@ -57,19 +57,19 @@ class EnvironmentController extends CanvasController{ */ randomizeWalls(thickness=1) { this.env.clearWalls(); - var noise_threshold = -0.017; - var avg_noise = 0; - var resolution = 20; + const noise_threshold = -0.017; + let avg_noise = 0; + let resolution = 20; Perlin.seed(); - for (var r = 0; r < this.env.num_rows; r++) { - for (var c = 0; c < this.env.num_cols; c++) { - var xval = c/this.env.num_cols*(resolution/this.env.renderer.cell_size*(this.env.num_cols/this.env.num_rows)); - var yval = r/this.env.num_rows*(resolution/this.env.renderer.cell_size*(this.env.num_rows/this.env.num_cols)); - var noise = Perlin.get(xval, yval); + for (let r = 0; r < this.env.num_rows; r++) { + for (let c = 0; c < this.env.num_cols; c++) { + let xval = c/this.env.num_cols*(resolution/this.env.renderer.cell_size*(this.env.num_cols/this.env.num_rows)); + let yval = r/this.env.num_rows*(resolution/this.env.renderer.cell_size*(this.env.num_rows/this.env.num_cols)); + let noise = Perlin.get(xval, yval); avg_noise += noise/(this.env.num_rows*this.env.num_cols); if (noise > noise_threshold && noise < noise_threshold + thickness/resolution) { - var cell = this.env.grid_map.cellAt(c, r); + let cell = this.env.grid_map.cellAt(c, r); if (cell != null) { if(cell.owner != null) cell.owner.die(); this.env.changeCell(c, r, CellStates.wall, null); @@ -80,7 +80,6 @@ class EnvironmentController extends CanvasController{ } updateMouseLocation(offsetX, offsetY){ - super.updateMouseLocation(offsetX, offsetY); } diff --git a/src/Environments/WorldEnvironment.js b/src/Environments/WorldEnvironment.js index 791fc66..fdf48c3 100644 --- a/src/Environments/WorldEnvironment.js +++ b/src/Environments/WorldEnvironment.js @@ -104,7 +104,7 @@ class WorldEnvironment extends Environment{ clearWalls() { for(var wall of this.walls){ - var wcell = this.grid_map.cellAt(wall.col, wall.row); + let wcell = this.grid_map.cellAt(wall.col, wall.row); if (wcell && wcell.state == CellStates.wall) this.changeCell(wall.col, wall.row, CellStates.empty, null); } From 19c2772e6268cbd31b3b0779e353ff9b4c96d717 Mon Sep 17 00:00:00 2001 From: Max Robinson Date: Fri, 17 Dec 2021 19:02:47 -0600 Subject: [PATCH 41/51] Update Changelog.md --- Changelog.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Changelog.md b/Changelog.md index c668d83..bf73909 100644 --- a/Changelog.md +++ b/Changelog.md @@ -3,6 +3,8 @@ ## 1.0.2 (current development) ### UI Enhancements: +- Button to generate random walls with perlin noise generator +- Can now drag view while rendering is off ### Simulation Enhancements: From b813dfa4c45706e4c5e190181cdbbd1d06bbaa4d Mon Sep 17 00:00:00 2001 From: MaxRobinsonTheGreat Date: Sat, 18 Dec 2021 10:34:19 -0600 Subject: [PATCH 42/51] max fps and active tab css --- dist/css/style.css | 4 ++++ dist/index.html | 2 +- src/Controllers/ControlPanel.js | 9 +++++++-- 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/dist/css/style.css b/dist/css/style.css index a0624dc..1178ec3 100644 --- a/dist/css/style.css +++ b/dist/css/style.css @@ -134,6 +134,10 @@ button:active{ background-color: #81d2c7; color: black; } +.open-tab { + background-color: #66a39b; + color: black; +} .tab { grid-template-columns: repeat(2, 1fr); diff --git a/dist/index.html b/dist/index.html index 5585f26..d5a5c9a 100644 --- a/dist/index.html +++ b/dist/index.html @@ -59,7 +59,7 @@
-

About

+

About

Editor

Simulation Controls

Stats

diff --git a/src/Controllers/ControlPanel.js b/src/Controllers/ControlPanel.js index fcbe8b3..a7369a5 100644 --- a/src/Controllers/ControlPanel.js +++ b/src/Controllers/ControlPanel.js @@ -114,11 +114,14 @@ class ControlPanel { defineEngineSpeedControls(){ this.slider = document.getElementById("slider"); this.slider.oninput = function() { - this.fps = this.slider.value + const max_fps = 300; + this.fps = this.slider.value; + if (this.fps>=max_fps) this.fps = 1000; if (this.engine.running) { this.changeEngineSpeed(this.fps); } - $('#fps').text("Target FPS: "+this.fps); + let text = this.fps >= max_fps ? 'MAX' : this.fps; + $('#fps').text("Target FPS: "+text); }.bind(this); $('.pause-button').click(function() { $('.pause-button').find("i").toggleClass("fa fa-pause"); @@ -177,6 +180,8 @@ class ControlPanel { $('.tab').css('display', 'none'); var tab = '#'+this.id+'.tab'; $(tab).css('display', 'grid'); + $('.tabnav-item').removeClass('open-tab') + $('#'+this.id+'.tabnav-item').addClass('open-tab'); self.engine.organism_editor.is_active = (this.id == 'editor'); self.stats_panel.stopAutoRender(); if (this.id === 'stats') { From 09ed9edb07d4eed22daf79e68b009005a038965d Mon Sep 17 00:00:00 2001 From: MaxRobinsonTheGreat Date: Sat, 18 Dec 2021 11:06:55 -0600 Subject: [PATCH 43/51] created world controls tab --- dist/css/style.css | 16 +++++++++--- dist/index.html | 64 +++++++++++++++++++++++++++++----------------- 2 files changed, 52 insertions(+), 28 deletions(-) diff --git a/dist/css/style.css b/dist/css/style.css index 1178ec3..823001a 100644 --- a/dist/css/style.css +++ b/dist/css/style.css @@ -57,11 +57,15 @@ body{ img { image-rendering: -moz-crisp-edges; - image-rendering: -webkit-crisp-edges; - image-rendering: pixelated; - image-rendering: crisp-edges; - width: 60%; + image-rendering: -webkit-crisp-edges; + image-rendering: pixelated; + image-rendering: crisp-edges; + object-fit: cover; + width: 85%; + max-width: 500px; + max-height: 40%; border-radius: 10px; + overflow: hidden; } button { @@ -260,4 +264,8 @@ button:active{ } #maximize-hot-control { right: 10px; +} + +.grid-size-in { + width: 75px; } \ No newline at end of file diff --git a/dist/index.html b/dist/index.html index d5a5c9a..ec40fda 100644 --- a/dist/index.html +++ b/dist/index.html @@ -24,9 +24,9 @@ -
-

Simulation Speed

+ Life Engine +

Simulation Speed

@@ -34,26 +34,6 @@

-
- -
- - -
-

Auto reset count:

-

Grid Size

- - - - -
- - - - -
-
-
@@ -61,15 +41,15 @@

About

Editor

+

World Controls

Simulation Controls

Stats

-

Challenges

+
- Life Engine

The Life Engine is a virtual ecosystem that allows organisms to grow, spread, and compete.

Each organism is made up by a structure of cells, which provide different benefits based on their color.

@@ -177,6 +157,42 @@
+
+
+

Grid Size

+ + + + +
+ + + + +
+
+ +

Reset Options

+ + +
+

Auto reset count:

+ + + +
+
+
+ +
+ + +
+

Simulation Controls

From fe2d6aae7c2cc0f45385c4c8eff09614d0449772 Mon Sep 17 00:00:00 2001 From: MaxRobinsonTheGreat Date: Sat, 18 Dec 2021 11:24:31 -0600 Subject: [PATCH 44/51] embed youtube vid --- dist/css/style.css | 8 ++++++++ dist/index.html | 18 +++++++----------- 2 files changed, 15 insertions(+), 11 deletions(-) diff --git a/dist/css/style.css b/dist/css/style.css index 823001a..f0a008f 100644 --- a/dist/css/style.css +++ b/dist/css/style.css @@ -268,4 +268,12 @@ button:active{ .grid-size-in { width: 75px; +} + +#video { + height: 100%; + max-height: 190px; + margin: auto; + margin-bottom: 0; + padding-bottom: 0; } \ No newline at end of file diff --git a/dist/index.html b/dist/index.html index ec40fda..506957f 100644 --- a/dist/index.html +++ b/dist/index.html @@ -50,12 +50,9 @@
+

The Life Engine

The Life Engine is a virtual ecosystem that allows organisms to grow, spread, and compete.

-

Each organism is made up by a structure of cells, which provide different benefits based on their color.

- -
-
-

Cell Types

+

Each organism is made up of different colored cells. Hover over each color to learn what it does.

@@ -65,14 +62,13 @@
-
-
-

Hover over each color to learn what it does. For a more in depth explanation of the simulation, view the - readme and you can explore the source code. -

+

+
+
+
From c319ed9dc56da0ac317b55ec27110a21c57044f7 Mon Sep 17 00:00:00 2001 From: MaxRobinsonTheGreat Date: Sat, 18 Dec 2021 11:53:30 -0600 Subject: [PATCH 45/51] world config + improved wall clearing --- dist/index.html | 13 ++++++------- src/Controllers/ControlPanel.js | 7 ++++--- src/Controllers/EnvironmentController.js | 4 ++-- src/Environments/WorldEnvironment.js | 5 +++-- src/Grid/GridMap.js | 3 ++- src/Organism/Cell/GridCell.js | 2 +- src/WorldConfig.js | 6 ++++++ 7 files changed, 24 insertions(+), 16 deletions(-) create mode 100644 src/WorldConfig.js diff --git a/dist/index.html b/dist/index.html index 506957f..e19e80c 100644 --- a/dist/index.html +++ b/dist/index.html @@ -51,7 +51,7 @@

The Life Engine

-

The Life Engine is a virtual ecosystem that allows organisms to grow, spread, and compete.

+

The Life Engine is a virtual ecosystem that allows organisms to reproduce, compete, and evolve.

Each organism is made up of different colored cells. Hover over each color to learn what it does.

@@ -169,17 +169,16 @@

Reset Options

- - -
-

Auto reset count:

- +
+ + +
+

Auto reset count:


diff --git a/src/Controllers/ControlPanel.js b/src/Controllers/ControlPanel.js index a7369a5..5e8030e 100644 --- a/src/Controllers/ControlPanel.js +++ b/src/Controllers/ControlPanel.js @@ -1,6 +1,7 @@ const Hyperparams = require("../Hyperparameters"); const Modes = require("./ControlModes"); const StatsPanel = require("../Stats/StatsPanel"); +const WorldConfig = require("../WorldConfig"); class ControlPanel { constructor(engine) { @@ -137,14 +138,14 @@ class ControlPanel { $('.headless').click(function() { $('.headless').find("i").toggleClass("fa fa-eye"); $('.headless').find("i").toggleClass("fa fa-eye-slash"); - if (Hyperparams.headless){ + if (WorldConfig.headless){ $('#headless-notification').css('display', 'none'); this.engine.env.renderFull(); } else { $('#headless-notification').css('display', 'block'); } - Hyperparams.headless = !Hyperparams.headless; + WorldConfig.headless = !WorldConfig.headless; }.bind(this)); } @@ -411,7 +412,7 @@ class ControlPanel { $('#fps-actual').text("Actual FPS: " + Math.floor(this.engine.actual_fps)); $('#reset-count').text("Auto reset count: " + this.engine.env.reset_count); this.stats_panel.updateDetails(); - if (Hyperparams.headless) + if (WorldConfig.headless) this.updateHeadlessIcon(delta_time); } diff --git a/src/Controllers/EnvironmentController.js b/src/Controllers/EnvironmentController.js index 5e8b963..17da00f 100644 --- a/src/Controllers/EnvironmentController.js +++ b/src/Controllers/EnvironmentController.js @@ -4,7 +4,7 @@ const Modes = require("./ControlModes"); const CellStates = require("../Organism/Cell/CellStates"); const Neighbors = require("../Grid/Neighbors"); const FossilRecord = require("../Stats/FossilRecord"); -const Hyperparams = require("../Hyperparameters"); +const WorldConfig = require("../WorldConfig"); const Perlin = require("../Utils/Perlin"); class EnvironmentController extends CanvasController{ @@ -98,7 +98,7 @@ class EnvironmentController extends CanvasController{ } performModeAction() { - if (Hyperparams.headless && this.mode != Modes.Drag) + if (WorldConfig.headless && this.mode != Modes.Drag) return; var mode = this.mode; var right_click = this.right_click; diff --git a/src/Environments/WorldEnvironment.js b/src/Environments/WorldEnvironment.js index fdf48c3..ed07327 100644 --- a/src/Environments/WorldEnvironment.js +++ b/src/Environments/WorldEnvironment.js @@ -6,6 +6,7 @@ const CellStates = require('../Organism/Cell/CellStates'); const EnvironmentController = require('../Controllers/EnvironmentController'); const Hyperparams = require('../Hyperparameters.js'); const FossilRecord = require('../Stats/FossilRecord'); +const WorldConfig = require('../WorldConfig'); class WorldEnvironment extends Environment{ constructor(cell_size) { @@ -45,7 +46,7 @@ class WorldEnvironment extends Environment{ } render() { - if (Hyperparams.headless) { + if (WorldConfig.headless) { this.renderer.cells_to_render.clear(); return; } @@ -136,7 +137,7 @@ class WorldEnvironment extends Environment{ return; this.organisms = []; - this.grid_map.fillGrid(CellStates.empty); + this.grid_map.fillGrid(CellStates.empty, !WorldConfig.clear_walls_on_reset); this.renderer.renderFullGrid(this.grid_map.grid); this.total_mutability = 0; this.total_ticks = 0; diff --git a/src/Grid/GridMap.js b/src/Grid/GridMap.js index 24f167c..84db4ca 100644 --- a/src/Grid/GridMap.js +++ b/src/Grid/GridMap.js @@ -21,9 +21,10 @@ class GridMap { } } - fillGrid(state) { + fillGrid(state, ignore_walls=false) { for (var col of this.grid) { for (var cell of col) { + if (ignore_walls && cell.state===CellStates.wall) continue; cell.setType(state); cell.owner = null; cell.cell_owner = null; diff --git a/src/Organism/Cell/GridCell.js b/src/Organism/Cell/GridCell.js index 10d637b..fd3bdff 100644 --- a/src/Organism/Cell/GridCell.js +++ b/src/Organism/Cell/GridCell.js @@ -5,7 +5,7 @@ const Hyperparams = require("../../Hyperparameters"); class Cell{ constructor(state, col, row, x, y){ this.owner = null; // owner organism - this.cell_owner = null; // owner cell of ^that organism + this.cell_owner = null; // specific body cell of the owner organism that occupies this grid cell this.setType(state); this.col = col; this.row = row; diff --git a/src/WorldConfig.js b/src/WorldConfig.js new file mode 100644 index 0000000..91910d3 --- /dev/null +++ b/src/WorldConfig.js @@ -0,0 +1,6 @@ +const WorldConfig = { + headless: false, + clear_walls_on_reset: false, +} + +module.exports = WorldConfig; \ No newline at end of file From adc826d6a6f9a87251e899a05497e687ee92d423 Mon Sep 17 00:00:00 2001 From: MaxRobinsonTheGreat Date: Sat, 18 Dec 2021 12:49:47 -0600 Subject: [PATCH 46/51] wall reset param works --- dist/index.html | 8 ++--- src/Controllers/ControlPanel.js | 53 ++++++++++++++++++--------------- 2 files changed, 33 insertions(+), 28 deletions(-) diff --git a/dist/index.html b/dist/index.html index e19e80c..935c500 100644 --- a/dist/index.html +++ b/dist/index.html @@ -33,7 +33,7 @@

Target FPS: 60

- +
@@ -171,9 +171,9 @@

Reset Options


@@ -185,7 +185,7 @@
- +
diff --git a/src/Controllers/ControlPanel.js b/src/Controllers/ControlPanel.js index 5e8030e..83dc3a8 100644 --- a/src/Controllers/ControlPanel.js +++ b/src/Controllers/ControlPanel.js @@ -9,9 +9,9 @@ class ControlPanel { this.defineMinMaxControls(); this.defineHotkeys(); this.defineEngineSpeedControls(); - this.defineGridSizeControls(); this.defineTabNavigation(); this.defineHyperparameterControls(); + this.defineWorldControls(); this.defineModeControls(); this.defineChallenges(); this.fps = engine.fps; @@ -149,7 +149,28 @@ class ControlPanel { }.bind(this)); } - defineGridSizeControls() { + defineTabNavigation() { + this.tab_id = 'about'; + var self = this; + $('.tabnav-item').click(function() { + $('.tab').css('display', 'none'); + var tab = '#'+this.id+'.tab'; + $(tab).css('display', 'grid'); + $('.tabnav-item').removeClass('open-tab') + $('#'+this.id+'.tabnav-item').addClass('open-tab'); + self.engine.organism_editor.is_active = (this.id == 'editor'); + self.stats_panel.stopAutoRender(); + if (this.id === 'stats') { + self.stats_panel.startAutoRender(); + } + else if (this.id === 'editor') { + self.editor_controller.refreshDetailsPanel(); + } + self.tab_id = this.id; + }); + } + + defineWorldControls() { $('#fill-window').change(function() { if (this.checked) $('.col-row-input').css('display' ,'none'); @@ -172,27 +193,14 @@ class ControlPanel { this.stats_panel.reset(); }.bind(this)); - } - defineTabNavigation() { - this.tab_id = 'about'; - var self = this; - $('.tabnav-item').click(function() { - $('.tab').css('display', 'none'); - var tab = '#'+this.id+'.tab'; - $(tab).css('display', 'grid'); - $('.tabnav-item').removeClass('open-tab') - $('#'+this.id+'.tabnav-item').addClass('open-tab'); - self.engine.organism_editor.is_active = (this.id == 'editor'); - self.stats_panel.stopAutoRender(); - if (this.id === 'stats') { - self.stats_panel.startAutoRender(); - } - else if (this.id === 'editor') { - self.editor_controller.refreshDetailsPanel(); - } - self.tab_id = this.id; + $('#auto-reset').change(function() { + env.auto_reset = this.checked; }); + + $('#clear-walls-reset').change(function() { + WorldConfig.clear_walls_on_reset = this.checked; + }) } defineHyperparameterControls() { @@ -336,9 +344,6 @@ class ControlPanel { $('#random-walls').click( function() { this.env_controller.randomizeWalls(); }.bind(this)); - $('#auto-reset').change(function() { - env.auto_reset = this.checked; - }); $('#clear-walls').click( function() { this.engine.env.clearWalls(); }.bind(this)); From f6db669adb9ea41a9352d472b47995bd2c608614 Mon Sep 17 00:00:00 2001 From: MaxRobinsonTheGreat Date: Sat, 18 Dec 2021 13:22:52 -0600 Subject: [PATCH 47/51] basic start state and auto reset/pause --- dist/index.html | 10 +++++---- src/Controllers/ControlPanel.js | 12 +++++++---- src/Environments/WorldEnvironment.js | 32 +++++++++++++++++++--------- src/WorldConfig.js | 3 +++ 4 files changed, 39 insertions(+), 18 deletions(-) diff --git a/dist/index.html b/dist/index.html index 935c500..cd08a34 100644 --- a/dist/index.html +++ b/dist/index.html @@ -33,7 +33,7 @@

Target FPS: 60

- +
@@ -169,16 +169,18 @@

Reset Options

- -
-

Auto reset count:

+ + +

diff --git a/src/Controllers/ControlPanel.js b/src/Controllers/ControlPanel.js index 83dc3a8..7bf1269 100644 --- a/src/Controllers/ControlPanel.js +++ b/src/Controllers/ControlPanel.js @@ -195,12 +195,18 @@ class ControlPanel { }.bind(this)); $('#auto-reset').change(function() { - env.auto_reset = this.checked; + WorldConfig.auto_reset = this.checked; + }); + $('#auto-pause').change(function() { + WorldConfig.auto_pause = this.checked; }); - $('#clear-walls-reset').change(function() { WorldConfig.clear_walls_on_reset = this.checked; }) + + $('#start-state').change ( function() { + WorldConfig.start_state = $("#start-state").val(); + }.bind(this)); } defineHyperparameterControls() { @@ -338,8 +344,6 @@ class ControlPanel { $('#clear-env').click( () => { env.reset(true, false); this.stats_panel.reset(); - env.auto_reset = false; - $('#auto-reset').prop('checked', false);; }); $('#random-walls').click( function() { this.env_controller.randomizeWalls(); diff --git a/src/Environments/WorldEnvironment.js b/src/Environments/WorldEnvironment.js index ed07327..5c3f9b9 100644 --- a/src/Environments/WorldEnvironment.js +++ b/src/Environments/WorldEnvironment.js @@ -19,7 +19,6 @@ class WorldEnvironment extends Environment{ this.organisms = []; this.walls = []; this.total_mutability = 0; - this.auto_reset = true; this.largest_cell_count = 0; this.reset_count = 0; this.total_ticks = 0; @@ -59,24 +58,37 @@ class WorldEnvironment extends Environment{ } removeOrganisms(org_indeces) { + let start_pop = this.organisms.length; for (var i of org_indeces.reverse()){ this.total_mutability -= this.organisms[i].mutability; this.organisms.splice(i, 1); } - if (this.organisms.length == 0 && this.auto_reset){ - this.reset_count++; - this.reset(false); + if (this.organisms.length === 0 && start_pop > 0) { + if (WorldConfig.auto_pause) + $('.pause-button')[0].click(); + else if(WorldConfig.auto_reset) { + this.reset_count++; + this.reset(false); + } } } OriginOfLife() { var center = this.grid_map.getCenter(); - var org = new Organism(center[0], center[1], this); - org.anatomy.addDefaultCell(CellStates.mouth, 0, 0); - org.anatomy.addDefaultCell(CellStates.producer, 1, 1); - org.anatomy.addDefaultCell(CellStates.producer, -1, -1); - this.addOrganism(org); - FossilRecord.addSpecies(org, null); + switch (WorldConfig.start_state){ + case 'simple-prod': + var org = new Organism(center[0], center[1], this); + org.anatomy.addDefaultCell(CellStates.mouth, 0, 0); + org.anatomy.addDefaultCell(CellStates.producer, 1, 1); + org.anatomy.addDefaultCell(CellStates.producer, -1, -1); + this.addOrganism(org); + FossilRecord.addSpecies(org, null); + break; + case 'random-orgs': + break; + case 'no-orgs': + break; + } } addOrganism(organism) { diff --git a/src/WorldConfig.js b/src/WorldConfig.js index 91910d3..1923453 100644 --- a/src/WorldConfig.js +++ b/src/WorldConfig.js @@ -1,6 +1,9 @@ const WorldConfig = { headless: false, clear_walls_on_reset: false, + start_state: 'simple-prod', + auto_reset: true, + auto_pause: false, } module.exports = WorldConfig; \ No newline at end of file From 653a6c3f31fcefae7b14e9cecc9c129c346f1e83 Mon Sep 17 00:00:00 2001 From: MaxRobinsonTheGreat Date: Sat, 18 Dec 2021 13:37:15 -0600 Subject: [PATCH 48/51] consolidated rotation control --- dist/index.html | 9 +++------ src/Controllers/ControlPanel.js | 10 +++------- src/Hyperparameters.js | 3 +-- src/Organism/Organism.js | 4 ++-- 4 files changed, 9 insertions(+), 17 deletions(-) diff --git a/dist/index.html b/dist/index.html index cd08a34..0835452 100644 --- a/dist/index.html +++ b/dist/index.html @@ -43,7 +43,7 @@

Editor

World Controls

Simulation Controls

-

Stats

+

Statistics

@@ -199,11 +199,8 @@
- - -
- - + +
diff --git a/src/Controllers/ControlPanel.js b/src/Controllers/ControlPanel.js index 7bf1269..f566692 100644 --- a/src/Controllers/ControlPanel.js +++ b/src/Controllers/ControlPanel.js @@ -217,11 +217,8 @@ class ControlPanel { Hyperparams.lifespanMultiplier = $('#lifespan-multiplier').val(); }.bind(this)); - $('#mover-rot').change(function() { - Hyperparams.moversCanRotate = this.checked; - }); - $('#offspring-rot').change(function() { - Hyperparams.offspringRotate = this.checked; + $('#rot-enabled').change(function() { + Hyperparams.rotationEnabled = this.checked; }); $('#insta-kill').change(function() { Hyperparams.instaKill = this.checked; @@ -278,8 +275,7 @@ class ControlPanel { Hyperparams.setDefaults(); $('#food-prod-prob').val(Hyperparams.foodProdProb); $('#lifespan-multiplier').val(Hyperparams.lifespanMultiplier); - $('#mover-rot').prop('checked', Hyperparams.moversCanRotate); - $('#offspring-rot').prop('checked', Hyperparams.offspringRotate); + $('#rot-enabled').prop('checked', Hyperparams.rotationEnabled); $('#insta-kill').prop('checked', Hyperparams.instaKill); $('#evolved-mutation').prop('checked', !Hyperparams.useGlobalMutability); $('#add-prob').val(Hyperparams.addProb); diff --git a/src/Hyperparameters.js b/src/Hyperparameters.js index 4199cd9..67ece3c 100644 --- a/src/Hyperparameters.js +++ b/src/Hyperparameters.js @@ -16,8 +16,7 @@ const Hyperparams = { this.changeProb = 33; this.removeProb = 33; - this.moversCanRotate = true; - this.offspringRotate = true; + this.rotationEnabled = true; this.foodBlocksReproduction = true; this.moversCanProduce = false; diff --git a/src/Organism/Organism.js b/src/Organism/Organism.js index 589bfb9..ef38f03 100644 --- a/src/Organism/Organism.js +++ b/src/Organism/Organism.js @@ -17,7 +17,7 @@ class Organism { this.anatomy = new Anatomy(this) this.direction = Directions.down; // direction of movement this.rotation = Directions.up; // direction of rotation - this.can_rotate = Hyperparams.moversCanRotate; + this.can_rotate = Hyperparams.rotationEnabled; this.move_count = 0; this.move_range = 4; this.ignore_brain_for = 0; @@ -63,7 +63,7 @@ class Organism { //produce mutated child //check nearby locations (is there room and a direct path) var org = new Organism(0, 0, this.env, this); - if(Hyperparams.offspringRotate){ + if(Hyperparams.rotationEnabled){ org.rotation = Directions.getRandomDirection(); } var prob = this.mutability; From 3f9a8a5ccd8d4c9d5b81b905cf2d6f4702deb80a Mon Sep 17 00:00:00 2001 From: Max Robinson Date: Sat, 18 Dec 2021 13:52:09 -0600 Subject: [PATCH 49/51] Update Changelog.md --- Changelog.md | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/Changelog.md b/Changelog.md index bf73909..844c04a 100644 --- a/Changelog.md +++ b/Changelog.md @@ -3,14 +3,20 @@ ## 1.0.2 (current development) ### UI Enhancements: -- Button to generate random walls with perlin noise generator +- New tab for world controls + - Relocated grid controls, auto reset to this tab + - Button to generate random walls with perlin noise + - Options for starting state, including simple producer and empty state + - Option to not clear walls when resetting + - Option to pause on total extinction +- Combined `Movers can rotate` and `Offspring rotate` simulation controls into `Rotation enabled` - Can now drag view while rendering is off ### Simulation Enhancements: +- ### Bug Fixes: - Armor is no longer ignored when checking for clear reproduction space -- Thanks to contributors: From 302eeae2fb8db4ea4f480acf9504a15da22fdee3 Mon Sep 17 00:00:00 2001 From: MaxRobinsonTheGreat Date: Sat, 18 Dec 2021 15:05:35 -0600 Subject: [PATCH 50/51] added saving/loading sim controls --- dist/css/style.css | 3 +-- dist/index.html | 5 ++++- src/Controllers/ControlPanel.js | 27 +++++++++++++++++++++++++++ src/Hyperparameters.js | 8 ++++++-- 4 files changed, 38 insertions(+), 5 deletions(-) diff --git a/dist/css/style.css b/dist/css/style.css index f0a008f..ea7e16e 100644 --- a/dist/css/style.css +++ b/dist/css/style.css @@ -271,8 +271,7 @@ button:active{ } #video { - height: 100%; - max-height: 190px; + height: 200px; margin: auto; margin-bottom: 0; padding-bottom: 0; diff --git a/dist/index.html b/dist/index.html index 0835452..846801a 100644 --- a/dist/index.html +++ b/dist/index.html @@ -233,7 +233,10 @@
- + + + +
diff --git a/src/Controllers/ControlPanel.js b/src/Controllers/ControlPanel.js index f566692..c45c03c 100644 --- a/src/Controllers/ControlPanel.js +++ b/src/Controllers/ControlPanel.js @@ -269,10 +269,37 @@ class ControlPanel { $('#reset-rules').click(() => { this.setHyperparamDefaults(); }); + $('#save-controls').click(() => { + let data = "data:text/json;charset=utf-8," + encodeURIComponent(JSON.stringify(Hyperparams)); + let downloadEl = document.getElementById('download-el'); + downloadEl.setAttribute("href", data); + downloadEl.setAttribute("download", "controls.json"); + downloadEl.click(); + }); + $('#load-controls').click(() => { + $('#upload-el').click(); + }); + $('#upload-el').change((e)=>{ + let files = e.target.files; + if (!files.length) {return;}; + let reader = new FileReader(); + reader.onload = (e) => { + let result=JSON.parse(e.target.result); + Hyperparams.loadJsonObj(result); + this.updateHyperparamUIValues(); + // have to clear the value so change() will be triggered if the same file is uploaded again + $('#upload-el')[0].value = ''; + }; + reader.readAsText(files[0]); + }); } setHyperparamDefaults() { Hyperparams.setDefaults(); + this.updateHyperparamUIValues(); + } + + updateHyperparamUIValues(){ $('#food-prod-prob').val(Hyperparams.foodProdProb); $('#lifespan-multiplier').val(Hyperparams.lifespanMultiplier); $('#rot-enabled').prop('checked', Hyperparams.rotationEnabled); diff --git a/src/Hyperparameters.js b/src/Hyperparameters.js index 67ece3c..b4dfa02 100644 --- a/src/Hyperparameters.js +++ b/src/Hyperparameters.js @@ -2,8 +2,6 @@ const Neighbors = require("./Grid/Neighbors"); const Hyperparams = { setDefaults: function() { - this.headless = false; - this.lifespanMultiplier = 100; this.foodProdProb = 5; this.killableNeighbors = Neighbors.adjacent; @@ -27,6 +25,12 @@ const Hyperparams = { this.foodDropProb = 0; }, + + loadJsonObj(obj) { + for (let key in obj) { + this[key] = obj[key]; + } + } } Hyperparams.setDefaults(); From 4706ee9abf111872f10f52290035f62a8e34a116 Mon Sep 17 00:00:00 2001 From: MaxRobinsonTheGreat Date: Sun, 19 Dec 2021 11:23:02 -0600 Subject: [PATCH 51/51] added extra mover food cost --- dist/index.html | 3 +++ src/Controllers/ControlPanel.js | 5 +++++ src/Hyperparameters.js | 2 ++ src/Organism/Organism.js | 5 ++--- 4 files changed, 12 insertions(+), 3 deletions(-) diff --git a/dist/index.html b/dist/index.html index 846801a..6342042 100644 --- a/dist/index.html +++ b/dist/index.html @@ -210,6 +210,9 @@
+
+ +
diff --git a/src/Controllers/ControlPanel.js b/src/Controllers/ControlPanel.js index c45c03c..59bc4d5 100644 --- a/src/Controllers/ControlPanel.js +++ b/src/Controllers/ControlPanel.js @@ -229,6 +229,10 @@ class ControlPanel { $('#food-drop-rate').change(function() { Hyperparams.foodDropProb = $('#food-drop-rate').val(); }); + $('#extra-mover-cost').change(function() { + console.log(parseInt($('#extra-mover-cost').val())) + Hyperparams.extraMoverFoodCost = parseInt($('#extra-mover-cost').val()); + }); $('#evolved-mutation').change( function() { if (this.checked) { @@ -311,6 +315,7 @@ class ControlPanel { $('#movers-produce').prop('checked', Hyperparams.moversCanProduce); $('#food-blocks').prop('checked', Hyperparams.foodBlocksReproduction); $('#food-drop-rate').val(Hyperparams.foodDropProb); + $('#extra-mover-cost').val(Hyperparams.extraMoverFoodCost); $('#look-range').val(Hyperparams.lookRange); if (!Hyperparams.useGlobalMutability) { diff --git a/src/Hyperparameters.js b/src/Hyperparameters.js index b4dfa02..9579f11 100644 --- a/src/Hyperparameters.js +++ b/src/Hyperparameters.js @@ -24,6 +24,8 @@ const Hyperparams = { this.lookRange = 20; this.foodDropProb = 0; + + this.extraMoverFoodCost = 0; }, loadJsonObj(obj) { diff --git a/src/Organism/Organism.js b/src/Organism/Organism.js index ef38f03..a1db6b6 100644 --- a/src/Organism/Organism.js +++ b/src/Organism/Organism.js @@ -47,11 +47,10 @@ class Organism { // amount of food required before it can reproduce foodNeeded() { - return this.anatomy.cells.length; + return this.anatomy.is_mover ? this.anatomy.cells.length + Hyperparams.extraMoverFoodCost : this.anatomy.cells.length; } lifespan() { - // console.log(Hyperparams.lifespanMultiplier) return this.anatomy.cells.length * Hyperparams.lifespanMultiplier; } @@ -118,7 +117,7 @@ class Organism { org.species.addPop(); } } - this.food_collected -= this.foodNeeded(); + Math.max(this.food_collected -= this.foodNeeded(), 0); }