The rendering code makes a lot more sense now. The stair code as I implemented it was broken in a way that the tutorial implied it might be, so I put in a workaround. Leveling was mostly broken, as a consequence of how I wrote event handling; the details need to be better-specified so I can figure out how to avoid similar breakage in future. I started implementing the weighted choice stuff, and as a prerequisite to using that, I've now got numpy's random implementation mostly wired in, though I suspect there's some undesirable behavior there that I'd also like to better specify.
Looking over the rest of part 12, finishing it up should be trivial. It looks like part 13 shouldn't be much of a challenge either, so maybe there's a chance I can wrap up adding features tomorrow, and then focus on polish, and working out what specific directions to take the codebase.