OSDN Git Service

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