The current code treats the horizontal and vertical movements separately.  The best way IMO would be to replace this with a proper 3d calculation - replacing the `int facing` with a `WRot orientation` and using 3d vector math instead of the existing mess.

The potentially tricky step (if you're not fluent in linear algebra) will be defining a function to calculate the WRot relating two WVec - you will want to use WAngle.ArcTan to calculate the yaw and pitch angles from the (dx, dy) and (dyaw, dz) vectors.