From: Hourier <66951241+Hourier@users.noreply.github.com> Date: Sun, 10 Dec 2023 03:31:07 +0000 (+0900) Subject: [Refactor] #1372 AngbandWorld の乱数に関するフィールド変数をAngbandSystem へ移した X-Git-Tag: 3.0.1.11-Beta^2~2^2~1 X-Git-Url: http://git.osdn.net/view?p=hengbandforosx%2Fhengbandosx.git;a=commitdiff_plain;h=8aaaafe9e854104e6c278cdf466dfcbd9172b9df [Refactor] #1372 AngbandWorld の乱数に関するフィールド変数をAngbandSystem へ移した --- diff --git a/src/core/game-play.cpp b/src/core/game-play.cpp index d6dbd9eac..62947065f 100644 --- a/src/core/game-play.cpp +++ b/src/core/game-play.cpp @@ -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; diff --git a/src/floor/wild.cpp b/src/floor/wild.cpp index 59924e54e..ab2e78855 100644 --- a/src/floor/wild.cpp +++ b/src/floor/wild.cpp @@ -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; } /*! diff --git a/src/info-reader/fixed-map-parser.cpp b/src/info-reader/fixed-map-parser.cpp index e4404cabd..995554a4c 100644 --- a/src/info-reader/fixed-map-parser.cpp +++ b/src/info-reader/fixed-map-parser.cpp @@ -18,12 +18,12 @@ #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 #include @@ -220,7 +220,8 @@ static concptr parse_fixed_map_expression(PlayerType *player_ptr, char **sp, cha tmp = std::to_string(enum2i(quest_list[i2enum(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; diff --git a/src/item-info/flavor-initializer.cpp b/src/item-info/flavor-initializer.cpp index fa37fcfca..0c3af2a59 100644 --- a/src/item-info/flavor-initializer.cpp +++ b/src/item-info/flavor-initializer.cpp @@ -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; diff --git a/src/load/info-loader.cpp b/src/load/info-loader.cpp index 832a221e6..e72122b9a 100644 --- a/src/load/info-loader.cpp +++ b/src/load/info-loader.cpp @@ -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())); } diff --git a/src/load/world-loader.cpp b/src/load/world-loader.cpp index 830d4e370..699fa3880 100644 --- a/src/load/world-loader.cpp +++ b/src/load/world-loader.cpp @@ -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(); diff --git a/src/main-win.cpp b/src/main-win.cpp index 9ad355f94..57e7a6151 100644 --- a/src/main-win.cpp +++ b/src/main-win.cpp @@ -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(LOWORD(lParam) / td->tile_wid, td->cols - 1); + mousey = std::min(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(LOWORD(lParam) / td->tile_wid, td->cols - 1); + auto cy = std::min(HIWORD(lParam) / td->tile_hgt, td->rows - 1); int ox, oy; if (paint_rect) { diff --git a/src/save/info-writer.cpp b/src/save/info-writer.cpp index 1ab0a9a3b..d30fa046a 100644 --- a/src/save/info-writer.cpp +++ b/src/save/info-writer.cpp @@ -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); } diff --git a/src/save/player-writer.cpp b/src/save/player-writer.cpp index 3096fbff2..7d2c4ac11 100644 --- a/src/save/player-writer.cpp +++ b/src/save/player-writer.cpp @@ -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); diff --git a/src/system/angband-system.h b/src/system/angband-system.h index 10e6e79ec..f34f97dd3 100644 --- a/src/system/angband-system.h +++ b/src/system/angband-system.h @@ -1,5 +1,6 @@ #pragma once +#include "util/rng-xoshiro.h" #include class AngbandSystem { @@ -17,6 +18,10 @@ public: uint8_t savefile_key{}; //!< セーブファイルエンコードキー(XOR) + Xoshiro128StarStar rng; //!< Uniform random bit generator for + 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; diff --git a/src/term/z-rand.cpp b/src/term/z-rand.cpp index d85512c37..0c500805e 100644 --- a/src/term/z-rand.cpp +++ b/src/term/z-rand.cpp @@ -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 #include #include @@ -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(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(result); } diff --git a/src/world/world.h b/src/world/world.h index eae2364f0..ce5fedbc3 100644 --- a/src/world/world.h +++ b/src/world/world.h @@ -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 constexpr auto MAX_BOUNTY = 20; @@ -36,11 +35,6 @@ public: uint32_t play_time{}; /*!< 実プレイ時間 */ - Xoshiro128StarStar rng; //!< Uniform random bit generator for - - 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