OSDN Git Service

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