We will need to add some extra checks here to avoid performance regressions. RevealsShroud previously only called UpdateVisibility when the cell position changed, while OnMovement will now be called twice per movement (even within cells).

You will want to introduce a `List<Actor> dirty` and `Dictionary<Actor, CPos> positions` to solve this.
Instead of calling UpdateVisibility directly, you will want to add `moved` to the dirty list and then return.

You can then add a Tick function (and ITick interface) which iterates over `dirty.Distinct()` and only calls UpdateVisibility if `a.Location != positions[a]`, and then updates the position cache and clears the dirty list once you're done.

Don't worry, this was more complicated to describe than it is to implement!