X-Git-Url: http://git.osdn.net/view?a=blobdiff_plain;f=src%2Fwild.c;h=90f82c9d5046b016ac554499fd039cd631d832ef;hb=7de4d6dfb51f88bb16a02b538ab727fc1a6b9858;hp=7da994ef8d5ed519ece162ec5f2db50727bd3b11;hpb=2297e8f6f984ce1701bc3f9187887d1f62fa333d;p=hengband%2Fhengband.git diff --git a/src/wild.c b/src/wild.c index 7da994ef8..90f82c9d5 100644 --- a/src/wild.c +++ b/src/wild.c @@ -1,65 +1,81 @@ -/* File: wild.c */ +/*! + * @file wild.c + * @brief èéãããã®çæã¨ã«ã¼ã«ç®¡ç / Wilderness generation + * @date 2014/02/13 + * @author + * Copyright (c) 1989 James E. Wilson, Robert A. Koeneke\n + * This software may be copied and distributed for educational, research, and\n + * not for profit purposes provided that this copyright and statement are\n + * included in all such copies.\n + * 2013 Deskull rearranged comment for Doxygen. + */ -/* - * Copyright (c) 1997 Ben Harrison, James E. Wilson, Robert A. Koeneke, - * Robert Ruehlmann - * - * 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. +#include "angband.h" +#include "world.h" + +/*! + * @brief å°å½¢çæ確çã決ããè¦ç´ 100ã®é åã確çãã¼ãã«ããä½æãã + * @param feat_type éä¸æ§ç¢ºçãåç¾ããããã®è¦ç´ æ°100ã®é å + * @param prob å ã®ç¢ºçãã¼ãã« + * @return ãªã */ +static void set_floor_and_wall_aux(s16b feat_type[100], feat_prob prob[DUNGEON_FEAT_PROB_NUM]) +{ + int lim[DUNGEON_FEAT_PROB_NUM], cur = 0, i; -/* Purpose: Wilderness generation */ + lim[0] = prob[0].percent; + for (i = 1; i < DUNGEON_FEAT_PROB_NUM; i++) lim[i] = lim[i - 1] + prob[i].percent; -#include "angband.h" + /* Paranoia */ + if (lim[DUNGEON_FEAT_PROB_NUM - 1] < 100) lim[DUNGEON_FEAT_PROB_NUM - 1] = 100; + for (i = 0; i < 100; i++) + { + while (i == lim[cur]) cur++; + feat_type[i] = prob[cur].feat; + } +} -/* - * Fill the arrays of floors and walls in the good proportions +/*! + * @brief ãã³ã¸ã§ã³ã®å°å½¢ãæå®ç¢ºçã«å¿ãã¦åãã¹ã¸ã©ã³ãã ã«æ·ãè©°ãã + * / Fill the arrays of floors and walls in the good proportions + * @param type ãã³ã¸ã§ã³ID + * @return ãªã */ -void set_floor_and_wall(byte type) +void set_floor_and_wall(DUNGEON_IDX type) { - static byte cur_type = 255; - int i; + DUNGEON_IDX cur_type = 255; + dungeon_info_type *d_ptr; /* Already filled */ if (cur_type == type) return; cur_type = type; + d_ptr = &d_info[type]; - for (i = 0; i < 100; i++) - { - int lim1, lim2, lim3; - - lim1 = d_info[type].floor_percent1; - lim2 = lim1 + d_info[type].floor_percent2; - lim3 = lim2 + d_info[type].floor_percent3; - - if (i < lim1) - floor_type[i] = d_info[type].floor1; - else if (i < lim2) - floor_type[i] = d_info[type].floor2; - else if (i < lim3) - floor_type[i] = d_info[type].floor3; - - lim1 = d_info[type].fill_percent1; - lim2 = lim1 + d_info[type].fill_percent2; - lim3 = lim2 + d_info[type].fill_percent3; - if (i < lim1) - fill_type[i] = d_info[type].fill_type1; - else if (i < lim2) - fill_type[i] = d_info[type].fill_type2; - else if (i < lim3) - fill_type[i] = d_info[type].fill_type3; - } + set_floor_and_wall_aux(floor_type, d_ptr->floor); + set_floor_and_wall_aux(fill_type, d_ptr->fill); + + feat_wall_outer = d_ptr->outer_wall; + feat_wall_inner = d_ptr->inner_wall; + feat_wall_solid = d_ptr->outer_wall; } -/* - * Helper for plasma generation. +/*! + * @brief ãã©ãºããã©ã¯ã¿ã«çå°å½¢çæã®å帰ä¸éå¦ç + * / Helper for plasma generation. + * @param x1 å·¦ä¸ç«¯ã®æ·±ã¿ + * @param x2 å³ä¸ç«¯ã®æ·±ã¿ + * @param x3 å·¦ä¸ç«¯ã®æ·±ã¿ + * @param x4 å³ä¸ç«¯ã®æ·±ã¿ + * @param xmid ä¸å¤®åº§æ¨X + * @param ymid ä¸å¤®åº§æ¨Y + * @param rough ã©ã³ãã å¹ + * @param depth_max æ·±ã¿ã®æå¤§å¤ + * @return ãªã */ -static void perturb_point_mid(int x1, int x2, int x3, int x4, - int xmid, int ymid, int rough, int depth_max) +static void perturb_point_mid(POSITION x1, POSITION x2, POSITION x3, POSITION x4, POSITION xmid, POSITION ymid, POSITION rough, POSITION depth_max) { /* * Average the four corners & perturb it a bit. @@ -79,10 +95,22 @@ static void perturb_point_mid(int x1, int x2, int x3, int x4, if (avg > depth_max) avg = depth_max; /* Set the new value. */ - cave[ymid][xmid].feat = avg; + cave[ymid][xmid].feat = (s16b)avg; } +/*! + * @brief ãã©ãºããã©ã¯ã¿ã«çå°å½¢çæã®å帰æ«ç«¯å¦ç + * / Helper for plasma generation. + * @param x1 ä¸éæ«ç«¯é¨1ã®éã¿ + * @param x2 ä¸éæ«ç«¯é¨2ã®éã¿ + * @param x3 ä¸éæ«ç«¯é¨3ã®éã¿ + * @param xmid æçµæ«ç«¯é¨åº§æ¨X + * @param ymid æçµæ«ç«¯é¨åº§æ¨Y + * @param rough ã©ã³ãã å¹ + * @param depth_max æ·±ã¿ã®æå¤§å¤ + * @return ãªã + */ static void perturb_point_end(int x1, int x2, int x3, int xmid, int ymid, int rough, int depth_max) { @@ -103,23 +131,34 @@ static void perturb_point_end(int x1, int x2, int x3, if (avg > depth_max) avg = depth_max; /* Set the new value. */ - cave[ymid][xmid].feat = avg; + cave[ymid][xmid].feat = (s16b)avg; } -/* +/*! + * @brief ãã©ãºããã©ã¯ã¿ã«çå°å½¢çæã®éå§å¦ç + * / Helper for plasma generation. + * @param x1 å¦çç¯å²ã®å·¦ä¸Xåº§æ¨ + * @param y1 å¦çç¯å²ã®å·¦ä¸Yåº§æ¨ + * @param x2 å¦çç¯å²ã®å³ä¸Xåº§æ¨ + * @param y2 å¦çç¯å²ã®å³ä¸Yåº§æ¨ + * @param depth_max æ·±ã¿ã®æå¤§å¤ + * @param rough ã©ã³ãã å¹ + * @return ãªã + * @details + *
* A generic function to generate the plasma fractal. * Note that it uses ``cave_feat'' as temporary storage. * The values in ``cave_feat'' after this function * are NOT actual features; They are raw heights which * need to be converted to features. + **/ -static void plasma_recursive(int x1, int y1, int x2, int y2, - int depth_max, int rough) +static void plasma_recursive(POSITION x1, POSITION y1, POSITION x2, POSITION y2, POSITION depth_max, POSITION rough) { /* Find middle */ - int xmid = (x2 - x1) / 2 + x1; - int ymid = (y2 - y1) / 2 + y1; + POSITION xmid = (x2 - x1) / 2 + x1; + POSITION ymid = (y2 - y1) / 2 + y1; /* Are we done? */ if (x1 + 1 == x2) return; @@ -148,332 +187,27 @@ static void plasma_recursive(int x1, int y1, int x2, int y2, } +#define MAX_FEAT_IN_TERRAIN 18 + /* * The default table in terrain level generation. */ -static int terrain_table[MAX_WILDERNESS][18] = -{ - /* TERRAIN_EDGE */ - { - FEAT_PERM_SOLID, - FEAT_PERM_SOLID, - FEAT_PERM_SOLID, - - FEAT_PERM_SOLID, - FEAT_PERM_SOLID, - FEAT_PERM_SOLID, - - FEAT_PERM_SOLID, - FEAT_PERM_SOLID, - FEAT_PERM_SOLID, - - FEAT_PERM_SOLID, - FEAT_PERM_SOLID, - FEAT_PERM_SOLID, - - FEAT_PERM_SOLID, - FEAT_PERM_SOLID, - FEAT_PERM_SOLID, - - FEAT_PERM_SOLID, - FEAT_PERM_SOLID, - FEAT_PERM_SOLID, - }, - /* TERRAIN_TOWN */ - { - FEAT_FLOOR, - FEAT_FLOOR, - FEAT_FLOOR, - - FEAT_FLOOR, - FEAT_FLOOR, - FEAT_FLOOR, - - FEAT_FLOOR, - FEAT_FLOOR, - FEAT_FLOOR, - - FEAT_FLOOR, - FEAT_FLOOR, - FEAT_FLOOR, - - FEAT_FLOOR, - FEAT_FLOOR, - FEAT_FLOOR, - - FEAT_FLOOR, - FEAT_FLOOR, - FEAT_FLOOR, - }, - /* TERRAIN_DEEP_WATER */ - { - FEAT_DEEP_WATER, - FEAT_DEEP_WATER, - FEAT_DEEP_WATER, - - FEAT_DEEP_WATER, - FEAT_DEEP_WATER, - FEAT_DEEP_WATER, - - FEAT_DEEP_WATER, - FEAT_DEEP_WATER, - FEAT_DEEP_WATER, - - FEAT_DEEP_WATER, - FEAT_DEEP_WATER, - FEAT_DEEP_WATER, - - FEAT_SHAL_WATER, - FEAT_SHAL_WATER, - FEAT_SHAL_WATER, - - FEAT_SHAL_WATER, - FEAT_SHAL_WATER, - FEAT_SHAL_WATER, - }, - /* TERRAIN_SHALLOW_WATER */ - { - FEAT_DEEP_WATER, - FEAT_DEEP_WATER, - FEAT_DEEP_WATER, - - FEAT_SHAL_WATER, - FEAT_SHAL_WATER, - FEAT_SHAL_WATER, - - FEAT_SHAL_WATER, - FEAT_SHAL_WATER, - FEAT_SHAL_WATER, - - FEAT_SHAL_WATER, - FEAT_SHAL_WATER, - FEAT_SHAL_WATER, - - FEAT_SHAL_WATER, - FEAT_SHAL_WATER, - FEAT_SHAL_WATER, - - FEAT_FLOOR, - FEAT_DIRT, - FEAT_GRASS, - }, - /* TERRAIN_SWAMP */ - { - FEAT_FLOOR, - FEAT_FLOOR, - FEAT_FLOOR, - - FEAT_SHAL_WATER, - FEAT_SHAL_WATER, - FEAT_SHAL_WATER, - - FEAT_SHAL_WATER, - FEAT_SHAL_WATER, - FEAT_SHAL_WATER, - - FEAT_GRASS, - FEAT_GRASS, - FEAT_GRASS, - - FEAT_GRASS, - FEAT_DIRT, - FEAT_DIRT, - - FEAT_DIRT, - FEAT_DEEP_GRASS, - FEAT_TREES, - }, - /* TERRAIN_DIRT */ - { - FEAT_FLOOR, - FEAT_FLOOR, - FEAT_FLOOR, - - FEAT_DIRT, - FEAT_DIRT, - FEAT_DIRT, - - FEAT_DIRT, - FEAT_DIRT, - FEAT_DIRT, - - FEAT_DIRT, - FEAT_DIRT, - FEAT_DIRT, - - FEAT_DIRT, - FEAT_FLOWER, - FEAT_DEEP_GRASS, - - FEAT_GRASS, - FEAT_TREES, - FEAT_TREES, - }, - /* TERRAIN_GRASS */ - { - FEAT_FLOOR, - FEAT_FLOOR, - FEAT_DIRT, - - FEAT_DIRT, - FEAT_GRASS, - FEAT_GRASS, - - FEAT_GRASS, - FEAT_GRASS, - FEAT_GRASS, - - FEAT_GRASS, - FEAT_GRASS, - FEAT_GRASS, - - FEAT_GRASS, - FEAT_FLOWER, - FEAT_DEEP_GRASS, - - FEAT_DEEP_GRASS, - FEAT_TREES, - FEAT_TREES, - }, - /* TERRAIN_TREES */ - { - FEAT_FLOOR, - FEAT_FLOOR, - FEAT_DIRT, - - FEAT_TREES, - FEAT_TREES, - FEAT_TREES, - - FEAT_TREES, - FEAT_TREES, - FEAT_TREES, - - FEAT_TREES, - FEAT_TREES, - FEAT_TREES, - - FEAT_TREES, - FEAT_TREES, - FEAT_DEEP_GRASS, - - FEAT_DEEP_GRASS, - FEAT_GRASS, - FEAT_GRASS, - }, - /* TERRAIN_DESERT */ - { - FEAT_FLOOR, - FEAT_FLOOR, - FEAT_DIRT, - - FEAT_DIRT, - FEAT_DIRT, - FEAT_DIRT, - - FEAT_DIRT, - FEAT_DIRT, - FEAT_DIRT, - - FEAT_DIRT, - FEAT_DIRT, - FEAT_DIRT, - - FEAT_DIRT, - FEAT_DIRT, - FEAT_DIRT, - - FEAT_GRASS, - FEAT_GRASS, - FEAT_GRASS, - }, - /* TERRAIN_SHALLOW_LAVA */ - { - FEAT_SHAL_LAVA, - FEAT_SHAL_LAVA, - FEAT_SHAL_LAVA, - - FEAT_SHAL_LAVA, - FEAT_SHAL_LAVA, - FEAT_SHAL_LAVA, - - FEAT_SHAL_LAVA, - FEAT_SHAL_LAVA, - FEAT_SHAL_LAVA, - - FEAT_SHAL_LAVA, - FEAT_SHAL_LAVA, - FEAT_SHAL_LAVA, - - FEAT_SHAL_LAVA, - FEAT_SHAL_LAVA, - FEAT_DEEP_LAVA, - - FEAT_DEEP_LAVA, - FEAT_DEEP_LAVA, - FEAT_MOUNTAIN, - }, - /* TERRAIN_DEEP_LAVA */ - { - FEAT_DIRT, - FEAT_DIRT, - FEAT_DIRT, - - FEAT_SHAL_LAVA, - FEAT_SHAL_LAVA, - FEAT_SHAL_LAVA, - - FEAT_DEEP_LAVA, - FEAT_DEEP_LAVA, - FEAT_DEEP_LAVA, - - FEAT_DEEP_LAVA, - FEAT_DEEP_LAVA, - FEAT_DEEP_LAVA, - - FEAT_DEEP_LAVA, - FEAT_DEEP_LAVA, - FEAT_DEEP_LAVA, - - FEAT_DEEP_LAVA, - FEAT_MOUNTAIN, - FEAT_MOUNTAIN, - }, - /* TERRAIN_MOUNTAIN */ - { - FEAT_FLOOR, - FEAT_DEEP_GRASS, - FEAT_GRASS, - - FEAT_GRASS, - FEAT_DIRT, - FEAT_DIRT, - - FEAT_TREES, - FEAT_TREES, - FEAT_MOUNTAIN, - - FEAT_MOUNTAIN, - FEAT_MOUNTAIN, - FEAT_MOUNTAIN, - - FEAT_MOUNTAIN, - FEAT_MOUNTAIN, - FEAT_MOUNTAIN, - - FEAT_MOUNTAIN, - FEAT_MOUNTAIN, - FEAT_MOUNTAIN, - }, - -}; - - +static s16b terrain_table[MAX_WILDERNESS][MAX_FEAT_IN_TERRAIN]; + +/*! + * @brief èéããã¢çæã®ãµãã«ã¼ãã³ + * @param terrain èéå°å½¢ID + * @param seed ä¹±æ°ã®åºå®ã·ã¼ã + * @param border æªä½¿ç¨ + * @param corner åºåãããã®è§é¨åã¨ãã¦ã®çæãªãã°TRUE + * @return ãªã + */ static void generate_wilderness_area(int terrain, u32b seed, bool border, bool corner) { - int x1, y1; - int table_size = sizeof(terrain_table[0]) / sizeof(int); + POSITION x1, y1; + int table_size = sizeof(terrain_table[0]) / sizeof(s16b); int roughness = 1; /* The roughness of the level. */ + u32b state_backup[4]; /* Unused */ (void)border; @@ -486,7 +220,7 @@ static void generate_wilderness_area(int terrain, u32b seed, bool border, bool c { for (x1 = 0; x1 < MAX_WID; x1++) { - cave[y1][x1].feat = FEAT_PERM_SOLID; + cave[y1][x1].feat = feat_permanent; } } @@ -495,11 +229,11 @@ static void generate_wilderness_area(int terrain, u32b seed, bool border, bool c } - /* Hack -- Use the "simple" RNG */ - Rand_quick = TRUE; + /* Hack -- Backup the RNG state */ + Rand_state_backup(state_backup); - /* Hack -- Induce consistant town layout */ - Rand_value = seed; + /* Hack -- Induce consistant flavors */ + Rand_state_set(seed); if (!corner) { @@ -518,47 +252,74 @@ static void generate_wilderness_area(int terrain, u32b seed, bool border, bool c * ToDo: calculate the medium height of the adjacent * terrains for every corner. */ - cave[1][1].feat = (byte)randint0(table_size); - cave[MAX_HGT-2][1].feat = (byte)randint0(table_size); - cave[1][MAX_WID-2].feat = (byte)randint0(table_size); - cave[MAX_HGT-2][MAX_WID-2].feat = (byte)randint0(table_size); + cave[1][1].feat = (s16b)randint0(table_size); + cave[MAX_HGT-2][1].feat = (s16b)randint0(table_size); + cave[1][MAX_WID-2].feat = (s16b)randint0(table_size); + cave[MAX_HGT-2][MAX_WID-2].feat = (s16b)randint0(table_size); if (!corner) { + /* Hack -- preserve four corners */ + s16b north_west = cave[1][1].feat; + s16b south_west = cave[MAX_HGT - 2][1].feat; + s16b north_east = cave[1][MAX_WID - 2].feat; + s16b south_east = cave[MAX_HGT - 2][MAX_WID - 2].feat; + /* x1, y1, x2, y2, num_depths, roughness */ plasma_recursive(1, 1, MAX_WID-2, MAX_HGT-2, table_size-1, roughness); - } - /* Use the complex RNG */ - Rand_quick = FALSE; + /* Hack -- copyback four corners */ + cave[1][1].feat = north_west; + cave[MAX_HGT - 2][1].feat = south_west; + cave[1][MAX_WID - 2].feat = north_east; + cave[MAX_HGT - 2][MAX_WID - 2].feat = south_east; - for (y1 = 1; y1 < MAX_HGT-1; y1++) - { - for (x1 = 1; x1 < MAX_WID-1; x1++) + for (y1 = 1; y1 < MAX_HGT - 1; y1++) { - cave[y1][x1].feat = terrain_table[terrain][cave[y1][x1].feat]; + for (x1 = 1; x1 < MAX_WID - 1; x1++) + { + cave[y1][x1].feat = terrain_table[terrain][cave[y1][x1].feat]; + } } } + else /* Hack -- only four corners */ + { + cave[1][1].feat = terrain_table[terrain][cave[1][1].feat]; + cave[MAX_HGT - 2][1].feat = terrain_table[terrain][cave[MAX_HGT - 2][1].feat]; + cave[1][MAX_WID - 2].feat = terrain_table[terrain][cave[1][MAX_WID - 2].feat]; + cave[MAX_HGT - 2][MAX_WID - 2].feat = terrain_table[terrain][cave[MAX_HGT - 2][MAX_WID - 2].feat]; + } + + /* Hack -- Restore the RNG state */ + Rand_state_restore(state_backup); } -/* +/*! + * @brief èéããã¢çæã®ã¡ã¤ã³ã«ã¼ãã³ / * Load a town or generate a terrain level using "plasma" fractals. - * + * @param y åºåãããYåº§æ¨ + * @param x åºåãããYåº§æ¨ + * @param border åºåãããã®è¾ºé¨åã¨ãã¦ã®çæãªãã°TRUE + * @param corner åºåãããã®è§é¨åã¨ãã¦ã®çæãªãã°TRUE + * @return ãªã + * @details + *
* 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. + **/ -static void generate_area(int y, int x, bool border, bool corner) +static void generate_area(POSITION y, POSITION x, bool border, bool corner) { - int x1, y1; + POSITION x1, y1; /* Number of the town (if any) */ - p_ptr->town_num = wilderness[y][x].town; + p_ptr->town_num = (s16b)wilderness[y][x].town; /* Set the base level */ base_level = wilderness[y][x].level; @@ -605,7 +366,7 @@ static void generate_area(int y, int x, bool border, bool corner) */ if (wilderness[y][x].road) { - cave[MAX_HGT/2][MAX_WID/2].feat = FEAT_FLOOR; + cave[MAX_HGT/2][MAX_WID/2].feat = feat_floor; if (wilderness[y-1][x].road) { @@ -613,7 +374,7 @@ static void generate_area(int y, int x, bool border, bool corner) for (y1 = 1; y1 < MAX_HGT/2; y1++) { x1 = MAX_WID/2; - cave[y1][x1].feat = FEAT_FLOOR; + cave[y1][x1].feat = feat_floor; } } @@ -623,7 +384,7 @@ static void generate_area(int y, int x, bool border, bool corner) for (y1 = MAX_HGT/2; y1 < MAX_HGT - 1; y1++) { x1 = MAX_WID/2; - cave[y1][x1].feat = FEAT_FLOOR; + cave[y1][x1].feat = feat_floor; } } @@ -633,7 +394,7 @@ static void generate_area(int y, int x, bool border, bool corner) for (x1 = MAX_WID/2; x1 < MAX_WID - 1; x1++) { y1 = MAX_HGT/2; - cave[y1][x1].feat = FEAT_FLOOR; + cave[y1][x1].feat = feat_floor; } } @@ -643,7 +404,7 @@ static void generate_area(int y, int x, bool border, bool corner) for (x1 = 1; x1 < MAX_WID/2; x1++) { y1 = MAX_HGT/2; - cave[y1][x1].feat = FEAT_FLOOR; + cave[y1][x1].feat = feat_floor; } } } @@ -652,21 +413,22 @@ static void generate_area(int y, int x, bool border, bool corner) if (wilderness[y][x].entrance && !wilderness[y][x].town && (p_ptr->total_winner || !(d_info[wilderness[y][x].entrance].flags1 & DF1_WINNER))) { int dy, dx; + u32b state_backup[4]; - /* Hack -- Use the "simple" RNG */ - Rand_quick = TRUE; + /* Hack -- Backup the RNG state */ + Rand_state_backup(state_backup); - /* Hack -- Induce consistant town layout */ - Rand_value = wilderness[y][x].seed; + /* Hack -- Induce consistant flavors */ + Rand_state_set(wilderness[y][x].seed); dy = rand_range(6, cur_hgt - 6); dx = rand_range(6, cur_wid - 6); - cave[dy][dx].feat = FEAT_ENTRANCE; - cave[dy][dx].special = (byte)wilderness[y][x].entrance; + cave[dy][dx].feat = feat_entrance; + cave[dy][dx].special = wilderness[y][x].entrance; - /* Use the complex RNG */ - Rand_quick = FALSE; + /* Hack -- Restore the RNG state */ + Rand_state_restore(state_backup); } } @@ -677,13 +439,16 @@ static void generate_area(int y, int x, bool border, bool corner) static border_type border; -/* +/*! + * @brief åºåãããã®çæ / * Build the wilderness area outside of the town. + * @return ãªã */ void wilderness_gen(void) { int i, y, x, lim; cave_type *c_ptr; + feature_type *f_ptr; /* Big town */ cur_hgt = MAX_HGT; @@ -759,28 +524,28 @@ void wilderness_gen(void) /* Special boundary walls -- North */ for (i = 0; i < MAX_WID; i++) { - cave[0][i].feat = FEAT_PERM_SOLID; + cave[0][i].feat = feat_permanent; cave[0][i].mimic = border.north[i]; } /* Special boundary walls -- South */ for (i = 0; i < MAX_WID; i++) { - cave[MAX_HGT - 1][i].feat = FEAT_PERM_SOLID; + cave[MAX_HGT - 1][i].feat = feat_permanent; cave[MAX_HGT - 1][i].mimic = border.south[i]; } /* Special boundary walls -- West */ for (i = 0; i < MAX_HGT; i++) { - cave[i][0].feat = FEAT_PERM_SOLID; + cave[i][0].feat = feat_permanent; cave[i][0].mimic = border.west[i]; } /* Special boundary walls -- East */ for (i = 0; i < MAX_HGT; i++) { - cave[i][MAX_WID - 1].feat = FEAT_PERM_SOLID; + cave[i][MAX_WID - 1].feat = feat_permanent; cave[i][MAX_WID - 1].mimic = border.east[i]; } @@ -815,24 +580,22 @@ void wilderness_gen(void) else { /* Feature code (applying "mimic" field) */ - byte feat = f_info[c_ptr->mimic ? c_ptr->mimic : c_ptr->feat].mimic; + f_ptr = &f_info[get_feat_mimic(c_ptr)]; - if (!is_mirror_grid(c_ptr) && (feat != FEAT_QUEST_ENTER) && (feat != FEAT_ENTRANCE)) + if (!is_mirror_grid(c_ptr) && !have_flag(f_ptr->flags, FF_QUEST_ENTER) && + !have_flag(f_ptr->flags, FF_ENTRANCE)) { /* Assume dark */ c_ptr->info &= ~(CAVE_GLOW); /* Darken "boring" features */ - if ((feat <= FEAT_INVIS) || - ((feat >= FEAT_DEEP_WATER) && - (feat <= FEAT_MOUNTAIN) && - (feat != FEAT_MUSEUM))) + if (!have_flag(f_ptr->flags, FF_REMEMBER)) { /* Forget the grid */ c_ptr->info &= ~(CAVE_MARK); } } - else if (feat == FEAT_ENTRANCE) + else if (have_flag(f_ptr->flags, FF_ENTRANCE)) { /* Assume lit */ c_ptr->info |= (CAVE_GLOW); @@ -850,11 +613,20 @@ void wilderness_gen(void) { for (x = 0; x < cur_wid; x++) { - if (((cave[y][x].feat - FEAT_BLDG_HEAD) == 4) || ((p_ptr->town_num == 1) && ((cave[y][x].feat - FEAT_BLDG_HEAD) == 0))) + /* Get the cave grid */ + c_ptr = &cave[y][x]; + + /* Seeing true feature code (ignore mimic) */ + f_ptr = &f_info[c_ptr->feat]; + + if (have_flag(f_ptr->flags, FF_BLDG)) { - if (cave[y][x].m_idx) delete_monster_idx(cave[y][x].m_idx); - p_ptr->oldpy = y; - p_ptr->oldpx = x; + if ((f_ptr->subtype == 4) || ((p_ptr->town_num == 1) && (f_ptr->subtype == 0))) + { + if (c_ptr->m_idx) delete_monster_idx(c_ptr->m_idx); + p_ptr->oldpy = (s16b)y; + p_ptr->oldpx = (s16b)x; + } } } } @@ -867,11 +639,14 @@ void wilderness_gen(void) { for (x = 0; x < cur_wid; x++) { - if (cave[y][x].feat == FEAT_ENTRANCE) + /* Get the cave grid */ + c_ptr = &cave[y][x]; + + if (cave_have_flag_grid(c_ptr, FF_ENTRANCE)) { - if (cave[y][x].m_idx) delete_monster_idx(cave[y][x].m_idx); - p_ptr->oldpy = y; - p_ptr->oldpx = x; + if (c_ptr->m_idx) delete_monster_idx(c_ptr->m_idx); + p_ptr->oldpy = (s16b)y; + p_ptr->oldpx = (s16b)x; } } } @@ -879,15 +654,14 @@ void wilderness_gen(void) } player_place(p_ptr->oldpy, p_ptr->oldpx); - p_ptr->leftbldg = FALSE; /* p_ptr->leaving_dungeon = FALSE;*/ - lim = (generate_encounter==TRUE)?40:MIN_M_ALLOC_TN; + lim = (generate_encounter == TRUE) ? 40 : MIN_M_ALLOC_TN; /* Make some residents */ for (i = 0; i < lim; i++) { - u32b mode = 0; + BIT_FLAGS mode = 0; if (!(generate_encounter || (one_in_(2) && (!p_ptr->town_num)))) mode |= PM_ALLOW_SLEEP; @@ -903,7 +677,7 @@ void wilderness_gen(void) set_floor_and_wall(0); /* Set rewarded quests to finished */ - for (i = 0; i < max_quests; i++) + for (i = 0; i < max_q_idx; i++) { if (quest[i].status == QUEST_STATUS_REWARDED) quest[i].status = QUEST_STATUS_FINISHED; @@ -911,11 +685,14 @@ void wilderness_gen(void) } -/* - * Build the wilderness area. - * -DG- +static s16b conv_terrain2feat[MAX_WILDERNESS]; + +/*! + * @brief åºåãããã®çæ(ç°¡æå¦çç) / + * Build the wilderness area. -DG- + * @return ãªã */ -void wilderness_gen_small() +void wilderness_gen_small(void) { int i, j; @@ -923,7 +700,7 @@ void wilderness_gen_small() for (i = 0; i < MAX_WID; i++) for (j = 0; j < MAX_HGT; j++) { - cave[j][i].feat = FEAT_PERM_SOLID; + cave[j][i].feat = feat_permanent; } /* Init the wilderness */ @@ -935,13 +712,13 @@ void wilderness_gen_small() { if (wilderness[j][i].town && (wilderness[j][i].town != NO_TOWN)) { - cave[j][i].feat = FEAT_TOWN; - cave[j][i].special = wilderness[j][i].town; + cave[j][i].feat = (s16b)feat_town; + cave[j][i].special = (s16b)wilderness[j][i].town; } - else if (wilderness[j][i].road) cave[j][i].feat = FEAT_FLOOR; + else if (wilderness[j][i].road) cave[j][i].feat = feat_floor; else if (wilderness[j][i].entrance && (p_ptr->total_winner || !(d_info[wilderness[j][i].entrance].flags1 & DF1_WINNER))) { - cave[j][i].feat = FEAT_ENTRANCE; + cave[j][i].feat = feat_entrance; cave[j][i].special = (byte)wilderness[j][i].entrance; } else cave[j][i].feat = conv_terrain2feat[wilderness[j][i].terrain]; @@ -960,8 +737,8 @@ void wilderness_gen_small() panel_col_min = cur_wid; /* Place the player */ - px = p_ptr->wilderness_x; - py = p_ptr->wilderness_y; + p_ptr->x = p_ptr->wilderness_x; + p_ptr->y = p_ptr->wilderness_y; p_ptr->town_num = 0; } @@ -982,8 +759,17 @@ struct wilderness_grid static wilderness_grid w_letter[255]; -/* +/*! + * @brief w_info.txtã®ãã¼ã¿è§£æ / * Parse a sub-file of the "extra info" + * @param buf èªã¿åã£ããã¼ã¿è¡ã®ãããã¡ + * @param ymin æªä½¿ç¨ + * @param xmin åºåå°å½¢ããããèªã¿è¾¼ã¿ããx座æ¨ã®éå§ä½ç½® + * @param ymax æªä½¿ç¨ + * @param xmax åºåå°å½¢ããããèªã¿è¾¼ã¿ããx座æ¨ã®çµäºä½ç½® + * @param y åºåãããã®é«ããè¿ãåç §ãã¤ã³ã¿ + * @param x åºåãããã®å¹ ãè¿ãåç §ãã¤ã³ã¿ + * @return ãªã */ errr parse_line_wilderness(char *buf, int ymin, int xmin, int ymax, int xmax, int *y, int *x) { @@ -1022,7 +808,7 @@ errr parse_line_wilderness(char *buf, int ymin, int xmin, int ymax, int xmax, in w_letter[index].terrain = 0; if (num > 2) - w_letter[index].level = atoi(zz[2]); + w_letter[index].level = (s16b)atoi(zz[2]); else w_letter[index].level = 0; @@ -1032,7 +818,7 @@ errr parse_line_wilderness(char *buf, int ymin, int xmin, int ymax, int xmax, in w_letter[index].town = 0; if (num > 4) - w_letter[index].road = atoi(zz[4]); + w_letter[index].road = (byte_hack)atoi(zz[4]); else w_letter[index].road = 0; @@ -1062,17 +848,12 @@ errr parse_line_wilderness(char *buf, int ymin, int xmin, int ymax, int xmax, in for (*x = xmin, i = 0; ((*x < xmax) && (i < len)); (*x)++, s++, i++) { - int idx = s[0]; - - wilderness[*y][*x].terrain = w_letter[idx].terrain; - - wilderness[*y][*x].level = w_letter[idx].level; - - wilderness[*y][*x].town = w_letter[idx].town; - - wilderness[*y][*x].road = w_letter[idx].road; - - strcpy(town[w_letter[idx].town].name, w_letter[idx].name); + int id = s[0]; + wilderness[*y][*x].terrain = w_letter[id].terrain; + wilderness[*y][*x].level = w_letter[id].level; + wilderness[*y][*x].town = w_letter[id].town; + wilderness[*y][*x].road = w_letter[id].road; + strcpy(town[w_letter[id].town].name, w_letter[id].name); } (*y)++; @@ -1116,7 +897,7 @@ errr parse_line_wilderness(char *buf, int ymin, int xmin, int ymax, int xmax, in for (i = 1; i < max_d_idx; i++) { if (!d_info[i].maxdepth) continue; - wilderness[d_info[i].dy][d_info[i].dx].entrance = i; + wilderness[d_info[i].dy][d_info[i].dx].entrance = (byte_hack)i; if (!wilderness[d_info[i].dy][d_info[i].dx].town) wilderness[d_info[i].dy][d_info[i].dx].level = d_info[i].mindepth; } @@ -1126,12 +907,15 @@ errr parse_line_wilderness(char *buf, int ymin, int xmin, int ymax, int xmax, in } -/* + +/*! + * @brief ã²ã¼ã éå§æã«åèéããã¢ã®ä¹±æ°ã·ã¼ããæå®ãã / * Generate the random seeds for the wilderness + * @return ãªã */ void seed_wilderness(void) { - int x, y; + POSITION x, y; /* Init wilderness seeds */ for (x = 0; x < max_wild_x; x++) @@ -1150,8 +934,11 @@ void seed_wilderness(void) */ typedef wilderness_type *wilderness_type_ptr; -/* + +/*! + * @brief ã²ã¼ã éå§æã®èéåæåã¡ã¤ã³ã«ã¼ãã³ / * Initialize wilderness array + * @return ã¨ã©ã¼ã³ã¼ã */ errr init_wilderness(void) { @@ -1170,63 +957,238 @@ errr init_wilderness(void) return 0; } +/*! + * @brief èéã®å°å¢è¨å®ãåæåãã / + * Initialize wilderness array + * @param terrain åæåãããå°å¢ID + * @param feat_global åºæ¬çãªå°å½¢ID + * @param fmt å°å¢å ã®å°å½¢æ°ãåç §ããããã®ç¬èªãã©ã¼ããã + * @return ãªã + */ +static void init_terrain_table(int terrain, s16b feat_global, concptr fmt, ...) +{ + va_list vp; + concptr p; + int cur = 0; + char check = 'a'; + FEAT_IDX feat; + int num; + + /* Begin the varargs stuff */ + va_start(vp, fmt); + + /* Wilderness terrains on global map */ + conv_terrain2feat[terrain] = feat_global; + + /* Wilderness terrains on local map */ + for (p = fmt; *p; p++) + { + if (*p == check) + { + int lim; + + feat = (s16b)va_arg(vp, int); + num = va_arg(vp, int); + lim = cur + num; + + for (; (cur < lim) && (cur < MAX_FEAT_IN_TERRAIN); cur++) + terrain_table[terrain][cur] = feat; + if (cur >= MAX_FEAT_IN_TERRAIN) break; + + check++; + } + else /* Paranoia */ + { + plog_fmt("Format error"); + } + } + + /* Paranoia */ + if (cur < MAX_FEAT_IN_TERRAIN) + { + plog_fmt("Too few parameters"); + } + + /* End the varargs stuff */ + va_end(vp); +} + +/*! + * @brief èéã®å°å¢è¨å®å ¨ä½ãåæåããã¡ã¤ã³ã«ã¼ãã³ / + * Initialize arrays for wilderness terrains + * @return ãªã + */ +void init_wilderness_terrains(void) +{ + init_terrain_table(TERRAIN_EDGE, feat_permanent, "a", + feat_permanent, MAX_FEAT_IN_TERRAIN); + + init_terrain_table(TERRAIN_TOWN, feat_town, "a", + feat_floor, MAX_FEAT_IN_TERRAIN); + + init_terrain_table(TERRAIN_DEEP_WATER, feat_deep_water, "ab", + feat_deep_water, 12, + feat_shallow_water, MAX_FEAT_IN_TERRAIN - 12); + + init_terrain_table(TERRAIN_SHALLOW_WATER, feat_shallow_water, "abcde", + feat_deep_water, 3, + feat_shallow_water, 12, + feat_floor, 1, + feat_dirt, 1, + feat_grass, MAX_FEAT_IN_TERRAIN - 17); + + init_terrain_table(TERRAIN_SWAMP, feat_swamp, "abcdef", + feat_dirt, 2, + feat_grass, 3, + feat_tree, 1, + feat_brake, 1, + feat_shallow_water, 4, + feat_swamp, MAX_FEAT_IN_TERRAIN - 11); + + init_terrain_table(TERRAIN_DIRT, feat_dirt, "abcdef", + feat_floor, 3, + feat_dirt, 10, + feat_flower, 1, + feat_brake, 1, + feat_grass, 1, + feat_tree, MAX_FEAT_IN_TERRAIN - 16); + + init_terrain_table(TERRAIN_GRASS, feat_grass, "abcdef", + feat_floor, 2, + feat_dirt, 2, + feat_grass, 9, + feat_flower, 1, + feat_brake, 2, + feat_tree, MAX_FEAT_IN_TERRAIN - 16); + + init_terrain_table(TERRAIN_TREES, feat_tree, "abcde", + feat_floor, 2, + feat_dirt, 1, + feat_tree, 11, + feat_brake, 2, + feat_grass, MAX_FEAT_IN_TERRAIN - 16); + + init_terrain_table(TERRAIN_DESERT, feat_dirt, "abc", + feat_floor, 2, + feat_dirt, 13, + feat_grass, MAX_FEAT_IN_TERRAIN - 15); + + init_terrain_table(TERRAIN_SHALLOW_LAVA, feat_shallow_lava, "abc", + feat_shallow_lava, 14, + feat_deep_lava, 3, + feat_mountain, MAX_FEAT_IN_TERRAIN - 17); + + init_terrain_table(TERRAIN_DEEP_LAVA, feat_deep_lava, "abcd", + feat_dirt, 3, + feat_shallow_lava, 3, + feat_deep_lava, 10, + feat_mountain, MAX_FEAT_IN_TERRAIN - 16); + + init_terrain_table(TERRAIN_MOUNTAIN, feat_mountain, "abcdef", + feat_floor, 1, + feat_brake, 1, + feat_grass, 2, + feat_dirt, 2, + feat_tree, 2, + feat_mountain, MAX_FEAT_IN_TERRAIN - 8); +} + +/*! + * @brief èéããåºåãããã¸ã®åãæ¿ãå¦ç / + * Initialize arrays for wilderness terrains + * @return åãæ¿ããè¡ãããå ´åã¯TRUEãè¿ãã + */ bool change_wild_mode(void) { int i; bool have_pet = FALSE; + /* It is in the middle of changing map */ + if (p_ptr->leaving) return FALSE; + + if (lite_town || vanilla_town) { #ifdef JP - msg_print("¹ÓÌî¤Ê¤ó¤Æ¤Ê¤¤¡£"); + msg_print("èéãªãã¦ãªãã"); #else - msg_print("No global mal"); + msg_print("No global map."); #endif return FALSE; } - if (!p_ptr->wild_mode) + + if (p_ptr->wild_mode) + { + /* Save the location in the global map */ + p_ptr->wilderness_x = p_ptr->x; + p_ptr->wilderness_y = p_ptr->y; + + /* Give first move to the player */ + p_ptr->energy_need = 0; + + /* Go back to the ordinary map */ + p_ptr->wild_mode = FALSE; + + /* Leaving */ + p_ptr->leaving = TRUE; + + /* Succeed */ + return TRUE; + } + + for (i = 1; i < m_max; i++) { - for (i = 1; i < m_max; i++) - { - monster_type *m_ptr = &m_list[i]; + monster_type *m_ptr = &m_list[i]; - if (!m_ptr->r_idx) continue; - if (is_pet(m_ptr) && i != p_ptr->riding) have_pet = TRUE; - if (m_ptr->csleep) continue; - if (m_ptr->cdis > MAX_SIGHT) continue; - if (!is_hostile(m_ptr)) continue; + if (!m_ptr->r_idx) continue; + if (is_pet(m_ptr) && i != p_ptr->riding) have_pet = TRUE; + if (MON_CSLEEP(m_ptr)) continue; + if (m_ptr->cdis > MAX_SIGHT) continue; + if (!is_hostile(m_ptr)) continue; #ifdef JP - msg_print("Ũ¤¬¤¹¤°¶á¤¯¤Ë¤¤¤ë¤È¤¤Ï¹°è¥Þ¥Ã¥×¤ËÆþ¤ì¤Ê¤¤¡ª"); + msg_print("æµãããè¿ãã«ããã¨ãã¯åºåãããã«å ¥ããªãï¼"); #else - msg_print("You cannot enter global map, since there is some monsters nearby!"); + msg_print("You cannot enter global map, since there is some monsters nearby!"); #endif - energy_use = 0; - return FALSE; - } + p_ptr->energy_use = 0; + return FALSE; + } - if (have_pet) - { + if (have_pet) + { #ifdef JP - if(!get_check_strict("¥Ú¥Ã¥È¤òÃÖ¤¤¤Æ¹°è¥Þ¥Ã¥×¤ËÆþ¤ê¤Þ¤¹¤«¡©", CHECK_OKAY_CANCEL)) + concptr msg = "ããããç½®ãã¦åºåãããã«å ¥ãã¾ããï¼"; #else - if(!get_check_strict("Do you leave your pets behind? ", CHECK_OKAY_CANCEL)) + concptr msg = "Do you leave your pets behind? "; #endif - { - energy_use = 0; - return FALSE; - } - } - energy_use = 1000; + if (!get_check_strict(msg, CHECK_OKAY_CANCEL)) + { + p_ptr->energy_use = 0; + return FALSE; + } } + /* HACK */ + p_ptr->energy_use = 1000; + + /* Remember the position */ + p_ptr->oldpx = p_ptr->x; + p_ptr->oldpy = p_ptr->y; + + /* Cancel hex spelling */ + if (hex_spelling_any()) stop_hex_spell_all(); + + /* Cancel any special action */ set_action(ACTION_NONE); - p_ptr->wild_mode = !p_ptr->wild_mode; + /* Go into the global map */ + p_ptr->wild_mode = TRUE; /* Leaving */ p_ptr->leaving = TRUE; + /* Succeed */ return TRUE; }