From: Hourier <66951241+Hourier@users.noreply.github.com> Date: Wed, 3 May 2023 04:53:36 +0000 (+0900) Subject: [Refactor] #3248 荒野の広さを表す定数をmisc.txt からWildernessDefinition.txt に移し、misc.txt を廃止した X-Git-Tag: 3.0.0Alpha81^2~6^2 X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=fddcd1fedad1a9fcb94318ff2e22aed04848b5b0;p=hengbandforosx%2Fhengbandosx.git [Refactor] #3248 荒野の広さを表す定数をmisc.txt からWildernessDefinition.txt に移し、misc.txt を廃止した --- diff --git a/lib/edit/WildernessDefinition.txt b/lib/edit/WildernessDefinition.txt index aba573130..0d6d1033c 100644 --- a/lib/edit/WildernessDefinition.txt +++ b/lib/edit/WildernessDefinition.txt @@ -6,6 +6,12 @@ # Road Flags: Sum of NORTH 1, SOUTH 2, EAST 4, WEST 8 +# Maximum width +M:WX:99 + +# Maximum height +M:WY:66 + ?:[EQU $WILDERNESS NORMAL] # Edge of the world diff --git a/lib/edit/misc.txt b/lib/edit/misc.txt deleted file mode 100644 index 1e0cc776d..000000000 --- a/lib/edit/misc.txt +++ /dev/null @@ -1,7 +0,0 @@ -# File: misc.txt - -# Maximum x size of the wilderness -M:WX:99 - -# Maximum y size of the wilderness -M:WY:66 diff --git a/src/floor/fixed-map-generator.cpp b/src/floor/fixed-map-generator.cpp index 453f160c7..06c636477 100644 --- a/src/floor/fixed-map-generator.cpp +++ b/src/floor/fixed-map-generator.cpp @@ -386,29 +386,6 @@ static bool parse_qtw_P(PlayerType *player_ptr, qtwg_type *qtwg_ptr, char **zz) return true; } -static bool parse_qtw_M(qtwg_type *qtwg_ptr, char **zz) -{ - if (qtwg_ptr->buf[0] != 'M') { - return false; - } - - if ((tokenize(qtwg_ptr->buf + 2, 2, zz, 0) == 2) == 0) { - return true; - } - - if (zz[0][0] == 'W') { - if (zz[0][1] == 'X') { - w_ptr->max_wild_x = (POSITION)atoi(zz[1]); - } - - if (zz[0][1] == 'Y') { - w_ptr->max_wild_y = (POSITION)atoi(zz[1]); - } - } - - return true; -} - /*! * @brief 固定マップ (クエスト&街&広域マップ)をフロアに生成する * Parse a sub-file of the "extra info" @@ -479,7 +456,8 @@ parse_error_type generate_fixed_map_floor(PlayerType *player_ptr, qtwg_type *qtw return parse_line_building(qtwg_ptr->buf); } - if (parse_qtw_M(qtwg_ptr, zz)) { + // 荒野の広さを表すタグ。初期化時に読み込むのでそれ以降は無視する. + if (qtwg_ptr->buf[0] == 'M') { return PARSE_ERROR_NONE; } diff --git a/src/floor/wild.cpp b/src/floor/wild.cpp index d0894ae7b..3766b9d6d 100644 --- a/src/floor/wild.cpp +++ b/src/floor/wild.cpp @@ -52,7 +52,7 @@ constexpr auto MAX_FEAT_IN_TERRAIN = 18; std::vector> wilderness; -bool generate_encounter; +static bool generate_encounter; struct border_type { int16_t north[MAX_WID]; @@ -808,19 +808,6 @@ void seed_wilderness(void) } /*! - * @brief ゲーム開始時の荒野初期化メインルーチン / - * Initialize wilderness array - * @return エラーコード - */ -errr init_wilderness(void) -{ - wilderness.assign(w_ptr->max_wild_y, std::vector(w_ptr->max_wild_x)); - - generate_encounter = false; - return 0; -} - -/*! * @brief 荒野の地勢設定を初期化する / * Initialize wilderness array * @param terrain 初期化したい地勢ID @@ -887,6 +874,11 @@ void init_wilderness_terrains(void) MAX_FEAT_IN_TERRAIN - 8); } +void init_wilderness_encounter() +{ + generate_encounter = false; +} + /*! * @brief 荒野から広域マップへの切り替え処理 / * Initialize arrays for wilderness terrains diff --git a/src/floor/wild.h b/src/floor/wild.h index 1bdc6fd1a..6637bcc69 100644 --- a/src/floor/wild.h +++ b/src/floor/wild.h @@ -40,8 +40,8 @@ class PlayerType; void set_floor_and_wall(DUNGEON_IDX type); void wilderness_gen(PlayerType *player_ptr); void wilderness_gen_small(PlayerType *player_ptr); -errr init_wilderness(void); -void init_wilderness_terrains(void); +void init_wilderness_terrains(); +void init_wilderness_encounter(); void seed_wilderness(void); parse_error_type parse_line_wilderness(PlayerType *player_ptr, char *buf, int xmin, int xmax, int *y, int *x); bool change_wild_mode(PlayerType *player_ptr, bool encount); diff --git a/src/main/angband-initializer.cpp b/src/main/angband-initializer.cpp index a41f662d2..87d0c31a0 100644 --- a/src/main/angband-initializer.cpp +++ b/src/main/angband-initializer.cpp @@ -224,11 +224,6 @@ void init_angband(PlayerType *player_ptr, bool no_term) void (*init_note)(concptr) = (no_term ? init_note_no_term : init_note_term); - init_note(_("[変数を初期化しています...(その他)", "[Initializing values... (misc)]")); - if (init_misc(player_ptr)) { - quit(_("その他の変数を初期化できません", "Cannot initialize misc. values")); - } - init_note(_("[データの初期化中... (地形)]", "[Initializing arrays... (features)]")); if (init_terrains_info()) { quit(_("地形初期化不能", "Cannot initialize features")); @@ -280,7 +275,7 @@ void init_angband(PlayerType *player_ptr, bool no_term) } init_note(_("[配列を初期化しています... (荒野)]", "[Initializing arrays... (wilderness)]")); - if (init_wilderness()) { + if (!init_wilderness()) { quit(_("荒野を初期化できません", "Cannot initialize wilderness")); } diff --git a/src/main/info-initializer.cpp b/src/main/info-initializer.cpp index 3ecddc768..4537ba308 100644 --- a/src/main/info-initializer.cpp +++ b/src/main/info-initializer.cpp @@ -4,6 +4,7 @@ */ #include "main/info-initializer.h" +#include "floor/wild.h" #include "info-reader/artifact-reader.h" #include "info-reader/baseitem-reader.h" #include "info-reader/dungeon-reader.h" @@ -33,13 +34,16 @@ #include "system/player-type-definition.h" #include "system/terrain-type-definition.h" #include "util/angband-files.h" +#include "util/string-processor.h" #include "view/display-messages.h" #include "world/world.h" +#include +#include +#include #include #ifndef WINDOWS #include #endif -#include namespace { @@ -228,12 +232,53 @@ errr init_vaults_info() return init_info("VaultDefinitions.txt", vaults_header, vaults_info, parse_vaults_info); } +static bool read_wilderness_definition(std::ifstream &ifs) +{ + std::string line; + while (!ifs.eof()) { + if (!std::getline(ifs, line)) { + return false; + } + + if (line.empty() || line.starts_with('#')) { + continue; + } + + auto splits = str_split(line, ':'); + if ((splits.size() != 3) || (splits[0] != "M")) { + continue; + } + + if (splits[1] == "WX") { + w_ptr->max_wild_x = std::stoi(splits[2]); + } else if (splits[1] == "WY") { + w_ptr->max_wild_y = std::stoi(splits[2]); + } else { + return false; + } + + if ((w_ptr->max_wild_x > 0) && (w_ptr->max_wild_y > 0)) { + wilderness.assign(w_ptr->max_wild_y, std::vector(w_ptr->max_wild_x)); + init_wilderness_encounter(); + return true; + } + } + + return false; +} + /*! - * @brief 基本情報読み込みのメインルーチン - * @param player_ptr プレイヤーへの参照ポインタ - * @return エラーコード + * @brief 荒野情報読み込み処理 + * @return 読み込みに成功したか */ -errr init_misc(PlayerType *player_ptr) +bool init_wilderness() { - return parse_fixed_map(player_ptr, "misc.txt", 0, 0, 0, 0); + char path[1024]{}; + path_build(path, sizeof(path), ANGBAND_DIR_EDIT, WILDERNESS_DEFINITION); + std::ifstream ifs(path); + if (!ifs) { + return false; + } + + return read_wilderness_definition(ifs); } diff --git a/src/main/info-initializer.h b/src/main/info-initializer.h index 0fd7abe07..8395d0d47 100644 --- a/src/main/info-initializer.h +++ b/src/main/info-initializer.h @@ -16,4 +16,4 @@ errr init_egos_info(); errr init_monster_race_definitions(); errr init_terrains_info(); errr init_vaults_info(); -errr init_misc(PlayerType *player_ptr); +bool init_wilderness();