OSDN Git Service

Resolve conflicts.
[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/object-smith.h"
20 #include "object-enchant/smith-types.h"
21 #include "object-enchant/special-object-flags.h"
22 #include "object-enchant/tr-types.h"
23 #include "object-enchant/trg-types.h"
24 #include "object-hook/hook-quest.h"
25 #include "object/object-flags.h"
26 #include "object/object-kind.h"
27 #include "perception/object-perception.h"
28 #include "player/player-status-table.h"
29 #include "player/player-status.h"
30 #include "specific-object/bow.h"
31 #include "sv-definition/sv-lite-types.h"
32 #include "sv-definition/sv-weapon-types.h"
33 #include "system/floor-type-definition.h"
34 #include "system/object-type-definition.h"
35 #include "system/player-type-definition.h"
36 #include "util/bit-flags-calculator.h"
37 #include "util/string-processor.h"
38 #include "window/display-sub-window-items.h"
39
40 static void describe_chest_trap(flavor_type *flavor_ptr)
41 {
42     switch (chest_traps[flavor_ptr->o_ptr->pval]) {
43     case 0:
44         flavor_ptr->t = object_desc_str(flavor_ptr->t, _("(施錠)", " (Locked)"));
45         break;
46     case CHEST_LOSE_STR:
47         flavor_ptr->t = object_desc_str(flavor_ptr->t, _("(毒針)", " (Poison Needle)"));
48         break;
49     case CHEST_LOSE_CON:
50         flavor_ptr->t = object_desc_str(flavor_ptr->t, _("(毒針)", " (Poison Needle)"));
51         break;
52     case CHEST_POISON:
53         flavor_ptr->t = object_desc_str(flavor_ptr->t, _("(ガス・トラップ)", " (Gas Trap)"));
54         break;
55     case CHEST_PARALYZE:
56         flavor_ptr->t = object_desc_str(flavor_ptr->t, _("(ガス・トラップ)", " (Gas Trap)"));
57         break;
58     case CHEST_EXPLODE:
59         flavor_ptr->t = object_desc_str(flavor_ptr->t, _("(爆発装置)", " (Explosion Device)"));
60         break;
61     case CHEST_SUMMON:
62     case CHEST_BIRD_STORM:
63     case CHEST_E_SUMMON:
64     case CHEST_H_SUMMON:
65         flavor_ptr->t = object_desc_str(flavor_ptr->t, _("(召喚のルーン)", " (Summoning Runes)"));
66         break;
67     case CHEST_RUNES_OF_EVIL:
68         flavor_ptr->t = object_desc_str(flavor_ptr->t, _("(邪悪なルーン)", " (Gleaming Black Runes)"));
69         break;
70     case CHEST_ALARM:
71         flavor_ptr->t = object_desc_str(flavor_ptr->t, _("(警報装置)", " (Alarm)"));
72         break;
73     default:
74         flavor_ptr->t = object_desc_str(flavor_ptr->t, _("(マルチ・トラップ)", " (Multiple Traps)"));
75         break;
76     }
77 }
78
79 static void describe_chest(flavor_type *flavor_ptr)
80 {
81     if (flavor_ptr->o_ptr->tval != TV_CHEST)
82         return;
83
84     if (!flavor_ptr->known)
85         return;
86
87     if (!flavor_ptr->o_ptr->pval) {
88         flavor_ptr->t = object_desc_str(flavor_ptr->t, _("(空)", " (empty)"));
89         return;
90     }
91
92     if (flavor_ptr->o_ptr->pval < 0) {
93         if (chest_traps[0 - flavor_ptr->o_ptr->pval])
94             flavor_ptr->t = object_desc_str(flavor_ptr->t, _("(解除済)", " (disarmed)"));
95         else
96             flavor_ptr->t = object_desc_str(flavor_ptr->t, _("(非施錠)", " (unlocked)"));
97
98         return;
99     }
100
101     describe_chest_trap(flavor_ptr);
102 }
103
104 static void decide_tval_show(flavor_type *flavor_ptr)
105 {
106     if (flavor_ptr->tr_flags.has(TR_SHOW_MODS))
107         flavor_ptr->show_weapon = true;
108
109     if (flavor_ptr->o_ptr->is_smith() && (Smith::object_effect(flavor_ptr->o_ptr) == SmithEffect::SLAY_GLOVE))
110         flavor_ptr->show_weapon = true;
111
112     if (flavor_ptr->o_ptr->to_h && flavor_ptr->o_ptr->to_d)
113         flavor_ptr->show_weapon = true;
114
115     if (flavor_ptr->o_ptr->ac)
116         flavor_ptr->show_armour = true;
117 }
118
119 static void describe_weapon_dice(player_type *player_ptr, flavor_type *flavor_ptr)
120 {
121     if (!flavor_ptr->known && object_is_quest_target(player_ptr->current_floor_ptr->inside_quest, flavor_ptr->o_ptr))
122         return;
123
124     flavor_ptr->t = object_desc_chr(flavor_ptr->t, ' ');
125     flavor_ptr->t = object_desc_chr(flavor_ptr->t, flavor_ptr->p1);
126     auto is_bonus = (player_ptr->riding > 0) && flavor_ptr->o_ptr->is_lance();
127     auto bonus = is_bonus ? 2 : 0;
128     flavor_ptr->t = object_desc_num(flavor_ptr->t, flavor_ptr->o_ptr->dd + bonus);
129     flavor_ptr->t = object_desc_chr(flavor_ptr->t, 'd');
130     flavor_ptr->t = object_desc_num(flavor_ptr->t, flavor_ptr->o_ptr->ds);
131     flavor_ptr->t = object_desc_chr(flavor_ptr->t, flavor_ptr->p2);
132 }
133
134 static void describe_bow(player_type *player_ptr, flavor_type *flavor_ptr)
135 {
136     flavor_ptr->power = bow_tmul(flavor_ptr->o_ptr->sval);
137     if (flavor_ptr->tr_flags.has(TR_XTRA_MIGHT))
138         flavor_ptr->power++;
139
140     flavor_ptr->t = object_desc_chr(flavor_ptr->t, ' ');
141     flavor_ptr->t = object_desc_chr(flavor_ptr->t, flavor_ptr->p1);
142     flavor_ptr->t = object_desc_chr(flavor_ptr->t, 'x');
143     flavor_ptr->t = object_desc_num(flavor_ptr->t, flavor_ptr->power);
144     flavor_ptr->t = object_desc_chr(flavor_ptr->t, flavor_ptr->p2);
145
146     int num_fire = 100;
147     if (!(flavor_ptr->mode & OD_DEBUG)) {
148         num_fire = calc_num_fire(player_ptr, flavor_ptr->o_ptr);
149     } else {
150         auto flgs = object_flags(flavor_ptr->o_ptr);
151         if (flgs.has(TR_XTRA_SHOTS))
152             num_fire += 100;
153     }
154     if ((num_fire == 0) || (flavor_ptr->power <= 0) || !flavor_ptr->known)
155         return;
156
157     flavor_ptr->fire_rate = bow_energy(flavor_ptr->o_ptr->sval) / num_fire;
158     flavor_ptr->t = object_desc_chr(flavor_ptr->t, ' ');
159     flavor_ptr->t = object_desc_chr(flavor_ptr->t, flavor_ptr->p1);
160     flavor_ptr->t = object_desc_num(flavor_ptr->t, flavor_ptr->fire_rate / 100);
161     flavor_ptr->t = object_desc_chr(flavor_ptr->t, '.');
162     flavor_ptr->t = object_desc_num(flavor_ptr->t, flavor_ptr->fire_rate % 100);
163     flavor_ptr->t = object_desc_str(flavor_ptr->t, "turn");
164     flavor_ptr->t = object_desc_chr(flavor_ptr->t, flavor_ptr->p2);
165 }
166
167 static void describe_tval(player_type *player_ptr, flavor_type *flavor_ptr)
168 {
169     switch (flavor_ptr->o_ptr->tval) {
170     case TV_SHOT:
171     case TV_BOLT:
172     case TV_ARROW:
173     case TV_HAFTED:
174     case TV_POLEARM:
175     case TV_SWORD:
176     case TV_DIGGING:
177         describe_weapon_dice(player_ptr, flavor_ptr);
178         break;
179     case TV_BOW:
180         describe_bow(player_ptr, flavor_ptr);
181         break;
182
183     default:
184         break;
185     }
186 }
187
188 static void describe_named_item_tval(flavor_type *flavor_ptr)
189 {
190     if (!flavor_ptr->known)
191         return;
192
193     if (flavor_ptr->show_weapon) {
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_h);
197         flavor_ptr->t = object_desc_chr(flavor_ptr->t, ',');
198         flavor_ptr->t = object_desc_int(flavor_ptr->t, flavor_ptr->o_ptr->to_d);
199         flavor_ptr->t = object_desc_chr(flavor_ptr->t, flavor_ptr->p2);
200         return;
201     }
202
203     if (flavor_ptr->o_ptr->to_h != 0) {
204         flavor_ptr->t = object_desc_chr(flavor_ptr->t, ' ');
205         flavor_ptr->t = object_desc_chr(flavor_ptr->t, flavor_ptr->p1);
206         flavor_ptr->t = object_desc_int(flavor_ptr->t, flavor_ptr->o_ptr->to_h);
207         flavor_ptr->t = object_desc_chr(flavor_ptr->t, flavor_ptr->p2);
208         return;
209     }
210
211     if (flavor_ptr->o_ptr->to_d != 0) {
212         flavor_ptr->t = object_desc_chr(flavor_ptr->t, ' ');
213         flavor_ptr->t = object_desc_chr(flavor_ptr->t, flavor_ptr->p1);
214         flavor_ptr->t = object_desc_int(flavor_ptr->t, flavor_ptr->o_ptr->to_d);
215         flavor_ptr->t = object_desc_chr(flavor_ptr->t, flavor_ptr->p2);
216     }
217 }
218
219 static void describe_fire_energy(player_type *player_ptr, flavor_type *flavor_ptr)
220 {
221     ENERGY energy_fire = bow_energy(flavor_ptr->bow_ptr->sval);
222     if (player_ptr->num_fire == 0) {
223         flavor_ptr->t = object_desc_chr(flavor_ptr->t, '0');
224         return;
225     }
226
227     flavor_ptr->avgdam *= (player_ptr->num_fire * 100);
228     flavor_ptr->avgdam /= energy_fire;
229     flavor_ptr->t = object_desc_num(flavor_ptr->t, flavor_ptr->avgdam);
230     flavor_ptr->t = object_desc_str(flavor_ptr->t, show_ammo_detail ? "/turn" : "");
231     if (!show_ammo_crit_ratio)
232         return;
233
234     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);
235     flavor_ptr->t = object_desc_chr(flavor_ptr->t, '/');
236     flavor_ptr->t = object_desc_num(flavor_ptr->t, percent / 100);
237     flavor_ptr->t = object_desc_chr(flavor_ptr->t, '.');
238     if (percent % 100 < 10)
239         flavor_ptr->t = object_desc_chr(flavor_ptr->t, '0');
240
241     flavor_ptr->t = object_desc_num(flavor_ptr->t, percent % 100);
242     flavor_ptr->t = object_desc_str(flavor_ptr->t, show_ammo_detail ? "% crit" : "%");
243 }
244
245 static void describe_bow_power(player_type *player_ptr, flavor_type *flavor_ptr)
246 {
247     flavor_ptr->avgdam = flavor_ptr->o_ptr->dd * (flavor_ptr->o_ptr->ds + 1) * 10 / 2;
248     int tmul = bow_tmul(flavor_ptr->bow_ptr->sval);
249     if (flavor_ptr->bow_ptr->is_known())
250         flavor_ptr->avgdam += (flavor_ptr->bow_ptr->to_d * 10);
251
252     if (flavor_ptr->known)
253         flavor_ptr->avgdam += (flavor_ptr->o_ptr->to_d * 10);
254
255     if (player_ptr->xtra_might)
256         tmul++;
257
258     tmul = tmul * (100 + (int)(adj_str_td[player_ptr->stat_index[A_STR]]) - 128);
259     flavor_ptr->avgdam *= tmul;
260     flavor_ptr->avgdam /= (100 * 10);
261     if (player_ptr->concent)
262         flavor_ptr->avgdam = boost_concentration_damage(player_ptr, flavor_ptr->avgdam);
263
264     if (flavor_ptr->avgdam < 0)
265         flavor_ptr->avgdam = 0;
266
267     flavor_ptr->t = object_desc_chr(flavor_ptr->t, ' ');
268     flavor_ptr->t = object_desc_chr(flavor_ptr->t, flavor_ptr->p1);
269     if (show_ammo_no_crit) {
270         flavor_ptr->t = object_desc_num(flavor_ptr->t, flavor_ptr->avgdam);
271         flavor_ptr->t = object_desc_str(flavor_ptr->t, show_ammo_detail ? "/shot " : "/");
272     }
273
274     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);
275     flavor_ptr->t = object_desc_num(flavor_ptr->t, flavor_ptr->avgdam);
276     flavor_ptr->t = show_ammo_no_crit ? object_desc_str(flavor_ptr->t, show_ammo_detail ? "/crit " : "/")
277                                       : object_desc_str(flavor_ptr->t, show_ammo_detail ? "/shot " : "/");
278     describe_fire_energy(player_ptr, flavor_ptr);
279     flavor_ptr->t = object_desc_chr(flavor_ptr->t, flavor_ptr->p2);
280 }
281
282 static void describe_spike_power(player_type *player_ptr, flavor_type *flavor_ptr)
283 {
284     int avgdam = player_ptr->mighty_throw ? (1 + 3) : 1;
285     int16_t energy_fire = 100 - player_ptr->lev;
286     avgdam += ((player_ptr->lev + 30) * (player_ptr->lev + 30) - 900) / 55;
287     flavor_ptr->t = object_desc_chr(flavor_ptr->t, ' ');
288     flavor_ptr->t = object_desc_chr(flavor_ptr->t, flavor_ptr->p1);
289     flavor_ptr->t = object_desc_num(flavor_ptr->t, avgdam);
290     flavor_ptr->t = object_desc_chr(flavor_ptr->t, '/');
291     avgdam = 100 * avgdam / energy_fire;
292     flavor_ptr->t = object_desc_num(flavor_ptr->t, avgdam);
293     flavor_ptr->t = object_desc_chr(flavor_ptr->t, flavor_ptr->p2);
294 }
295
296 static void describe_known_item_ac(flavor_type *flavor_ptr)
297 {
298     if (flavor_ptr->show_armour) {
299         flavor_ptr->t = object_desc_chr(flavor_ptr->t, ' ');
300         flavor_ptr->t = object_desc_chr(flavor_ptr->t, flavor_ptr->b1);
301         flavor_ptr->t = object_desc_num(flavor_ptr->t, flavor_ptr->o_ptr->ac);
302         flavor_ptr->t = object_desc_chr(flavor_ptr->t, ',');
303         flavor_ptr->t = object_desc_int(flavor_ptr->t, flavor_ptr->o_ptr->to_a);
304         flavor_ptr->t = object_desc_chr(flavor_ptr->t, flavor_ptr->b2);
305         return;
306     }
307
308     if (flavor_ptr->o_ptr->to_a == 0)
309         return;
310
311     flavor_ptr->t = object_desc_chr(flavor_ptr->t, ' ');
312     flavor_ptr->t = object_desc_chr(flavor_ptr->t, flavor_ptr->b1);
313     flavor_ptr->t = object_desc_int(flavor_ptr->t, flavor_ptr->o_ptr->to_a);
314     flavor_ptr->t = object_desc_chr(flavor_ptr->t, flavor_ptr->b2);
315 }
316
317 static void describe_ac(flavor_type *flavor_ptr)
318 {
319     if (flavor_ptr->known) {
320         describe_known_item_ac(flavor_ptr);
321         return;
322     }
323
324     if (!flavor_ptr->show_armour)
325         return;
326
327     flavor_ptr->t = object_desc_chr(flavor_ptr->t, ' ');
328     flavor_ptr->t = object_desc_chr(flavor_ptr->t, flavor_ptr->b1);
329     flavor_ptr->t = object_desc_num(flavor_ptr->t, flavor_ptr->o_ptr->ac);
330     flavor_ptr->t = object_desc_chr(flavor_ptr->t, flavor_ptr->b2);
331 }
332
333 static void describe_charges_staff_wand(flavor_type *flavor_ptr)
334 {
335     flavor_ptr->t = object_desc_chr(flavor_ptr->t, ' ');
336     flavor_ptr->t = object_desc_chr(flavor_ptr->t, flavor_ptr->p1);
337     if ((flavor_ptr->o_ptr->tval == TV_STAFF) && (flavor_ptr->o_ptr->number > 1)) {
338         flavor_ptr->t = object_desc_num(flavor_ptr->t, flavor_ptr->o_ptr->number);
339         flavor_ptr->t = object_desc_str(flavor_ptr->t, "x ");
340     }
341
342     flavor_ptr->t = object_desc_num(flavor_ptr->t, flavor_ptr->o_ptr->pval);
343     flavor_ptr->t = object_desc_str(flavor_ptr->t, _("回分", " charge"));
344 #ifdef JP
345 #else
346     if (flavor_ptr->o_ptr->pval != 1)
347         flavor_ptr->t = object_desc_chr(flavor_ptr->t, 's');
348 #endif
349
350     flavor_ptr->t = object_desc_chr(flavor_ptr->t, flavor_ptr->p2);
351 }
352
353 static void describe_charges_rod(flavor_type *flavor_ptr)
354 {
355     if (flavor_ptr->o_ptr->timeout == 0)
356         return;
357
358     if (flavor_ptr->o_ptr->number <= 1) {
359         flavor_ptr->t = object_desc_str(flavor_ptr->t, _("(充填中)", " (charging)"));
360         return;
361     }
362
363     if (flavor_ptr->k_ptr->pval == 0)
364         flavor_ptr->k_ptr->pval = 1;
365
366     flavor_ptr->power = (flavor_ptr->o_ptr->timeout + (flavor_ptr->k_ptr->pval - 1)) / flavor_ptr->k_ptr->pval;
367     if (flavor_ptr->power > flavor_ptr->o_ptr->number)
368         flavor_ptr->power = flavor_ptr->o_ptr->number;
369
370     flavor_ptr->t = object_desc_str(flavor_ptr->t, " (");
371     flavor_ptr->t = object_desc_num(flavor_ptr->t, flavor_ptr->power);
372     flavor_ptr->t = object_desc_str(flavor_ptr->t, _("本 充填中)", " charging)"));
373 }
374
375 static void describe_specific_pval(flavor_type *flavor_ptr)
376 {
377     if (flavor_ptr->tr_flags.has(TR_SPEED)) {
378         flavor_ptr->t = object_desc_str(flavor_ptr->t, _("加速", " to speed"));
379         return;
380     }
381
382     if (flavor_ptr->tr_flags.has(TR_BLOWS)) {
383         flavor_ptr->t = object_desc_str(flavor_ptr->t, _("攻撃", " attack"));
384 #ifdef JP
385 #else
386         if (ABS(flavor_ptr->o_ptr->pval) != 1)
387             flavor_ptr->t = object_desc_chr(flavor_ptr->t, 's');
388 #endif
389
390         return;
391     }
392
393     if (flavor_ptr->tr_flags.has(TR_STEALTH)) {
394         flavor_ptr->t = object_desc_str(flavor_ptr->t, _("隠密", " to stealth"));
395         return;
396     }
397
398     if (flavor_ptr->tr_flags.has(TR_SEARCH)) {
399         flavor_ptr->t = object_desc_str(flavor_ptr->t, _("探索", " to searching"));
400         return;
401     }
402
403     if (flavor_ptr->tr_flags.has(TR_INFRA))
404         flavor_ptr->t = object_desc_str(flavor_ptr->t, _("赤外線視力", " to infravision"));
405 }
406
407 static void describe_pval(flavor_type *flavor_ptr)
408 {
409     if (flavor_ptr->tr_flags.has_none_of(TR_PVAL_FLAG_MASK))
410         return;
411
412     flavor_ptr->t = object_desc_chr(flavor_ptr->t, ' ');
413     flavor_ptr->t = object_desc_chr(flavor_ptr->t, flavor_ptr->p1);
414     flavor_ptr->t = object_desc_int(flavor_ptr->t, flavor_ptr->o_ptr->pval);
415     if (flavor_ptr->tr_flags.has(TR_HIDE_TYPE)) {
416         flavor_ptr->t = object_desc_chr(flavor_ptr->t, flavor_ptr->p2);
417         return;
418     }
419
420     describe_specific_pval(flavor_ptr);
421     flavor_ptr->t = object_desc_chr(flavor_ptr->t, flavor_ptr->p2);
422 }
423
424 static void describe_lamp_life(flavor_type *flavor_ptr)
425 {
426     if ((flavor_ptr->o_ptr->tval != TV_LITE) || (flavor_ptr->o_ptr->is_fixed_artifact() || (flavor_ptr->o_ptr->sval == SV_LITE_FEANOR)))
427         return;
428
429     flavor_ptr->t = object_desc_str(flavor_ptr->t, _("(", " (with "));
430     if (flavor_ptr->o_ptr->name2 == EGO_LITE_LONG)
431         flavor_ptr->t = object_desc_num(flavor_ptr->t, flavor_ptr->o_ptr->xtra4 * 2);
432     else
433         flavor_ptr->t = object_desc_num(flavor_ptr->t, flavor_ptr->o_ptr->xtra4);
434
435     flavor_ptr->t = object_desc_str(flavor_ptr->t, _("ターンの寿命)", " turns of light)"));
436 }
437
438 /*!
439  * @brief 杖や光源等、寿命のあるアイテムの残り回数やターン表記
440  * @param アイテム表記への参照ポインタ
441  */
442 static void describe_remaining(flavor_type *flavor_ptr)
443 {
444     if (!flavor_ptr->known)
445         return;
446
447     if (((flavor_ptr->o_ptr->tval == TV_STAFF) || (flavor_ptr->o_ptr->tval == TV_WAND)))
448         describe_charges_staff_wand(flavor_ptr);
449     else if (flavor_ptr->o_ptr->tval == TV_ROD)
450         describe_charges_rod(flavor_ptr);
451
452     describe_pval(flavor_ptr);
453     describe_lamp_life(flavor_ptr);
454     if (flavor_ptr->o_ptr->timeout && (flavor_ptr->o_ptr->tval != TV_ROD))
455         flavor_ptr->t = object_desc_str(flavor_ptr->t, _("(充填中)", " (charging)"));
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 (flavor_ptr->o_ptr->is_cursed() && (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 && flavor_ptr->o_ptr->is_tried())
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 || o_ptr->k_idx == 0) {
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(flavor_ptr);
507     describe_tval(player_ptr, flavor_ptr);
508     describe_named_item_tval(flavor_ptr);
509     if (!(mode & OD_DEBUG)) {
510         flavor_ptr->bow_ptr = &player_ptr->inventory_list[INVEN_BOW];
511         if ((flavor_ptr->bow_ptr->k_idx != 0) && (flavor_ptr->o_ptr->tval == bow_tval_ammo(flavor_ptr->bow_ptr)))
512             describe_bow_power(player_ptr, flavor_ptr);
513         else if ((player_ptr->pclass == CLASS_NINJA) && (flavor_ptr->o_ptr->tval == TV_SPIKE))
514             describe_spike_power(player_ptr, flavor_ptr);
515     }
516
517     describe_ac(flavor_ptr);
518     if (flavor_ptr->mode & OD_NAME_AND_ENCHANT) {
519         angband_strcpy(flavor_ptr->buf, flavor_ptr->tmp_val, MAX_NLEN);
520         return;
521     }
522
523     describe_remaining(flavor_ptr);
524     if (flavor_ptr->mode & OD_OMIT_INSCRIPTION) {
525         angband_strcpy(flavor_ptr->buf, flavor_ptr->tmp_val, MAX_NLEN);
526         return;
527     }
528
529     display_short_flavors(flavor_ptr);
530     decide_item_feeling(flavor_ptr);
531     display_item_discount(flavor_ptr);
532     display_item_fake_inscription(flavor_ptr);
533     angband_strcpy(flavor_ptr->buf, flavor_ptr->tmp_val, MAX_NLEN);
534 }