int16_t south_east;
};
+static border_type border;
+
/*!
* @brief 地形生成確率を決める要素100の配列を確率テーブルから作成する
* @param feat_type 非一様確率を再現するための要素数100の配列
}
/*!
- * @brief 荒野フロア生成のメインルーチン /
- * Load a town or generate a terrain level using "plasma" fractals.
+ * @brief 荒野フロア生成のメインルーチン
* @param player_ptr プレイヤーへの参照ポインタ
* @param y 広域Y座標
* @param x 広域X座標
- * @param border 広域マップの辺部分としての生成ならばTRUE
- * @param corner 広域マップの角部分としての生成ならばTRUE
- * @details
- * <pre>
- * x and y are the coordinates of the area in the wilderness.
- * Border and corner are optimization flags to speed up the
- * generation of the fractal terrain.
- * If border is set then only the border of the terrain should
- * be generated (for initializing the border structure).
- * If corner is set then only the corners of the area are needed.
- * </pre>
+ * @param is_border 広域マップの辺部分としての生成ならばTRUE
+ * @param is_corner 広域マップの角部分としての生成ならばTRUE
*/
-static void generate_area(PlayerType *player_ptr, POSITION y, POSITION x, bool border, bool corner)
+static void generate_area(PlayerType *player_ptr, POSITION y, POSITION x, bool is_border, bool is_corner)
{
player_ptr->town_num = wilderness[y][x].town;
auto *floor_ptr = player_ptr->current_floor_ptr;
floor_ptr->object_level = floor_ptr->base_level;
if (player_ptr->town_num) {
init_buildings();
- if (border || corner) {
+ if (is_border || is_corner) {
init_flags = i2enum<init_flags_type>(INIT_CREATE_DUNGEON | INIT_ONLY_FEATURES);
} else {
init_flags = INIT_CREATE_DUNGEON;
}
parse_fixed_map(player_ptr, TOWN_DEFINITION_LIST, 0, 0, MAX_HGT, MAX_WID);
- if (!corner && !border) {
+ if (!is_corner && !is_border) {
player_ptr->visit |= (1UL << (player_ptr->town_num - 1));
}
} else {
int terrain = wilderness[y][x].terrain;
uint32_t seed = wilderness[y][x].seed;
- generate_wilderness_area(floor_ptr, terrain, seed, corner);
+ generate_wilderness_area(floor_ptr, terrain, seed, is_corner);
}
- if (!corner && !wilderness[y][x].town) {
+ if (!is_corner && !wilderness[y][x].town) {
//!< @todo make the road a bit more interresting.
if (wilderness[y][x].road) {
floor_ptr->grid_array[MAX_HGT / 2][MAX_WID / 2].feat = feat_floor;
w_ptr->rng.set_state(state_backup);
}
-/* Border of the wilderness area */
-static border_type border;
+/*!
+ * @brief 地上マップにモンスターを生成する
+ * @param player_ptr プレイヤーへの参照ポインタ
+ * @details '>' キーで普通に入った時と、襲撃を受けた時でモンスター数は異なる.
+ * また、集団生成や護衛は、最初に生成された1体だけがカウント対象である.
+ * よって、実際に生成されるモンスターは、コードの見た目より多くなる.
+ */
+static void generate_wild_monsters(PlayerType *player_ptr)
+{
+ constexpr auto num_ambush_monsters = 40;
+ constexpr auto num_normal_monsters = 8;
+ const auto lim = generate_encounter ? num_ambush_monsters : num_normal_monsters;
+ for (auto i = 0; i < lim; i++) {
+ BIT_FLAGS mode = 0;
+ if (!(generate_encounter || (one_in_(2) && (!player_ptr->town_num)))) {
+ mode |= PM_ALLOW_SLEEP;
+ }
+
+ (void)alloc_monster(player_ptr, generate_encounter ? 0 : 3, mode, summon_specific);
+ }
+}
/*!
* @brief 広域マップの生成 /
}
player_place(player_ptr, player_ptr->oldpy, player_ptr->oldpx);
- int lim = generate_encounter ? 40 : MIN_M_ALLOC_TN;
- for (int i = 0; i < lim; i++) {
- BIT_FLAGS mode = 0;
- if (!(generate_encounter || (one_in_(2) && (!player_ptr->town_num)))) {
- mode |= PM_ALLOW_SLEEP;
- }
-
- (void)alloc_monster(player_ptr, generate_encounter ? 0 : 3, mode, summon_specific);
- }
-
+ generate_wild_monsters(player_ptr);
if (generate_encounter) {
player_ptr->ambush_flag = true;
}