OSDN Git Service

[Refactor] #1372 乱数に関するフィールド変数をAngbandWorld からAngbandSystem へ移した
authorHourier <66951241+Hourier@users.noreply.github.com>
Sat, 6 Apr 2024 12:31:36 +0000 (21:31 +0900)
committerHourier <66951241+Hourier@users.noreply.github.com>
Mon, 8 Apr 2024 14:04:24 +0000 (23:04 +0900)
src/core/game-play.cpp
src/floor/wild.cpp
src/info-reader/fixed-map-parser.cpp
src/item-info/flavor-initializer.cpp
src/load/info-loader.cpp
src/load/world-loader.cpp
src/save/info-writer.cpp
src/save/player-writer.cpp
src/system/angband-system.cpp
src/system/angband-system.h
src/term/z-rand.cpp

index 6294706..5241aa1 100644 (file)
@@ -191,8 +191,8 @@ static void init_world_floor_info(PlayerType *player_ptr)
     AngbandSystem::get_instance().set_phase_out(false);
     write_level = true;
     auto &system = AngbandSystem::get_instance();
-    system.seed_flavor = randint0(0x10000000);
-    system.seed_town = randint0(0x10000000);
+    system.set_seed_flavor(randint0(0x10000000));
+    system.set_seed_town(randint0(0x10000000));
     player_birth(player_ptr);
     counts_write(player_ptr, 2, 0);
     player_ptr->count = 0;
index ab2e788..97fe1ca 100644 (file)
@@ -257,8 +257,9 @@ static void generate_wilderness_area(FloorType *floor_ptr, int terrain, uint32_t
     }
 
     auto &system = AngbandSystem::get_instance();
