X-Git-Url: http://git.osdn.net/view?a=blobdiff_plain;f=src%2Frooms.c;h=de075b3a986855ba15f2cd110176da932f550cf6;hb=b719fa71869b8a0076075c3e1c4bf186ccc24bc0;hp=4f4c39751f11e5165198e737b140876912710fa5;hpb=a31cf32c55912f16dc1677f7c968fcbee782980c;p=hengband%2Fhengband.git diff --git a/src/rooms.c b/src/rooms.c index 4f4c39751..de075b3a9 100644 --- a/src/rooms.c +++ b/src/rooms.c @@ -37,7 +37,12 @@ */ #include "angband.h" -#include "generate.h" +#include "util.h" + +#include "feature.h" +#include "floor.h" +#include "floor-generate.h" +#include "dungeon.h" #include "grid.h" #include "rooms.h" @@ -51,25 +56,25 @@ #include "trap.h" - -/*! - * 各部屋タイプの生成比定義 - *[from SAngband (originally from OAngband)]\n - *\n - * Table of values that control how many times each type of room will\n - * appear. Each type of room has its own row, and each column\n - * corresponds to dungeon levels 0, 10, 20, and so on. The final\n - * value is the minimum depth the room can appear at. -LM-\n - *\n - * Level 101 and below use the values for level 100.\n - *\n - * Rooms with lots of monsters or loot may not be generated if the\n - * object or monster lists are already nearly full. Rooms will not\n - * appear above their minimum depth. Tiny levels will not have space\n - * for all the rooms you ask for.\n - */ - -#if 1 +#include "monster.h" + + + /*! + * 各部屋タイプの生成比定義 + *[from SAngband (originally from OAngband)]\n + *\n + * Table of values that control how many times each type of room will\n + * appear. Each type of room has its own row, and each column\n + * corresponds to dungeon levels 0, 10, 20, and so on. The final\n + * value is the minimum depth the room can appear at. -LM-\n + *\n + * Level 101 and below use the values for level 100.\n + *\n + * Rooms with lots of monsters or loot may not be generated if the\n + * object or monster lists are already nearly full. Rooms will not\n + * appear above their minimum depth. Tiny levels will not have space\n + * for all the rooms you ask for.\n + */ static room_info_type room_info_normal[ROOM_T_MAX] = { @@ -94,35 +99,6 @@ static room_info_type room_info_normal[ROOM_T_MAX] = {{ 1, 8, 16, 24, 32, 40, 48, 56, 64, 72, 80}, 1}, /*FIX */ }; -#endif - -#if 0 -static room_info_type room_info_normal[ROOM_T_MAX] = -{ -/*デバッグ用配列*/ -{ {999, 900, 800, 700, 600, 500, 400, 300, 200, 100, 0}, 0}, /*NORMAL */ -{ { 1, 10, 20, 30, 40, 50, 60, 70, 80, 90, 0}, 1 }, /*OVERLAP */ -{ { 1, 10, 20, 30, 40, 50, 60, 70, 80, 90, 0}, 3 }, /*CROSS */ -{ { 1, 10, 20, 30, 40, 50, 60, 70, 80, 90, 0}, 3 }, /*INNER_F */ -{ { 0, 1, 1, 1, 2, 3, 5, 6, 8, 10, 0}, 10 }, /*NEST */ -{ { 0, 1, 1, 2, 3, 4, 6, 8, 10, 13, 0}, 10 }, /*PIT */ -{ { 0, 1, 1, 1, 2, 2, 3, 5, 6, 8, 0}, 10 }, /*LESSER_V */ -{ { 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 0}, 20 }, /*GREATER_V*/ -{ { 0,100,200,300,400,500,600,700,800,900, 0}, 10 }, /*FRACAVE */ -{ { 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 0}, 10 }, /*RANDOM_V */ -{ { 0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 0}, 3 }, /*OVAL */ -{ { 1, 6, 12, 18, 24, 30, 36, 42, 48, 54, 0}, 10 }, /*CRYPT */ -{ { 0, 0, 1, 1, 1, 2, 3, 4, 5, 6, 0}, 20 }, /*TRAP_PIT */ -{ { 0, 0, 1, 1, 1, 2, 3, 4, 5, 6, 0}, 20 }, /*TRAP */ -{ { 0, 0, 0, 0, 1, 1, 1, 2, 2, 2, 0}, 40 }, /*GLASS */ -{ { 1, 1, 1, 1, 1, 1, 1, 2, 2, 3, 0}, 1 }, /*ARCADE */ -{ { 20, 40, 60, 80,100,100,100,100,100,100,100}, 1 }, /*FIX */ -}; - -#endif - - - /*! 部屋の生成処理順 / Build rooms in descending order of difficulty. */ static byte room_build_order[ROOM_T_MAX] = { ROOM_T_GREATER_VAULT, @@ -146,6 +122,7 @@ static byte room_build_order[ROOM_T_MAX] = { /*! * @brief 1マスだけの部屋を作成し、上下左右いずれか一つに隠しドアを配置する。 + * @param player_ptr プレーヤーへの参照ポインタ * @param y0 配置したい中心のY座標 * @param x0 配置したい中心のX座標 * @details @@ -155,56 +132,57 @@ static byte room_build_order[ROOM_T_MAX] = { * Note - this should be used only on allocated regions * within another room. */ -void build_small_room(POSITION x0, POSITION y0) +void build_small_room(player_type *player_ptr, POSITION x0, POSITION y0) { POSITION x, y; + floor_type *floor_ptr = player_ptr->current_floor_ptr; for (y = y0 - 1; y <= y0 + 1; y++) { - place_inner_bold(y, x0 - 1); - place_inner_bold(y, x0 + 1); + place_inner_bold(floor_ptr, y, x0 - 1); + place_inner_bold(floor_ptr, y, x0 + 1); } for (x = x0 - 1; x <= x0 + 1; x++) { - place_inner_bold(y0 - 1, x); - place_inner_bold(y0 + 1, x); + place_inner_bold(floor_ptr, y0 - 1, x); + place_inner_bold(floor_ptr, y0 + 1, x); } /* Place a secret door on one side */ switch (randint0(4)) { - case 0: place_secret_door(y0, x0 - 1, DOOR_DEFAULT); break; - case 1: place_secret_door(y0, x0 + 1, DOOR_DEFAULT); break; - case 2: place_secret_door(y0 - 1, x0, DOOR_DEFAULT); break; - case 3: place_secret_door(y0 + 1, x0, DOOR_DEFAULT); break; + case 0: place_secret_door(player_ptr, y0, x0 - 1, DOOR_DEFAULT); break; + case 1: place_secret_door(player_ptr, y0, x0 + 1, DOOR_DEFAULT); break; + case 2: place_secret_door(player_ptr, y0 - 1, x0, DOOR_DEFAULT); break; + case 3: place_secret_door(player_ptr, y0 + 1, x0, DOOR_DEFAULT); break; } /* Clear mimic type */ - cave[y0][x0].mimic = 0; + floor_ptr->grid_array[y0][x0].mimic = 0; /* Add inner open space */ - place_floor_bold(y0, x0); + place_floor_bold(floor_ptr, y0, x0); } /*! * @brief * 指定範囲に通路が通っていることを確認した上で床で埋める - * This function tunnels around a room if it will cut off part of a cave system. + * This function tunnels around a room if it will cut off part of a grid system. * @param x1 範囲の左端 * @param y1 範囲の上端 * @param x2 範囲の右端 * @param y2 範囲の下端 * @return なし */ -static void check_room_boundary(POSITION x1, POSITION y1, POSITION x2, POSITION y2) +static void check_room_boundary(floor_type *floor_ptr, POSITION x1, POSITION y1, POSITION x2, POSITION y2) { int count; POSITION x, y; bool old_is_floor, new_is_floor; count = 0; - old_is_floor = get_is_floor(x1 - 1, y1); + old_is_floor = get_is_floor(floor_ptr, x1 - 1, y1); /* * Count the number of floor-wall boundaries around the room @@ -212,10 +190,10 @@ static void check_room_boundary(POSITION x1, POSITION y1, POSITION x2, POSITION * to bypass these if needed. */ - /* Above the top boundary */ + /* Above the top boundary */ for (x = x1; x <= x2; x++) { - new_is_floor = get_is_floor(x, y1 - 1); + new_is_floor = get_is_floor(floor_ptr, x, y1 - 1); /* Increment counter if they are different */ if (new_is_floor != old_is_floor) count++; @@ -226,7 +204,7 @@ static void check_room_boundary(POSITION x1, POSITION y1, POSITION x2, POSITION /* Right boundary */ for (y = y1; y <= y2; y++) { - new_is_floor = get_is_floor(x2 + 1, y); + new_is_floor = get_is_floor(floor_ptr, x2 + 1, y); /* increment counter if they are different */ if (new_is_floor != old_is_floor) count++; @@ -237,7 +215,7 @@ static void check_room_boundary(POSITION x1, POSITION y1, POSITION x2, POSITION /* Bottom boundary */ for (x = x2; x >= x1; x--) { - new_is_floor = get_is_floor(x, y2 + 1); + new_is_floor = get_is_floor(floor_ptr, x, y2 + 1); /* increment counter if they are different */ if (new_is_floor != old_is_floor) count++; @@ -248,7 +226,7 @@ static void check_room_boundary(POSITION x1, POSITION y1, POSITION x2, POSITION /* Left boundary */ for (y = y2; y >= y1; y--) { - new_is_floor = get_is_floor(x1 - 1, y); + new_is_floor = get_is_floor(floor_ptr, x1 - 1, y); /* increment counter if they are different */ if (new_is_floor != old_is_floor) count++; @@ -265,7 +243,7 @@ static void check_room_boundary(POSITION x1, POSITION y1, POSITION x2, POSITION { for (x = x1; x <= x2; x++) { - set_floor(x, y); + set_floor(floor_ptr, x, y); } } } @@ -334,7 +312,7 @@ static bool find_space_aux(POSITION blocks_high, POSITION blocks_wide, POSITION /* Never run off the screen */ if ((by1 < 0) || (by2 > dun->row_rooms)) return FALSE; if ((bx1 < 0) || (bx2 > dun->col_rooms)) return FALSE; - + /* Verify available space */ for (by = by1; by < by2; by++) { @@ -372,7 +350,7 @@ static bool find_space_aux(POSITION blocks_high, POSITION blocks_wide, POSITION * Return TRUE and values for the center of the room if all went well.\n * Otherwise, return FALSE.\n */ -bool find_space(POSITION *y, POSITION *x, POSITION height, POSITION width) +bool find_space(floor_type *floor_ptr, POSITION *y, POSITION *x, POSITION height, POSITION width) { int candidates, pick; POSITION by, bx, by1, bx1, by2, bx2; @@ -409,7 +387,7 @@ bool find_space(POSITION *y, POSITION *x, POSITION height, POSITION width) } /* Normal dungeon */ - if (!(d_info[dungeon_type].flags1 & DF1_NO_CAVE)) + if (!(d_info[floor_ptr->dungeon_idx].flags1 & DF1_NO_CAVE)) { /* Choose a random one */ pick = randint1(candidates); @@ -419,7 +397,7 @@ bool find_space(POSITION *y, POSITION *x, POSITION height, POSITION width) else { /* Always choose the center one */ - pick = candidates/2 + 1; + pick = candidates / 2 + 1; } /* Pick up the choosen location */ @@ -450,7 +428,7 @@ bool find_space(POSITION *y, POSITION *x, POSITION height, POSITION width) * be *exactly* correct to prevent memory errors */ - /* Acquire the location of the room */ + /* Acquire the location of the room */ (*y) = ((by1 + by2) * BLOCK_HGT) / 2; (*x) = ((bx1 + bx2) * BLOCK_WID) / 2; @@ -477,7 +455,7 @@ bool find_space(POSITION *y, POSITION *x, POSITION height, POSITION width) * If so, fix by tunneling outside the room in such a * way as to connect the caves. */ - check_room_boundary(*x - width / 2 - 1, *y - height / 2 - 1, *x + (width - 1) / 2 + 1, *y + (height - 1) / 2 + 1); + check_room_boundary(floor_ptr, *x - width / 2 - 1, *y - height / 2 - 1, *x + (width - 1) / 2 + 1, *y + (height - 1) / 2 + 1); /* Success. */ return TRUE; @@ -519,9 +497,9 @@ struct fill_data_type static fill_data_type fill_data; -/* Store routine for the fractal cave generator */ +/* Store routine for the fractal floor generator */ /* this routine probably should be an inline function or a macro. */ -static void store_height(POSITION x, POSITION y, FEAT_IDX val) +static void store_height(floor_type *floor_ptr, POSITION x, POSITION y, FEAT_IDX val) { /* if on boundary set val > cutoff so walls are not as square */ if (((x == fill_data.xmin) || (y == fill_data.ymin) || @@ -529,7 +507,7 @@ static void store_height(POSITION x, POSITION y, FEAT_IDX val) (val <= fill_data.c1)) val = fill_data.c1 + 1; /* store the value in height-map format */ - cave[y][x].feat = val; + floor_ptr->grid_array[y][x].feat = val; return; } @@ -562,7 +540,7 @@ static void store_height(POSITION x, POSITION y, FEAT_IDX val) * * How fractal caves are made: * -* When the map is complete, a cut-off value is used to create a cave. +* When the map is complete, a cut-off value is used to create a floor. * Heights below this value are "floor", and heights above are "wall". * This also can be used to create lakes, by adding more height levels * representing shallow and deep water/ lava etc. @@ -570,25 +548,25 @@ static void store_height(POSITION x, POSITION y, FEAT_IDX val) * The grd variable affects the width of passages. * The roug variable affects the roughness of those passages * -* The tricky part is making sure the created cave is connected. This +* The tricky part is making sure the created floor is connected. This * is done by 'filling' from the inside and only keeping the 'filled' * floor. Walls bounding the 'filled' floor are also kept. Everything * else is converted to the normal _extra_. */ -/* - * Note that this uses the cave.feat array in a very hackish way - * the values are first set to zero, and then each array location - * is used as a "heightmap" - * The heightmap then needs to be converted back into the "feat" format. - * - * grd=level at which fractal turns on. smaller gives more mazelike caves - * roug=roughness level. 16=normal. higher values make things more convoluted - * small values are good for smooth walls. - * size=length of the side of the square cave system. - */ -void generate_hmap(POSITION y0, POSITION x0, POSITION xsiz, POSITION ysiz, int grd, int roug, int cutoff) + /* + * Note that this uses the floor array in a very hackish way + * the values are first set to zero, and then each array location + * is used as a "heightmap" + * The heightmap then needs to be converted back into the "feat" format. + * + * grd=level at which fractal turns on. smaller gives more mazelike caves + * roug=roughness level. 16=normal. higher values make things more convoluted + * small values are good for smooth walls. + * size=length of the side of the square grid system. + */ +void generate_hmap(floor_type *floor_ptr, POSITION y0, POSITION x0, POSITION xsiz, POSITION ysiz, int grd, int roug, int cutoff) { POSITION xhsize, yhsize, xsize, ysize, maxsize; @@ -600,7 +578,7 @@ void generate_hmap(POSITION y0, POSITION x0, POSITION xsiz, POSITION ysiz, int g POSITION xstep, xhstep, ystep, yhstep; POSITION xstep2, xhstep2, ystep2, yhstep2; POSITION i, j, ii, jj, diagsize, xxsize, yysize; - + /* Cache for speed */ POSITION xm, xp, ym, yp; @@ -647,20 +625,20 @@ void generate_hmap(POSITION y0, POSITION x0, POSITION xsiz, POSITION ysiz, int g for (j = 0; j <= ysize; j++) { /* -1 is a flag for "not done yet" */ - cave[(int)(fill_data.ymin + j)][(int)(fill_data.xmin + i)].feat = -1; - /* Clear icky flag because may be redoing the cave */ - cave[(int)(fill_data.ymin + j)][(int)(fill_data.xmin + i)].info &= ~(CAVE_ICKY); + floor_ptr->grid_array[(int)(fill_data.ymin + j)][(int)(fill_data.xmin + i)].feat = -1; + /* Clear icky flag because may be redoing the floor_ptr->grid_array */ + floor_ptr->grid_array[(int)(fill_data.ymin + j)][(int)(fill_data.xmin + i)].info &= ~(CAVE_ICKY); } } /* Boundaries are walls */ - cave[fill_data.ymin][fill_data.xmin].feat = (s16b)maxsize; - cave[fill_data.ymax][fill_data.xmin].feat = (s16b)maxsize; - cave[fill_data.ymin][fill_data.xmax].feat = (s16b)maxsize; - cave[fill_data.ymax][fill_data.xmax].feat = (s16b)maxsize; + floor_ptr->grid_array[fill_data.ymin][fill_data.xmin].feat = (s16b)maxsize; + floor_ptr->grid_array[fill_data.ymax][fill_data.xmin].feat = (s16b)maxsize; + floor_ptr->grid_array[fill_data.ymin][fill_data.xmax].feat = (s16b)maxsize; + floor_ptr->grid_array[fill_data.ymax][fill_data.xmax].feat = (s16b)maxsize; /* Set the middle square to be an open area. */ - cave[y0][x0].feat = 0; + floor_ptr->grid_array[y0][x0].feat = 0; /* Initialize the step sizes */ xstep = xhstep = xsize * 256; @@ -697,20 +675,20 @@ void generate_hmap(POSITION y0, POSITION x0, POSITION xsiz, POSITION ysiz, int g jj = j / 256 + fill_data.ymin; /* Test square */ - if (cave[jj][ii].feat == -1) + if (floor_ptr->grid_array[jj][ii].feat == -1) { if (xhstep2 > grd) { /* If greater than 'grid' level then is random */ - store_height(ii, jj, randint1(maxsize)); + store_height(floor_ptr, ii, jj, randint1(maxsize)); } else { /* Average of left and right points +random bit */ - store_height(ii, jj, - (cave[jj][fill_data.xmin + (i - xhstep) / 256].feat - + cave[jj][fill_data.xmin + (i + xhstep) / 256].feat) / 2 - + (randint1(xstep2) - xhstep2) * roug / 16); + store_height(floor_ptr, ii, jj, + (floor_ptr->grid_array[jj][fill_data.xmin + (i - xhstep) / 256].feat + + floor_ptr->grid_array[jj][fill_data.xmin + (i + xhstep) / 256].feat) / 2 + + (randint1(xstep2) - xhstep2) * roug / 16); } } } @@ -727,19 +705,19 @@ void generate_hmap(POSITION y0, POSITION x0, POSITION xsiz, POSITION ysiz, int g jj = j / 256 + fill_data.ymin; /* Test square */ - if (cave[jj][ii].feat == -1) + if (floor_ptr->grid_array[jj][ii].feat == -1) { if (xhstep2 > grd) { /* If greater than 'grid' level then is random */ - store_height(ii, jj, randint1(maxsize)); + store_height(floor_ptr, ii, jj, randint1(maxsize)); } else { /* Average of up and down points +random bit */ - store_height(ii, jj, - (cave[fill_data.ymin + (j - yhstep) / 256][ii].feat - + cave[fill_data.ymin + (j + yhstep) / 256][ii].feat) / 2 + store_height(floor_ptr, ii, jj, + (floor_ptr->grid_array[fill_data.ymin + (j - yhstep) / 256][ii].feat + + floor_ptr->grid_array[fill_data.ymin + (j + yhstep) / 256][ii].feat) / 2 + (randint1(ystep2) - yhstep2) * roug / 16); } } @@ -756,12 +734,12 @@ void generate_hmap(POSITION y0, POSITION x0, POSITION xsiz, POSITION ysiz, int g jj = j / 256 + fill_data.ymin; /* Test square */ - if (cave[jj][ii].feat == -1) + if (floor_ptr->grid_array[jj][ii].feat == -1) { if (xhstep2 > grd) { /* If greater than 'grid' level then is random */ - store_height(ii, jj, randint1(maxsize)); + store_height(floor_ptr, ii, jj, randint1(maxsize)); } else { @@ -771,13 +749,13 @@ void generate_hmap(POSITION y0, POSITION x0, POSITION xsiz, POSITION ysiz, int g ym = fill_data.ymin + (j - yhstep) / 256; yp = fill_data.ymin + (j + yhstep) / 256; - /* + /* * Average over all four corners + scale by diagsize to * reduce the effect of the square grid on the shape of the fractal */ - store_height(ii, jj, - (cave[ym][xm].feat + cave[yp][xm].feat - + cave[ym][xp].feat + cave[yp][xp].feat) / 4 + store_height(floor_ptr, ii, jj, + (floor_ptr->grid_array[ym][xm].feat + floor_ptr->grid_array[yp][xm].feat + + floor_ptr->grid_array[ym][xp].feat + floor_ptr->grid_array[yp][xp].feat) / 4 + (randint1(xstep2) - xhstep2) * (diagsize / 16) / 256 * roug); } } @@ -787,13 +765,13 @@ void generate_hmap(POSITION y0, POSITION x0, POSITION xsiz, POSITION ysiz, int g } -static bool hack_isnt_wall(POSITION y, POSITION x, int c1, int c2, int c3, FEAT_IDX feat1, FEAT_IDX feat2, FEAT_IDX feat3, BIT_FLAGS info1, BIT_FLAGS info2, BIT_FLAGS info3) +static bool hack_isnt_wall(floor_type *floor_ptr, POSITION y, POSITION x, int c1, int c2, int c3, FEAT_IDX feat1, FEAT_IDX feat2, FEAT_IDX feat3, BIT_FLAGS info1, BIT_FLAGS info2, BIT_FLAGS info3) { /* * function used to convert from height-map back to the - * normal angband cave format + * normal angband floor_ptr->grid_array format */ - if (cave[y][x].info & CAVE_ICKY) + if (floor_ptr->grid_array[y][x].info & CAVE_ICKY) { /* already done */ return FALSE; @@ -801,56 +779,56 @@ static bool hack_isnt_wall(POSITION y, POSITION x, int c1, int c2, int c3, FEAT_ else { /* Show that have looked at this square */ - cave[y][x].info|= (CAVE_ICKY); + floor_ptr->grid_array[y][x].info |= (CAVE_ICKY); /* Use cutoffs c1-c3 to allocate regions of floor /water/ lava etc. */ - if (cave[y][x].feat <= c1) + if (floor_ptr->grid_array[y][x].feat <= c1) { /* 25% of the time use the other tile : it looks better this way */ if (randint1(100) < 75) { - cave[y][x].feat = feat1; - cave[y][x].info &= ~(CAVE_MASK); - cave[y][x].info |= info1; + floor_ptr->grid_array[y][x].feat = feat1; + floor_ptr->grid_array[y][x].info &= ~(CAVE_MASK); + floor_ptr->grid_array[y][x].info |= info1; return TRUE; } else { - cave[y][x].feat = feat2; - cave[y][x].info &= ~(CAVE_MASK); - cave[y][x].info |= info2; + floor_ptr->grid_array[y][x].feat = feat2; + floor_ptr->grid_array[y][x].info &= ~(CAVE_MASK); + floor_ptr->grid_array[y][x].info |= info2; return TRUE; } } - else if (cave[y][x].feat <= c2) + else if (floor_ptr->grid_array[y][x].feat <= c2) { /* 25% of the time use the other tile : it looks better this way */ if (randint1(100) < 75) { - cave[y][x].feat = feat2; - cave[y][x].info &= ~(CAVE_MASK); - cave[y][x].info |= info2; + floor_ptr->grid_array[y][x].feat = feat2; + floor_ptr->grid_array[y][x].info &= ~(CAVE_MASK); + floor_ptr->grid_array[y][x].info |= info2; return TRUE; } else { - cave[y][x].feat = feat1; - cave[y][x].info &= ~(CAVE_MASK); - cave[y][x].info |= info1; + floor_ptr->grid_array[y][x].feat = feat1; + floor_ptr->grid_array[y][x].info &= ~(CAVE_MASK); + floor_ptr->grid_array[y][x].info |= info1; return TRUE; } } - else if (cave[y][x].feat <= c3) + else if (floor_ptr->grid_array[y][x].feat <= c3) { - cave[y][x].feat = feat3; - cave[y][x].info &= ~(CAVE_MASK); - cave[y][x].info |= info3; + floor_ptr->grid_array[y][x].feat = feat3; + floor_ptr->grid_array[y][x].info &= ~(CAVE_MASK); + floor_ptr->grid_array[y][x].info |= info3; return TRUE; } /* if greater than cutoff then is a wall */ else { - place_outer_bold(y, x); + place_outer_bold(floor_ptr, y, x); return FALSE; } } @@ -861,9 +839,9 @@ static bool hack_isnt_wall(POSITION y, POSITION x, int c1, int c2, int c3, FEAT_ /* * Quick and nasty fill routine used to find the connected region - * of floor in the middle of the cave + * of floor in the middle of the grids */ -static void cave_fill(POSITION y, POSITION x) +static void cave_fill(floor_type *floor_ptr, POSITION y, POSITION x) { int i, j, d; POSITION ty, tx; @@ -875,15 +853,15 @@ static void cave_fill(POSITION y, POSITION x) /*** Start Grid ***/ /* Enqueue that entry */ - temp_y[0] = y; - temp_x[0] = x; + tmp_pos.y[0] = y; + tmp_pos.x[0] = x; /* Now process the queue */ while (flow_head != flow_tail) { /* Extract the next entry */ - ty = temp_y[flow_head]; - tx = temp_x[flow_head]; + ty = tmp_pos.y[flow_head]; + tx = tmp_pos.x[flow_head]; /* Forget that entry */ if (++flow_head == TEMP_MAX) flow_head = 0; @@ -897,12 +875,12 @@ static void cave_fill(POSITION y, POSITION x) j = ty + ddy_ddd[d]; i = tx + ddx_ddd[d]; - /* Paranoia Don't leave the cave */ - if (!in_bounds(j, i)) + /* Paranoia Don't leave the floor_ptr->grid_array */ + if (!in_bounds(floor_ptr, j, i)) { /* affect boundary */ - cave[j][i].info |= CAVE_ICKY; -/* return; */ + floor_ptr->grid_array[j][i].info |= CAVE_ICKY; + /* return; */ } /* If within bounds */ @@ -910,14 +888,14 @@ static void cave_fill(POSITION y, POSITION x) && (j > fill_data.ymin) && (j < fill_data.ymax)) { /* If not a wall or floor done before */ - if (hack_isnt_wall(j, i, + if (hack_isnt_wall(floor_ptr, j, i, fill_data.c1, fill_data.c2, fill_data.c3, fill_data.feat1, fill_data.feat2, fill_data.feat3, fill_data.info1, fill_data.info2, fill_data.info3)) { /* Enqueue that entry */ - temp_y[flow_tail] = (byte_hack)j; - temp_x[flow_tail] = (byte_hack)i; + tmp_pos.y[flow_tail] = (byte_hack)j; + tmp_pos.x[flow_tail] = (byte_hack)i; /* Advance the queue */ if (++flow_tail == TEMP_MAX) flow_tail = 0; @@ -929,7 +907,7 @@ static void cave_fill(POSITION y, POSITION x) } else { - /* keep tally of size of cave system */ + /* keep tally of size of floor_ptr->grid_array system */ (fill_data.amount)++; } } @@ -937,14 +915,14 @@ static void cave_fill(POSITION y, POSITION x) else { /* affect boundary */ - cave[j][i].info |= CAVE_ICKY; + floor_ptr->grid_array[j][i].info |= CAVE_ICKY; } } } } -bool generate_fracave(POSITION y0, POSITION x0, POSITION xsize, POSITION ysize, int cutoff, bool light, bool room) +bool generate_fracave(floor_type *floor_ptr, POSITION y0, POSITION x0, POSITION xsize, POSITION ysize, int cutoff, bool light, bool room) { POSITION x, y, xhsize, yhsize; int i; @@ -955,20 +933,20 @@ bool generate_fracave(POSITION y0, POSITION x0, POSITION xsize, POSITION ysize, /* - * select region connected to center of cave system + * select region connected to center of floor_ptr->grid_array system * this gets rid of alot of isolated one-sqaures that * can make teleport traps instadeaths... */ - /* cutoffs */ + /* cutoffs */ fill_data.c1 = cutoff; fill_data.c2 = 0; fill_data.c3 = 0; /* features to fill with */ - fill_data.feat1 = floor_type[randint0(100)]; - fill_data.feat2 = floor_type[randint0(100)]; - fill_data.feat3 = floor_type[randint0(100)]; + fill_data.feat1 = feat_ground_type[randint0(100)]; + fill_data.feat2 = feat_ground_type[randint0(100)]; + fill_data.feat3 = feat_ground_type[randint0(100)]; fill_data.info1 = CAVE_FLOOR; fill_data.info2 = CAVE_FLOOR; @@ -977,7 +955,7 @@ bool generate_fracave(POSITION y0, POSITION x0, POSITION xsize, POSITION ysize, /* number of filled squares */ fill_data.amount = 0; - cave_fill((byte)y0, (byte)x0); + cave_fill(floor_ptr, (byte)y0, (byte)x0); /* if tally too small, try again */ if (fill_data.amount < 10) @@ -987,8 +965,8 @@ bool generate_fracave(POSITION y0, POSITION x0, POSITION xsize, POSITION ysize, { for (y = 0; y <= ysize; ++y) { - place_extra_bold(y0 + y - yhsize, x0 + x - xhsize); - cave[y0 + y - yhsize][x0 + x - xhsize].info &= ~(CAVE_ICKY | CAVE_ROOM); + place_extra_bold(floor_ptr, y0 + y - yhsize, x0 + x - xhsize); + floor_ptr->grid_array[y0 + y - yhsize][x0 + x - xhsize].info &= ~(CAVE_ICKY | CAVE_ROOM); } } return FALSE; @@ -1002,75 +980,75 @@ bool generate_fracave(POSITION y0, POSITION x0, POSITION xsize, POSITION ysize, for (i = 0; i <= xsize; ++i) { /* top boundary */ - if ((cave[0 + y0 - yhsize][i + x0 - xhsize].info & CAVE_ICKY) && (room)) + if ((floor_ptr->grid_array[0 + y0 - yhsize][i + x0 - xhsize].info & CAVE_ICKY) && (room)) { /* Next to a 'filled' region? - set to be room walls */ - place_outer_bold(y0 + 0 - yhsize, x0 + i - xhsize); - if (light) cave[y0 + 0 - yhsize][x0 + i - xhsize].info |= (CAVE_GLOW); - cave[y0 + 0 - yhsize][x0 + i - xhsize].info |= (CAVE_ROOM); - place_outer_bold(y0 + 0 - yhsize, x0 + i - xhsize); + place_outer_bold(floor_ptr, y0 + 0 - yhsize, x0 + i - xhsize); + if (light) floor_ptr->grid_array[y0 + 0 - yhsize][x0 + i - xhsize].info |= (CAVE_GLOW); + floor_ptr->grid_array[y0 + 0 - yhsize][x0 + i - xhsize].info |= (CAVE_ROOM); + place_outer_bold(floor_ptr, y0 + 0 - yhsize, x0 + i - xhsize); } else { /* set to be normal granite */ - place_extra_bold(y0 + 0 - yhsize, x0 + i - xhsize); + place_extra_bold(floor_ptr, y0 + 0 - yhsize, x0 + i - xhsize); } /* bottom boundary */ - if ((cave[ysize + y0 - yhsize][i + x0 - xhsize].info & CAVE_ICKY) && (room)) + if ((floor_ptr->grid_array[ysize + y0 - yhsize][i + x0 - xhsize].info & CAVE_ICKY) && (room)) { /* Next to a 'filled' region? - set to be room walls */ - place_outer_bold(y0 + ysize - yhsize, x0 + i - xhsize); - if (light) cave[y0 + ysize - yhsize][x0 + i - xhsize].info|=(CAVE_GLOW); - cave[y0 + ysize - yhsize][x0 + i - xhsize].info|=(CAVE_ROOM); - place_outer_bold(y0 + ysize - yhsize, x0 + i - xhsize); + place_outer_bold(floor_ptr, y0 + ysize - yhsize, x0 + i - xhsize); + if (light) floor_ptr->grid_array[y0 + ysize - yhsize][x0 + i - xhsize].info |= (CAVE_GLOW); + floor_ptr->grid_array[y0 + ysize - yhsize][x0 + i - xhsize].info |= (CAVE_ROOM); + place_outer_bold(floor_ptr, y0 + ysize - yhsize, x0 + i - xhsize); } else { /* set to be normal granite */ - place_extra_bold(y0 + ysize - yhsize, x0 + i - xhsize); + place_extra_bold(floor_ptr, y0 + ysize - yhsize, x0 + i - xhsize); } /* clear the icky flag-don't need it any more */ - cave[y0 + 0 - yhsize][x0 + i - xhsize].info &= ~(CAVE_ICKY); - cave[y0 + ysize - yhsize][x0 + i - xhsize].info &= ~(CAVE_ICKY); + floor_ptr->grid_array[y0 + 0 - yhsize][x0 + i - xhsize].info &= ~(CAVE_ICKY); + floor_ptr->grid_array[y0 + ysize - yhsize][x0 + i - xhsize].info &= ~(CAVE_ICKY); } /* Do the left and right boundaries minus the corners (done above) */ for (i = 1; i < ysize; ++i) { /* left boundary */ - if ((cave[i + y0 - yhsize][0 + x0 - xhsize].info & CAVE_ICKY) && room) + if ((floor_ptr->grid_array[i + y0 - yhsize][0 + x0 - xhsize].info & CAVE_ICKY) && room) { /* room boundary */ - place_outer_bold(y0 + i - yhsize, x0 + 0 - xhsize); - if (light) cave[y0 + i - yhsize][x0 + 0 - xhsize].info |= (CAVE_GLOW); - cave[y0 + i - yhsize][x0 + 0 - xhsize].info |= (CAVE_ROOM); - place_outer_bold(y0 + i - yhsize, x0 + 0 - xhsize); + place_outer_bold(floor_ptr, y0 + i - yhsize, x0 + 0 - xhsize); + if (light) floor_ptr->grid_array[y0 + i - yhsize][x0 + 0 - xhsize].info |= (CAVE_GLOW); + floor_ptr->grid_array[y0 + i - yhsize][x0 + 0 - xhsize].info |= (CAVE_ROOM); + place_outer_bold(floor_ptr, y0 + i - yhsize, x0 + 0 - xhsize); } else { /* outside room */ - place_extra_bold(y0 + i - yhsize, x0 + 0 - xhsize); + place_extra_bold(floor_ptr, y0 + i - yhsize, x0 + 0 - xhsize); } /* right boundary */ - if ((cave[i + y0 - yhsize][xsize + x0 - xhsize].info & CAVE_ICKY) && room) + if ((floor_ptr->grid_array[i + y0 - yhsize][xsize + x0 - xhsize].info & CAVE_ICKY) && room) { /* room boundary */ - place_outer_bold(y0 + i - yhsize, x0 + xsize - xhsize); - if (light) cave[y0 + i - yhsize][x0 + xsize - xhsize].info |= (CAVE_GLOW); - cave[y0 + i - yhsize][x0 + xsize - xhsize].info |= (CAVE_ROOM); - place_outer_bold(y0 + i - yhsize, x0 + xsize - xhsize); + place_outer_bold(floor_ptr, y0 + i - yhsize, x0 + xsize - xhsize); + if (light) floor_ptr->grid_array[y0 + i - yhsize][x0 + xsize - xhsize].info |= (CAVE_GLOW); + floor_ptr->grid_array[y0 + i - yhsize][x0 + xsize - xhsize].info |= (CAVE_ROOM); + place_outer_bold(floor_ptr, y0 + i - yhsize, x0 + xsize - xhsize); } else { /* outside room */ - place_extra_bold(y0 + i - yhsize, x0 + xsize - xhsize); + place_extra_bold(floor_ptr, y0 + i - yhsize, x0 + xsize - xhsize); } /* clear icky flag -done with it */ - cave[y0 + i - yhsize][x0 + 0 - xhsize].info &= ~(CAVE_ICKY); - cave[y0 + i - yhsize][x0 + xsize - xhsize].info &= ~(CAVE_ICKY); + floor_ptr->grid_array[y0 + i - yhsize][x0 + 0 - xhsize].info &= ~(CAVE_ICKY); + floor_ptr->grid_array[y0 + i - yhsize][x0 + xsize - xhsize].info &= ~(CAVE_ICKY); } @@ -1079,38 +1057,38 @@ bool generate_fracave(POSITION y0, POSITION x0, POSITION xsize, POSITION ysize, { for (y = 1; y < ysize; ++y) { - if (is_floor_bold(y0 + y - yhsize, x0 + x - xhsize) && - (cave[y0 + y - yhsize][x0 + x - xhsize].info & CAVE_ICKY)) + if (is_floor_bold(floor_ptr, y0 + y - yhsize, x0 + x - xhsize) && + (floor_ptr->grid_array[y0 + y - yhsize][x0 + x - xhsize].info & CAVE_ICKY)) { /* Clear the icky flag in the filled region */ - cave[y0 + y - yhsize][x0 + x - xhsize].info &= ~CAVE_ICKY; + floor_ptr->grid_array[y0 + y - yhsize][x0 + x - xhsize].info &= ~CAVE_ICKY; /* Set appropriate flags */ - if (light) cave[y0 + y - yhsize][x0 + x - xhsize].info |= (CAVE_GLOW); - if (room) cave[y0 + y - yhsize][x0 + x - xhsize].info |= (CAVE_ROOM); + if (light) floor_ptr->grid_array[y0 + y - yhsize][x0 + x - xhsize].info |= (CAVE_GLOW); + if (room) floor_ptr->grid_array[y0 + y - yhsize][x0 + x - xhsize].info |= (CAVE_ROOM); } - else if (is_outer_bold(y0 + y - yhsize, x0 + x - xhsize) && - (cave[y0 + y - yhsize][x0 + x - xhsize].info & CAVE_ICKY)) + else if (is_outer_bold(floor_ptr, y0 + y - yhsize, x0 + x - xhsize) && + (floor_ptr->grid_array[y0 + y - yhsize][x0 + x - xhsize].info & CAVE_ICKY)) { /* Walls */ - cave[y0 + y - yhsize][x0 + x - xhsize].info &= ~(CAVE_ICKY); - if (light) cave[y0 + y - yhsize][x0 + x - xhsize].info |= (CAVE_GLOW); + floor_ptr->grid_array[y0 + y - yhsize][x0 + x - xhsize].info &= ~(CAVE_ICKY); + if (light) floor_ptr->grid_array[y0 + y - yhsize][x0 + x - xhsize].info |= (CAVE_GLOW); if (room) { - cave[y0 + y - yhsize][x0 + x - xhsize].info |= (CAVE_ROOM); + floor_ptr->grid_array[y0 + y - yhsize][x0 + x - xhsize].info |= (CAVE_ROOM); } else { - place_extra_bold(y0 + y - yhsize, x0 + x - xhsize); - cave[y0 + y - yhsize][x0 + x - xhsize].info &= ~(CAVE_ROOM); + place_extra_bold(floor_ptr, y0 + y - yhsize, x0 + x - xhsize); + floor_ptr->grid_array[y0 + y - yhsize][x0 + x - xhsize].info &= ~(CAVE_ROOM); } } else { /* Clear the unconnected regions */ - place_extra_bold(y0 + y - yhsize, x0 + x - xhsize); - cave[y0 + y - yhsize][x0 + x - xhsize].info &= ~(CAVE_ICKY | CAVE_ROOM); + place_extra_bold(floor_ptr, y0 + y - yhsize, x0 + x - xhsize); + floor_ptr->grid_array[y0 + y - yhsize][x0 + x - xhsize].info &= ~(CAVE_ICKY | CAVE_ROOM); } } } @@ -1133,18 +1111,18 @@ bool generate_fracave(POSITION y0, POSITION x0, POSITION xsize, POSITION ysize, /* * Builds a cave system in the center of the dungeon. */ -void build_cavern(void) +void build_cavern(floor_type *floor_ptr) { int grd, roug, cutoff; POSITION xsize, ysize, x0, y0; bool done, light; light = done = FALSE; - if ((dun_level <= randint1(50)) && !(d_info[dungeon_type].flags1 & DF1_DARKNESS)) light = TRUE; + if ((floor_ptr->dun_level <= randint1(50)) && !(d_info[floor_ptr->dungeon_idx].flags1 & DF1_DARKNESS)) light = TRUE; /* Make a cave the size of the dungeon */ - xsize = cur_wid - 1; - ysize = cur_hgt - 1; + xsize = floor_ptr->width - 1; + ysize = floor_ptr->height - 1; x0 = xsize / 2; y0 = ysize / 2; @@ -1163,15 +1141,15 @@ void build_cavern(void) /* about size/2 */ cutoff = xsize / 2; - /* make it */ - generate_hmap(y0 + 1, x0 + 1, xsize, ysize, grd, roug, cutoff); + /* make it */ + generate_hmap(floor_ptr, y0 + 1, x0 + 1, xsize, ysize, grd, roug, cutoff); /* Convert to normal format+ clean up */ - done = generate_fracave(y0 + 1, x0 + 1, xsize, ysize, cutoff, light, FALSE); + done = generate_fracave(floor_ptr, y0 + 1, x0 + 1, xsize, ysize, cutoff, light, FALSE); } } -bool generate_lake(POSITION y0, POSITION x0, POSITION xsize, POSITION ysize, int c1, int c2, int c3, int type) +bool generate_lake(floor_type *floor_ptr, POSITION y0, POSITION x0, POSITION xsize, POSITION ysize, int c1, int c2, int c3, int type) { POSITION x, y, xhsize, yhsize; int i; @@ -1187,21 +1165,21 @@ bool generate_lake(POSITION y0, POSITION x0, POSITION xsize, POSITION ysize, int case LAKE_T_LAVA: /* Lava */ feat1 = feat_deep_lava; feat2 = feat_shallow_lava; - feat3 = floor_type[randint0(100)]; + feat3 = feat_ground_type[randint0(100)]; break; case LAKE_T_WATER: /* Water */ feat1 = feat_deep_water; feat2 = feat_shallow_water; - feat3 = floor_type[randint0(100)]; + feat3 = feat_ground_type[randint0(100)]; break; - case LAKE_T_CAVE: /* Collapsed cave */ - feat1 = floor_type[randint0(100)]; - feat2 = floor_type[randint0(100)]; + case LAKE_T_CAVE: /* Collapsed floor_ptr->grid_array */ + feat1 = feat_ground_type[randint0(100)]; + feat2 = feat_ground_type[randint0(100)]; feat3 = feat_rubble; break; case LAKE_T_EARTH_VAULT: /* Earth vault */ feat1 = feat_rubble; - feat2 = floor_type[randint0(100)]; + feat2 = feat_ground_type[randint0(100)]; feat3 = feat_rubble; break; case LAKE_T_AIR_VAULT: /* Air vault */ @@ -1219,18 +1197,16 @@ bool generate_lake(POSITION y0, POSITION x0, POSITION xsize, POSITION ysize, int feat2 = feat_deep_lava; feat3 = feat_shallow_lava; break; - - /* Paranoia */ default: return FALSE; } /* - * select region connected to center of cave system + * select region connected to center of floor_ptr->grid_array system * this gets rid of alot of isolated one-sqaures that * can make teleport traps instadeaths... */ - /* cutoffs */ + /* cutoffs */ fill_data.c1 = c1; fill_data.c2 = c2; fill_data.c3 = c3; @@ -1247,10 +1223,10 @@ bool generate_lake(POSITION y0, POSITION x0, POSITION xsize, POSITION ysize, int /* number of filled squares */ fill_data.amount = 0; - /* select region connected to center of cave system + /* select region connected to center of floor_ptr->grid_array system * this gets rid of alot of isolated one-sqaures that * can make teleport traps instadeaths... */ - cave_fill((byte)y0, (byte)x0); + cave_fill(floor_ptr, (byte)y0, (byte)x0); /* if tally too small, try again */ if (fill_data.amount < 10) @@ -1260,8 +1236,8 @@ bool generate_lake(POSITION y0, POSITION x0, POSITION xsize, POSITION ysize, int { for (y = 0; y <= ysize; ++y) { - place_floor_bold(y0 + y - yhsize, x0 + x - xhsize); - cave[y0 + y - yhsize][x0 + x - xhsize].info &= ~(CAVE_ICKY); + place_floor_bold(floor_ptr, y0 + y - yhsize, x0 + x - xhsize); + floor_ptr->grid_array[y0 + y - yhsize][x0 + x - xhsize].info &= ~(CAVE_ICKY); } } return FALSE; @@ -1270,24 +1246,24 @@ bool generate_lake(POSITION y0, POSITION x0, POSITION xsize, POSITION ysize, int /* Do boundarys- set to normal granite */ for (i = 0; i <= xsize; ++i) { - place_extra_bold(y0 + 0 - yhsize, x0 + i - xhsize); - place_extra_bold(y0 + ysize - yhsize, x0 + i - xhsize); + place_extra_bold(floor_ptr, y0 + 0 - yhsize, x0 + i - xhsize); + place_extra_bold(floor_ptr, y0 + ysize - yhsize, x0 + i - xhsize); /* clear the icky flag-don't need it any more */ - cave[y0 + 0 - yhsize][x0 + i - xhsize].info &= ~(CAVE_ICKY); - cave[y0 + ysize - yhsize][x0 + i - xhsize].info &= ~(CAVE_ICKY); + floor_ptr->grid_array[y0 + 0 - yhsize][x0 + i - xhsize].info &= ~(CAVE_ICKY); + floor_ptr->grid_array[y0 + ysize - yhsize][x0 + i - xhsize].info &= ~(CAVE_ICKY); } /* Do the left and right boundaries minus the corners (done above) */ for (i = 1; i < ysize; ++i) { - place_extra_bold(y0 + i - yhsize, x0 + 0 - xhsize); - place_extra_bold(y0 + i - yhsize, x0 + xsize - xhsize); + place_extra_bold(floor_ptr, y0 + i - yhsize, x0 + 0 - xhsize); + place_extra_bold(floor_ptr, y0 + i - yhsize, x0 + xsize - xhsize); /* clear icky flag -done with it */ - cave[y0 + i - yhsize][x0 + 0 - xhsize].info &= ~(CAVE_ICKY); - cave[y0 + i - yhsize][x0 + xsize - xhsize].info &= ~(CAVE_ICKY); + floor_ptr->grid_array[y0 + i - yhsize][x0 + 0 - xhsize].info &= ~(CAVE_ICKY); + floor_ptr->grid_array[y0 + i - yhsize][x0 + xsize - xhsize].info &= ~(CAVE_ICKY); } @@ -1297,17 +1273,17 @@ bool generate_lake(POSITION y0, POSITION x0, POSITION xsize, POSITION ysize, int for (y = 1; y < ysize; ++y) { /* Fill unconnected regions with granite */ - if ((!(cave[y0 + y - yhsize][x0 + x - xhsize].info & CAVE_ICKY)) || - is_outer_bold(y0 + y - yhsize, x0 + x - xhsize)) - place_extra_bold(y0 + y - yhsize, x0 + x - xhsize); + if ((!(floor_ptr->grid_array[y0 + y - yhsize][x0 + x - xhsize].info & CAVE_ICKY)) || + is_outer_bold(floor_ptr, y0 + y - yhsize, x0 + x - xhsize)) + place_extra_bold(floor_ptr, y0 + y - yhsize, x0 + x - xhsize); /* turn off icky flag (no longer needed.) */ - cave[y0 + y - yhsize][x0 + x - xhsize].info &= ~(CAVE_ICKY | CAVE_ROOM); + floor_ptr->grid_array[y0 + y - yhsize][x0 + x - xhsize].info &= ~(CAVE_ICKY | CAVE_ROOM); /* Light lava */ - if (cave_have_flag_bold(y0 + y - yhsize, x0 + x - xhsize, FF_LAVA)) + if (cave_have_flag_bold(floor_ptr, y0 + y - yhsize, x0 + x - xhsize, FF_LAVA)) { - if (!(d_info[dungeon_type].flags1 & DF1_DARKNESS)) cave[y0 + y - yhsize][x0 + x - xhsize].info |= CAVE_GLOW; + if (!(d_info[floor_ptr->dungeon_idx].flags1 & DF1_DARKNESS)) floor_ptr->grid_array[y0 + y - yhsize][x0 + x - xhsize].info |= CAVE_GLOW; } } } @@ -1317,9 +1293,9 @@ bool generate_lake(POSITION y0, POSITION x0, POSITION xsize, POSITION ysize, int /* - * makes a lake/collapsed cave system in the center of the dungeon + * makes a lake/collapsed floor in the center of the dungeon */ -void build_lake(int type) +void build_lake(floor_type *floor_ptr, int type) { int grd, roug, xsize, ysize, x0, y0; bool done = FALSE; @@ -1333,8 +1309,8 @@ void build_lake(int type) } /* Make the size of the dungeon */ - xsize = cur_wid - 1; - ysize = cur_hgt - 1; + xsize = floor_ptr->width - 1; + ysize = floor_ptr->height - 1; x0 = xsize / 2; y0 = ysize / 2; @@ -1361,10 +1337,10 @@ void build_lake(int type) c2 = (c1 + c3) / 2; /* make it */ - generate_hmap(y0 + 1, x0 + 1, xsize, ysize, grd, roug, c3); + generate_hmap(floor_ptr, y0 + 1, x0 + 1, xsize, ysize, grd, roug, c3); /* Convert to normal format+ clean up */ - done = generate_lake(y0 + 1, x0 + 1, xsize, ysize, c1, c2, c3, type); + done = generate_lake(floor_ptr, y0 + 1, x0 + 1, xsize, ysize, c1, c2, c3, type); } } #endif /* ALLOW_CAVERNS_AND_LAKES */ @@ -1374,7 +1350,7 @@ void build_lake(int type) /* * Routine that fills the empty areas of a room with treasure and monsters. */ -void fill_treasure(POSITION x1, POSITION x2, POSITION y1, POSITION y2, int difficulty) +void fill_treasure(player_type *player_ptr, POSITION x1, POSITION x2, POSITION y1, POSITION y2, int difficulty) { POSITION x, y, cx, cy, size; s32b value; @@ -1386,6 +1362,7 @@ void fill_treasure(POSITION x1, POSITION x2, POSITION y1, POSITION y2, int diffi /* Rough measure of size of vault= sum of lengths of sides */ size = abs(x2 - x1) + abs(y2 - y1); + floor_type *floor_ptr = player_ptr->current_floor_ptr; for (x = x1; x <= x2; x++) { for (y = y1; y <= y2; y++) @@ -1397,37 +1374,36 @@ void fill_treasure(POSITION x1, POSITION x2, POSITION y1, POSITION y2, int diffi /* hack- empty square part of the time */ if ((randint1(100) - difficulty * 3) > 50) value = 20; - /* if floor, shallow water and lava */ - if (is_floor_bold(y, x) || - (cave_have_flag_bold(y, x, FF_PLACE) && cave_have_flag_bold(y, x, FF_DROP))) + /* if floor, shallow water and lava */ + if (is_floor_bold(floor_ptr, y, x) || + (cave_have_flag_bold(floor_ptr, y, x, FF_PLACE) && cave_have_flag_bold(floor_ptr, y, x, FF_DROP))) { /* The smaller 'value' is, the better the stuff */ if (value < 0) { /* Meanest monster + treasure */ - monster_level = base_level + 40; - place_monster(y, x, (PM_ALLOW_SLEEP | PM_ALLOW_GROUP)); - monster_level = base_level; - object_level = base_level + 20; - place_object(y, x, AM_GOOD); - object_level = base_level; + floor_ptr->monster_level = floor_ptr->base_level + 40; + place_monster(player_ptr, y, x, (PM_ALLOW_SLEEP | PM_ALLOW_GROUP)); + floor_ptr->monster_level = floor_ptr->base_level; + floor_ptr->object_level = floor_ptr->base_level + 20; + place_object(player_ptr, y, x, AM_GOOD); + floor_ptr->object_level = floor_ptr->base_level; } else if (value < 5) { /* Mean monster +treasure */ - monster_level = base_level + 20; - place_monster(y, x, (PM_ALLOW_SLEEP | PM_ALLOW_GROUP)); - monster_level = base_level; - object_level = base_level + 10; - place_object(y, x, AM_GOOD); - object_level = base_level; + floor_ptr->monster_level = floor_ptr->base_level + 20; + place_monster(player_ptr, y, x, (PM_ALLOW_SLEEP | PM_ALLOW_GROUP)); + floor_ptr->monster_level = floor_ptr->base_level; + floor_ptr->object_level = floor_ptr->base_level + 10; + place_object(player_ptr, y, x, AM_GOOD); + floor_ptr->object_level = floor_ptr->base_level; } else if (value < 10) { - /* Monster */ - monster_level = base_level + 9; - place_monster(y, x, (PM_ALLOW_SLEEP | PM_ALLOW_GROUP)); - monster_level = base_level; + floor_ptr->monster_level = floor_ptr->base_level + 9; + place_monster(player_ptr, y, x, (PM_ALLOW_SLEEP | PM_ALLOW_GROUP)); + floor_ptr->monster_level = floor_ptr->base_level; } else if (value < 17) { @@ -1445,41 +1421,41 @@ void fill_treasure(POSITION x1, POSITION x2, POSITION y1, POSITION y2, int diffi /* Object or trap */ if (randint0(100) < 25) { - place_object(y, x, 0L); + place_object(player_ptr, y, x, 0L); } else { - place_trap(y, x); + place_trap(player_ptr, y, x); } } else if (value < 30) { /* Monster and trap */ - monster_level = base_level + 5; - place_monster(y, x, (PM_ALLOW_SLEEP | PM_ALLOW_GROUP)); - monster_level = base_level; - place_trap(y, x); + floor_ptr->monster_level = floor_ptr->base_level + 5; + place_monster(player_ptr, y, x, (PM_ALLOW_SLEEP | PM_ALLOW_GROUP)); + floor_ptr->monster_level = floor_ptr->base_level; + place_trap(player_ptr, y, x); } else if (value < 40) { /* Monster or object */ if (randint0(100) < 50) { - monster_level = base_level + 3; - place_monster(y, x, (PM_ALLOW_SLEEP | PM_ALLOW_GROUP)); - monster_level = base_level; + floor_ptr->monster_level = floor_ptr->base_level + 3; + place_monster(player_ptr, y, x, (PM_ALLOW_SLEEP | PM_ALLOW_GROUP)); + floor_ptr->monster_level = floor_ptr->base_level; } if (randint0(100) < 50) { - object_level = base_level + 7; - place_object(y, x, 0L); - object_level = base_level; + floor_ptr->object_level = floor_ptr->base_level + 7; + place_object(player_ptr, y, x, 0L); + floor_ptr->object_level = floor_ptr->base_level; } } else if (value < 50) { /* Trap */ - place_trap(y, x); + place_trap(player_ptr, y, x); } else { @@ -1488,15 +1464,15 @@ void fill_treasure(POSITION x1, POSITION x2, POSITION y1, POSITION y2, int diffi /* 20% monster, 40% trap, 20% object, 20% blank space */ if (randint0(100) < 20) { - place_monster(y, x, (PM_ALLOW_SLEEP | PM_ALLOW_GROUP)); + place_monster(player_ptr, y, x, (PM_ALLOW_SLEEP | PM_ALLOW_GROUP)); } else if (randint0(100) < 50) { - place_trap(y, x); + place_trap(player_ptr, y, x); } else if (randint0(100) < 50) { - place_object(y, x, 0L); + place_object(player_ptr, y, x, 0L); } } @@ -1506,14 +1482,13 @@ void fill_treasure(POSITION x1, POSITION x2, POSITION y1, POSITION y2, int diffi } - /* * Overlay a rectangular room given its bounds * This routine is used by build_room_vault * The area inside the walls is not touched: * only granite is removed- normal walls stay */ -void build_room(POSITION x1, POSITION x2, POSITION y1, POSITION y2) +void build_room(floor_type *floor_ptr, POSITION x1, POSITION x2, POSITION y1, POSITION y2) { POSITION x, y, xsize, ysize; int i, temp; @@ -1545,19 +1520,19 @@ void build_room(POSITION x1, POSITION x2, POSITION y1, POSITION y2) /* Top and bottom boundaries */ for (i = 0; i <= xsize; i++) { - place_outer_noperm_bold(y1, x1 + i); - cave[y1][x1 + i].info |= (CAVE_ROOM | CAVE_ICKY); - place_outer_noperm_bold(y2, x1 + i); - cave[y2][x1 + i].info |= (CAVE_ROOM | CAVE_ICKY); + place_outer_noperm_bold(floor_ptr, y1, x1 + i); + floor_ptr->grid_array[y1][x1 + i].info |= (CAVE_ROOM | CAVE_ICKY); + place_outer_noperm_bold(floor_ptr, y2, x1 + i); + floor_ptr->grid_array[y2][x1 + i].info |= (CAVE_ROOM | CAVE_ICKY); } /* Left and right boundaries */ for (i = 1; i < ysize; i++) { - place_outer_noperm_bold(y1 + i, x1); - cave[y1 + i][x1].info|=(CAVE_ROOM | CAVE_ICKY); - place_outer_noperm_bold(y1 + i, x2); - cave[y1 + i][x2].info|=(CAVE_ROOM | CAVE_ICKY); + place_outer_noperm_bold(floor_ptr, y1 + i, x1); + floor_ptr->grid_array[y1 + i][x1].info |= (CAVE_ROOM | CAVE_ICKY); + place_outer_noperm_bold(floor_ptr, y1 + i, x2); + floor_ptr->grid_array[y1 + i][x2].info |= (CAVE_ROOM | CAVE_ICKY); } /* Middle */ @@ -1565,16 +1540,16 @@ void build_room(POSITION x1, POSITION x2, POSITION y1, POSITION y2) { for (y = 1; y < ysize; y++) { - if (is_extra_bold(y1+y, x1+x)) + if (is_extra_bold(floor_ptr, y1 + y, x1 + x)) { /* clear the untouched region */ - place_floor_bold(y1 + y, x1 + x); - cave[y1 + y][x1 + x].info |= (CAVE_ROOM | CAVE_ICKY); + place_floor_bold(floor_ptr, y1 + y, x1 + x); + floor_ptr->grid_array[y1 + y][x1 + x].info |= (CAVE_ROOM | CAVE_ICKY); } else { /* make it a room- but don't touch */ - cave[y1 + y][x1 + x].info |= (CAVE_ROOM | CAVE_ICKY); + floor_ptr->grid_array[y1 + y][x1 + x].info |= (CAVE_ROOM | CAVE_ICKY); } } } @@ -1600,7 +1575,7 @@ void build_room(POSITION x1, POSITION x2, POSITION y1, POSITION y2) * is the randint0(3) below; it governs the relative density of * twists and turns in the labyrinth: smaller number, more twists. */ -void r_visit(POSITION y1, POSITION x1, POSITION y2, POSITION x2, int node, DIRECTION dir, int *visited) +void r_visit(floor_type *floor_ptr, POSITION y1, POSITION x1, POSITION y2, POSITION x2, int node, DIRECTION dir, int *visited) { int i, j, m, n, temp, x, y, adj[4]; @@ -1612,7 +1587,7 @@ void r_visit(POSITION y1, POSITION x1, POSITION y2, POSITION x2, int node, DIREC visited[node] = 1; x = 2 * (node % m) + x1; y = 2 * (node / m) + y1; - place_floor_bold(y, x); + place_floor_bold(floor_ptr, y, x); /* setup order of adjacent node visits */ if (one_in_(3)) @@ -1648,54 +1623,55 @@ void r_visit(POSITION y1, POSITION x1, POSITION y2, POSITION x2, int node, DIREC { switch (adj[i]) { - case 0: - /* (0,+) - check for bottom boundary */ - if ((node / m < n - 1) && (visited[node + m] == 0)) - { - place_floor_bold(y + 1, x); - r_visit(y1, x1, y2, x2, node + m, dir, visited); - } - break; - case 1: - /* (0,-) - check for top boundary */ - if ((node / m > 0) && (visited[node - m] == 0)) - { - place_floor_bold(y - 1, x); - r_visit(y1, x1, y2, x2, node - m, dir, visited); - } - break; - case 2: - /* (+,0) - check for right boundary */ - if ((node % m < m - 1) && (visited[node + 1] == 0)) - { - place_floor_bold(y, x + 1); - r_visit(y1, x1, y2, x2, node + 1, dir, visited); - } - break; - case 3: - /* (-,0) - check for left boundary */ - if ((node % m > 0) && (visited[node - 1] == 0)) - { - place_floor_bold(y, x - 1); - r_visit(y1, x1, y2, x2, node - 1, dir, visited); - } + case 0: + /* (0,+) - check for bottom boundary */ + if ((node / m < n - 1) && (visited[node + m] == 0)) + { + place_floor_bold(floor_ptr, y + 1, x); + r_visit(floor_ptr, y1, x1, y2, x2, node + m, dir, visited); + } + break; + case 1: + /* (0,-) - check for top boundary */ + if ((node / m > 0) && (visited[node - m] == 0)) + { + place_floor_bold(floor_ptr, y - 1, x); + r_visit(floor_ptr, y1, x1, y2, x2, node - m, dir, visited); + } + break; + case 2: + /* (+,0) - check for right boundary */ + if ((node % m < m - 1) && (visited[node + 1] == 0)) + { + place_floor_bold(floor_ptr, y, x + 1); + r_visit(floor_ptr, y1, x1, y2, x2, node + 1, dir, visited); + } + break; + case 3: + /* (-,0) - check for left boundary */ + if ((node % m > 0) && (visited[node - 1] == 0)) + { + place_floor_bold(floor_ptr, y, x - 1); + r_visit(floor_ptr, y1, x1, y2, x2, node - 1, dir, visited); + } } /* end switch */ } } -void build_maze_vault(POSITION x0, POSITION y0, POSITION xsize, POSITION ysize, bool is_vault) +void build_maze_vault(player_type *player_ptr, POSITION x0, POSITION y0, POSITION xsize, POSITION ysize, bool is_vault) { POSITION y, x, dy, dx; POSITION y1, x1, y2, x2; int m, n, num_vertices, *visited; bool light; - cave_type *c_ptr; + grid_type *g_ptr; msg_print_wizard(CHEAT_DUNGEON, _("迷路ランダムVaultを生成しました。", "Maze Vault.")); /* Choose lite or dark */ - light = ((dun_level <= randint1(25)) && is_vault && !(d_info[dungeon_type].flags1 & DF1_DARKNESS)); + floor_type *floor_ptr = player_ptr->current_floor_ptr; + light = ((floor_ptr->dun_level <= randint1(25)) && is_vault && !(d_info[floor_ptr->dungeon_idx].flags1 & DF1_DARKNESS)); /* Pick a random room size - randomized by calling routine */ dy = ysize / 2 - 1; @@ -1711,22 +1687,22 @@ void build_maze_vault(POSITION x0, POSITION y0, POSITION xsize, POSITION ysize, { for (x = x1 - 1; x <= x2 + 1; x++) { - c_ptr = &cave[y][x]; - c_ptr->info |= CAVE_ROOM; - if (is_vault) c_ptr->info |= CAVE_ICKY; + g_ptr = &floor_ptr->grid_array[y][x]; + g_ptr->info |= CAVE_ROOM; + if (is_vault) g_ptr->info |= CAVE_ICKY; if ((x == x1 - 1) || (x == x2 + 1) || (y == y1 - 1) || (y == y2 + 1)) { - place_outer_grid(c_ptr); + place_outer_grid(g_ptr); } else if (!is_vault) { - place_extra_grid(c_ptr); + place_extra_grid(g_ptr); } else { - place_inner_grid(c_ptr); + place_inner_grid(g_ptr); } - if (light) c_ptr->info |= (CAVE_GLOW); + if (light) g_ptr->info |= (CAVE_GLOW); } } @@ -1739,10 +1715,10 @@ void build_maze_vault(POSITION x0, POSITION y0, POSITION xsize, POSITION ysize, C_MAKE(visited, num_vertices, int); /* traverse the graph to create a spaning tree, pick a random root */ - r_visit(y1, x1, y2, x2, randint0(num_vertices), 0, visited); + r_visit(floor_ptr, y1, x1, y2, x2, randint0(num_vertices), 0, visited); /* Fill with monsters and treasure, low difficulty */ - if (is_vault) fill_treasure(x1, x2, y1, y2, randint1(5)); + if (is_vault) fill_treasure(player_ptr, x1, x2, y1, y2, randint1(5)); C_KILL(visited, num_vertices, int); } @@ -1755,7 +1731,7 @@ void build_maze_vault(POSITION x0, POSITION y0, POSITION xsize, POSITION ysize, * The power variable is a measure of how well defended a region is. * This alters the possible choices. */ -void build_recursive_room(POSITION x1, POSITION y1, POSITION x2, POSITION y2, int power) +void build_recursive_room(floor_type *floor_ptr, POSITION x1, POSITION y1, POSITION x2, POSITION y2, int power) { POSITION xsize, ysize; POSITION x, y; @@ -1797,159 +1773,159 @@ void build_recursive_room(POSITION x1, POSITION y1, POSITION x2, POSITION y2, in switch (choice) { - case 1: + case 1: + { + /* Outer walls */ + + /* top and bottom */ + for (x = x1; x <= x2; x++) { - /* Outer walls */ + place_outer_bold(floor_ptr, y1, x); + place_outer_bold(floor_ptr, y2, x); + } - /* top and bottom */ - for (x = x1; x <= x2; x++) - { - place_outer_bold(y1, x); - place_outer_bold(y2, x); - } + /* left and right */ + for (y = y1 + 1; y < y2; y++) + { + place_outer_bold(floor_ptr, y, x1); + place_outer_bold(floor_ptr, y, x2); + } + /* Make a couple of entrances */ + if (one_in_(2)) + { /* left and right */ - for (y = y1 + 1; y < y2; y++) - { - place_outer_bold(y, x1); - place_outer_bold(y, x2); - } - - /* Make a couple of entrances */ - if (one_in_(2)) - { - /* left and right */ - y = randint1(ysize) + y1; - place_floor_bold(y, x1); - place_floor_bold(y, x2); - } - else - { - /* top and bottom */ - x = randint1(xsize) + x1; - place_floor_bold(y1, x); - place_floor_bold(y2, x); - } + y = randint1(ysize) + y1; + place_floor_bold(floor_ptr, y, x1); + place_floor_bold(floor_ptr, y, x2); + } + else + { + /* top and bottom */ + x = randint1(xsize) + x1; + place_floor_bold(floor_ptr, y1, x); + place_floor_bold(floor_ptr, y2, x); + } - /* Select size of keep */ - t1 = randint1(ysize / 3) + y1; - t2 = y2 - randint1(ysize / 3); - t3 = randint1(xsize / 3) + x1; - t4 = x2 - randint1(xsize / 3); + /* Select size of keep */ + t1 = randint1(ysize / 3) + y1; + t2 = y2 - randint1(ysize / 3); + t3 = randint1(xsize / 3) + x1; + t4 = x2 - randint1(xsize / 3); - /* Do outside areas */ + /* Do outside areas */ - /* Above and below keep */ - build_recursive_room(x1 + 1, y1 + 1, x2 - 1, t1, power + 1); - build_recursive_room(x1 + 1, t2, x2 - 1, y2, power + 1); + /* Above and below keep */ + build_recursive_room(floor_ptr, x1 + 1, y1 + 1, x2 - 1, t1, power + 1); + build_recursive_room(floor_ptr, x1 + 1, t2, x2 - 1, y2, power + 1); - /* Left and right of keep */ - build_recursive_room(x1 + 1, t1 + 1, t3, t2 - 1, power + 3); - build_recursive_room(t4, t1 + 1, x2 - 1, t2 - 1, power + 3); + /* Left and right of keep */ + build_recursive_room(floor_ptr, x1 + 1, t1 + 1, t3, t2 - 1, power + 3); + build_recursive_room(floor_ptr, t4, t1 + 1, x2 - 1, t2 - 1, power + 3); - /* Make the keep itself: */ - x1 = t3; - x2 = t4; - y1 = t1; - y2 = t2; - xsize = x2 - x1; - ysize = y2 - y1; - power += 2; + /* Make the keep itself: */ + x1 = t3; + x2 = t4; + y1 = t1; + y2 = t2; + xsize = x2 - x1; + ysize = y2 - y1; + power += 2; - /* Fall through */ - } - case 4: + /* Fall through */ + } + case 4: + { + /* Try to build a room */ + if ((xsize < 3) || (ysize < 3)) { - /* Try to build a room */ - if ((xsize < 3) || (ysize < 3)) + for (y = y1; y < y2; y++) { - for (y = y1; y < y2; y++) + for (x = x1; x < x2; x++) { - for (x = x1; x < x2; x++) - { - place_inner_bold(y, x); - } + place_inner_bold(floor_ptr, y, x); } - - /* Too small */ - return; } - /* Make outside walls */ - /* top and bottom */ - for (x = x1 + 1; x <= x2 - 1; x++) - { - place_inner_bold(y1 + 1, x); - place_inner_bold(y2 - 1, x); - } + /* Too small */ + return; + } - /* left and right */ - for (y = y1 + 1; y <= y2 - 1; y++) - { - place_inner_bold(y, x1 + 1); - place_inner_bold(y, x2 - 1); - } + /* Make outside walls */ + /* top and bottom */ + for (x = x1 + 1; x <= x2 - 1; x++) + { + place_inner_bold(floor_ptr, y1 + 1, x); + place_inner_bold(floor_ptr, y2 - 1, x); + } - /* Make a door */ - y = randint1(ysize - 3) + y1 + 1; + /* left and right */ + for (y = y1 + 1; y <= y2 - 1; y++) + { + place_inner_bold(floor_ptr, y, x1 + 1); + place_inner_bold(floor_ptr, y, x2 - 1); + } - if (one_in_(2)) - { - /* left */ - place_floor_bold(y, x1 + 1); - } - else - { - /* right */ - place_floor_bold(y, x2 - 1); - } + /* Make a door */ + y = randint1(ysize - 3) + y1 + 1; - /* Build the room */ - build_recursive_room(x1 + 2, y1 + 2, x2 - 2, y2 - 2, power + 3); - break; + if (one_in_(2)) + { + /* left */ + place_floor_bold(floor_ptr, y, x1 + 1); } - case 2: + else + { + /* right */ + place_floor_bold(floor_ptr, y, x2 - 1); + } + + /* Build the room */ + build_recursive_room(floor_ptr, x1 + 2, y1 + 2, x2 - 2, y2 - 2, power + 3); + break; + } + case 2: + { + /* Try and divide vertically */ + if (xsize < 3) { - /* Try and divide vertically */ - if (xsize < 3) + /* Too small */ + for (y = y1; y < y2; y++) { - /* Too small */ - for (y = y1; y < y2; y++) + for (x = x1; x < x2; x++) { - for (x = x1; x < x2; x++) - { - place_inner_bold(y, x); - } + place_inner_bold(floor_ptr, y, x); } - return; } - - t1 = randint1(xsize - 2) + x1 + 1; - build_recursive_room(x1, y1, t1, y2, power - 2); - build_recursive_room(t1 + 1, y1, x2, y2, power - 2); - break; + return; } - case 3: + + t1 = randint1(xsize - 2) + x1 + 1; + build_recursive_room(floor_ptr, x1, y1, t1, y2, power - 2); + build_recursive_room(floor_ptr, t1 + 1, y1, x2, y2, power - 2); + break; + } + case 3: + { + /* Try and divide horizontally */ + if (ysize < 3) { - /* Try and divide horizontally */ - if (ysize < 3) + /* Too small */ + for (y = y1; y < y2; y++) { - /* Too small */ - for (y = y1; y < y2; y++) + for (x = x1; x < x2; x++) { - for (x = x1; x < x2; x++) - { - place_inner_bold(y, x); - } + place_inner_bold(floor_ptr, y, x); } - return; } - - t1 = randint1(ysize - 2) + y1 + 1; - build_recursive_room(x1, y1, x2, t1, power - 2); - build_recursive_room(x1, t1 + 1, x2, y2, power - 2); - break; + return; } + + t1 = randint1(ysize - 2) + y1 + 1; + build_recursive_room(floor_ptr, x1, y1, x2, t1, power - 2); + build_recursive_room(floor_ptr, x1, t1 + 1, x2, y2, power - 2); + break; + } } } @@ -1959,50 +1935,49 @@ void build_recursive_room(POSITION x1, POSITION y1, POSITION x2, POSITION y2, in * Note: no range checking is done so must be inside dungeon * This routine also stomps on doors */ -void add_outer_wall(POSITION x, POSITION y, int light, POSITION x1, POSITION y1, POSITION x2, POSITION y2) +void add_outer_wall(floor_type *floor_ptr, POSITION x, POSITION y, int light, POSITION x1, POSITION y1, POSITION x2, POSITION y2) { - cave_type *c_ptr; + grid_type *g_ptr; feature_type *f_ptr; int i, j; - if (!in_bounds(y, x)) return; + if (!in_bounds(floor_ptr, y, x)) return; - c_ptr = &cave[y][x]; + g_ptr = &floor_ptr->grid_array[y][x]; /* hack- check to see if square has been visited before * if so, then exit (use room flag to do this) */ - if (c_ptr->info & CAVE_ROOM) return; + if (g_ptr->info & CAVE_ROOM) return; /* set room flag */ - c_ptr->info |= CAVE_ROOM; + g_ptr->info |= CAVE_ROOM; - f_ptr = &f_info[c_ptr->feat]; + f_ptr = &f_info[g_ptr->feat]; - if (is_floor_bold(y, x)) + if (is_floor_bold(floor_ptr, y, x)) { for (i = -1; i <= 1; i++) { for (j = -1; j <= 1; j++) { - if ((x + i >= x1) && (x + i <= x2) && - (y + j >= y1) && (y + j <= y2)) + if ((x + i >= x1) && (x + i <= x2) && (y + j >= y1) && (y + j <= y2)) { - add_outer_wall(x + i, y + j, light, x1, y1, x2, y2); - if (light) c_ptr->info |= CAVE_GLOW; + add_outer_wall(floor_ptr, x + i, y + j, light, x1, y1, x2, y2); + if (light) g_ptr->info |= CAVE_GLOW; } } } } - else if (is_extra_bold(y, x)) + else if (is_extra_bold(floor_ptr, y, x)) { /* Set bounding walls */ - place_outer_bold(y, x); - if (light) c_ptr->info |= CAVE_GLOW; + place_outer_bold(floor_ptr, y, x); + if (light) g_ptr->info |= CAVE_GLOW; } else if (permanent_wall(f_ptr)) { /* Set bounding walls */ - if (light) c_ptr->info |= CAVE_GLOW; + if (light) g_ptr->info |= CAVE_GLOW; } } @@ -2024,7 +1999,7 @@ POSITION dist2(POSITION x1, POSITION y1, POSITION x2, POSITION y2, POSITION h1, * trying to fix the circular rooms.) */ - /* h1-h4 are constants that describe the metric */ + /* h1-h4 are constants that describe the metric */ if (dx >= 2 * dy) return (dx + (dy * h1) / h2); if (dy >= 2 * dx) return (dy + (dx * h1) / h2); return (((dx + dy) * 128) / 181 + @@ -2036,26 +2011,26 @@ POSITION dist2(POSITION x1, POSITION y1, POSITION x2, POSITION y2, POSITION h1, /* Create a new floor room with optional light */ -void generate_room_floor(POSITION y1, POSITION x1, POSITION y2, POSITION x2, int light) +void generate_room_floor(floor_type *floor_ptr, POSITION y1, POSITION x1, POSITION y2, POSITION x2, int light) { POSITION y, x; - - cave_type *c_ptr; + + grid_type *g_ptr; for (y = y1; y <= y2; y++) { for (x = x1; x <= x2; x++) { /* Point to grid */ - c_ptr = &cave[y][x]; - place_floor_grid(c_ptr); - c_ptr->info |= (CAVE_ROOM); - if (light) c_ptr->info |= (CAVE_GLOW); + g_ptr = &floor_ptr->grid_array[y][x]; + place_floor_grid(g_ptr); + g_ptr->info |= (CAVE_ROOM); + if (light) g_ptr->info |= (CAVE_GLOW); } } } -void generate_fill_perm_bold(POSITION y1, POSITION x1, POSITION y2, POSITION x2) +void generate_fill_perm_bold(floor_type *floor_ptr, POSITION y1, POSITION x1, POSITION y2, POSITION x2) { POSITION y, x; @@ -2064,7 +2039,7 @@ void generate_fill_perm_bold(POSITION y1, POSITION x1, POSITION y2, POSITION x2) for (x = x1; x <= x2; x++) { /* Point to grid */ - place_inner_perm_bold(y, x); + place_inner_perm_bold(floor_ptr, y, x); } } } @@ -2072,36 +2047,35 @@ void generate_fill_perm_bold(POSITION y1, POSITION x1, POSITION y2, POSITION x2) /*! * @brief 与えられた部屋型IDに応じて部屋の生成処理分岐を行い結果を返す / Attempt to build a room of the given type at the given block + * @param player_ptr プレーヤーへの参照ポインタ * @param type 部屋型ID * @note that we restrict the number of "crowded" rooms to reduce the chance of overflowing the monster list during level creation. - * @return 部屋の精製に成功した場合 TRUE を返す。 + * @return 部屋の生成に成功した場合 TRUE を返す。 */ -static bool room_build(EFFECT_ID typ) +static bool room_build(player_type *player_ptr, EFFECT_ID typ) { - /* Build a room */ + floor_type *floor_ptr = player_ptr->current_floor_ptr; switch (typ) { - /* Build an appropriate room */ - case ROOM_T_NORMAL: return build_type1(); - case ROOM_T_OVERLAP: return build_type2(); - case ROOM_T_CROSS: return build_type3(); - case ROOM_T_INNER_FEAT: return build_type4(); - case ROOM_T_NEST: return build_type5(); - case ROOM_T_PIT: return build_type6(); - case ROOM_T_LESSER_VAULT: return build_type7(); - case ROOM_T_GREATER_VAULT: return build_type8(); - case ROOM_T_FRACAVE: return build_type9(); - case ROOM_T_RANDOM_VAULT: return build_type10(); - case ROOM_T_OVAL: return build_type11(); - case ROOM_T_CRYPT: return build_type12(); - case ROOM_T_TRAP_PIT: return build_type13(); - case ROOM_T_TRAP: return build_type14(); - case ROOM_T_GLASS: return build_type15(); - case ROOM_T_ARCADE: return build_type16(); - case ROOM_T_FIXED: return build_type17(); - } - - /* Paranoia */ + /* Build an appropriate room */ + case ROOM_T_NORMAL: return build_type1(floor_ptr); + case ROOM_T_OVERLAP: return build_type2(floor_ptr); + case ROOM_T_CROSS: return build_type3(player_ptr); + case ROOM_T_INNER_FEAT: return build_type4(player_ptr); + case ROOM_T_NEST: return build_type5(player_ptr); + case ROOM_T_PIT: return build_type6(player_ptr); + case ROOM_T_LESSER_VAULT: return build_type7(player_ptr); + case ROOM_T_GREATER_VAULT: return build_type8(player_ptr); + case ROOM_T_FRACAVE: return build_type9(floor_ptr); + case ROOM_T_RANDOM_VAULT: return build_type10(player_ptr); + case ROOM_T_OVAL: return build_type11(floor_ptr); + case ROOM_T_CRYPT: return build_type12(player_ptr); + case ROOM_T_TRAP_PIT: return build_type13(player_ptr); + case ROOM_T_TRAP: return build_type14(floor_ptr); + case ROOM_T_GLASS: return build_type15(player_ptr); + case ROOM_T_ARCADE: return build_type16(player_ptr); + case ROOM_T_FIXED: return build_type17(player_ptr); + } return FALSE; } @@ -2112,20 +2086,22 @@ static bool room_build(EFFECT_ID typ) */ #define MOVE_PLIST(dst, src) (prob_list[dst] += prob_list[src], prob_list[src] = 0) -/*! - * @brief 部屋生成処理のメインルーチン(Sangbandを経由してOangbandからの実装を引用) / Generate rooms in dungeon. Build bigger rooms at first. [from SAngband (originally from OAngband)] - * @return 部屋生成に成功した場合 TRUE を返す。 - */ -bool generate_rooms(void) + /*! + * @brief 部屋生成処理のメインルーチン(Sangbandを経由してOangbandからの実装を引用) / Generate rooms in dungeon. Build bigger rooms at first. [from SAngband (originally from OAngband)] + * @param player_ptr プレーヤーへの参照ポインタ + * @return 部屋生成に成功した場合 TRUE を返す。 + */ +bool generate_rooms(player_type *player_ptr) { + floor_type *floor_ptr = player_ptr->current_floor_ptr; int i; bool remain; int crowded = 0; int total_prob; int prob_list[ROOM_T_MAX]; int rooms_built = 0; - int area_size = 100 * (cur_hgt*cur_wid) / (MAX_HGT*MAX_WID); - int level_index = MIN(10, div_round(dun_level, 10)); + int area_size = 100 * (floor_ptr->height*floor_ptr->width) / (MAX_HGT*MAX_WID); + int level_index = MIN(10, div_round(floor_ptr->dun_level, 10)); /* Number of each type of room on this level */ s16b room_num[ROOM_T_MAX]; @@ -2133,7 +2109,7 @@ bool generate_rooms(void) /* Limit number of rooms */ int dun_rooms = DUN_ROOMS_MAX * area_size / 100; - /* Assume normal cave */ + /* Assume normal floor_ptr->grid_array */ room_info_type *room_info_ptr = room_info_normal; /* @@ -2142,7 +2118,7 @@ bool generate_rooms(void) for (i = 0; i < ROOM_T_MAX; i++) { /* No rooms allowed above their minimum depth. */ - if (dun_level < room_info_ptr[i].min_level) + if (floor_ptr->dun_level < room_info_ptr[i].min_level) { prob_list[i] = 0; } @@ -2156,10 +2132,10 @@ bool generate_rooms(void) * XXX -- Various dungeon types and options. */ - /*! @details ダンジョンにBEGINNER、CHAMELEON、SMALLESTいずれのフラグもなく、 - * かつ「常に通常でない部屋を生成する」フラグがONならば、 - * GRATER_VAULTのみを生成対象とする。 / Ironman sees only Greater Vaults */ - if (ironman_rooms && !((d_info[dungeon_type].flags1 & (DF1_BEGINNER | DF1_CHAMELEON | DF1_SMALLEST)))) + /*! @details ダンジョンにBEGINNER、CHAMELEON、SMALLESTいずれのフラグもなく、 + * かつ「常に通常でない部屋を生成する」フラグがONならば、 + * GRATER_VAULTのみを生成対象とする。 / Ironman sees only Greater Vaults */ + if (ironman_rooms && !((d_info[floor_ptr->dungeon_idx].flags1 & (DF1_BEGINNER | DF1_CHAMELEON | DF1_SMALLEST)))) { for (i = 0; i < ROOM_T_MAX; i++) { @@ -2169,7 +2145,7 @@ bool generate_rooms(void) } /*! @details ダンジョンにNO_VAULTフラグがあるならば、LESSER_VAULT / GREATER_VAULT/ RANDOM_VAULTを除外 / Forbidden vaults */ - else if (d_info[dungeon_type].flags1 & DF1_NO_VAULT) + else if (d_info[floor_ptr->dungeon_idx].flags1 & DF1_NO_VAULT) { prob_list[ROOM_T_LESSER_VAULT] = 0; prob_list[ROOM_T_GREATER_VAULT] = 0; @@ -2177,21 +2153,21 @@ bool generate_rooms(void) } /*! @details ダンジョンにBEGINNERフラグがあるならば、FIXED_ROOMを除外 / Forbidden vaults */ - if (d_info[dungeon_type].flags1 & DF1_BEGINNER) + if (d_info[floor_ptr->dungeon_idx].flags1 & DF1_BEGINNER) { prob_list[ROOM_T_FIXED] = 0; } /*! @details ダンジョンにNO_CAVEフラグがある場合、FRACAVEの生成枠がNORMALに与えられる。CRIPT、OVALの生成枠がINNER_Fに与えられる。/ NO_CAVE dungeon (Castle)*/ - if (d_info[dungeon_type].flags1 & DF1_NO_CAVE) + if (d_info[floor_ptr->dungeon_idx].flags1 & DF1_NO_CAVE) { MOVE_PLIST(ROOM_T_NORMAL, ROOM_T_FRACAVE); MOVE_PLIST(ROOM_T_INNER_FEAT, ROOM_T_CRYPT); MOVE_PLIST(ROOM_T_INNER_FEAT, ROOM_T_OVAL); } - /*! @details ダンジョンにCAVEフラグがある場合、NORMALの生成枠がFRACAVEに与えられる。/ CAVE dungeon (Orc cave etc.) */ - else if (d_info[dungeon_type].flags1 & DF1_CAVE) + /*! @details ダンジョンにCAVEフラグがある場合、NORMALの生成枠がFRACAVEに与えられる。/ CAVE dungeon (Orc floor_ptr->grid_array etc.) */ + else if (d_info[floor_ptr->dungeon_idx].flags1 & DF1_CAVE) { MOVE_PLIST(ROOM_T_FRACAVE, ROOM_T_NORMAL); } @@ -2203,13 +2179,13 @@ bool generate_rooms(void) } /*! @details ダンジョンに最初からGLASS_ROOMフラグがある場合、GLASS を生成から除外。/ Forbidden glass rooms */ - if (!(d_info[dungeon_type].flags1 & DF1_GLASS_ROOM)) + if (!(d_info[floor_ptr->dungeon_idx].flags1 & DF1_GLASS_ROOM)) { prob_list[ROOM_T_GLASS] = 0; } /*! @details ARCADEは同フラグがダンジョンにないと生成されない。 / Forbidden glass rooms */ - if (!(d_info[dungeon_type].flags1 & DF1_ARCADE)) + if (!(d_info[floor_ptr->dungeon_idx].flags1 & DF1_ARCADE)) { prob_list[ROOM_T_ARCADE] = 0; } @@ -2239,8 +2215,6 @@ bool generate_rooms(void) if (rand < prob_list[room_type]) break; else rand -= prob_list[room_type]; } - - /* Paranoia */ if (room_type >= ROOM_T_MAX) room_type = ROOM_T_NORMAL; /* Increase the number of rooms of that type we should build. */ @@ -2289,7 +2263,7 @@ bool generate_rooms(void) room_num[room_type]--; /* Build the room. */ - if (room_build(room_type)) + if (room_build(player_ptr, room_type)) { /* Increase the room built count. */ rooms_built++;