OSDN Git Service

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