Hope you don't mind if I leave this here for my own reference if I ever decide to revisit this gamasutra.com/blogs/SvyatoslavCherkasov/20181023/329151/Graveyard_Keeper_How_the_graphics_effects_are_made.php
Edit: At the very least, the first step is to have any given object affected by light, or not affected by light. This can be done with 2 layers with z-order preserved, as the light can be isolated by layer, and objects can be moved from layer to layer preserving their z-order by comparying y-position with the light. Unfortunately, each light would need to have it's own layer for a comprehensive solution.
The next level would be to control how much each object is affected by any given light. This would prevent jarring cutoffs for moving lights, although it is less of an issue for static lights. Might be able to design around the light per layer solution with static lights as well, as long as you don't have overlapping lights at different y positions with objects between them.
Bump mapping and shadows after that.