OSDN Git Service

[Fix] アイテム破壊時に自動破壊登録すると自動拾いファイルがリセットされる
authorHabu <habu1010+github@gmail.com>
Sat, 14 Oct 2023 04:22:20 +0000 (13:22 +0900)
committerHabu <habu1010+github@gmail.com>
Sat, 14 Oct 2023 12:20:07 +0000 (21:20 +0900)
自動破壊登録時に自動拾いファイルをpicktype-プレイヤー名.prf、picktype.prf
の順に探しているが、後者のみ存在する場合後者のパスを変数に再代入するのを
忘れているため前者のファイルに対して自動破壊を登録してしまう。
その結果自動破壊のみが登録されたpicktype-プレイヤー名.prfが新しく作られ
てしまう。
他にも上述の順序で自動拾いファイルを決定している場所があるので、この際
自動拾いファイルを決定する処理を search_pickpref_path() に関数化し、
それを使用するようにすることで修正とする。

src/autopick/autopick-reader-writer.cpp
src/autopick/autopick-reader-writer.h
src/autopick/autopick-registry.cpp

index 81f093a..3f1b2dc 100644 (file)
  */
 void autopick_load_pref(PlayerType *player_ptr, bool disp_mes)
 {
-    GAME_TEXT buf[80];
     init_autopick();
-    angband_strcpy(buf, pickpref_filename(player_ptr, PT_WITH_PNAME), sizeof(buf));
-    errr err = process_autopick_file(player_ptr, buf);
-    if (err == 0 && disp_mes) {
-        msg_format(_("%sを読み込みました。", "Loaded '%s'."), buf);
-    }
 
-    if (err < 0) {
-        angband_strcpy(buf, pickpref_filename(player_ptr, PT_DEFAULT), sizeof(buf));
-        err = process_autopick_file(player_ptr, buf);
-        if (err == 0 && disp_mes) {
-            msg_format(_("%sを読み込みました。", "Loaded '%s'."), buf);
+    const auto path = search_pickpref_path(player_ptr);
+    if (!path.empty()) {
+        const auto pickpref_filename = path.filename().string();
+        if (process_autopick_file(player_ptr, pickpref_filename) == 0) {
+            if (disp_mes) {
+                msg_format(_("%sを読み込みました。", "Loaded '%s'."), pickpref_filename.data());
+            }
+            return;
         }
     }
 
-    if (err && disp_mes) {
+    if (disp_mes) {
         msg_print(_("自動拾い設定ファイルの読み込みに失敗しました。", "Failed to reload autopick preference."));
     }
 }
 
 /*!
+ * @brief 自動拾い設定ファイルのパスを返す
+ *
+ * ユーザディレクトリを "picktype-プレイヤー名.prf"、"picktype.prf" の順にファイルが存在するかどうかを確認し、
+ * 存在した場合はそのパスを返す。どちらも存在しない場合は空のパスを返す。
+ *
+ * @return 見つかった自動拾い設定ファイルのパス。見つからなかった場合は空のパス。
+ */
+std::filesystem::path search_pickpref_path(PlayerType *player_ptr)
+{
+    for (const auto filename_mode : { PT_WITH_PNAME, PT_DEFAULT }) {
+        const auto filename = pickpref_filename(player_ptr, filename_mode);
+        const auto path = path_build(ANGBAND_DIR_USER, filename);
+        if (std::filesystem::exists(path)) {
+            return path;
+        }
+    }
+
+    return {};
+}
+
+/*!
  * @brief Get file name for autopick preference
  */
 std::string pickpref_filename(PlayerType *player_ptr, int filename_mode)
index 9b13350..c912d14 100644 (file)
@@ -1,12 +1,14 @@
 #pragma once
 
 #include "system/angband.h"
+#include <filesystem>
 #include <string>
 #include <string_view>
 #include <vector>
 
 class PlayerType;
 void autopick_load_pref(PlayerType *player_ptr, bool disp_mes);
+std::filesystem::path search_pickpref_path(PlayerType *player_ptr);
 std::vector<concptr> read_pickpref_text_lines(PlayerType *player_ptr, int *filename_mode_p);
 bool write_text_lines(std::string_view filename, const std::vector<concptr> &lines);
 std::string pickpref_filename(PlayerType *player_ptr, int filename_mode);
index 0e6ba47..ec6ec37 100644 (file)
@@ -28,13 +28,11 @@ static const char autoregister_header[] = "?:$AUTOREGISTER";
  */
 static bool clear_auto_register(PlayerType *player_ptr)
 {
-    auto path_pref = path_build(ANGBAND_DIR_USER, pickpref_filename(player_ptr, PT_WITH_PNAME));
-    auto *pref_fff = angband_fopen(path_pref, FileOpenMode::READ);
-    if (!pref_fff) {
-        path_pref = path_build(ANGBAND_DIR_USER, pickpref_filename(player_ptr, PT_DEFAULT));
-        pref_fff = angband_fopen(path_pref, FileOpenMode::READ);
+    const auto path_pref = search_pickpref_path(player_ptr);
+    if (path_pref.empty()) {
+        return true;
     }
-
+    auto *pref_fff = angband_fopen(path_pref, FileOpenMode::READ);
     if (!pref_fff) {
         return true;
     }
@@ -138,12 +136,8 @@ bool autopick_autoregister(PlayerType *player_ptr, ItemEntity *o_ptr)
         }
     }
 
-    const auto path_pref = path_build(ANGBAND_DIR_USER, pickpref_filename(player_ptr, PT_WITH_PNAME));
-    auto *pref_fff = angband_fopen(path_pref, FileOpenMode::READ);
-    if (!pref_fff) {
-        path_build(ANGBAND_DIR_USER, pickpref_filename(player_ptr, PT_DEFAULT));
-        pref_fff = angband_fopen(path_pref, FileOpenMode::READ);
-    }
+    const auto path_pref = search_pickpref_path(player_ptr);
+    auto *pref_fff = !path_pref.empty() ? angband_fopen(path_pref, FileOpenMode::READ) : nullptr;
 
     if (pref_fff) {
         while (true) {