OSDN Git Service

[Refactor] #1372 AngbandWorld の乱数に関するフィールド変数をAngbandSystem へ移した
authorHourier <66951241+Hourier@users.noreply.github.com>
Sun, 10 Dec 2023 03:31:07 +0000 (12:31 +0900)
committerHourier <66951241+Hourier@users.noreply.github.com>
Sat, 6 Apr 2024 12:16:24 +0000 (21:16 +0900)
12 files changed:
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/main-win.cpp
src/save/info-writer.cpp
src/save/player-writer.cpp
src/system/angband-system.h
src/term/z-rand.cpp
src/world/world.h

index d6dbd9e..6294706 100644 (file)
@@ -190,8 +190,9 @@ static void init_world_floor_info(PlayerType *player_ptr)
     floor_ptr->inside_arena = false;
     AngbandSystem::get_instance().set_phase_out(false);
     write_level = true;
-    w_ptr->seed_flavor = randint0(0x10000000);
-    w_ptr->seed_town = randint0(0x10000000);
+    auto &system = AngbandSystem::get_instance();
+    system.seed_flavor = randint0(0x10000000);
+    system.seed_town = randint0(0x10000000);
     player_birth(player_ptr);
     counts_write(player_ptr, 2, 0);
     player_ptr->count = 0;
index 59924e5..ab2e788 100644 (file)
@@ -37,6 +37,7 @@
 #include "realm/realm-names-table.h"
 #include "spell-realm/spells-hex.h"
 #include "status/action-setter.h"
+#include "system/angband-system.h"
 #include "system/dungeon-info.h"
 #include "system/floor-type-definition.h"
 #include "system/grid-type-definition.h"
@@ -255,8 +256,9 @@ static void generate_wilderness_area(FloorType *floor_ptr, int terrain, uint32_t
         return;
     }
 
-    const auto rng_backup = w_ptr->rng;
-    w_ptr->rng.set_state(seed);
+    auto &system = AngbandSystem::get_instance();
+    const auto rng_backup = system.rng;
+    system.rng.set_state(seed);
     int table_size = sizeof(terrain_table[0]) / sizeof(int16_t);
     if (!corner) {
         for (POSITION y1 = 0; y1 < MAX_HGT; y1++) {
@@ -275,7 +277,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];
-        w_ptr->rng = rng_backup;
+        system.rng = rng_backup;
         return;
     }
 
@@ -295,7 +297,7 @@ static void generate_wilderness_area(FloorType *floor_ptr, int terrain, uint32_t
         }
     }
 
