This visualization is essentially the same as the previous, except that each layer now operates with different parameters than the other, allowing each to exhibit different behavior.
Additionally, the top layer has been made to be responsive to the bottom, via a new mechanism where the age of an element on the top layer can be extended based on the number of bottom layer elements it neighbors.
Finally, the UI now exposes the actual parameters which are used to tweak the behavior of each layer. Modifying any parameter will change the behavior of the associated layer in real-time. The default parameters have been chosen such that the top layer is now rather dependent on the bottom for sustenance, although it can venture away to some extent. However, by playing the parameters yourself you can find other behaviors and interesting cause-and-effects that aren't immediately obvious. Try it!
An explanation of the parameters is as follows:
On each tick, up to
maxNewElements are created in each layer, where each new
element neighbors an existing one.
Additionally, on each tick, all elements in a layer are iterated through. Each one's age is determined as follows:
age = (currentTick - birthTick) age -= (numNeighbors * neighborBonusScalar) age -= (numBottomLayerNeighbors * layerBonusScalar) // only for top layer
If an element's age is greater than or equal to the
ageOfDeath for that layer,
then the element is removed.