-+-+-+-+-+-+-+-+ START OF PART 32 -+-+-+-+-+-+-+-+ X`09 end; X`09for i1 := (y_height - 1) to (y_depth + 1) do X`09 begin X`09 with cave`5Bi1,x_left-1`5D do X`09 if (fval <> cur_floor.ftval) then X`09`09begin X`09`09 fval := rock_wall1.ftval; X`09`09 fopen := rock_wall1.ftopen; X`09`09end; X`09 with cave`5Bi1,x_right+1`5D do X`09 if (fval <> cur_floor.ftval) then X`09`09begin X`09`09 fval := rock_wall1.ftval; X`09`09 fopen := rock_wall1.ftopen; X`09`09end; X`09 end; X`09for i1 := x_left to x_right do X`09 begin X`09 with cave`5By_height-1,i1`5D do X`09 if (fval <> cur_floor.ftval) then X`09`09begin X`09`09 fval := rock_wall1.ftval; X`09`09 fopen := rock_wall1.ftopen; X`09`09end; X`09 with cave`5By_depth+1,i1`5D do X`09 if (fval <> cur_floor.ftval) then X`09`09begin X`09`09 fval := rock_wall1.ftval; X`09`09 fopen := rock_wall1.ftopen; X`09`09end; X`09 end; X`09`7B Special features...`09`09`09`7D X`09case randint(4) of X`09 1 :`09begin`09`7B Large middle pillar`09`09`7D X`09`09 for i1 := yval-1 to yval+1 do X`09`09 for i2 := xval-1 to xval+1 do X`09`09 cave`5Bi1,i2`5D.fval := 8; X`09`09end; X`09 2 :`09begin`09`7B Inner treasure vault`09`09`7D X`09`09 for i1 := yval-1 to yval+1 do X`09`09 begin X`09`09 cave`5Bi1,xval-1`5D.fval := 8; X`09`09 cave`5Bi1,xval+1`5D.fval := 8; X`09`09 end; X`09`09 cave`5Byval-1,xval`5D.fval := 8; X`09`09 cave`5Byval+1,xval`5D.fval := 8; X`09`09 case randint(4) of`09`7B Place a door`09`7D X`09`09 1 :`09place_secret_door(yval-1,xval); X`09`09 2 :`09place_secret_door(yval+1,xval); X`09`09 3 :`09place_secret_door(yval,xval-1); X`09`09 4 :`09place_secret_door(yval,xval+1); X`09`09 end; X`09`09`7B Place a treasure in the vault`09`09`7D X`09`09 place_object(yval,xval); X`09`09`7B Let's gaurd the treasure well...`09`7D X`09`09 vault_monster(yval,xval,2+randint(2)); X`09`09`7B Traps naturally`09`09`09`7D X`09`09 vault_trap(yval,xval,4,4,1+randint(3)); X`09`09end; X`09 3 :`09begin X`09`09 if (randint(3) = 1) then X`09`09 begin X`09`09 cave`5Byval-1,xval-2`5D.fval := 8; X`09`09 cave`5Byval+1,xval-2`5D.fval := 8; X`09`09 cave`5Byval-1,xval+2`5D.fval := 8; X`09`09 cave`5Byval-1,xval+2`5D.fval := 8; X`09`09 cave`5Byval-2,xval-1`5D.fval := 8; X`09`09 cave`5Byval-2,xval+1`5D.fval := 8; X`09`09 cave`5Byval+2,xval-1`5D.fval := 8; X`09`09 cave`5Byval+2,xval+1`5D.fval := 8; X`09`09 if (randint(3) = 1) then X`09`09`09begin X`09`09`09 place_secret_door(yval,xval-2); X`09`09`09 place_secret_door(yval,xval+2); X`09`09`09 place_secret_door(yval-2,xval); X`09`09`09 place_secret_door(yval+2,xval); X`09`09`09end; X`09`09 end X`09`09 else if (randint(3) = 1) then X`09`09 begin X`09`09 cave`5Byval,xval`5D.fval := 8; X`09`09 cave`5Byval-1,xval`5D.fval := 8; X`09`09 cave`5Byval+1,xval`5D.fval := 8; X`09`09 cave`5Byval,xval-1`5D.fval := 8; X`09`09 cave`5Byval,xval+1`5D.fval := 8; X`09`09 end X`09`09 else if (randint(3) = 1) then X`09`09 cave`5Byval,xval`5D.fval := 8; X`09`09end; X`09 4 :`09; X`09end; X end; X`7B procedure build_cave(yval,xval : integer); X var X`09`09y_height,y_depth`09: integer; X`09`09x_left,x_right`09`09: integer; X`09`09i1,i2`09`09`09: integer; X`09`09radius`09`09`09: integer; X begin X`09y_height := yval - 11; X`09y_depth := yval + 11; X`09x_left := xval - 11; X`09x_right := xval + 11; X`09for i1 := y_height to y_depth do X`09 for i2 := x_left to x_right do X`09 begin X`09 radius := trunc(sqrt(((((i1 - yval) ** 2) + ((i2 - xval) ** 2))))); X`09 if ((radius + randint(3)) > 9) then X`09 begin X`09`09cave`5Bi1,i2`5D.fval := rock_type1.ftval; X`09`09cave`5Bi1,i2`5D.fopen := rock_type1.ftopen; X`09 end X`09 else X`09 begin X`09`09cave`5Bi1,i2`5D.fval := dopen_floor.ftval; X`09`09cave`5Bi1,i2`5D.fopen := dopen_floor.ftopen; X`09 end; X`09 end; X`09 place_object(yval,xval); X`09 vault_monster(yval,xval,2+randint(2)); X`09 vault_trap(yval,xval,4,4,1+randint(3)); X end; `7D X X`09`7B Constructs a tunnel between two points`09`09`7D X procedure tunnel(row1,col1,row2,col2 : integer); X var X`09tmp_row,tmp_col`09`09: integer; X`09row_dir,col_dir `09: integer; X`09i1,i2,tmp`09`09: integer; X`09tunstk`09`09`09: array `5B1..1000`5D of coords; X`09wallstk`09`09`09: array `5B1..1000`5D of coords; X`09tunptr`09`09`09: integer; X`09wallptr`09`09`09: integer; X`09stop_flag,door_flag`09: boolean; X X X`09`7B Main procedure for Tunnel`09`09`09`7D X`09`7B Note: 9 is a temporary value`09`09`7D X begin X`09stop_flag := false; X`09door_flag := false; X`09tunptr := 0; X`09wallptr := 0; X`09correct_dir(row_dir,col_dir,row1,col1,row2,col2); X`09repeat X`09 if (randint(100) > dun_tun_chg) then X`09 rand_dir(row_dir,col_dir,row1,col1,row2,col2,dun_tun_rnd); X`09 tmp_row := row1 + row_dir; X`09 tmp_col := col1 + col_dir; X`09 while (not(in_bounds(tmp_row,tmp_col))) do X`09 begin X`09 rand_dir(row_dir,col_dir,row1,col1,row2,col2,dun_tun_rnd); X`09 tmp_row := row1 + row_dir; X`09 tmp_col := col1 + col_dir; X`09 end; X`09 with cave`5Btmp_row,tmp_col`5D do X`09 if (fval = rock_wall1.ftval) then X`09 begin X`09`09row1 := tmp_row; X`09`09col1 := tmp_col; X`09`09if (wallptr < 1000) then X`09`09 wallptr := wallptr + 1; X`09`09wallstk`5Bwallptr`5D.y := row1; X`09`09wallstk`5Bwallptr`5D.x := col1; X`09`09for i1 := row1-1 to row1+1 do X`09`09 for i2 := col1-1 to col1+1 do X`09`09 if (in_bounds(i1,i2)) then X`09`09 with cave`5Bi1,i2`5D do X`09`09`09if (fval in wall_set) then X`09`09`09 fval := 9; X`09 end X`09 else if (fval = corr_floor1.ftval) then X`09 begin X`09`09row1 := tmp_row; X`09`09col1 := tmp_col; X`09`09if (not(door_flag)) then X`09`09 begin X`09`09 if (doorptr <= 100) then X`09`09 begin X`09`09`09doorptr := doorptr + 1; X`09`09`09doorstk`5Bdoorptr`5D.y := row1; X`09`09`09doorstk`5Bdoorptr`5D.x := col1; X`09`09 end; X`09`09 door_flag := true; X`09`09 end; X`09`09if (randint(100) > dun_tun_con) then X`09`09 stop_flag := true; X`09 end X`09 else if (fval = 0) then X`09 begin X`09`09row1 := tmp_row; X`09`09col1 := tmp_col; X`09`09if (tunptr < 1000) then X`09`09 tunptr := tunptr + 1; X`09`09tunstk`5Btunptr`5D.y := row1; X`09`09tunstk`5Btunptr`5D.x := col1; X`09`09door_flag := false; X`09 end X`09 else if (fval <> 9) then X`09 begin X`09`09row1 := tmp_row; X`09`09col1 := tmp_col; X`09 end; X`09until (((row1 = row2) and (col1 = col2)) or (stop_flag)); X`09for i1 := 1 to tunptr do X`09 begin X`09 cave`5Btunstk`5Bi1`5D.y,tunstk`5Bi1`5D.x`5D.fval := corr_floor1.ftva Vl; X`09 cave`5Btunstk`5Bi1`5D.y,tunstk`5Bi1`5D.x`5D.fopen := corr_floor1.ftop Ven; X`09 end; X`09for i1 := 1 to wallptr do X`09 with cave`5Bwallstk`5Bi1`5D.y,wallstk`5Bi1`5D.x`5D do X`09 if (fval = 9) then X`09 begin X`09`09if (randint(100) < dun_tun_pen) then X`09`09 place_door(wallstk`5Bi1`5D.y,wallstk`5Bi1`5D.x) X`09`09else X`09`09 begin X`09`09 fval := corr_floor2.ftval; X`09`09 fopen := corr_floor2.ftopen; X`09`09 end; X`09 end; X end; X X X`09`7B Places door at y,x position if at least 2 walls found`09`7D X procedure try_door(y,x : integer); X X function next_to(y,x : integer) : boolean; X`09begin X`09 if (next_to8(y,x,`5B4,5,6`5D) > 2) then X`09 if ((cave`5By-1,x`5D.fval in wall_set) and`20 X`09`09(cave`5By+1,x`5D.fval in wall_set)) then X`09 next_to := true X`09 else if ((cave`5By,x-1`5D.fval in wall_set) and`20 X`09`09 (cave`5By,x+1`5D.fval in wall_set)) then X`09 next_to := true X`09 else X`09 next_to := false X`09 else X`09 next_to := false X`09end; X X begin X`09if (randint(100) > dun_tun_jct) then X`09 if (cave`5By,x`5D.fval = corr_floor1.ftval) then X`09 if (next_to(y,x)) then X`09 place_door(y,x); X end; X X X`09`7B Cave logic flow for generation of new dungeon`09`09`7D X procedure cave_gen; X type X`09spot_type = record X`09`09endx`09: integer; X`09`09endy`09: integer; X`09end; X`09room_type = array `5B1..20,1..20`5D of boolean; X var X`09room_map`09`09: room_type; X`09i1,i2,i3,i4`09`09: integer; X`09y1,x1,y2,x2`09`09: integer; X`09pick1,pick2`09`09: integer; X`09row_rooms,col_rooms`09: integer; X`09alloc_level`09`09: integer; X`09yloc`09`09`09: array `5B1..400`5D of worlint; X`09xloc`09`09`09: array `5B1..400`5D of worlint; X X begin X seed := get_seed; X row_rooms := 2*trunc(cur_height/screen_height); X col_rooms := 2*trunc(cur_width /screen_width); X for i1 := 1 to row_rooms do X`09 for i2 := 1 to col_rooms do X`09 room_map`5Bi1,i2`5D := false; X for i1 := 1 to randnor(dun_roo_mea,2) do X`09 room_map`5Brandint(row_rooms),randint(col_rooms)`5D := true; X i3 := 0; X for i1 := 1 to row_rooms do X`09 for i2 := 1 to col_rooms do X`09 if (room_map`5Bi1,i2`5D = true) then X`09 begin X`09 i3 := i3 + 1; X`09 yloc`5Bi3`5D := (i1-1)*(quart_height*2 + 1) + quart_height + 1; X`09 xloc`5Bi3`5D := (i2-1)*(quart_width*2 + 1) + quart_width + 1; X`09`09if (dun_level > randint(dun_unusual)) then X`09`09 case randint(3) of X`09`09 1 : build_type1(yloc`5Bi3`5D,xloc`5Bi3`5D); X`09`09 2 : build_type2(yloc`5Bi3`5D,xloc`5Bi3`5D); X`09`09 3 : build_type3(yloc`5Bi3`5D,xloc`5Bi3`5D); X`09`09 end X`09`09else X`09 build_room(yloc`5Bi3`5D,xloc`5Bi3`5D); X`09 end; X for i4 := 1 to i3 do X`09 begin X`09 pick1 := randint(i3); X`09 pick2 := randint(i3); X`09 y1 := yloc`5Bpick1`5D; X`09 x1 := xloc`5Bpick1`5D; X`09 yloc`5Bpick1`5D := yloc`5Bpick2`5D; X`09 xloc`5Bpick1`5D := xloc`5Bpick2`5D; X`09 yloc`5Bpick2`5D := y1; X`09 xloc`5Bpick2`5D := x1 X`09 end; X`09doorptr := 0; X for i4 := 1 to i3-1 do X`09 begin X`09 y1 := yloc`5Bi4`5D; X`09 x1 := xloc`5Bi4`5D; X`09 y2 := yloc`5Bi4+1`5D; X`09 x2 := xloc`5Bi4+1`5D; X`09 tunnel(y2,x2,y1,x1) X`09 end; X fill_cave(rock_wall1); X`09for i1 := 1 to dun_str_mag do X`09 place_streamer(rock_wall2,dun_str_mc); X`09for i1 := 1 to dun_str_qua do X`09 place_streamer(rock_wall3,dun_str_qc); X`09place_boundry; X`09all_the_river_stuff; X`09for i1 := 1 to dun_pools do X`09 place_pool(water1); X`09`09`7B Place intersection doors`09`7D X`09for i1 := 1 to doorptr do X`09 begin X`09 try_door(doorstk`5Bi1`5D.y,doorstk`5Bi1`5D.x-1); X`09 try_door(doorstk`5Bi1`5D.y,doorstk`5Bi1`5D.x+1); X`09 try_door(doorstk`5Bi1`5D.y-1,doorstk`5Bi1`5D.x); X`09 try_door(doorstk`5Bi1`5D.y+1,doorstk`5Bi1`5D.x); X`09 end; X`09alloc_level := trunc(dun_level/3); X`09if (alloc_level < 2) then X`09 alloc_level := 2 X`09else if (alloc_level > 10) then X`09 alloc_level := 10; X`09place_stairs(up_staircase,randint(2),3); X`09place_stairs(down_staircase,randint(2)+2,3); X`09place_stairs(up_steep_staircase,1,3); X`09place_stairs(down_steep_staircase,1,3); X`09alloc_land_monster(`5B1,2`5D,(randint(8)+min_malloc_level+alloc_level),0, Vtrue,false); X`09alloc_land_monster(`5B16,17,18`5D,(randint(8)+min_malloc_level+alloc_leve Vl) div 3,0,true,true); X`09alloc_object(`5B4`5D,3,randint(alloc_level)); X`09alloc_object(`5B1,2`5D,5,randnor(treas_room_alloc,3)); X`09alloc_object(`5B1,2,4`5D,5,randnor(treas_any_alloc,3)); X`09alloc_object(`5B1,2,4`5D,4,randnor(treas_gold_alloc,3)); X`09alloc_object(`5B1,2,4`5D,1,randint(alloc_level)); X`09if (dun_level >= win_mon_appear) then place_win_monster; X end; X X X procedure town_gen; X X var X`09y,x`09`09`09: integer; X`09i1,i2,i3,i4,i5,num`09: integer; X`09rooms`09`09`09: array `5B0..35`5D of integer; X`09roomdone`09`09: array `5B0..35`5D of boolean; X`09center`09`09`09: integer; X`09out_val`09`09`09: vtype; X X`09`7B Builds a building at a row,column coordinate, and`09`7D X`09`7B set up the initial contents by setting p1 to`09`09`7D X`09`7B whatever inside type is desired`09`09`09`7D X procedure build_store(store_num,where : integer); X var X`09`09yval,y_height,y_depth`09: integer; X`09`09xval,x_left,x_right`09: integer; X`09`09i1,i2,cur_pos,house_type,i3`09: integer; X`09`09old_seed`09`09: unsigned; X procedure make_door(y,x : integer); X begin X`09with cave`5By,x`5D do X`09 begin X`09 fval := corr_floor3.ftval; X`09 fopen := corr_floor3.ftopen; X`09 popt(cur_pos); X`09 tptr := cur_pos; X`09 if (store_num <= tot_stores) then X`09 t_list`5Bcur_pos`5D := store_door`5Bstore_num`5D X`09 else X`09 t_list`5Bcur_pos`5D := store_door`5Btot_stores+1`5D; X`09 end; X`09mini_sleep(5); X`09old_seed := seed; X`09seed := get_seed; X`09if (store_num > tot_stores) then X`09 with t_list`5Bcur_pos`5D do X`09 case house_type of X`09 1 : p1 := 8 + randint(4); X`09 2 : p1 := randint(10); X`09 3 : p1 := 3 + randint(6); X`09 4 : p1 := randint(7); X`09 5 : p1 := 1; X`09 otherwise ; X`09 end;`20 X`09seed := old_seed; X end; X X`7B for castle--changes all in both lines of symmetry `7D X procedure dr_castle(dy,dx : integer; ft : floor_type); X`09var t : integer; X`09begin X`09 dx := abs(dx); X`09 dy := abs(dy); X`09 repeat X`09 dy := -dy; X`09 if (dy <= 0) then X`09`09dx := -dx; X`09 cave`5Byval+dy,xval+dx`5D.fopen := ft.ftopen; X`09 cave`5Byval+dy,xval+dx`5D.fval := ft.ftval; X`09 until ((dy >= 0) and (dx >= 0)); X`09end; X X procedure blank_square(dy,dx : integer); X`09begin X`09 cave`5Byval+dy,xval+dx`5D.fopen := dopen_floor.ftopen; X`09 cave`5Byval+dy,xval+dx`5D.fval := dopen_floor.ftval; X`09end; X X begin X`09yval := 10*(where div 9)+6; X`09xval := 14*(where mod 9)+11; X`09if (store_num > tot_stores) then X`09 house_type := store_num - tot_stores X`09else X`09 house_type := 0; X`09if ((house_type = 1) or (house_type = 3)) then X`09 begin X`09`09y_height := yval - 1 - randint(2); X`09`09y_depth := yval + 1 + randint(3); X`09`09x_left := xval - 1 - randint(4); X`09`09x_right := xval + 2 + randint(3); X`09 end X`09else if (house_type = 2) then X`09 begin X`09`09yval := yval - 2 + randint(3); X`09`09xval := xval - 3 + randint(4); X`09`09y_height := yval - randint(2); X`09`09y_depth := yval + randint(3); X`09`09x_left := xval - randint(3); +-+-+-+-+-+-+-+- END OF PART 32 +-+-+-+-+-+-+-+-