OSDN Git Service

[Refactor] #40534 Separated describe_food() from describe_flavor()
[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/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 "monster-race/monster-race.h"
19 #include "object-enchant/artifact.h"
20 #include "object-enchant/object-ego.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-checker.h"
25 #include "object-hook/hook-enchant.h"
26 #include "object-hook/hook-quest.h"
27 #include "object/object-flags.h"
28 #include "object/object-kind.h"
29 #include "perception/object-perception.h"
30 #include "sv-definition/sv-lite-types.h"
31 #include "util/bit-flags-calculator.h"
32 #include "util/quarks.h"
33 #include "util/string-processor.h"
34 #ifdef JP
35 #else
36 #include "locale/english.h"
37 #include "monster-race/race-flags1.h"
38 #include "player/player-class.h"
39 #endif
40
41 static void check_object_known_aware(player_type *player_ptr, flavor_type *flavor_ptr)
42 {
43     object_flags(player_ptr, flavor_ptr->o_ptr, flavor_ptr->flags);
44     if (object_is_aware(flavor_ptr->o_ptr))
45         flavor_ptr->aware = TRUE;
46
47     if (object_is_known(flavor_ptr->o_ptr))
48         flavor_ptr->known = TRUE;
49
50     if (flavor_ptr->aware && ((flavor_ptr->mode & OD_NO_FLAVOR) || plain_descriptions))
51         flavor_ptr->flavor = FALSE;
52
53     if ((flavor_ptr->mode & OD_STORE) || (flavor_ptr->o_ptr->ident & IDENT_STORE)) {
54         flavor_ptr->flavor = FALSE;
55         flavor_ptr->aware = TRUE;
56         flavor_ptr->known = TRUE;
57     }
58
59     if (flavor_ptr->mode & OD_FORCE_FLAVOR) {
60         flavor_ptr->aware = FALSE;
61         flavor_ptr->flavor = TRUE;
62         flavor_ptr->known = FALSE;
63         flavor_ptr->flavor_k_ptr = flavor_ptr->k_ptr;
64     }
65 }
66
67 static void describe_monster_ball(flavor_type *flavor_ptr)
68 {
69     monster_race *r_ptr = &r_info[flavor_ptr->o_ptr->pval];
70     if (flavor_ptr->known)
71         return;
72
73     if (!flavor_ptr->o_ptr->pval) {
74         flavor_ptr->modstr = _(" (空)", " (empty)");
75         return;
76     }
77
78 #ifdef JP
79     sprintf(flavor_ptr->tmp_val2, " (%s)", r_name + r_ptr->name);
80     flavor_ptr->modstr = flavor_ptr->tmp_val2;
81 #else
82     flavor_ptr->t = r_name + r_ptr->name;
83     if (!(r_ptr->flags1 & RF1_UNIQUE)) {
84         sprintf(flavor_ptr->tmp_val2, " (%s%s)", (is_a_vowel(*flavor_ptr->t) ? "an " : "a "), flavor_ptr->t);
85         flavor_ptr->modstr = flavor_ptr->tmp_val2;
86     } else {
87         sprintf(flavor_ptr->tmp_val2, "(%s)", flavor_ptr->t);
88         flavor_ptr->modstr = flavor_ptr->t;
89     }
90 #endif
91 }
92
93 static void describe_statue(flavor_type *flavor_ptr)
94 {
95     monster_race *r_ptr = &r_info[flavor_ptr->o_ptr->pval];
96 #ifdef JP
97     flavor_ptr->modstr = r_name + r_ptr->name;
98 #else
99     flavor_ptr->t = r_name + r_ptr->name;
100     if (!(r_ptr->flags1 & RF1_UNIQUE)) {
101         sprintf(flavor_ptr->tmp_val2, "%s%s", (is_a_vowel(*flavor_ptr->t) ? "an " : "a "), flavor_ptr->t);
102         flavor_ptr->modstr = flavor_ptr->tmp_val2;
103     } else
104         flavor_ptr->modstr = flavor_ptr->t;
105 #endif
106 }
107
108 static void describe_corpse(flavor_type *flavor_ptr)
109 {
110     monster_race *r_ptr = &r_info[flavor_ptr->o_ptr->pval];
111     flavor_ptr->modstr = r_name + r_ptr->name;
112 #ifdef JP
113     flavor_ptr->basenm = "#%";
114 #else
115     if (r_ptr->flags1 & RF1_UNIQUE)
116         flavor_ptr->basenm = "& % of #";
117     else
118         flavor_ptr->basenm = "& # %";
119 #endif
120 }
121
122 static void describe_amulet(flavor_type *flavor_ptr)
123 {
124     if (flavor_ptr->aware && (object_is_fixed_artifact(flavor_ptr->o_ptr) || ((flavor_ptr->k_ptr->gen_flags & TRG_INSTA_ART) != 0)))
125         return;
126
127     flavor_ptr->modstr = k_name + flavor_ptr->flavor_k_ptr->flavor_name;
128     if (!flavor_ptr->flavor)
129         flavor_ptr->basenm = _("%のアミュレット", "& Amulet~ of %");
130     else if (flavor_ptr->aware)
131         flavor_ptr->basenm = _("%の#アミュレット", "& # Amulet~ of %");
132     else
133         flavor_ptr->basenm = _("#アミュレット", "& # Amulet~");
134 }
135
136 static void describe_ring(flavor_type *flavor_ptr)
137 {
138     if (flavor_ptr->aware && (object_is_fixed_artifact(flavor_ptr->o_ptr) || (flavor_ptr->k_ptr->gen_flags & TRG_INSTA_ART) != 0))
139         return;
140
141     flavor_ptr->modstr = k_name + flavor_ptr->flavor_k_ptr->flavor_name;
142     if (!flavor_ptr->flavor)
143         flavor_ptr->basenm = _("%の指輪", "& Ring~ of %");
144     else if (flavor_ptr->aware)
145         flavor_ptr->basenm = _("%の#指輪", "& # Ring~ of %");
146     else
147         flavor_ptr->basenm = _("#指輪", "& # Ring~");
148
149     if (!flavor_ptr->k_ptr->to_h && !flavor_ptr->k_ptr->to_d && (flavor_ptr->o_ptr->to_h || flavor_ptr->o_ptr->to_d))
150         flavor_ptr->show_weapon = TRUE;
151 }
152
153 static void describe_staff(flavor_type *flavor_ptr)
154 {
155     flavor_ptr->modstr = k_name + flavor_ptr->flavor_k_ptr->flavor_name;
156     if (!flavor_ptr->flavor)
157         flavor_ptr->basenm = _("%の杖", "& Staff~ of %");
158     else if (flavor_ptr->aware)
159         flavor_ptr->basenm = _("%の#杖", "& # Staff~ of %");
160     else
161         flavor_ptr->basenm = _("#杖", "& # Staff~");
162 }
163
164 static void describe_wand(flavor_type *flavor_ptr)
165 {
166     flavor_ptr->modstr = k_name + flavor_ptr->flavor_k_ptr->flavor_name;
167     if (!flavor_ptr->flavor)
168         flavor_ptr->basenm = _("%の魔法棒", "& Wand~ of %");
169     else if (flavor_ptr->aware)
170         flavor_ptr->basenm = _("%の#魔法棒", "& # Wand~ of %");
171     else
172         flavor_ptr->basenm = _("#魔法棒", "& # Wand~");
173 }
174
175 static void describe_rod(flavor_type *flavor_ptr)
176 {
177     flavor_ptr->modstr = k_name + flavor_ptr->flavor_k_ptr->flavor_name;
178     if (!flavor_ptr->flavor)
179         flavor_ptr->basenm = _("%のロッド", "& Rod~ of %");
180     else if (flavor_ptr->aware)
181         flavor_ptr->basenm = _("%の#ロッド", "& # Rod~ of %");
182     else
183         flavor_ptr->basenm = _("#ロッド", "& # Rod~");
184 }
185
186 static void describe_scroll(flavor_type *flavor_ptr)
187 {
188     flavor_ptr->modstr = k_name + flavor_ptr->flavor_k_ptr->flavor_name;
189     if (!flavor_ptr->flavor)
190         flavor_ptr->basenm = _("%の巻物", "& Scroll~ of %");
191     else if (flavor_ptr->aware)
192         flavor_ptr->basenm = _("「#」と書かれた%の巻物", "& Scroll~ titled \"#\" of %");
193     else
194         flavor_ptr->basenm = _("「#」と書かれた巻物", "& Scroll~ titled \"#\"");
195 }
196
197 static void describe_potion(flavor_type *flavor_ptr)
198 {
199     flavor_ptr->modstr = k_name + flavor_ptr->flavor_k_ptr->flavor_name;
200     if (!flavor_ptr->flavor)
201         flavor_ptr->basenm = _("%の薬", "& Potion~ of %");
202     else if (flavor_ptr->aware)
203         flavor_ptr->basenm = _("%の#薬", "& # Potion~ of %");
204     else
205         flavor_ptr->basenm = _("#薬", "& # Potion~");
206 }
207
208 static void describe_food(flavor_type *flavor_ptr)
209 {
210     if (!flavor_ptr->k_ptr->flavor_name)
211         return;
212
213     flavor_ptr->modstr = k_name + flavor_ptr->flavor_k_ptr->flavor_name;
214     if (!flavor_ptr->flavor)
215         flavor_ptr->basenm = _("%のキノコ", "& Mushroom~ of %");
216     else if (flavor_ptr->aware)
217         flavor_ptr->basenm = _("%の#キノコ", "& # Mushroom~ of %");
218     else
219         flavor_ptr->basenm = _("#キノコ", "& # Mushroom~");
220 }
221
222 /*!
223  * @brief オブジェクトの各表記を返すメイン関数 / Creates a description of the item "o_ptr", and stores it in "out_val".
224  * @param player_ptr プレーヤーへの参照ポインタ
225  * @param buf 表記を返すための文字列参照ポインタ
226  * @param o_ptr 特性短縮表記を得たいオブジェクト構造体の参照ポインタ
227  * @param mode 表記に関するオプション指定
228  * @return 現在クエスト達成目的のアイテムならばTRUEを返す
229  */
230 void describe_flavor(player_type *player_ptr, char *buf, object_type *o_ptr, BIT_FLAGS mode)
231 {
232     flavor_type tmp_flavor;
233     flavor_type *flavor_ptr = initialize_flavor_type(&tmp_flavor, buf, o_ptr, mode);
234     check_object_known_aware(player_ptr, flavor_ptr);
235     switch (flavor_ptr->o_ptr->tval) {
236     case TV_SKELETON:
237     case TV_BOTTLE:
238     case TV_JUNK:
239     case TV_SPIKE:
240     case TV_FLASK:
241     case TV_CHEST:
242     case TV_WHISTLE:
243         break;
244     case TV_CAPTURE:
245         describe_monster_ball(flavor_ptr);
246         break;
247     case TV_FIGURINE:
248     case TV_STATUE:
249         describe_statue(flavor_ptr);
250         break;
251     case TV_CORPSE:
252         describe_corpse(flavor_ptr);
253         break;
254     case TV_SHOT:
255     case TV_BOLT:
256     case TV_ARROW:
257     case TV_BOW:
258     case TV_HAFTED:
259     case TV_POLEARM:
260     case TV_SWORD:
261     case TV_DIGGING:
262         flavor_ptr->show_weapon = TRUE;
263         break;
264     case TV_BOOTS:
265     case TV_GLOVES:
266     case TV_CLOAK:
267     case TV_CROWN:
268     case TV_HELM:
269     case TV_SHIELD:
270     case TV_SOFT_ARMOR:
271     case TV_HARD_ARMOR:
272     case TV_DRAG_ARMOR:
273         flavor_ptr->show_armour = TRUE;
274         break;
275     case TV_LITE:
276         break;
277     case TV_AMULET:
278         describe_amulet(flavor_ptr);
279         break;
280     case TV_RING:
281         describe_ring(flavor_ptr);
282         break;
283     case TV_CARD:
284         break;
285     case TV_STAFF:
286         describe_staff(flavor_ptr);
287         break;
288     case TV_WAND:
289         describe_wand(flavor_ptr);
290         break;
291     case TV_ROD:
292         describe_rod(flavor_ptr);
293         break;
294     case TV_SCROLL:
295         describe_scroll(flavor_ptr);
296         break;
297     case TV_POTION:
298         describe_potion(flavor_ptr);
299         break;
300     case TV_FOOD:
301         describe_food(flavor_ptr);
302         break;
303     case TV_PARCHMENT: {
304         flavor_ptr->basenm = _("羊皮紙 - %", "& Parchment~ - %");
305         break;
306     }
307     case TV_LIFE_BOOK: {
308 #ifdef JP
309         flavor_ptr->basenm = "生命の魔法書%";
310 #else
311         if (mp_ptr->spell_book == TV_LIFE_BOOK)
312             flavor_ptr->basenm = "& Book~ of Life Magic %";
313         else
314             flavor_ptr->basenm = "& Life Spellbook~ %";
315 #endif
316
317         break;
318     }
319     case TV_SORCERY_BOOK: {
320 #ifdef JP
321         flavor_ptr->basenm = "仙術の魔法書%";
322 #else
323         if (mp_ptr->spell_book == TV_LIFE_BOOK)
324             flavor_ptr->basenm = "& Book~ of Sorcery %";
325         else
326             flavor_ptr->basenm = "& Sorcery Spellbook~ %";
327 #endif
328
329         break;
330     }
331     case TV_NATURE_BOOK: {
332 #ifdef JP
333         flavor_ptr->basenm = "自然の魔法書%";
334 #else
335         if (mp_ptr->spell_book == TV_LIFE_BOOK)
336             flavor_ptr->basenm = "& Book~ of Nature Magic %";
337         else
338             flavor_ptr->basenm = "& Nature Spellbook~ %";
339 #endif
340
341         break;
342     }
343     case TV_CHAOS_BOOK: {
344 #ifdef JP
345         flavor_ptr->basenm = "カオスの魔法書%";
346 #else
347         if (mp_ptr->spell_book == TV_LIFE_BOOK)
348             flavor_ptr->basenm = "& Book~ of Chaos Magic %";
349         else
350             flavor_ptr->basenm = "& Chaos Spellbook~ %";
351 #endif
352
353         break;
354     }
355     case TV_DEATH_BOOK: {
356 #ifdef JP
357         flavor_ptr->basenm = "暗黒の魔法書%";
358 #else
359         if (mp_ptr->spell_book == TV_LIFE_BOOK)
360             flavor_ptr->basenm = "& Book~ of Death Magic %";
361         else
362             flavor_ptr->basenm = "& Death Spellbook~ %";
363 #endif
364
365         break;
366     }
367     case TV_TRUMP_BOOK: {
368 #ifdef JP
369         flavor_ptr->basenm = "トランプの魔法書%";
370 #else
371         if (mp_ptr->spell_book == TV_LIFE_BOOK)
372             flavor_ptr->basenm = "& Book~ of Trump Magic %";
373         else
374             flavor_ptr->basenm = "& Trump Spellbook~ %";
375 #endif
376
377         break;
378     }
379     case TV_ARCANE_BOOK: {
380 #ifdef JP
381         flavor_ptr->basenm = "秘術の魔法書%";
382 #else
383         if (mp_ptr->spell_book == TV_LIFE_BOOK)
384             flavor_ptr->basenm = "& Book~ of Arcane Magic %";
385         else
386             flavor_ptr->basenm = "& Arcane Spellbook~ %";
387 #endif
388
389         break;
390     }
391     case TV_CRAFT_BOOK: {
392 #ifdef JP
393         flavor_ptr->basenm = "匠の魔法書%";
394 #else
395         if (mp_ptr->spell_book == TV_LIFE_BOOK)
396             flavor_ptr->basenm = "& Book~ of Craft Magic %";
397         else
398             flavor_ptr->basenm = "& Craft Spellbook~ %";
399 #endif
400
401         break;
402     }
403     case TV_DAEMON_BOOK: {
404 #ifdef JP
405         flavor_ptr->basenm = "悪魔の魔法書%";
406 #else
407         if (mp_ptr->spell_book == TV_LIFE_BOOK)
408             flavor_ptr->basenm = "& Book~ of Daemon Magic %";
409         else
410             flavor_ptr->basenm = "& Daemon Spellbook~ %";
411 #endif
412
413         break;
414     }
415     case TV_CRUSADE_BOOK: {
416 #ifdef JP
417         flavor_ptr->basenm = "破邪の魔法書%";
418 #else
419         if (mp_ptr->spell_book == TV_LIFE_BOOK)
420             flavor_ptr->basenm = "& Book~ of Crusade Magic %";
421         else
422             flavor_ptr->basenm = "& Crusade Spellbook~ %";
423 #endif
424
425         break;
426     }
427     case TV_MUSIC_BOOK: {
428         flavor_ptr->basenm = _("歌集%", "& Song Book~ %");
429         break;
430     }
431     case TV_HISSATSU_BOOK: {
432         flavor_ptr->basenm = _("& 武芸の書%", "Book~ of Kendo %");
433         break;
434     }
435     case TV_HEX_BOOK: {
436 #ifdef JP
437         flavor_ptr->basenm = "呪術の魔法書%";
438 #else
439         if (mp_ptr->spell_book == TV_LIFE_BOOK)
440             flavor_ptr->basenm = "& Book~ of Hex Magic %";
441         else
442             flavor_ptr->basenm = "& Hex Spellbook~ %";
443 #endif
444
445         break;
446     }
447     case TV_GOLD: {
448         strcpy(flavor_ptr->buf, flavor_ptr->basenm);
449         return;
450     }
451     default: {
452         strcpy(flavor_ptr->buf, _("(なし)", "(nothing)"));
453         return;
454     }
455     }
456
457     if (flavor_ptr->aware && have_flag(flavor_ptr->flags, TR_FULL_NAME)) {
458         if (flavor_ptr->known && flavor_ptr->o_ptr->name1)
459             flavor_ptr->basenm = a_name + a_info[flavor_ptr->o_ptr->name1].name;
460         else
461             flavor_ptr->basenm = flavor_ptr->kindname;
462     }
463
464     flavor_ptr->t = flavor_ptr->tmp_val;
465 #ifdef JP
466     if (flavor_ptr->basenm[0] == '&')
467         flavor_ptr->s = flavor_ptr->basenm + 2;
468     else
469         flavor_ptr->s = flavor_ptr->basenm;
470
471     /* No prefix */
472     if (flavor_ptr->mode & OD_OMIT_PREFIX) {
473         /* Nothing */
474     } else if (flavor_ptr->o_ptr->number > 1) {
475         flavor_ptr->t = object_desc_count_japanese(flavor_ptr->t, flavor_ptr->o_ptr);
476         flavor_ptr->t = object_desc_str(flavor_ptr->t, "の ");
477     }
478
479     // 英語の場合アーティファクトは The が付くので分かるが、日本語では分からないのでマークをつける.
480     if (flavor_ptr->known) {
481         if (object_is_fixed_artifact(flavor_ptr->o_ptr))
482             flavor_ptr->t = object_desc_str(flavor_ptr->t, "★");
483         else if (flavor_ptr->o_ptr->art_name)
484             flavor_ptr->t = object_desc_str(flavor_ptr->t, "☆");
485     }
486 #else
487
488     if (flavor_ptr->basenm[0] == '&') {
489         flavor_ptr->s = flavor_ptr->basenm + 2;
490         if (flavor_ptr->mode & OD_OMIT_PREFIX) {
491             /* Nothing */
492         } else if (flavor_ptr->o_ptr->number <= 0)
493             flavor_ptr->t = object_desc_str(flavor_ptr->t, "no more ");
494         else if (flavor_ptr->o_ptr->number > 1) {
495             flavor_ptr->t = object_desc_num(flavor_ptr->t, flavor_ptr->o_ptr->number);
496             flavor_ptr->t = object_desc_chr(flavor_ptr->t, ' ');
497         } else if ((flavor_ptr->known && object_is_artifact(flavor_ptr->o_ptr)) || ((flavor_ptr->o_ptr->tval == TV_CORPSE) && (r_info[flavor_ptr->o_ptr->pval].flags1 & RF1_UNIQUE)))
498             flavor_ptr->t = object_desc_str(flavor_ptr->t, "The ");
499         else {
500             bool vowel;
501             switch (*flavor_ptr->s) {
502             case '#':
503                 vowel = is_a_vowel(flavor_ptr->modstr[0]);
504                 break;
505             case '%':
506                 vowel = is_a_vowel(*flavor_ptr->kindname);
507                 break;
508             default:
509                 vowel = is_a_vowel(*flavor_ptr->s);
510                 break;
511             }
512
513             if (vowel)
514                 flavor_ptr->t = object_desc_str(flavor_ptr->t, "an ");
515             else
516                 flavor_ptr->t = object_desc_str(flavor_ptr->t, "a ");
517         }
518     } else {
519         flavor_ptr->s = flavor_ptr->basenm;
520         if (flavor_ptr->mode & OD_OMIT_PREFIX) {
521             /* Nothing */
522         } else if (flavor_ptr->o_ptr->number <= 0)
523             flavor_ptr->t = object_desc_str(flavor_ptr->t, "no more ");
524         else if (flavor_ptr->o_ptr->number > 1) {
525             flavor_ptr->t = object_desc_num(flavor_ptr->t, flavor_ptr->o_ptr->number);
526             flavor_ptr->t = object_desc_chr(flavor_ptr->t, ' ');
527         } else if (flavor_ptr->known && object_is_artifact(flavor_ptr->o_ptr))
528             flavor_ptr->t = object_desc_str(flavor_ptr->t, "The ");
529     }
530 #endif
531
532 #ifdef JP
533     if (object_is_smith(player_ptr, flavor_ptr->o_ptr))
534         flavor_ptr->t = object_desc_str(flavor_ptr->t, format("鍛冶師%flavor_ptr->sの", player_ptr->name));
535
536     /* 伝説のアイテム、名のあるアイテムの名前を付加する */
537     if (flavor_ptr->known) {
538         /* ランダム・アーティファクト */
539         if (flavor_ptr->o_ptr->art_name) {
540             concptr temp = quark_str(flavor_ptr->o_ptr->art_name);
541
542             /* '『' から始まらない伝説のアイテムの名前は最初に付加する */
543             /* 英語版のセーブファイルから来た 'of XXX' は,「XXXの」と表示する */
544             if (strncmp(temp, "of ", 3) == 0) {
545                 flavor_ptr->t = object_desc_str(flavor_ptr->t, &temp[3]);
546                 flavor_ptr->t = object_desc_str(flavor_ptr->t, "の");
547             } else if ((strncmp(temp, "『", 2) != 0) && (strncmp(temp, "《", 2) != 0) && (temp[0] != '\''))
548                 flavor_ptr->t = object_desc_str(flavor_ptr->t, temp);
549         }
550         /* 伝説のアイテム */
551         else if (flavor_ptr->o_ptr->name1 && !have_flag(flavor_ptr->flags, TR_FULL_NAME)) {
552             artifact_type *a_ptr = &a_info[flavor_ptr->o_ptr->name1];
553             /* '『' から始まらない伝説のアイテムの名前は最初に付加する */
554             if (strncmp(a_name + a_ptr->name, "『", 2) != 0) {
555                 flavor_ptr->t = object_desc_str(flavor_ptr->t, a_name + a_ptr->name);
556             }
557         }
558         /* 名のあるアイテム */
559         else if (object_is_ego(flavor_ptr->o_ptr)) {
560             ego_item_type *e_ptr = &e_info[flavor_ptr->o_ptr->name2];
561             flavor_ptr->t = object_desc_str(flavor_ptr->t, e_name + e_ptr->name);
562         }
563     }
564 #endif
565
566     for (flavor_ptr->s0 = NULL; *flavor_ptr->s || flavor_ptr->s0;) {
567         if (!*flavor_ptr->s) {
568             flavor_ptr->s = flavor_ptr->s0 + 1;
569             flavor_ptr->s0 = NULL;
570         } else if ((*flavor_ptr->s == '#') && !flavor_ptr->s0) {
571             flavor_ptr->s0 = flavor_ptr->s;
572             flavor_ptr->s = flavor_ptr->modstr;
573             flavor_ptr->modstr = "";
574         } else if ((*flavor_ptr->s == '%') && !flavor_ptr->s0) {
575             flavor_ptr->s0 = flavor_ptr->s;
576             flavor_ptr->s = flavor_ptr->kindname;
577             flavor_ptr->kindname = "";
578         }
579
580 #ifdef JP
581 #else
582         else if (*flavor_ptr->s == '~') {
583             if (!(flavor_ptr->mode & OD_NO_PLURAL) && (flavor_ptr->o_ptr->number != 1)) {
584                 char k = flavor_ptr->t[-1];
585                 if ((k == 's') || (k == 'h'))
586                     *flavor_ptr->t++ = 'e';
587
588                 *flavor_ptr->t++ = 's';
589             }
590
591             flavor_ptr->s++;
592         }
593 #endif
594         else
595             *flavor_ptr->t++ = *flavor_ptr->s++;
596     }
597
598     *flavor_ptr->t = '\0';
599
600 #ifdef JP
601     /* '『'から始まる伝説のアイテムの名前は最後に付加する */
602     if (flavor_ptr->known) {
603         // ランダムアーティファクトの名前はセーブファイルに記録されるので、英語版の名前もそれらしく変換する.
604         if (flavor_ptr->o_ptr->art_name) {
605             char temp[256];
606             int itemp;
607             strcpy(temp, quark_str(flavor_ptr->o_ptr->art_name));
608             if (strncmp(temp, "『", 2) == 0 || strncmp(temp, "《", 2) == 0)
609                 flavor_ptr->t = object_desc_str(flavor_ptr->t, temp);
610             else if (temp[0] == '\'') {
611                 itemp = strlen(temp);
612                 temp[itemp - 1] = 0;
613                 flavor_ptr->t = object_desc_str(flavor_ptr->t, "『");
614                 flavor_ptr->t = object_desc_str(flavor_ptr->t, &temp[1]);
615                 flavor_ptr->t = object_desc_str(flavor_ptr->t, "』");
616             }
617         } else if (object_is_fixed_artifact(flavor_ptr->o_ptr)) {
618             artifact_type *a_ptr = &a_info[flavor_ptr->o_ptr->name1];
619             if (strncmp(a_name + a_ptr->name, "『", 2) == 0)
620                 flavor_ptr->t = object_desc_str(flavor_ptr->t, a_name + a_ptr->name);
621         } else if (flavor_ptr->o_ptr->inscription) {
622             concptr str = quark_str(flavor_ptr->o_ptr->inscription);
623             while (*str) {
624                 if (iskanji(*str)) {
625                     str += 2;
626                     continue;
627                 }
628
629                 if (*str == '#')
630                     break;
631
632                 str++;
633             }
634
635             if (*str) {
636                 concptr str_aux = angband_strchr(quark_str(flavor_ptr->o_ptr->inscription), '#');
637                 flavor_ptr->t = object_desc_str(flavor_ptr->t, "『");
638                 flavor_ptr->t = object_desc_str(flavor_ptr->t, &str_aux[1]);
639                 flavor_ptr->t = object_desc_str(flavor_ptr->t, "』");
640             }
641         }
642     }
643 #else
644     if (object_is_smith(player_ptr, flavor_ptr->o_ptr))
645         flavor_ptr->t = object_desc_str(flavor_ptr->t, format(" of %s the Smith", player_ptr->name));
646
647     if (flavor_ptr->known && !have_flag(flavor_ptr->flags, TR_FULL_NAME)) {
648         if (flavor_ptr->o_ptr->art_name) {
649             flavor_ptr->t = object_desc_chr(flavor_ptr->t, ' ');
650             flavor_ptr->t = object_desc_str(flavor_ptr->t, quark_str(flavor_ptr->o_ptr->art_name));
651         } else if (object_is_fixed_artifact(flavor_ptr->o_ptr)) {
652             artifact_type *a_ptr = &a_info[flavor_ptr->o_ptr->name1];
653
654             flavor_ptr->t = object_desc_chr(flavor_ptr->t, ' ');
655             flavor_ptr->t = object_desc_str(flavor_ptr->t, a_name + a_ptr->name);
656         } else {
657             if (object_is_ego(flavor_ptr->o_ptr)) {
658                 ego_item_type *e_ptr = &e_info[flavor_ptr->o_ptr->name2];
659                 flavor_ptr->t = object_desc_chr(flavor_ptr->t, ' ');
660                 flavor_ptr->t = object_desc_str(flavor_ptr->t, e_name + e_ptr->name);
661             }
662
663             if (flavor_ptr->o_ptr->inscription && angband_strchr(quark_str(flavor_ptr->o_ptr->inscription), '#')) {
664                 concptr str = angband_strchr(quark_str(flavor_ptr->o_ptr->inscription), '#');
665                 flavor_ptr->t = object_desc_chr(flavor_ptr->t, ' ');
666                 flavor_ptr->t = object_desc_str(flavor_ptr->t, &str[1]);
667             }
668         }
669     }
670 #endif
671
672     if (flavor_ptr->mode & OD_NAME_ONLY) {
673         angband_strcpy(flavor_ptr->buf, flavor_ptr->tmp_val, MAX_NLEN);
674         return;
675     }
676
677     if (flavor_ptr->o_ptr->tval == TV_CHEST) {
678         if (!flavor_ptr->known) {
679             /* Nothing */
680         } else if (!flavor_ptr->o_ptr->pval)
681             flavor_ptr->t = object_desc_str(flavor_ptr->t, _("(空)", " (empty)"));
682         else if (flavor_ptr->o_ptr->pval < 0)
683             if (chest_traps[0 - flavor_ptr->o_ptr->pval])
684                 flavor_ptr->t = object_desc_str(flavor_ptr->t, _("(解除済)", " (disarmed)"));
685             else
686                 flavor_ptr->t = object_desc_str(flavor_ptr->t, _("(非施錠)", " (unlocked)"));
687         else {
688             switch (chest_traps[flavor_ptr->o_ptr->pval]) {
689             case 0: {
690                 flavor_ptr->t = object_desc_str(flavor_ptr->t, _("(施錠)", " (Locked)"));
691                 break;
692             }
693             case CHEST_LOSE_STR: {
694                 flavor_ptr->t = object_desc_str(flavor_ptr->t, _("(毒針)", " (Poison Needle)"));
695                 break;
696             }
697             case CHEST_LOSE_CON: {
698                 flavor_ptr->t = object_desc_str(flavor_ptr->t, _("(毒針)", " (Poison Needle)"));
699                 break;
700             }
701             case CHEST_POISON: {
702                 flavor_ptr->t = object_desc_str(flavor_ptr->t, _("(ガス・トラップ)", " (Gas Trap)"));
703                 break;
704             }
705             case CHEST_PARALYZE: {
706                 flavor_ptr->t = object_desc_str(flavor_ptr->t, _("(ガス・トラップ)", " (Gas Trap)"));
707                 break;
708             }
709             case CHEST_EXPLODE: {
710                 flavor_ptr->t = object_desc_str(flavor_ptr->t, _("(爆発装置)", " (Explosion Device)"));
711                 break;
712             }
713             case CHEST_SUMMON:
714             case CHEST_BIRD_STORM:
715             case CHEST_E_SUMMON:
716             case CHEST_H_SUMMON: {
717                 flavor_ptr->t = object_desc_str(flavor_ptr->t, _("(召喚のルーン)", " (Summoning Runes)"));
718                 break;
719             }
720             case CHEST_RUNES_OF_EVIL: {
721                 flavor_ptr->t = object_desc_str(flavor_ptr->t, _("(邪悪なルーン)", " (Gleaming Black Runes)"));
722                 break;
723             }
724             case CHEST_ALARM: {
725                 flavor_ptr->t = object_desc_str(flavor_ptr->t, _("(警報装置)", " (Alarm)"));
726                 break;
727             }
728             default: {
729                 flavor_ptr->t = object_desc_str(flavor_ptr->t, _("(マルチ・トラップ)", " (Multiple Traps)"));
730                 break;
731             }
732             }
733         }
734     }
735
736     if (have_flag(flavor_ptr->flags, TR_SHOW_MODS))
737         flavor_ptr->show_weapon = TRUE;
738
739     if (object_is_smith(player_ptr, flavor_ptr->o_ptr) && (flavor_ptr->o_ptr->xtra3 == 1 + ESSENCE_SLAY_GLOVE))
740         flavor_ptr->show_weapon = TRUE;
741
742     if (flavor_ptr->o_ptr->to_h && flavor_ptr->o_ptr->to_d)
743         flavor_ptr->show_weapon = TRUE;
744
745     if (flavor_ptr->o_ptr->ac)
746         flavor_ptr->show_armour = TRUE;
747
748     switch (flavor_ptr->o_ptr->tval) {
749     case TV_SHOT:
750     case TV_BOLT:
751     case TV_ARROW:
752     case TV_HAFTED:
753     case TV_POLEARM:
754     case TV_SWORD:
755     case TV_DIGGING: {
756         if (object_is_quest_target(player_ptr, flavor_ptr->o_ptr) && !flavor_ptr->known)
757             break;
758
759         flavor_ptr->t = object_desc_chr(flavor_ptr->t, ' ');
760         flavor_ptr->t = object_desc_chr(flavor_ptr->t, flavor_ptr->p1);
761         flavor_ptr->t = object_desc_num(flavor_ptr->t, flavor_ptr->o_ptr->dd);
762         flavor_ptr->t = object_desc_chr(flavor_ptr->t, 'd');
763         flavor_ptr->t = object_desc_num(flavor_ptr->t, flavor_ptr->o_ptr->ds);
764         flavor_ptr->t = object_desc_chr(flavor_ptr->t, flavor_ptr->p2);
765         break;
766     }
767     case TV_BOW: {
768         flavor_ptr->power = bow_tmul(flavor_ptr->o_ptr->sval);
769         if (have_flag(flavor_ptr->flags, TR_XTRA_MIGHT))
770             flavor_ptr->power++;
771
772         flavor_ptr->t = object_desc_chr(flavor_ptr->t, ' ');
773         flavor_ptr->t = object_desc_chr(flavor_ptr->t, flavor_ptr->p1);
774         flavor_ptr->t = object_desc_chr(flavor_ptr->t, 'x');
775         flavor_ptr->t = object_desc_num(flavor_ptr->t, flavor_ptr->power);
776         flavor_ptr->t = object_desc_chr(flavor_ptr->t, flavor_ptr->p2);
777         flavor_ptr->fire_rate = calc_num_fire(player_ptr, flavor_ptr->o_ptr);
778         if (flavor_ptr->fire_rate != 0 && flavor_ptr->power > 0 && flavor_ptr->known) {
779             flavor_ptr->fire_rate = bow_energy(flavor_ptr->o_ptr->sval) / flavor_ptr->fire_rate;
780             flavor_ptr->t = object_desc_chr(flavor_ptr->t, ' ');
781             flavor_ptr->t = object_desc_chr(flavor_ptr->t, flavor_ptr->p1);
782             flavor_ptr->t = object_desc_num(flavor_ptr->t, flavor_ptr->fire_rate / 100);
783             flavor_ptr->t = object_desc_chr(flavor_ptr->t, '.');
784             flavor_ptr->t = object_desc_num(flavor_ptr->t, flavor_ptr->fire_rate % 100);
785             flavor_ptr->t = object_desc_str(flavor_ptr->t, "turn");
786             flavor_ptr->t = object_desc_chr(flavor_ptr->t, flavor_ptr->p2);
787         }
788
789         break;
790     }
791     }
792
793     if (flavor_ptr->known) {
794         if (flavor_ptr->show_weapon) {
795             flavor_ptr->t = object_desc_chr(flavor_ptr->t, ' ');
796             flavor_ptr->t = object_desc_chr(flavor_ptr->t, flavor_ptr->p1);
797             flavor_ptr->t = object_desc_int(flavor_ptr->t, flavor_ptr->o_ptr->to_h);
798             flavor_ptr->t = object_desc_chr(flavor_ptr->t, ',');
799             flavor_ptr->t = object_desc_int(flavor_ptr->t, flavor_ptr->o_ptr->to_d);
800             flavor_ptr->t = object_desc_chr(flavor_ptr->t, flavor_ptr->p2);
801         } else if (flavor_ptr->o_ptr->to_h) {
802             flavor_ptr->t = object_desc_chr(flavor_ptr->t, ' ');
803             flavor_ptr->t = object_desc_chr(flavor_ptr->t, flavor_ptr->p1);
804             flavor_ptr->t = object_desc_int(flavor_ptr->t, flavor_ptr->o_ptr->to_h);
805             flavor_ptr->t = object_desc_chr(flavor_ptr->t, flavor_ptr->p2);
806         } else if (flavor_ptr->o_ptr->to_d) {
807             flavor_ptr->t = object_desc_chr(flavor_ptr->t, ' ');
808             flavor_ptr->t = object_desc_chr(flavor_ptr->t, flavor_ptr->p1);
809             flavor_ptr->t = object_desc_int(flavor_ptr->t, flavor_ptr->o_ptr->to_d);
810             flavor_ptr->t = object_desc_chr(flavor_ptr->t, flavor_ptr->p2);
811         }
812     }
813
814     flavor_ptr->bow_ptr = &player_ptr->inventory_list[INVEN_BOW];
815     if (flavor_ptr->bow_ptr->k_idx && (flavor_ptr->o_ptr->tval == player_ptr->tval_ammo)) {
816         int avgdam = flavor_ptr->o_ptr->dd * (flavor_ptr->o_ptr->ds + 1) * 10 / 2;
817         int tmul = bow_tmul(flavor_ptr->bow_ptr->sval);
818         ENERGY energy_fire = bow_energy(flavor_ptr->bow_ptr->sval);
819         if (object_is_known(flavor_ptr->bow_ptr))
820             avgdam += (flavor_ptr->bow_ptr->to_d * 10);
821
822         if (flavor_ptr->known)
823             avgdam += (flavor_ptr->o_ptr->to_d * 10);
824
825         if (player_ptr->xtra_might)
826             tmul++;
827
828         tmul = tmul * (100 + (int)(adj_str_td[player_ptr->stat_ind[A_STR]]) - 128);
829         avgdam *= tmul;
830         avgdam /= (100 * 10);
831         if (player_ptr->concent)
832             avgdam = boost_concentration_damage(player_ptr, avgdam);
833
834         if (avgdam < 0)
835             avgdam = 0;
836
837         flavor_ptr->t = object_desc_chr(flavor_ptr->t, ' ');
838         flavor_ptr->t = object_desc_chr(flavor_ptr->t, flavor_ptr->p1);
839         if (show_ammo_no_crit) {
840             flavor_ptr->t = object_desc_num(flavor_ptr->t, avgdam);
841             flavor_ptr->t = object_desc_str(flavor_ptr->t, show_ammo_detail ? "/shot " : "/");
842         }
843
844         avgdam = calc_expect_crit_shot(player_ptr, flavor_ptr->o_ptr->weight, flavor_ptr->o_ptr->to_h, flavor_ptr->bow_ptr->to_h, avgdam);
845         flavor_ptr->t = object_desc_num(flavor_ptr->t, avgdam);
846         flavor_ptr->t = show_ammo_no_crit ? object_desc_str(flavor_ptr->t, show_ammo_detail ? "/crit " : "/") : object_desc_str(flavor_ptr->t, show_ammo_detail ? "/shot " : "/");
847         if (player_ptr->num_fire == 0)
848             flavor_ptr->t = object_desc_chr(flavor_ptr->t, '0');
849         else {
850             avgdam *= (player_ptr->num_fire * 100);
851             avgdam /= energy_fire;
852             flavor_ptr->t = object_desc_num(flavor_ptr->t, avgdam);
853             flavor_ptr->t = object_desc_str(flavor_ptr->t, show_ammo_detail ? "/turn" : "");
854             if (show_ammo_crit_ratio) {
855                 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);
856                 flavor_ptr->t = object_desc_chr(flavor_ptr->t, '/');
857                 flavor_ptr->t = object_desc_num(flavor_ptr->t, percent / 100);
858                 flavor_ptr->t = object_desc_chr(flavor_ptr->t, '.');
859                 if (percent % 100 < 10)
860                     flavor_ptr->t = object_desc_chr(flavor_ptr->t, '0');
861
862                 flavor_ptr->t = object_desc_num(flavor_ptr->t, percent % 100);
863                 flavor_ptr->t = object_desc_str(flavor_ptr->t, show_ammo_detail ? "% crit" : "%");
864             }
865         }
866
867         flavor_ptr->t = object_desc_chr(flavor_ptr->t, flavor_ptr->p2);
868     } else if ((player_ptr->pclass == CLASS_NINJA) && (flavor_ptr->o_ptr->tval == TV_SPIKE)) {
869         int avgdam = player_ptr->mighty_throw ? (1 + 3) : 1;
870         s16b energy_fire = 100 - player_ptr->lev;
871         avgdam += ((player_ptr->lev + 30) * (player_ptr->lev + 30) - 900) / 55;
872         flavor_ptr->t = object_desc_chr(flavor_ptr->t, ' ');
873         flavor_ptr->t = object_desc_chr(flavor_ptr->t, flavor_ptr->p1);
874         flavor_ptr->t = object_desc_num(flavor_ptr->t, avgdam);
875         flavor_ptr->t = object_desc_chr(flavor_ptr->t, '/');
876         avgdam = 100 * avgdam / energy_fire;
877         flavor_ptr->t = object_desc_num(flavor_ptr->t, avgdam);
878         flavor_ptr->t = object_desc_chr(flavor_ptr->t, flavor_ptr->p2);
879     }
880
881     if (flavor_ptr->known) {
882         if (flavor_ptr->show_armour) {
883             flavor_ptr->t = object_desc_chr(flavor_ptr->t, ' ');
884             flavor_ptr->t = object_desc_chr(flavor_ptr->t, flavor_ptr->b1);
885             flavor_ptr->t = object_desc_num(flavor_ptr->t, flavor_ptr->o_ptr->ac);
886             flavor_ptr->t = object_desc_chr(flavor_ptr->t, ',');
887             flavor_ptr->t = object_desc_int(flavor_ptr->t, flavor_ptr->o_ptr->to_a);
888             flavor_ptr->t = object_desc_chr(flavor_ptr->t, flavor_ptr->b2);
889         } else if (flavor_ptr->o_ptr->to_a) {
890             flavor_ptr->t = object_desc_chr(flavor_ptr->t, ' ');
891             flavor_ptr->t = object_desc_chr(flavor_ptr->t, flavor_ptr->b1);
892             flavor_ptr->t = object_desc_int(flavor_ptr->t, flavor_ptr->o_ptr->to_a);
893             flavor_ptr->t = object_desc_chr(flavor_ptr->t, flavor_ptr->b2);
894         }
895     } else if (flavor_ptr->show_armour) {
896         flavor_ptr->t = object_desc_chr(flavor_ptr->t, ' ');
897         flavor_ptr->t = object_desc_chr(flavor_ptr->t, flavor_ptr->b1);
898         flavor_ptr->t = object_desc_num(flavor_ptr->t, flavor_ptr->o_ptr->ac);
899         flavor_ptr->t = object_desc_chr(flavor_ptr->t, flavor_ptr->b2);
900     }
901
902     if (flavor_ptr->mode & OD_NAME_AND_ENCHANT) {
903         angband_strcpy(flavor_ptr->buf, flavor_ptr->tmp_val, MAX_NLEN);
904         return;
905     }
906
907     if (flavor_ptr->known) {
908         if (((flavor_ptr->o_ptr->tval == TV_STAFF) || (flavor_ptr->o_ptr->tval == TV_WAND))) {
909             flavor_ptr->t = object_desc_chr(flavor_ptr->t, ' ');
910             flavor_ptr->t = object_desc_chr(flavor_ptr->t, flavor_ptr->p1);
911             if ((flavor_ptr->o_ptr->tval == TV_STAFF) && (flavor_ptr->o_ptr->number > 1)) {
912                 flavor_ptr->t = object_desc_num(flavor_ptr->t, flavor_ptr->o_ptr->number);
913                 flavor_ptr->t = object_desc_str(flavor_ptr->t, "x ");
914             }
915
916             flavor_ptr->t = object_desc_num(flavor_ptr->t, flavor_ptr->o_ptr->pval);
917             flavor_ptr->t = object_desc_str(flavor_ptr->t, _("回分", " charge"));
918 #ifdef JP
919 #else
920             if (flavor_ptr->o_ptr->pval != 1)
921                 flavor_ptr->t = object_desc_chr(flavor_ptr->t, 's');
922 #endif
923
924             flavor_ptr->t = object_desc_chr(flavor_ptr->t, flavor_ptr->p2);
925         } else if (flavor_ptr->o_ptr->tval == TV_ROD) {
926             if (flavor_ptr->o_ptr->timeout) {
927                 if (flavor_ptr->o_ptr->number > 1) {
928                     if (flavor_ptr->k_ptr->pval == 0)
929                         flavor_ptr->k_ptr->pval = 1;
930
931                     flavor_ptr->power = (flavor_ptr->o_ptr->timeout + (flavor_ptr->k_ptr->pval - 1)) / flavor_ptr->k_ptr->pval;
932                     if (flavor_ptr->power > flavor_ptr->o_ptr->number)
933                         flavor_ptr->power = flavor_ptr->o_ptr->number;
934
935                     flavor_ptr->t = object_desc_str(flavor_ptr->t, " (");
936                     flavor_ptr->t = object_desc_num(flavor_ptr->t, flavor_ptr->power);
937                     flavor_ptr->t = object_desc_str(flavor_ptr->t, _("本 充填中)", " charging)"));
938                 } else
939                     flavor_ptr->t = object_desc_str(flavor_ptr->t, _("(充填中)", " (charging)"));
940             }
941         }
942
943         if (have_pval_flags(flavor_ptr->flags)) {
944             flavor_ptr->t = object_desc_chr(flavor_ptr->t, ' ');
945             flavor_ptr->t = object_desc_chr(flavor_ptr->t, flavor_ptr->p1);
946             flavor_ptr->t = object_desc_int(flavor_ptr->t, flavor_ptr->o_ptr->pval);
947             if (have_flag(flavor_ptr->flags, TR_HIDE_TYPE)) {
948                 /* Nothing */
949             } else if (have_flag(flavor_ptr->flags, TR_SPEED))
950                 flavor_ptr->t = object_desc_str(flavor_ptr->t, _("加速", " to speed"));
951             else if (have_flag(flavor_ptr->flags, TR_BLOWS)) {
952                 flavor_ptr->t = object_desc_str(flavor_ptr->t, _("攻撃", " attack"));
953 #ifdef JP
954 #else
955                 if (ABS(flavor_ptr->o_ptr->pval) != 1)
956                     flavor_ptr->t = object_desc_chr(flavor_ptr->t, 's');
957 #endif
958             } else if (have_flag(flavor_ptr->flags, TR_STEALTH))
959                 flavor_ptr->t = object_desc_str(flavor_ptr->t, _("隠密", " to stealth"));
960             else if (have_flag(flavor_ptr->flags, TR_SEARCH))
961                 flavor_ptr->t = object_desc_str(flavor_ptr->t, _("探索", " to searching"));
962             else if (have_flag(flavor_ptr->flags, TR_INFRA))
963                 flavor_ptr->t = object_desc_str(flavor_ptr->t, _("赤外線視力", " to infravision"));
964
965             flavor_ptr->t = object_desc_chr(flavor_ptr->t, flavor_ptr->p2);
966         }
967
968         if ((flavor_ptr->o_ptr->tval == TV_LITE) && (!(object_is_fixed_artifact(flavor_ptr->o_ptr) || (flavor_ptr->o_ptr->sval == SV_LITE_FEANOR)))) {
969             flavor_ptr->t = object_desc_str(flavor_ptr->t, _("(", " (with "));
970             if (flavor_ptr->o_ptr->name2 == EGO_LITE_LONG)
971                 flavor_ptr->t = object_desc_num(flavor_ptr->t, flavor_ptr->o_ptr->xtra4 * 2);
972             else
973                 flavor_ptr->t = object_desc_num(flavor_ptr->t, flavor_ptr->o_ptr->xtra4);
974
975             flavor_ptr->t = object_desc_str(flavor_ptr->t, _("ターンの寿命)", " turns of light)"));
976         }
977
978         if (flavor_ptr->o_ptr->timeout && (flavor_ptr->o_ptr->tval != TV_ROD))
979             flavor_ptr->t = object_desc_str(flavor_ptr->t, _("(充填中)", " (charging)"));
980     }
981
982     if (flavor_ptr->mode & OD_OMIT_INSCRIPTION) {
983         angband_strcpy(flavor_ptr->buf, flavor_ptr->tmp_val, MAX_NLEN);
984         return;
985     }
986
987     flavor_ptr->tmp_val2[0] = '\0';
988     if ((abbrev_extra || abbrev_all) && object_is_fully_known(flavor_ptr->o_ptr)) {
989         if (!flavor_ptr->o_ptr->inscription || !angband_strchr(quark_str(flavor_ptr->o_ptr->inscription), '%')) {
990             bool kanji, all;
991             kanji = _(TRUE, FALSE);
992             all = abbrev_all;
993             get_ability_abbreviation(player_ptr, flavor_ptr->tmp_val2, flavor_ptr->o_ptr, kanji, all);
994         }
995     }
996
997     if (flavor_ptr->o_ptr->inscription) {
998         char buff[1024];
999         if (flavor_ptr->tmp_val2[0])
1000             strcat(flavor_ptr->tmp_val2, ", ");
1001
1002         get_inscription(player_ptr, buff, flavor_ptr->o_ptr);
1003         angband_strcat(flavor_ptr->tmp_val2, buff, sizeof(flavor_ptr->tmp_val2));
1004     }
1005
1006     flavor_ptr->fake_insc_buf[0] = '\0';
1007     if (flavor_ptr->o_ptr->feeling)
1008         strcpy(flavor_ptr->fake_insc_buf, game_inscriptions[flavor_ptr->o_ptr->feeling]);
1009     else if (object_is_cursed(flavor_ptr->o_ptr) && (flavor_ptr->known || (flavor_ptr->o_ptr->ident & IDENT_SENSE)))
1010         strcpy(flavor_ptr->fake_insc_buf, _("呪われている", "cursed"));
1011     else if (((flavor_ptr->o_ptr->tval == TV_RING) || (flavor_ptr->o_ptr->tval == TV_AMULET) || (flavor_ptr->o_ptr->tval == TV_LITE) || (flavor_ptr->o_ptr->tval == TV_FIGURINE)) && flavor_ptr->aware && !flavor_ptr->known
1012         && !(flavor_ptr->o_ptr->ident & IDENT_SENSE))
1013         strcpy(flavor_ptr->fake_insc_buf, _("未鑑定", "unidentified"));
1014     else if (!flavor_ptr->known && (flavor_ptr->o_ptr->ident & IDENT_EMPTY))
1015         strcpy(flavor_ptr->fake_insc_buf, _("空", "empty"));
1016     else if (!flavor_ptr->aware && object_is_tried(flavor_ptr->o_ptr))
1017         strcpy(flavor_ptr->fake_insc_buf, _("未判明", "tried"));
1018
1019     if (flavor_ptr->o_ptr->discount) {
1020         if (!flavor_ptr->tmp_val2[0] || (flavor_ptr->o_ptr->ident & IDENT_STORE)) {
1021             char discount_num_buf[4];
1022             if (flavor_ptr->fake_insc_buf[0])
1023                 strcat(flavor_ptr->fake_insc_buf, ", ");
1024
1025             (void)object_desc_num(discount_num_buf, flavor_ptr->o_ptr->discount);
1026             strcat(flavor_ptr->fake_insc_buf, discount_num_buf);
1027             strcat(flavor_ptr->fake_insc_buf, _("%引き", "% off"));
1028         }
1029     }
1030
1031     if (flavor_ptr->fake_insc_buf[0] || flavor_ptr->tmp_val2[0]) {
1032         flavor_ptr->t = object_desc_chr(flavor_ptr->t, ' ');
1033         flavor_ptr->t = object_desc_chr(flavor_ptr->t, flavor_ptr->c1);
1034         if (flavor_ptr->fake_insc_buf[0])
1035             flavor_ptr->t = object_desc_str(flavor_ptr->t, flavor_ptr->fake_insc_buf);
1036
1037         if (flavor_ptr->fake_insc_buf[0] && flavor_ptr->tmp_val2[0]) {
1038             flavor_ptr->t = object_desc_chr(flavor_ptr->t, ',');
1039             flavor_ptr->t = object_desc_chr(flavor_ptr->t, ' ');
1040         }
1041
1042         if (flavor_ptr->tmp_val2[0])
1043             flavor_ptr->t = object_desc_str(flavor_ptr->t, flavor_ptr->tmp_val2);
1044
1045         flavor_ptr->t = object_desc_chr(flavor_ptr->t, flavor_ptr->c2);
1046     }
1047
1048     angband_strcpy(flavor_ptr->buf, flavor_ptr->tmp_val, MAX_NLEN);
1049 }