OSDN Git Service

[Refactor] #3248 荒野の広さを表す定数をmisc.txt からWildernessDefinition.txt に移し、misc.txt を廃止した
authorHourier <66951241+Hourier@users.noreply.github.com>
Wed, 3 May 2023 04:53:36 +0000 (13:53 +0900)
committerHourier <66951241+Hourier@users.noreply.github.com>
Wed, 3 May 2023 06:58:47 +0000 (15:58 +0900)
lib/edit/WildernessDefinition.txt
lib/edit/misc.txt [deleted file]
src/floor/fixed-map-generator.cpp
src/floor/wild.cpp
src/floor/wild.h
src/main/angband-initializer.cpp
src/main/info-initializer.cpp
src/main/info-initializer.h

index aba5731..0d6d103 100644 (file)
@@ -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 (file)
index 1e0cc77..0000000
+++ /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
index 453f160..06c6364 100644 (file)
@@ -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;
     }
 
index d0894ae..3766b9d 100644 (file)
@@ -52,7 +52,7 @@
 constexpr auto MAX_FEAT_IN_TERRAIN = 18;
 
 std::vector<std::vector<wilderness_type>> 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<wilderness_type>(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
index 1bdc6fd..6637bcc 100644 (file)
@@ -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);
index a41f662..87d0c31 100644 (file)
@@ -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"));
     }
 
index 3ecddc7..4537ba3 100644 (file)
@@ -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"
 #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 <fstream>
+#include <string>
+#include <string_view>
 #include <sys/stat.h>
 #ifndef WINDOWS
 #include <sys/types.h>
 #endif
-#include <string_view>
 
 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<wilderness_type>(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);
 }
index 0fd7abe..8395d0d 100644 (file)
@@ -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();