OSDN Git Service

fa37fcfca13b54f5fe173ccaff0ef2472241aac8
[hengbandforosx/hengbandosx.git] / src / item-info / flavor-initializer.cpp
1 /*!
2  * @brief アイテムのフレーバー初期化 (未鑑定名のシャッフル処理)
3  * @author Hourier
4  * @date 2022/12/28
5  */
6
7 #include "item-info/flavor-initializer.h"
8 #include "object/tval-types.h"
9 #include "system/baseitem-info.h"
10 #include "world/world.h"
11
12 /*!
13  * @brief ベースアイテムの未確定名を共通tval間でシャッフルする / Shuffle flavor indices of a group of objects with given tval
14  * @param tval シャッフルしたいtval
15  * @details 巻物、各種魔道具などに利用される。
16  */
17 static void shuffle_flavors(ItemKindType tval)
18 {
19     std::vector<std::reference_wrapper<IDX>> flavor_idx_ref_list;
20     for (const auto &baseitem : baseitems_info) {
21         if (baseitem.bi_key.tval() != tval) {
22             continue;
23         }
24
25         if (baseitem.flavor == 0) {
26             continue;
27         }
28
29         if (baseitem.flags.has(TR_FIXED_FLAVOR)) {
30             continue;
31         }
32
33         flavor_idx_ref_list.push_back(baseitems_info[baseitem.idx].flavor);
34     }
35
36     rand_shuffle(flavor_idx_ref_list.begin(), flavor_idx_ref_list.end());
37 }
38
39 /*!
40  * @brief ゲーム開始時に行われるベースアイテムの初期化ルーチン
41  */
42 void initialize_items_flavor()
43 {
44     const auto rng_backup = w_ptr->rng;
45     w_ptr->rng.set_state(w_ptr->seed_flavor);
46     for (auto &baseitem : baseitems_info) {
47         if (baseitem.flavor_name.empty()) {
48             continue;
49         }
50
51         baseitem.flavor = baseitem.idx;
52     }
53
54     shuffle_flavors(ItemKindType::RING);
55     shuffle_flavors(ItemKindType::AMULET);
56     shuffle_flavors(ItemKindType::STAFF);
57     shuffle_flavors(ItemKindType::WAND);
58     shuffle_flavors(ItemKindType::ROD);
59     shuffle_flavors(ItemKindType::FOOD);
60     shuffle_flavors(ItemKindType::POTION);
61     shuffle_flavors(ItemKindType::SCROLL);
62     w_ptr->rng = rng_backup;
63     for (auto &baseitem : baseitems_info) {
64         if (baseitem.idx == 0 || baseitem.name.empty()) {
65             continue;
66         }
67
68         if (!baseitem.flavor) {
69             baseitem.aware = true;
70         }
71
72         baseitem.decide_easy_know();
73     }
74 }