I make objects that cast light register the brightness of light that they are casting into squares with those squares, when the object that is casting light moves. That way there is only a FOV calculation once when the light source moves, instead of every time something looks at a square. When the object moves again, it deregisters itself from the squares that it previously registered with, recalculates, and re-registers itself with the new squares.
The set that the light levels are registered in is a priority list, such that the brightest value stays on top and the dimmer values sort lower through the list.
When something looks into a square, the engine peeks at the top value of that priority list, and uses that value as the light level in that square.