2 * @brief オブジェクトの記述処理 / Mbject flavor code
5 * Copyright (c) 1997 Ben Harrison, James E. Wilson, Robert A. Koeneke\n
7 * This software may be copied and distributed for educational, research,\n
8 * and not for profit purposes provided that this copyright and statement\n
9 * are included in all such copies. Other copyrights may also apply.\n
12 #include "flavor/object-flavor.h"
13 #include "combat/shoot.h"
14 #include "flavor/flag-inscriptions-table.h"
15 #include "flavor/flavor-util.h"
16 #include "flavor/object-flavor-types.h"
17 #include "game-option/text-display-options.h"
18 #include "grid/trap.h"
19 #include "inventory/inventory-slot-types.h"
20 #include "io/files-util.h"
21 #include "locale/english.h"
22 #include "locale/japanese.h"
23 #include "mind/mind-sniper.h"
24 #include "mind/mind-weaponsmith.h"
25 #include "monster-race/monster-race.h"
26 #include "monster-race/race-flags1.h"
27 #include "object-enchant/object-ego.h"
28 #include "object-enchant/special-object-flags.h"
29 #include "object-enchant/tr-types.h"
30 #include "object-enchant/trg-types.h"
31 #include "object-hook/hook-quest.h"
32 #include "object/object-flags.h"
33 #include "object/object-info.h"
34 #include "object/object-kind.h"
35 #include "perception/object-perception.h"
36 #include "player-info/class-info.h"
37 #include "player/player-status.h"
38 #include "sv-definition/sv-food-types.h"
39 #include "sv-definition/sv-lite-types.h"
40 #include "util/bit-flags-calculator.h"
41 #include "util/quarks.h"
42 #include "util/string-processor.h"
43 #include "world/world.h"
47 * @brief 最初から簡易な名称が明らかになるベースアイテムの判定。 / Certain items, if aware, are known instantly
49 * @return 簡易名称を明らかにするならTRUEを返す。
51 * This function is used only by "flavor_init()"
53 static bool object_easy_know(int i)
55 auto *k_ptr = &k_info[i];
56 switch (k_ptr->tval) {
57 case ItemKindType::LIFE_BOOK:
58 case ItemKindType::SORCERY_BOOK:
59 case ItemKindType::NATURE_BOOK:
60 case ItemKindType::CHAOS_BOOK:
61 case ItemKindType::DEATH_BOOK:
62 case ItemKindType::TRUMP_BOOK:
63 case ItemKindType::ARCANE_BOOK:
64 case ItemKindType::CRAFT_BOOK:
65 case ItemKindType::DEMON_BOOK:
66 case ItemKindType::CRUSADE_BOOK:
67 case ItemKindType::MUSIC_BOOK:
68 case ItemKindType::HISSATSU_BOOK:
69 case ItemKindType::HEX_BOOK:
71 case ItemKindType::FLASK:
72 case ItemKindType::JUNK:
73 case ItemKindType::BOTTLE:
74 case ItemKindType::SKELETON:
75 case ItemKindType::SPIKE:
76 case ItemKindType::WHISTLE:
78 case ItemKindType::FOOD:
79 case ItemKindType::POTION:
80 case ItemKindType::SCROLL:
81 case ItemKindType::ROD:
92 * @brief 各種語彙からランダムな名前を作成する / Create a name from random parts.
93 * @param out_string 作成した名を保管する参照ポインタ
94 * @details 日本語の場合 aname_j.txt 英語の場合確率に応じて
95 * syllables 配列と elvish.txt を組み合わせる。\n
97 void get_table_name_aux(char *out_string)
101 get_rnd_line("aname_j.txt", 1, syllable);
102 strcpy(out_string, syllable);
103 get_rnd_line("aname_j.txt", 2, syllable);
104 strcat(out_string, syllable);
106 #define MAX_SYLLABLES 164 /* Used with scrolls (see below) */
108 static concptr syllables[MAX_SYLLABLES] = { "a", "ab", "ag", "aks", "ala", "an", "ankh", "app", "arg", "arze", "ash", "aus", "ban", "bar", "bat", "bek",
109 "bie", "bin", "bit", "bjor", "blu", "bot", "bu", "byt", "comp", "con", "cos", "cre", "dalf", "dan", "den", "der", "doe", "dok", "eep", "el", "eng",
110 "er", "ere", "erk", "esh", "evs", "fa", "fid", "flit", "for", "fri", "fu", "gan", "gar", "glen", "gop", "gre", "ha", "he", "hyd", "i", "ing", "ion",
111 "ip", "ish", "it", "ite", "iv", "jo", "kho", "kli", "klis", "la", "lech", "man", "mar", "me", "mi", "mic", "mik", "mon", "mung", "mur", "nag", "nej",
112 "nelg", "nep", "ner", "nes", "nis", "nih", "nin", "o", "od", "ood", "org", "orn", "ox", "oxy", "pay", "pet", "ple", "plu", "po", "pot", "prok", "re",
113 "rea", "rhov", "ri", "ro", "rog", "rok", "rol", "sa", "san", "sat", "see", "sef", "seh", "shu", "ski", "sna", "sne", "snik", "sno", "so", "sol", "sri",
114 "sta", "sun", "ta", "tab", "tem", "ther", "ti", "tox", "trol", "tue", "turs", "u", "ulk", "um", "un", "uni", "ur", "val", "viv", "vly", "vom", "wah",
115 "wed", "werg", "wex", "whon", "wun", "x", "yerg", "yp", "zun", "tri", "blaa", "jah", "bul", "on", "foo", "ju", "xuxu" };
117 int testcounter = randint1(3) + 1;
118 strcpy(out_string, "");
119 if (randint1(3) == 2) {
120 while (testcounter--)
121 strcat(out_string, syllables[randint0(MAX_SYLLABLES)]);
124 testcounter = randint1(2) + 1;
125 while (testcounter--) {
126 (void)get_rnd_line("elvish.txt", 0, syllable);
127 strcat(out_string, syllable);
131 out_string[0] = toupper(out_string[1]);
132 out_string[16] = '\0';
137 * @brief ランダムな名前をアーティファクト銘として整形する。 / Create a name from random parts with quotes.
138 * @param out_string 作成した名を保管する参照ポインタ
139 * @details get_table_name_aux()ほぼ完全に実装を依存している。
141 void get_table_name(char *out_string)
144 get_table_name_aux(buff);
145 sprintf(out_string, _("『%s』", "'%s'"), buff);
149 * @brief ランダムなシンダリン銘を作成する / Make random Sindarin name
150 * @param out_string 作成した名を保管する参照ポインタ
151 * @details sname.txtが語幹の辞書となっている。
153 void get_table_sindarin_aux(char *out_string)
160 get_rnd_line("sname.txt", 1, syllable);
161 strcpy(_(tmp, out_string), syllable);
162 get_rnd_line("sname.txt", 2, syllable);
164 strcat(tmp, syllable);
165 sindarin_to_kana(out_string, tmp);
167 strcat(out_string, syllable);
172 * @brief シンダリン銘をアーティファクト用に整形する。 / Make random Sindarin name with quotes
173 * @param out_string 作成した名を保管する参照ポインタ
174 * @details get_table_sindarin_aux()ほぼ完全に実装を依存している。
176 void get_table_sindarin(char *out_string)
179 get_table_sindarin_aux(buff);
180 sprintf(out_string, _("『%s』", "'%s'"), buff);
184 * @brief ベースアイテムの未確定名を共通tval間でシャッフルする / Shuffle flavor indices of a group of objects with given tval
185 * @param tval シャッフルしたいtval
186 * @details 巻物、各種魔道具などに利用される。
188 static void shuffle_flavors(ItemKindType tval)
190 std::vector<KIND_OBJECT_IDX> k_idx_list;
191 for (const auto &k_ref : k_info) {
192 if (k_ref.tval != tval)
198 if (k_ref.flags.has(TR_FIXED_FLAVOR))
201 k_idx_list.push_back(k_ref.idx);
204 for (auto k_idx : k_idx_list) {
205 object_kind *k1_ptr = &k_info[k_idx];
206 object_kind *k2_ptr = &k_info[k_idx_list[randint0(k_idx_list.size())]];
207 std::swap(k1_ptr->flavor, k2_ptr->flavor);
212 * @brief ゲーム開始時に行われるベースアイテムの初期化ルーチン / Prepare the "variable" part of the "k_info" array.
215 void flavor_init(void)
217 const auto state_backup = w_ptr->rng.get_state();
218 w_ptr->rng.set_state(w_ptr->seed_flavor);
219 for (auto &k_ref : k_info) {
220 if (k_ref.flavor_name.empty())
223 k_ref.flavor = k_ref.idx;
226 shuffle_flavors(ItemKindType::RING);
227 shuffle_flavors(ItemKindType::AMULET);
228 shuffle_flavors(ItemKindType::STAFF);
229 shuffle_flavors(ItemKindType::WAND);
230 shuffle_flavors(ItemKindType::ROD);
231 shuffle_flavors(ItemKindType::FOOD);
232 shuffle_flavors(ItemKindType::POTION);
233 shuffle_flavors(ItemKindType::SCROLL);
234 w_ptr->rng.set_state(state_backup);
235 for (auto &k_ref : k_info) {
236 if (k_ref.idx == 0 || k_ref.name.empty())
242 k_ref.easy_know = object_easy_know(k_ref.idx);
247 * @brief nameバッファ内からベースアイテム名を返す / Strip an "object name" into a buffer
248 * @param buf ベースアイテム格納先の参照ポインタ
249 * @param k_idx ベースアイテムID
251 void strip_name(char *buf, KIND_OBJECT_IDX k_idx)
253 auto k_ptr = &k_info[k_idx];
254 auto tok = str_split(k_ptr->name, ' ');
255 std::string name = "";
257 if (s == "" || s == "~" || s == "&" || s == "#")
261 auto endpos = s.size();
262 auto is_kanji = false;
264 if (s[0] == '~' || s[0] == '#')
268 is_kanji = iskanji(s[endpos - 2]);
271 if (!is_kanji && (s[endpos - 1] == '~' || s[endpos - 1] == '#'))
274 name += s.substr(offset, endpos);
278 strcpy(buf, name.c_str());