When I was younger I spent a lot of time playing with a dynamical system on a grid that I just called “waves”; every point on the grid had a “height” and a 2D “velocity”; on every tick, each square would transfer a bit of height between its N-S and its E-W neighbors according to its velocity, and it would update its velocity based on the height difference between its N-S neighbors and between its E-W neighbors. You could adjust the coupling constant, there were some nonlinearities available in the form of hard or soft caps on velocity, and of course it had a “doodle mode” that let you draw patterns.
The result looked a lot like ripples spreading in a pond, and one of my favorite tricks was to pause the simulation, draw some patterns, run the simulation for a while until it looked like chaos, and then hit a button that would flip the sign on all velocities simultaneously, and watch the pattern I had drawn re-coalesce out of the noise. I also had a “rain” feature that acted almost like temperature in the Ising model, picking random cells to perturb every now and then (which, again, was great for the “ripples in a pond”, or maybe puddle, visual).
Two things I was intrigued by were:
There was a “speed of light” — with a low coupling constant and maybe a low velocity cap, you got big slow-moving blobs oscillating and coalescing, but any instantaneous change you made using the doodle mode had a ghostly effect that would spread in all directions from the point you made the edit at a rate of 1 square per tick.
If you let the coupling constant get too high, you got the flashing checkerboard catastrophe — once it established itself somewhere, it would slowly spread and eat the world. Even if you reduced the constant it would usually end up frozen-in; the only way to kill it was to reset the world or draw over it in doodle mode.