I’ve tracked down the stair place failure to mapgen.cpp:
do {
rn = rng(lw + 1, rw - 1);
attempts--;
} while (ter(rn, actual_house_height - 1) != t_floor && attempts);
if( ter(rn, actual_house_height - 1) != t_floor && attempts ) {
ter_set(rn, actual_house_height - 1, t_stairs_down);
}
The if statement is never true because it checks for inequality instead of equality (the only way to exit the do-while loop is to find a t_floor, then it checks to see if it isn’t t_floor), so the stairs down to the basement aren’t placed. However, the commit message for this change mentions trying to fix an infinite loop in map generation that I haven’t seen happen, so maybe there is more to it?