My approach:
Click to reveal..

vec_set ( vO, vector(90,0,200) );
vec_rotate ( vO, vector(entBoat.pan,0,0) );
vec_add ( vO, entBoat.x );
vec_set ( vT, vector(vO.x,vO.y,-200) );
c_trace ( vO, vT, IGNORE_PASSABLE );
vec_set ( vP, hit.x );
vec_set ( vN, hit.nx );
vec_set ( vO, vector(-90,0,200) );
vec_rotate ( vO, vector(entBoat.pan,0,0) );
vec_add ( vO, entBoat.x );
vec_set ( vT, vector(vO.x,vO.y,-200) );
c_trace ( vO, vT, IGNORE_PASSABLE );
entBoat.z = vP.z - hit.z;
entBoat.tilt = atan2v ( entBoat.z, 180 );
entBoat.z *= 0.5;
entBoat.z += hit.z;
vec_add ( vN, hit.nx );
vec_rotate ( vN, vector(entBoat.pan,0,0) );
entBoat.roll = atan2v ( vN.y, vN.z );