This post is predominantly an apology. In order to get the surfaces working the same way that they do in the original, I’ve had to hack apart some of the beautifully structured code that jvprat wrote, and my coding is not as… well, good.
Anyway, the internal structure is more suited to continuing work now, but there are extra graphical glitches for your delectation. Mmmmm.