From 80e5a3a2c100eb1e89100511c2d24a60ac09870d Mon Sep 17 00:00:00 2001 From: Habu Date: Thu, 3 Mar 2022 23:44:59 +0900 Subject: [PATCH] =?utf8?q?[Refactor]=20=E7=84=A1=E4=BD=9C=E7=82=BA?= =?utf8?q?=E3=81=AB=E3=83=A2=E3=83=B3=E3=82=B9=E3=82=BF=E3=83=BC=E3=82=92?= =?utf8?q?=E9=81=B8=E6=8A=9E=E3=81=99=E3=82=8B=E5=87=A6=E7=90=86=E3=82=92?= =?utf8?q?=E9=96=A2=E6=95=B0=E3=81=AB=E3=81=BE=E3=81=A8=E3=82=81=E3=82=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit 実在するモンスター種族IDから無作為に1つ選択する処理を MonsterRace::pick_one_at_random() 関数としてまとめる。対象は(実質NONEのような 使われ方をしている MonsterRaceId::PLAYER を除き)全てのモンスターで、レアリティは 関係なく全てのモンスターから等確率で選択する。 --- src/monster-race/monster-race.cpp | 21 +++++++++++++++++++++ src/monster-race/monster-race.h | 3 +++ src/monster/monster-describer.cpp | 2 +- src/monster/monster-status.cpp | 2 +- src/object-enchant/others/apply-magic-others.cpp | 4 ++-- src/view/display-map.cpp | 4 ++-- 6 files changed, 30 insertions(+), 6 deletions(-) diff --git a/src/monster-race/monster-race.cpp b/src/monster-race/monster-race.cpp index e2891d1a3..47fa3879d 100644 --- a/src/monster-race/monster-race.cpp +++ b/src/monster-race/monster-race.cpp @@ -4,6 +4,7 @@ #include "monster-race/race-indice-types.h" #include "monster-race/race-resistance-mask.h" #include "system/monster-race-definition.h" +#include "util/probability-table.h" #include #include @@ -57,6 +58,26 @@ MonsterRace::MonsterRace(MonsterRaceId r_idx) } /*! + * @brief (MonsterRaceId::PLAYERを除く)実在するすべてのモンスター種族IDから等確率で1つ選択する + * + * @return 選択したモンスター種族ID + */ +MonsterRaceId MonsterRace::pick_one_at_random() +{ + static ProbabilityTable table; + + if (table.empty()) { + for (const auto &[r_idx, r_ref] : r_info) { + if (MonsterRace(r_idx).is_valid()) { + table.entry_item(r_idx, 1); + } + } + } + + return table.pick_one_at_random(); +} + +/*! * @brief コンストラクタに渡された MonsterRaceId が正当なもの(実際に存在するモンスター種族IDである)かどうかを調べる * @details モンスター種族IDが r_info に実在するもの(MonsterRaceId::PLAYERは除く)であるかどうかの用途の他、 * m_list 上の要素などの r_idx にMonsterRaceId::PLAYER を入れることで死亡扱いとして使われるのでその判定に使用する事もある diff --git a/src/monster-race/monster-race.h b/src/monster-race/monster-race.h index 955c9c4db..e92df6714 100644 --- a/src/monster-race/monster-race.h +++ b/src/monster-race/monster-race.h @@ -12,6 +12,9 @@ int calc_monrace_power(monster_race *r_ptr); class MonsterRace { public: MonsterRace(MonsterRaceId r_idx); + + static MonsterRaceId pick_one_at_random(); + bool is_valid() const; private: diff --git a/src/monster/monster-describer.cpp b/src/monster/monster-describer.cpp index dbeaad13b..877e347d4 100644 --- a/src/monster/monster-describer.cpp +++ b/src/monster/monster-describer.cpp @@ -41,7 +41,7 @@ void monster_desc(PlayerType *player_ptr, char *desc, monster_type *m_ptr, BIT_F monster_race *hallu_race; do { - auto r_idx = i2enum(randint1(r_info.size() - 1)); + auto r_idx = MonsterRace::pick_one_at_random(); hallu_race = &r_info[r_idx]; } while (hallu_race->name.empty() || hallu_race->kind_flags.has(MonsterKindType::UNIQUE)); diff --git a/src/monster/monster-status.cpp b/src/monster/monster-status.cpp index 7061d9f09..3a710d7dc 100644 --- a/src/monster/monster-status.cpp +++ b/src/monster/monster-status.cpp @@ -494,7 +494,7 @@ void monster_gain_exp(PlayerType *player_ptr, MONSTER_IDX m_idx, MonsterRaceId s if (is_hallucinated) { monster_race *hallucinated_race = nullptr; do { - auto r_idx = i2enum(randint1(r_info.size() - 1)); + auto r_idx = MonsterRace::pick_one_at_random(); hallucinated_race = &r_info[r_idx]; } while (hallucinated_race->name.empty() || hallucinated_race->kind_flags.has(MonsterKindType::UNIQUE)); auto mes_evolution = _("%sは%sに進化した。", "%^s evolved into %s."); diff --git a/src/object-enchant/others/apply-magic-others.cpp b/src/object-enchant/others/apply-magic-others.cpp index 1ccc719d6..17bb73ad0 100644 --- a/src/object-enchant/others/apply-magic-others.cpp +++ b/src/object-enchant/others/apply-magic-others.cpp @@ -106,7 +106,7 @@ void OtherItemsEnchanter::generate_figurine() auto *floor_ptr = this->player_ptr->current_floor_ptr; MonsterRaceId r_idx; while (true) { - r_idx = i2enum(randint1(r_info.size() - 1)); + r_idx = MonsterRace::pick_one_at_random(); if (!item_monster_okay(this->player_ptr, r_idx) || (r_idx == MonsterRaceId::TSUCHINOKO)) { continue; } @@ -171,7 +171,7 @@ void OtherItemsEnchanter::generate_statue() MonsterRaceId r_idx; const auto *r_ptr = &r_info[MonsterRaceId::PLAYER]; while (true) { - r_idx = i2enum(randint1(r_info.size() - 1)); + r_idx = MonsterRace::pick_one_at_random(); r_ptr = &r_info[r_idx]; if (r_ptr->rarity == 0) { continue; diff --git a/src/view/display-map.cpp b/src/view/display-map.cpp index 117a56caf..e71e1848b 100644 --- a/src/view/display-map.cpp +++ b/src/view/display-map.cpp @@ -62,7 +62,7 @@ static void image_object(TERM_COLOR *ap, char *cp) static void image_monster(TERM_COLOR *ap, char *cp) { if (use_graphics) { - auto r_idx = i2enum(randint1(r_info.size() - 1)); + auto r_idx = MonsterRace::pick_one_at_random(); auto *r_ptr = &r_info[r_idx]; *cp = r_ptr->x_char; *ap = r_ptr->x_attr; @@ -372,7 +372,7 @@ void map_info(PlayerType *player_ptr, POSITION y, POSITION x, TERM_COLOR *ap, ch if (r_ptr->visual_flags.has(MonsterVisualType::SHAPECHANGER)) { if (use_graphics) { - auto r_idx = i2enum(randint1(r_info.size() - 1)); + auto r_idx = MonsterRace::pick_one_at_random(); monster_race *tmp_r_ptr = &r_info[r_idx]; *cp = tmp_r_ptr->x_char; *ap = tmp_r_ptr->x_attr; -- 2.11.0