OSDN Git Service

[Feature] 継続自傷ダメージ装備の導入
[hengbandforosx/hengbandosx.git] / src / perception / identification.cpp
1 #include "perception/identification.h"
2 #include "artifact/fixed-art-types.h"
3 #include "flavor/flavor-describer.h"
4 #include "flavor/object-flavor-types.h"
5 #include "game-option/special-options.h"
6 #include "io/input-key-acceptor.h"
7 #include "monster-race/monster-race.h"
8 #include "monster-race/race-flags2.h"
9 #include "monster-race/race-indice-types.h"
10 #include "object-enchant/object-ego.h"
11 #include "object-enchant/tr-types.h"
12 #include "object-enchant/trc-types.h"
13 #include "object-hook/hook-weapon.h"
14 #include "object/object-flags.h"
15 #include "object/object-info.h"
16 #include "object/object-kind.h"
17 #include "sv-definition/sv-amulet-types.h"
18 #include "sv-definition/sv-other-types.h"
19 #include "sv-definition/sv-ring-types.h"
20 #include "sv-definition/sv-weapon-types.h"
21 #include "system/artifact-type-definition.h"
22 #include "system/monster-race-definition.h"
23 #include "term/screen-processor.h"
24 #include "util/bit-flags-calculator.h"
25 #include "util/buffer-shaper.h"
26
27 /*!
28  * @brief オブジェクトの*鑑定*内容を詳述して表示する /
29  * Describe a "fully identified" item
30  * @param player_ptr プレイヤーへの参照ポインタ
31  * @param o_ptr *鑑定*情報を取得する元のオブジェクト構造体参照ポインタ
32  * @param mode 表示オプション
33  * @return 特筆すべき情報が一つでもあった場合TRUE、一つもなく表示がキャンセルされた場合FALSEを返す。
34  */
35 bool screen_object(player_type *player_ptr, object_type *o_ptr, BIT_FLAGS mode)
36 {
37     char temp[70 * 20];
38     concptr info[128];
39     GAME_TEXT o_name[MAX_NLEN];
40     char desc[256];
41
42     int trivial_info = 0;
43     auto flgs = object_flags(o_ptr);
44
45     shape_buffer(o_ptr->name1 ? a_info[o_ptr->name1].text.c_str() : k_info[o_ptr->k_idx].text.c_str(), 77 - 15, temp, sizeof(temp));
46
47     int i = 0;
48     for (int j = 0; temp[j]; j += 1 + strlen(&temp[j])) {
49         info[i] = &temp[j];
50         i++;
51     }
52
53     if (o_ptr->is_equipment()) {
54         trivial_info = i;
55     }
56
57     if (flgs.has(TR_ACTIVATE)) {
58         info[i++] = _("始動したときの効果...", "It can be activated for...");
59         info[i++] = activation_explanation(o_ptr);
60         info[i++] = _("...ただし装備していなければならない。", "...if it is being worn.");
61     }
62
63     if (o_ptr->tval == ItemKindType::FIGURINE) {
64         info[i++] = _("それは投げた時ペットに変化する。", "It will transform into a pet when thrown.");
65     }
66
67     if (o_ptr->name1 == ART_STONEMASK) {
68         info[i++] = _("それを装備した者は吸血鬼になる。", "It makes you turn into a vampire permanently.");
69     }
70
71     if ((o_ptr->tval == ItemKindType::SWORD) && (o_ptr->sval == SV_POISON_NEEDLE)) {
72         info[i++] = _("それは相手を一撃で倒すことがある。", "It will attempt to instantly kill a monster.");
73     }
74
75     if ((o_ptr->tval == ItemKindType::POLEARM) && (o_ptr->sval == SV_DEATH_SCYTHE)) {
76         info[i++] = _("それは自分自身に攻撃が返ってくることがある。", "It causes you to strike yourself sometimes.");
77         info[i++] = _("それは無敵のバリアを切り裂く。", "It always penetrates invulnerability barriers.");
78     }
79
80     if (flgs.has(TR_EASY2_WEAPON)) {
81         info[i++] = _("それは二刀流での命中率を向上させる。", "It affects your ability to hit when you are wielding two weapons.");
82     }
83
84     if (flgs.has(TR_INVULN_ARROW)) {
85         info[i++] = _("それは視界がある限り物理的な飛び道具の一切をはねのける。", "It repels all physical missiles as long as there is visibility.");
86     }
87
88     if (flgs.has(TR_NO_AC)) {
89         info[i++] = _("それは物理的防護の一切を奪う。", "It robs you of any physical protection.");
90     }
91
92     if (flgs.has(TR_EASY_SPELL)) {
93         info[i++] = _("それは魔法の難易度を下げる。", "It affects your ability to cast spells.");
94     }
95
96     if (flgs.has(TR_HEAVY_SPELL)) {
97         info[i++] = _("それは魔法の難易度を上げる。", "It interferes with casting spells.");
98     }
99
100     if (flgs.has(TR_MIGHTY_THROW)) {
101         info[i++] = _("それは物を強く投げることを可能にする。", "It provides great strength when you throw an item.");
102     }
103
104     if (flgs.has(TR_DOWN_SAVING)) {
105         info[i++] = _("それは魔法抵抗力を下げる。", "It decreases your magic resistance.");
106     }
107
108     if (o_ptr->tval == ItemKindType::STATUE) {
109         monster_race *r_ptr = &r_info[o_ptr->pval];
110         if (o_ptr->pval == MON_BULLGATES)
111             info[i++] = _("それは部屋に飾ると恥ずかしい。", "It is shameful.");
112         else if (r_ptr->flags2 & (RF2_ELDRITCH_HORROR))
113             info[i++] = _("それは部屋に飾ると恐い。", "It is fearful.");
114         else
115             info[i++] = _("それは部屋に飾ると楽しい。", "It is cheerful.");
116     }
117
118     if (flgs.has(TR_DARK_SOURCE))
119         info[i++] = _("それは全く光らない。", "It provides no light.");
120
121     POSITION rad = 0;
122     if (flgs.has(TR_LITE_1) && flgs.has_not(TR_DARK_SOURCE))
123         rad += 1;
124     if (flgs.has(TR_LITE_2) && flgs.has_not(TR_DARK_SOURCE))
125         rad += 2;
126     if (flgs.has(TR_LITE_3) && flgs.has_not(TR_DARK_SOURCE))
127         rad += 3;
128     if (flgs.has(TR_LITE_M1))
129         rad -= 1;
130     if (flgs.has(TR_LITE_M2))
131         rad -= 2;
132     if (flgs.has(TR_LITE_M3))
133         rad -= 3;
134
135     if (o_ptr->name2 == EGO_LITE_SHINE)
136         rad++;
137
138     if (flgs.has(TR_LITE_FUEL) && flgs.has_not(TR_DARK_SOURCE)) {
139         if (rad > 0)
140             sprintf(desc, _("それは燃料補給によって明かり(半径 %d)を授ける。", "It provides light (radius %d) when fueled."), (int)rad);
141     } else {
142         if (rad > 0)
143             sprintf(desc, _("それは永遠なる明かり(半径 %d)を授ける。", "It provides light (radius %d) forever."), (int)rad);
144         if (rad < 0)
145             sprintf(desc, _("それは明かりの半径を狭める(半径に-%d)。", "It decreases the radius of your light by %d."), (int)-rad);
146     }
147
148     if (rad != 0)
149         info[i++] = desc;
150
151     if (o_ptr->name2 == EGO_LITE_LONG) {
152         info[i++] = _("それは長いターン明かりを授ける。", "It provides light for much longer time.");
153     }
154
155     if (flgs.has(TR_RIDING)) {
156         if (o_ptr->is_lance()) {
157             info[i++] = _("それは乗馬中は非常に使いやすい。", "It is made for use while riding.");
158         } else {
159             info[i++] = _("それは乗馬中でも使いやすい。", "It is suitable for use while riding.");
160             trivial_info++;
161         }
162     }
163
164     if (flgs.has(TR_SUPPORTIVE)) {
165         info[i++] = _("それは武器の補助として扱いやすい。", "It is easy to treat it as assistance to weapon.");
166     }
167
168     if (flgs.has(TR_STR)) {
169         info[i++] = _("それは腕力に影響を及ぼす。", "It affects your strength.");
170     }
171
172     if (flgs.has(TR_INT)) {
173         info[i++] = _("それは知能に影響を及ぼす。", "It affects your intelligence.");
174     }
175
176     if (flgs.has(TR_WIS)) {
177         info[i++] = _("それは賢さに影響を及ぼす。", "It affects your wisdom.");
178     }
179
180     if (flgs.has(TR_DEX)) {
181         info[i++] = _("それは器用さに影響を及ぼす。", "It affects your dexterity.");
182     }
183
184     if (flgs.has(TR_CON)) {
185         info[i++] = _("それは耐久力に影響を及ぼす。", "It affects your constitution.");
186     }
187
188     if (flgs.has(TR_CHR)) {
189         info[i++] = _("それは魅力に影響を及ぼす。", "It affects your charisma.");
190     }
191
192     if (flgs.has(TR_MAGIC_MASTERY)) {
193         info[i++] = _("それは魔法道具使用能力に影響を及ぼす。", "It affects your ability to use magic devices.");
194     }
195
196     if (flgs.has(TR_STEALTH)) {
197         info[i++] = _("それは隠密行動能力に影響を及ぼす。", "It affects your stealth.");
198     }
199
200     if (flgs.has(TR_SEARCH)) {
201         info[i++] = _("それは探索能力に影響を及ぼす。", "It affects your searching.");
202     }
203
204     if (flgs.has(TR_INFRA)) {
205         info[i++] = _("それは赤外線視力に影響を及ぼす。", "It affects your infravision.");
206     }
207
208     if (flgs.has(TR_TUNNEL)) {
209         info[i++] = _("それは採掘能力に影響を及ぼす。", "It affects your ability to tunnel.");
210     }
211
212     if (flgs.has(TR_SPEED)) {
213         info[i++] = _("それはスピードに影響を及ぼす。", "It affects your speed.");
214     }
215
216     if (flgs.has(TR_BLOWS)) {
217         info[i++] = _("それは打撃回数に影響を及ぼす。", "It affects your attack speed.");
218     }
219
220     if (flgs.has(TR_BRAND_ACID)) {
221         info[i++] = _("それは酸によって大きなダメージを与える。", "It does extra damage from acid.");
222     }
223
224     if (flgs.has(TR_BRAND_ELEC)) {
225         info[i++] = _("それは電撃によって大きなダメージを与える。", "It does extra damage from electricity.");
226     }
227
228     if (flgs.has(TR_BRAND_FIRE)) {
229         info[i++] = _("それは火炎によって大きなダメージを与える。", "It does extra damage from fire.");
230     }
231
232     if (flgs.has(TR_BRAND_COLD)) {
233         info[i++] = _("それは冷気によって大きなダメージを与える。", "It does extra damage from frost.");
234     }
235
236     if (flgs.has(TR_BRAND_POIS)) {
237         info[i++] = _("それは敵を毒する。", "It poisons your foes.");
238     }
239
240     if (flgs.has(TR_CHAOTIC)) {
241         info[i++] = _("それはカオス的な効果を及ぼす。", "It produces chaotic effects.");
242     }
243
244     if (flgs.has(TR_BRAND_MAGIC)) {
245         info[i++] = _("それは魔術的な効果を及ぼす。", "It produces magical effects.");
246     }
247
248     if (flgs.has(TR_VAMPIRIC)) {
249         info[i++] = _("それは敵から生命力を吸収する。", "It drains life from your foes.");
250     }
251
252     if (flgs.has(TR_EARTHQUAKE)) {
253         info[i++] = _("それは地震を起こすことができる。", "It can cause earthquakes.");
254     }
255
256     if (flgs.has(TR_VORPAL)) {
257         info[i++] = _("それは非常に切れ味が鋭く敵を切断することができる。", "It is very sharp and can cut your foes.");
258     }
259
260     if (flgs.has(TR_IMPACT)) {
261         info[i++] = _("それは非常に強く敵を攻撃することができる。", "It can hit your foes strongly.");
262     }
263
264     if (flgs.has(TR_KILL_DRAGON)) {
265         info[i++] = _("それはドラゴンにとっての天敵である。", "It is a great bane of dragons.");
266     } else if (flgs.has(TR_SLAY_DRAGON)) {
267         info[i++] = _("それはドラゴンに対して特に恐るべき力を発揮する。", "It is especially deadly against dragons.");
268     }
269
270     if (flgs.has(TR_KILL_ORC)) {
271         info[i++] = _("それはオークにとっての天敵である。", "It is a great bane of orcs.");
272     }
273
274     if (flgs.has(TR_SLAY_ORC)) {
275         info[i++] = _("それはオークに対して特に恐るべき力を発揮する。", "It is especially deadly against orcs.");
276     }
277
278     if (flgs.has(TR_KILL_TROLL)) {
279         info[i++] = _("それはトロルにとっての天敵である。", "It is a great bane of trolls.");
280     }
281
282     if (flgs.has(TR_SLAY_TROLL)) {
283         info[i++] = _("それはトロルに対して特に恐るべき力を発揮する。", "It is especially deadly against trolls.");
284     }
285
286     if (flgs.has(TR_KILL_GIANT)) {
287         info[i++] = _("それは巨人にとっての天敵である。", "It is a great bane of giants.");
288     } else if (flgs.has(TR_SLAY_GIANT)) {
289         info[i++] = _("それは巨人に対して特に恐るべき力を発揮する。", "It is especially deadly against giants.");
290     }
291
292     if (flgs.has(TR_KILL_DEMON)) {
293         info[i++] = _("それはデーモンにとっての天敵である。", "It is a great bane of demons.");
294     }
295
296     if (flgs.has(TR_SLAY_DEMON)) {
297         info[i++] = _("それはデーモンに対して聖なる力を発揮する。", "It strikes at demons with holy wrath.");
298     }
299
300     if (flgs.has(TR_KILL_UNDEAD)) {
301         info[i++] = _("それはアンデッドにとっての天敵である。", "It is a great bane of undead.");
302     }
303
304     if (flgs.has(TR_SLAY_UNDEAD)) {
305         info[i++] = _("それはアンデッドに対して聖なる力を発揮する。", "It strikes at undead with holy wrath.");
306     }
307
308     if (flgs.has(TR_KILL_EVIL)) {
309         info[i++] = _("それは邪悪なる存在にとっての天敵である。", "It is a great bane of evil monsters.");
310     }
311
312     if (flgs.has(TR_SLAY_EVIL)) {
313         info[i++] = _("それは邪悪なる存在に対して聖なる力で攻撃する。", "It fights against evil with holy fury.");
314     }
315
316     if (flgs.has(TR_KILL_GOOD)) {
317         info[i++] = _("それは善良なる存在にとっての天敵である。", "It is a great bane of good monsters.");
318     }
319
320     if (flgs.has(TR_SLAY_GOOD)) {
321         info[i++] = _("それは善良なる存在に対して邪悪なる力で攻撃する。", "It fights against good with evil fury.");
322     }
323
324     if (flgs.has(TR_KILL_ANIMAL)) {
325         info[i++] = _("それは自然界の動物にとっての天敵である。", "It is a great bane of natural creatures.");
326     }
327
328     if (flgs.has(TR_SLAY_ANIMAL)) {
329         info[i++] = _("それは自然界の動物に対して特に恐るべき力を発揮する。", "It is especially deadly against natural creatures.");
330     }
331
332     if (flgs.has(TR_KILL_HUMAN)) {
333         info[i++] = _("それは人間にとっての天敵である。", "It is a great bane of humans.");
334     }
335
336     if (flgs.has(TR_SLAY_HUMAN)) {
337         info[i++] = _("それは人間に対して特に恐るべき力を発揮する。", "It is especially deadly against humans.");
338     }
339
340     if (flgs.has(TR_FORCE_WEAPON)) {
341         info[i++] = _("それは使用者の魔力を使って攻撃する。", "It powerfully strikes at a monster using your mana.");
342     }
343
344     if (flgs.has(TR_DEC_MANA)) {
345         info[i++] = _("それは魔力の消費を押さえる。", "It decreases your mana consumption.");
346     }
347
348     if (flgs.has(TR_SUST_STR)) {
349         info[i++] = _("それはあなたの腕力を維持する。", "It sustains your strength.");
350     }
351
352     if (flgs.has(TR_SUST_INT)) {
353         info[i++] = _("それはあなたの知能を維持する。", "It sustains your intelligence.");
354     }
355
356     if (flgs.has(TR_SUST_WIS)) {
357         info[i++] = _("それはあなたの賢さを維持する。", "It sustains your wisdom.");
358     }
359
360     if (flgs.has(TR_SUST_DEX)) {
361         info[i++] = _("それはあなたの器用さを維持する。", "It sustains your dexterity.");
362     }
363
364     if (flgs.has(TR_SUST_CON)) {
365         info[i++] = _("それはあなたの耐久力を維持する。", "It sustains your constitution.");
366     }
367
368     if (flgs.has(TR_SUST_CHR)) {
369         info[i++] = _("それはあなたの魅力を維持する。", "It sustains your charisma.");
370     }
371
372     if (flgs.has(TR_IM_ACID))
373         info[i++] = _("それは酸に対する完全な免疫を授ける。", "It provides immunity to acid.");
374     else if (flgs.has(TR_VUL_ACID))
375         info[i++] = _("それは酸に対する弱点を授ける。", "It provides vulnerability to acid.");
376
377     if (flgs.has(TR_IM_ELEC))
378         info[i++] = _("それは電撃に対する完全な免疫を授ける。", "It provides immunity to electricity.");
379     else if (flgs.has(TR_VUL_ELEC))
380         info[i++] = _("それは電撃に対する弱点を授ける。", "It provides vulnerability to electricity.");
381
382     if (flgs.has(TR_IM_FIRE))
383         info[i++] = _("それは火に対する完全な免疫を授ける。", "It provides immunity to fire.");
384     else if (flgs.has(TR_VUL_FIRE))
385         info[i++] = _("それは火に対する弱点を授ける。", "It provides vulnerability to fire.");
386
387     if (flgs.has(TR_IM_COLD))
388         info[i++] = _("それは寒さに対する完全な免疫を授ける。", "It provides immunity to cold.");
389     else if (flgs.has(TR_VUL_COLD))
390         info[i++] = _("それは寒さに対する弱点を授ける。", "It provides vulnerability to cold.");
391
392     if (flgs.has(TR_IM_DARK))
393         info[i++] = _("それは暗黒に対する完全な免疫を授ける。", "It provides immunity to dark.");
394
395     if (flgs.has(TR_VUL_LITE))
396         info[i++] = _("それは閃光に対する弱点を授ける。", "It provides vulnerability to cold.");
397
398     if (flgs.has(TR_THROW)) {
399         info[i++] = _("それは敵に投げて大きなダメージを与えることができる。", "It is perfectly balanced for throwing.");
400     }
401
402     if (flgs.has(TR_FREE_ACT)) {
403         info[i++] = _("それは麻痺に対する完全な免疫を授ける。", "It provides immunity to paralysis.");
404     }
405
406     if (flgs.has(TR_HOLD_EXP)) {
407         info[i++] = _("それは経験値吸収に対する耐性を授ける。", "It provides resistance to experience draining.");
408     }
409
410     if (flgs.has(TR_RES_FEAR)) {
411         info[i++] = _("それは恐怖への完全な耐性を授ける。", "It makes you completely fearless.");
412     }
413
414     if (flgs.has(TR_RES_ACID)) {
415         info[i++] = _("それは酸への耐性を授ける。", "It provides resistance to acid.");
416     }
417
418     if (flgs.has(TR_RES_ELEC)) {
419         info[i++] = _("それは電撃への耐性を授ける。", "It provides resistance to electricity.");
420     }
421
422     if (flgs.has(TR_RES_FIRE)) {
423         info[i++] = _("それは火への耐性を授ける。", "It provides resistance to fire.");
424     }
425
426     if (flgs.has(TR_RES_COLD)) {
427         info[i++] = _("それは寒さへの耐性を授ける。", "It provides resistance to cold.");
428     }
429
430     if (flgs.has(TR_RES_POIS)) {
431         info[i++] = _("それは毒への耐性を授ける。", "It provides resistance to poison.");
432     }
433
434     if (flgs.has(TR_RES_LITE)) {
435         info[i++] = _("それは閃光への耐性を授ける。", "It provides resistance to light.");
436     }
437
438     if (flgs.has(TR_RES_DARK)) {
439         info[i++] = _("それは暗黒への耐性を授ける。", "It provides resistance to dark.");
440     }
441
442     if (flgs.has(TR_RES_BLIND)) {
443         info[i++] = _("それは盲目への耐性を授ける。", "It provides resistance to blindness.");
444     }
445
446     if (flgs.has(TR_RES_CONF)) {
447         info[i++] = _("それは混乱への耐性を授ける。", "It provides resistance to confusion.");
448     }
449
450     if (flgs.has(TR_RES_SOUND)) {
451         info[i++] = _("それは轟音への耐性を授ける。", "It provides resistance to sound.");
452     }
453
454     if (flgs.has(TR_RES_SHARDS)) {
455         info[i++] = _("それは破片への耐性を授ける。", "It provides resistance to shards.");
456     }
457
458     if (flgs.has(TR_RES_NETHER)) {
459         info[i++] = _("それは地獄への耐性を授ける。", "It provides resistance to nether.");
460     }
461
462     if (flgs.has(TR_RES_NEXUS)) {
463         info[i++] = _("それは因果混乱への耐性を授ける。", "It provides resistance to nexus.");
464     }
465
466     if (flgs.has(TR_RES_CHAOS)) {
467         info[i++] = _("それはカオスへの耐性を授ける。", "It provides resistance to chaos.");
468     }
469
470     if (flgs.has(TR_RES_TIME)) {
471         info[i++] = _("それは時間逆転への耐性を授ける。", "It provides resistance to time stream.");
472     }
473
474     if (flgs.has(TR_RES_WATER)) {
475         info[i++] = _("それは水流への耐性を授ける。", "It provides resistance to water stream.");
476     }
477
478     if (flgs.has(TR_RES_DISEN)) {
479         info[i++] = _("それは劣化への耐性を授ける。", "It provides resistance to disenchantment.");
480     }
481
482     if (flgs.has(TR_LEVITATION)) {
483         info[i++] = _("それは宙に浮くことを可能にする。", "It allows you to levitate.");
484     }
485
486     if (flgs.has(TR_SEE_INVIS)) {
487         info[i++] = _("それは透明なモンスターを見ることを可能にする。", "It allows you to see invisible monsters.");
488     }
489
490     if (flgs.has(TR_TELEPATHY)) {
491         info[i++] = _("それはテレパシー能力を授ける。", "It gives telepathic powers.");
492     }
493
494     if (flgs.has(TR_ESP_ANIMAL)) {
495         info[i++] = _("それは自然界の生物を感知する。", "It senses natural creatures.");
496     }
497
498     if (flgs.has(TR_ESP_UNDEAD)) {
499         info[i++] = _("それはアンデッドを感知する。", "It senses undead.");
500     }
501
502     if (flgs.has(TR_ESP_DEMON)) {
503         info[i++] = _("それは悪魔を感知する。", "It senses demons.");
504     }
505
506     if (flgs.has(TR_ESP_ORC)) {
507         info[i++] = _("それはオークを感知する。", "It senses orcs.");
508     }
509
510     if (flgs.has(TR_ESP_TROLL)) {
511         info[i++] = _("それはトロルを感知する。", "It senses trolls.");
512     }
513
514     if (flgs.has(TR_ESP_GIANT)) {
515         info[i++] = _("それは巨人を感知する。", "It senses giants.");
516     }
517
518     if (flgs.has(TR_ESP_DRAGON)) {
519         info[i++] = _("それはドラゴンを感知する。", "It senses dragons.");
520     }
521
522     if (flgs.has(TR_ESP_HUMAN)) {
523         info[i++] = _("それは人間を感知する。", "It senses humans.");
524     }
525
526     if (flgs.has(TR_ESP_EVIL)) {
527         info[i++] = _("それは邪悪な存在を感知する。", "It senses evil creatures.");
528     }
529
530     if (flgs.has(TR_ESP_GOOD)) {
531         info[i++] = _("それは善良な存在を感知する。", "It senses good creatures.");
532     }
533
534     if (flgs.has(TR_ESP_NONLIVING)) {
535         info[i++] = _("それは活動する無生物体を感知する。", "It senses non-living creatures.");
536     }
537
538     if (flgs.has(TR_ESP_UNIQUE)) {
539         info[i++] = _("それは特別な強敵を感知する。", "It senses unique monsters.");
540     }
541
542     if (flgs.has(TR_SLOW_DIGEST)) {
543         info[i++] = _("それはあなたの新陳代謝を遅くする。", "It slows your metabolism.");
544     }
545
546     if (flgs.has(TR_REGEN)) {
547         info[i++] = _("それは体力回復力を強化する。", "It speeds your regenerative powers.");
548     }
549
550     if (flgs.has(TR_WARNING)) {
551         info[i++] = _("それは危険に対して警告を発する。", "It warns you of danger");
552     }
553
554     if (flgs.has(TR_REFLECT)) {
555         info[i++] = _("それは矢の呪文を反射する。", "It reflects bolt spells.");
556     }
557
558     if (flgs.has(TR_RES_CURSE)) {
559         info[i++] = _("それは呪いへの抵抗力を高める。", "It increases your resistance to curses.");
560     }
561
562     if (flgs.has(TR_SH_FIRE))
563     {
564         info[i++] = _("それは炎のバリアを張る。", "It produces a fiery sheath.");
565     }
566
567     if (flgs.has(TR_SH_ELEC)) {
568         info[i++] = _("それは電気のバリアを張る。", "It produces an electric sheath.");
569     }
570
571     if (flgs.has(TR_SH_COLD)) {
572         info[i++] = _("それは冷気のバリアを張る。", "It produces a sheath of coldness.");
573     }
574
575     if (flgs.has(TR_SELF_FIRE)) {
576         info[i++] = _("それはあなたを燃やす。", "It burns you.");
577     }
578
579     if (flgs.has(TR_SELF_ELEC)) {
580         info[i++] = _("それはあなたを電撃で包む。", "It electrocutes you.");
581     }
582
583     if (flgs.has(TR_SELF_COLD)) {
584         info[i++] = _("それはあなたを凍らせる。", "It freezes you.");
585     }
586
587     if (flgs.has(TR_NO_MAGIC)) {
588         info[i++] = _("それは反魔法バリアを張る。", "It produces an anti-magic shell.");
589     }
590
591     if (flgs.has(TR_NO_TELE)) {
592         info[i++] = _("それはテレポートを邪魔する。", "It prevents teleportation.");
593     }
594
595     if (flgs.has(TR_XTRA_MIGHT)) {
596         info[i++] = _("それは矢/ボルト/弾をより強力に発射することができる。", "It fires missiles with extra might.");
597     }
598
599     if (flgs.has(TR_XTRA_SHOTS)) {
600         info[i++] = _("それは矢/ボルト/弾を非常に早く発射することができる。", "It fires missiles excessively fast.");
601     }
602
603     if (flgs.has(TR_BLESSED)) {
604         info[i++] = _("それは神に祝福されている。", "It has been blessed by the gods.");
605     }
606
607     if (o_ptr->is_cursed()) {
608         if (o_ptr->curse_flags.has(TRC::PERMA_CURSE)) {
609             info[i++] = _("それは永遠の呪いがかけられている。", "It is permanently cursed.");
610         } else if (o_ptr->curse_flags.has(TRC::HEAVY_CURSE)) {
611             info[i++] = _("それは強力な呪いがかけられている。", "It is heavily cursed.");
612         } else {
613             info[i++] = _("それは呪われている。", "It is cursed.");
614
615             /*
616              * It's a trivial infomation since there is
617              * fake inscription {cursed}
618              */
619             trivial_info++;
620         }
621     }
622
623     if ((flgs.has(TR_TY_CURSE)) || o_ptr->curse_flags.has(TRC::TY_CURSE)) {
624         info[i++] = _("それは太古の禍々しい怨念が宿っている。", "It carries an ancient foul curse.");
625     }
626
627     if ((flgs.has(TR_AGGRAVATE)) || o_ptr->curse_flags.has(TRC::AGGRAVATE)) {
628         info[i++] = _("それは付近のモンスターを怒らせる。", "It aggravates nearby creatures.");
629     }
630
631     if ((flgs.has(TR_DRAIN_EXP)) || o_ptr->curse_flags.has(TRC::DRAIN_EXP)) {
632         info[i++] = _("それは経験値を吸い取る。", "It drains experience.");
633     }
634
635     if (o_ptr->curse_flags.has(TRC::SLOW_REGEN)) {
636         info[i++] = _("それは回復力を弱める。", "It slows your regenerative powers.");
637     }
638
639     if (o_ptr->curse_flags.has(TRC::ADD_L_CURSE) || flgs.has(TR_ADD_L_CURSE)) {
640         info[i++] = _("それは弱い呪いを増やす。", "It adds weak curses.");
641     }
642
643     if (o_ptr->curse_flags.has(TRC::ADD_H_CURSE) || flgs.has(TR_ADD_H_CURSE)) {
644         info[i++] = _("それは強力な呪いを増やす。", "It adds heavy curses.");
645     }
646
647     if ((flgs.has(TR_CALL_ANIMAL)) || o_ptr->curse_flags.has(TRC::CALL_ANIMAL)) {
648         info[i++] = _("それは動物を呼び寄せる。", "It attracts animals.");
649     }
650
651     if ((flgs.has(TR_CALL_DEMON)) || o_ptr->curse_flags.has(TRC::CALL_DEMON)) {
652         info[i++] = _("それは悪魔を呼び寄せる。", "It attracts demons.");
653     }
654
655     if ((flgs.has(TR_CALL_DRAGON)) || o_ptr->curse_flags.has(TRC::CALL_DRAGON)) {
656         info[i++] = _("それはドラゴンを呼び寄せる。", "It attracts dragons.");
657     }
658
659     if ((flgs.has(TR_CALL_UNDEAD)) || o_ptr->curse_flags.has(TRC::CALL_UNDEAD)) {
660         info[i++] = _("それは死霊を呼び寄せる。", "It attracts undead.");
661     }
662
663     if ((flgs.has(TR_COWARDICE)) || o_ptr->curse_flags.has(TRC::COWARDICE)) {
664         info[i++] = _("それは恐怖感を引き起こす。", "It makes you subject to cowardice.");
665     }
666
667     if (flgs.has(TR_BERS_RAGE) || o_ptr->curse_flags.has(TRC::BERS_RAGE))
668         info[i++] = _("それは狂戦士化の発作を引き起こす。", "It makes you subject to berserker fits.");
669
670     if ((flgs.has(TR_TELEPORT)) || o_ptr->curse_flags.has(TRC::TELEPORT)) {
671         info[i++] = _("それはランダムなテレポートを引き起こす。", "It induces random teleportation.");
672     }
673
674     if ((flgs.has(TR_LOW_MELEE)) || o_ptr->curse_flags.has(TRC::LOW_MELEE)) {
675         info[i++] = _("それは攻撃を外しやすい。", "It causes you to miss blows.");
676     }
677
678     if ((flgs.has(TR_LOW_AC)) || o_ptr->curse_flags.has(TRC::LOW_AC)) {
679         info[i++] = _("それは攻撃を受けやすい。", "It helps your enemies' blows.");
680     }
681
682     if ((flgs.has(TR_HARD_SPELL)) || o_ptr->curse_flags.has(TRC::HARD_SPELL)) {
683         info[i++] = _("それは魔法を唱えにくくする。", "It encumbers you while spellcasting.");
684     }
685
686     if ((flgs.has(TR_FAST_DIGEST)) || o_ptr->curse_flags.has(TRC::FAST_DIGEST)) {
687         info[i++] = _("それはあなたの新陳代謝を速くする。", "It speeds your metabolism.");
688     }
689
690     if ((flgs.has(TR_DRAIN_HP)) || o_ptr->curse_flags.has(TRC::DRAIN_HP)) {
691         info[i++] = _("それはあなたの体力を吸い取る。", "It drains you.");
692     }
693
694     if ((flgs.has(TR_DRAIN_MANA)) || o_ptr->curse_flags.has(TRC::DRAIN_MANA)) {
695         info[i++] = _("それはあなたの魔力を吸い取る。", "It drains your mana.");
696     }
697
698     if (mode & SCROBJ_FAKE_OBJECT) {
699         switch (o_ptr->tval) {
700         case ItemKindType::RING:
701             switch (o_ptr->sval) {
702             case SV_RING_LORDLY:
703                 info[i++] = _("それは幾つかのランダムな耐性を授ける。", "It provides some random resistances.");
704                 break;
705             case SV_RING_WARNING:
706                 info[i++] = _("それはひとつの低級なESPを授ける事がある。", "It may provide a low rank ESP.");
707                 break;
708             }
709
710             break;
711
712         case ItemKindType::AMULET:
713             switch (o_ptr->sval) {
714             case SV_AMULET_RESISTANCE:
715                 info[i++] = _("それは毒への耐性を授ける事がある。", "It may provides resistance to poison.");
716                 info[i++] = _("それはランダムな耐性を授ける事がある。", "It may provide a random resistances.");
717                 break;
718             case SV_AMULET_THE_MAGI:
719                 info[i++] = _("それは最大で3つまでの低級なESPを授ける。", "It provides up to three low rank ESPs.");
720                 break;
721             }
722
723             break;
724
725         default:
726             break;
727         }
728     }
729
730     if (flgs.has(TR_IGNORE_ACID) && flgs.has(TR_IGNORE_ELEC) && flgs.has(TR_IGNORE_FIRE) && flgs.has(TR_IGNORE_COLD)) {
731         info[i++] = _("それは酸・電撃・火炎・冷気では傷つかない。", "It cannot be harmed by the elements.");
732     } else {
733         if (flgs.has(TR_IGNORE_ACID)) {
734             info[i++] = _("それは酸では傷つかない。", "It cannot be harmed by acid.");
735         }
736
737         if (flgs.has(TR_IGNORE_ELEC)) {
738             info[i++] = _("それは電撃では傷つかない。", "It cannot be harmed by electricity.");
739         }
740
741         if (flgs.has(TR_IGNORE_FIRE)) {
742             info[i++] = _("それは火炎では傷つかない。", "It cannot be harmed by fire.");
743         }
744
745         if (flgs.has(TR_IGNORE_COLD)) {
746             info[i++] = _("それは冷気では傷つかない。", "It cannot be harmed by cold.");
747         }
748     }
749
750     if (mode & SCROBJ_FORCE_DETAIL)
751         trivial_info = 0;
752
753     if (i <= trivial_info)
754         return false;
755
756     screen_save();
757     int wid, hgt;
758     term_get_size(&wid, &hgt);
759
760     if (!(mode & SCROBJ_FAKE_OBJECT))
761         describe_flavor(player_ptr, o_name, o_ptr, 0);
762     else
763         describe_flavor(player_ptr, o_name, o_ptr, (OD_NAME_ONLY | OD_STORE));
764
765     prt(o_name, 0, 0);
766     for (int k = 1; k < hgt; k++) {
767         prt("", k, 13);
768     }
769
770     if ((o_ptr->tval == ItemKindType::STATUE) && (o_ptr->sval == SV_PHOTO)) {
771         monster_race *r_ptr = &r_info[o_ptr->pval];
772         int namelen = strlen(r_ptr->name.c_str());
773         prt(format("%s: '", r_ptr->name.c_str()), 1, 15);
774         term_queue_bigchar(18 + namelen, 1, r_ptr->x_attr, r_ptr->x_char, 0, 0);
775         prt("'", 1, (use_bigtile ? 20 : 19) + namelen);
776     } else {
777         prt(_("     アイテムの能力:", "     Item Attributes:"), 1, 15);
778     }
779
780     int k = 2;
781     for (int j = 0; j < i; j++) {
782         prt(info[j], k++, 15);
783         if ((k == hgt - 2) && (j + 1 < i)) {
784             prt(_("-- 続く --", "-- more --"), k, 15);
785             inkey();
786             for (; k > 2; k--)
787                 prt("", k, 15);
788         }
789     }
790
791     prt(_("[何かキーを押すとゲームに戻ります]", "[Press any key to continue]"), k, 15);
792     inkey();
793     screen_load();
794     return true;
795 }