> How did you do the drop shadows on the different layers
I'm glad you asked :P.
If I had done a 3D game with paper cards, it would've worked with AO turned on, but AO is seemingly not available for web builds. I wanted to use a shader param and give each sprite a height value to write into a custom height buffer, but godot doesn't have any support for multiple render targets. I tried having a phantom sprite behind each sprite that painstakingly matched its shape and position, then had that draw its height to a subviewport which I could use to compute drop shadows, but that would be IMO a lot of effort.
In the end, I created 8 separate "layer" Node2Ds and 8 corresponding SubViewports. Each subviewport had a Camera2D set with a visibility mask to render only one of the 8 layer Node2Ds. In a full-screen-quad ColorRect shader, I attached all 8 SubViewport textures as inputs and assigned a "height" to each one's alpha channel (this gave me the silhouettes I needed). For any pixel, I could take the "highest" of all 8 inputs et viola, I now have a height buffer. After that it was simply a matter of computing a sort of AO.
Why not include a drop shadow on each piece of art? First, it wouldn't give me any differences in heights, and secondly it wouldn't allow me to "kit bash" sprites on any individual layer as they'd all have conflicting drop shadows.