OSDN Git Service

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