OSDN Git Service

generate_rooms()関数で部屋を配置する際に無限ループに陥ることがあるバグを修正。
authoriks <iks@0568b783-4c39-0410-ac80-bf13821ea2a2>
Sat, 6 Dec 2003 06:09:09 +0000 (06:09 +0000)
committeriks <iks@0568b783-4c39-0410-ac80-bf13821ea2a2>
Sat, 6 Dec 2003 06:09:09 +0000 (06:09 +0000)
金鉱などの狭い階に配置を試みるとき、配置に失敗し部屋数が0個となることが頻発していた。
その後モンスターやアイテムの配置がいつまでも出来ず無限ループになっていた模様。
generate_rooms関数をbool型にし、部屋数0のときはFALSEを返して、生成失敗と扱うようにした。
ダンジョン生成失敗時は新たにダンジョンを生成しようと試みなおすのでこれで問題はないはず。

src/generate.c
src/rooms.c
src/rooms.h

index 55e7ecb..240d5b7 100644 (file)
@@ -742,7 +742,7 @@ static bool cave_gen(void)
                /*
                 * Build each type of room in turn until we cannot build any more.
                 */
-               generate_rooms();
+               if (!generate_rooms()) return FALSE;
 
 
                /* Make a hole in the dungeon roof sometimes at level 1 */
@@ -1285,12 +1285,11 @@ static bool level_gen(cptr *why)
        {
                if (cheat_room)
 #ifdef JP
-msg_print("¾®¤µ¤Ê¥Õ¥í¥¢");
+                       msg_print("¾®¤µ¤Ê¥Õ¥í¥¢");
 #else
-                 msg_print("A 'small' dungeon level.");
+                       msg_print("A 'small' dungeon level.");
 #endif
 
-
                if (d_info[dungeon_type].flags1 & DF1_SMALLEST)
                {
                        level_height = 1;
index 12e630f..e2c046d 100644 (file)
@@ -5957,7 +5957,7 @@ bool room_build(int typ)
  * 
  * Generate rooms in dungeon.  Build bigger rooms at first.
  */
-void generate_rooms(void)
+bool generate_rooms(void)
 {
        int i;
        bool remain;
@@ -5977,7 +5977,6 @@ void generate_rooms(void)
        /* Assume normal cave */
        room_info_type *room_info_ptr = room_info_normal;
 
-
        /*
         * Initialize probability list.
         */
@@ -6146,6 +6145,8 @@ void generate_rooms(void)
                if (!remain) break;
        }
 
+       if (rooms_built < 1) return FALSE;
+
        if (cheat_room)
        {
 #ifdef JP
@@ -6154,4 +6155,6 @@ void generate_rooms(void)
                msg_format("Number of Rooms: %d", rooms_built);
 #endif
        }
+
+       return TRUE;
 }
index d3e4516..a3f4d60 100644 (file)
@@ -67,6 +67,6 @@ extern void build_cavern(void);
 #endif /* ALLOW_CAVERNS_AND_LAKES */
 
 extern bool room_build(int typ);
-extern void generate_rooms(void);
+extern bool generate_rooms(void);
 extern void build_maze_vault(int x0, int y0, int xsize, int ysize, bool is_vault);