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;
}
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++) {
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;
}
}
}
- system.rng = rng_backup;
+ system.set_rng(rng_backup);
}
/*!
}
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);
}
/*!
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;
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;
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;
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()));
}
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();
{
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);
}
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);
{
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_;
+}
#include "util/rng-xoshiro.h"
#include <stdint.h>
+#include <string>
+#include <string_view>
class AngbandSystem {
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{}; /* ランダム生成される町をレイアウトするための乱数シード */
};
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)
return a;
}
std::uniform_int_distribution<> d(a, b);
- return d(AngbandSystem::get_instance().rng);
+ return d(AngbandSystem::get_instance().get_rng());
}
/*
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);
}