X-Git-Url: http://git.osdn.net/view?a=blobdiff_plain;f=src%2Fgenerate.c;h=77d28990509cf2d110b0d87992f36868b32b8262;hb=25d7f1d5f6db4c40752668ddf3187acae6491327;hp=ce82aa6129049e2b40db91acf2dd7a5327cceb35;hpb=1b4939aa68153d1b7eb52309508727c2a6700ae0;p=hengband%2Fhengband.git diff --git a/src/generate.c b/src/generate.c index ce82aa612..77d289905 100644 --- a/src/generate.c +++ b/src/generate.c @@ -1,101 +1,99 @@ -/* File: generate.c */ - -/* - * Copyright (c) 1997 Ben Harrison, James E. Wilson, Robert A. Koeneke - * - * This software may be copied and distributed for educational, research, - * and not for profit purposes provided that this copyright and statement - * are included in all such copies. Other copyrights may also apply. - */ - -/* Purpose: Dungeon generation */ - -/* - * Note that Level generation is *not* an important bottleneck, - * though it can be annoyingly slow on older machines... Thus - * we emphasize "simplicity" and "correctness" over "speed". - * - * This entire file is only needed for generating levels. - * This may allow smart compilers to only load it when needed. - * - * Consider the "v_info.txt" file for vault generation. - * - * In this file, we use the "special" granite and perma-wall sub-types, - * where "basic" is normal, "inner" is inside a room, "outer" is the - * outer wall of a room, and "solid" is the outer wall of the dungeon - * or any walls that may not be pierced by corridors. Thus the only - * wall type that may be pierced by a corridor is the "outer granite" - * type. The "basic granite" type yields the "actual" corridors. - * - * Note that we use the special "solid" granite wall type to prevent - * multiple corridors from piercing a wall in two adjacent locations, - * which would be messy, and we use the special "outer" granite wall - * to indicate which walls "surround" rooms, and may thus be "pierced" - * by corridors entering or leaving the room. - * - * Note that a tunnel which attempts to leave a room near the "edge" - * of the dungeon in a direction toward that edge will cause "silly" - * wall piercings, but will have no permanently incorrect effects, - * as long as the tunnel can *eventually* exit from another side. - * And note that the wall may not come back into the room by the - * hole it left through, so it must bend to the left or right and - * then optionally re-enter the room (at least 2 grids away). This - * is not a problem since every room that is large enough to block - * the passage of tunnels is also large enough to allow the tunnel - * to pierce the room itself several times. - * - * Note that no two corridors may enter a room through adjacent grids, - * they must either share an entryway or else use entryways at least - * two grids apart. This prevents "large" (or "silly") doorways. - * - * To create rooms in the dungeon, we first divide the dungeon up - * into "blocks" of 11x11 grids each, and require that all rooms - * occupy a rectangular group of blocks. As long as each room type - * reserves a sufficient number of blocks, the room building routines - * will not need to check bounds. Note that most of the normal rooms - * actually only use 23x11 grids, and so reserve 33x11 grids. - * - * Note that the use of 11x11 blocks (instead of the old 33x11 blocks) - * allows more variability in the horizontal placement of rooms, and - * at the same time has the disadvantage that some rooms (two thirds - * of the normal rooms) may be "split" by panel boundaries. This can - * induce a situation where a player is in a room and part of the room - * is off the screen. It may be annoying enough to go back to 33x11 - * blocks to prevent this visual situation. - * - * Note that the dungeon generation routines are much different (2.7.5) - * and perhaps "DUN_ROOMS" should be less than 50. - * - * XXX XXX XXX Note that it is possible to create a room which is only - * connected to itself, because the "tunnel generation" code allows a - * tunnel to leave a room, wander around, and then re-enter the room. - * - * XXX XXX XXX Note that it is possible to create a set of rooms which - * are only connected to other rooms in that set, since there is nothing - * explicit in the code to prevent this from happening. But this is less - * likely than the "isolated room" problem, because each room attempts to - * connect to another room, in a giant cycle, thus requiring at least two - * bizarre occurances to create an isolated section of the dungeon. - * - * Note that (2.7.9) monster pits have been split into monster "nests" - * and monster "pits". The "nests" have a collection of monsters of a - * given type strewn randomly around the room (jelly, animal, or undead), - * while the "pits" have a collection of monsters of a given type placed - * around the room in an organized manner (orc, troll, giant, dragon, or - * demon). Note that both "nests" and "pits" are now "level dependant", - * and both make 16 "expensive" calls to the "get_mon_num()" function. - * - * Note that the cave grid flags changed in a rather drastic manner - * for Angband 2.8.0 (and 2.7.9+), in particular, dungeon terrain - * features, such as doors and stairs and traps and rubble and walls, - * are all handled as a set of 64 possible "terrain features", and - * not as "fake" objects (440-479) as in pre-2.8.0 versions. - * - * The 64 new "dungeon features" will also be used for "visual display" - * but we must be careful not to allow, for example, the user to display - * hidden traps in a different way from floors, or secret doors in a way - * different from granite walls, or even permanent granite in a different - * way from granite. XXX XXX XXX +/*! + * @file generate.c + * @brief ダンジョンの生成 / Dungeon generation + * @date 2014/01/04 + * @author + * Copyright (c) 1997 Ben Harrison, James E. Wilson, Robert A. Koeneke\n + * This software may be copied and distributed for educational, research,\n + * and not for profit purposes provided that this copyright and statement\n + * are included in all such copies. Other copyrights may also apply.\n + * 2014 Deskull rearranged comment for Doxygen. \n + * @details + * Note that Level generation is *not* an important bottleneck,\n + * though it can be annoyingly slow on older machines... Thus\n + * we emphasize "simplicity" and "correctness" over "speed".\n + *\n + * This entire file is only needed for generating levels.\n + * This may allow smart compilers to only load it when needed.\n + *\n + * Consider the "v_info.txt" file for vault generation.\n + *\n + * In this file, we use the "special" granite and perma-wall sub-types,\n + * where "basic" is normal, "inner" is inside a room, "outer" is the\n + * outer wall of a room, and "solid" is the outer wall of the dungeon\n + * or any walls that may not be pierced by corridors. Thus the only\n + * wall type that may be pierced by a corridor is the "outer granite"\n + * type. The "basic granite" type yields the "actual" corridors.\n + *\n + * Note that we use the special "solid" granite wall type to prevent\n + * multiple corridors from piercing a wall in two adjacent locations,\n + * which would be messy, and we use the special "outer" granite wall\n + * to indicate which walls "surround" rooms, and may thus be "pierced"\n + * by corridors entering or leaving the room.\n + *\n + * Note that a tunnel which attempts to leave a room near the "edge"\n + * of the dungeon in a direction toward that edge will cause "silly"\n + * wall piercings, but will have no permanently incorrect effects,\n + * as long as the tunnel can *eventually* exit from another side.\n + * And note that the wall may not come back into the room by the\n + * hole it left through, so it must bend to the left or right and\n + * then optionally re-enter the room (at least 2 grids away). This\n + * is not a problem since every room that is large enough to block\n + * the passage of tunnels is also large enough to allow the tunnel\n + * to pierce the room itself several times.\n + *\n + * Note that no two corridors may enter a room through adjacent grids,\n + * they must either share an entryway or else use entryways at least\n + * two grids apart. This prevents "large" (or "silly") doorways.\n + *\n + * To create rooms in the dungeon, we first divide the dungeon up\n + * into "blocks" of 11x11 grids each, and require that all rooms\n + * occupy a rectangular group of blocks. As long as each room type\n + * reserves a sufficient number of blocks, the room building routines\n + * will not need to check bounds. Note that most of the normal rooms\n + * actually only use 23x11 grids, and so reserve 33x11 grids.\n + *\n + * Note that the use of 11x11 blocks (instead of the old 33x11 blocks)\n + * allows more variability in the horizontal placement of rooms, and\n + * at the same time has the disadvantage that some rooms (two thirds\n + * of the normal rooms) may be "split" by panel boundaries. This can\n + * induce a situation where a player is in a room and part of the room\n + * is off the screen. It may be annoying enough to go back to 33x11\n + * blocks to prevent this visual situation.\n + *\n + * Note that the dungeon generation routines are much different (2.7.5)\n + * and perhaps "DUN_ROOMS" should be less than 50.\n + *\n + * XXX XXX XXX Note that it is possible to create a room which is only\n + * connected to itself, because the "tunnel generation" code allows a\n + * tunnel to leave a room, wander around, and then re-enter the room.\n + *\n + * XXX XXX XXX Note that it is possible to create a set of rooms which\n + * are only connected to other rooms in that set, since there is nothing\n + * explicit in the code to prevent this from happening. But this is less\n + * likely than the "isolated room" problem, because each room attempts to\n + * connect to another room, in a giant cycle, thus requiring at least two\n + * bizarre occurances to create an isolated section of the dungeon.\n + *\n + * Note that (2.7.9) monster pits have been split into monster "nests"\n + * and monster "pits". The "nests" have a collection of monsters of a\n + * given type strewn randomly around the room (jelly, animal, or undead),\n + * while the "pits" have a collection of monsters of a given type placed\n + * around the room in an organized manner (orc, troll, giant, dragon, or\n + * demon). Note that both "nests" and "pits" are now "level dependant",\n + * and both make 16 "expensive" calls to the "get_mon_num()" function.\n + *\n + * Note that the cave grid flags changed in a rather drastic manner\n + * for Angband 2.8.0 (and 2.7.9+), in particular, dungeon terrain\n + * features, such as doors and stairs and traps and rubble and walls,\n + * are all handled as a set of 64 possible "terrain features", and\n + * not as "fake" objects (440-479) as in pre-2.8.0 versions.\n + *\n + * The 64 new "dungeon features" will also be used for "visual display"\n + * but we must be careful not to allow, for example, the user to display\n + * hidden traps in a different way from floors, or secret doors in a way\n + * different from granite walls, or even permanent granite in a different\n + * way from granite. XXX XXX XXX\n */ #include "angband.h" @@ -104,25 +102,26 @@ #include "rooms.h" #include "streams.h" -int dun_tun_rnd; +int dun_tun_rnd; int dun_tun_chg; int dun_tun_con; int dun_tun_pen; int dun_tun_jct; -/* +/*! * Dungeon generation data -- see "cave_gen()" */ dun_data *dun; -/* - * Count the number of walls adjacent to the given grid. - * - * Note -- Assumes "in_bounds(y, x)" - * - * We count only granite walls and permanent walls. +/*! + * @brief 上下左右の外壁数をカウントする / Count the number of walls adjacent to the given grid. + * @param y 基準のy座標 + * @param x 基準のx座標 + * @return 隣接する外壁の数 + * @note Assumes "in_bounds(y, x)" + * @details We count only granite walls and permanent walls. */ static int next_to_walls(int y, int x) { @@ -136,11 +135,12 @@ static int next_to_walls(int y, int x) return (k); } - -/* - * Helper function for alloc_stairs(). - * - * Is this a good location for stairs? +/*! + * @brief alloc_stairs()の補助として指定の位置に階段を生成できるかの判定を行う / Helper function for alloc_stairs(). Is this a good location for stairs? + * @param y 基準のy座標 + * @param x 基準のx座標 + * @param walls 最低減隣接させたい外壁の数 + * @return 階段を生成して問題がないならばTRUEを返す。 */ static bool alloc_stairs_aux(int y, int x, int walls) { @@ -159,8 +159,12 @@ static bool alloc_stairs_aux(int y, int x, int walls) } -/* - * Places some staircases near walls +/*! + * @brief 外壁に隣接させて階段を生成する / Places some staircases near walls + * @param feat 配置したい地形ID + * @param num 配置したい階段の数 + * @param walls 最低減隣接させたい外壁の数 + * @return 規定数通りに生成に成功したらTRUEを返す。 */ static bool alloc_stairs(int feat, int num, int walls) { @@ -274,9 +278,12 @@ static bool alloc_stairs(int feat, int num, int walls) return TRUE; } - -/* - * Allocates some objects (using "place" and "type") +/*! + * @brief フロア上のランダム位置に各種オブジェクトを配置する / Allocates some objects (using "place" and "type") + * @param set 配置したい地形の種類 + * @param typ 配置したいオブジェクトの種類 + * @param num 配置したい数 + * @return 規定数通りに生成に成功したらTRUEを返す。 */ static void alloc_object(int set, int typ, int num) { @@ -327,7 +334,7 @@ static void alloc_object(int set, int typ, int num) if (cheat_room) { #ifdef JP -msg_print("·Ù¹ð¡ª¥¢¥¤¥Æ¥à¤òÇÛÃ֤Ǥ­¤Þ¤»¤ó¡ª"); +msg_print("警告!アイテムを配置できません!"); #else msg_print("Warning! Could not place object!"); #endif @@ -369,14 +376,15 @@ msg_print(" } } - -/* - * Count the number of "corridor" grids adjacent to the given grid. - * - * Note -- Assumes "in_bounds(y1, x1)" - * - * XXX XXX This routine currently only counts actual "empty floor" - * grids which are not in rooms. We might want to also count stairs, +/*! + * @brief 隣接4マスに存在する通路の数を返す / Count the number of "corridor" grids adjacent to the given grid. + * @param y1 基準となるマスのY座標 + * @param x1 基準となるマスのX座標 + * @return 通路の数 + * @note Assumes "in_bounds(y1, x1)" + * @details + * XXX XXX This routine currently only counts actual "empty floor"\n + * grids which are not in rooms. We might want to also count stairs,\n * open doors, closed doors, etc. */ static int next_to_corr(int y1, int x1) @@ -414,11 +422,15 @@ static int next_to_corr(int y1, int x1) } -/* - * Determine if the given location is "between" two walls, - * and "next to" two corridor spaces. XXX XXX XXX - * - * Assumes "in_bounds(y, x)" +/*! + * @brief ドアを設置可能な地形かを返す / Determine if the given location is "between" two walls, and "next to" two corridor spaces. + * @param y 判定を行いたいマスのY座標 + * @param x 判定を行いたいマスのX座標 + * @return ドアを設置可能ならばTRUEを返す + * @note Assumes "in_bounds(y1, x1)" + * @details + * XXX XXX XXX\n + * Assumes "in_bounds(y, x)"\n */ static bool possible_doorway(int y, int x) { @@ -444,9 +456,11 @@ static bool possible_doorway(int y, int x) return (FALSE); } - -/* - * Places door at y, x position if at least 2 walls found +/*! + * @brief ドアの設置を試みる / Places door at y, x position if at least 2 walls found + * @param y 設置を行いたいマスのY座標 + * @param x 設置を行いたいマスのX座標 + * @return なし */ static void try_door(int y, int x) { @@ -468,8 +482,11 @@ static void try_door(int y, int x) } -/* Place quest monsters */ -void place_quest_monsters(void) +/*! + * @brief クエストに関わるモンスターの配置を行う / Place quest monsters + * @return 成功したならばTRUEを返す + */ +bool place_quest_monsters(void) { int i; @@ -479,7 +496,7 @@ void place_quest_monsters(void) monster_race *r_ptr; u32b mode; int j; - + if (quest[i].status != QUEST_STATUS_TAKEN || (quest[i].type != QUEST_TYPE_KILL_LEVEL && quest[i].type != QUEST_TYPE_RANDOM) || @@ -508,22 +525,30 @@ void place_quest_monsters(void) for (k = 0; k < SAFE_MAX_ATTEMPTS; k++) { - int x, y; + int x = 0, y = 0; int l; /* Find an empty grid */ for (l = SAFE_MAX_ATTEMPTS; l > 0; l--) { + cave_type *c_ptr; + feature_type *f_ptr; + y = randint0(cur_hgt); x = randint0(cur_wid); + c_ptr = &cave[y][x]; + f_ptr = &f_info[c_ptr->feat]; + + if (!have_flag(f_ptr->flags, FF_MOVE) && !have_flag(f_ptr->flags, FF_CAN_FLY)) continue; if (!monster_can_enter(y, x, r_ptr, 0)) continue; - if (distance(y, x, py, px) < 10) continue; + if (distance(y, x, p_ptr->y, p_ptr->x) < 10) continue; + if (c_ptr->info & CAVE_ICKY) continue; else break; } /* Failed to place */ - if (!l) break; + if (!l) return FALSE; /* Try to place the monster */ if (place_monster_aux(0, y, x, quest[i].r_idx, mode)) @@ -537,13 +562,20 @@ void place_quest_monsters(void) continue; } } + + /* Failed to place */ + if (k == SAFE_MAX_ATTEMPTS) return FALSE; } } + + return TRUE; } -/* - * Set boundary mimic and add "solid" perma-wall +/*! + * @brief マスにフロア端用の永久壁を配置する / Set boundary mimic and add "solid" perma-wall + * @param c_ptr 永久壁を廃止したいマス構造体の参照ポインタ + * @return なし */ static void set_bound_perm_wall(cave_type *c_ptr) { @@ -569,11 +601,10 @@ static void set_bound_perm_wall(cave_type *c_ptr) place_solid_perm_grid(c_ptr); } - -/* - * Generate various caverns and lakes - * - * There were moved from cave_gen(). +/*! + * @brief フロアに洞窟や湖を配置する / Generate various caverns and lakes + * @details There were moved from cave_gen(). + * @return なし */ static void gen_caverns_and_lakes(void) { @@ -637,7 +668,7 @@ static void gen_caverns_and_lakes(void) { if (cheat_room) #ifdef JP - msg_print("¸Ð¤òÀ¸À®¡£"); + msg_print("湖を生成。"); #else msg_print("Lake on the level."); #endif @@ -656,7 +687,7 @@ static void gen_caverns_and_lakes(void) if (cheat_room) #ifdef JP - msg_print("ƶ·¢¤òÀ¸À®¡£"); + msg_print("洞窟を生成。"); #else msg_print("Cavern on level."); #endif @@ -670,11 +701,10 @@ static void gen_caverns_and_lakes(void) } - -/* - * Generate a new dungeon level - * - * Note that "dun_body" adds about 4000 bytes of memory to the stack. +/*! + * @brief ダンジョン生成のメインルーチン / Generate a new dungeon level + * @details Note that "dun_body" adds about 4000 bytes of memory to the stack. + * @return ダンジョン生成が全て無事に成功したらTRUEを返す。 */ static bool cave_gen(void) { @@ -726,7 +756,7 @@ static bool cave_gen(void) if (cheat_room) #ifdef JP - msg_print("¥¢¥ê¡¼¥Ê¥ì¥Ù¥ë"); + msg_print("アリーナレベル"); #else msg_print("Arena level."); #endif @@ -780,15 +810,17 @@ static bool cave_gen(void) build_maze_vault(cur_wid/2-1, cur_hgt/2-1, cur_wid-4, cur_hgt-4, FALSE); /* Place 3 or 4 down stairs near some walls */ - if (!alloc_stairs(FEAT_MORE, rand_range(2, 3), 3)) return FALSE; + if (!alloc_stairs(feat_down_stair, rand_range(2, 3), 3)) return FALSE; /* Place 1 or 2 up stairs near some walls */ - if (!alloc_stairs(FEAT_LESS, 1, 3)) return FALSE; + if (!alloc_stairs(feat_up_stair, 1, 3)) return FALSE; } /* Build some rooms */ else { + int tunnel_fail_count = 0; + /* * Build each type of room in turn until we cannot build any more. */ @@ -815,13 +847,13 @@ static bool cave_gen(void) /* Choose water or lava */ if ((randint1(MAX_DEPTH * 2) - 1 > dun_level) && (d_info[dungeon_type].flags1 & DF1_WATER_RIVER)) { - feat1 = FEAT_DEEP_WATER; - feat2 = FEAT_SHAL_WATER; + feat1 = feat_deep_water; + feat2 = feat_shallow_water; } else if (d_info[dungeon_type].flags1 & DF1_LAVA_RIVER) { - feat1 = FEAT_DEEP_LAVA; - feat2 = FEAT_SHAL_LAVA; + feat1 = feat_deep_lava; + feat2 = feat_shallow_lava; } else feat1 = 0; @@ -873,14 +905,16 @@ static bool cave_gen(void) if (randint1(dun_level) > d_info[dungeon_type].tunnel_percent) { /* make cave-like tunnel */ - build_tunnel2(dun->cent[i].x, dun->cent[i].y, x, y, 2, 2); + (void)build_tunnel2(dun->cent[i].x, dun->cent[i].y, x, y, 2, 2); } else { /* make normal tunnel */ - build_tunnel(dun->cent[i].y, dun->cent[i].x, y, x); + if (!build_tunnel(dun->cent[i].y, dun->cent[i].x, y, x)) tunnel_fail_count++; } + if (tunnel_fail_count >= 2) return FALSE; + /* Turn the tunnel into corridor */ for (j = 0; j < dun->tunn_n; j++) { @@ -951,10 +985,10 @@ static bool cave_gen(void) } /* Place 3 or 4 down stairs near some walls */ - if (!alloc_stairs(FEAT_MORE, rand_range(3, 4), 3)) return FALSE; + if (!alloc_stairs(feat_down_stair, rand_range(3, 4), 3)) return FALSE; /* Place 1 or 2 up stairs near some walls */ - if (!alloc_stairs(FEAT_LESS, rand_range(1, 2), 3)) return FALSE; + if (!alloc_stairs(feat_up_stair, rand_range(1, 2), 3)) return FALSE; } if (!dun->laketype) @@ -995,7 +1029,7 @@ static bool cave_gen(void) /* Determine the character location */ if (!new_player_spot()) return FALSE; - place_quest_monsters(); + if (!place_quest_monsters()) return FALSE; /* Basic "amount" */ k = (dun_level / 3); @@ -1018,7 +1052,7 @@ static bool cave_gen(void) else if (cheat_hear) { #ifdef JP -msg_format("¥â¥ó¥¹¥¿¡¼¿ô´ðËÜÃͤò %d ¤«¤é %d ¤Ë¸º¤é¤·¤Þ¤¹", small_tester, i); +msg_format("モンスター数基本値を %d から %d に減らします", small_tester, i); #else msg_format("Reduced monsters base from %d to %d", small_tester, i); #endif @@ -1058,7 +1092,7 @@ msg_format(" object_level = base_level; /* Put the Guardian */ - (void)alloc_guardian(); + if (!alloc_guardian(TRUE)) return FALSE; if (dun->empty_level && (!one_in_(DARK_EMPTY) || (randint1(100) > dun_level)) && !(d_info[dungeon_type].flags1 & DF1_DARKNESS)) { @@ -1075,9 +1109,9 @@ msg_format(" return TRUE; } - -/* - * Builds the arena after it is entered -KMW- +/*! + * @brief 闘技場用のアリーナ地形を作成する / Builds the arena after it is entered -KMW- + * @return なし */ static void build_arena(void) { @@ -1132,9 +1166,9 @@ static void build_arena(void) player_place(i, j); } - -/* - * Town logic flow for generation of arena -KMW- +/*! + * @brief 闘技場への入場処理 / Town logic flow for generation of arena -KMW- + * @return なし */ static void arena_gen(void) { @@ -1165,20 +1199,28 @@ static void arena_gen(void) for (x = qx + 1; x < qx + SCREEN_WID - 1; x++) { /* Create empty floor */ - cave[y][x].feat = FEAT_FLOOR; + cave[y][x].feat = feat_floor; } } build_arena(); - place_monster_aux(0, py + 5, px, arena_info[p_ptr->arena_number].r_idx, - (PM_NO_KAGE | PM_NO_PET)); -} - + if(!place_monster_aux(0, p_ptr->y + 5, p_ptr->x, arena_info[p_ptr->arena_number].r_idx, (PM_NO_KAGE | PM_NO_PET))) + { + p_ptr->exit_bldg = TRUE; + p_ptr->arena_number++; +#ifdef JP + msg_print("相手は欠場した。あなたの不戦勝だ。"); +#else + msg_print("The enemy is unable appear. You won by default."); +#endif + } +} -/* - * Builds the arena after it is entered -KMW- +/*! + * @brief モンスター闘技場のフロア生成 / Builds the arena after it is entered -KMW- + * @return なし */ static void build_battle(void) { @@ -1226,16 +1268,22 @@ static void build_battle(void) place_extra_perm_bold(y_depth-4, x_right-18); cave[y_depth-4][x_right-18].info |= (CAVE_GLOW | CAVE_MARK); - i = y_height + 4; + for (i = y_height + 1; i <= y_height + 5; i++) + for (j = x_left + 20 + 2 * (y_height + 5 - i); j <= x_right - 20 - 2 * (y_height + 5 - i); j++) + { + cave[i][j].feat = feat_permanent_glass_wall; + } + + i = y_height + 1; j = xval; - cave[i][j].feat = FEAT_BLDG_HEAD + 3; + cave[i][j].feat = f_tag_to_index("BUILDING_3"); cave[i][j].info |= (CAVE_GLOW | CAVE_MARK); player_place(i, j); } - -/* - * Town logic flow for generation of arena -KMW- +/*! + * @brief モンスター闘技場への導入処理 / Town logic flow for generation of arena -KMW- + * @return なし */ static void battle_gen(void) { @@ -1262,7 +1310,7 @@ static void battle_gen(void) for (x = qx + 1; x < qx + SCREEN_WID - 1; x++) { /* Create empty floor */ - cave[y][x].feat = FEAT_FLOOR; + cave[y][x].feat = feat_floor; } } @@ -1270,9 +1318,9 @@ static void battle_gen(void) for(i=0;i<4;i++) { - place_monster_aux(0, py + 5 + (i/2)*4, px - 2 + (i%2)*4, battle_mon[i], + place_monster_aux(0, p_ptr->y + 8 + (i/2)*4, p_ptr->x - 2 + (i%2)*4, battle_mon[i], (PM_NO_KAGE | PM_NO_PET)); - set_friendly(&m_list[cave[py+5+(i/2)*4][px-2+(i%2)*4].m_idx]); + set_friendly(&m_list[cave[p_ptr->y+8+(i/2)*4][p_ptr->x-2+(i%2)*4].m_idx]); } for(i = 1; i < m_max; i++) { @@ -1288,9 +1336,9 @@ static void battle_gen(void) } } - -/* - * Generate a quest level +/*! + * @brief 固定マップクエストのフロア生成 / Generate a quest level + * @return なし */ static void quest_gen(void) { @@ -1317,12 +1365,15 @@ static void quest_gen(void) /* Prepare allocation table */ get_mon_num_prep(get_monster_hook(), NULL); - init_flags = INIT_CREATE_DUNGEON | INIT_ASSIGN; + init_flags = INIT_CREATE_DUNGEON; process_dungeon_file("q_info.txt", 0, 0, MAX_HGT, MAX_WID); } -/* Make a real level */ +/*! + * @brief ダンジョン時のランダムフロア生成 / Make a real level + * @return フロアの生成に成功したらTRUE + */ static bool level_gen(cptr *why) { int level_height, level_width; @@ -1335,7 +1386,7 @@ static bool level_gen(cptr *why) { if (cheat_room) #ifdef JP - msg_print("¾®¤µ¤Ê¥Õ¥í¥¢"); + msg_print("小さなフロア"); #else msg_print("A 'small' dungeon level."); #endif @@ -1386,7 +1437,7 @@ static bool level_gen(cptr *why) if (!cave_gen()) { #ifdef JP -*why = "¥À¥ó¥¸¥ç¥óÀ¸À®¤Ë¼ºÇÔ"; +*why = "ダンジョン生成に失敗"; #else *why = "could not place player"; #endif @@ -1396,11 +1447,11 @@ static bool level_gen(cptr *why) else return TRUE; } - -/* - * Wipe all unnecessary flags after cave generation +/*! + * @brief フロアに存在する全マスの記憶状態を初期化する / Wipe all unnecessary flags after cave generation + * @return なし */ -static void wipe_generate_cave_flags(void) +void wipe_generate_cave_flags(void) { int x, y; @@ -1426,26 +1477,26 @@ static void wipe_generate_cave_flags(void) } } - -/* - * Clear and empty the cave +/*! + * @brief フロアの全情報を初期化する / Clear and empty the cave + * @return なし */ void clear_cave(void) { int x, y, i; /* Very simplified version of wipe_o_list() */ - C_WIPE(o_list, o_max, object_type); + (void)C_WIPE(o_list, o_max, object_type); o_max = 1; o_cnt = 0; /* Very simplified version of wipe_m_list() */ for (i = 1; i < max_r_idx; i++) r_info[i].cur_num = 0; - C_WIPE(m_list, m_max, monster_type); + (void)C_WIPE(m_list, m_max, monster_type); m_max = 1; m_cnt = 0; - for (i = 0; i < MAX_MPROC; i++) mproc_max[i] = 1; + for (i = 0; i < MAX_MTIMED; i++) mproc_max[i] = 0; /* Pre-calc cur_num of pets in party_mon[] */ precalc_cur_num_of_pet(); @@ -1484,7 +1535,7 @@ void clear_cave(void) } /* Mega-Hack -- no player yet */ - px = py = 0; + p_ptr->x = p_ptr->y = 0; /* Set the base level */ base_level = dun_level; @@ -1497,10 +1548,10 @@ void clear_cave(void) } -/* - * Generates a random dungeon level -RAK- - * - * Hack -- regenerate any "overflow" levels +/*! + * ダンジョンのランダムフロアを生成する / Generates a random dungeon level -RAK- + * @return なし + * @note Hack -- regenerate any "overflow" levels */ void generate_cave(void) { @@ -1558,7 +1609,7 @@ void generate_cave(void) { /* Message */ #ifdef JP -why = "¥¢¥¤¥Æ¥à¤¬Â¿¤¹¤®¤ë"; +why = "アイテムが多すぎる"; #else why = "too many objects"; #endif @@ -1572,7 +1623,7 @@ why = " { /* Message */ #ifdef JP -why = "¥â¥ó¥¹¥¿¡¼¤¬Â¿¤¹¤®¤ë"; +why = "モンスターが多すぎる"; #else why = "too many monsters"; #endif @@ -1587,7 +1638,7 @@ why = " /* Message */ #ifdef JP -if (why) msg_format("À¸À®¤ä¤êľ¤·(%s)", why); +if (why) msg_format("生成やり直し(%s)", why); #else if (why) msg_format("Generation restarted (%s)", why); #endif