-    const auto rng_backup = system.rng;
-    system.rng.set_state(seed);
+    const Xoshiro128StarStar rng_backup = system.get_rng();
+    Xoshiro128StarStar wilderness_rng(seed);
+    system.set_rng(wilderness_rng);
     int table_size = sizeof(terrain_table[0]) / sizeof(int16_t);
     if (!corner) {
         for (POSITION y1 = 0; y1 < MAX_HGT; y1++) {
@@ -277,7 +278,7 @@ static void generate_wilderness_area(FloorType *floor_ptr, int terrain, uint32_t
         floor_ptr->grid_array[MAX_HGT - 2][1].feat = terrain_table[terrain][floor_ptr->grid_array[MAX_HGT - 2][1].feat];
         floor_ptr->grid_array[1][MAX_WID - 2].feat = terrain_table[terrain][floor_ptr->grid_array[1][MAX_WID - 2].feat];
         floor_ptr->grid_array[MAX_HGT - 2][MAX_WID - 2].feat = terrain_table[terrain][floor_ptr->grid_array[MAX_HGT - 2][MAX_WID - 2].feat];
-        system.rng = rng_backup;
+        system.set_rng(rng_backup);
         return;
     }
 
@@ -297,7 +298,7 @@ static void generate_wilderness_area(FloorType *floor_ptr, int terrain, uint32_t
         }
     }
 
-    system.rng = rng_backup;
+    system.set_rng(rng_backup);
 }
 
 /*!
@@ -382,13 +383,14 @@ static void generate_area(PlayerType *player_ptr, POSITION y, POSITION x, bool i
     }
 
     auto &system = AngbandSystem::get_instance();
-    const auto rng_backup = system.rng;
-    system.rng.set_state(wilderness[y][x].seed);
+    const Xoshiro128StarStar rng_backup = system.get_rng();
+    Xoshiro128StarStar wilderness_rng(wilderness[y][x].seed);
+    system.set_rng(wilderness_rng);
     int dy = rand_range(6, floor_ptr->height - 6);
     int dx = rand_range(6, floor_ptr->width - 6);
     floor_ptr->grid_array[dy][dx].feat = feat_entrance;
     floor_ptr->grid_array[dy][dx].special = wilderness[y][x].entrance;
-    system.rng = rng_backup;
+    system.set_rng(rng_backup);
 }
 
 /*!
index 995554a..38e45a7 100644 (file)
@@ -221,7 +221,7 @@ static concptr parse_fixed_map_expression(PlayerType *player_ptr, char **sp, cha
         v = tmp.data();
     } else if (prefix(b + 1, "RANDOM")) {
         const auto &system = AngbandSystem::get_instance();
-        tmp = std::to_string((int)(system.seed_town % std::stoi(b + 7)));
+        tmp = std::to_string((static_cast<int>(system.get_seed_town()) % std::stoi(b + 7)));
         v = tmp.data();
     } else if (streq(b + 1, "VARIANT")) {
         v = variant;
index 0c3af2a..3191347 100644 (file)
@@ -42,8 +42,9 @@ static void shuffle_flavors(ItemKindType tval)
 void initialize_items_flavor()
 {
     auto &system = AngbandSystem::get_instance();
-    const auto rng_backup = system.rng;
-    system.rng.set_state(system.seed_flavor);
+    const Xoshiro128StarStar rng_backup = system.get_rng();
+    Xoshiro128StarStar flavor_rng(system.get_seed_flavor());
+    system.set_rng(flavor_rng);
     for (auto &baseitem : baseitems_info) {
         if (baseitem.flavor_name.empty()) {
             continue;
@@ -60,7 +61,7 @@ void initialize_items_flavor()
     shuffle_flavors(ItemKindType::FOOD);
     shuffle_flavors(ItemKindType::POTION);
     shuffle_flavors(ItemKindType::SCROLL);
-    system.rng = rng_backup;
+    system.set_rng(rng_backup);
     for (auto &baseitem : baseitems_info) {
         if (baseitem.idx == 0 || baseitem.name.empty()) {
             continue;
index e72122b..a7d4694 100644 (file)
@@ -77,7 +77,9 @@ void rd_randomizer(void)
         s = rd_u32b();
     }
 
-    AngbandSystem::get_instance().rng.set_state(state);
+    Xoshiro128StarStar game_rng;
+    game_rng.set_state(state);
+    AngbandSystem::get_instance().set_rng(game_rng);
     strip_bytes(4 * (RAND_DEG - state.size()));
 }
 
index 699fa38..f18b92f 100644 (file)
@@ -150,8 +150,8 @@ void rd_visited_towns(PlayerType *player_ptr)
 void rd_global_configurations(PlayerType *player_ptr)
 {
     auto &system = AngbandSystem::get_instance();
-    system.seed_flavor = rd_u32b();
-    system.seed_town = rd_u32b();
+    system.set_seed_flavor(rd_u32b());
+    system.set_seed_town(rd_u32b());
 
     player_ptr->panic_save = rd_u16b();
     w_ptr->total_winner = rd_u16b();
index d30fa04..c80928d 100644 (file)
@@ -41,7 +41,7 @@ void wr_randomizer(void)
 {
     wr_u16b(0);
     wr_u16b(0);
-    const auto &state = AngbandSystem::get_instance().rng.get_state();
+    const auto &state = AngbandSystem::get_instance().get_rng().get_state();
     for (const auto s : state) {
         wr_u32b(s);
     }
index 7d2c4ac..583bc0a 100644 (file)
@@ -251,8 +251,8 @@ void wr_player(PlayerType *player_ptr)
     wr_u32b(0L);
 
     const auto &system = AngbandSystem::get_instance();
-    wr_u32b(system.seed_flavor);
-    wr_u32b(system.seed_town);
+    wr_u32b(system.get_seed_flavor());
+    wr_u32b(system.get_seed_town());
     wr_u16b(player_ptr->panic_save);
     wr_u16b(w_ptr->total_winner);
     wr_u16b(w_ptr->noscore);
index 9255618..adcb8fd 100644 (file)
@@ -25,3 +25,33 @@ int AngbandSystem::get_max_range() const
 {
     return this->phase_out_stat ? 36 : 18;
 }
+
+uint32_t AngbandSystem::get_seed_flavor() const
+{
+    return this->seed_flavor;
+}
+
+void AngbandSystem::set_seed_flavor(const uint32_t seed)
+{
+    this->seed_flavor = seed;
+}
+
+uint32_t AngbandSystem::get_seed_town() const
+{
+    return this->seed_town;
+}
+
+void AngbandSystem::set_seed_town(const uint32_t seed)
+{
+    this->seed_town = seed;
+}
+
+Xoshiro128StarStar &AngbandSystem::get_rng()
+{
+    return this->rng;
+}
+
+void AngbandSystem::set_rng(const Xoshiro128StarStar &rng_)
+{
+    this->rng = rng_;
+}
index f34f97d..4efa933 100644 (file)
@@ -2,6 +2,8 @@
 
 #include "util/rng-xoshiro.h"
 #include <stdint.h>
+#include <string>
+#include <string_view>
 
 class AngbandSystem {
 public:
@@ -18,17 +20,22 @@ public:
 
     uint8_t savefile_key{}; //!< セーブファイルエンコードキー(XOR)
 
-    Xoshiro128StarStar rng; //!< Uniform random bit generator for <random>
-    uint32_t seed_flavor{}; /* アイテム未鑑定名をシャッフルするための乱数シード */
-    uint32_t seed_town{}; /* ランダム生成される町をレイアウトするための乱数シード */
-
     void set_phase_out(bool new_status);
     bool is_phase_out() const;
     int get_max_range() const;
