I will describe an approach I used for a similar game some time ago.
This only applies if your perspective is not orthogonal and directly from the top.
For each sprite that has depth I have the normal color bitmap and a height bitmap.
So for example the wall sprite could look like this
Heightmaps use only the
Each sprite is drawn to a different buffer.
Lights are rendered to the third buffer. Those three buffers get baked into a final image in a fragment shader. Heightmap values are used to offset probing from light texture.
You could store normals and material type per pixel along with the heightmap to allow for more sophisticated lighting models.
One other advantage is that you can use this data for depth-testing. Sometimes sprites cannot be topologically ordered if you use a weird projection.
Creating dynamic shadows for more detailed objects would require raytracing, but in this case it can be implemented just using the heightmap if the objects don't have visible holes. This is probably an overkill though and a simple shadow below the feet should do.
I'm not sure how you handle light with walls, because you haven't posted any pictures, so I'll post this part as it may be relevant.
A light is a rectangle with a texture that determines brightness over distance. It should use transparency so the colors are properly mixed when drawn on top of each other, allowing simple additive lighting.
The initial light rectangle is being trimmed by the nearby geometry.
For this I refer to https://www.redblobgames.com/articles/visibility/ and https://ncase.me/sight-and-light/. The algorithm is very fast and can handle hundreds of light updates per frame.
The last step is to blur the light to avoid sharp edges on where it was trimmed. For this I use a 2 pass gaussian blur frament shader and temporary buffers.