OSDN Git Service

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