+    uint32_t get_seed_flavor() const;
+    void set_seed_flavor(const uint32_t seed);
+    uint32_t get_seed_town() const;
+    void set_seed_town(const uint32_t seed);
+    Xoshiro128StarStar &get_rng();
+    void set_rng(const Xoshiro128StarStar &rng_);
 
 private:
     AngbandSystem() = default;
 
     static AngbandSystem instance;
     bool phase_out_stat = false; // カジノ闘技場の観戦状態等に利用。NPCの処理の対象にならず自身もほとんどの行動ができない.
+    Xoshiro128StarStar rng; //!< Uniform random bit generator for <random>
+    uint32_t seed_flavor{}; /* アイテム未鑑定名をシャッフルするための乱数シード */
+    uint32_t seed_town{}; /* ランダム生成される町をレイアウトするための乱数シード */
 };
index 0c50080..d253e45 100644 (file)
@@ -59,12 +59,12 @@ void Rand_state_init(void)
     std::random_device rd;
     std::uniform_int_distribution<element_type> dist(a, b);
 
-    Xoshiro128StarStar::state_type Rand_state{};
+    Xoshiro128StarStar::state_type state{};
     do {
-        std::generate(Rand_state.begin(), Rand_state.end(), [&dist, &rd] { return dist(rd); });
-    } while (std::all_of(Rand_state.begin(), Rand_state.end(), [](auto s) { return s == 0; }));
+        std::generate(state.begin(), state.end(), [&dist, &rd] { return dist(rd); });
+    } while (std::all_of(state.begin(), state.end(), [](auto s) { return s == 0; }));
 
-    AngbandSystem::get_instance().rng.set_state(Rand_state);
+    AngbandSystem::get_instance().get_rng().set_state(state);
 }
 
 int rand_range(int a, int b)
@@ -73,7 +73,7 @@ int rand_range(int a, int b)
         return a;
     }
     std::uniform_int_distribution<> d(a, b);
-    return d(AngbandSystem::get_instance().rng);
+    return d(AngbandSystem::get_instance().get_rng());
 }
 
 /*
@@ -85,7 +85,7 @@ int16_t randnor(int mean, int stand)
         return static_cast<int16_t>(mean);
     }
     std::normal_distribution<> d(mean, stand);
-    auto result = std::round(d(AngbandSystem::get_instance().rng));
+    auto result = std::round(d(AngbandSystem::get_instance().get_rng()));
     return static_cast<int16_t>(result);
 }