2 * @brief 武器/防具/アクセサリアイテムにおける、耐性やスレイ等の表記
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"
36 #include "locale/english.h"
37 #include "monster-race/race-flags1.h"
38 #include "player/player-class.h"
41 static void check_object_known_aware(player_type *player_ptr, flavor_type *flavor_ptr)
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;
47 if (object_is_known(flavor_ptr->o_ptr))
48 flavor_ptr->known = TRUE;
50 if (flavor_ptr->aware && ((flavor_ptr->mode & OD_NO_FLAVOR) || plain_descriptions))
51 flavor_ptr->flavor = FALSE;
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;
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;
67 static void describe_monster_ball(flavor_type *flavor_ptr)
69 monster_race *r_ptr = &r_info[flavor_ptr->o_ptr->pval];
70 if (flavor_ptr->known)
73 if (!flavor_ptr->o_ptr->pval) {
74 flavor_ptr->modstr = _(" (空)", " (empty)");
79 sprintf(flavor_ptr->tmp_val2, " (%s)", r_name + r_ptr->name);
80 flavor_ptr->modstr = flavor_ptr->tmp_val2;
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;
87 sprintf(flavor_ptr->tmp_val2, "(%s)", flavor_ptr->t);
88 flavor_ptr->modstr = flavor_ptr->t;
93 static void describe_statue(flavor_type *flavor_ptr)
95 monster_race *r_ptr = &r_info[flavor_ptr->o_ptr->pval];
97 flavor_ptr->modstr = r_name + r_ptr->name;
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;
104 flavor_ptr->modstr = flavor_ptr->t;
108 static void describe_corpse(flavor_type *flavor_ptr)
110 monster_race *r_ptr = &r_info[flavor_ptr->o_ptr->pval];
111 flavor_ptr->modstr = r_name + r_ptr->name;
113 flavor_ptr->basenm = "#%";
115 if (r_ptr->flags1 & RF1_UNIQUE)
116 flavor_ptr->basenm = "& % of #";
118 flavor_ptr->basenm = "& # %";
122 static void describe_amulet(flavor_type *flavor_ptr)
124 if (flavor_ptr->aware && (object_is_fixed_artifact(flavor_ptr->o_ptr) || ((flavor_ptr->k_ptr->gen_flags & TRG_INSTA_ART) != 0)))
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 %");
133 flavor_ptr->basenm = _("#アミュレット", "& # Amulet~");
136 static void describe_ring(flavor_type *flavor_ptr)
138 if (flavor_ptr->aware && (object_is_fixed_artifact(flavor_ptr->o_ptr) || (flavor_ptr->k_ptr->gen_flags & TRG_INSTA_ART) != 0))
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 %");
147 flavor_ptr->basenm = _("#指輪", "& # Ring~");
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;
153 static void describe_staff(flavor_type *flavor_ptr)
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 %");
161 flavor_ptr->basenm = _("#杖", "& # Staff~");
164 static void describe_wand(flavor_type *flavor_ptr)
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 %");
172 flavor_ptr->basenm = _("#魔法棒", "& # Wand~");
175 static void describe_rod(flavor_type *flavor_ptr)
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 %");
183 flavor_ptr->basenm = _("#ロッド", "& # Rod~");
186 static void describe_scroll(flavor_type *flavor_ptr)
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 %");
194 flavor_ptr->basenm = _("「#」と書かれた巻物", "& Scroll~ titled \"#\"");
197 static void describe_potion(flavor_type *flavor_ptr)
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 %");
205 flavor_ptr->basenm = _("#薬", "& # Potion~");
208 static void describe_food(flavor_type *flavor_ptr)
210 if (!flavor_ptr->k_ptr->flavor_name)
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 %");
219 flavor_ptr->basenm = _("#キノコ", "& # Mushroom~");
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を返す
230 void describe_flavor(player_type *player_ptr, char *buf, object_type *o_ptr, BIT_FLAGS mode)
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) {
245 describe_monster_ball(flavor_ptr);
249 describe_statue(flavor_ptr);
252 describe_corpse(flavor_ptr);
262 flavor_ptr->show_weapon = TRUE;
273 flavor_ptr->show_armour = TRUE;
278 describe_amulet(flavor_ptr);
281 describe_ring(flavor_ptr);
286 describe_staff(flavor_ptr);
289 describe_wand(flavor_ptr);
292 describe_rod(flavor_ptr);
295 describe_scroll(flavor_ptr);
298 describe_potion(flavor_ptr);
301 describe_food(flavor_ptr);
304 flavor_ptr->basenm = _("羊皮紙 - %", "& Parchment~ - %");
309 flavor_ptr->basenm = "生命の魔法書%";
311 if (mp_ptr->spell_book == TV_LIFE_BOOK)
312 flavor_ptr->basenm = "& Book~ of Life Magic %";
314 flavor_ptr->basenm = "& Life Spellbook~ %";
319 case TV_SORCERY_BOOK: {
321 flavor_ptr->basenm = "仙術の魔法書%";
323 if (mp_ptr->spell_book == TV_LIFE_BOOK)
324 flavor_ptr->basenm = "& Book~ of Sorcery %";
326 flavor_ptr->basenm = "& Sorcery Spellbook~ %";
331 case TV_NATURE_BOOK: {
333 flavor_ptr->basenm = "自然の魔法書%";
335 if (mp_ptr->spell_book == TV_LIFE_BOOK)
336 flavor_ptr->basenm = "& Book~ of Nature Magic %";
338 flavor_ptr->basenm = "& Nature Spellbook~ %";
343 case TV_CHAOS_BOOK: {
345 flavor_ptr->basenm = "カオスの魔法書%";
347 if (mp_ptr->spell_book == TV_LIFE_BOOK)
348 flavor_ptr->basenm = "& Book~ of Chaos Magic %";
350 flavor_ptr->basenm = "& Chaos Spellbook~ %";
355 case TV_DEATH_BOOK: {
357 flavor_ptr->basenm = "暗黒の魔法書%";
359 if (mp_ptr->spell_book == TV_LIFE_BOOK)
360 flavor_ptr->basenm = "& Book~ of Death Magic %";
362 flavor_ptr->basenm = "& Death Spellbook~ %";
367 case TV_TRUMP_BOOK: {
369 flavor_ptr->basenm = "トランプの魔法書%";
371 if (mp_ptr->spell_book == TV_LIFE_BOOK)
372 flavor_ptr->basenm = "& Book~ of Trump Magic %";
374 flavor_ptr->basenm = "& Trump Spellbook~ %";
379 case TV_ARCANE_BOOK: {
381 flavor_ptr->basenm = "秘術の魔法書%";
383 if (mp_ptr->spell_book == TV_LIFE_BOOK)
384 flavor_ptr->basenm = "& Book~ of Arcane Magic %";
386 flavor_ptr->basenm = "& Arcane Spellbook~ %";
391 case TV_CRAFT_BOOK: {
393 flavor_ptr->basenm = "匠の魔法書%";
395 if (mp_ptr->spell_book == TV_LIFE_BOOK)
396 flavor_ptr->basenm = "& Book~ of Craft Magic %";
398 flavor_ptr->basenm = "& Craft Spellbook~ %";
403 case TV_DAEMON_BOOK: {
405 flavor_ptr->basenm = "悪魔の魔法書%";
407 if (mp_ptr->spell_book == TV_LIFE_BOOK)
408 flavor_ptr->basenm = "& Book~ of Daemon Magic %";
410 flavor_ptr->basenm = "& Daemon Spellbook~ %";
415 case TV_CRUSADE_BOOK: {
417 flavor_ptr->basenm = "破邪の魔法書%";
419 if (mp_ptr->spell_book == TV_LIFE_BOOK)
420 flavor_ptr->basenm = "& Book~ of Crusade Magic %";
422 flavor_ptr->basenm = "& Crusade Spellbook~ %";
427 case TV_MUSIC_BOOK: {
428 flavor_ptr->basenm = _("歌集%", "& Song Book~ %");
431 case TV_HISSATSU_BOOK: {
432 flavor_ptr->basenm = _("& 武芸の書%", "Book~ of Kendo %");
437 flavor_ptr->basenm = "呪術の魔法書%";
439 if (mp_ptr->spell_book == TV_LIFE_BOOK)
440 flavor_ptr->basenm = "& Book~ of Hex Magic %";
442 flavor_ptr->basenm = "& Hex Spellbook~ %";
448 strcpy(flavor_ptr->buf, flavor_ptr->basenm);
452 strcpy(flavor_ptr->buf, _("(なし)", "(nothing)"));
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;
461 flavor_ptr->basenm = flavor_ptr->kindname;
464 flavor_ptr->t = flavor_ptr->tmp_val;
466 if (flavor_ptr->basenm[0] == '&')
467 flavor_ptr->s = flavor_ptr->basenm + 2;
469 flavor_ptr->s = flavor_ptr->basenm;
472 if (flavor_ptr->mode & OD_OMIT_PREFIX) {
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, "の ");
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, "☆");
488 if (flavor_ptr->basenm[0] == '&') {
489 flavor_ptr->s = flavor_ptr->basenm + 2;
490 if (flavor_ptr->mode & OD_OMIT_PREFIX) {
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 ");
501 switch (*flavor_ptr->s) {
503 vowel = is_a_vowel(flavor_ptr->modstr[0]);
506 vowel = is_a_vowel(*flavor_ptr->kindname);
509 vowel = is_a_vowel(*flavor_ptr->s);
514 flavor_ptr->t = object_desc_str(flavor_ptr->t, "an ");
516 flavor_ptr->t = object_desc_str(flavor_ptr->t, "a ");
519 flavor_ptr->s = flavor_ptr->basenm;
520 if (flavor_ptr->mode & OD_OMIT_PREFIX) {
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 ");
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));
536 /* 伝説のアイテム、名のあるアイテムの名前を付加する */
537 if (flavor_ptr->known) {
539 if (flavor_ptr->o_ptr->art_name) {
540 concptr temp = quark_str(flavor_ptr->o_ptr->art_name);
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);
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);
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);
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 = "";
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';
588 *flavor_ptr->t++ = 's';
595 *flavor_ptr->t++ = *flavor_ptr->s++;
598 *flavor_ptr->t = '\0';
601 /* '『'から始まる伝説のアイテムの名前は最後に付加する */
602 if (flavor_ptr->known) {
603 // ランダムアーティファクトの名前はセーブファイルに記録されるので、英語版の名前もそれらしく変換する.
604 if (flavor_ptr->o_ptr->art_name) {
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);
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, "』");
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);
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, "』");
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));
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];
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);
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);
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]);
672 if (flavor_ptr->mode & OD_NAME_ONLY) {
673 angband_strcpy(flavor_ptr->buf, flavor_ptr->tmp_val, MAX_NLEN);
677 if (flavor_ptr->o_ptr->tval == TV_CHEST) {
678 if (!flavor_ptr->known) {
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)"));
686 flavor_ptr->t = object_desc_str(flavor_ptr->t, _("(非施錠)", " (unlocked)"));
688 switch (chest_traps[flavor_ptr->o_ptr->pval]) {
690 flavor_ptr->t = object_desc_str(flavor_ptr->t, _("(施錠)", " (Locked)"));
693 case CHEST_LOSE_STR: {
694 flavor_ptr->t = object_desc_str(flavor_ptr->t, _("(毒針)", " (Poison Needle)"));
697 case CHEST_LOSE_CON: {
698 flavor_ptr->t = object_desc_str(flavor_ptr->t, _("(毒針)", " (Poison Needle)"));
702 flavor_ptr->t = object_desc_str(flavor_ptr->t, _("(ガス・トラップ)", " (Gas Trap)"));
705 case CHEST_PARALYZE: {
706 flavor_ptr->t = object_desc_str(flavor_ptr->t, _("(ガス・トラップ)", " (Gas Trap)"));
709 case CHEST_EXPLODE: {
710 flavor_ptr->t = object_desc_str(flavor_ptr->t, _("(爆発装置)", " (Explosion Device)"));
714 case CHEST_BIRD_STORM:
716 case CHEST_H_SUMMON: {
717 flavor_ptr->t = object_desc_str(flavor_ptr->t, _("(召喚のルーン)", " (Summoning Runes)"));
720 case CHEST_RUNES_OF_EVIL: {
721 flavor_ptr->t = object_desc_str(flavor_ptr->t, _("(邪悪なルーン)", " (Gleaming Black Runes)"));
725 flavor_ptr->t = object_desc_str(flavor_ptr->t, _("(警報装置)", " (Alarm)"));
729 flavor_ptr->t = object_desc_str(flavor_ptr->t, _("(マルチ・トラップ)", " (Multiple Traps)"));
736 if (have_flag(flavor_ptr->flags, TR_SHOW_MODS))
737 flavor_ptr->show_weapon = TRUE;
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;
742 if (flavor_ptr->o_ptr->to_h && flavor_ptr->o_ptr->to_d)
743 flavor_ptr->show_weapon = TRUE;
745 if (flavor_ptr->o_ptr->ac)
746 flavor_ptr->show_armour = TRUE;
748 switch (flavor_ptr->o_ptr->tval) {
756 if (object_is_quest_target(player_ptr, flavor_ptr->o_ptr) && !flavor_ptr->known)
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);
768 flavor_ptr->power = bow_tmul(flavor_ptr->o_ptr->sval);
769 if (have_flag(flavor_ptr->flags, TR_XTRA_MIGHT))
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);
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);
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);
822 if (flavor_ptr->known)
823 avgdam += (flavor_ptr->o_ptr->to_d * 10);
825 if (player_ptr->xtra_might)
828 tmul = tmul * (100 + (int)(adj_str_td[player_ptr->stat_ind[A_STR]]) - 128);
830 avgdam /= (100 * 10);
831 if (player_ptr->concent)
832 avgdam = boost_concentration_damage(player_ptr, avgdam);
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 " : "/");
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');
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');
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" : "%");
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);
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);
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);
902 if (flavor_ptr->mode & OD_NAME_AND_ENCHANT) {
903 angband_strcpy(flavor_ptr->buf, flavor_ptr->tmp_val, MAX_NLEN);
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 ");
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"));
920 if (flavor_ptr->o_ptr->pval != 1)
921 flavor_ptr->t = object_desc_chr(flavor_ptr->t, 's');
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;
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;
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)"));
939 flavor_ptr->t = object_desc_str(flavor_ptr->t, _("(充填中)", " (charging)"));
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)) {
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"));
955 if (ABS(flavor_ptr->o_ptr->pval) != 1)
956 flavor_ptr->t = object_desc_chr(flavor_ptr->t, 's');
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"));
965 flavor_ptr->t = object_desc_chr(flavor_ptr->t, flavor_ptr->p2);
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);
973 flavor_ptr->t = object_desc_num(flavor_ptr->t, flavor_ptr->o_ptr->xtra4);
975 flavor_ptr->t = object_desc_str(flavor_ptr->t, _("ターンの寿命)", " turns of light)"));
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)"));
982 if (flavor_ptr->mode & OD_OMIT_INSCRIPTION) {
983 angband_strcpy(flavor_ptr->buf, flavor_ptr->tmp_val, MAX_NLEN);
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), '%')) {
991 kanji = _(TRUE, FALSE);
993 get_ability_abbreviation(player_ptr, flavor_ptr->tmp_val2, flavor_ptr->o_ptr, kanji, all);
997 if (flavor_ptr->o_ptr->inscription) {
999 if (flavor_ptr->tmp_val2[0])
1000 strcat(flavor_ptr->tmp_val2, ", ");
1002 get_inscription(player_ptr, buff, flavor_ptr->o_ptr);
1003 angband_strcat(flavor_ptr->tmp_val2, buff, sizeof(flavor_ptr->tmp_val2));
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"));
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, ", ");
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"));
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);
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, ' ');
1042 if (flavor_ptr->tmp_val2[0])
1043 flavor_ptr->t = object_desc_str(flavor_ptr->t, flavor_ptr->tmp_val2);
1045 flavor_ptr->t = object_desc_chr(flavor_ptr->t, flavor_ptr->c2);
1048 angband_strcpy(flavor_ptr->buf, flavor_ptr->tmp_val, MAX_NLEN);