OSDN Git Service

Merge pull request #2202 from habu1010/feature/improve-lookup-kind
[hengbandforosx/hengbandosx.git] / src / flavor / flavor-describer.cpp
1 /*!
2  * @brief 武器/防具/アクセサリアイテムにおける、耐性やスレイ等の表記
3  * @date 2020/07/06
4  * @author Hourier
5  */
6
7 #include "flavor/flavor-describer.h"
8 #include "combat/shoot.h"
9 #include "flavor/flag-inscriptions-table.h"
10 #include "flavor/flavor-util.h"
11 #include "flavor/named-item-describer.h"
12 #include "flavor/object-flavor-types.h"
13 #include "game-option/text-display-options.h"
14 #include "grid/trap.h"
15 #include "inventory/inventory-slot-types.h"
16 #include "mind/mind-sniper.h"
17 #include "mind/mind-weaponsmith.h"
18 #include "object-enchant/object-ego.h"
19 #include "object-enchant/special-object-flags.h"
20 #include "object-enchant/tr-types.h"
21 #include "object-enchant/trg-types.h"
22 #include "object-hook/hook-quest.h"
23 #include "object/object-flags.h"
24 #include "object/object-kind.h"
25 #include "perception/object-perception.h"
26 #include "player-base/player-class.h"
27 #include "player/player-status-table.h"
28 #include "player/player-status.h"
29 #include "smith/object-smith.h"
30 #include "smith/smith-types.h"
31 #include "specific-object/bow.h"
32 #include "sv-definition/sv-lite-types.h"
33 #include "sv-definition/sv-weapon-types.h"
34 #include "system/floor-type-definition.h"
35 #include "system/object-type-definition.h"
36 #include "system/player-type-definition.h"
37 #include "util/bit-flags-calculator.h"
38 #include "util/string-processor.h"
39 #include "window/display-sub-window-items.h"
40
41 static void describe_chest_trap(flavor_type *flavor_ptr)
42 {
43     auto trap_kinds = chest_traps[flavor_ptr->o_ptr->pval];
44     if (trap_kinds.count() >= 2) {
45         flavor_ptr->t = object_desc_str(flavor_ptr->t, _("(マルチ・トラップ)", " (Multiple Traps)"));
46         return;
47     }
48
49     auto trap_kind = trap_kinds.first();
50     if (!trap_kind.has_value()) {
51         flavor_ptr->t = object_desc_str(flavor_ptr->t, _("(施錠)", " (Locked)"));
52         return;
53     }
54
55     switch (trap_kind.value()) {
56     case ChestTrapType::LOSE_STR:
57         flavor_ptr->t = object_desc_str(flavor_ptr->t, _("(毒針)", " (Poison Needle)"));
58         break;
59     case ChestTrapType::LOSE_CON:
60         flavor_ptr->t = object_desc_str(flavor_ptr->t, _("(毒針)", " (Poison Needle)"));
61         break;
62     case ChestTrapType::POISON:
63         flavor_ptr->t = object_desc_str(flavor_ptr->t, _("(ガス・トラップ)", " (Gas Trap)"));
64         break;
65     case ChestTrapType::PARALYZE:
66         flavor_ptr->t = object_desc_str(flavor_ptr->t, _("(ガス・トラップ)", " (Gas Trap)"));
67         break;
68     case ChestTrapType::EXPLODE:
69         flavor_ptr->t = object_desc_str(flavor_ptr->t, _("(爆発装置)", " (Explosive Device)"));
70         break;
71     case ChestTrapType::SUMMON:
72     case ChestTrapType::BIRD_STORM:
73     case ChestTrapType::E_SUMMON:
74     case ChestTrapType::H_SUMMON:
75         flavor_ptr->t = object_desc_str(flavor_ptr->t, _("(召喚のルーン)", " (Summoning Runes)"));
76         break;
77     case ChestTrapType::RUNES_OF_EVIL:
78         flavor_ptr->t = object_desc_str(flavor_ptr->t, _("(邪悪なルーン)", " (Gleaming Black Runes)"));
79         break;
80     case ChestTrapType::ALARM:
81         flavor_ptr->t = object_desc_str(flavor_ptr->t, _("(警報装置)", " (Alarm)"));
82         break;
83     case ChestTrapType::SCATTER:
84         flavor_ptr->t = object_desc_str(flavor_ptr->t, _("(アイテム散乱)", " (Scatter)"));
85         break;
86     case ChestTrapType::MAX:
87         throw("Invalid chest trap type is specified!");
88     }
89 }
90
91 static void describe_chest(flavor_type *flavor_ptr)
92 {
93     if (flavor_ptr->o_ptr->tval != ItemKindType::CHEST)
94         return;
95
96     if (!flavor_ptr->known)
97         return;
98
99     if (!flavor_ptr->o_ptr->pval) {
100         flavor_ptr->t = object_desc_str(flavor_ptr->t, _("(空)", " (empty)"));
101         return;
102     }
103
104     if (flavor_ptr->o_ptr->pval < 0) {
105         if (chest_traps[0 - flavor_ptr->o_ptr->pval].any())
106             flavor_ptr->t = object_desc_str(flavor_ptr->t, _("(解除済)", " (disarmed)"));
107         else
108             flavor_ptr->t = object_desc_str(flavor_ptr->t, _("(非施錠)", " (unlocked)"));
109
110         return;
111     }
112
113     describe_chest_trap(flavor_ptr);
114 }
115
116 static void decide_tval_show(flavor_type *flavor_ptr)
117 {
118     if (flavor_ptr->tr_flags.has(TR_SHOW_MODS))
119         flavor_ptr->show_weapon = true;
120
121     if (flavor_ptr->o_ptr->is_smith() && (Smith::object_effect(flavor_ptr->o_ptr) == SmithEffectType::SLAY_GLOVE))
122         flavor_ptr->show_weapon = true;
123
124     if (flavor_ptr->o_ptr->to_h && flavor_ptr->o_ptr->to_d)
125         flavor_ptr->show_weapon = true;
126
127     if (flavor_ptr->o_ptr->ac)
128         flavor_ptr->show_armour = true;
129 }
130
131 static void describe_weapon_dice(PlayerType *player_ptr, flavor_type *flavor_ptr)
132 {
133     if (!flavor_ptr->known && object_is_quest_target(player_ptr->current_floor_ptr->quest_number, flavor_ptr->o_ptr))
134         return;
135
136     flavor_ptr->t = object_desc_chr(flavor_ptr->t, ' ');
137     flavor_ptr->t = object_desc_chr(flavor_ptr->t, flavor_ptr->p1);
138     auto is_bonus = (player_ptr->riding > 0) && flavor_ptr->o_ptr->is_lance();
139     auto bonus = is_bonus ? 2 : 0;
140     flavor_ptr->t = object_desc_num(flavor_ptr->t, flavor_ptr->o_ptr->dd + bonus);
141     flavor_ptr->t = object_desc_chr(flavor_ptr->t, 'd');
142     flavor_ptr->t = object_desc_num(flavor_ptr->t, flavor_ptr->o_ptr->ds);
143     flavor_ptr->t = object_desc_chr(flavor_ptr->t, flavor_ptr->p2);
144 }
145
146 static void describe_bow(PlayerType *player_ptr, flavor_type *flavor_ptr)
147 {
148     flavor_ptr->power = bow_tmul(flavor_ptr->o_ptr->sval);
149     if (flavor_ptr->tr_flags.has(TR_XTRA_MIGHT))
150         flavor_ptr->power++;
151
152     flavor_ptr->t = object_desc_chr(flavor_ptr->t, ' ');
153     flavor_ptr->t = object_desc_chr(flavor_ptr->t, flavor_ptr->p1);
154     flavor_ptr->t = object_desc_chr(flavor_ptr->t, 'x');
155     flavor_ptr->t = object_desc_num(flavor_ptr->t, flavor_ptr->power);
156     flavor_ptr->t = object_desc_chr(flavor_ptr->t, flavor_ptr->p2);
157
158     int num_fire = 100;
159     if (!(flavor_ptr->mode & OD_DEBUG)) {
160         num_fire = calc_num_fire(player_ptr, flavor_ptr->o_ptr);
161     } else {
162         auto flgs = object_flags(flavor_ptr->o_ptr);
163         if (flgs.has(TR_XTRA_SHOTS))
164             num_fire += 100;
165     }
166     if ((num_fire == 0) || (flavor_ptr->power <= 0) || !flavor_ptr->known)
167         return;
168
169     flavor_ptr->fire_rate = bow_energy(flavor_ptr->o_ptr->sval) / num_fire;
170     flavor_ptr->t = object_desc_chr(flavor_ptr->t, ' ');
171     flavor_ptr->t = object_desc_chr(flavor_ptr->t, flavor_ptr->p1);
172     flavor_ptr->t = object_desc_num(flavor_ptr->t, flavor_ptr->fire_rate / 100);
173     flavor_ptr->t = object_desc_chr(flavor_ptr->t, '.');
174     flavor_ptr->t = object_desc_num(flavor_ptr->t, flavor_ptr->fire_rate % 100);
175     flavor_ptr->t = object_desc_str(flavor_ptr->t, "turn");
176     flavor_ptr->t = object_desc_chr(flavor_ptr->t, flavor_ptr->p2);
177 }
178
179 static void describe_tval(PlayerType *player_ptr, flavor_type *flavor_ptr)
180 {
181     switch (flavor_ptr->o_ptr->tval) {
182     case ItemKindType::SHOT:
183     case ItemKindType::BOLT:
184     case ItemKindType::ARROW:
185     case ItemKindType::HAFTED:
186     case ItemKindType::POLEARM:
187     case ItemKindType::SWORD:
188     case ItemKindType::DIGGING:
189         describe_weapon_dice(player_ptr, flavor_ptr);
190         break;
191     case ItemKindType::BOW:
192         describe_bow(player_ptr, flavor_ptr);
193         break;
194
195     default:
196         break;
197     }
198 }
199
200 static void describe_named_item_tval(flavor_type *flavor_ptr)
201 {
202     if (!flavor_ptr->known)
203         return;
204
205     if (flavor_ptr->show_weapon) {
206         flavor_ptr->t = object_desc_chr(flavor_ptr->t, ' ');
207         flavor_ptr->t = object_desc_chr(flavor_ptr->t, flavor_ptr->p1);
208         flavor_ptr->t = object_desc_int(flavor_ptr->t, flavor_ptr->o_ptr->to_h);
209         flavor_ptr->t = object_desc_chr(flavor_ptr->t, ',');
210         flavor_ptr->t = object_desc_int(flavor_ptr->t, flavor_ptr->o_ptr->to_d);
211         flavor_ptr->t = object_desc_chr(flavor_ptr->t, flavor_ptr->p2);
212         return;
213     }
214
215     if (flavor_ptr->o_ptr->to_h != 0) {
216         flavor_ptr->t = object_desc_chr(flavor_ptr->t, ' ');
217         flavor_ptr->t = object_desc_chr(flavor_ptr->t, flavor_ptr->p1);
218         flavor_ptr->t = object_desc_int(flavor_ptr->t, flavor_ptr->o_ptr->to_h);
219         flavor_ptr->t = object_desc_chr(flavor_ptr->t, flavor_ptr->p2);
220         return;
221     }
222
223     if (flavor_ptr->o_ptr->to_d != 0) {
224         flavor_ptr->t = object_desc_chr(flavor_ptr->t, ' ');
225         flavor_ptr->t = object_desc_chr(flavor_ptr->t, flavor_ptr->p1);
226         flavor_ptr->t = object_desc_int(flavor_ptr->t, flavor_ptr->o_ptr->to_d);
227         flavor_ptr->t = object_desc_chr(flavor_ptr->t, flavor_ptr->p2);
228     }
229 }
230
231 static void describe_fire_energy(PlayerType *player_ptr, flavor_type *flavor_ptr)
232 {
233     ENERGY energy_fire = bow_energy(flavor_ptr->bow_ptr->sval);
234     if (player_ptr->num_fire == 0) {
235         flavor_ptr->t = object_desc_chr(flavor_ptr->t, '0');
236         return;
237     }
238
239     flavor_ptr->avgdam *= (player_ptr->num_fire * 100);
240     flavor_ptr->avgdam /= energy_fire;
241     flavor_ptr->t = object_desc_num(flavor_ptr->t, flavor_ptr->avgdam);
242     flavor_ptr->t = object_desc_str(flavor_ptr->t, show_ammo_detail ? "/turn" : "");
243     if (!show_ammo_crit_ratio)
244         return;
245
246     int percent = calc_crit_ratio_shot(player_ptr, flavor_ptr->known ? flavor_ptr->o_ptr->to_h : 0, flavor_ptr->known ? flavor_ptr->bow_ptr->to_h : 0);
247     flavor_ptr->t = object_desc_chr(flavor_ptr->t, '/');
248     flavor_ptr->t = object_desc_num(flavor_ptr->t, percent / 100);
249     flavor_ptr->t = object_desc_chr(flavor_ptr->t, '.');
250     if (percent % 100 < 10)
251         flavor_ptr->t = object_desc_chr(flavor_ptr->t, '0');
252
253     flavor_ptr->t = object_desc_num(flavor_ptr->t, percent % 100);
254     flavor_ptr->t = object_desc_str(flavor_ptr->t, show_ammo_detail ? "% crit" : "%");
255 }
256
257 static void describe_bow_power(PlayerType *player_ptr, flavor_type *flavor_ptr)
258 {
259     flavor_ptr->avgdam = flavor_ptr->o_ptr->dd * (flavor_ptr->o_ptr->ds + 1) * 10 / 2;
260     int tmul = bow_tmul(flavor_ptr->bow_ptr->sval);
261     if (flavor_ptr->bow_ptr->is_known())
262         flavor_ptr->avgdam += (flavor_ptr->bow_ptr->to_d * 10);
263
264     if (flavor_ptr->known)
265         flavor_ptr->avgdam += (flavor_ptr->o_ptr->to_d * 10);
266
267     if (player_ptr->xtra_might)
268         tmul++;
269
270     tmul = tmul * (100 + (int)(adj_str_td[player_ptr->stat_index[A_STR]]) - 128);
271     flavor_ptr->avgdam *= tmul;
272     flavor_ptr->avgdam /= (100 * 10);
273     flavor_ptr->avgdam = boost_concentration_damage(player_ptr, flavor_ptr->avgdam);
274
275     if (flavor_ptr->avgdam < 0)
276         flavor_ptr->avgdam = 0;
277
278     flavor_ptr->t = object_desc_chr(flavor_ptr->t, ' ');
279     flavor_ptr->t = object_desc_chr(flavor_ptr->t, flavor_ptr->p1);
280     if (show_ammo_no_crit) {
281         flavor_ptr->t = object_desc_num(flavor_ptr->t, flavor_ptr->avgdam);
282         flavor_ptr->t = object_desc_str(flavor_ptr->t, show_ammo_detail ? "/shot " : "/");
283     }
284
285     flavor_ptr->avgdam = calc_expect_crit_shot(player_ptr, flavor_ptr->o_ptr->weight, flavor_ptr->o_ptr->to_h, flavor_ptr->bow_ptr->to_h, flavor_ptr->avgdam);
286     flavor_ptr->t = object_desc_num(flavor_ptr->t, flavor_ptr->avgdam);
287     flavor_ptr->t = show_ammo_no_crit ? object_desc_str(flavor_ptr->t, show_ammo_detail ? "/crit " : "/")
288                                       : object_desc_str(flavor_ptr->t, show_ammo_detail ? "/shot " : "/");
289     describe_fire_energy(player_ptr, flavor_ptr);
290     flavor_ptr->t = object_desc_chr(flavor_ptr->t, flavor_ptr->p2);
291 }
292
293 static void describe_spike_power(PlayerType *player_ptr, flavor_type *flavor_ptr)
294 {
295     int avgdam = player_ptr->mighty_throw ? (1 + 3) : 1;
296     int16_t energy_fire = 100 - player_ptr->lev;
297     avgdam += ((player_ptr->lev + 30) * (player_ptr->lev + 30) - 900) / 55;
298     flavor_ptr->t = object_desc_chr(flavor_ptr->t, ' ');
299     flavor_ptr->t = object_desc_chr(flavor_ptr->t, flavor_ptr->p1);
300     flavor_ptr->t = object_desc_num(flavor_ptr->t, avgdam);
301     flavor_ptr->t = object_desc_chr(flavor_ptr->t, '/');
302     avgdam = 100 * avgdam / energy_fire;
303     flavor_ptr->t = object_desc_num(flavor_ptr->t, avgdam);
304     flavor_ptr->t = object_desc_chr(flavor_ptr->t, flavor_ptr->p2);
305 }
306
307 static void describe_known_item_ac(flavor_type *flavor_ptr)
308 {
309     if (flavor_ptr->show_armour) {
310         flavor_ptr->t = object_desc_chr(flavor_ptr->t, ' ');
311         flavor_ptr->t = object_desc_chr(flavor_ptr->t, flavor_ptr->b1);
312         flavor_ptr->t = object_desc_num(flavor_ptr->t, flavor_ptr->o_ptr->ac);
313         flavor_ptr->t = object_desc_chr(flavor_ptr->t, ',');
314         flavor_ptr->t = object_desc_int(flavor_ptr->t, flavor_ptr->o_ptr->to_a);
315         flavor_ptr->t = object_desc_chr(flavor_ptr->t, flavor_ptr->b2);
316         return;
317     }
318
319     if (flavor_ptr->o_ptr->to_a == 0)
320         return;
321
322     flavor_ptr->t = object_desc_chr(flavor_ptr->t, ' ');
323     flavor_ptr->t = object_desc_chr(flavor_ptr->t, flavor_ptr->b1);
324     flavor_ptr->t = object_desc_int(flavor_ptr->t, flavor_ptr->o_ptr->to_a);
325     flavor_ptr->t = object_desc_chr(flavor_ptr->t, flavor_ptr->b2);
326 }
327
328 static void describe_ac(flavor_type *flavor_ptr)
329 {
330     if (flavor_ptr->known) {
331         describe_known_item_ac(flavor_ptr);
332         return;
333     }
334
335     if (!flavor_ptr->show_armour)
336         return;
337
338     flavor_ptr->t = object_desc_chr(flavor_ptr->t, ' ');
339     flavor_ptr->t = object_desc_chr(flavor_ptr->t, flavor_ptr->b1);
340     flavor_ptr->t = object_desc_num(flavor_ptr->t, flavor_ptr->o_ptr->ac);
341     flavor_ptr->t = object_desc_chr(flavor_ptr->t, flavor_ptr->b2);
342 }
343
344 static void describe_charges_staff_wand(flavor_type *flavor_ptr)
345 {
346     flavor_ptr->t = object_desc_chr(flavor_ptr->t, ' ');
347     flavor_ptr->t = object_desc_chr(flavor_ptr->t, flavor_ptr->p1);
348     if ((flavor_ptr->o_ptr->tval == ItemKindType::STAFF) && (flavor_ptr->o_ptr->number > 1)) {
349         flavor_ptr->t = object_desc_num(flavor_ptr->t, flavor_ptr->o_ptr->number);
350         flavor_ptr->t = object_desc_str(flavor_ptr->t, "x ");
351     }
352
353     flavor_ptr->t = object_desc_num(flavor_ptr->t, flavor_ptr->o_ptr->pval);
354     flavor_ptr->t = object_desc_str(flavor_ptr->t, _("回分", " charge"));
355 #ifdef JP
356 #else
357     if (flavor_ptr->o_ptr->pval != 1)
358         flavor_ptr->t = object_desc_chr(flavor_ptr->t, 's');
359 #endif
360
361     flavor_ptr->t = object_desc_chr(flavor_ptr->t, flavor_ptr->p2);
362 }
363
364 static void describe_charges_rod(flavor_type *flavor_ptr)
365 {
366     if (flavor_ptr->o_ptr->timeout == 0)
367         return;
368
369     if (flavor_ptr->o_ptr->number <= 1) {
370         flavor_ptr->t = object_desc_str(flavor_ptr->t, _("(充填中)", " (charging)"));
371         return;
372     }
373
374     if (flavor_ptr->k_ptr->pval == 0)
375         flavor_ptr->k_ptr->pval = 1;
376
377     flavor_ptr->power = (flavor_ptr->o_ptr->timeout + (flavor_ptr->k_ptr->pval - 1)) / flavor_ptr->k_ptr->pval;
378     if (flavor_ptr->power > flavor_ptr->o_ptr->number)
379         flavor_ptr->power = flavor_ptr->o_ptr->number;
380
381     flavor_ptr->t = object_desc_str(flavor_ptr->t, " (");
382     flavor_ptr->t = object_desc_num(flavor_ptr->t, flavor_ptr->power);
383     flavor_ptr->t = object_desc_str(flavor_ptr->t, _("本 充填中)", " charging)"));
384 }
385
386 static void describe_specific_pval(flavor_type *flavor_ptr)
387 {
388     if (flavor_ptr->tr_flags.has(TR_SPEED)) {
389         flavor_ptr->t = object_desc_str(flavor_ptr->t, _("加速", " to speed"));
390         return;
391     }
392
393     if (flavor_ptr->tr_flags.has(TR_BLOWS)) {
394         flavor_ptr->t = object_desc_str(flavor_ptr->t, _("攻撃", " attack"));
395 #ifdef JP
396 #else
397         if (std::abs(flavor_ptr->o_ptr->pval) != 1)
398             flavor_ptr->t = object_desc_chr(flavor_ptr->t, 's');
399 #endif
400
401         return;
402     }
403
404     if (flavor_ptr->tr_flags.has(TR_STEALTH)) {
405         flavor_ptr->t = object_desc_str(flavor_ptr->t, _("隠密", " to stealth"));
406         return;
407     }
408
409     if (flavor_ptr->tr_flags.has(TR_SEARCH)) {
410         flavor_ptr->t = object_desc_str(flavor_ptr->t, _("探索", " to searching"));
411         return;
412     }
413
414     if (flavor_ptr->tr_flags.has(TR_INFRA))
415         flavor_ptr->t = object_desc_str(flavor_ptr->t, _("赤外線視力", " to infravision"));
416 }
417
418 static void describe_pval(flavor_type *flavor_ptr)
419 {
420     if (flavor_ptr->tr_flags.has_none_of(TR_PVAL_FLAG_MASK))
421         return;
422
423     flavor_ptr->t = object_desc_chr(flavor_ptr->t, ' ');
424     flavor_ptr->t = object_desc_chr(flavor_ptr->t, flavor_ptr->p1);
425     flavor_ptr->t = object_desc_int(flavor_ptr->t, flavor_ptr->o_ptr->pval);
426     if (flavor_ptr->tr_flags.has(TR_HIDE_TYPE)) {
427         flavor_ptr->t = object_desc_chr(flavor_ptr->t, flavor_ptr->p2);
428         return;
429     }
430
431     describe_specific_pval(flavor_ptr);
432     flavor_ptr->t = object_desc_chr(flavor_ptr->t, flavor_ptr->p2);
433 }
434
435 static void describe_lamp_life(flavor_type *flavor_ptr)
436 {
437     if ((flavor_ptr->o_ptr->tval != ItemKindType::LITE) || (flavor_ptr->o_ptr->is_fixed_artifact() || (flavor_ptr->o_ptr->sval == SV_LITE_FEANOR)))
438         return;
439
440     flavor_ptr->t = object_desc_str(flavor_ptr->t, _("(", " (with "));
441     auto fuel_magnification = flavor_ptr->o_ptr->name2 == EGO_LITE_LONG ? 2 : 1;
442     flavor_ptr->t = object_desc_num(flavor_ptr->t, fuel_magnification * flavor_ptr->o_ptr->fuel);
443     flavor_ptr->t = object_desc_str(flavor_ptr->t, _("ターンの寿命)", " turns of light)"));
444 }
445
446 /*!
447  * @brief 杖や光源等、寿命のあるアイテムの残り回数やターン表記
448  * @param アイテム表記への参照ポインタ
449  */
450 static void describe_remaining(flavor_type *flavor_ptr)
451 {
452     if (!flavor_ptr->known)
453         return;
454
455     if (((flavor_ptr->o_ptr->tval == ItemKindType::STAFF) || (flavor_ptr->o_ptr->tval == ItemKindType::WAND)))
456         describe_charges_staff_wand(flavor_ptr);
457     else if (flavor_ptr->o_ptr->tval == ItemKindType::ROD)
458         describe_charges_rod(flavor_ptr);
459
460     describe_pval(flavor_ptr);
461     describe_lamp_life(flavor_ptr);
462     if (flavor_ptr->o_ptr->timeout && (flavor_ptr->o_ptr->tval != ItemKindType::ROD))
463         flavor_ptr->t = object_desc_str(flavor_ptr->t, _("(充填中)", " (charging)"));
464 }
465
466 static void decide_item_feeling(flavor_type *flavor_ptr)
467 {
468     flavor_ptr->fake_insc_buf[0] = '\0';
469     if (flavor_ptr->o_ptr->feeling) {
470         strcpy(flavor_ptr->fake_insc_buf, game_inscriptions[flavor_ptr->o_ptr->feeling]);
471         return;
472     }
473
474     if (flavor_ptr->o_ptr->is_cursed() && (flavor_ptr->known || (flavor_ptr->o_ptr->ident & IDENT_SENSE))) {
475         strcpy(flavor_ptr->fake_insc_buf, _("呪われている", "cursed"));
476         return;
477     }
478
479     if (((flavor_ptr->o_ptr->tval == ItemKindType::RING) || (flavor_ptr->o_ptr->tval == ItemKindType::AMULET) || (flavor_ptr->o_ptr->tval == ItemKindType::LITE) || (flavor_ptr->o_ptr->tval == ItemKindType::FIGURINE)) && flavor_ptr->aware && !flavor_ptr->known && !(flavor_ptr->o_ptr->ident & IDENT_SENSE)) {
480         strcpy(flavor_ptr->fake_insc_buf, _("未鑑定", "unidentified"));
481         return;
482     }
483
484     if (!flavor_ptr->known && (flavor_ptr->o_ptr->ident & IDENT_EMPTY)) {
485         strcpy(flavor_ptr->fake_insc_buf, _("空", "empty"));
486         return;
487     }
488
489     if (!flavor_ptr->aware && flavor_ptr->o_ptr->is_tried())
490         strcpy(flavor_ptr->fake_insc_buf, _("未判明", "tried"));
491 }
492
493 /*!
494  * @brief オブジェクトの各表記を返すメイン関数 / Creates a description of the item "o_ptr", and stores it in "out_val".
495  * @param player_ptr プレイヤーへの参照ポインタ
496  * @param buf 表記を返すための文字列参照ポインタ
497  * @param o_ptr 特性短縮表記を得たいオブジェクト構造体の参照ポインタ
498  * @param mode 表記に関するオプション指定
499  * @return 現在クエスト達成目的のアイテムならばTRUEを返す
500  */
501 void describe_flavor(PlayerType *player_ptr, char *buf, ObjectType *o_ptr, BIT_FLAGS mode)
502 {
503     flavor_type tmp_flavor;
504     flavor_type *flavor_ptr = initialize_flavor_type(&tmp_flavor, buf, o_ptr, mode);
505     describe_named_item(player_ptr, flavor_ptr);
506     if (flavor_ptr->mode & OD_NAME_ONLY || o_ptr->k_idx == 0) {
507         angband_strcpy(flavor_ptr->buf, flavor_ptr->tmp_val, MAX_NLEN);
508         return;
509     }
510
511     describe_chest(flavor_ptr);
512     decide_tval_show(flavor_ptr);
513     describe_tval(player_ptr, flavor_ptr);
514     describe_named_item_tval(flavor_ptr);
515     if (!(mode & OD_DEBUG)) {
516         flavor_ptr->bow_ptr = &player_ptr->inventory_list[INVEN_BOW];
517         if ((flavor_ptr->bow_ptr->k_idx != 0) && (flavor_ptr->o_ptr->tval == bow_tval_ammo(flavor_ptr->bow_ptr)))
518             describe_bow_power(player_ptr, flavor_ptr);
519         else if (PlayerClass(player_ptr).equals(PlayerClassType::NINJA) && (flavor_ptr->o_ptr->tval == ItemKindType::SPIKE))
520             describe_spike_power(player_ptr, flavor_ptr);
521     }
522
523     describe_ac(flavor_ptr);
524     if (flavor_ptr->mode & OD_NAME_AND_ENCHANT) {
525         angband_strcpy(flavor_ptr->buf, flavor_ptr->tmp_val, MAX_NLEN);
526         return;
527     }
528
529     describe_remaining(flavor_ptr);
530     if (flavor_ptr->mode & OD_OMIT_INSCRIPTION) {
531         angband_strcpy(flavor_ptr->buf, flavor_ptr->tmp_val, MAX_NLEN);
532         return;
533     }
534
535     display_short_flavors(flavor_ptr);
536     decide_item_feeling(flavor_ptr);
537     display_item_discount(flavor_ptr);
538     display_item_fake_inscription(flavor_ptr);
539     angband_strcpy(flavor_ptr->buf, flavor_ptr->tmp_val, MAX_NLEN);
540 }