-    w_ptr->rng = rng_backup;
+    system.rng = rng_backup;
 }
 
 /*!
@@ -379,13 +381,14 @@ static void generate_area(PlayerType *player_ptr, POSITION y, POSITION x, bool i
         return;
     }
 
-    const auto rng_backup = w_ptr->rng;
-    w_ptr->rng.set_state(wilderness[y][x].seed);
+    auto &system = AngbandSystem::get_instance();
+    const auto rng_backup = system.rng;
+    system.rng.set_state(wilderness[y][x].seed);
     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;
-    w_ptr->rng = rng_backup;
+    system.rng = rng_backup;
 }
 
 /*!
index e4404ca..995554a 100644 (file)
 #include "player-info/race-info.h"
 #include "realm/realm-names-table.h"
 #include "system/angband-exceptions.h"
+#include "system/angband-system.h"
 #include "system/floor-type-definition.h"
 #include "system/player-type-definition.h"
 #include "util/angband-files.h"
 #include "util/string-processor.h"
 #include "view/display-messages.h"
-#include "world/world.h"
 #include <algorithm>
 #include <sstream>
 
@@ -220,7 +220,8 @@ static concptr parse_fixed_map_expression(PlayerType *player_ptr, char **sp, cha
         tmp = std::to_string(enum2i(quest_list[i2enum<QuestId>(atoi(b + 6))].status));
         v = tmp.data();
     } else if (prefix(b + 1, "RANDOM")) {
-        tmp = std::to_string((int)(w_ptr->seed_town % atoi(b + 7)));
+        const auto &system = AngbandSystem::get_instance();
+        tmp = std::to_string((int)(system.seed_town % std::stoi(b + 7)));
         v = tmp.data();
     } else if (streq(b + 1, "VARIANT")) {
         v = variant;
index fa37fcf..0c3af2a 100644 (file)
@@ -6,8 +6,8 @@
 
 #include "item-info/flavor-initializer.h"
 #include "object/tval-types.h"
+#include "system/angband-system.h"
 #include "system/baseitem-info.h"
-#include "world/world.h"
 
 /*!
  * @brief ベースアイテムの未確定名を共通tval間でシャッフルする / Shuffle flavor indices of a group of objects with given tval
@@ -41,8 +41,9 @@ static void shuffle_flavors(ItemKindType tval)
  */
 void initialize_items_flavor()
 {
-    const auto rng_backup = w_ptr->rng;
-    w_ptr->rng.set_state(w_ptr->seed_flavor);
+    auto &system = AngbandSystem::get_instance();
+    const auto rng_backup = system.rng;
+    system.rng.set_state(system.seed_flavor);
     for (auto &baseitem : baseitems_info) {
         if (baseitem.flavor_name.empty()) {
             continue;
@@ -59,7 +60,7 @@ void initialize_items_flavor()
     shuffle_flavors(ItemKindType::FOOD);
     shuffle_flavors(ItemKindType::POTION);
     shuffle_flavors(ItemKindType::SCROLL);
-    w_ptr->rng = rng_backup;
+    system.rng = rng_backup;
     for (auto &baseitem : baseitems_info) {
         if (baseitem.idx == 0 || baseitem.name.empty()) {
             continue;
index 832a221..e72122b 100644 (file)
@@ -72,13 +72,12 @@ void rd_version_info(void)
 void rd_randomizer(void)
 {
     strip_bytes(4);
-
     Xoshiro128StarStar::state_type state{};
     for (auto &s : state) {
         s = rd_u32b();
     }
-    w_ptr->rng.set_state(state);
 
+    AngbandSystem::get_instance().rng.set_state(state);
     strip_bytes(4 * (RAND_DEG - state.size()));
 }
 
index 830d4e3..699fa38 100644 (file)
@@ -5,6 +5,7 @@
 #include "load/load-util.h"
 #include "load/load-zangband.h"
 #include "market/bounty.h"
+#include "system/angband-system.h"
 #include "system/building-type-definition.h"
 #include "system/dungeon-info.h"
 #include "system/floor-type-definition.h"
@@ -148,8 +149,9 @@ void rd_visited_towns(PlayerType *player_ptr)
 
 void rd_global_configurations(PlayerType *player_ptr)
 {
-    w_ptr->seed_flavor = rd_u32b();
-    w_ptr->seed_town = rd_u32b();
+    auto &system = AngbandSystem::get_instance();
+    system.seed_flavor = rd_u32b();
+    system.seed_town = rd_u32b();
 
     player_ptr->panic_save = rd_u16b();
     w_ptr->total_winner = rd_u16b();
index 9ad355f..57e7a61 100644 (file)
@@ -2301,8 +2301,8 @@ LRESULT PASCAL angband_window_procedure(HWND hWnd, UINT uMsg, WPARAM wParam, LPA
         if (macro_running()) {
             return 0;
         }
-        mousex = std::min(LOWORD(lParam) / td->tile_wid, td->cols - 1);
-        mousey = std::min(HIWORD(lParam) / td->tile_hgt, td->rows - 1);
+        mousex = std::min<int>(LOWORD(lParam) / td->tile_wid, td->cols - 1);
+        mousey = std::min<int>(HIWORD(lParam) / td->tile_hgt, td->rows - 1);
         mouse_down = true;
         oldx = mousex;
         oldy = mousey;
@@ -2390,8 +2390,8 @@ LRESULT PASCAL angband_window_procedure(HWND hWnd, UINT uMsg, WPARAM wParam, LPA
         }
 
         int dx, dy;
-        int cx = std::min(LOWORD(lParam) / td->tile_wid, td->cols - 1);
-        int cy = std::min(HIWORD(lParam) / td->tile_hgt, td->rows - 1);
+        auto cx = std::min<int>(LOWORD(lParam) / td->tile_wid, td->cols - 1);
+        auto cy = std::min<int>(HIWORD(lParam) / td->tile_hgt, td->rows - 1);
         int ox, oy;
 
         if (paint_rect) {
index 1ab0a9a..d30fa04 100644 (file)
@@ -9,6 +9,7 @@
 #include "save/save-util.h"
 #include "save/save.h"
 #include "store/store-util.h"
+#include "system/angband-system.h"
 #include "system/angband.h"
 #include "system/item-entity.h"
 #include "util/enum-converter.h"
@@ -40,7 +41,7 @@ void wr_randomizer(void)
 {
     wr_u16b(0);
     wr_u16b(0);
-    const auto &state = w_ptr->rng.get_state();
+    const auto &state = AngbandSystem::get_instance().rng.get_state();
     for (const auto s : state) {
         wr_u32b(s);
     }
index 3096fbf..7d2c4ac 100644 (file)
@@ -250,8 +250,9 @@ void wr_player(PlayerType *player_ptr)
     wr_u32b(0L);
     wr_u32b(0L);
 
-    wr_u32b(w_ptr->seed_flavor);
-    wr_u32b(w_ptr->seed_town);
+    const auto &system = AngbandSystem::get_instance();
+    wr_u32b(system.seed_flavor);
+    wr_u32b(system.seed_town);
     wr_u16b(player_ptr->panic_save);
     wr_u16b(w_ptr->total_winner);
     wr_u16b(w_ptr->noscore);
index 10e6e79..f34f97d 100644 (file)
@@ -1,5 +1,6 @@
 #pragma once
 
+#include "util/rng-xoshiro.h"
 #include <stdint.h>
 
 class AngbandSystem {
@@ -17,6 +18,10 @@ 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;
index d85512c..0c50080 100644 (file)
@@ -11,9 +11,7 @@
 /* Purpose: a simple random number generator -BEN- */
 
 #include "term/z-rand.h"
-#include "util/rng-xoshiro.h"
-#include "world/world.h"
-
+#include "system/angband-system.h"
 #include <algorithm>
 #include <cmath>
 #include <limits>
@@ -66,7 +64,7 @@ void Rand_state_init(void)
         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; }));
 
-    w_ptr->rng.set_state(Rand_state);
+    AngbandSystem::get_instance().rng.set_state(Rand_state);
 }
 
 int rand_range(int a, int b)
@@ -75,7 +73,7 @@ int rand_range(int a, int b)
         return a;
     }
     std::uniform_int_distribution<> d(a, b);
-    return d(w_ptr->rng);
+    return d(AngbandSystem::get_instance().rng);
 }
 
 /*
@@ -87,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(w_ptr->rng));
+    auto result = std::round(d(AngbandSystem::get_instance().rng));
     return static_cast<int16_t>(result);
 }
 
index eae2364..ce5fedb 100644 (file)
@@ -4,7 +4,6 @@
 #include "player-info/class-types.h"
 #include "system/angband.h"
 #include "util/flag-group.h"
-#include "util/rng-xoshiro.h"
 #include <tuple>
 
 constexpr auto MAX_BOUNTY = 20;
@@ -36,11 +35,6 @@ public:
 
     uint32_t play_time{}; /*!< 実プレイ時間 */
 
-    Xoshiro128StarStar rng; //!< Uniform random bit generator for <random>
-
-    uint32_t seed_flavor{}; /* Hack -- consistent object colors */
-    uint32_t seed_town{}; /* Hack -- consistent town layout */
-
     bool is_loading_now{}; /*!< ロード処理中フラグ...ロード直後にcalc_bonus()時の徳変化、及びsanity_blast()による異常を抑止する */
 
     uint32_t sf_system{}; //!< OS情報 / OS information