summaryrefslogtreecommitdiff
path: root/src/simulation
diff options
context:
space:
mode:
Diffstat (limited to 'src/simulation')
-rw-r--r--src/simulation/postprocess.js18
-rw-r--r--src/simulation/postprocess.test.js37
2 files changed, 55 insertions, 0 deletions
diff --git a/src/simulation/postprocess.js b/src/simulation/postprocess.js
new file mode 100644
index 0000000..d50839e
--- /dev/null
+++ b/src/simulation/postprocess.js
@@ -0,0 +1,18 @@
+'use strict';
+
+export const postprocess = [
+ (world) => ({
+ ...world,
+ agents: world.agents.map(a => {
+ const {x, y} = a;
+ if (
+ world.lattice[y][x].type === 'mutable' ||
+ world.lattice[y][x].type === 'active'
+ ) {
+ return { ...a, flags: {...a.flags, frozen: true } };
+ } else {
+ return a;
+ }
+ }),
+ }),
+];
diff --git a/src/simulation/postprocess.test.js b/src/simulation/postprocess.test.js
new file mode 100644
index 0000000..dc77c6a
--- /dev/null
+++ b/src/simulation/postprocess.test.js
@@ -0,0 +1,37 @@
+'use strict';
+
+import { world_update } from '../world/world.js';
+import { postprocess } from './postprocess.js';
+
+test("agents freeze when finishing on a mutable or active", () => {
+ const agent = {
+ id: 1,
+ net: { compute: () => [[1], null] },
+ state: null,
+ x: 0, y: 0,
+ flags: {},
+ };
+
+ const lattice = [[{ type: 'empty', flags: {} }]];
+
+ const world = {
+ lattice,
+ lattice_rules: { empty: ()=>{}, active: ()=>{}, mutable: ()=>{} },
+ agents: [agent],
+ senses: [],
+ actions: [],
+ validity: [],
+ };
+
+ expect(world_update(world, postprocess).agents[0]).toEqual(agent);
+ world.lattice[0][0].type = 'mutable';
+ expect(world_update(world, postprocess).agents[0]).toEqual({
+ ...agent,
+ flags: { frozen: true },
+ });
+ world.lattice[0][0].type = 'active';
+ expect(world_update(world, postprocess).agents[0]).toEqual({
+ ...agent,
+ flags: { frozen: true },
+ });
+});