So I came up with a change to sort of fix the shadow on the stairs. I'm attaching it instead of pushing it because it is a pretty big hack. One problem with it, I assume because of some Z sorting, the shadow shows on top of the character. Another problem, I'm not sure that this is the correct place for it. I assumed that shadow::cast_on would get called for each stair in the staircase, but it doesn't. The good news is, if this is the correct place for it, then I think making the shadow work on the original stairs shouldn't be too hard.
Other more caveat on the code: I assume there is a function that returns the intersection of two squares, but I couldn't find it. So I wrote only half of one, It only checks in the x direction, but for our current stairway, that's ok. Although you can notice it if you just to the right of the stairway and all the way up to the wall.