-+-+-+-+-+-+-+-+ START OF PART 21 -+-+-+-+-+-+-+-+ X`09 for (j = x_left; j <= x_right; j++) X`09 `7B X`09 c_ptr->fval = floor; X`09 c_ptr->lr = TRUE; X`09 c_ptr++; X`09 `7D X`09`7D X for (i = (y_height - 1); i <= (y_depth + 1); i++) X`09`7B X`09 c_ptr = &cave`5Bi`5D`5Bx_left-1`5D; X`09 if (c_ptr->fval != floor) X`09 `7B X`09 c_ptr->fval = GRANITE_WALL; X`09 c_ptr->lr = TRUE; X`09 `7D X`09 c_ptr = &cave`5Bi`5D`5Bx_right+1`5D; X`09 if (c_ptr->fval != floor) X`09 `7B X`09 c_ptr->fval = GRANITE_WALL; X`09 c_ptr->lr = TRUE; X`09 `7D X`09`7D X c_ptr = &cave`5By_height - 1`5D`5Bx_left`5D; X d_ptr = &cave`5By_depth + 1`5D`5Bx_left`5D; X for (i = x_left; i <= x_right; i++) X`09`7B X`09 if (c_ptr->fval != floor) X`09 `7B X`09 c_ptr->fval = GRANITE_WALL; X`09 c_ptr->lr = TRUE; X`09 `7D X`09 c_ptr++; X`09 if (d_ptr->fval != floor) X`09 `7B X`09 d_ptr->fval = GRANITE_WALL; X`09 d_ptr->lr = TRUE; X`09 `7D X`09 d_ptr++; X`09`7D X `7D X`7D X X X/* Builds an unusual room at a row, column coordinate`09-RAK-`09*/ X/* Type 2 unusual rooms all have an inner room:`09`09`09*/ X/* 1 - Just an inner room with one door`09`09`09*/ X/* 2 - An inner room within an inner room`09`09`09*/ X/* 3 - An inner room with pillar(s)`09`09`09`09*/ X/* 4 - Inner room has a maze`09`09`09`09`09*/ X/* 5 - A set of four inner rooms`09`09`09`09*/ Xstatic void build_type2(yval, xval) Xint yval, xval; X`7B X register int i, j, y_height, x_left; X int y_depth, x_right, tmp; X int8u floor; X register cave_type *c_ptr, *d_ptr; X X if (dun_level <= randint(25)) X floor = LIGHT_FLOOR;`09/* Floor with light`09*/ X else X floor = DARK_FLOOR;`09`09/* Dark floor`09`09*/ X y_height = yval - 4; X y_depth = yval + 4; X x_left = xval - 11; X x_right = xval + 11; X X /* the x dim of rooms tends to be much larger than the y dim, so don't X bother rewriting the y loop */ X X for (i = y_height; i <= y_depth; i++) X `7B X c_ptr = &cave`5Bi`5D`5Bx_left`5D; X for (j = x_left; j <= x_right; j++) X`09`7B X`09 c_ptr->fval = floor; X`09 c_ptr->lr = TRUE; X`09 c_ptr++; X`09`7D X `7D X for (i = (y_height - 1); i <= (y_depth + 1); i++) X `7B X c_ptr = &cave`5Bi`5D`5Bx_left-1`5D; X c_ptr->fval = GRANITE_WALL; X c_ptr->lr = TRUE; X c_ptr = &cave`5Bi`5D`5Bx_right+1`5D; X c_ptr->fval = GRANITE_WALL; X c_ptr->lr = TRUE; X `7D X c_ptr = &cave`5By_height - 1`5D`5Bx_left`5D; X d_ptr = &cave`5By_depth + 1`5D`5Bx_left`5D; X for (i = x_left; i <= x_right; i++) X `7B X c_ptr->fval = GRANITE_WALL; X c_ptr->lr = TRUE; X c_ptr++; X d_ptr->fval = GRANITE_WALL; X d_ptr->lr = TRUE; X d_ptr++; X `7D X /* The inner room`09`09*/ X y_height = y_height + 2; X y_depth = y_depth - 2; X x_left = x_left + 2; X x_right = x_right - 2; X for (i = (y_height - 1); i <= (y_depth + 1); i++) X `7B X cave`5Bi`5D`5Bx_left-1`5D.fval = TMP1_WALL; X cave`5Bi`5D`5Bx_right+1`5D.fval = TMP1_WALL; X `7D X c_ptr = &cave`5By_height-1`5D`5Bx_left`5D; X d_ptr = &cave`5By_depth+1`5D`5Bx_left`5D; X for (i = x_left; i <= x_right; i++) X `7B X c_ptr->fval = TMP1_WALL; X c_ptr++; X d_ptr->fval = TMP1_WALL; X d_ptr++; X `7D X /* Inner room variations`09`09*/ X switch(randint(5)) X `7B X case 1:`09/* Just an inner room.`09*/ X tmp = randint(4); X if (tmp < 3) `7B`09/* Place a door`09*/ X`09if (tmp == 1) place_secret_door(y_height-1, xval); X`09else`09 place_secret_door(y_depth+1, xval); X `7D else `7B X`09if (tmp == 3) place_secret_door(yval, x_left-1); X`09else`09 place_secret_door(yval, x_right+1); X `7D X vault_monster(yval, xval, 1); X break; X X case 2:`09/* Treasure Vault`09*/ X tmp = randint(4); X if (tmp < 3) `7B`09/* Place a door`09*/ X`09if (tmp == 1) place_secret_door(y_height-1, xval); X`09else`09 place_secret_door(y_depth+1, xval); X `7D else `7B X`09if (tmp == 3) place_secret_door(yval, x_left-1); X`09else`09 place_secret_door(yval, x_right+1); X `7D X X for (i = yval-1; i <= yval+1; i++) X`09`7B X`09 cave`5Bi`5D`5Bxval-1`5D.fval`09 = TMP1_WALL; X`09 cave`5Bi`5D`5Bxval+1`5D.fval`09 = TMP1_WALL; X`09`7D X cave`5Byval-1`5D`5Bxval`5D.fval = TMP1_WALL; X cave`5Byval+1`5D`5Bxval`5D.fval = TMP1_WALL; X X tmp = randint(4);`09/* Place a door`09*/ X if (tmp < 3) X`09place_locked_door(yval-3+(tmp<<1), xval); /* 1 -> yval-1; 2 -> yval+1*/ X else X`09place_locked_door(yval, xval-7+(tmp<<1)); X X /* Place an object in the treasure vault`09*/ X tmp = randint(10); X if (tmp > 2) X`09place_object(yval, xval); X else if (tmp == 2) X`09place_down_stairs(yval, xval); X else X`09place_up_stairs(yval, xval); X X /* Guard the treasure well`09`09*/ X vault_monster(yval, xval, 2+randint(3)); X /* If the monsters don't get 'em.`09*/ X vault_trap(yval, xval, 4, 10, 2+randint(3)); X break; X X case 3:`09/* Inner pillar(s).`09*/ X tmp = randint(4); X if (tmp < 3) `7B`09/* Place a door`09*/ X`09if (tmp == 1) place_secret_door(y_height-1, xval); X`09else`09 place_secret_door(y_depth+1, xval); X `7D else `7B X`09if (tmp == 3) place_secret_door(yval, x_left-1); X`09else`09 place_secret_door(yval, x_right+1); X `7D X X for (i = yval-1; i <= yval+1; i++) X`09`7B X`09 c_ptr = &cave`5Bi`5D`5Bxval-1`5D; X`09 for (j = xval-1; j <= xval+1; j++) X`09 `7B X`09 c_ptr->fval = TMP1_WALL; X`09 c_ptr++; X`09 `7D X`09`7D X if (randint(2) == 1) X`09`7B X`09 tmp = randint(2); X`09 for (i = yval-1; i <= yval+1; i++) X`09 `7B X`09 c_ptr = &cave`5Bi`5D`5Bxval-5-tmp`5D; X`09 for (j = xval-5-tmp; j <= xval-3-tmp; j++) X`09`09`7B X`09`09 c_ptr->fval = TMP1_WALL; X`09`09 c_ptr++; X`09`09`7D X`09 `7D X`09 for (i = yval-1; i <= yval+1; i++) X`09 `7B X`09 c_ptr = &cave`5Bi`5D`5Bxval+3+tmp`5D; X`09 for (j = xval+3+tmp; j <= xval+5+tmp; j++) X`09`09`7B X`09`09 c_ptr->fval = TMP1_WALL; X`09`09 c_ptr++; X`09`09`7D X`09 `7D X`09`7D X X if (randint(3) == 1)`09/* Inner rooms`09*/ X`09`7B X`09 c_ptr = &cave`5Byval-1`5D`5Bxval-5`5D; X`09 d_ptr = &cave`5Byval+1`5D`5Bxval-5`5D; X`09 for (i = xval-5; i <= xval+5; i++) X`09 `7B X`09 c_ptr->fval = TMP1_WALL; X`09 c_ptr++; X`09 d_ptr->fval = TMP1_WALL; X`09 d_ptr++; X`09 `7D X`09 cave`5Byval`5D`5Bxval-5`5D.fval = TMP1_WALL; X`09 cave`5Byval`5D`5Bxval+5`5D.fval = TMP1_WALL; X`09 place_secret_door(yval-3+(randint(2)<<1), xval-3); X`09 place_secret_door(yval-3+(randint(2)<<1), xval+3); X`09 if (randint(3) == 1)`09place_object(yval, xval-2); X`09 if (randint(3) == 1)`09place_object(yval, xval+2); X`09 vault_monster(yval, xval-2, randint(2)); X`09 vault_monster(yval, xval+2, randint(2)); X`09`7D X break; X X case 4:`09/* Maze inside.`09*/ X tmp = randint(4); X if (tmp < 3) `7B`09/* Place a door`09*/ X`09if (tmp == 1) place_secret_door(y_height-1, xval); X`09else`09 place_secret_door(y_depth+1, xval); X `7D else `7B X`09if (tmp == 3) place_secret_door(yval, x_left-1); X`09else`09 place_secret_door(yval, x_right+1); X `7D X X for (i = y_height; i <= y_depth; i++) X`09for (j = x_left; j <= x_right; j++) X`09 if (0x1 & (j+i)) X`09 cave`5Bi`5D`5Bj`5D.fval = TMP1_WALL; X X /* Monsters just love mazes.`09`09*/ X vault_monster(yval, xval-5, randint(3)); X vault_monster(yval, xval+5, randint(3)); X /* Traps make them entertaining.`09*/ X vault_trap(yval, xval-3, 2, 8, randint(3)); X vault_trap(yval, xval+3, 2, 8, randint(3)); X /* Mazes should have some treasure too..`09*/ X for (i = 0; i < 3; i++) X`09random_object(yval, xval, 1); X break; X X case 5:`09/* Four small rooms.`09*/ X for (i = y_height; i <= y_depth; i++) X`09cave`5Bi`5D`5Bxval`5D.fval = TMP1_WALL; X X c_ptr = &cave`5Byval`5D`5Bx_left`5D; X for (i = x_left; i <= x_right; i++) X`09`7B X`09 c_ptr->fval = TMP1_WALL; X`09 c_ptr++; X`09`7D X X if (randint(2) == 1) X`09`7B X`09 i = randint(10); X`09 place_secret_door(y_height-1, xval-i); X`09 place_secret_door(y_height-1, xval+i); X`09 place_secret_door(y_depth+1, xval-i); X`09 place_secret_door(y_depth+1, xval+i); X`09`7D X else X`09`7B X`09 i = randint(3); X`09 place_secret_door(yval+i, x_left-1); X`09 place_secret_door(yval-i, x_left-1); X`09 place_secret_door(yval+i, x_right+1); X`09 place_secret_door(yval-i, x_right+1); X`09`7D X X /* Treasure in each one.`09`09*/ X random_object(yval, xval, 2+randint(2)); X /* Gotta have some monsters.`09`09*/ X vault_monster(yval+2, xval-4, randint(2)); X vault_monster(yval+2, xval+4, randint(2)); X vault_monster(yval-2, xval-4, randint(2)); X vault_monster(yval-2, xval+4, randint(2)); X break; X `7D X`7D X X X/* Builds a room at a row, column coordinate`09`09-RAK-`09*/ X/* Type 3 unusual rooms are cross shaped`09`09`09`09*/ Xstatic void build_type3(yval, xval) Xint yval, xval; X`7B X int y_height, y_depth; X int x_left, x_right; X register int tmp, i, j; X int8u floor; X register cave_type *c_ptr; X X if (dun_level <= randint(25)) X floor = LIGHT_FLOOR;`09/* Floor with light`09*/ X else X floor = DARK_FLOOR;`09`09/* Dark floor`09`09*/ X tmp = 2 + randint(2); X y_height = yval - tmp; X y_depth = yval + tmp; X x_left = xval - 1; X x_right = xval + 1; X for (i = y_height; i <= y_depth; i++) X for (j = x_left; j <= x_right; j++) X `7B X`09c_ptr = &cave`5Bi`5D`5Bj`5D; X`09c_ptr->fval = floor; X`09c_ptr->lr = TRUE; X `7D X for (i = (y_height - 1); i <= (y_depth + 1); i++) X `7B X c_ptr = &cave`5Bi`5D`5Bx_left-1`5D; X c_ptr->fval = GRANITE_WALL; X c_ptr->lr = TRUE; X c_ptr = &cave`5Bi`5D`5Bx_right+1`5D; X c_ptr->fval = GRANITE_WALL; X c_ptr->lr = TRUE; X `7D X for (i = x_left; i <= x_right; i++) X `7B X c_ptr = &cave`5By_height-1`5D`5Bi`5D; X c_ptr->fval = GRANITE_WALL; X c_ptr->lr = TRUE; X c_ptr = &cave`5By_depth+1`5D`5Bi`5D; X c_ptr->fval = GRANITE_WALL; X c_ptr->lr = TRUE; X `7D X tmp = 2 + randint(9); X y_height = yval - 1; X y_depth = yval + 1; X x_left = xval - tmp; X x_right = xval + tmp; X for (i = y_height; i <= y_depth; i++) X for (j = x_left; j <= x_right; j++) X `7B X`09c_ptr = &cave`5Bi`5D`5Bj`5D; X`09c_ptr->fval = floor; X`09c_ptr->lr = TRUE; X `7D X for (i = (y_height - 1); i <= (y_depth + 1); i++) X `7B X c_ptr = &cave`5Bi`5D`5Bx_left-1`5D; X if (c_ptr->fval != floor) X`09`7B X`09 c_ptr->fval = GRANITE_WALL; X`09 c_ptr->lr = TRUE; X`09`7D X c_ptr = &cave`5Bi`5D`5Bx_right+1`5D; X if (c_ptr->fval != floor) X`09`7B X`09 c_ptr->fval = GRANITE_WALL; X`09 c_ptr->lr = TRUE; X`09`7D X `7D X for (i = x_left; i <= x_right; i++) X `7B X c_ptr = &cave`5By_height-1`5D`5Bi`5D; X if (c_ptr->fval != floor) X`09`7B X`09 c_ptr->fval = GRANITE_WALL; X`09 c_ptr->lr = TRUE; X`09`7D X c_ptr = &cave`5By_depth+1`5D`5Bi`5D; X if (c_ptr->fval != floor) X`09`7B X`09 c_ptr->fval = GRANITE_WALL; X`09 c_ptr->lr = TRUE; X`09`7D X `7D X /* Special features.`09`09`09*/ X switch(randint(4)) X `7B X case 1:`09/* Large middle pillar`09`09*/ X for (i = yval-1; i <= yval+1; i++) X`09`7B X`09 c_ptr = &cave`5Bi`5D`5Bxval-1`5D; X`09 for (j = xval-1; j <= xval+1; j++) X`09 `7B X`09 c_ptr->fval = TMP1_WALL; X`09 c_ptr++; X`09 `7D X`09`7D X break; X X case 2:`09/* Inner treasure vault`09`09*/ X for (i = yval-1; i <= yval+1; i++) X`09`7B X`09 cave`5Bi`5D`5Bxval-1`5D.fval`09 = TMP1_WALL; X`09 cave`5Bi`5D`5Bxval+1`5D.fval`09 = TMP1_WALL; X`09`7D X cave`5Byval-1`5D`5Bxval`5D.fval = TMP1_WALL; X cave`5Byval+1`5D`5Bxval`5D.fval = TMP1_WALL; X X tmp = randint(4);`09/* Place a door`09*/ X if (tmp < 3) X`09place_secret_door(yval-3+(tmp<<1), xval); X else X`09place_secret_door(yval, xval-7+(tmp<<1)); X X /* Place a treasure in the vault`09`09*/ X place_object(yval, xval); X /* Let's guard the treasure well.`09*/ X vault_monster(yval, xval, 2+randint(2)); X /* Traps naturally`09`09`09*/ X vault_trap(yval, xval, 4, 4, 1+randint(3)); X break; X X case 3: X if (randint(3) == 1) X`09`7B X`09 cave`5Byval-1`5D`5Bxval-2`5D.fval = TMP1_WALL; X`09 cave`5Byval+1`5D`5Bxval-2`5D.fval = TMP1_WALL; X`09 cave`5Byval-1`5D`5Bxval+2`5D.fval = TMP1_WALL; X`09 cave`5Byval+1`5D`5Bxval+2`5D.fval = TMP1_WALL; X`09 cave`5Byval-2`5D`5Bxval-1`5D.fval = TMP1_WALL; X`09 cave`5Byval-2`5D`5Bxval+1`5D.fval = TMP1_WALL; X`09 cave`5Byval+2`5D`5Bxval-1`5D.fval = TMP1_WALL; X`09 cave`5Byval+2`5D`5Bxval+1`5D.fval = TMP1_WALL; X`09 if (randint(3) == 1) X`09 `7B X`09 place_secret_door(yval, xval-2); X`09 place_secret_door(yval, xval+2); X`09 place_secret_door(yval-2, xval); X`09 place_secret_door(yval+2, xval); X`09 `7D X`09`7D X else if (randint(3) == 1) X`09`7B X`09 cave`5Byval`5D`5Bxval`5D.fval = TMP1_WALL; X`09 cave`5Byval-1`5D`5Bxval`5D.fval = TMP1_WALL; X`09 cave`5Byval+1`5D`5Bxval`5D.fval = TMP1_WALL; X`09 cave`5Byval`5D`5Bxval-1`5D.fval = TMP1_WALL; X`09 cave`5Byval`5D`5Bxval+1`5D.fval = TMP1_WALL; X`09`7D X else if (randint(3) == 1) X`09cave`5Byval`5D`5Bxval`5D.fval = TMP1_WALL; X break; X X case 4: X break; X `7D X`7D X X X/* Constructs a tunnel between two points`09`09*/ Xstatic void build_tunnel(row1, col1, row2, col2) Xint row1, col1, row2, col2; X`7B X register int tmp_row, tmp_col, i, j; X register cave_type *c_ptr; X cave_type *d_ptr; X coords tunstk`5B1000`5D, wallstk`5B1000`5D; X coords *tun_ptr; X int row_dir, col_dir, tunindex, wallindex; X int stop_flag, door_flag, main_loop_count; X int start_row, start_col; X X /* Main procedure for Tunnel`09`09`09*/ X /* Note: 9 is a temporary value`09`09*/ X stop_flag = FALSE; X door_flag = FALSE; X tunindex = 0; X wallindex = 0; +-+-+-+-+-+-+-+- END OF PART 21 +-+-+-+-+-+-+-+-