OSDN Git Service

[Refactor] #37353 自然領域処理を cmd-spell.c から realm-nature.c/h へ分離。
[hengbandforosx/hengbandosx.git] / src / cmd-spell.c
1 /*!\r
2     @file cmd-spell.c\r
3     @brief 魔法のインターフェイスと発動 / Purpose: Do everything for each spell\r
4     @date 2013/12/31\r
5     @author\r
6     2013 Deskull rearranged comment for Doxygen.\r
7  */\r
8 \r
9 #include "angband.h"\r
10 #include "selfinfo.h"\r
11 #include "cmd-quaff.h"\r
12 #include "spells-summon.h"\r
13 #include "realm-arcane.h"\r
14 #include "realm-chaos.h"\r
15 #include "realm-life.h"\r
16 #include "realm-nature.h"\r
17 #include "realm-sorcery.h"\r
18 \r
19 /*!\r
20  * @brief\r
21  * 魔法の効果を「キャプション:ダイス+定数値」のフォーマットで出力する / Generate dice info string such as "foo 2d10"\r
22  * @param str キャプション\r
23  * @param dice ダイス数\r
24  * @param sides ダイス目\r
25  * @param base 固定値\r
26  * @return フォーマットに従い整形された文字列\r
27  */\r
28 cptr info_string_dice(cptr str, int dice, int sides, int base)\r
29 {\r
30         /* Fix value */\r
31         if (!dice)\r
32                 return format("%s%d", str, base);\r
33 \r
34         /* Dice only */\r
35         else if (!base)\r
36                 return format("%s%dd%d", str, dice, sides);\r
37 \r
38         /* Dice plus base value */\r
39         else\r
40                 return format("%s%dd%d%+d", str, dice, sides, base);\r
41 }\r
42 \r
43 \r
44 /*!\r
45  * @brief 魔法によるダメージを出力する / Generate damage-dice info string such as "dam 2d10"\r
46  * @param dice ダイス数\r
47  * @param sides ダイス目\r
48  * @param base 固定値\r
49  * @return フォーマットに従い整形された文字列\r
50  */\r
51 cptr info_damage(int dice, int sides, int base)\r
52 {\r
53         return info_string_dice(_("損傷:", "dam "), dice, sides, base);\r
54 }\r
55 \r
56 /*!\r
57  * @brief 魔法の効果時間を出力する / Generate duration info string such as "dur 20+1d20"\r
58  * @param base 固定値\r
59  * @param sides ダイス目\r
60  * @return フォーマットに従い整形された文字列\r
61  */\r
62 cptr info_duration(int base, int sides)\r
63 {\r
64         return format(_("期間:%d+1d%d", "dur %d+1d%d"), base, sides);\r
65 }\r
66 \r
67 /*!\r
68  * @brief 魔法の効果範囲を出力する / Generate range info string such as "range 5"\r
69  * @param range 効果範囲\r
70  * @return フォーマットに従い整形された文字列\r
71  */\r
72 cptr info_range(POSITION range)\r
73 {\r
74         return format(_("範囲:%d", "range %d"), range);\r
75 }\r
76 \r
77 /*!\r
78  * @brief 魔法による回復量を出力する / Generate heal info string such as "heal 2d8"\r
79  * @param dice ダイス数\r
80  * @param sides ダイス目\r
81  * @param base 固定値\r
82  * @return フォーマットに従い整形された文字列\r
83  */\r
84 cptr info_heal(int dice, int sides, int base)\r
85 {\r
86         return info_string_dice(_("回復:", "heal "), dice, sides, base);\r
87 }\r
88 \r
89 /*!\r
90  * @brief 魔法効果発動までの遅延ターンを出力する / Generate delay info string such as "delay 15+1d15"\r
91  * @param base 固定値\r
92  * @param sides ダイス目\r
93  * @return フォーマットに従い整形された文字列\r
94  */\r
95 cptr info_delay(int base, int sides)\r
96 {\r
97         return format(_("遅延:%d+1d%d", "delay %d+1d%d"), base, sides);\r
98 }\r
99 \r
100 \r
101 /*!\r
102  * @brief 魔法によるダメージを出力する(固定値&複数回処理) / Generate multiple-damage info string such as "dam 25 each"\r
103  * @param dam 固定値\r
104  * @return フォーマットに従い整形された文字列\r
105  */\r
106 cptr info_multi_damage(HIT_POINT dam)\r
107 {\r
108         return format(_("損傷:各%d", "dam %d each"), dam);\r
109 }\r
110 \r
111 \r
112 /*!\r
113  * @brief 魔法によるダメージを出力する(ダイスのみ&複数回処理) / Generate multiple-damage-dice info string such as "dam 5d2 each"\r
114  * @param dice ダイス数\r
115  * @param sides ダイス目\r
116  * @return フォーマットに従い整形された文字列\r
117  */\r
118 cptr info_multi_damage_dice(int dice, int sides)\r
119 {\r
120         return format(_("損傷:各%dd%d", "dam %dd%d each"), dice, sides);\r
121 }\r
122 \r
123 /*!\r
124  * @brief 魔法による一般的な効力値を出力する(固定値) / Generate power info string such as "power 100"\r
125  * @param power 固定値\r
126  * @return フォーマットに従い整形された文字列\r
127  */\r
128 cptr info_power(int power)\r
129 {\r
130         return format(_("効力:%d", "power %d"), power);\r
131 }\r
132 \r
133 \r
134 /*!\r
135  * @brief 魔法による一般的な効力値を出力する(ダイス値) / Generate power info string such as "power 100"\r
136  * @param dice ダイス数\r
137  * @param sides ダイス目\r
138  * @return フォーマットに従い整形された文字列\r
139  */\r
140 /*\r
141  * Generate power info string such as "power 1d100"\r
142  */\r
143 cptr info_power_dice(int dice, int sides)\r
144 {\r
145         return format(_("効力:%dd%d", "power %dd%d"), dice, sides);\r
146 }\r
147 \r
148 \r
149 /*!\r
150  * @brief 魔法の効果半径を出力する / Generate radius info string such as "rad 100"\r
151  * @param rad 効果半径\r
152  * @return フォーマットに従い整形された文字列\r
153  */\r
154 cptr info_radius(int rad)\r
155 {\r
156         return format(_("半径:%d", "rad %d"), rad);\r
157 }\r
158 \r
159 \r
160 /*!\r
161  * @brief 魔法効果の限界重量を出力する / Generate weight info string such as "max wgt 15"\r
162  * @param weight 最大重量\r
163  * @return フォーマットに従い整形された文字列\r
164  */\r
165 cptr info_weight(int weight)\r
166 {\r
167 #ifdef JP\r
168         return format("最大重量:%d.%dkg", lbtokg1(weight), lbtokg2(weight));\r
169 #else\r
170         return format("max wgt %d", weight/10);\r
171 #endif\r
172 }\r
173 \r
174 \r
175 /*!\r
176  * @brief 歌の開始を処理する / Start singing if the player is a Bard \r
177  * @param spell 領域魔法としてのID\r
178  * @param song 魔法効果のID\r
179  * @return なし\r
180  */\r
181 static void start_singing(SPELL_IDX spell, MAGIC_NUM1 song)\r
182 {\r
183         /* Remember the song index */\r
184         SINGING_SONG_EFFECT(p_ptr) = (MAGIC_NUM1)song;\r
185 \r
186         /* Remember the index of the spell which activated the song */\r
187         SINGING_SONG_ID(p_ptr) = (MAGIC_NUM2)spell;\r
188 \r
189 \r
190         /* Now the player is singing */\r
191         set_action(ACTION_SING);\r
192 \r
193 \r
194         /* Recalculate bonuses */\r
195         p_ptr->update |= (PU_BONUS);\r
196 \r
197         /* Redraw status bar */\r
198         p_ptr->redraw |= (PR_STATUS);\r
199 }\r
200 \r
201 /*!\r
202  * @brief 歌の停止を処理する / Stop singing if the player is a Bard \r
203  * @return なし\r
204  */\r
205 void stop_singing(void)\r
206 {\r
207         if (p_ptr->pclass != CLASS_BARD) return;\r
208 \r
209         /* Are there interupted song? */\r
210         if (INTERUPTING_SONG_EFFECT(p_ptr))\r
211         {\r
212                 /* Forget interupted song */\r
213                 INTERUPTING_SONG_EFFECT(p_ptr) = MUSIC_NONE;\r
214                 return;\r
215         }\r
216 \r
217         /* The player is singing? */\r
218         if (!SINGING_SONG_EFFECT(p_ptr)) return;\r
219 \r
220         /* Hack -- if called from set_action(), avoid recursive loop */\r
221         if (p_ptr->action == ACTION_SING) set_action(ACTION_NONE);\r
222 \r
223         /* Message text of each song or etc. */\r
224         do_spell(REALM_MUSIC, SINGING_SONG_ID(p_ptr), SPELL_STOP);\r
225 \r
226         SINGING_SONG_EFFECT(p_ptr) = MUSIC_NONE;\r
227         SINGING_SONG_ID(p_ptr) = 0;\r
228 \r
229         /* Recalculate bonuses */\r
230         p_ptr->update |= (PU_BONUS);\r
231 \r
232         /* Redraw status bar */\r
233         p_ptr->redraw |= (PR_STATUS);\r
234 }\r
235 \r
236 \r
237 \r
238 \r
239 \r
240 \r
241 \r
242 /*!\r
243  * @brief 暗黒領域魔法の各処理を行う\r
244  * @param spell 魔法ID\r
245  * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_INFO / SPELL_CAST)\r
246  * @return SPELL_NAME / SPELL_DESC / SPELL_INFO 時には文字列ポインタを返す。SPELL_CAST時はNULL文字列を返す。\r
247  */\r
248 static cptr do_death_spell(SPELL_IDX spell, BIT_FLAGS mode)\r
249 {\r
250         bool name = (mode == SPELL_NAME) ? TRUE : FALSE;\r
251         bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;\r
252         bool info = (mode == SPELL_INFO) ? TRUE : FALSE;\r
253         bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;\r
254 \r
255         static const char s_dam[] = _("損傷:", "dam ");\r
256         static const char s_random[] = _("ランダム", "random");\r
257 \r
258         int dir;\r
259         int plev = p_ptr->lev;\r
260 \r
261         switch (spell)\r
262         {\r
263         case 0:\r
264                 if (name) return _("無生命感知", "Detect Unlife");\r
265                 if (desc) return _("近くの生命のないモンスターを感知する。", "Detects all nonliving monsters in your vicinity.");\r
266     \r
267                 {\r
268                         int rad = DETECT_RAD_DEFAULT;\r
269 \r
270                         if (info) return info_radius(rad);\r
271 \r
272                         if (cast)\r
273                         {\r
274                                 detect_monsters_nonliving(rad);\r
275                         }\r
276                 }\r
277                 break;\r
278 \r
279         case 1:\r
280                 if (name) return _("呪殺弾", "Malediction");\r
281                 if (desc) return _("ごく小さな邪悪な力を持つボールを放つ。善良なモンスターには大きなダメージを与える。", \r
282                         "Fires a tiny ball of evil power which hurts good monsters greatly.");\r
283     \r
284                 {\r
285                         int dice = 3 + (plev - 1) / 5;\r
286                         int sides = 4;\r
287                         int rad = 0;\r
288 \r
289                         if (info) return info_damage(dice, sides, 0);\r
290 \r
291                         if (cast)\r
292                         {\r
293                                 if (!get_aim_dir(&dir)) return NULL;\r
294 \r
295                                 /*\r
296                                  * A radius-0 ball may (1) be aimed at\r
297                                  * objects etc., and will affect them;\r
298                                  * (2) may be aimed at ANY visible\r
299                                  * monster, unlike a 'bolt' which must\r
300                                  * travel to the monster.\r
301                                  */\r
302 \r
303                                 fire_ball(GF_HELL_FIRE, dir, damroll(dice, sides), rad);\r
304 \r
305                                 if (one_in_(5))\r
306                                 {\r
307                                         /* Special effect first */\r
308                                         int effect = randint1(1000);\r
309 \r
310                                         if (effect == 666)\r
311                                                 fire_ball_hide(GF_DEATH_RAY, dir, plev * 200, 0);\r
312                                         else if (effect < 500)\r
313                                                 fire_ball_hide(GF_TURN_ALL, dir, plev, 0);\r
314                                         else if (effect < 800)\r
315                                                 fire_ball_hide(GF_OLD_CONF, dir, plev, 0);\r
316                                         else\r
317                                                 fire_ball_hide(GF_STUN, dir, plev, 0);\r
318                                 }\r
319                         }\r
320                 }\r
321                 break;\r
322 \r
323         case 2:\r
324                 if (name) return _("邪悪感知", "Detect Evil");\r
325                 if (desc) return _("近くの邪悪なモンスターを感知する。", "Detects all evil monsters in your vicinity.");\r
326     \r
327                 {\r
328                         int rad = DETECT_RAD_DEFAULT;\r
329 \r
330                         if (info) return info_radius(rad);\r
331 \r
332                         if (cast)\r
333                         {\r
334                                 detect_monsters_evil(rad);\r
335                         }\r
336                 }\r
337                 break;\r
338 \r
339         case 3:\r
340                 if (name) return _("悪臭雲", "Stinking Cloud");\r
341                 if (desc) return _("毒の球を放つ。", "Fires a ball of poison.");\r
342     \r
343                 {\r
344                         HIT_POINT dam = 10 + plev / 2;\r
345                         int rad = 2;\r
346 \r
347                         if (info) return info_damage(0, 0, dam);\r
348 \r
349                         if (cast)\r
350                         {\r
351                                 if (!get_aim_dir(&dir)) return NULL;\r
352 \r
353                                 fire_ball(GF_POIS, dir, dam, rad);\r
354                         }\r
355                 }\r
356                 break;\r
357 \r
358         case 4:\r
359                 if (name) return _("黒い眠り", "Black Sleep");\r
360                 if (desc) return _("1体のモンスターを眠らせる。抵抗されると無効。", "Attempts to sleep a monster.");\r
361     \r
362                 {\r
363                         int power = plev;\r
364 \r
365                         if (info) return info_power(power);\r
366 \r
367                         if (cast)\r
368                         {\r
369                                 if (!get_aim_dir(&dir)) return NULL;\r
370 \r
371                                 sleep_monster(dir, plev);\r
372                         }\r
373                 }\r
374                 break;\r
375 \r
376         case 5:\r
377                 if (name) return _("耐毒", "Resist Poison");\r
378                 if (desc) return _("一定時間、毒への耐性を得る。装備による耐性に累積する。", \r
379                         "Gives resistance to poison. This resistance can be added to which from equipment for more powerful resistance.");\r
380     \r
381                 {\r
382                         int base = 20;\r
383 \r
384                         if (info) return info_duration(base, base);\r
385 \r
386                         if (cast)\r
387                         {\r
388                                 set_oppose_pois(randint1(base) + base, FALSE);\r
389                         }\r
390                 }\r
391                 break;\r
392 \r
393         case 6:\r
394                 if (name) return _("恐慌", "Horrify");\r
395                 if (desc) return _("モンスター1体を恐怖させ、朦朧させる。抵抗されると無効。", "Attempts to scare and stun a monster.");\r
396     \r
397                 {\r
398                         int power = plev;\r
399 \r
400                         if (info) return info_power(power);\r
401 \r
402                         if (cast)\r
403                         {\r
404                                 if (!get_aim_dir(&dir)) return NULL;\r
405 \r
406                                 fear_monster(dir, power);\r
407                                 stun_monster(dir, power);\r
408                         }\r
409                 }\r
410                 break;\r
411 \r
412         case 7:\r
413                 if (name) return _("アンデッド従属", "Enslave Undead");\r
414                 if (desc) return _("アンデッド1体を魅了する。抵抗されると無効。", "Attempts to charm an undead monster.");\r
415     \r
416                 {\r
417                         int power = plev;\r
418 \r
419                         if (info) return info_power(power);\r
420 \r
421                         if (cast)\r
422                         {\r
423                                 if (!get_aim_dir(&dir)) return NULL;\r
424 \r
425                                 control_one_undead(dir, power);\r
426                         }\r
427                 }\r
428                 break;\r
429 \r
430         case 8:\r
431                 if (name) return _("エントロピーの球", "Orb of Entropy");\r
432                 if (desc) return _("生命のある者のHPと最大HP双方にダメージを与える効果のある球を放つ。", "Fires a ball which damages to both HP and MaxHP of living monsters.");\r
433 \r
434                 {\r
435                         int dice = 3;\r
436                         int sides = 6;\r
437                         int rad = (plev < 30) ? 2 : 3;\r
438                         int base;\r
439 \r
440                         if (p_ptr->pclass == CLASS_MAGE ||\r
441                             p_ptr->pclass == CLASS_HIGH_MAGE ||\r
442                             p_ptr->pclass == CLASS_SORCERER)\r
443                                 base = plev + plev / 2;\r
444                         else\r
445                                 base = plev + plev / 4;\r
446 \r
447 \r
448                         if (info) return info_damage(dice, sides, base);\r
449 \r
450                         if (cast)\r
451                         {\r
452                                 if (!get_aim_dir(&dir)) return NULL;\r
453 \r
454                                 fire_ball(GF_HYPODYNAMIA, dir, damroll(dice, sides) + base, rad);\r
455                         }\r
456                 }\r
457                 break;\r
458 \r
459         case 9:\r
460                 if (name) return _("地獄の矢", "Nether Bolt");\r
461                 if (desc) return _("地獄のボルトもしくはビームを放つ。", "Fires a bolt or beam of nether.");\r
462     \r
463                 {\r
464                         int dice = 8 + (plev - 5) / 4;\r
465                         int sides = 8;\r
466 \r
467                         if (info) return info_damage(dice, sides, 0);\r
468 \r
469                         if (cast)\r
470                         {\r
471                                 if (!get_aim_dir(&dir)) return NULL;\r
472 \r
473                                 fire_bolt_or_beam(beam_chance(), GF_NETHER, dir, damroll(dice, sides));\r
474                         }\r
475                 }\r
476                 break;\r
477 \r
478         case 10:\r
479                 if (name) return _("殺戮雲", "Cloud kill");\r
480                 if (desc) return _("自分を中心とした毒の球を発生させる。", "Generate a ball of poison centered on you.");\r
481     \r
482                 {\r
483                         HIT_POINT dam = (30 + plev) * 2;\r
484                         int rad = plev / 10 + 2;\r
485 \r
486                         if (info) return info_damage(0, 0, dam/2);\r
487 \r
488                         if (cast)\r
489                         {\r
490                                 project(0, rad, p_ptr->y, p_ptr->x, dam, GF_POIS, PROJECT_KILL | PROJECT_ITEM, -1);\r
491                         }\r
492                 }\r
493                 break;\r
494 \r
495         case 11:\r
496                 if (name) return _("モンスター消滅", "Genocide One");\r
497                 if (desc) return _("モンスター1体を消し去る。経験値やアイテムは手に入らない。抵抗されると無効。", "Attempts to vanish a monster.");\r
498     \r
499                 {\r
500                         int power = plev + 50;\r
501 \r
502                         if (info) return info_power(power);\r
503 \r
504                         if (cast)\r
505                         {\r
506                                 if (!get_aim_dir(&dir)) return NULL;\r
507 \r
508                                 fire_ball_hide(GF_GENOCIDE, dir, power, 0);\r
509                         }\r
510                 }\r
511                 break;\r
512 \r
513         case 12:\r
514                 if (name) return _("毒の刃", "Poison Branding");\r
515                 if (desc) return _("武器に毒の属性をつける。", "Makes current weapon poison branded.");\r
516     \r
517                 {\r
518                         if (cast)\r
519                         {\r
520                                 brand_weapon(3);\r
521                         }\r
522                 }\r
523                 break;\r
524 \r
525         case 13:\r
526                 if (name) return _("吸血の矢", "Vampiric Bolt");\r
527                 if (desc) return _("ボルトによりモンスター1体から生命力を吸いとる。吸いとった生命力によって満腹度が上がる。", \r
528                         "Absorbs some HP from a monster and gives them to you by bolt. You will also gain nutritional sustenance from this.");\r
529     \r
530                 {\r
531                         int dice = 1;\r
532                         int sides = plev * 2;\r
533                         int base = plev * 2;\r
534 \r
535                         if (info) return info_damage(dice, sides, base);\r
536 \r
537                         if (cast)\r
538                         {\r
539                                 HIT_POINT dam = base + damroll(dice, sides);\r
540 \r
541                                 if (!get_aim_dir(&dir)) return NULL;\r
542 \r
543                                 if (hypodynamic_bolt(dir, dam))\r
544                                 {\r
545                                         chg_virtue(V_SACRIFICE, -1);\r
546                                         chg_virtue(V_VITALITY, -1);\r
547 \r
548                                         hp_player(dam);\r
549 \r
550                                         /*\r
551                                          * Gain nutritional sustenance:\r
552                                          * 150/hp drained\r
553                                          *\r
554                                          * A Food ration gives 5000\r
555                                          * food points (by contrast)\r
556                                          * Don't ever get more than\r
557                                          * "Full" this way But if we\r
558                                          * ARE Gorged, it won't cure\r
559                                          * us\r
560                                          */\r
561                                         dam = p_ptr->food + MIN(5000, 100 * dam);\r
562 \r
563                                         /* Not gorged already */\r
564                                         if (p_ptr->food < PY_FOOD_MAX)\r
565                                                 set_food(dam >= PY_FOOD_MAX ? PY_FOOD_MAX - 1 : dam);\r
566                                 }\r
567                         }\r
568                 }\r
569                 break;\r
570 \r
571         case 14:\r
572                 if (name) return _("反魂の術", "Animate dead");\r
573                 if (desc) return _("周囲の死体や骨を生き返す。", "Resurrects nearby corpse and skeletons. And makes these your pets.");\r
574     \r
575                 {\r
576                         if (cast)\r
577                         {\r
578                                 animate_dead(0, p_ptr->y, p_ptr->x);\r
579                         }\r
580                 }\r
581                 break;\r
582 \r
583         case 15:\r
584                 if (name) return _("抹殺", "Genocide");\r
585                 if (desc) return _("指定した文字のモンスターを現在の階から消し去る。抵抗されると無効。", \r
586                         "Eliminates an entire class of monster, exhausting you.  Powerful or unique monsters may resist.");\r
587     \r
588                 {\r
589                         int power = plev+50;\r
590 \r
591                         if (info) return info_power(power);\r
592 \r
593                         if (cast)\r
594                         {\r
595                                 symbol_genocide(power, TRUE);\r
596                         }\r
597                 }\r
598                 break;\r
599 \r
600         case 16:\r
601                 if (name) return _("狂戦士化", "Berserk");\r
602                 if (desc) return _("狂戦士化し、恐怖を除去する。", "Gives bonus to hit and HP, immunity to fear for a while. But decreases AC.");\r
603     \r
604                 {\r
605                         int base = 25;\r
606 \r
607                         if (info) return info_duration(base, base);\r
608 \r
609                         if (cast)\r
610                         {\r
611                                 set_shero(randint1(base) + base, FALSE);\r
612                                 hp_player(30);\r
613                                 set_afraid(0);\r
614                         }\r
615                 }\r
616                 break;\r
617 \r
618         case 17:\r
619                 if (name) return _("悪霊召喚", "Invoke Spirits");\r
620                 if (desc) return _("ランダムで様々な効果が起こる。", "Causes random effects.");\r
621     \r
622                 {\r
623                         if (info) return s_random;\r
624 \r
625                         if (cast)\r
626                         {\r
627                                 if (!get_aim_dir(&dir)) return NULL;\r
628 \r
629                                 cast_invoke_spirits(dir);\r
630                         }\r
631                 }\r
632                 break;\r
633 \r
634         case 18:\r
635                 if (name) return _("暗黒の矢", "Dark Bolt");\r
636                 if (desc) return _("暗黒のボルトもしくはビームを放つ。", "Fires a bolt or beam of darkness.");\r
637     \r
638                 {\r
639                         int dice = 4 + (plev - 5) / 4;\r
640                         int sides = 8;\r
641 \r
642                         if (info) return info_damage(dice, sides, 0);\r
643 \r
644                         if (cast)\r
645                         {\r
646                                 if (!get_aim_dir(&dir)) return NULL;\r
647 \r
648                                 fire_bolt_or_beam(beam_chance(), GF_DARK, dir, damroll(dice, sides));\r
649                         }\r
650                 }\r
651                 break;\r
652 \r
653         case 19:\r
654                 if (name) return _("狂乱戦士", "Battle Frenzy");\r
655                 if (desc) return _("狂戦士化し、恐怖を除去し、加速する。", \r
656                         "Gives another bonus to hit and HP, immunity to fear for a while. Hastes you. But decreases AC.");\r
657     \r
658                 {\r
659                         int b_base = 25;\r
660                         int sp_base = plev / 2;\r
661                         int sp_sides = 20 + plev / 2;\r
662 \r
663                         if (info) return info_duration(b_base, b_base);\r
664 \r
665                         if (cast)\r
666                         {\r
667                                 set_shero(randint1(25) + 25, FALSE);\r
668                                 hp_player(30);\r
669                                 set_afraid(0);\r
670                                 set_fast(randint1(sp_sides) + sp_base, FALSE);\r
671                         }\r
672                 }\r
673                 break;\r
674 \r
675         case 20:\r
676                 if (name) return _("吸血の刃", "Vampiric Branding");\r
677                 if (desc) return _("武器に吸血の属性をつける。", "Makes current weapon Vampiric.");\r
678     \r
679                 {\r
680                         if (cast)\r
681                         {\r
682                                 brand_weapon(4);\r
683                         }\r
684                 }\r
685                 break;\r
686 \r
687         case 21:\r
688                 if (name) return _("吸血の連矢", "Vampiric Bolts");\r
689                 if (desc) return _("3連射のボルトによりモンスター1体から生命力を吸いとる。吸いとった生命力によって体力が回復する。", \r
690                         "Fires 3 bolts. Each of the bolts absorbs some HP from a monster and gives them to you.");\r
691                 {\r
692                         HIT_POINT dam = 100;\r
693 \r
694                         if (info) return format("%s3*%d", s_dam, dam);\r
695 \r
696                         if (cast)\r
697                         {\r
698                                 int i;\r
699 \r
700                                 if (!get_aim_dir(&dir)) return NULL;\r
701 \r
702                                 chg_virtue(V_SACRIFICE, -1);\r
703                                 chg_virtue(V_VITALITY, -1);\r
704 \r
705                                 for (i = 0; i < 3; i++)\r
706                                 {\r
707                                         if (hypodynamic_bolt(dir, dam))\r
708                                                 hp_player(dam);\r
709                                 }\r
710                         }\r
711                 }\r
712                 break;\r
713 \r
714         case 22:\r
715                 if (name) return _("死の言魂", "Nether Wave");\r
716                 if (desc) return _("視界内の生命のあるモンスターにダメージを与える。", "Damages all living monsters in sight.");\r
717     \r
718                 {\r
719                         int sides = plev * 3;\r
720 \r
721                         if (info) return info_damage(1, sides, 0);\r
722 \r
723                         if (cast)\r
724                         {\r
725                                 dispel_living(randint1(sides));\r
726                         }\r
727                 }\r
728                 break;\r
729 \r
730         case 23:\r
731                 if (name) return _("暗黒の嵐", "Darkness Storm");\r
732                 if (desc) return _("巨大な暗黒の球を放つ。", "Fires a huge ball of darkness.");\r
733     \r
734                 {\r
735                         HIT_POINT dam = 100 + plev * 2;\r
736                         int rad = 4;\r
737 \r
738                         if (info) return info_damage(0, 0, dam);\r
739 \r
740                         if (cast)\r
741                         {\r
742                                 if (!get_aim_dir(&dir)) return NULL;\r
743 \r
744                                 fire_ball(GF_DARK, dir, dam, rad);\r
745                         }\r
746                 }\r
747                 break;\r
748 \r
749         case 24:\r
750                 if (name) return _("死の光線", "Death Ray");\r
751                 if (desc) return _("死の光線を放つ。", "Fires a beam of death.");\r
752     \r
753                 {\r
754                         if (cast)\r
755                         {\r
756                                 if (!get_aim_dir(&dir)) return NULL;\r
757 \r
758                                 death_ray(dir, plev);\r
759                         }\r
760                 }\r
761                 break;\r
762 \r
763         case 25:\r
764                 if (name) return _("死者召喚", "Raise the Dead");\r
765                 if (desc) return _("1体のアンデッドを召喚する。", "Summons an undead monster.");\r
766     \r
767                 {\r
768                         if (cast)\r
769                         {\r
770                                 int type;\r
771                                 bool pet = one_in_(3);\r
772                                 u32b flg = 0L;\r
773 \r
774                                 type = (plev > 47 ? SUMMON_HI_UNDEAD : SUMMON_UNDEAD);\r
775 \r
776                                 if (!pet || (pet && (plev > 24) && one_in_(3)))\r
777                                         flg |= PM_ALLOW_GROUP;\r
778 \r
779                                 if (pet) flg |= PM_FORCE_PET;\r
780                                 else flg |= (PM_ALLOW_UNIQUE | PM_NO_PET);\r
781 \r
782                                 if (summon_specific((pet ? -1 : 0), p_ptr->y, p_ptr->x, (plev * 3) / 2, type, flg))\r
783                                 {\r
784                                         msg_print(_("冷たい風があなたの周りに吹き始めた。それは腐敗臭を運んでいる...",\r
785                                                                 "Cold winds begin to blow around you, carrying with them the stench of decay..."));\r
786 \r
787 \r
788                                         if (pet)\r
789                                         {\r
790                                                 msg_print(_("古えの死せる者共があなたに仕えるため土から甦った!",\r
791                                                                         "Ancient, long-dead forms arise from the ground to serve you!"));\r
792                                         }\r
793                                         else\r
794                                         {\r
795                                                 msg_print(_("死者が甦った。眠りを妨げるあなたを罰するために!",\r
796                                                                         "'The dead arise... to punish you for disturbing them!'"));\r
797                                         }\r
798 \r
799                                         chg_virtue(V_UNLIFE, 1);\r
800                                 }\r
801                         }\r
802                 }\r
803                 break;\r
804 \r
805         case 26:\r
806                 if (name) return _("死者の秘伝", "Esoteria");\r
807                 if (desc) return _("アイテムを1つ識別する。レベルが高いとアイテムの能力を完全に知ることができる。",\r
808                         "Identifies an item. Or *identifies* an item at higher level.");\r
809     \r
810                 {\r
811                         if (cast)\r
812                         {\r
813                                 if (randint1(50) > plev)\r
814                                 {\r
815                                         if (!ident_spell(FALSE)) return NULL;\r
816                                 }\r
817                                 else\r
818                                 {\r
819                                         if (!identify_fully(FALSE)) return NULL;\r
820                                 }\r
821                         }\r
822                 }\r
823                 break;\r
824 \r
825         case 27:\r
826                 if (name) return _("吸血鬼変化", "Polymorph Vampire");\r
827                 if (desc) return _("一定時間、吸血鬼に変化する。変化している間は本来の種族の能力を失い、代わりに吸血鬼としての能力を得る。", \r
828                         "Mimic a vampire for a while. Loses abilities of original race and gets abilities as a vampire.");\r
829     \r
830                 {\r
831                         int base = 10 + plev / 2;\r
832 \r
833                         if (info) return info_duration(base, base);\r
834 \r
835                         if (cast)\r
836                         {\r
837                                 set_mimic(base + randint1(base), MIMIC_VAMPIRE, FALSE);\r
838                         }\r
839                 }\r
840                 break;\r
841 \r
842         case 28:\r
843                 if (name) return _("経験値復活", "Restore Life");\r
844                 if (desc) return _("失った経験値を回復する。", "Restore lost experience.");\r
845     \r
846                 {\r
847                         if (cast)\r
848                         {\r
849                                 restore_level();\r
850                         }\r
851                 }\r
852                 break;\r
853 \r
854         case 29:\r
855                 if (name) return _("周辺抹殺", "Mass Genocide");\r
856                 if (desc) return _("自分の周囲にいるモンスターを現在の階から消し去る。抵抗されると無効。", \r
857                         "Eliminates all nearby monsters, exhausting you.  Powerful or unique monsters may be able to resist.");\r
858     \r
859                 {\r
860                         int power = plev + 50;\r
861 \r
862                         if (info) return info_power(power);\r
863 \r
864                         if (cast)\r
865                         {\r
866                                 mass_genocide(power, TRUE);\r
867                         }\r
868                 }\r
869                 break;\r
870 \r
871         case 30:\r
872                 if (name) return _("地獄の劫火", "Hellfire");\r
873                 if (desc) return _("邪悪な力を持つ宝珠を放つ。善良なモンスターには大きなダメージを与える。", \r
874                         "Fires a powerful ball of evil power. Hurts good monsters greatly.");\r
875     \r
876                 {\r
877                         HIT_POINT dam = 666;\r
878                         int rad = 3;\r
879 \r
880                         if (info) return info_damage(0, 0, dam);\r
881 \r
882                         if (cast)\r
883                         {\r
884                                 if (!get_aim_dir(&dir)) return NULL;\r
885 \r
886                                 fire_ball(GF_HELL_FIRE, dir, dam, rad);\r
887                                 take_hit(DAMAGE_USELIFE, 20 + randint1(30), _("地獄の劫火の呪文を唱えた疲労", "the strain of casting Hellfire"), -1);\r
888                         }\r
889                 }\r
890                 break;\r
891 \r
892         case 31:\r
893                 if (name) return _("幽体化", "Wraithform");\r
894                 if (desc) return _("一定時間、壁を通り抜けることができ受けるダメージが軽減される幽体の状態に変身する。", \r
895                         "Becomes wraith form which gives ability to pass walls and makes all damages half.");\r
896     \r
897                 {\r
898                         int base = plev / 2;\r
899 \r
900                         if (info) return info_duration(base, base);\r
901 \r
902                         if (cast)\r
903                         {\r
904                                 set_wraith_form(randint1(base) + base, FALSE);\r
905                         }\r
906                 }\r
907                 break;\r
908         }\r
909 \r
910         return "";\r
911 }\r
912 \r
913 \r
914 /*!\r
915  * @brief トランプ領域魔法の各処理を行う\r
916  * @param spell 魔法ID\r
917  * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_INFO / SPELL_CAST)\r
918  * @return SPELL_NAME / SPELL_DESC / SPELL_INFO 時には文字列ポインタを返す。SPELL_CAST時はNULL文字列を返す。\r
919  */\r
920 static cptr do_trump_spell(SPELL_IDX spell, BIT_FLAGS mode)\r
921 {\r
922         bool name = (mode == SPELL_NAME) ? TRUE : FALSE;\r
923         bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;\r
924         bool info = (mode == SPELL_INFO) ? TRUE : FALSE;\r
925         bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;\r
926         bool fail = (mode == SPELL_FAIL) ? TRUE : FALSE;\r
927         static const char s_random[] = _("ランダム", "random");\r
928 \r
929         int dir;\r
930         int plev = p_ptr->lev;\r
931 \r
932         switch (spell)\r
933         {\r
934         case 0:\r
935                 if (name) return _("ショート・テレポート", "Phase Door");\r
936                 if (desc) return _("近距離のテレポートをする。", "Teleport short distance.");\r
937     \r
938                 {\r
939                         POSITION range = 10;\r
940 \r
941                         if (info) return info_range(range);\r
942 \r
943                         if (cast)\r
944                         {\r
945                                 teleport_player(range, 0L);\r
946                         }\r
947                 }\r
948                 break;\r
949 \r
950         case 1:\r
951                 if (name) return _("蜘蛛のカード", "Trump Spiders");\r
952                 if (desc) return _("蜘蛛を召喚する。", "Summons spiders.");\r
953     \r
954                 {\r
955                         if (cast || fail)\r
956                         {\r
957                                 msg_print(_("あなたは蜘蛛のカードに集中する...", "You concentrate on the trump of an spider..."));\r
958                                 if (trump_summoning(1, !fail, p_ptr->y, p_ptr->x, 0, SUMMON_SPIDER, PM_ALLOW_GROUP))\r
959                                 {\r
960                                         if (fail)\r
961                                         {\r
962                                                 msg_print(_("召喚された蜘蛛は怒っている!", "The summoned spiders get angry!"));\r
963                                         }\r
964                                 }\r
965                         }\r
966                 }\r
967                 break;\r
968 \r
969         case 2:\r
970                 if (name) return _("シャッフル", "Shuffle");\r
971                 if (desc) return _("カードの占いをする。", "Causes random effects.");\r
972     \r
973                 {\r
974                         if (info) return s_random;\r
975 \r
976                         if (cast)\r
977                         {\r
978                                 cast_shuffle();\r
979                         }\r
980                 }\r
981                 break;\r
982 \r
983         case 3:\r
984                 if (name) return _("フロア・リセット", "Reset Recall");\r
985                 if (desc) return _("最深階を変更する。", "Resets the 'deepest' level for recall spell.");\r
986     \r
987                 {\r
988                         if (cast)\r
989                         {\r
990                                 if (!reset_recall()) return NULL;\r
991                         }\r
992                 }\r
993                 break;\r
994 \r
995         case 4:\r
996                 if (name) return _("テレポート", "Teleport");\r
997                 if (desc) return _("遠距離のテレポートをする。", "Teleport long distance.");\r
998     \r
999                 {\r
1000                         POSITION range = plev * 4;\r
1001 \r
1002                         if (info) return info_range(range);\r
1003 \r
1004                         if (cast)\r
1005                         {\r
1006                                 teleport_player(range, 0L);\r
1007                         }\r
1008                 }\r
1009                 break;\r
1010 \r
1011         case 5:\r
1012                 if (name) return _("感知のカード", "Trump Spying");\r
1013                 if (desc) return _("一定時間、テレパシー能力を得る。", "Gives telepathy for a while.");\r
1014     \r
1015                 {\r
1016                         int base = 25;\r
1017                         int sides = 30;\r
1018 \r
1019                         if (info) return info_duration(base, sides);\r
1020 \r
1021                         if (cast)\r
1022                         {\r
1023                                 set_tim_esp(randint1(sides) + base, FALSE);\r
1024                         }\r
1025                 }\r
1026                 break;\r
1027 \r
1028         case 6:\r
1029                 if (name) return _("テレポート・モンスター", "Teleport Away");\r
1030                 if (desc) return _("モンスターをテレポートさせるビームを放つ。抵抗されると無効。", "Teleports all monsters on the line away unless resisted.");\r
1031     \r
1032                 {\r
1033                         int power = plev;\r
1034 \r
1035                         if (info) return info_power(power);\r
1036 \r
1037                         if (cast)\r
1038                         {\r
1039                                 if (!get_aim_dir(&dir)) return NULL;\r
1040 \r
1041                                 fire_beam(GF_AWAY_ALL, dir, power);\r
1042                         }\r
1043                 }\r
1044                 break;\r
1045 \r
1046         case 7:\r
1047                 if (name) return _("動物のカード", "Trump Animals");\r
1048                 if (desc) return _("1体の動物を召喚する。", "Summons an animal.");\r
1049     \r
1050                 {\r
1051                         if (cast || fail)\r
1052                         {\r
1053                                 int type = (!fail ? SUMMON_ANIMAL_RANGER : SUMMON_ANIMAL);\r
1054                                 msg_print(_("あなたは動物のカードに集中する...", "You concentrate on the trump of an animal..."));\r
1055                                 if (trump_summoning(1, !fail, p_ptr->y, p_ptr->x, 0, type, 0L))\r
1056                                 {\r
1057                                         if (fail)\r
1058                                         {\r
1059                                                 msg_print(_("召喚された動物は怒っている!", "The summoned animal gets angry!"));\r
1060                                         }\r
1061                                 }\r
1062                         }\r
1063                 }\r
1064                 break;\r
1065 \r
1066         case 8:\r
1067                 if (name) return _("移動のカード", "Trump Reach");\r
1068                 if (desc) return _("アイテムを自分の足元へ移動させる。", "Pulls a distant item close to you.");\r
1069     \r
1070                 {\r
1071                         int weight = plev * 15;\r
1072 \r
1073                         if (info) return info_weight(weight);\r
1074 \r
1075                         if (cast)\r
1076                         {\r
1077                                 if (!get_aim_dir(&dir)) return NULL;\r
1078 \r
1079                                 fetch(dir, weight, FALSE);\r
1080                         }\r
1081                 }\r
1082                 break;\r
1083 \r
1084         case 9:\r
1085                 if (name) return _("カミカゼのカード", "Trump Kamikaze");\r
1086                 if (desc) return _("複数の爆発するモンスターを召喚する。", "Summons monsters which explode by itself.");\r
1087     \r
1088                 {\r
1089                         if (cast || fail)\r
1090                         {\r
1091                                 int x, y;\r
1092                                 int type;\r
1093 \r
1094                                 if (cast)\r
1095                                 {\r
1096                                         if (!target_set(TARGET_KILL)) return NULL;\r
1097                                         x = target_col;\r
1098                                         y = target_row;\r
1099                                 }\r
1100                                 else\r
1101                                 {\r
1102                                         /* Summons near player when failed */\r
1103                                         x = p_ptr->x;\r
1104                                         y = p_ptr->y;\r
1105                                 }\r
1106 \r
1107                                 if (p_ptr->pclass == CLASS_BEASTMASTER)\r
1108                                         type = SUMMON_KAMIKAZE_LIVING;\r
1109                                 else\r
1110                                         type = SUMMON_KAMIKAZE;\r
1111 \r
1112                                 msg_print(_("あなたはカミカゼのカードに集中する...", "You concentrate on several trumps at once..."));\r
1113                                 if (trump_summoning(2 + randint0(plev / 7), !fail, y, x, 0, type, 0L))\r
1114                                 {\r
1115                                         if (fail)\r
1116                                         {\r
1117                                                 msg_print(_("召喚されたモンスターは怒っている!", "The summoned creatures get angry!"));\r
1118                                         }\r
1119                                 }\r
1120                         }\r
1121                 }\r
1122                 break;\r
1123 \r
1124         case 10:\r
1125                 if (name) return _("幻霊召喚", "Phantasmal Servant");\r
1126                 if (desc) return _("1体の幽霊を召喚する。", "Summons a ghost.");\r
1127     \r
1128                 {\r
1129                         /* Phantasmal Servant is not summoned as enemy when failed */\r
1130                         if (cast)\r
1131                         {\r
1132                                 int summon_lev = plev * 2 / 3 + randint1(plev / 2);\r
1133 \r
1134                                 if (trump_summoning(1, !fail, p_ptr->y, p_ptr->x, (summon_lev * 3 / 2), SUMMON_PHANTOM, 0L))\r
1135                                 {\r
1136                                         msg_print(_("御用でございますか、御主人様?", "'Your wish, master?'"));\r
1137                                 }\r
1138                         }\r
1139                 }\r
1140                 break;\r
1141 \r
1142         case 11:\r
1143                 if (name) return _("スピード・モンスター", "Haste Monster");\r
1144                 if (desc) return _("モンスター1体を加速させる。", "Hastes a monster.");\r
1145     \r
1146                 {\r
1147                         if (cast)\r
1148                         {\r
1149                                 bool result;\r
1150 \r
1151                                 /* Temporary enable target_pet option */\r
1152                                 bool old_target_pet = target_pet;\r
1153                                 target_pet = TRUE;\r
1154 \r
1155                                 result = get_aim_dir(&dir);\r
1156 \r
1157                                 /* Restore target_pet option */\r
1158                                 target_pet = old_target_pet;\r
1159 \r
1160                                 if (!result) return NULL;\r
1161 \r
1162                                 speed_monster(dir, plev);\r
1163                         }\r
1164                 }\r
1165                 break;\r
1166 \r
1167         case 12:\r
1168                 if (name) return _("テレポート・レベル", "Teleport Level");\r
1169                 if (desc) return _("瞬時に上か下の階にテレポートする。", "Teleport to up or down stairs in a moment.");\r
1170     \r
1171                 {\r
1172                         if (cast)\r
1173                         {\r
1174                                 if (!get_check(_("本当に他の階にテレポートしますか?", "Are you sure? (Teleport Level)"))) return NULL;\r
1175                                 teleport_level(0);\r
1176                         }\r
1177                 }\r
1178                 break;\r
1179 \r
1180         case 13:\r
1181                 if (name) return _("次元の扉", "Dimension Door");\r
1182                 if (desc) return _("短距離内の指定した場所にテレポートする。", "Teleport to given location.");\r
1183     \r
1184                 {\r
1185                         POSITION range = plev / 2 + 10;\r
1186 \r
1187                         if (info) return info_range(range);\r
1188 \r
1189                         if (cast)\r
1190                         {\r
1191                                 msg_print(_("次元の扉が開いた。目的地を選んで下さい。", "You open a dimensional gate. Choose a destination."));\r
1192                                 if (!dimension_door()) return NULL;\r
1193                         }\r
1194                 }\r
1195                 break;\r
1196 \r
1197         case 14:\r
1198                 if (name) return _("帰還の呪文", "Word of Recall");\r
1199                 if (desc) return _("地上にいるときはダンジョンの最深階へ、ダンジョンにいるときは地上へと移動する。",\r
1200                         "Recalls player from dungeon to town, or from town to the deepest level of dungeon.");\r
1201     \r
1202                 {\r
1203                         int base = 15;\r
1204                         int sides = 20;\r
1205 \r
1206                         if (info) return info_delay(base, sides);\r
1207 \r
1208                         if (cast)\r
1209                         {\r
1210                                 if (!word_of_recall()) return NULL;\r
1211                         }\r
1212                 }\r
1213                 break;\r
1214 \r
1215         case 15:\r
1216                 if (name) return _("怪物追放", "Banish");\r
1217                 if (desc) return _("視界内の全てのモンスターをテレポートさせる。抵抗されると無効。", "Teleports all monsters in sight away unless resisted.");\r
1218     \r
1219                 {\r
1220                         int power = plev * 4;\r
1221 \r
1222                         if (info) return info_power(power);\r
1223 \r
1224                         if (cast)\r
1225                         {\r
1226                                 banish_monsters(power);\r
1227                         }\r
1228                 }\r
1229                 break;\r
1230 \r
1231         case 16:\r
1232                 if (name) return _("位置交換のカード", "Swap Position");\r
1233                 if (desc) return _("1体のモンスターと位置を交換する。", "Swap positions of you and a monster.");\r
1234     \r
1235                 {\r
1236                         if (cast)\r
1237                         {\r
1238                                 bool result;\r
1239 \r
1240                                 /* HACK -- No range limit */\r
1241                                 project_length = -1;\r
1242 \r
1243                                 result = get_aim_dir(&dir);\r
1244 \r
1245                                 /* Restore range to default */\r
1246                                 project_length = 0;\r
1247 \r
1248                                 if (!result) return NULL;\r
1249 \r
1250                                 teleport_swap(dir);\r
1251                         }\r
1252                 }\r
1253                 break;\r
1254 \r
1255         case 17:\r
1256                 if (name) return _("アンデッドのカード", "Trump Undead");\r
1257                 if (desc) return _("1体のアンデッドを召喚する。", "Summons an undead monster.");\r
1258     \r
1259                 {\r
1260                         if (cast || fail)\r
1261                         {\r
1262                                 msg_print(_("あなたはアンデッドのカードに集中する...", "You concentrate on the trump of an undead creature..."));\r
1263                                 if (trump_summoning(1, !fail, p_ptr->y, p_ptr->x, 0, SUMMON_UNDEAD, 0L))\r
1264                                 {\r
1265                                         if (fail)\r
1266                                         {\r
1267                                                 msg_print(_("召喚されたアンデッドは怒っている!", "The summoned undead creature gets angry!"));\r
1268                                         }\r
1269                                 }\r
1270                         }\r
1271                 }\r
1272                 break;\r
1273 \r
1274         case 18:\r
1275                 if (name) return _("爬虫類のカード", "Trump Reptiles");\r
1276                 if (desc) return _("1体のヒドラを召喚する。", "Summons a hydra.");\r
1277     \r
1278                 {\r
1279                         if (cast || fail)\r
1280                         {\r
1281                                 msg_print(_("あなたは爬虫類のカードに集中する...", "You concentrate on the trump of a reptile..."));\r
1282                                 if (trump_summoning(1, !fail, p_ptr->y, p_ptr->x, 0, SUMMON_HYDRA, 0L))\r
1283                                 {\r
1284                                         if (fail)\r
1285                                         {\r
1286                                                 msg_print(_("召喚された爬虫類は怒っている!", "The summoned reptile gets angry!"));\r
1287                                         }\r
1288                                 }\r
1289                         }\r
1290                 }\r
1291                 break;\r
1292 \r
1293         case 19:\r
1294                 if (name) return _("モンスターのカード", "Trump Monsters");\r
1295                 if (desc) return _("複数のモンスターを召喚する。", "Summons some monsters.");\r
1296     \r
1297                 {\r
1298                         if (cast || fail)\r
1299                         {\r
1300                                 int type;\r
1301                                 msg_print(_("あなたはモンスターのカードに集中する...", "You concentrate on several trumps at once..."));\r
1302                                 if (p_ptr->pclass == CLASS_BEASTMASTER)\r
1303                                         type = SUMMON_LIVING;\r
1304                                 else\r
1305                                         type = 0;\r
1306 \r
1307                                 if (trump_summoning((1 + (plev - 15)/ 10), !fail, p_ptr->y, p_ptr->x, 0, type, 0L))\r
1308                                 {\r
1309                                         if (fail)\r
1310                                         {\r
1311                                                 msg_print(_("召喚されたモンスターは怒っている!", "The summoned creatures get angry!"));\r
1312                                         }\r
1313                                 }\r
1314 \r
1315                         }\r
1316                 }\r
1317                 break;\r
1318 \r
1319         case 20:\r
1320                 if (name) return _("ハウンドのカード", "Trump Hounds");\r
1321                 if (desc) return _("1グループのハウンドを召喚する。", "Summons a group of hounds.");\r
1322     \r
1323                 {\r
1324                         if (cast || fail)\r
1325                         {\r
1326                                 msg_print(_("あなたはハウンドのカードに集中する...", "You concentrate on the trump of a hound..."));\r
1327                                 if (trump_summoning(1, !fail, p_ptr->y, p_ptr->x, 0, SUMMON_HOUND, PM_ALLOW_GROUP))\r
1328                                 {\r
1329                                         if (fail)\r
1330                                         {\r
1331                                                 msg_print(_("召喚されたハウンドは怒っている!", "The summoned hounds get angry!"));\r
1332                                         }\r
1333                                 }\r
1334                         }\r
1335                 }\r
1336                 break;\r
1337 \r
1338         case 21:\r
1339                 if (name) return _("トランプの刃", "Trump Branding");\r
1340                 if (desc) return _("武器にトランプの属性をつける。", "Makes current weapon a Trump weapon.");\r
1341     \r
1342                 {\r
1343                         if (cast)\r
1344                         {\r
1345                                 brand_weapon(5);\r
1346                         }\r
1347                 }\r
1348                 break;\r
1349 \r
1350         case 22:\r
1351                 if (name) return _("人間トランプ", "Living Trump");\r
1352                 if (desc) return _("ランダムにテレポートする突然変異か、自分の意思でテレポートする突然変異が身につく。", \r
1353                         "Gives mutation which makes you teleport randomly or makes you able to teleport at will.");\r
1354     \r
1355                 {\r
1356                         if (cast)\r
1357                         {\r
1358                                 int mutation;\r
1359 \r
1360                                 if (one_in_(7))\r
1361                                         /* Teleport control */\r
1362                                         mutation = 12;\r
1363                                 else\r
1364                                         /* Random teleportation (uncontrolled) */\r
1365                                         mutation = 77;\r
1366 \r
1367                                 /* Gain the mutation */\r
1368                                 if (gain_random_mutation(mutation))\r
1369                                 {\r
1370                                         msg_print(_("あなたは生きているカードに変わった。", "You have turned into a Living Trump."));\r
1371                                 }\r
1372                         }\r
1373                 }\r
1374                 break;\r
1375 \r
1376         case 23:\r
1377                 if (name) return _("サイバーデーモンのカード", "Trump Cyberdemon");\r
1378                 if (desc) return _("1体のサイバーデーモンを召喚する。", "Summons a cyber demon.");\r
1379     \r
1380                 {\r
1381                         if (cast || fail)\r
1382                         {\r
1383                                 msg_print(_("あなたはサイバーデーモンのカードに集中する...", "You concentrate on the trump of a Cyberdemon..."));\r
1384                                 if (trump_summoning(1, !fail, p_ptr->y, p_ptr->x, 0, SUMMON_CYBER, 0L))\r
1385                                 {\r
1386                                         if (fail)\r
1387                                         {\r
1388                                                 msg_print(_("召喚されたサイバーデーモンは怒っている!", "The summoned Cyberdemon gets angry!"));\r
1389                                         }\r
1390                                 }\r
1391                         }\r
1392                 }\r
1393                 break;\r
1394 \r
1395         case 24:\r
1396                 if (name) return _("予見のカード", "Trump Divination");\r
1397                 if (desc) return _("近くの全てのモンスター、罠、扉、階段、財宝、そしてアイテムを感知する。",\r
1398                         "Detects all monsters, traps, doors, stairs, treasures and items in your vicinity.");\r
1399     \r
1400                 {\r
1401                         int rad = DETECT_RAD_DEFAULT;\r
1402 \r
1403                         if (info) return info_radius(rad);\r
1404 \r
1405                         if (cast)\r
1406                         {\r
1407                                 detect_all(rad);\r
1408                         }\r
1409                 }\r
1410                 break;\r
1411 \r
1412         case 25:\r
1413                 if (name) return _("知識のカード", "Trump Lore");\r
1414                 if (desc) return _("アイテムの持つ能力を完全に知る。", "*Identifies* an item.");\r
1415     \r
1416                 {\r
1417                         if (cast)\r
1418                         {\r
1419                                 if (!identify_fully(FALSE)) return NULL;\r
1420                         }\r
1421                 }\r
1422                 break;\r
1423 \r
1424         case 26:\r
1425                 if (name) return _("回復モンスター", "Heal Monster");\r
1426                 if (desc) return _("モンスター1体の体力を回復させる。", "Heal a monster.");\r
1427     \r
1428                 {\r
1429                         int heal = plev * 10 + 200;\r
1430 \r
1431                         if (info) return info_heal(0, 0, heal);\r
1432 \r
1433                         if (cast)\r
1434                         {\r
1435                                 bool result;\r
1436 \r
1437                                 /* Temporary enable target_pet option */\r
1438                                 bool old_target_pet = target_pet;\r
1439                                 target_pet = TRUE;\r
1440 \r
1441                                 result = get_aim_dir(&dir);\r
1442 \r
1443                                 /* Restore target_pet option */\r
1444                                 target_pet = old_target_pet;\r
1445 \r
1446                                 if (!result) return NULL;\r
1447 \r
1448                                 heal_monster(dir, heal);\r
1449                         }\r
1450                 }\r
1451                 break;\r
1452 \r
1453         case 27:\r
1454                 if (name) return _("ドラゴンのカード", "Trump Dragon");\r
1455                 if (desc) return _("1体のドラゴンを召喚する。", "Summons a dragon.");\r
1456     \r
1457                 {\r
1458                         if (cast || fail)\r
1459                         {\r
1460                                 msg_print(_("あなたはドラゴンのカードに集中する...", "You concentrate on the trump of a dragon..."));\r
1461                                 if (trump_summoning(1, !fail, p_ptr->y, p_ptr->x, 0, SUMMON_DRAGON, 0L))\r
1462                                 {\r
1463                                         if (fail)\r
1464                                         {\r
1465                                                 msg_print(_("召喚されたドラゴンは怒っている!", "The summoned dragon gets angry!"));\r
1466                                         }\r
1467                                 }\r
1468                         }\r
1469                 }\r
1470                 break;\r
1471 \r
1472         case 28:\r
1473                 if (name) return _("隕石のカード", "Trump Meteor");\r
1474                 if (desc) return _("自分の周辺に隕石を落とす。", "Makes meteor balls fall down to nearby random locations.");\r
1475     \r
1476                 {\r
1477                         HIT_POINT dam = plev * 2;\r
1478                         int rad = 2;\r
1479 \r
1480                         if (info) return info_multi_damage(dam);\r
1481 \r
1482                         if (cast)\r
1483                         {\r
1484                                 cast_meteor(dam, rad);\r
1485                         }\r
1486                 }\r
1487                 break;\r
1488 \r
1489         case 29:\r
1490                 if (name) return _("デーモンのカード", "Trump Demon");\r
1491                 if (desc) return _("1体の悪魔を召喚する。", "Summons a demon.");\r
1492     \r
1493                 {\r
1494                         if (cast || fail)\r
1495                         {\r
1496                                 msg_print(_("あなたはデーモンのカードに集中する...", "You concentrate on the trump of a demon..."));\r
1497                                 if (trump_summoning(1, !fail, p_ptr->y, p_ptr->x, 0, SUMMON_DEMON, 0L))\r
1498                                 {\r
1499                                         if (fail)\r
1500                                         {\r
1501                                                 msg_print(_("召喚されたデーモンは怒っている!", "The summoned demon gets angry!"));\r
1502                                         }\r
1503                                 }\r
1504                         }\r
1505                 }\r
1506                 break;\r
1507 \r
1508         case 30:\r
1509                 if (name) return _("地獄のカード", "Trump Greater Undead");\r
1510                 if (desc) return _("1体の上級アンデッドを召喚する。", "Summons a greater undead.");\r
1511     \r
1512                 {\r
1513                         if (cast || fail)\r
1514                         {\r
1515                                 msg_print(_("あなたは強力なアンデッドのカードに集中する...", "You concentrate on the trump of a greater undead being..."));\r
1516                                 /* May allow unique depend on level and dice roll */\r
1517                                 if (trump_summoning(1, !fail, p_ptr->y, p_ptr->x, 0, SUMMON_HI_UNDEAD, PM_ALLOW_UNIQUE))\r
1518                                 {\r
1519                                         if (fail)\r
1520                                         {\r
1521                                                 msg_print(_("召喚された上級アンデッドは怒っている!", "The summoned greater undead creature gets angry!"));\r
1522                                         }\r
1523                                 }\r
1524                         }\r
1525                 }\r
1526                 break;\r
1527 \r
1528         case 31:\r
1529                 if (name) return _("古代ドラゴンのカード", "Trump Ancient Dragon");\r
1530                 if (desc) return _("1体の古代ドラゴンを召喚する。", "Summons an ancient dragon.");\r
1531     \r
1532                 {\r
1533                         if (cast)\r
1534                         {\r
1535                                 int type;\r
1536 \r
1537                                 if (p_ptr->pclass == CLASS_BEASTMASTER)\r
1538                                         type = SUMMON_HI_DRAGON_LIVING;\r
1539                                 else\r
1540                                         type = SUMMON_HI_DRAGON;\r
1541 \r
1542                                 msg_print(_("あなたは古代ドラゴンのカードに集中する...", "You concentrate on the trump of an ancient dragon..."));\r
1543                                 /* May allow unique depend on level and dice roll */\r
1544                                 if (trump_summoning(1, !fail, p_ptr->y, p_ptr->x, 0, type, PM_ALLOW_UNIQUE))\r
1545                                 {\r
1546                                         if (fail)\r
1547                                         {\r
1548                                                 msg_print(_("召喚された古代ドラゴンは怒っている!", "The summoned ancient dragon gets angry!"));\r
1549                                         }\r
1550                                 }\r
1551                         }\r
1552                 }\r
1553                 break;\r
1554         }\r
1555 \r
1556         return "";\r
1557 }\r
1558 \r
1559 \r
1560 /*!\r
1561  * @brief 匠領域魔法の各処理を行う\r
1562  * @param spell 魔法ID\r
1563  * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_INFO / SPELL_CAST)\r
1564  * @return SPELL_NAME / SPELL_DESC / SPELL_INFO 時には文字列ポインタを返す。SPELL_CAST時はNULL文字列を返す。\r
1565  */\r
1566 static cptr do_craft_spell(SPELL_IDX spell, BIT_FLAGS mode)\r
1567 {\r
1568         bool name = (mode == SPELL_NAME) ? TRUE : FALSE;\r
1569         bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;\r
1570         bool info = (mode == SPELL_INFO) ? TRUE : FALSE;\r
1571         bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;\r
1572 \r
1573         int plev = p_ptr->lev;\r
1574 \r
1575         switch (spell)\r
1576         {\r
1577         case 0:\r
1578                 if (name) return _("赤外線視力", "Infravision");\r
1579                 if (desc) return _("一定時間、赤外線視力が増強される。", "Gives infravision for a while.");\r
1580     \r
1581                 {\r
1582                         int base = 100;\r
1583 \r
1584                         if (info) return info_duration(base, base);\r
1585 \r
1586                         if (cast)\r
1587                         {\r
1588                                 set_tim_infra(base + randint1(base), FALSE);\r
1589                         }\r
1590                 }\r
1591                 break;\r
1592 \r
1593         case 1:\r
1594                 if (name) return _("回復力強化", "Regeneration");\r
1595                 if (desc) return _("一定時間、回復力が増強される。", "Gives regeneration ability for a while.");\r
1596     \r
1597                 {\r
1598                         int base = 80;\r
1599 \r
1600                         if (info) return info_duration(base, base);\r
1601 \r
1602                         if (cast)\r
1603                         {\r
1604                                 set_tim_regen(base + randint1(base), FALSE);\r
1605                         }\r
1606                 }\r
1607                 break;\r
1608 \r
1609         case 2:\r
1610                 if (name) return _("空腹充足", "Satisfy Hunger");\r
1611                 if (desc) return _("満腹になる。", "Satisfies hunger.");\r
1612     \r
1613                 {\r
1614                         if (cast)\r
1615                         {\r
1616                                 set_food(PY_FOOD_MAX - 1);\r
1617                         }\r
1618                 }\r
1619                 break;\r
1620 \r
1621         case 3:\r
1622                 if (name) return _("耐冷気", "Resist Cold");\r
1623                 if (desc) return _("一定時間、冷気への耐性を得る。装備による耐性に累積する。", \r
1624                         "Gives resistance to cold. This resistance can be added to which from equipment for more powerful resistance.");\r
1625     \r
1626                 {\r
1627                         int base = 20;\r
1628 \r
1629                         if (info) return info_duration(base, base);\r
1630 \r
1631                         if (cast)\r
1632                         {\r
1633                                 set_oppose_cold(randint1(base) + base, FALSE);\r
1634                         }\r
1635                 }\r
1636                 break;\r
1637 \r
1638         case 4:\r
1639                 if (name) return _("耐火炎", "Resist Fire");\r
1640                 if (desc) return _("一定時間、炎への耐性を得る。装備による耐性に累積する。", \r
1641                         "Gives resistance to fire. This resistance can be added to which from equipment for more powerful resistance.");\r
1642     \r
1643                 {\r
1644                         int base = 20;\r
1645 \r
1646                         if (info) return info_duration(base, base);\r
1647 \r
1648                         if (cast)\r
1649                         {\r
1650                                 set_oppose_fire(randint1(base) + base, FALSE);\r
1651                         }\r
1652                 }\r
1653                 break;\r
1654 \r
1655         case 5:\r
1656                 if (name) return _("士気高揚", "Heroism");\r
1657                 if (desc) return _("一定時間、ヒーロー気分になる。", "Removes fear, and gives bonus to hit and 10 more HP for a while.");\r
1658     \r
1659                 {\r
1660                         int base = 25;\r
1661 \r
1662                         if (info) return info_duration(base, base);\r
1663 \r
1664                         if (cast)\r
1665                         {\r
1666                                 set_hero(randint1(base) + base, FALSE);\r
1667                                 hp_player(10);\r
1668                                 set_afraid(0);\r
1669                         }\r
1670                 }\r
1671                 break;\r
1672 \r
1673         case 6:\r
1674                 if (name) return _("耐電撃", "Resist Lightning");\r
1675                 if (desc) return _("一定時間、電撃への耐性を得る。装備による耐性に累積する。",\r
1676                         "Gives resistance to electricity. This resistance can be added to which from equipment for more powerful resistance.");\r
1677     \r
1678                 {\r
1679                         int base = 20;\r
1680 \r
1681                         if (info) return info_duration(base, base);\r
1682 \r
1683                         if (cast)\r
1684                         {\r
1685                                 set_oppose_elec(randint1(base) + base, FALSE);\r
1686                         }\r
1687                 }\r
1688                 break;\r
1689 \r
1690         case 7:\r
1691                 if (name) return _("耐酸", "Resist Acid");\r
1692                 if (desc) return _("一定時間、酸への耐性を得る。装備による耐性に累積する。",\r
1693                         "Gives resistance to acid. This resistance can be added to which from equipment for more powerful resistance.");\r
1694     \r
1695                 {\r
1696                         int base = 20;\r
1697 \r
1698                         if (info) return info_duration(base, base);\r
1699 \r
1700                         if (cast)\r
1701                         {\r
1702                                 set_oppose_acid(randint1(base) + base, FALSE);\r
1703                         }\r
1704                 }\r
1705                 break;\r
1706 \r
1707         case 8:\r
1708                 if (name) return _("透明視認", "See Invisibility");\r
1709                 if (desc) return _("一定時間、透明なものが見えるようになる。", "Gives see invisible for a while.");\r
1710     \r
1711                 {\r
1712                         int base = 24;\r
1713 \r
1714                         if (info) return info_duration(base, base);\r
1715 \r
1716                         if (cast)\r
1717                         {\r
1718                                 set_tim_invis(randint1(base) + base, FALSE);\r
1719                         }\r
1720                 }\r
1721                 break;\r
1722 \r
1723         case 9:\r
1724                 if (name) return _("解呪", "Remove Curse");\r
1725                 if (desc) return _("アイテムにかかった弱い呪いを解除する。", "Removes normal curses from equipped items.");\r
1726     \r
1727                 {\r
1728                         if (cast)\r
1729                         {\r
1730                                 if (remove_curse())\r
1731                                 {\r
1732                                         msg_print(_("誰かに見守られているような気がする。", "You feel as if someone is watching over you."));\r
1733                                 }\r
1734                         }\r
1735                 }\r
1736                 break;\r
1737 \r
1738         case 10:\r
1739                 if (name) return _("耐毒", "Resist Poison");\r
1740                 if (desc) return _("一定時間、毒への耐性を得る。装備による耐性に累積する。",\r
1741                         "Gives resistance to poison. This resistance can be added to which from equipment for more powerful resistance.");\r
1742     \r
1743                 {\r
1744                         int base = 20;\r
1745 \r
1746                         if (info) return info_duration(base, base);\r
1747 \r
1748                         if (cast)\r
1749                         {\r
1750                                 set_oppose_pois(randint1(base) + base, FALSE);\r
1751                         }\r
1752                 }\r
1753                 break;\r
1754 \r
1755         case 11:\r
1756                 if (name) return _("狂戦士化", "Berserk");\r
1757                 if (desc) return _("狂戦士化し、恐怖を除去する。", "Gives bonus to hit and HP, immunity to fear for a while. But decreases AC.");\r
1758     \r
1759                 {\r
1760                         int base = 25;\r
1761 \r
1762                         if (info) return info_duration(base, base);\r
1763 \r
1764                         if (cast)\r
1765                         {\r
1766                                 set_shero(randint1(base) + base, FALSE);\r
1767                                 hp_player(30);\r
1768                                 set_afraid(0);\r
1769                         }\r
1770                 }\r
1771                 break;\r
1772 \r
1773         case 12:\r
1774                 if (name) return _("自己分析", "Self Knowledge");\r
1775                 if (desc) return _("現在の自分の状態を完全に知る。",\r
1776                         "Gives you useful info regarding your current resistances, the powers of your weapon and maximum limits of your stats.");\r
1777     \r
1778                 {\r
1779                         if (cast)\r
1780                         {\r
1781                                 self_knowledge();\r
1782                         }\r
1783                 }\r
1784                 break;\r
1785 \r
1786         case 13:\r
1787                 if (name) return _("対邪悪結界", "Protection from Evil");\r
1788                 if (desc) return _("邪悪なモンスターの攻撃を防ぐバリアを張る。", "Gives aura which protect you from evil monster's physical attack.");\r
1789     \r
1790                 {\r
1791                         int base = 3 * plev;\r
1792                         int sides = 25;\r
1793 \r
1794                         if (info) return info_duration(base, sides);\r
1795 \r
1796                         if (cast)\r
1797                         {\r
1798                                 set_protevil(randint1(sides) + base, FALSE);\r
1799                         }\r
1800                 }\r
1801                 break;\r
1802 \r
1803         case 14:\r
1804                 if (name) return _("癒し", "Cure");\r
1805                 if (desc) return _("毒、朦朧状態、負傷を全快させ、幻覚を直す。", "Heals poison, stun, cut and hallucination completely.");\r
1806     \r
1807                 {\r
1808                         if (cast)\r
1809                         {\r
1810                                 set_poisoned(0);\r
1811                                 set_stun(0);\r
1812                                 set_cut(0);\r
1813                                 set_image(0);\r
1814                         }\r
1815                 }\r
1816                 break;\r
1817 \r
1818         case 15:\r
1819                 if (name) return _("魔法剣", "Mana Branding");\r
1820                 if (desc) return _("一定時間、武器に冷気、炎、電撃、酸、毒のいずれかの属性をつける。武器を持たないと使えない。",\r
1821                         "Makes current weapon some elemental branded. You must wield weapons.");\r
1822     \r
1823                 {\r
1824                         int base = plev / 2;\r
1825 \r
1826                         if (info) return info_duration(base, base);\r
1827 \r
1828                         if (cast)\r
1829                         {\r
1830                                 if (!choose_ele_attack()) return NULL;\r
1831                         }\r
1832                 }\r
1833                 break;\r
1834 \r
1835         case 16:\r
1836                 if (name) return _("テレパシー", "Telepathy");\r
1837                 if (desc) return _("一定時間、テレパシー能力を得る。", "Gives telepathy for a while.");\r
1838     \r
1839                 {\r
1840                         int base = 25;\r
1841                         int sides = 30;\r
1842 \r
1843                         if (info) return info_duration(base, sides);\r
1844 \r
1845                         if (cast)\r
1846                         {\r
1847                                 set_tim_esp(randint1(sides) + base, FALSE);\r
1848                         }\r
1849                 }\r
1850                 break;\r
1851 \r
1852         case 17:\r
1853                 if (name) return _("肌石化", "Stone Skin");\r
1854                 if (desc) return _("一定時間、ACを上昇させる。", "Gives bonus to AC for a while.");\r
1855     \r
1856                 {\r
1857                         int base = 30;\r
1858                         int sides = 20;\r
1859 \r
1860                         if (info) return info_duration(base, sides);\r
1861 \r
1862                         if (cast)\r
1863                         {\r
1864                                 set_shield(randint1(sides) + base, FALSE);\r
1865                         }\r
1866                 }\r
1867                 break;\r
1868 \r
1869         case 18:\r
1870                 if (name) return _("全耐性", "Resistance");\r
1871                 if (desc) return _("一定時間、酸、電撃、炎、冷気、毒に対する耐性を得る。装備による耐性に累積する。", \r
1872                         "Gives resistance to fire, cold, electricity, acid and poison for a while. These resistances can be added to which from equipment for more powerful resistances.");\r
1873     \r
1874                 {\r
1875                         int base = 20;\r
1876 \r
1877                         if (info) return info_duration(base, base);\r
1878 \r
1879                         if (cast)\r
1880                         {\r
1881                                 set_oppose_acid(randint1(base) + base, FALSE);\r
1882                                 set_oppose_elec(randint1(base) + base, FALSE);\r
1883                                 set_oppose_fire(randint1(base) + base, FALSE);\r
1884                                 set_oppose_cold(randint1(base) + base, FALSE);\r
1885                                 set_oppose_pois(randint1(base) + base, FALSE);\r
1886                         }\r
1887                 }\r
1888                 break;\r
1889 \r
1890         case 19:\r
1891                 if (name) return _("スピード", "Haste Self");\r
1892                 if (desc) return _("一定時間、加速する。", "Hastes you for a while.");\r
1893     \r
1894                 {\r
1895                         int base = plev;\r
1896                         int sides = 20 + plev;\r
1897 \r
1898                         if (info) return info_duration(base, sides);\r
1899 \r
1900                         if (cast)\r
1901                         {\r
1902                                 set_fast(randint1(sides) + base, FALSE);\r
1903                         }\r
1904                 }\r
1905                 break;\r
1906 \r
1907         case 20:\r
1908                 if (name) return _("壁抜け", "Walk through Wall");\r
1909                 if (desc) return _("一定時間、半物質化し壁を通り抜けられるようになる。", "Gives ability to pass walls for a while.");\r
1910     \r
1911                 {\r
1912                         int base = plev / 2;\r
1913 \r
1914                         if (info) return info_duration(base, base);\r
1915 \r
1916                         if (cast)\r
1917                         {\r
1918                                 set_kabenuke(randint1(base) + base, FALSE);\r
1919                         }\r
1920                 }\r
1921                 break;\r
1922 \r
1923         case 21:\r
1924                 if (name) return _("盾磨き", "Polish Shield");\r
1925                 if (desc) return _("盾に反射の属性をつける。", "Makes a shield a shield of reflection.");\r
1926     \r
1927                 {\r
1928                         if (cast)\r
1929                         {\r
1930                                 pulish_shield();\r
1931                         }\r
1932                 }\r
1933                 break;\r
1934 \r
1935         case 22:\r
1936                 if (name) return _("ゴーレム製造", "Create Golem");\r
1937                 if (desc) return _("1体のゴーレムを製造する。", "Creates a golem.");\r
1938     \r
1939                 {\r
1940                         if (cast)\r
1941                         {\r
1942                                 if (summon_specific(-1, p_ptr->y, p_ptr->x, plev, SUMMON_GOLEM, PM_FORCE_PET))\r
1943                                 {\r
1944                                         msg_print(_("ゴーレムを作った。", "You make a golem."));\r
1945                                 }\r
1946                                 else\r
1947                                 {\r
1948                                         msg_print(_("うまくゴーレムを作れなかった。", "No Golems arrive."));\r
1949                                 }\r
1950                         }\r
1951                 }\r
1952                 break;\r
1953 \r
1954         case 23:\r
1955                 if (name) return _("魔法の鎧", "Magical armor");\r
1956                 if (desc) return _("一定時間、魔法防御力とACが上がり、混乱と盲目の耐性、反射能力、麻痺知らず、浮遊を得る。",\r
1957                         "Gives resistance to magic, bonus to AC, resistance to confusion, blindness, reflection, free action and levitation for a while.");\r
1958     \r
1959                 {\r
1960                         int base = 20;\r
1961 \r
1962                         if (info) return info_duration(base, base);\r
1963 \r
1964                         if (cast)\r
1965                         {\r
1966                                 set_magicdef(randint1(base) + base, FALSE);\r
1967                         }\r
1968                 }\r
1969                 break;\r
1970 \r
1971         case 24:\r
1972                 if (name) return _("装備無力化", "Remove Enchantment");\r
1973                 if (desc) return _("武器・防具にかけられたあらゆる魔力を完全に解除する。", "Removes all magics completely from any weapon or armor.");\r
1974     \r
1975                 {\r
1976                         if (cast)\r
1977                         {\r
1978                                 if (!mundane_spell(TRUE)) return NULL;\r
1979                         }\r
1980                 }\r
1981                 break;\r
1982 \r
1983         case 25:\r
1984                 if (name) return _("呪い粉砕", "Remove All Curse");\r
1985                 if (desc) return _("アイテムにかかった強力な呪いを解除する。", "Removes normal and heavy curse from equipped items.");\r
1986     \r
1987                 {\r
1988                         if (cast)\r
1989                         {\r
1990                                 if (remove_all_curse())\r
1991                                 {\r
1992                                         msg_print(_("誰かに見守られているような気がする。", "You feel as if someone is watching over you."));\r
1993                                 }\r
1994                         }\r
1995                 }\r
1996                 break;\r
1997 \r
1998         case 26:\r
1999                 if (name) return _("完全なる知識", "Knowledge True");\r
2000                 if (desc) return _("アイテムの持つ能力を完全に知る。", "*Identifies* an item.");\r
2001     \r
2002                 {\r
2003                         if (cast)\r
2004                         {\r
2005                                 if (!identify_fully(FALSE)) return NULL;\r
2006                         }\r
2007                 }\r
2008                 break;\r
2009 \r
2010         case 27:\r
2011                 if (name) return _("武器強化", "Enchant Weapon");\r
2012                 if (desc) return _("武器の命中率修正とダメージ修正を強化する。", "Attempts to increase +to-hit, +to-dam of a weapon.");\r
2013     \r
2014                 {\r
2015                         if (cast)\r
2016                         {\r
2017                                 if (!enchant_spell(randint0(4) + 1, randint0(4) + 1, 0)) return NULL;\r
2018                         }\r
2019                 }\r
2020                 break;\r
2021 \r
2022         case 28:\r
2023                 if (name) return _("防具強化", "Enchant Armor");\r
2024                 if (desc) return _("鎧の防御修正を強化する。", "Attempts to increase +AC of an armor.");\r
2025     \r
2026                 {\r
2027                         if (cast)\r
2028                         {\r
2029                                 if (!enchant_spell(0, 0, randint0(3) + 2)) return NULL;\r
2030                         }\r
2031                 }\r
2032                 break;\r
2033 \r
2034         case 29:\r
2035                 if (name) return _("武器属性付与", "Brand Weapon");\r
2036                 if (desc) return _("武器にランダムに属性をつける。", "Makes current weapon a random ego weapon.");\r
2037     \r
2038                 {\r
2039                         if (cast)\r
2040                         {\r
2041                                 brand_weapon(randint0(18));\r
2042                         }\r
2043                 }\r
2044                 break;\r
2045 \r
2046         case 30:\r
2047                 if (name) return _("人間トランプ", "Living Trump");\r
2048                 if (desc) return _("ランダムにテレポートする突然変異か、自分の意思でテレポートする突然変異が身につく。",\r
2049                         "Gives mutation which makes you teleport randomly or makes you able to teleport at will.");\r
2050     \r
2051                 {\r
2052                         if (cast)\r
2053                         {\r
2054                                 int mutation;\r
2055 \r
2056                                 if (one_in_(7))\r
2057                                         /* Teleport control */\r
2058                                         mutation = 12;\r
2059                                 else\r
2060                                         /* Random teleportation (uncontrolled) */\r
2061                                         mutation = 77;\r
2062 \r
2063                                 /* Gain the mutation */\r
2064                                 if (gain_random_mutation(mutation))\r
2065                                 {\r
2066                                         msg_print(_("あなたは生きているカードに変わった。", "You have turned into a Living Trump."));\r
2067                                 }\r
2068                         }\r
2069                 }\r
2070                 break;\r
2071 \r
2072         case 31:\r
2073                 if (name) return _("属性への免疫", "Immunity");\r
2074                 if (desc) return _("一定時間、冷気、炎、電撃、酸のいずれかに対する免疫を得る。",\r
2075                         "Gives an immunity to fire, cold, electricity or acid for a while.");\r
2076     \r
2077                 {\r
2078                         int base = 13;\r
2079 \r
2080                         if (info) return info_duration(base, base);\r
2081 \r
2082                         if (cast)\r
2083                         {\r
2084                                 if (!choose_ele_immune(base + randint1(base))) return NULL;\r
2085                         }\r
2086                 }\r
2087                 break;\r
2088         }\r
2089 \r
2090         return "";\r
2091 }\r
2092 \r
2093 /*!\r
2094  * @brief 悪魔領域魔法の各処理を行う\r
2095  * @param spell 魔法ID\r
2096  * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_INFO / SPELL_CAST)\r
2097  * @return SPELL_NAME / SPELL_DESC / SPELL_INFO 時には文字列ポインタを返す。SPELL_CAST時はNULL文字列を返す。\r
2098  */\r
2099 static cptr do_daemon_spell(SPELL_IDX spell, BIT_FLAGS mode)\r
2100 {\r
2101         bool name = (mode == SPELL_NAME) ? TRUE : FALSE;\r
2102         bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;\r
2103         bool info = (mode == SPELL_INFO) ? TRUE : FALSE;\r
2104         bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;\r
2105         static const char s_dam[] = _("損傷:", "dam ");\r
2106 \r
2107         int dir;\r
2108         int plev = p_ptr->lev;\r
2109 \r
2110         switch (spell)\r
2111         {\r
2112         case 0:\r
2113                 if (name) return _("マジック・ミサイル", "Magic Missile");\r
2114                 if (desc) return _("弱い魔法の矢を放つ。", "Fires a weak bolt of magic.");\r
2115     \r
2116                 {\r
2117                         int dice = 3 + (plev - 1) / 5;\r
2118                         int sides = 4;\r
2119 \r
2120                         if (info) return info_damage(dice, sides, 0);\r
2121 \r
2122                         if (cast)\r
2123                         {\r
2124                                 if (!get_aim_dir(&dir)) return NULL;\r
2125 \r
2126                                 fire_bolt_or_beam(beam_chance() - 10, GF_MISSILE, dir, damroll(dice, sides));\r
2127                         }\r
2128                 }\r
2129                 break;\r
2130 \r
2131         case 1:\r
2132                 if (name) return _("無生命感知", "Detect Unlife");\r
2133                 if (desc) return _("近くの生命のないモンスターを感知する。", "Detects all nonliving monsters in your vicinity.");\r
2134     \r
2135                 {\r
2136                         int rad = DETECT_RAD_DEFAULT;\r
2137 \r
2138                         if (info) return info_radius(rad);\r
2139 \r
2140                         if (cast)\r
2141                         {\r
2142                                 detect_monsters_nonliving(rad);\r
2143                         }\r
2144                 }\r
2145                 break;\r
2146 \r
2147         case 2:\r
2148                 if (name) return _("邪なる祝福", "Evil Bless");\r
2149                 if (desc) return _("一定時間、命中率とACにボーナスを得る。", "Gives bonus to hit and AC for a few turns.");\r
2150     \r
2151                 {\r
2152                         int base = 12;\r
2153 \r
2154                         if (info) return info_duration(base, base);\r
2155 \r
2156                         if (cast)\r
2157                         {\r
2158                                 set_blessed(randint1(base) + base, FALSE);\r
2159                         }\r
2160                 }\r
2161                 break;\r
2162 \r
2163         case 3:\r
2164                 if (name) return _("耐火炎", "Resist Fire");\r
2165                 if (desc) return _("一定時間、炎への耐性を得る。装備による耐性に累積する。", \r
2166                         "Gives resistance to fire, cold and electricity for a while. These resistances can be added to which from equipment for more powerful resistances.");\r
2167     \r
2168                 {\r
2169                         int base = 20;\r
2170 \r
2171                         if (info) return info_duration(base, base);\r
2172 \r
2173                         if (cast)\r
2174                         {\r
2175                                 set_oppose_fire(randint1(base) + base, FALSE);\r
2176                         }\r
2177                 }\r
2178                 break;\r
2179 \r
2180         case 4:\r
2181                 if (name) return _("恐慌", "Horrify");\r
2182                 if (desc) return _("モンスター1体を恐怖させ、朦朧させる。抵抗されると無効。", "Attempts to scare and stun a monster.");\r
2183     \r
2184                 {\r
2185                         int power = plev;\r
2186 \r
2187                         if (info) return info_power(power);\r
2188 \r
2189                         if (cast)\r
2190                         {\r
2191                                 if (!get_aim_dir(&dir)) return NULL;\r
2192 \r
2193                                 fear_monster(dir, power);\r
2194                                 stun_monster(dir, power);\r
2195                         }\r
2196                 }\r
2197                 break;\r
2198 \r
2199         case 5:\r
2200                 if (name) return _("地獄の矢", "Nether Bolt");\r
2201                 if (desc) return _("地獄のボルトもしくはビームを放つ。", "Fires a bolt or beam of nether.");\r
2202     \r
2203                 {\r
2204                         int dice = 6 + (plev - 5) / 4;\r
2205                         int sides = 8;\r
2206 \r
2207                         if (info) return info_damage(dice, sides, 0);\r
2208 \r
2209                         if (cast)\r
2210                         {\r
2211                                 if (!get_aim_dir(&dir)) return NULL;\r
2212 \r
2213                                 fire_bolt_or_beam(beam_chance(), GF_NETHER, dir, damroll(dice, sides));\r
2214                         }\r
2215                 }\r
2216                 break;\r
2217 \r
2218         case 6:\r
2219                 if (name) return _("古代の死霊召喚", "Summon Manes");\r
2220                 if (desc) return _("古代の死霊を召喚する。", "Summons a manes.");\r
2221     \r
2222                 {\r
2223                         if (cast)\r
2224                         {\r
2225                                 if (!summon_specific(-1, p_ptr->y, p_ptr->x, (plev * 3) / 2, SUMMON_MANES, (PM_ALLOW_GROUP | PM_FORCE_PET)))\r
2226                                 {\r
2227                                         msg_print(_("古代の死霊は現れなかった。", "No Manes arrive."));\r
2228                                 }\r
2229                         }\r
2230                 }\r
2231                 break;\r
2232 \r
2233         case 7:\r
2234                 if (name) return _("地獄の焔", "Hellish Flame");\r
2235                 if (desc) return _("邪悪な力を持つボールを放つ。善良なモンスターには大きなダメージを与える。",\r
2236                         "Fires a ball of evil power. Hurts good monsters greatly.");\r
2237     \r
2238                 {\r
2239                         int dice = 3;\r
2240                         int sides = 6;\r
2241                         int rad = (plev < 30) ? 2 : 3;\r
2242                         int base;\r
2243 \r
2244                         if (p_ptr->pclass == CLASS_MAGE ||\r
2245                             p_ptr->pclass == CLASS_HIGH_MAGE ||\r
2246                             p_ptr->pclass == CLASS_SORCERER)\r
2247                                 base = plev + plev / 2;\r
2248                         else\r
2249                                 base = plev + plev / 4;\r
2250 \r
2251 \r
2252                         if (info) return info_damage(dice, sides, base);\r
2253 \r
2254                         if (cast)\r
2255                         {\r
2256                                 if (!get_aim_dir(&dir)) return NULL;\r
2257 \r
2258                                 fire_ball(GF_HELL_FIRE, dir, damroll(dice, sides) + base, rad);\r
2259                         }\r
2260                 }\r
2261                 break;\r
2262 \r
2263         case 8:\r
2264                 if (name) return _("デーモン支配", "Dominate Demon");\r
2265                 if (desc) return _("悪魔1体を魅了する。抵抗されると無効", "Attempts to charm a demon.");\r
2266     \r
2267                 {\r
2268                         int power = plev;\r
2269 \r
2270                         if (info) return info_power(power);\r
2271 \r
2272                         if (cast)\r
2273                         {\r
2274                                 if (!get_aim_dir(&dir)) return NULL;\r
2275 \r
2276                                 control_one_demon(dir, power);\r
2277                         }\r
2278                 }\r
2279                 break;\r
2280 \r
2281         case 9:\r
2282                 if (name) return _("ビジョン", "Vision");\r
2283                 if (desc) return _("周辺の地形を感知する。", "Maps nearby area.");\r
2284     \r
2285                 {\r
2286                         int rad = DETECT_RAD_MAP;\r
2287 \r
2288                         if (info) return info_radius(rad);\r
2289 \r
2290                         if (cast)\r
2291                         {\r
2292                                 map_area(rad);\r
2293                         }\r
2294                 }\r
2295                 break;\r
2296 \r
2297         case 10:\r
2298                 if (name) return _("耐地獄", "Resist Nether");\r
2299                 if (desc) return _("一定時間、地獄への耐性を得る。", "Gives resistance to nether for a while.");\r
2300     \r
2301                 {\r
2302                         int base = 20;\r
2303 \r
2304                         if (info) return info_duration(base, base);\r
2305 \r
2306                         if (cast)\r
2307                         {\r
2308                                 set_tim_res_nether(randint1(base) + base, FALSE);\r
2309                         }\r
2310                 }\r
2311                 break;\r
2312 \r
2313         case 11:\r
2314                 if (name) return _("プラズマ・ボルト", "Plasma bolt");\r
2315                 if (desc) return _("プラズマのボルトもしくはビームを放つ。", "Fires a bolt or beam of plasma.");\r
2316     \r
2317                 {\r
2318                         int dice = 11 + (plev - 5) / 4;\r
2319                         int sides = 8;\r
2320 \r
2321                         if (info) return info_damage(dice, sides, 0);\r
2322 \r
2323                         if (cast)\r
2324                         {\r
2325                                 if (!get_aim_dir(&dir)) return NULL;\r
2326 \r
2327                                 fire_bolt_or_beam(beam_chance(), GF_PLASMA, dir, damroll(dice, sides));\r
2328                         }\r
2329                 }\r
2330                 break;\r
2331 \r
2332         case 12:\r
2333                 if (name) return _("ファイア・ボール", "Fire Ball");\r
2334                 if (desc) return _("炎の球を放つ。", "Fires a ball of fire.");\r
2335     \r
2336                 {\r
2337                         HIT_POINT dam = plev + 55;\r
2338                         int rad = 2;\r
2339 \r
2340                         if (info) return info_damage(0, 0, dam);\r
2341 \r
2342                         if (cast)\r
2343                         {\r
2344                                 if (!get_aim_dir(&dir)) return NULL;\r
2345 \r
2346                                 fire_ball(GF_FIRE, dir, dam, rad);\r
2347                         }\r
2348                 }\r
2349                 break;\r
2350 \r
2351         case 13:\r
2352                 if (name) return _("炎の刃", "Fire Branding");\r
2353                 if (desc) return _("武器に炎の属性をつける。", "Makes current weapon fire branded.");\r
2354     \r
2355                 {\r
2356                         if (cast)\r
2357                         {\r
2358                                 brand_weapon(1);\r
2359                         }\r
2360                 }\r
2361                 break;\r
2362 \r
2363         case 14:\r
2364                 if (name) return _("地獄球", "Nether Ball");\r
2365                 if (desc) return _("大きな地獄の球を放つ。", "Fires a huge ball of nether.");\r
2366     \r
2367                 {\r
2368                         HIT_POINT dam = plev * 3 / 2 + 100;\r
2369                         int rad = plev / 20 + 2;\r
2370 \r
2371                         if (info) return info_damage(0, 0, dam);\r
2372 \r
2373                         if (cast)\r
2374                         {\r
2375                                 if (!get_aim_dir(&dir)) return NULL;\r
2376 \r
2377                                 fire_ball(GF_NETHER, dir, dam, rad);\r
2378                         }\r
2379                 }\r
2380                 break;\r
2381 \r
2382         case 15:\r
2383                 if (name) return _("デーモン召喚", "Summon Demon");\r
2384                 if (desc) return _("悪魔1体を召喚する。", "Summons a demon.");\r
2385     \r
2386                 {\r
2387                         if (cast)\r
2388                         {\r
2389                                 bool pet = !one_in_(3);\r
2390                                 u32b flg = 0L;\r
2391 \r
2392                                 if (pet) flg |= PM_FORCE_PET;\r
2393                                 else flg |= PM_NO_PET;\r
2394                                 if (!(pet && (plev < 50))) flg |= PM_ALLOW_GROUP;\r
2395 \r
2396                                 if (summon_specific((pet ? -1 : 0), p_ptr->y, p_ptr->x, plev*2/3+randint1(plev/2), SUMMON_DEMON, flg))\r
2397                                 {\r
2398                                         msg_print(_("硫黄の悪臭が充満した。", "The area fills with a stench of sulphur and brimstone."));\r
2399 \r
2400                                         if (pet)\r
2401                                         {\r
2402                                                 msg_print(_("「ご用でございますか、ご主人様」", "'What is thy bidding... Master?'"));\r
2403                                         }\r
2404                                         else\r
2405                                         {\r
2406                                                 msg_print(_("「卑しき者よ、我は汝の下僕にあらず! お前の魂を頂くぞ!」",\r
2407                                                                         "'NON SERVIAM! Wretch! I shall feast on thy mortal soul!'"));\r
2408                                         }\r
2409                                 }\r
2410                                 else\r
2411                                 {\r
2412                                         msg_print(_("悪魔は現れなかった。", "No demons arrive."));\r
2413                                 }\r
2414                                 break;\r
2415                         }\r
2416                 }\r
2417                 break;\r
2418 \r
2419         case 16:\r
2420                 if (name) return _("悪魔の目", "Devilish Eye");\r
2421                 if (desc) return _("一定時間、テレパシー能力を得る。", "Gives telepathy for a while.");\r
2422     \r
2423                 {\r
2424                         int base = 30;\r
2425                         int sides = 25;\r
2426 \r
2427                         if (info) return info_duration(base, sides);\r
2428 \r
2429                         if (cast)\r
2430                         {\r
2431                                 set_tim_esp(randint1(sides) + base, FALSE);\r
2432                         }\r
2433                 }\r
2434                 break;\r
2435 \r
2436         case 17:\r
2437                 if (name) return _("悪魔のクローク", "Devil Cloak");\r
2438                 if (desc) return _("恐怖を取り除き、一定時間、炎と冷気の耐性、炎のオーラを得る。耐性は装備による耐性に累積する。", \r
2439                         "Removes fear. Gives resistance to fire and cold, and aura of fire. These resistances can be added to which from equipment for more powerful resistances.");\r
2440     \r
2441                 {\r
2442                         TIME_EFFECT base = 20;\r
2443 \r
2444                         if (info) return info_duration(base, base);\r
2445 \r
2446                         if (cast)\r
2447                         {\r
2448                                 TIME_EFFECT dur = randint1(base) + base;\r
2449                                         \r
2450                                 set_oppose_fire(dur, FALSE);\r
2451                                 set_oppose_cold(dur, FALSE);\r
2452                                 set_tim_sh_fire(dur, FALSE);\r
2453                                 set_afraid(0);\r
2454                                 break;\r
2455                         }\r
2456                 }\r
2457                 break;\r
2458 \r
2459         case 18:\r
2460                 if (name) return _("溶岩流", "The Flow of Lava");\r
2461                 if (desc) return _("自分を中心とした炎の球を作り出し、床を溶岩に変える。", \r
2462                         "Generates a ball of fire centered on you which transforms floors to magma.");\r
2463     \r
2464                 {\r
2465                         HIT_POINT dam = (55 + plev) * 2;\r
2466                         int rad = 3;\r
2467 \r
2468                         if (info) return info_damage(0, 0, dam/2);\r
2469 \r
2470                         if (cast)\r
2471                         {\r
2472                                 fire_ball(GF_FIRE, 0, dam, rad);\r
2473                                 fire_ball_hide(GF_LAVA_FLOW, 0, 2 + randint1(2), rad);\r
2474                         }\r
2475                 }\r
2476                 break;\r
2477 \r
2478         case 19:\r
2479                 if (name) return _("プラズマ球", "Plasma Ball");\r
2480                 if (desc) return _("プラズマの球を放つ。", "Fires a ball of plasma.");\r
2481     \r
2482                 {\r
2483                         HIT_POINT dam = plev * 3 / 2 + 80;\r
2484                         int rad = 2 + plev / 40;\r
2485 \r
2486                         if (info) return info_damage(0, 0, dam);\r
2487 \r
2488                         if (cast)\r
2489                         {\r
2490                                 if (!get_aim_dir(&dir)) return NULL;\r
2491 \r
2492                                 fire_ball(GF_PLASMA, dir, dam, rad);\r
2493                         }\r
2494                 }\r
2495                 break;\r
2496 \r
2497         case 20:\r
2498                 if (name) return _("悪魔変化", "Polymorph Demon");\r
2499                 if (desc) return _("一定時間、悪魔に変化する。変化している間は本来の種族の能力を失い、代わりに悪魔としての能力を得る。", \r
2500                         "Mimic a demon for a while. Loses abilities of original race and gets abilities as a demon.");\r
2501     \r
2502                 {\r
2503                         int base = 10 + plev / 2;\r
2504 \r
2505                         if (info) return info_duration(base, base);\r
2506 \r
2507                         if (cast)\r
2508                         {\r
2509                                 set_mimic(base + randint1(base), MIMIC_DEMON, FALSE);\r
2510                         }\r
2511                 }\r
2512                 break;\r
2513 \r
2514         case 21:\r
2515                 if (name) return _("地獄の波動", "Nather Wave");\r
2516                 if (desc) return _("視界内の全てのモンスターにダメージを与える。善良なモンスターに特に大きなダメージを与える。", \r
2517                         "Damages all monsters in sight. Hurts good monsters greatly.");\r
2518     \r
2519                 {\r
2520                         int sides1 = plev * 2;\r
2521                         int sides2 = plev * 2;\r
2522 \r
2523                         if (info) return format("%sd%d+d%d", s_dam, sides1, sides2);\r
2524 \r
2525                         if (cast)\r
2526                         {\r
2527                                 dispel_monsters(randint1(sides1));\r
2528                                 dispel_good(randint1(sides2));\r
2529                         }\r
2530                 }\r
2531                 break;\r
2532 \r
2533         case 22:\r
2534                 if (name) return _("サキュバスの接吻", "Kiss of Succubus");\r
2535                 if (desc) return _("因果混乱の球を放つ。", "Fires a ball of nexus.");\r
2536     \r
2537                 {\r
2538                         HIT_POINT dam = 100 + plev * 2;\r
2539                         int rad = 4;\r
2540 \r
2541                         if (info) return info_damage(0, 0, dam);\r
2542 \r
2543                         if (cast)\r
2544                         {\r
2545                                 if (!get_aim_dir(&dir)) return NULL;\r
2546                                 fire_ball(GF_NEXUS, dir, dam, rad);\r
2547                         }\r
2548                 }\r
2549                 break;\r
2550 \r
2551         case 23:\r
2552                 if (name) return _("破滅の手", "Doom Hand");\r
2553                 if (desc) return _("破滅の手を放つ。食らったモンスターはそのときのHPの半分前後のダメージを受ける。", "Attempts to make a monster's HP almost half.");\r
2554     \r
2555                 {\r
2556                         if (cast)\r
2557                         {\r
2558                                 if (!get_aim_dir(&dir))\r
2559                                         return NULL;\r
2560                                 else \r
2561                                         msg_print(_("<破滅の手>を放った!", "You invoke the Hand of Doom!"));\r
2562                                 \r
2563                                 fire_ball_hide(GF_HAND_DOOM, dir, plev * 2, 0);\r
2564                         }\r
2565                 }\r
2566                 break;\r
2567 \r
2568         case 24:\r
2569                 if (name) return _("士気高揚", "Raise the Morale");\r
2570                 if (desc) return _("一定時間、ヒーロー気分になる。", "Removes fear, and gives bonus to hit and 10 more HP for a while.");\r
2571     \r
2572                 {\r
2573                         int base = 25;\r
2574 \r
2575                         if (info) return info_duration(base, base);\r
2576 \r
2577                         if (cast)\r
2578                         {\r
2579                                 set_hero(randint1(base) + base, FALSE);\r
2580                                 hp_player(10);\r
2581                                 set_afraid(0);\r
2582                         }\r
2583                 }\r
2584                 break;\r
2585 \r
2586         case 25:\r
2587                 if (name) return _("不滅の肉体", "Immortal Body");\r
2588                 if (desc) return _("一定時間、時間逆転への耐性を得る。", "Gives resistance to time for a while.");\r
2589     \r
2590                 {\r
2591                         int base = 20;\r
2592 \r
2593                         if (info) return info_duration(base, base);\r
2594 \r
2595                         if (cast)\r
2596                         {\r
2597                                 set_tim_res_time(randint1(base)+base, FALSE);\r
2598                         }\r
2599                 }\r
2600                 break;\r
2601 \r
2602         case 26:\r
2603                 if (name) return _("狂気の円環", "Insanity Circle");\r
2604                 if (desc) return _("自分を中心としたカオスの球、混乱の球を発生させ、近くのモンスターを魅了する。", \r
2605                         "Generate balls of chaos, confusion and charm centered on you.");\r
2606     \r
2607                 {\r
2608                         HIT_POINT dam = 50 + plev;\r
2609                         int power = 20 + plev;\r
2610                         int rad = 3 + plev / 20;\r
2611 \r
2612                         if (info) return format("%s%d+%d", s_dam, dam/2, dam/2);\r
2613 \r
2614                         if (cast)\r
2615                         {\r
2616                                 fire_ball(GF_CHAOS, 0, dam, rad);\r
2617                                 fire_ball(GF_CONFUSION, 0, dam, rad);\r
2618                                 fire_ball(GF_CHARM, 0, power, rad);\r
2619                         }\r
2620                 }\r
2621                 break;\r
2622 \r
2623         case 27:\r
2624                 if (name) return _("ペット爆破", "Explode Pets");\r
2625                 if (desc) return _("全てのペットを強制的に爆破させる。", "Makes all pets explode.");\r
2626     \r
2627                 {\r
2628                         if (cast)\r
2629                         {\r
2630                                 discharge_minion();\r
2631                         }\r
2632                 }\r
2633                 break;\r
2634 \r
2635         case 28:\r
2636                 if (name) return _("グレーターデーモン召喚", "Summon Greater Demon");\r
2637                 if (desc) return _("上級デーモンを召喚する。召喚するには人間('p','h','t'で表されるモンスター)の死体を捧げなければならない。", \r
2638                         "Summons greater demon. It need to sacrifice a corpse of human ('p','h' or 't').");\r
2639     \r
2640                 {\r
2641                         if (cast)\r
2642                         {\r
2643                                 if (!cast_summon_greater_demon()) return NULL;\r
2644                         }\r
2645                 }\r
2646                 break;\r
2647 \r
2648         case 29:\r
2649                 if (name) return _("地獄嵐", "Nether Storm");\r
2650                 if (desc) return _("超巨大な地獄の球を放つ。", "Generate a huge ball of nether.");\r
2651     \r
2652                 {\r
2653                         HIT_POINT dam = plev * 15;\r
2654                         int rad = plev / 5;\r
2655 \r
2656                         if (info) return info_damage(0, 0, dam);\r
2657 \r
2658                         if (cast)\r
2659                         {\r
2660                                 if (!get_aim_dir(&dir)) return NULL;\r
2661 \r
2662                                 fire_ball(GF_NETHER, dir, dam, rad);\r
2663                         }\r
2664                 }\r
2665                 break;\r
2666 \r
2667         case 30:\r
2668                 if (name) return _("血の呪い", "Bloody Curse");\r
2669                 if (desc) return _("自分がダメージを受けることによって対象に呪いをかけ、ダメージを与え様々な効果を引き起こす。",\r
2670                         "Puts blood curse which damages and causes various effects on a monster. You also take damage.");\r
2671     \r
2672                 {\r
2673                         HIT_POINT dam = 600;\r
2674                         int rad = 0;\r
2675 \r
2676                         if (info) return info_damage(0, 0, dam);\r
2677 \r
2678                         if (cast)\r
2679                         {\r
2680                                 if (!get_aim_dir(&dir)) return NULL;\r
2681 \r
2682                                 fire_ball_hide(GF_BLOOD_CURSE, dir, dam, rad);\r
2683                                 take_hit(DAMAGE_USELIFE, 20 + randint1(30), _("血の呪い", "Blood curse"), -1);\r
2684                         }\r
2685                 }\r
2686                 break;\r
2687 \r
2688         case 31:\r
2689                 if (name) return _("魔王変化", "Polymorph Demonlord");\r
2690                 if (desc) return _("悪魔の王に変化する。変化している間は本来の種族の能力を失い、代わりに悪魔の王としての能力を得、壁を破壊しながら歩く。",\r
2691                         "Mimic a demon lord for a while. Loses abilities of original race and gets great abilities as a demon lord. Even hard walls can't stop your walking.");\r
2692     \r
2693                 {\r
2694                         int base = 15;\r
2695 \r
2696                         if (info) return info_duration(base, base);\r
2697 \r
2698                         if (cast)\r
2699                         {\r
2700                                 set_mimic(base + randint1(base), MIMIC_DEMON_LORD, FALSE);\r
2701                         }\r
2702                 }\r
2703                 break;\r
2704         }\r
2705 \r
2706         return "";\r
2707 }\r
2708 \r
2709 /*!\r
2710  * @brief 破邪領域魔法の各処理を行う\r
2711  * @param spell 魔法ID\r
2712  * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_INFO / SPELL_CAST)\r
2713  * @return SPELL_NAME / SPELL_DESC / SPELL_INFO 時には文字列ポインタを返す。SPELL_CAST時はNULL文字列を返す。\r
2714  */\r
2715 static cptr do_crusade_spell(SPELL_IDX spell, BIT_FLAGS mode)\r
2716 {\r
2717         bool name = (mode == SPELL_NAME) ? TRUE : FALSE;\r
2718         bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;\r
2719         bool info = (mode == SPELL_INFO) ? TRUE : FALSE;\r
2720         bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;\r
2721 \r
2722         int dir;\r
2723         int plev = p_ptr->lev;\r
2724 \r
2725         switch (spell)\r
2726         {\r
2727         case 0:\r
2728                 if (name) return _("懲罰", "Punishment");\r
2729                 if (desc) return _("電撃のボルトもしくはビームを放つ。", "Fires a bolt or beam of lightning.");\r
2730     \r
2731                 {\r
2732                         int dice = 3 + (plev - 1) / 5;\r
2733                         int sides = 4;\r
2734 \r
2735                         if (info) return info_damage(dice, sides, 0);\r
2736 \r
2737                         if (cast)\r
2738                         {\r
2739                                 if (!get_aim_dir(&dir)) return NULL;\r
2740 \r
2741                                 fire_bolt_or_beam(beam_chance() - 10, GF_ELEC, dir, damroll(dice, sides));\r
2742                         }\r
2743                 }\r
2744                 break;\r
2745 \r
2746         case 1:\r
2747                 if (name) return _("邪悪存在感知", "Detect Evil");\r
2748                 if (desc) return _("近くの邪悪なモンスターを感知する。", "Detects all evil monsters in your vicinity.");\r
2749     \r
2750                 {\r
2751                         int rad = DETECT_RAD_DEFAULT;\r
2752 \r
2753                         if (info) return info_radius(rad);\r
2754 \r
2755                         if (cast)\r
2756                         {\r
2757                                 detect_monsters_evil(rad);\r
2758                         }\r
2759                 }\r
2760                 break;\r
2761 \r
2762         case 2:\r
2763                 if (name) return _("恐怖除去", "Remove Fear");\r
2764                 if (desc) return _("恐怖を取り除く。", "Removes fear.");\r
2765     \r
2766                 {\r
2767                         if (cast)\r
2768                         {\r
2769                                 set_afraid(0);\r
2770                         }\r
2771                 }\r
2772                 break;\r
2773 \r
2774         case 3:\r
2775                 if (name) return _("威圧", "Scare Monster");\r
2776                 if (desc) return _("モンスター1体を恐怖させる。抵抗されると無効。", "Attempts to scare a monster.");\r
2777     \r
2778                 {\r
2779                         int power = plev;\r
2780 \r
2781                         if (info) return info_power(power);\r
2782 \r
2783                         if (cast)\r
2784                         {\r
2785                                 if (!get_aim_dir(&dir)) return NULL;\r
2786 \r
2787                                 fear_monster(dir, power);\r
2788                         }\r
2789                 }\r
2790                 break;\r
2791 \r
2792         case 4:\r
2793                 if (name) return _("聖域", "Sanctuary");\r
2794                 if (desc) return _("隣接した全てのモンスターを眠らせる。抵抗されると無効。", "Attempts to sleep monsters in the adjacent squares.");\r
2795     \r
2796                 {\r
2797                         int power = plev;\r
2798 \r
2799                         if (info) return info_power(power);\r
2800 \r
2801                         if (cast)\r
2802                         {\r
2803                                 sleep_monsters_touch();\r
2804                         }\r
2805                 }\r
2806                 break;\r
2807 \r
2808         case 5:\r
2809                 if (name) return _("入口", "Portal");\r
2810                 if (desc) return _("中距離のテレポートをする。", "Teleport medium distance.");\r
2811     \r
2812                 {\r
2813                         POSITION range = 25 + plev / 2;\r
2814 \r
2815                         if (info) return info_range(range);\r
2816 \r
2817                         if (cast)\r
2818                         {\r
2819                                 teleport_player(range, 0L);\r
2820                         }\r
2821                 }\r
2822                 break;\r
2823 \r
2824         case 6:\r
2825                 if (name) return _("スターダスト", "Star Dust");\r
2826                 if (desc) return _("ターゲット付近に閃光のボルトを連射する。", "Fires many bolts of light near the target.");\r
2827     \r
2828                 {\r
2829                         int dice = 3 + (plev - 1) / 9;\r
2830                         int sides = 2;\r
2831 \r
2832                         if (info) return info_multi_damage_dice(dice, sides);\r
2833 \r
2834                         if (cast)\r
2835                         {\r
2836                                 if (!get_aim_dir(&dir)) return NULL;\r
2837                                 fire_blast(GF_LITE, dir, dice, sides, 10, 3);\r
2838                         }\r
2839                 }\r
2840                 break;\r
2841 \r
2842         case 7:\r
2843                 if (name) return _("身体浄化", "Purify");\r
2844                 if (desc) return _("傷、毒、朦朧から全快する。", "Heals all cut, stun and poison status.");\r
2845     \r
2846                 {\r
2847                         if (cast)\r
2848                         {\r
2849                                 set_cut(0);\r
2850                                 set_poisoned(0);\r
2851                                 set_stun(0);\r
2852                         }\r
2853                 }\r
2854                 break;\r
2855 \r
2856         case 8:\r
2857                 if (name) return _("邪悪飛ばし", "Scatter Evil");\r
2858                 if (desc) return _("邪悪なモンスター1体をテレポートさせる。抵抗されると無効。", "Attempts to teleport an evil monster away.");\r
2859     \r
2860                 {\r
2861                         int power = MAX_SIGHT * 5;\r
2862 \r
2863                         if (info) return info_power(power);\r
2864 \r
2865                         if (cast)\r
2866                         {\r
2867                                 if (!get_aim_dir(&dir)) return NULL;\r
2868                                 fire_ball(GF_AWAY_EVIL, dir, power, 0);\r
2869                         }\r
2870                 }\r
2871                 break;\r
2872 \r
2873         case 9:\r
2874                 if (name) return _("聖なる光球", "Holy Orb");\r
2875                 if (desc) return _("聖なる力をもつ宝珠を放つ。邪悪なモンスターに対して大きなダメージを与えるが、善良なモンスターには効果がない。", \r
2876                         "Fires a ball with holy power. Hurts evil monsters greatly, but don't effect good monsters.");\r
2877     \r
2878                 {\r
2879                         int dice = 3;\r
2880                         int sides = 6;\r
2881                         int rad = (plev < 30) ? 2 : 3;\r
2882                         int base;\r
2883 \r
2884                         if (p_ptr->pclass == CLASS_PRIEST ||\r
2885                             p_ptr->pclass == CLASS_HIGH_MAGE ||\r
2886                             p_ptr->pclass == CLASS_SORCERER)\r
2887                                 base = plev + plev / 2;\r
2888                         else\r
2889                                 base = plev + plev / 4;\r
2890 \r
2891 \r
2892                         if (info) return info_damage(dice, sides, base);\r
2893 \r
2894                         if (cast)\r
2895                         {\r
2896                                 if (!get_aim_dir(&dir)) return NULL;\r
2897 \r
2898                                 fire_ball(GF_HOLY_FIRE, dir, damroll(dice, sides) + base, rad);\r
2899                         }\r
2900                 }\r
2901                 break;\r
2902 \r
2903         case 10:\r
2904                 if (name) return _("悪魔払い", "Exorcism");\r
2905                 if (desc) return _("視界内の全てのアンデッド及び悪魔にダメージを与え、邪悪なモンスターを恐怖させる。", \r
2906                         "Damages all undead and demons in sight, and scares all evil monsters in sight.");\r
2907     \r
2908                 {\r
2909                         int sides = plev;\r
2910                         int power = plev;\r
2911 \r
2912                         if (info) return info_damage(1, sides, 0);\r
2913 \r
2914                         if (cast)\r
2915                         {\r
2916                                 dispel_undead(randint1(sides));\r
2917                                 dispel_demons(randint1(sides));\r
2918                                 turn_evil(power);\r
2919                         }\r
2920                 }\r
2921                 break;\r
2922 \r
2923         case 11:\r
2924                 if (name) return _("解呪", "Remove Curse");\r
2925                 if (desc) return _("アイテムにかかった弱い呪いを解除する。", "Removes normal curses from equipped items.");\r
2926     \r
2927                 {\r
2928                         if (cast)\r
2929                         {\r
2930                                 if (remove_curse())\r
2931                                 {\r
2932                                         msg_print(_("誰かに見守られているような気がする。", "You feel as if someone is watching over you."));\r
2933                                 }\r
2934                         }\r
2935                 }\r
2936                 break;\r
2937 \r
2938         case 12:\r
2939                 if (name) return _("透明視認", "Sense Unseen");\r
2940                 if (desc) return _("一定時間、透明なものが見えるようになる。", "Gives see invisible for a while.");\r
2941     \r
2942                 {\r
2943                         int base = 24;\r
2944 \r
2945                         if (info) return info_duration(base, base);\r
2946 \r
2947                         if (cast)\r
2948                         {\r
2949                                 set_tim_invis(randint1(base) + base, FALSE);\r
2950                         }\r
2951                 }\r
2952                 break;\r
2953 \r
2954         case 13:\r
2955                 if (name) return _("対邪悪結界", "Protection from Evil");\r
2956                 if (desc) return _("邪悪なモンスターの攻撃を防ぐバリアを張る。", "Gives aura which protect you from evil monster's physical attack.");\r
2957     \r
2958                 {\r
2959                         int base = 25;\r
2960                         int sides = 3 * plev;\r
2961 \r
2962                         if (info) return info_duration(base, sides);\r
2963 \r
2964                         if (cast)\r
2965                         {\r
2966                                 set_protevil(randint1(sides) + base, FALSE);\r
2967                         }\r
2968                 }\r
2969                 break;\r
2970 \r
2971         case 14:\r
2972                 if (name) return _("裁きの雷", "Judgment Thunder");\r
2973                 if (desc) return _("強力な電撃のボルトを放つ。", "Fires a powerful bolt of lightning.");\r
2974     \r
2975                 {\r
2976                         HIT_POINT dam = plev * 5;\r
2977 \r
2978                         if (info) return info_damage(0, 0, dam);\r
2979 \r
2980                         if (cast)\r
2981                         {\r
2982                                 if (!get_aim_dir(&dir)) return NULL;\r
2983                                 fire_bolt(GF_ELEC, dir, dam);\r
2984                         }\r
2985                 }\r
2986                 break;\r
2987 \r
2988         case 15:\r
2989                 if (name) return _("聖なる御言葉", "Holy Word");\r
2990                 if (desc) return _("視界内の邪悪な存在に大きなダメージを与え、体力を回復し、毒、恐怖、朦朧状態、負傷から全快する。",\r
2991                         "Damages all evil monsters in sight, heals HP somewhat, and completely heals poison, fear, stun and cut status.");\r
2992     \r
2993                 {\r
2994                         int dam_sides = plev * 6;\r
2995                         int heal = 100;\r
2996 \r
2997                         if (info) return format(_("損:1d%d/回%d", "dam:d%d/h%d"), dam_sides, heal);\r
2998                         if (cast)\r
2999                         {\r
3000                                 dispel_evil(randint1(dam_sides));\r
3001                                 hp_player(heal);\r
3002                                 set_afraid(0);\r
3003                                 set_poisoned(0);\r
3004                                 set_stun(0);\r
3005                                 set_cut(0);\r
3006                         }\r
3007                 }\r
3008                 break;\r
3009 \r
3010         case 16:\r
3011                 if (name) return _("開かれた道", "Unbarring Ways");\r
3012                 if (desc) return _("一直線上の全ての罠と扉を破壊する。", "Fires a beam which destroy traps and doors.");\r
3013     \r
3014                 {\r
3015                         if (cast)\r
3016                         {\r
3017                                 if (!get_aim_dir(&dir)) return NULL;\r
3018 \r
3019                                 destroy_door(dir);\r
3020                         }\r
3021                 }\r
3022                 break;\r
3023 \r
3024         case 17:\r
3025                 if (name) return _("封魔", "Arrest");\r
3026                 if (desc) return _("邪悪なモンスターの動きを止める。", "Attempts to paralyze an evil monster.");\r
3027     \r
3028                 {\r
3029                         int power = plev * 2;\r
3030 \r
3031                         if (info) return info_power(power);\r
3032 \r
3033                         if (cast)\r
3034                         {\r
3035                                 if (!get_aim_dir(&dir)) return NULL;\r
3036                                 stasis_evil(dir);\r
3037                         }\r
3038                 }\r
3039                 break;\r
3040 \r
3041         case 18:\r
3042                 if (name) return _("聖なるオーラ", "Holy Aura");\r
3043                 if (desc) return _("一定時間、邪悪なモンスターを傷つける聖なるオーラを得る。",\r
3044                         "Gives aura of holy power which injures evil monsters which attacked you for a while.");\r
3045     \r
3046                 {\r
3047                         int base = 20;\r
3048 \r
3049                         if (info) return info_duration(base, base);\r
3050 \r
3051                         if (cast)\r
3052                         {\r
3053                                 set_tim_sh_holy(randint1(base) + base, FALSE);\r
3054                         }\r
3055                 }\r
3056                 break;\r
3057 \r
3058         case 19:\r
3059                 if (name) return _("アンデッド&悪魔退散", "Dispel Undead & Demons");\r
3060                 if (desc) return _("視界内の全てのアンデッド及び悪魔にダメージを与える。", "Damages all undead and demons in sight.");\r
3061     \r
3062                 {\r
3063                         int sides = plev * 4;\r
3064 \r
3065                         if (info) return info_damage(1, sides, 0);\r
3066 \r
3067                         if (cast)\r
3068                         {\r
3069                                 dispel_undead(randint1(sides));\r
3070                                 dispel_demons(randint1(sides));\r
3071                         }\r
3072                 }\r
3073                 break;\r
3074 \r
3075         case 20:\r
3076                 if (name) return _("邪悪退散", "Dispel Evil");\r
3077                 if (desc) return _("視界内の全ての邪悪なモンスターにダメージを与える。", "Damages all evil monsters in sight.");\r
3078     \r
3079                 {\r
3080                         int sides = plev * 4;\r
3081 \r
3082                         if (info) return info_damage(1, sides, 0);\r
3083 \r
3084                         if (cast)\r
3085                         {\r
3086                                 dispel_evil(randint1(sides));\r
3087                         }\r
3088                 }\r
3089                 break;\r
3090 \r
3091         case 21:\r
3092                 if (name) return _("聖なる刃", "Holy Blade");\r
3093                 if (desc) return _("通常の武器に滅邪の属性をつける。", "Makes current weapon especially deadly against evil monsters.");\r
3094     \r
3095                 {\r
3096                         if (cast)\r
3097                         {\r
3098                                 brand_weapon(13);\r
3099                         }\r
3100                 }\r
3101                 break;\r
3102 \r
3103         case 22:\r
3104                 if (name) return _("スターバースト", "Star Burst");\r
3105                 if (desc) return _("巨大な閃光の球を放つ。", "Fires a huge ball of powerful light.");\r
3106     \r
3107                 {\r
3108                         HIT_POINT dam = 100 + plev * 2;\r
3109                         int rad = 4;\r
3110 \r
3111                         if (info) return info_damage(0, 0, dam);\r
3112 \r
3113                         if (cast)\r
3114                         {\r
3115                                 if (!get_aim_dir(&dir)) return NULL;\r
3116 \r
3117                                 fire_ball(GF_LITE, dir, dam, rad);\r
3118                         }\r
3119                 }\r
3120                 break;\r
3121 \r
3122         case 23:\r
3123                 if (name) return _("天使召喚", "Summon Angel");\r
3124                 if (desc) return _("天使を1体召喚する。", "Summons an angel.");\r
3125     \r
3126                 {\r
3127                         if (cast)\r
3128                         {\r
3129                                 bool pet = !one_in_(3);\r
3130                                 u32b flg = 0L;\r
3131 \r
3132                                 if (pet) flg |= PM_FORCE_PET;\r
3133                                 else flg |= PM_NO_PET;\r
3134                                 if (!(pet && (plev < 50))) flg |= PM_ALLOW_GROUP;\r
3135 \r
3136                                 if (summon_specific((pet ? -1 : 0), p_ptr->y, p_ptr->x, (plev * 3) / 2, SUMMON_ANGEL, flg))\r
3137                                 {\r
3138                                         if (pet)\r
3139                                         {\r
3140                                                 msg_print(_("「ご用でございますか、ご主人様」", "'What is thy bidding... Master?'"));\r
3141                                         }\r
3142                                         else\r
3143                                         {\r
3144                                                 msg_print(_("「我は汝の下僕にあらず! 悪行者よ、悔い改めよ!」", "Mortal! Repent of thy impiousness."));\r
3145                                         }\r
3146                                 }\r
3147                         }\r
3148                 }\r
3149                 break;\r
3150 \r
3151         case 24:\r
3152                 if (name) return _("士気高揚", "Heroism");\r
3153                 if (desc) return _("一定時間、ヒーロー気分になる。", "Removes fear, and gives bonus to hit and 10 more HP for a while.");\r
3154     \r
3155                 {\r
3156                         int base = 25;\r
3157 \r
3158                         if (info) return info_duration(base, base);\r
3159 \r
3160                         if (cast)\r
3161                         {\r
3162                                 set_hero(randint1(base) + base, FALSE);\r
3163                                 hp_player(10);\r
3164                                 set_afraid(0);\r
3165                         }\r
3166                 }\r
3167                 break;\r
3168 \r
3169         case 25:\r
3170                 if (name) return _("呪い退散", "Dispel Curse");\r
3171                 if (desc) return _("アイテムにかかった強力な呪いを解除する。", "Removes normal and heavy curse from equipped items.");\r
3172     \r
3173                 {\r
3174                         if (cast)\r
3175                         {\r
3176                                 if (remove_all_curse())\r
3177                                 {\r
3178                                         msg_print(_("誰かに見守られているような気がする。", "You feel as if someone is watching over you."));\r
3179                                 }\r
3180                         }\r
3181                 }\r
3182                 break;\r
3183 \r
3184         case 26:\r
3185                 if (name) return _("邪悪追放", "Banish Evil");\r
3186                 if (desc) return _("視界内の全ての邪悪なモンスターをテレポートさせる。抵抗されると無効。", \r
3187                         "Teleports all evil monsters in sight away unless resisted.");\r
3188     \r
3189                 {\r
3190                         int power = 100;\r
3191 \r
3192                         if (info) return info_power(power);\r
3193 \r
3194                         if (cast)\r
3195                         {\r
3196                                 if (banish_evil(power))\r
3197                                 {\r
3198                                         msg_print(_("神聖な力が邪悪を打ち払った!", "The holy power banishes evil!"));\r
3199                                 }\r
3200                         }\r
3201                 }\r
3202                 break;\r
3203 \r
3204         case 27:\r
3205                 if (name) return _("ハルマゲドン", "Armageddon");\r
3206                 if (desc) return _("周辺のアイテム、モンスター、地形を破壊する。", "Destroy everything in nearby area.");\r
3207     \r
3208                 {\r
3209                         int base = 12;\r
3210                         int sides = 4;\r
3211 \r
3212                         if (cast)\r
3213                         {\r
3214                                 destroy_area(p_ptr->y, p_ptr->x, base + randint1(sides), FALSE);\r
3215                         }\r
3216                 }\r
3217                 break;\r
3218 \r
3219         case 28:\r
3220                 if (name) return _("目には目を", "An Eye for an Eye");\r
3221                 if (desc) return _("一定時間、自分がダメージを受けたときに攻撃を行ったモンスターに対して同等のダメージを与える。", \r
3222                         "Gives special aura for a while. When you are attacked by a monster, the monster are injured with same amount of damage as you take.");\r
3223     \r
3224                 {\r
3225                         int base = 10;\r
3226 \r
3227                         if (info) return info_duration(base, base);\r
3228 \r
3229                         if (cast)\r
3230                         {\r
3231                                 set_tim_eyeeye(randint1(base) + base, FALSE);\r
3232                         }\r
3233                 }\r
3234                 break;\r
3235 \r
3236         case 29:\r
3237                 if (name) return _("神の怒り", "Wrath of the God");\r
3238                 if (desc) return _("ターゲットの周囲に分解の球を多数落とす。", "Drops many balls of disintegration near the target.");\r
3239     \r
3240                 {\r
3241                         HIT_POINT dam = plev * 3 + 25;\r
3242                         int rad = 2;\r
3243 \r
3244                         if (info) return info_multi_damage(dam);\r
3245 \r
3246                         if (cast)\r
3247                         {\r
3248                                 if (!cast_wrath_of_the_god(dam, rad)) return NULL;\r
3249                         }\r
3250                 }\r
3251                 break;\r
3252 \r
3253         case 30:\r
3254                 if (name) return _("神威", "Divine Intervention");\r
3255                 if (desc) return _("隣接するモンスターに聖なるダメージを与え、視界内のモンスターにダメージ、減速、朦朧、混乱、恐怖、眠りを与える。さらに体力を回復する。", \r
3256                         "Damages all adjacent monsters with holy power. Damages and attempt to slow, stun, confuse, scare and freeze all monsters in sight. And heals HP.");\r
3257     \r
3258                 {\r
3259                         int b_dam = plev * 11;\r
3260                         int d_dam = plev * 4;\r
3261                         int heal = 100;\r
3262                         int power = plev * 4;\r
3263 \r
3264                         if (info) return format(_("回%d/損%d+%d", "h%d/dm%d+%d"), heal, d_dam, b_dam/2);\r
3265                         if (cast)\r
3266                         {\r
3267                                 project(0, 1, p_ptr->y, p_ptr->x, b_dam, GF_HOLY_FIRE, PROJECT_KILL, -1);\r
3268                                 dispel_monsters(d_dam);\r
3269                                 slow_monsters(plev);\r
3270                                 stun_monsters(power);\r
3271                                 confuse_monsters(power);\r
3272                                 turn_monsters(power);\r
3273                                 stasis_monsters(power);\r
3274                                 hp_player(heal);\r
3275                         }\r
3276                 }\r
3277                 break;\r
3278 \r
3279         case 31:\r
3280                 if (name) return _("聖戦", "Crusade");\r
3281                 if (desc) return _("視界内の善良なモンスターをペットにしようとし、ならなかった場合及び善良でないモンスターを恐怖させる。さらに多数の加速された騎士を召喚し、ヒーロー、祝福、加速、対邪悪結界を得る。", \r
3282                         "Attempts to charm all good monsters in sight, and scare all non-charmed monsters, and summons great number of knights, and gives heroism, bless, speed and protection from evil.");\r
3283     \r
3284                 {\r
3285                         if (cast)\r
3286                         {\r
3287                                 int base = 25;\r
3288                                 int sp_sides = 20 + plev;\r
3289                                 int sp_base = plev;\r
3290 \r
3291                                 int i;\r
3292                                 crusade();\r
3293                                 for (i = 0; i < 12; i++)\r
3294                                 {\r
3295                                         int attempt = 10;\r
3296                                         POSITION my = 0, mx = 0;\r
3297 \r
3298                                         while (attempt--)\r
3299                                         {\r
3300                                                 scatter(&my, &mx, p_ptr->y, p_ptr->x, 4, 0);\r
3301 \r
3302                                                 /* Require empty grids */\r
3303                                                 if (cave_empty_bold2(my, mx)) break;\r
3304                                         }\r
3305                                         if (attempt < 0) continue;\r
3306                                         summon_specific(-1, my, mx, plev, SUMMON_KNIGHTS, (PM_ALLOW_GROUP | PM_FORCE_PET | PM_HASTE));\r
3307                                 }\r
3308                                 set_hero(randint1(base) + base, FALSE);\r
3309                                 set_blessed(randint1(base) + base, FALSE);\r
3310                                 set_fast(randint1(sp_sides) + sp_base, FALSE);\r
3311                                 set_protevil(randint1(base) + base, FALSE);\r
3312                                 set_afraid(0);\r
3313                         }\r
3314                 }\r
3315                 break;\r
3316         }\r
3317 \r
3318         return "";\r
3319 }\r
3320 \r
3321 \r
3322 /*!\r
3323  * @brief 歌の各処理を行う\r
3324  * @param spell 歌ID\r
3325  * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_INFO / SPELL_CAST / SPELL_FAIL / SPELL_CONT / SPELL_STOP)\r
3326  * @return SPELL_NAME / SPELL_DESC / SPELL_INFO 時には文字列ポインタを返す。SPELL_CAST / SPELL_FAIL / SPELL_CONT / SPELL_STOP 時はNULL文字列を返す。\r
3327  */\r
3328 static cptr do_music_spell(SPELL_IDX spell, BIT_FLAGS mode)\r
3329 {\r
3330         bool name = (mode == SPELL_NAME) ? TRUE : FALSE;\r
3331         bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;\r
3332         bool info = (mode == SPELL_INFO) ? TRUE : FALSE;\r
3333         bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;\r
3334         bool fail = (mode == SPELL_FAIL) ? TRUE : FALSE;\r
3335         bool cont = (mode == SPELL_CONT) ? TRUE : FALSE;\r
3336         bool stop = (mode == SPELL_STOP) ? TRUE : FALSE;\r
3337         static const char s_dam[] = _("損傷:", "dam ");\r
3338 \r
3339         int dir;\r
3340         int plev = p_ptr->lev;\r
3341 \r
3342         switch (spell)\r
3343         {\r
3344         case 0:\r
3345                 if (name) return _("遅鈍の歌", "Song of Holding");\r
3346                 if (desc) return _("視界内の全てのモンスターを減速させる。抵抗されると無効。", "Attempts to slow all monsters in sight.");\r
3347     \r
3348                 /* Stop singing before start another */\r
3349                 if (cast || fail) stop_singing();\r
3350 \r
3351                 if (cast)\r
3352                 {\r
3353                         msg_print(_("ゆっくりとしたメロディを口ずさみ始めた...", "You start humming a slow, steady melody..."));\r
3354                         start_singing(spell, MUSIC_SLOW);\r
3355                 }\r
3356 \r
3357                 {\r
3358                         int power = plev;\r
3359 \r
3360                         if (info) return info_power(power);\r
3361 \r
3362                         if (cont)\r
3363                         {\r
3364                                 slow_monsters(plev);\r
3365                         }\r
3366                 }\r
3367                 break;\r
3368 \r
3369         case 1:\r
3370                 if (name) return _("祝福の歌", "Song of Blessing");\r
3371                 if (desc) return _("命中率とACのボーナスを得る。", "Gives bonus to hit and AC for a few turns.");\r
3372     \r
3373                 /* Stop singing before start another */\r
3374                 if (cast || fail) stop_singing();\r
3375 \r
3376                 if (cast)\r
3377                 {\r
3378                         msg_print(_("厳かなメロディを奏で始めた...", "The holy power of the Music of the Ainur enters you..."));\r
3379                         start_singing(spell, MUSIC_BLESS);\r
3380                 }\r
3381 \r
3382                 if (stop)\r
3383                 {\r
3384                         if (!p_ptr->blessed)\r
3385                         {\r
3386                                 msg_print(_("高潔な気分が消え失せた。", "The prayer has expired."));\r
3387                         }\r
3388                 }\r
3389 \r
3390                 break;\r
3391 \r
3392         case 2:\r
3393                 if (name) return _("崩壊の音色", "Wrecking Note");\r
3394                 if (desc) return _("轟音のボルトを放つ。", "Fires a bolt of sound.");\r
3395     \r
3396                 /* Stop singing before start another */\r
3397                 if (cast || fail) stop_singing();\r
3398 \r
3399                 {\r
3400                         int dice = 4 + (plev - 1) / 5;\r
3401                         int sides = 4;\r
3402 \r
3403                         if (info) return info_damage(dice, sides, 0);\r
3404 \r
3405                         if (cast)\r
3406                         {\r
3407                                 if (!get_aim_dir(&dir)) return NULL;\r
3408 \r
3409                                 fire_bolt(GF_SOUND, dir, damroll(dice, sides));\r
3410                         }\r
3411                 }\r
3412                 break;\r
3413 \r
3414         case 3:\r
3415                 if (name) return _("朦朧の旋律", "Stun Pattern");\r
3416                 if (desc) return _("視界内の全てのモンスターを朦朧させる。抵抗されると無効。", "Attempts to stun all monsters in sight.");\r
3417     \r
3418                 /* Stop singing before start another */\r
3419                 if (cast || fail) stop_singing();\r
3420 \r
3421                 if (cast)\r
3422                 {\r
3423                         msg_print(_("眩惑させるメロディを奏で始めた...", "You weave a pattern of sounds to bewilder and daze..."));\r
3424                         start_singing(spell, MUSIC_STUN);\r
3425                 }\r
3426 \r
3427                 {\r
3428                         int dice = plev / 10;\r
3429                         int sides = 2;\r
3430 \r
3431                         if (info) return info_power_dice(dice, sides);\r
3432 \r
3433                         if (cont)\r
3434                         {\r
3435                                 stun_monsters(damroll(dice, sides));\r
3436                         }\r
3437                 }\r
3438 \r
3439                 break;\r
3440 \r
3441         case 4:\r
3442                 if (name) return _("生命の流れ", "Flow of Life");\r
3443                 if (desc) return _("体力を少し回復させる。", "Heals HP a little.");\r
3444     \r
3445                 /* Stop singing before start another */\r
3446                 if (cast || fail) stop_singing();\r
3447 \r
3448                 if (cast)\r
3449                 {\r
3450                         msg_print(_("歌を通して体に活気が戻ってきた...", "Life flows through you as you sing a song of healing..."));\r
3451                         start_singing(spell, MUSIC_L_LIFE);\r
3452                 }\r
3453 \r
3454                 {\r
3455                         int dice = 2;\r
3456                         int sides = 6;\r
3457 \r
3458                         if (info) return info_heal(dice, sides, 0);\r
3459 \r
3460                         if (cont)\r
3461                         {\r
3462                                 hp_player(damroll(dice, sides));\r
3463                         }\r
3464                 }\r
3465 \r
3466                 break;\r
3467 \r
3468         case 5:\r
3469                 if (name) return _("太陽の歌", "Song of the Sun");\r
3470                 if (desc) return _("光源が照らしている範囲か部屋全体を永久に明るくする。", "Lights up nearby area and the inside of a room permanently.");\r
3471     \r
3472                 /* Stop singing before start another */\r
3473                 if (cast || fail) stop_singing();\r
3474 \r
3475                 {\r
3476                         int dice = 2;\r
3477                         int sides = plev / 2;\r
3478                         int rad = plev / 10 + 1;\r
3479 \r
3480                         if (info) return info_damage(dice, sides, 0);\r
3481 \r
3482                         if (cast)\r
3483                         {\r
3484                                 msg_print(_("光り輝く歌が辺りを照らした。", "Your uplifting song brings brightness to dark places..."));\r
3485                                 lite_area(damroll(dice, sides), rad);\r
3486                         }\r
3487                 }\r
3488                 break;\r
3489 \r
3490         case 6:\r
3491                 if (name) return _("恐怖の歌", "Song of Fear");\r
3492                 if (desc) return _("視界内の全てのモンスターを恐怖させる。抵抗されると無効。", "Attempts to scare all monsters in sight.");\r
3493     \r
3494                 /* Stop singing before start another */\r
3495                 if (cast || fail) stop_singing();\r
3496 \r
3497                 if (cast)\r
3498                 {\r
3499                         msg_print(_("おどろおどろしいメロディを奏で始めた...", "You start weaving a fearful pattern..."));\r
3500                         start_singing(spell, MUSIC_FEAR);                       \r
3501                 }\r
3502 \r
3503                 {\r
3504                         int power = plev;\r
3505 \r
3506                         if (info) return info_power(power);\r
3507 \r
3508                         if (cont)\r
3509                         {\r
3510                                 project_hack(GF_TURN_ALL, power);\r
3511                         }\r
3512                 }\r
3513 \r
3514                 break;\r
3515 \r
3516         case 7:\r
3517                 if (name) return _("戦いの歌", "Heroic Ballad");\r
3518                 if (desc) return _("ヒーロー気分になる。", "Removes fear, and gives bonus to hit and 10 more HP for a while.");\r
3519 \r
3520                 /* Stop singing before start another */\r
3521                 if (cast || fail) stop_singing();\r
3522 \r
3523                 if (cast)\r
3524                 {\r
3525                         msg_print(_("激しい戦いの歌を歌った...", "You start singing a song of intense fighting..."));\r
3526 \r
3527                         (void)hp_player(10);\r
3528                         (void)set_afraid(0);\r
3529 \r
3530                         /* Recalculate hitpoints */\r
3531                         p_ptr->update |= (PU_HP);\r
3532 \r
3533                         start_singing(spell, MUSIC_HERO);\r
3534                 }\r
3535 \r
3536                 if (stop)\r
3537                 {\r
3538                         if (!p_ptr->hero)\r
3539                         {\r
3540                                 msg_print(_("ヒーローの気分が消え失せた。", "The heroism wears off."));\r
3541                                 /* Recalculate hitpoints */\r
3542                                 p_ptr->update |= (PU_HP);\r
3543                         }\r
3544                 }\r
3545 \r
3546                 break;\r
3547 \r
3548         case 8:\r
3549                 if (name) return _("霊的知覚", "Clairaudience");\r
3550                 if (desc) return _("近くの罠/扉/階段を感知する。レベル15で全てのモンスター、20で財宝とアイテムを感知できるようになる。レベル25で周辺の地形を感知し、40でその階全体を永久に照らし、ダンジョン内のすべてのアイテムを感知する。この効果は歌い続けることで順に起こる。", \r
3551                         "Detects traps, doors and stairs in your vicinity. And detects all monsters at level 15, treasures and items at level 20. Maps nearby area at level 25. Lights and know the whole level at level 40. These effects occurs by turns while this song continues.");\r
3552     \r
3553                 /* Stop singing before start another */\r
3554                 if (cast || fail) stop_singing();\r
3555 \r
3556                 if (cast)\r
3557                 {\r
3558                         msg_print(_("静かな音楽が感覚を研ぎ澄まさせた...", "Your quiet music sharpens your sense of hearing..."));\r
3559                         /* Hack -- Initialize the turn count */\r
3560                         SINGING_COUNT(p_ptr) = 0;\r
3561                         start_singing(spell, MUSIC_DETECT);\r
3562                 }\r
3563 \r
3564                 {\r
3565                         int rad = DETECT_RAD_DEFAULT;\r
3566 \r
3567                         if (info) return info_radius(rad);\r
3568 \r
3569                         if (cont)\r
3570                         {\r
3571                                 int count = SINGING_COUNT(p_ptr);\r
3572 \r
3573                                 if (count >= 19) wiz_lite(FALSE);\r
3574                                 if (count >= 11)\r
3575                                 {\r
3576                                         map_area(rad);\r
3577                                         if (plev > 39 && count < 19)\r
3578                                                 SINGING_COUNT(p_ptr) = count + 1;\r
3579                                 }\r
3580                                 if (count >= 6)\r
3581                                 {\r
3582                                         /* There are too many hidden treasure.  So... */\r
3583                                         /* detect_treasure(rad); */\r
3584                                         detect_objects_gold(rad);\r
3585                                         detect_objects_normal(rad);\r
3586 \r
3587                                         if (plev > 24 && count < 11)\r
3588                                                 SINGING_COUNT(p_ptr) = count + 1;\r
3589                                 }\r
3590                                 if (count >= 3)\r
3591                                 {\r
3592                                         detect_monsters_invis(rad);\r
3593                                         detect_monsters_normal(rad);\r
3594 \r
3595                                         if (plev > 19 && count < 6)\r
3596                                                 SINGING_COUNT(p_ptr) = count + 1;\r
3597                                 }\r
3598                                 detect_traps(rad, TRUE);\r
3599                                 detect_doors(rad);\r
3600                                 detect_stairs(rad);\r
3601 \r
3602                                 if (plev > 14 && count < 3)\r
3603                                         SINGING_COUNT(p_ptr) = count + 1;\r
3604                         }\r
3605                 }\r
3606 \r
3607                 break;\r
3608 \r
3609         case 9:\r
3610                 if (name) return _("魂の歌", "Soul Shriek");\r
3611                 if (desc) return _("視界内の全てのモンスターに対して精神攻撃を行う。", "Damages all monsters in sight with PSI damages.");\r
3612 \r
3613                 /* Stop singing before start another */\r
3614                 if (cast || fail) stop_singing();\r
3615 \r
3616                 if (cast)\r
3617                 {\r
3618                         msg_print(_("精神を捻じ曲げる歌を歌った...", "You start singing a song of soul in pain..."));\r
3619                         start_singing(spell, MUSIC_PSI);\r
3620                 }\r
3621 \r
3622                 {\r
3623                         int dice = 1;\r
3624                         int sides = plev * 3 / 2;\r
3625 \r
3626                         if (info) return info_damage(dice, sides, 0);\r
3627 \r
3628                         if (cont)\r
3629                         {\r
3630                                 project_hack(GF_PSI, damroll(dice, sides));\r
3631                         }\r
3632                 }\r
3633 \r
3634                 break;\r
3635 \r
3636         case 10:\r
3637                 if (name) return _("知識の歌", "Song of Lore");\r
3638                 if (desc) return _("自分のいるマスと隣りのマスに落ちているアイテムを鑑定する。", "Identifies all items which are in the adjacent squares.");\r
3639     \r
3640                 /* Stop singing before start another */\r
3641                 if (cast || fail) stop_singing();\r
3642 \r
3643                 if (cast)\r
3644                 {\r
3645                         msg_print(_("この世界の知識が流れ込んできた...", "You recall the rich lore of the world..."));\r
3646                         start_singing(spell, MUSIC_ID);\r
3647                 }\r
3648 \r
3649                 {\r
3650                         int rad = 1;\r
3651 \r
3652                         if (info) return info_radius(rad);\r
3653 \r
3654                         /*\r
3655                          * 歌の開始時にも効果発動:\r
3656                          * MP不足で鑑定が発動される前に歌が中断してしまうのを防止。\r
3657                          */\r
3658                         if (cont || cast)\r
3659                         {\r
3660                                 project(0, rad, p_ptr->y, p_ptr->x, 0, GF_IDENTIFY, PROJECT_ITEM, -1);\r
3661                         }\r
3662                 }\r
3663 \r
3664                 break;\r
3665 \r
3666         case 11:\r
3667                 if (name) return _("隠遁の歌", "Hiding Tune");\r
3668                 if (desc) return _("隠密行動能力を上昇させる。", "Gives improved stealth.");\r
3669 \r
3670                 /* Stop singing before start another */\r
3671                 if (cast || fail) stop_singing();\r
3672 \r
3673                 if (cast)\r
3674                 {\r
3675                         msg_print(_("あなたの姿が景色にとけこんでいった...", "Your song carries you beyond the sight of mortal eyes..."));\r
3676                         start_singing(spell, MUSIC_STEALTH);\r
3677                 }\r
3678 \r
3679                 if (stop)\r
3680                 {\r
3681                         if (!p_ptr->tim_stealth)\r
3682                         {\r
3683                                 msg_print(_("姿がはっきりと見えるようになった。", "You are no longer hided."));\r
3684                         }\r
3685                 }\r
3686 \r
3687                 break;\r
3688 \r
3689         case 12:\r
3690                 if (name) return _("幻影の旋律", "Illusion Pattern");\r
3691                 if (desc) return _("視界内の全てのモンスターを混乱させる。抵抗されると無効。", "Attempts to confuse all monsters in sight.");\r
3692     \r
3693                 /* Stop singing before start another */\r
3694                 if (cast || fail) stop_singing();\r
3695 \r
3696                 if (cast)\r
3697                 {\r
3698                         msg_print(_("辺り一面に幻影が現れた...", "You weave a pattern of sounds to beguile and confuse..."));\r
3699                         start_singing(spell, MUSIC_CONF);\r
3700                 }\r
3701 \r
3702                 {\r
3703                         int power = plev * 2;\r
3704 \r
3705                         if (info) return info_power(power);\r
3706 \r
3707                         if (cont)\r
3708                         {\r
3709                                 confuse_monsters(power);\r
3710                         }\r
3711                 }\r
3712 \r
3713                 break;\r
3714 \r
3715         case 13:\r
3716                 if (name) return _("破滅の叫び", "Doomcall");\r
3717                 if (desc) return _("視界内の全てのモンスターに対して轟音攻撃を行う。", "Damages all monsters in sight with booming sound.");\r
3718     \r
3719                 /* Stop singing before start another */\r
3720                 if (cast || fail) stop_singing();\r
3721 \r
3722                 if (cast)\r
3723                 {\r
3724                         msg_print(_("轟音が響いた...", "The fury of the Downfall of Numenor lashes out..."));\r
3725                         start_singing(spell, MUSIC_SOUND);\r
3726                 }\r
3727 \r
3728                 {\r
3729                         int dice = 10 + plev / 5;\r
3730                         int sides = 7;\r
3731 \r
3732                         if (info) return info_damage(dice, sides, 0);\r
3733 \r
3734                         if (cont)\r
3735                         {\r
3736                                 project_hack(GF_SOUND, damroll(dice, sides));\r
3737                         }\r
3738                 }\r
3739 \r
3740                 break;\r
3741 \r
3742         case 14:\r
3743                 if (name) return _("フィリエルの歌", "Firiel's Song");\r
3744                 if (desc) return _("周囲の死体や骨を生き返す。", "Resurrects nearby corpse and skeletons. And makes these your pets.");\r
3745     \r
3746                 {\r
3747                         /* Stop singing before start another */\r
3748                         if (cast || fail) stop_singing();\r
3749 \r
3750                         if (cast)\r
3751                         {\r
3752                                 msg_print(_("生命と復活のテーマを奏で始めた...", "The themes of life and revival are woven into your song..."));\r
3753                                 animate_dead(0, p_ptr->y, p_ptr->x);\r
3754                         }\r
3755                 }\r
3756                 break;\r
3757 \r
3758         case 15:\r
3759                 if (name) return _("旅の仲間", "Fellowship Chant");\r
3760                 if (desc) return _("視界内の全てのモンスターを魅了する。抵抗されると無効。", "Attempts to charm all monsters in sight.");\r
3761 \r
3762                 /* Stop singing before start another */\r
3763                 if (cast || fail) stop_singing();\r
3764 \r
3765                 if (cast)\r
3766                 {\r
3767                         msg_print(_("安らかなメロディを奏で始めた...", "You weave a slow, soothing melody of imploration..."));\r
3768                         start_singing(spell, MUSIC_CHARM);\r
3769                 }\r
3770 \r
3771                 {\r
3772                         int dice = 10 + plev / 15;\r
3773                         int sides = 6;\r
3774 \r
3775                         if (info) return info_power_dice(dice, sides);\r
3776 \r
3777                         if (cont)\r
3778                         {\r
3779                                 charm_monsters(damroll(dice, sides));\r
3780                         }\r
3781                 }\r
3782 \r
3783                 break;\r
3784 \r
3785         case 16:\r
3786                 if (name) return _("分解音波", "Sound of disintegration");\r
3787                 if (desc) return _("壁を掘り進む。自分の足元のアイテムは蒸発する。", "Makes you be able to burrow into walls. Objects under your feet evaporate.");\r
3788 \r
3789                 /* Stop singing before start another */\r
3790                 if (cast || fail) stop_singing();\r
3791 \r
3792                 if (cast)\r
3793                 {\r
3794                         msg_print(_("粉砕するメロディを奏で始めた...", "You weave a violent pattern of sounds to break wall."));\r
3795                         start_singing(spell, MUSIC_WALL);\r
3796                 }\r
3797 \r
3798                 {\r
3799                         /*\r
3800                          * 歌の開始時にも効果発動:\r
3801                          * MP不足で効果が発動される前に歌が中断してしまうのを防止。\r
3802                          */\r
3803                         if (cont || cast)\r
3804                         {\r
3805                                 project(0, 0, p_ptr->y, p_ptr->x,\r
3806                                         0, GF_DISINTEGRATE, PROJECT_KILL | PROJECT_ITEM | PROJECT_HIDE, -1);\r
3807                         }\r
3808                 }\r
3809                 break;\r
3810 \r
3811         case 17:\r
3812                 if (name) return _("元素耐性", "Finrod's Resistance");\r
3813                 if (desc) return _("酸、電撃、炎、冷気、毒に対する耐性を得る。装備による耐性に累積する。", \r
3814                         "Gives resistance to fire, cold, electricity, acid and poison. These resistances can be added to which from equipment for more powerful resistances.");\r
3815     \r
3816                 /* Stop singing before start another */\r
3817                 if (cast || fail) stop_singing();\r
3818 \r
3819                 if (cast)\r
3820                 {\r
3821                         msg_print(_("元素の力に対する忍耐の歌を歌った。", "You sing a song of perseverance against powers..."));\r
3822                         start_singing(spell, MUSIC_RESIST);\r
3823                 }\r
3824 \r
3825                 if (stop)\r
3826                 {\r
3827                         if (!p_ptr->oppose_acid)\r
3828                         {\r
3829                                 msg_print(_("酸への耐性が薄れた気がする。", "You feel less resistant to acid."));\r
3830                         }\r
3831 \r
3832                         if (!p_ptr->oppose_elec)\r
3833                         {\r
3834                                 msg_print(_("電撃への耐性が薄れた気がする。", "You feel less resistant to elec."));\r
3835                         }\r
3836 \r
3837                         if (!p_ptr->oppose_fire)\r
3838                         {\r
3839                                 msg_print(_("火への耐性が薄れた気がする。", "You feel less resistant to fire."));\r
3840                         }\r
3841 \r
3842                         if (!p_ptr->oppose_cold)\r
3843                         {\r
3844                                 msg_print(_("冷気への耐性が薄れた気がする。", "You feel less resistant to cold."));\r
3845                         }\r
3846 \r
3847                         if (!p_ptr->oppose_pois)\r
3848                         {\r
3849                                 msg_print(_("毒への耐性が薄れた気がする。", "You feel less resistant to pois."));\r
3850                         }\r
3851                 }\r
3852 \r
3853                 break;\r
3854 \r
3855         case 18:\r
3856                 if (name) return _("ホビットのメロディ", "Hobbit Melodies");\r
3857                 if (desc) return _("加速する。", "Hastes you.");\r
3858 \r
3859                 /* Stop singing before start another */\r
3860                 if (cast || fail) stop_singing();\r
3861 \r
3862                 if (cast)\r
3863                 {\r
3864                         msg_print(_("軽快な歌を口ずさみ始めた...", "You start singing joyful pop song..."));\r
3865                         start_singing(spell, MUSIC_SPEED);\r
3866                 }\r
3867 \r
3868                 if (stop)\r
3869                 {\r
3870                         if (!p_ptr->fast)\r
3871                         {\r
3872                                 msg_print(_("動きの素早さがなくなったようだ。", "You feel yourself slow down."));\r
3873                         }\r
3874                 }\r
3875 \r
3876                 break;\r
3877 \r
3878         case 19:\r
3879                 if (name) return _("歪んだ世界", "World Contortion");\r
3880                 if (desc) return _("近くのモンスターをテレポートさせる。抵抗されると無効。", "Teleports all nearby monsters away unless resisted.");\r
3881     \r
3882                 {\r
3883                         int rad = plev / 15 + 1;\r
3884                         int power = plev * 3 + 1;\r
3885 \r
3886                         if (info) return info_radius(rad);\r
3887 \r
3888                         /* Stop singing before start another */\r
3889                         if (cast || fail) stop_singing();\r
3890 \r
3891                         if (cast)\r
3892                         {\r
3893                                 msg_print(_("歌が空間を歪めた...", "Reality whirls wildly as you sing a dizzying melody..."));\r
3894                                 project(0, rad, p_ptr->y, p_ptr->x, power, GF_AWAY_ALL, PROJECT_KILL, -1);\r
3895                         }\r
3896                 }\r
3897                 break;\r
3898 \r
3899         case 20:\r
3900                 if (name) return _("退散の歌", "Dispelling chant");\r
3901                 if (desc) return _("視界内の全てのモンスターにダメージを与える。邪悪なモンスターに特に大きなダメージを与える。", \r
3902                         "Damages all monsters in sight. Hurts evil monsters greatly.");\r
3903     \r
3904                 /* Stop singing before start another */\r
3905                 if (cast || fail) stop_singing();\r
3906 \r
3907                 if (cast)\r
3908                 {\r
3909                         msg_print(_("耐えられない不協和音が敵を責め立てた...", "You cry out in an ear-wracking voice..."));\r
3910                         start_singing(spell, MUSIC_DISPEL);\r
3911                 }\r
3912 \r
3913                 {\r
3914                         int m_sides = plev * 3;\r
3915                         int e_sides = plev * 3;\r
3916 \r
3917                         if (info) return format("%s1d%d+1d%d", s_dam, m_sides, e_sides);\r
3918 \r
3919                         if (cont)\r
3920                         {\r
3921                                 dispel_monsters(randint1(m_sides));\r
3922                                 dispel_evil(randint1(e_sides));\r
3923                         }\r
3924                 }\r
3925                 break;\r
3926 \r
3927         case 21:\r
3928                 if (name) return _("サルマンの甘言", "The Voice of Saruman");\r
3929                 if (desc) return _("視界内の全てのモンスターを減速させ、眠らせようとする。抵抗されると無効。", "Attempts to slow and sleep all monsters in sight.");\r
3930     \r
3931                 /* Stop singing before start another */\r
3932                 if (cast || fail) stop_singing();\r
3933 \r
3934                 if (cast)\r
3935                 {\r
3936                         msg_print(_("優しく、魅力的な歌を口ずさみ始めた...", "You start humming a gentle and attractive song..."));\r
3937                         start_singing(spell, MUSIC_SARUMAN);\r
3938                 }\r
3939 \r
3940                 {\r
3941                         int power = plev;\r
3942 \r
3943                         if (info) return info_power(power);\r
3944 \r
3945                         if (cont)\r
3946                         {\r
3947                                 slow_monsters(plev);\r
3948                                 sleep_monsters(plev);\r
3949                         }\r
3950                 }\r
3951 \r
3952                 break;\r
3953 \r
3954         case 22:\r
3955                 if (name) return _("嵐の音色", "Song of the Tempest");\r
3956                 if (desc) return _("轟音のビームを放つ。", "Fires a beam of sound.");\r
3957     \r
3958                 {\r
3959                         int dice = 15 + (plev - 1) / 2;\r
3960                         int sides = 10;\r
3961 \r
3962                         if (info) return info_damage(dice, sides, 0);\r
3963 \r
3964                         /* Stop singing before start another */\r
3965                         if (cast || fail) stop_singing();\r
3966 \r
3967                         if (cast)\r
3968                         {\r
3969                                 if (!get_aim_dir(&dir)) return NULL;\r
3970 \r
3971                                 fire_beam(GF_SOUND, dir, damroll(dice, sides));\r
3972                         }\r
3973                 }\r
3974                 break;\r
3975 \r
3976         case 23:\r
3977                 if (name) return _("もう一つの世界", "Ambarkanta");\r
3978                 if (desc) return _("現在の階を再構成する。", "Recreates current dungeon level.");\r
3979     \r
3980                 {\r
3981                         int base = 15;\r
3982                         int sides = 20;\r
3983 \r
3984                         if (info) return info_delay(base, sides);\r
3985 \r
3986                         /* Stop singing before start another */\r
3987                         if (cast || fail) stop_singing();\r
3988 \r
3989                         if (cast)\r
3990                         {\r
3991                                 msg_print(_("周囲が変化し始めた...", "You sing of the primeval shaping of Middle-earth..."));\r
3992                                 alter_reality();\r
3993                         }\r
3994                 }\r
3995                 break;\r
3996 \r
3997         case 24:\r
3998                 if (name) return _("破壊の旋律", "Wrecking Pattern");\r
3999                 if (desc) return _("周囲のダンジョンを揺らし、壁と床をランダムに入れ変える。", \r
4000                         "Shakes dungeon structure, and results in random swapping of floors and walls.");\r
4001 \r
4002                 /* Stop singing before start another */\r
4003                 if (cast || fail) stop_singing();\r
4004 \r
4005                 if (cast)\r
4006                 {\r
4007                         msg_print(_("破壊的な歌が響きわたった...", "You weave a pattern of sounds to contort and shatter..."));\r
4008                         start_singing(spell, MUSIC_QUAKE);\r
4009                 }\r
4010 \r
4011                 {\r
4012                         int rad = 10;\r
4013 \r
4014                         if (info) return info_radius(rad);\r
4015 \r
4016                         if (cont)\r
4017                         {\r
4018                                 earthquake(p_ptr->y, p_ptr->x, 10);\r
4019                         }\r
4020                 }\r
4021 \r
4022                 break;\r
4023 \r
4024 \r
4025         case 25:\r
4026                 if (name) return _("停滞の歌", "Stationary Shriek");\r
4027                 if (desc) return _("視界内の全てのモンスターを麻痺させようとする。抵抗されると無効。", "Attempts to freeze all monsters in sight.");\r
4028     \r
4029                 /* Stop singing before start another */\r
4030                 if (cast || fail) stop_singing();\r
4031 \r
4032                 if (cast)\r
4033                 {\r
4034                         msg_print(_("ゆっくりとしたメロディを奏で始めた...", "You weave a very slow pattern which is almost likely to stop..."));\r
4035                         start_singing(spell, MUSIC_STASIS);\r
4036                 }\r
4037 \r
4038                 {\r
4039                         int power = plev * 4;\r
4040 \r
4041                         if (info) return info_power(power);\r
4042 \r
4043                         if (cont)\r
4044                         {\r
4045                                 stasis_monsters(power);\r
4046                         }\r
4047                 }\r
4048 \r
4049                 break;\r
4050 \r
4051         case 26:\r
4052                 if (name) return _("守りの歌", "Endurance");\r
4053                 if (desc) return _("自分のいる床の上に、モンスターが通り抜けたり召喚されたりすることができなくなるルーンを描く。", \r
4054                         "Sets a glyph on the floor beneath you. Monsters cannot attack you if you are on a glyph, but can try to break glyph.");\r
4055     \r
4056                 {\r
4057                         /* Stop singing before start another */\r
4058                         if (cast || fail) stop_singing();\r
4059 \r
4060                         if (cast)\r
4061                         {\r
4062                                 msg_print(_("歌が神聖な場を作り出した...", "The holy power of the Music is creating sacred field..."));\r
4063                                 warding_glyph();\r
4064                         }\r
4065                 }\r
4066                 break;\r
4067 \r
4068         case 27:\r
4069                 if (name) return _("英雄の詩", "The Hero's Poem");\r
4070                 if (desc) return _("加速し、ヒーロー気分になり、視界内の全てのモンスターにダメージを与える。", \r
4071                         "Hastes you. Gives heroism. Damages all monsters in sight.");\r
4072     \r
4073                 /* Stop singing before start another */\r
4074                 if (cast || fail) stop_singing();\r
4075 \r
4076                 if (cast)\r
4077                 {\r
4078                         msg_print(_("英雄の歌を口ずさんだ...", "You chant a powerful, heroic call to arms..."));\r
4079                         (void)hp_player(10);\r
4080                         (void)set_afraid(0);\r
4081 \r
4082                         /* Recalculate hitpoints */\r
4083                         p_ptr->update |= (PU_HP);\r
4084 \r
4085                         start_singing(spell, MUSIC_SHERO);\r
4086                 }\r
4087 \r
4088                 if (stop)\r
4089                 {\r
4090                         if (!p_ptr->hero)\r
4091                         {\r
4092                                 msg_print(_("ヒーローの気分が消え失せた。", "The heroism wears off."));\r
4093                                 /* Recalculate hitpoints */\r
4094                                 p_ptr->update |= (PU_HP);\r
4095                         }\r
4096 \r
4097                         if (!p_ptr->fast)\r
4098                         {\r
4099                                 msg_print(_("動きの素早さがなくなったようだ。", "You feel yourself slow down."));\r
4100                         }\r
4101                 }\r
4102 \r
4103                 {\r
4104                         int dice = 1;\r
4105                         int sides = plev * 3;\r
4106 \r
4107                         if (info) return info_damage(dice, sides, 0);\r
4108 \r
4109                         if (cont)\r
4110                         {\r
4111                                 dispel_monsters(damroll(dice, sides));\r
4112                         }\r
4113                 }\r
4114                 break;\r
4115 \r
4116         case 28:\r
4117                 if (name) return _("ヤヴァンナの助け", "Relief of Yavanna");\r
4118                 if (desc) return _("強力な回復の歌で、負傷と朦朧状態も全快する。", "Powerful healing song. Also heals cut and stun completely.");\r
4119     \r
4120                 /* Stop singing before start another */\r
4121                 if (cast || fail) stop_singing();\r
4122 \r
4123                 if (cast)\r
4124                 {\r
4125                         msg_print(_("歌を通して体に活気が戻ってきた...", "Life flows through you as you sing the song..."));\r
4126                         start_singing(spell, MUSIC_H_LIFE);\r
4127                 }\r
4128 \r
4129                 {\r
4130                         int dice = 15;\r
4131                         int sides = 10;\r
4132 \r
4133                         if (info) return info_heal(dice, sides, 0);\r
4134 \r
4135                         if (cont)\r
4136                         {\r
4137                                 hp_player(damroll(dice, sides));\r
4138                                 set_stun(0);\r
4139                                 set_cut(0);\r
4140                         }\r
4141                 }\r
4142 \r
4143                 break;\r
4144 \r
4145         case 29:\r
4146                 if (name) return _("再生の歌", "Goddess' rebirth");\r
4147                 if (desc) return _("すべてのステータスと経験値を回復する。", "Restores all stats and experience.");\r
4148     \r
4149                 {\r
4150                         /* Stop singing before start another */\r
4151                         if (cast || fail) stop_singing();\r
4152 \r
4153                         if (cast)\r
4154                         {\r
4155                                 msg_print(_("暗黒の中に光と美をふりまいた。体が元の活力を取り戻した。",\r
4156                                                         "You strewed light and beauty in the dark as you sing. You feel refreshed."));\r
4157                                 (void)do_res_stat(A_STR);\r
4158                                 (void)do_res_stat(A_INT);\r
4159                                 (void)do_res_stat(A_WIS);\r
4160                                 (void)do_res_stat(A_DEX);\r
4161                                 (void)do_res_stat(A_CON);\r
4162                                 (void)do_res_stat(A_CHR);\r
4163                                 (void)restore_level();\r
4164                         }\r
4165                 }\r
4166                 break;\r
4167 \r
4168         case 30:\r
4169                 if (name) return _("サウロンの魔術", "Wizardry of Sauron");\r
4170                 if (desc) return _("非常に強力でごく小さい轟音の球を放つ。", "Fires an extremely powerful tiny ball of sound.");\r
4171     \r
4172                 {\r
4173                         int dice = 50 + plev;\r
4174                         int sides = 10;\r
4175                         int rad = 0;\r
4176 \r
4177                         if (info) return info_damage(dice, sides, 0);\r
4178 \r
4179                         /* Stop singing before start another */\r
4180                         if (cast || fail) stop_singing();\r
4181 \r
4182                         if (cast)\r
4183                         {\r
4184                                 if (!get_aim_dir(&dir)) return NULL;\r
4185 \r
4186                                 fire_ball(GF_SOUND, dir, damroll(dice, sides), rad);\r
4187                         }\r
4188                 }\r
4189                 break;\r
4190 \r
4191         case 31:\r
4192                 if (name) return _("フィンゴルフィンの挑戦", "Fingolfin's Challenge");\r
4193                 if (desc) return _("ダメージを受けなくなるバリアを張る。", \r
4194                         "Generates barrier which completely protect you from almost all damages. Takes a few your turns when the barrier breaks.");\r
4195     \r
4196                 /* Stop singing before start another */\r
4197                 if (cast || fail) stop_singing();\r
4198 \r
4199                 if (cast)\r
4200                 {\r
4201                         msg_print(_("フィンゴルフィンの冥王への挑戦を歌った...",\r
4202                                                 "You recall the valor of Fingolfin's challenge to the Dark Lord..."));\r
4203 \r
4204                         /* Redraw map */\r
4205                         p_ptr->redraw |= (PR_MAP);\r
4206                 \r
4207                         /* Update monsters */\r
4208                         p_ptr->update |= (PU_MONSTERS);\r
4209                 \r
4210                         /* Window stuff */\r
4211                         p_ptr->window |= (PW_OVERHEAD | PW_DUNGEON);\r
4212 \r
4213                         start_singing(spell, MUSIC_INVULN);\r
4214                 }\r
4215 \r
4216                 if (stop)\r
4217                 {\r
4218                         if (!p_ptr->invuln)\r
4219                         {\r
4220                                 msg_print(_("無敵ではなくなった。", "The invulnerability wears off."));\r
4221                                 /* Redraw map */\r
4222                                 p_ptr->redraw |= (PR_MAP);\r
4223 \r
4224                                 /* Update monsters */\r
4225                                 p_ptr->update |= (PU_MONSTERS);\r
4226 \r
4227                                 /* Window stuff */\r
4228                                 p_ptr->window |= (PW_OVERHEAD | PW_DUNGEON);\r
4229                         }\r
4230                 }\r
4231 \r
4232                 break;\r
4233         }\r
4234 \r
4235         return "";\r
4236 }\r
4237 \r
4238 /*!\r
4239  * @brief 剣術の各処理を行う\r
4240  * @param spell 剣術ID\r
4241  * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_CAST)\r
4242  * @return SPELL_NAME / SPELL_DESC 時には文字列ポインタを返す。SPELL_CAST時はNULL文字列を返す。\r
4243  */\r
4244 static cptr do_hissatsu_spell(SPELL_IDX spell, BIT_FLAGS mode)\r
4245 {\r
4246         bool name = (mode == SPELL_NAME) ? TRUE : FALSE;\r
4247         bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;\r
4248         bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;\r
4249 \r
4250         int dir;\r
4251         int plev = p_ptr->lev;\r
4252 \r
4253         switch (spell)\r
4254         {\r
4255         case 0:\r
4256                 if (name) return _("飛飯綱", "Tobi-Izuna");\r
4257                 if (desc) return _("2マス離れたところにいるモンスターを攻撃する。", "Attacks a two squares distant monster.");\r
4258     \r
4259                 if (cast)\r
4260                 {\r
4261                         project_length = 2;\r
4262                         if (!get_aim_dir(&dir)) return NULL;\r
4263 \r
4264                         project_hook(GF_ATTACK, dir, HISSATSU_2, PROJECT_STOP | PROJECT_KILL);\r
4265                 }\r
4266                 break;\r
4267 \r
4268         case 1:\r
4269                 if (name) return _("五月雨斬り", "3-Way Attack");\r
4270                 if (desc) return _("3方向に対して攻撃する。", "Attacks in 3 directions in one time.");\r
4271     \r
4272                 if (cast)\r
4273                 {\r
4274                         int cdir;\r
4275                         int y, x;\r
4276 \r
4277                         if (!get_rep_dir2(&dir)) return NULL;\r
4278                         if (dir == 5) return NULL;\r
4279 \r
4280                         for (cdir = 0;cdir < 8; cdir++)\r
4281                         {\r
4282                                 if (cdd[cdir] == dir) break;\r
4283                         }\r
4284 \r
4285                         if (cdir == 8) return NULL;\r
4286 \r
4287                         y = p_ptr->y + ddy_cdd[cdir];\r
4288                         x = p_ptr->x + ddx_cdd[cdir];\r
4289                         if (cave[y][x].m_idx)\r
4290                                 py_attack(y, x, 0);\r
4291                         else\r
4292                                 msg_print(_("攻撃は空を切った。", "You attack the empty air."));\r
4293                         \r
4294                         y = p_ptr->y + ddy_cdd[(cdir + 7) % 8];\r
4295                         x = p_ptr->x + ddx_cdd[(cdir + 7) % 8];\r
4296                         if (cave[y][x].m_idx)\r
4297                                 py_attack(y, x, 0);\r
4298                         else\r
4299                                 msg_print(_("攻撃は空を切った。", "You attack the empty air."));\r
4300                         \r
4301                         y = p_ptr->y + ddy_cdd[(cdir + 1) % 8];\r
4302                         x = p_ptr->x + ddx_cdd[(cdir + 1) % 8];\r
4303                         if (cave[y][x].m_idx)\r
4304                                 py_attack(y, x, 0);\r
4305                         else\r
4306                                 msg_print(_("攻撃は空を切った。", "You attack the empty air."));\r
4307                 }\r
4308                 break;\r
4309 \r
4310         case 2:\r
4311                 if (name) return _("ブーメラン", "Boomerang");\r
4312                 if (desc) return _("武器を手元に戻ってくるように投げる。戻ってこないこともある。", \r
4313                         "Throws current weapon. And it'll return to your hand unless failed.");\r
4314     \r
4315                 if (cast)\r
4316                 {\r
4317                         if (!do_cmd_throw(1, TRUE, -1)) return NULL;\r
4318                 }\r
4319                 break;\r
4320 \r
4321         case 3:\r
4322                 if (name) return _("焔霊", "Burning Strike");\r
4323                 if (desc) return _("火炎耐性のないモンスターに大ダメージを与える。", "Attacks a monster with more damage unless it has resistance to fire.");\r
4324     \r
4325                 if (cast)\r
4326                 {\r
4327                         int y, x;\r
4328 \r
4329                         if (!get_rep_dir2(&dir)) return NULL;\r
4330                         if (dir == 5) return NULL;\r
4331 \r
4332                         y = p_ptr->y + ddy[dir];\r
4333                         x = p_ptr->x + ddx[dir];\r
4334 \r
4335                         if (cave[y][x].m_idx)\r
4336                                 py_attack(y, x, HISSATSU_FIRE);\r
4337                         else\r
4338                         {\r
4339                                 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));\r
4340                                 return NULL;\r
4341                         }\r
4342                 }\r
4343                 break;\r
4344 \r
4345         case 4:\r
4346                 if (name) return _("殺気感知", "Detect Ferocity");\r
4347                 if (desc) return _("近くの思考することができるモンスターを感知する。", "Detects all monsters except mindless in your vicinity.");\r
4348     \r
4349                 if (cast)\r
4350                 {\r
4351                         detect_monsters_mind(DETECT_RAD_DEFAULT);\r
4352                 }\r
4353                 break;\r
4354 \r
4355         case 5:\r
4356                 if (name) return _("みね打ち", "Strike to Stun");\r
4357                 if (desc) return _("相手にダメージを与えないが、朦朧とさせる。", "Attempts to stun a monster in the adjacent.");\r
4358     \r
4359                 if (cast)\r
4360                 {\r
4361                         int y, x;\r
4362 \r
4363                         if (!get_rep_dir2(&dir)) return NULL;\r
4364                         if (dir == 5) return NULL;\r
4365 \r
4366                         y = p_ptr->y + ddy[dir];\r
4367                         x = p_ptr->x + ddx[dir];\r
4368 \r
4369                         if (cave[y][x].m_idx)\r
4370                                 py_attack(y, x, HISSATSU_MINEUCHI);\r
4371                         else\r
4372                         {\r
4373                                 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));\r
4374                                 return NULL;\r
4375                         }\r
4376                 }\r
4377                 break;\r
4378 \r
4379         case 6:\r
4380                 if (name) return _("カウンター", "Counter");\r
4381                 if (desc) return _("相手に攻撃されたときに反撃する。反撃するたびにMPを消費。", \r
4382                         "Prepares to counterattack. When attack by a monster, strikes back using SP each time.");\r
4383     \r
4384                 if (cast)\r
4385                 {\r
4386                         if (p_ptr->riding)\r
4387                         {\r
4388                                 msg_print(_("乗馬中には無理だ。", "You cannot do it when riding."));\r
4389                                 return NULL;\r
4390                         }\r
4391                         msg_print(_("相手の攻撃に対して身構えた。", "You prepare to counter blow."));\r
4392                         p_ptr->counter = TRUE;\r
4393                 }\r
4394                 break;\r
4395 \r
4396         case 7:\r
4397                 if (name) return _("払い抜け", "Harainuke");\r
4398                 if (desc) return _("攻撃した後、反対側に抜ける。", \r
4399                         "Attacks monster with your weapons normally, then move through counter side of the monster.");\r
4400     \r
4401                 if (cast)\r
4402                 {\r
4403                         POSITION y, x;\r
4404 \r
4405                         if (p_ptr->riding)\r
4406                         {\r
4407                                 msg_print(_("乗馬中には無理だ。", "You cannot do it when riding."));\r
4408                                 return NULL;\r
4409                         }\r
4410         \r
4411                         if (!get_rep_dir2(&dir)) return NULL;\r
4412         \r
4413                         if (dir == 5) return NULL;\r
4414                         y = p_ptr->y + ddy[dir];\r
4415                         x = p_ptr->x + ddx[dir];\r
4416         \r
4417                         if (!cave[y][x].m_idx)\r
4418                         {\r
4419                                 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));\r
4420                                 return NULL;\r
4421                         }\r
4422         \r
4423                         py_attack(y, x, 0);\r
4424         \r
4425                         if (!player_can_enter(cave[y][x].feat, 0) || is_trap(cave[y][x].feat))\r
4426                                 break;\r
4427         \r
4428                         y += ddy[dir];\r
4429                         x += ddx[dir];\r
4430         \r
4431                         if (player_can_enter(cave[y][x].feat, 0) && !is_trap(cave[y][x].feat) && !cave[y][x].m_idx)\r
4432                         {\r
4433                                 msg_print(NULL);\r
4434         \r
4435                                 /* Move the player */\r
4436                                 (void)move_player_effect(y, x, MPE_FORGET_FLOW | MPE_HANDLE_STUFF | MPE_DONT_PICKUP);\r
4437                         }\r
4438                 }\r
4439                 break;\r
4440 \r
4441         case 8:\r
4442                 if (name) return _("サーペンツタン", "Serpent's Tongue");\r
4443                 if (desc) return _("毒耐性のないモンスターに大ダメージを与える。", "Attacks a monster with more damage unless it has resistance to poison.");\r
4444     \r
4445                 if (cast)\r
4446                 {\r
4447                         int y, x;\r
4448 \r
4449                         if (!get_rep_dir2(&dir)) return NULL;\r
4450                         if (dir == 5) return NULL;\r
4451 \r
4452                         y = p_ptr->y + ddy[dir];\r
4453                         x = p_ptr->x + ddx[dir];\r
4454 \r
4455                         if (cave[y][x].m_idx)\r
4456                                 py_attack(y, x, HISSATSU_POISON);\r
4457                         else\r
4458                         {\r
4459                                 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));\r
4460                                 return NULL;\r
4461                         }\r
4462                 }\r
4463                 break;\r
4464 \r
4465         case 9:\r
4466                 if (name) return _("斬魔剣弐の太刀", "Zammaken");\r
4467                 if (desc) return _("生命のない邪悪なモンスターに大ダメージを与えるが、他のモンスターには全く効果がない。", \r
4468                         "Attacks an evil unliving monster with great damage. No effect to other  monsters.");\r
4469     \r
4470                 if (cast)\r
4471                 {\r
4472                         int y, x;\r
4473 \r
4474                         if (!get_rep_dir2(&dir)) return NULL;\r
4475                         if (dir == 5) return NULL;\r
4476 \r
4477                         y = p_ptr->y + ddy[dir];\r
4478                         x = p_ptr->x + ddx[dir];\r
4479 \r
4480                         if (cave[y][x].m_idx)\r
4481                                 py_attack(y, x, HISSATSU_ZANMA);\r
4482                         else\r
4483                         {\r
4484                                 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));\r
4485                                 return NULL;\r
4486                         }\r
4487                 }\r
4488                 break;\r
4489 \r
4490         case 10:\r
4491                 if (name) return _("裂風剣", "Wind Blast");\r
4492                 if (desc) return _("攻撃した相手を後方へ吹き飛ばす。", "Attacks an adjacent monster, and blow it away.");\r
4493     \r
4494                 if (cast)\r
4495                 {\r
4496                         int y, x;\r
4497 \r
4498                         if (!get_rep_dir2(&dir)) return NULL;\r
4499                         if (dir == 5) return NULL;\r
4500 \r
4501                         y = p_ptr->y + ddy[dir];\r
4502                         x = p_ptr->x + ddx[dir];\r
4503 \r
4504                         if (cave[y][x].m_idx)\r
4505                                 py_attack(y, x, 0);\r
4506                         else\r
4507                         {\r
4508                                 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));\r
4509                                 return NULL;\r
4510                         }\r
4511                         if (d_info[dungeon_type].flags1 & DF1_NO_MELEE)\r
4512                         {\r
4513                                 return "";\r
4514                         }\r
4515                         if (cave[y][x].m_idx)\r
4516                         {\r
4517                                 int i;\r
4518                                 POSITION ty = y, tx = x;\r
4519                                 POSITION oy = y, ox = x;\r
4520                                 MONSTER_IDX m_idx = cave[y][x].m_idx;\r
4521                                 monster_type *m_ptr = &m_list[m_idx];\r
4522                                 char m_name[80];\r
4523         \r
4524                                 monster_desc(m_name, m_ptr, 0);\r
4525         \r
4526                                 for (i = 0; i < 5; i++)\r
4527                                 {\r
4528                                         y += ddy[dir];\r
4529                                         x += ddx[dir];\r
4530                                         if (cave_empty_bold(y, x))\r
4531                                         {\r
4532                                                 ty = y;\r
4533                                                 tx = x;\r
4534                                         }\r
4535                                         else break;\r
4536                                 }\r
4537                                 if ((ty != oy) || (tx != ox))\r
4538                                 {\r
4539                                         msg_format(_("%sを吹き飛ばした!", "You blow %s away!"), m_name);\r
4540                                         cave[oy][ox].m_idx = 0;\r
4541                                         cave[ty][tx].m_idx = m_idx;\r
4542                                         m_ptr->fy = ty;\r
4543                                         m_ptr->fx = tx;\r
4544         \r
4545                                         update_mon(m_idx, TRUE);\r
4546                                         lite_spot(oy, ox);\r
4547                                         lite_spot(ty, tx);\r
4548         \r
4549                                         if (r_info[m_ptr->r_idx].flags7 & (RF7_LITE_MASK | RF7_DARK_MASK))\r
4550                                                 p_ptr->update |= (PU_MON_LITE);\r
4551                                 }\r
4552                         }\r
4553                 }\r
4554                 break;\r
4555 \r
4556         case 11:\r
4557                 if (name) return _("刀匠の目利き", "Judge");\r
4558                 if (desc) return _("武器・防具を1つ識別する。レベル45以上で武器・防具の能力を完全に知ることができる。", \r
4559                         "Identifies a weapon or armor. Or *identifies* these at level 45.");\r
4560     \r
4561                 if (cast)\r
4562                 {\r
4563                         if (plev > 44)\r
4564                         {\r
4565                                 if (!identify_fully(TRUE)) return NULL;\r
4566                         }\r
4567                         else\r
4568                         {\r
4569                                 if (!ident_spell(TRUE)) return NULL;\r
4570                         }\r
4571                 }\r
4572                 break;\r
4573 \r
4574         case 12:\r
4575                 if (name) return _("破岩斬", "Rock Smash");\r
4576                 if (desc) return _("岩を壊し、岩石系のモンスターに大ダメージを与える。", "Breaks rock. Or greatly damage a monster made by rocks.");\r
4577     \r
4578                 if (cast)\r
4579                 {\r
4580                         int y, x;\r
4581 \r
4582                         if (!get_rep_dir2(&dir)) return NULL;\r
4583                         if (dir == 5) return NULL;\r
4584 \r
4585                         y = p_ptr->y + ddy[dir];\r
4586                         x = p_ptr->x + ddx[dir];\r
4587 \r
4588                         if (cave[y][x].m_idx)\r
4589                                 py_attack(y, x, HISSATSU_HAGAN);\r
4590         \r
4591                         if (!cave_have_flag_bold(y, x, FF_HURT_ROCK)) break;\r
4592         \r
4593                         /* Destroy the feature */\r
4594                         cave_alter_feat(y, x, FF_HURT_ROCK);\r
4595         \r
4596                         /* Update some things */\r
4597                         p_ptr->update |= (PU_FLOW);\r
4598                 }\r
4599                 break;\r
4600 \r
4601         case 13:\r
4602                 if (name) return _("乱れ雪月花", "Midare-Setsugekka");\r
4603                 if (desc) return _("攻撃回数が増え、冷気耐性のないモンスターに大ダメージを与える。", \r
4604                         "Attacks a monster with increased number of attacks and more damage unless it has resistance to cold.");\r
4605     \r
4606                 if (cast)\r
4607                 {\r
4608                         int y, x;\r
4609 \r
4610                         if (!get_rep_dir2(&dir)) return NULL;\r
4611                         if (dir == 5) return NULL;\r
4612 \r
4613                         y = p_ptr->y + ddy[dir];\r
4614                         x = p_ptr->x + ddx[dir];\r
4615 \r
4616                         if (cave[y][x].m_idx)\r
4617                                 py_attack(y, x, HISSATSU_COLD);\r
4618                         else\r
4619                         {\r
4620                                 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));\r
4621                                 return NULL;\r
4622                         }\r
4623                 }\r
4624                 break;\r
4625 \r
4626         case 14:\r
4627                 if (name) return _("急所突き", "Spot Aiming");\r
4628                 if (desc) return _("モンスターを一撃で倒す攻撃を繰り出す。失敗すると1点しかダメージを与えられない。", \r
4629                         "Attempts to kill a monster instantly. If failed cause only 1HP of damage.");\r
4630     \r
4631                 if (cast)\r
4632                 {\r
4633                         int y, x;\r
4634 \r
4635                         if (!get_rep_dir2(&dir)) return NULL;\r
4636                         if (dir == 5) return NULL;\r
4637 \r
4638                         y = p_ptr->y + ddy[dir];\r
4639                         x = p_ptr->x + ddx[dir];\r
4640 \r
4641                         if (cave[y][x].m_idx)\r
4642                                 py_attack(y, x, HISSATSU_KYUSHO);\r
4643                         else\r
4644                         {\r
4645                                 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));\r
4646                                 return NULL;\r
4647                         }\r
4648                 }\r
4649                 break;\r
4650 \r
4651         case 15:\r
4652                 if (name) return _("魔神斬り", "Majingiri");\r
4653                 if (desc) return _("会心の一撃で攻撃する。攻撃がかわされやすい。", \r
4654                         "Attempts to attack with critical hit. But this attack is easy to evade for a monster.");\r
4655     \r
4656                 if (cast)\r
4657                 {\r
4658                         int y, x;\r
4659 \r
4660                         if (!get_rep_dir2(&dir)) return NULL;\r
4661                         if (dir == 5) return NULL;\r
4662 \r
4663                         y = p_ptr->y + ddy[dir];\r
4664                         x = p_ptr->x + ddx[dir];\r
4665 \r
4666                         if (cave[y][x].m_idx)\r
4667                                 py_attack(y, x, HISSATSU_MAJIN);\r
4668                         else\r
4669                         {\r
4670                                 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));\r
4671                                 return NULL;\r
4672                         }\r
4673                 }\r
4674                 break;\r
4675 \r
4676         case 16:\r
4677                 if (name) return _("捨て身", "Desperate Attack");\r
4678                 if (desc) return _("強力な攻撃を繰り出す。次のターンまでの間、食らうダメージが増える。", \r
4679                         "Attacks with all of your power. But all damages you take will be doubled for one turn.");\r
4680     \r
4681                 if (cast)\r
4682                 {\r
4683                         int y, x;\r
4684 \r
4685                         if (!get_rep_dir2(&dir)) return NULL;\r
4686                         if (dir == 5) return NULL;\r
4687 \r
4688                         y = p_ptr->y + ddy[dir];\r
4689                         x = p_ptr->x + ddx[dir];\r
4690 \r
4691                         if (cave[y][x].m_idx)\r
4692                                 py_attack(y, x, HISSATSU_SUTEMI);\r
4693                         else\r
4694                         {\r
4695                                 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));\r
4696                                 return NULL;\r
4697                         }\r
4698                         p_ptr->sutemi = TRUE;\r
4699                 }\r
4700                 break;\r
4701 \r
4702         case 17:\r
4703                 if (name) return _("雷撃鷲爪斬", "Lightning Eagle");\r
4704                 if (desc) return _("電撃耐性のないモンスターに非常に大きいダメージを与える。", \r
4705                         "Attacks a monster with more damage unless it has resistance to electricity.");\r
4706     \r
4707                 if (cast)\r
4708                 {\r
4709                         int y, x;\r
4710 \r
4711                         if (!get_rep_dir2(&dir)) return NULL;\r
4712                         if (dir == 5) return NULL;\r
4713 \r
4714                         y = p_ptr->y + ddy[dir];\r
4715                         x = p_ptr->x + ddx[dir];\r
4716 \r
4717                         if (cave[y][x].m_idx)\r
4718                                 py_attack(y, x, HISSATSU_ELEC);\r
4719                         else\r
4720                         {\r
4721                                 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));\r
4722                                 return NULL;\r
4723                         }\r
4724                 }\r
4725                 break;\r
4726 \r
4727         case 18:\r
4728                 if (name) return _("入身", "Rush Attack");\r
4729                 if (desc) return _("素早く相手に近寄り攻撃する。", "Steps close to a monster and attacks at a time.");\r
4730     \r
4731                 if (cast)\r
4732                 {\r
4733                         if (!rush_attack(NULL)) return NULL;\r
4734                 }\r
4735                 break;\r
4736 \r
4737         case 19:\r
4738                 if (name) return _("赤流渦", "Bloody Maelstrom");\r
4739                 if (desc) return _("自分自身も傷を作りつつ、その傷が深いほど大きい威力で全方向の敵を攻撃できる。生きていないモンスターには効果がない。", \r
4740                         "Attacks all adjacent monsters with power corresponding to your cut status. Then increases your cut status. No effect to unliving monsters.");\r
4741     \r
4742                 if (cast)\r
4743                 {\r
4744                         int y = 0, x = 0;\r
4745 \r
4746                         cave_type       *c_ptr;\r
4747                         monster_type    *m_ptr;\r
4748         \r
4749                         if (p_ptr->cut < 300)\r
4750                                 set_cut(p_ptr->cut + 300);\r
4751                         else\r
4752                                 set_cut(p_ptr->cut * 2);\r
4753         \r
4754                         for (dir = 0; dir < 8; dir++)\r
4755                         {\r
4756                                 y = p_ptr->y + ddy_ddd[dir];\r
4757                                 x = p_ptr->x + ddx_ddd[dir];\r
4758                                 c_ptr = &cave[y][x];\r
4759         \r
4760                                 /* Get the monster */\r
4761                                 m_ptr = &m_list[c_ptr->m_idx];\r
4762         \r
4763                                 /* Hack -- attack monsters */\r
4764                                 if (c_ptr->m_idx && (m_ptr->ml || cave_have_flag_bold(y, x, FF_PROJECT)))\r
4765                                 {\r
4766                                         if (!monster_living(&r_info[m_ptr->r_idx]))\r
4767                                         {\r
4768                                                 char m_name[80];\r
4769         \r
4770                                                 monster_desc(m_name, m_ptr, 0);\r
4771                                                 msg_format(_("%sには効果がない!", "%s is unharmed!"), m_name);\r
4772                                         }\r
4773                                         else py_attack(y, x, HISSATSU_SEKIRYUKA);\r
4774                                 }\r
4775                         }\r
4776                 }\r
4777                 break;\r
4778 \r
4779         case 20:\r
4780                 if (name) return _("激震撃", "Earthquake Blow");\r
4781                 if (desc) return _("地震を起こす。", "Shakes dungeon structure, and results in random swapping of floors and walls.");\r
4782     \r
4783                 if (cast)\r
4784                 {\r
4785                         int y,x;\r
4786 \r
4787                         if (!get_rep_dir2(&dir)) return NULL;\r
4788                         if (dir == 5) return NULL;\r
4789 \r
4790                         y = p_ptr->y + ddy[dir];\r
4791                         x = p_ptr->x + ddx[dir];\r
4792 \r
4793                         if (cave[y][x].m_idx)\r
4794                                 py_attack(y, x, HISSATSU_QUAKE);\r
4795                         else\r
4796                                 earthquake(p_ptr->y, p_ptr->x, 10);\r
4797                 }\r
4798                 break;\r
4799 \r
4800         case 21:\r
4801                 if (name) return _("地走り", "Crack");\r
4802                 if (desc) return _("衝撃波のビームを放つ。", "Fires a beam of shock wave.");\r
4803     \r
4804                 if (cast)\r
4805                 {\r
4806                         int total_damage = 0, basedam, i;\r
4807                         u32b flgs[TR_FLAG_SIZE];\r
4808                         object_type *o_ptr;\r
4809                         if (!get_aim_dir(&dir)) return NULL;\r
4810                         msg_print(_("武器を大きく振り下ろした。", "You swing your weapon downward."));\r
4811                         for (i = 0; i < 2; i++)\r
4812                         {\r
4813                                 int damage;\r
4814         \r
4815                                 if (!buki_motteruka(INVEN_RARM+i)) break;\r
4816                                 o_ptr = &inventory[INVEN_RARM+i];\r
4817                                 basedam = (o_ptr->dd * (o_ptr->ds + 1)) * 50;\r
4818                                 damage = o_ptr->to_d * 100;\r
4819                                 object_flags(o_ptr, flgs);\r
4820                                 if ((o_ptr->name1 == ART_VORPAL_BLADE) || (o_ptr->name1 == ART_CHAINSWORD))\r
4821                                 {\r
4822                                         /* vorpal blade */\r
4823                                         basedam *= 5;\r
4824                                         basedam /= 3;\r
4825                                 }\r
4826                                 else if (have_flag(flgs, TR_VORPAL))\r
4827                                 {\r
4828                                         /* vorpal flag only */\r
4829                                         basedam *= 11;\r
4830                                         basedam /= 9;\r
4831                                 }\r
4832                                 damage += basedam;\r
4833                                 damage *= p_ptr->num_blow[i];\r
4834                                 total_damage += damage / 200;\r
4835                                 if (i) total_damage = total_damage*7/10;\r
4836                         }\r
4837                         fire_beam(GF_FORCE, dir, total_damage);\r
4838                 }\r
4839                 break;\r
4840 \r
4841         case 22:\r
4842                 if (name) return _("気迫の雄叫び", "War Cry");\r
4843                 if (desc) return _("視界内の全モンスターに対して轟音の攻撃を行う。さらに、近くにいるモンスターを怒らせる。", \r
4844                         "Damages all monsters in sight with sound. Aggravate nearby monsters.");\r
4845     \r
4846                 if (cast)\r
4847                 {\r
4848                         msg_print(_("雄叫びをあげた!", "You roar out!"));\r
4849                         project_hack(GF_SOUND, randint1(plev * 3));\r
4850                         aggravate_monsters(0);\r
4851                 }\r
4852                 break;\r
4853 \r
4854         case 23:\r
4855                 if (name) return _("無双三段", "Musou-Sandan");\r
4856                 if (desc) return _("強力な3段攻撃を繰り出す。", "Attacks with powerful 3 strikes.");\r
4857     \r
4858                 if (cast)\r
4859                 {\r
4860                         int i;\r
4861 \r
4862                         if (!get_rep_dir2(&dir)) return NULL;\r
4863                         if (dir == 5) return NULL;\r
4864 \r
4865                         for (i = 0; i < 3; i++)\r
4866                         {\r
4867                                 POSITION y, x;\r
4868                                 POSITION ny, nx;\r
4869                                 MONSTER_IDX m_idx;\r
4870                                 cave_type *c_ptr;\r
4871                                 monster_type *m_ptr;\r
4872         \r
4873                                 y = p_ptr->y + ddy[dir];\r
4874                                 x = p_ptr->x + ddx[dir];\r
4875                                 c_ptr = &cave[y][x];\r
4876         \r
4877                                 if (c_ptr->m_idx)\r
4878                                         py_attack(y, x, HISSATSU_3DAN);\r
4879                                 else\r
4880                                 {\r
4881                                         msg_print(_("その方向にはモンスターはいません。", "There is no monster."));\r
4882                                         return NULL;\r
4883                                 }\r
4884         \r
4885                                 if (d_info[dungeon_type].flags1 & DF1_NO_MELEE)\r
4886                                 {\r
4887                                         return "";\r
4888                                 }\r
4889         \r
4890                                 /* Monster is dead? */\r
4891                                 if (!c_ptr->m_idx) break;\r
4892         \r
4893                                 ny = y + ddy[dir];\r
4894                                 nx = x + ddx[dir];\r
4895                                 m_idx = c_ptr->m_idx;\r
4896                                 m_ptr = &m_list[m_idx];\r
4897         \r
4898                                 /* Monster cannot move back? */\r
4899                                 if (!monster_can_enter(ny, nx, &r_info[m_ptr->r_idx], 0))\r
4900                                 {\r
4901                                         /* -more- */\r
4902                                         if (i < 2) msg_print(NULL);\r
4903                                         continue;\r
4904                                 }\r
4905         \r
4906                                 c_ptr->m_idx = 0;\r
4907                                 cave[ny][nx].m_idx = m_idx;\r
4908                                 m_ptr->fy = ny;\r
4909                                 m_ptr->fx = nx;\r
4910         \r
4911                                 update_mon(m_idx, TRUE);\r
4912         \r
4913                                 /* Redraw the old spot */\r
4914                                 lite_spot(y, x);\r
4915         \r
4916                                 /* Redraw the new spot */\r
4917                                 lite_spot(ny, nx);\r
4918         \r
4919                                 /* Player can move forward? */\r
4920                                 if (player_can_enter(c_ptr->feat, 0))\r
4921                                 {\r
4922                                         /* Move the player */\r
4923                                         if (!move_player_effect(y, x, MPE_FORGET_FLOW | MPE_HANDLE_STUFF | MPE_DONT_PICKUP)) break;\r
4924                                 }\r
4925                                 else\r
4926                                 {\r
4927                                         break;\r
4928                                 }\r
4929 \r
4930                                 /* -more- */\r
4931                                 if (i < 2) msg_print(NULL);\r
4932                         }\r
4933                 }\r
4934                 break;\r
4935 \r
4936         case 24:\r
4937                 if (name) return _("吸血鬼の牙", "Vampire's Fang");\r
4938                 if (desc) return _("攻撃した相手の体力を吸いとり、自分の体力を回復させる。生命を持たないモンスターには通じない。", \r
4939                         "Attacks with vampiric strikes which absorbs HP from a monster and gives them to you. No effect to unliving monsters.");\r
4940     \r
4941                 if (cast)\r
4942                 {\r
4943                         int y, x;\r
4944 \r
4945                         if (!get_rep_dir2(&dir)) return NULL;\r
4946                         if (dir == 5) return NULL;\r
4947 \r
4948                         y = p_ptr->y + ddy[dir];\r
4949                         x = p_ptr->x + ddx[dir];\r
4950 \r
4951                         if (cave[y][x].m_idx)\r
4952                                 py_attack(y, x, HISSATSU_DRAIN);\r
4953                         else\r
4954                         {\r
4955                                         msg_print(_("その方向にはモンスターはいません。", "There is no monster."));\r
4956                                 return NULL;\r
4957                         }\r
4958                 }\r
4959                 break;\r
4960 \r
4961         case 25:\r
4962                 if (name) return _("幻惑", "Moon Dazzling");\r
4963                 if (desc) return _("視界内の起きている全モンスターに朦朧、混乱、眠りを与えようとする。", "Attempts to stun, confuse and sleep all waking monsters.");\r
4964     \r
4965                 if (cast)\r
4966                 {\r
4967                         msg_print(_("武器を不規則に揺らした...", "You irregularly wave your weapon..."));\r
4968                         project_hack(GF_ENGETSU, plev * 4);\r
4969                         project_hack(GF_ENGETSU, plev * 4);\r
4970                         project_hack(GF_ENGETSU, plev * 4);\r
4971                 }\r
4972                 break;\r
4973 \r
4974         case 26:\r
4975                 if (name) return _("百人斬り", "Hundred Slaughter");\r
4976                 if (desc) return _("連続して入身でモンスターを攻撃する。攻撃するたびにMPを消費。MPがなくなるか、モンスターを倒せなかったら百人斬りは終了する。", \r
4977                         "Performs a series of rush attacks. The series continues while killing each monster in a time and SP remains.");\r
4978     \r
4979                 if (cast)\r
4980                 {\r
4981                         const int mana_cost_per_monster = 8;\r
4982                         bool is_new = TRUE;\r
4983                         bool mdeath;\r
4984 \r
4985                         do\r
4986                         {\r
4987                                 if (!rush_attack(&mdeath)) break;\r
4988                                 if (is_new)\r
4989                                 {\r
4990                                         /* Reserve needed mana point */\r
4991                                         p_ptr->csp -= technic_info[REALM_HISSATSU - MIN_TECHNIC][26].smana;\r
4992                                         is_new = FALSE;\r
4993                                 }\r
4994                                 else\r
4995                                         p_ptr->csp -= mana_cost_per_monster;\r
4996 \r
4997                                 if (!mdeath) break;\r
4998                                 command_dir = 0;\r
4999 \r
5000                                 p_ptr->redraw |= PR_MANA;\r
5001                                 handle_stuff();\r
5002                         }\r
5003                         while (p_ptr->csp > mana_cost_per_monster);\r
5004 \r
5005                         if (is_new) return NULL;\r
5006         \r
5007                         /* Restore reserved mana */\r
5008                         p_ptr->csp += technic_info[REALM_HISSATSU - MIN_TECHNIC][26].smana;\r
5009                 }\r
5010                 break;\r
5011 \r
5012         case 27:\r
5013                 if (name) return _("天翔龍閃", "Dragonic Flash");\r
5014                 if (desc) return _("視界内の場所を指定して、その場所と自分の間にいる全モンスターを攻撃し、その場所に移動する。", \r
5015                         "Runs toward given location while attacking all monsters on the path.");\r
5016     \r
5017                 if (cast)\r
5018                 {\r
5019                         POSITION y, x;\r
5020 \r
5021                         if (!tgt_pt(&x, &y)) return NULL;\r
5022 \r
5023                         if (!cave_player_teleportable_bold(y, x, 0L) ||\r
5024                             (distance(y, x, p_ptr->y, p_ptr->x) > MAX_SIGHT / 2) ||\r
5025                             !projectable(p_ptr->y, p_ptr->x, y, x))\r
5026                         {\r
5027                                 msg_print(_("失敗!", "You cannot move to that place!"));\r
5028                                 break;\r
5029                         }\r
5030                         if (p_ptr->anti_tele)\r
5031                         {\r
5032                                 msg_print(_("不思議な力がテレポートを防いだ!", "A mysterious force prevents you from teleporting!"));\r
5033                                 break;\r
5034                         }\r
5035                         project(0, 0, y, x, HISSATSU_ISSEN, GF_ATTACK, PROJECT_BEAM | PROJECT_KILL, -1);\r
5036                         teleport_player_to(y, x, 0L);\r
5037                 }\r
5038                 break;\r
5039 \r
5040         case 28:\r
5041                 if (name) return _("二重の剣撃", "Twin Slash");\r
5042                 if (desc) return _("1ターンで2度攻撃を行う。", "double attacks at a time.");\r
5043     \r
5044                 if (cast)\r
5045                 {\r
5046                         int x, y;\r
5047         \r
5048                         if (!get_rep_dir(&dir, FALSE)) return NULL;\r
5049 \r
5050                         y = p_ptr->y + ddy[dir];\r
5051                         x = p_ptr->x + ddx[dir];\r
5052 \r
5053                         if (cave[y][x].m_idx)\r
5054                         {\r
5055                                 py_attack(y, x, 0);\r
5056                                 if (cave[y][x].m_idx)\r
5057                                 {\r
5058                                         handle_stuff();\r
5059                                         py_attack(y, x, 0);\r
5060                                 }\r
5061                         }\r
5062                         else\r
5063                         {\r
5064                                 msg_print(_("その方向にはモンスターはいません。", "You don't see any monster in this direction"));\r
5065                                 return NULL;\r
5066                         }\r
5067                 }\r
5068                 break;\r
5069 \r
5070         case 29:\r
5071                 if (name) return _("虎伏絶刀勢", "Kofuku-Zettousei");\r
5072                 if (desc) return _("強力な攻撃を行い、近くの場所にも効果が及ぶ。", "Performs a powerful attack which even effect nearby monsters.");\r
5073     \r
5074                 if (cast)\r
5075                 {\r
5076                         int total_damage = 0, basedam, i;\r
5077                         int y, x;\r
5078                         u32b flgs[TR_FLAG_SIZE];\r
5079                         object_type *o_ptr;\r
5080         \r
5081                         if (!get_rep_dir2(&dir)) return NULL;\r
5082                         if (dir == 5) return NULL;\r
5083 \r
5084                         y = p_ptr->y + ddy[dir];\r
5085                         x = p_ptr->x + ddx[dir];\r
5086 \r
5087                         if (d_info[dungeon_type].flags1 & DF1_NO_MELEE)\r
5088                         {\r
5089                                 msg_print(_("なぜか攻撃することができない。", "Something prevent you from attacking."));\r
5090                                 return "";\r
5091                         }\r
5092                         msg_print(_("武器を大きく振り下ろした。", "You swing your weapon downward."));\r
5093                         for (i = 0; i < 2; i++)\r
5094                         {\r
5095                                 int damage;\r
5096                                 if (!buki_motteruka(INVEN_RARM+i)) break;\r
5097                                 o_ptr = &inventory[INVEN_RARM+i];\r
5098                                 basedam = (o_ptr->dd * (o_ptr->ds + 1)) * 50;\r
5099                                 damage = o_ptr->to_d * 100;\r
5100                                 object_flags(o_ptr, flgs);\r
5101                                 if ((o_ptr->name1 == ART_VORPAL_BLADE) || (o_ptr->name1 == ART_CHAINSWORD))\r
5102                                 {\r
5103                                         /* vorpal blade */\r
5104                                         basedam *= 5;\r
5105                                         basedam /= 3;\r
5106                                 }\r
5107                                 else if (have_flag(flgs, TR_VORPAL))\r
5108                                 {\r
5109                                         /* vorpal flag only */\r
5110                                         basedam *= 11;\r
5111                                         basedam /= 9;\r
5112                                 }\r
5113                                 damage += basedam;\r
5114                                 damage += p_ptr->to_d[i] * 100;\r
5115                                 damage *= p_ptr->num_blow[i];\r
5116                                 total_damage += (damage / 100);\r
5117                         }\r
5118                         project(0, (cave_have_flag_bold(y, x, FF_PROJECT) ? 5 : 0), y, x, total_damage * 3 / 2, GF_METEOR, PROJECT_KILL | PROJECT_JUMP | PROJECT_ITEM, -1);\r
5119                 }\r
5120                 break;\r
5121 \r
5122         case 30:\r
5123                 if (name) return _("慶雲鬼忍剣", "Keiun-Kininken");\r
5124                 if (desc) return _("自分もダメージをくらうが、相手に非常に大きなダメージを与える。アンデッドには特に効果がある。", \r
5125                         "Attacks a monster with extremely powerful damage. But you also takes some damages. Hurts a undead monster greatly.");\r
5126     \r
5127                 if (cast)\r
5128                 {\r
5129                         int y, x;\r
5130 \r
5131                         if (!get_rep_dir2(&dir)) return NULL;\r
5132                         if (dir == 5) return NULL;\r
5133 \r
5134                         y = p_ptr->y + ddy[dir];\r
5135                         x = p_ptr->x + ddx[dir];\r
5136 \r
5137                         if (cave[y][x].m_idx)\r
5138                                 py_attack(y, x, HISSATSU_UNDEAD);\r
5139                         else\r
5140                         {\r
5141                                 msg_print(_("その方向にはモンスターはいません。", "There is no monster."));\r
5142                                 return NULL;\r
5143                         }\r
5144                         take_hit(DAMAGE_NOESCAPE, 100 + randint1(100), _("慶雲鬼忍剣を使った衝撃", "exhaustion on using Keiun-Kininken"), -1);\r
5145                 }\r
5146                 break;\r
5147 \r
5148         case 31:\r
5149                 if (name) return _("切腹", "Harakiri");\r
5150                 if (desc) return _("「武士道とは、死ぬことと見つけたり。」", "'Busido is found in death'");\r
5151 \r
5152                 if (cast)\r
5153                 {\r
5154                         int i;\r
5155                         if (!get_check(_("本当に自殺しますか?", "Do you really want to commit suicide? "))) return NULL;\r
5156                                 /* Special Verification for suicide */\r
5157                         prt(_("確認のため '@' を押して下さい。", "Please verify SUICIDE by typing the '@' sign: "), 0, 0);\r
5158         \r
5159                         flush();\r
5160                         i = inkey();\r
5161                         prt("", 0, 0);\r
5162                         if (i != '@') return NULL;\r
5163                         if (p_ptr->total_winner)\r
5164                         {\r
5165                                 take_hit(DAMAGE_FORCE, 9999, "Seppuku", -1);\r
5166                                 p_ptr->total_winner = TRUE;\r
5167                         }\r
5168                         else\r
5169                         {\r
5170                                 msg_print(_("武士道とは、死ぬことと見つけたり。", "Meaning of Bushi-do is found in the death."));\r
5171                                 take_hit(DAMAGE_FORCE, 9999, "Seppuku", -1);\r
5172                         }\r
5173                 }\r
5174                 break;\r
5175         }\r
5176 \r
5177         return "";\r
5178 }\r
5179 \r
5180 /*!\r
5181  * @brief 呪術領域の武器呪縛の対象にできる武器かどうかを返す。 / An "item_tester_hook" for offer\r
5182  * @param o_ptr オブジェクト構造体の参照ポインタ\r
5183  * @return 呪縛可能な武器ならばTRUEを返す\r
5184  */\r
5185 static bool item_tester_hook_weapon_except_bow(object_type *o_ptr)\r
5186 {\r
5187         switch (o_ptr->tval)\r
5188         {\r
5189                 case TV_SWORD:\r
5190                 case TV_HAFTED:\r
5191                 case TV_POLEARM:\r
5192                 case TV_DIGGING:\r
5193                 {\r
5194                         return (TRUE);\r
5195                 }\r
5196         }\r
5197 \r
5198         return (FALSE);\r
5199 }\r
5200 \r
5201 /*!\r
5202  * @brief 呪術領域の各処理に使える呪われた装備かどうかを返す。 / An "item_tester_hook" for offer\r
5203  * @param o_ptr オブジェクト構造体の参照ポインタ\r
5204  * @return 使える装備ならばTRUEを返す\r
5205  */\r
5206 static bool item_tester_hook_cursed(object_type *o_ptr)\r
5207 {\r
5208         return (bool)(object_is_cursed(o_ptr));\r
5209 }\r
5210 \r
5211 /*!\r
5212  * @brief 呪術領域魔法の各処理を行う\r
5213  * @param spell 魔法ID\r
5214  * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_INFO / SPELL_CAST / SPELL_CONT / SPELL_STOP)\r
5215  * @return SPELL_NAME / SPELL_DESC / SPELL_INFO 時には文字列ポインタを返す。SPELL_CAST / SPELL_CONT / SPELL_STOP 時はNULL文字列を返す。\r
5216  */\r
5217 static cptr do_hex_spell(SPELL_IDX spell, BIT_FLAGS mode)\r
5218 {\r
5219         bool name = (mode == SPELL_NAME) ? TRUE : FALSE;\r
5220         bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;\r
5221         bool info = (mode == SPELL_INFO) ? TRUE : FALSE;\r
5222         bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;\r
5223         bool cont = (mode == SPELL_CONT) ? TRUE : FALSE;\r
5224         bool stop = (mode == SPELL_STOP) ? TRUE : FALSE;\r
5225 \r
5226         bool add = TRUE;\r
5227 \r
5228         PLAYER_LEVEL plev = p_ptr->lev;\r
5229         HIT_POINT power;\r
5230 \r
5231         switch (spell)\r
5232         {\r
5233         /*** 1st book (0-7) ***/\r
5234         case 0:\r
5235                 if (name) return _("邪なる祝福", "Evily blessing");\r
5236                 if (desc) return _("祝福により攻撃精度と防御力が上がる。", "Attempts to increase +to_hit of a weapon and AC");\r
5237                 if (cast)\r
5238                 {\r
5239                         if (!p_ptr->blessed)\r
5240                         {\r
5241                                 msg_print(_("高潔な気分になった!", "You feel righteous!"));\r
5242                         }\r
5243                 }\r
5244                 if (stop)\r
5245                 {\r
5246                         if (!p_ptr->blessed)\r
5247                         {\r
5248                                 msg_print(_("高潔な気分が消え失せた。", "The prayer has expired."));\r
5249                         }\r
5250                 }\r
5251                 break;\r
5252 \r
5253         case 1:\r
5254                 if (name) return _("軽傷の治癒", "Cure light wounds");\r
5255                 if (desc) return _("HPや傷を少し回復させる。", "Heals cut and HP a little.");\r
5256                 if (info) return info_heal(1, 10, 0);\r
5257                 if (cast)\r
5258                 {\r
5259                         msg_print(_("気分が良くなってくる。", "You feel better and better."));\r
5260                 }\r
5261                 if (cast || cont)\r
5262                 {\r
5263                         hp_player(damroll(1, 10));\r
5264                         set_cut(p_ptr->cut - 10);\r
5265                 }\r
5266                 break;\r
5267 \r
5268         case 2:\r
5269                 if (name) return _("悪魔のオーラ", "Demonic aura");\r
5270                 if (desc) return _("炎のオーラを身にまとい、回復速度が速くなる。", "Gives fire aura and regeneration.");\r
5271                 if (cast)\r
5272                 {\r
5273                         msg_print(_("体が炎のオーラで覆われた。", "You have enveloped by fiery aura!"));\r
5274                 }\r
5275                 if (stop)\r
5276                 {\r
5277                         msg_print(_("炎のオーラが消え去った。", "Fiery aura disappeared."));\r
5278                 }\r
5279                 break;\r
5280 \r
5281         case 3:\r
5282                 if (name) return _("悪臭霧", "Stinking mist");\r
5283                 if (desc) return _("視界内のモンスターに微弱量の毒のダメージを与える。", "Deals few damages of poison to all monsters in your sight.");\r
5284                 power = plev / 2 + 5;\r
5285                 if (info) return info_damage(1, power, 0);\r
5286                 if (cast || cont)\r
5287                 {\r
5288                         project_hack(GF_POIS, randint1(power));\r
5289                 }\r
5290                 break;\r
5291 \r
5292         case 4:\r
5293                 if (name) return _("腕力強化", "Extra might");\r
5294                 if (desc) return _("術者の腕力を上昇させる。", "Attempts to increase your strength.");\r
5295                 if (cast)\r
5296                 {\r
5297                         msg_print(_("何だか力が湧いて来る。", "You feel you get stronger."));\r
5298                 }\r
5299                 break;\r
5300 \r
5301         case 5:\r
5302                 if (name) return _("武器呪縛", "Curse weapon");\r
5303                 if (desc) return _("装備している武器を呪う。", "Curses your weapon.");\r
5304                 if (cast)\r
5305                 {\r
5306                         OBJECT_IDX item;\r
5307                         cptr q, s;\r
5308                         char o_name[MAX_NLEN];\r
5309                         object_type *o_ptr;\r
5310                         u32b f[TR_FLAG_SIZE];\r
5311 \r
5312                         item_tester_hook = item_tester_hook_weapon_except_bow;\r
5313                         q = _("どれを呪いますか?", "Which weapon do you curse?");\r
5314                         s = _("武器を装備していない。", "You wield no weapons.");\r
5315 \r
5316                         if (!get_item(&item, q, s, (USE_EQUIP))) return FALSE;\r
5317 \r
5318                         o_ptr = &inventory[item];\r
5319                         object_desc(o_name, o_ptr, OD_NAME_ONLY);\r
5320                         object_flags(o_ptr, f);\r
5321 \r
5322                         if (!get_check(format(_("本当に %s を呪いますか?", "Do you curse %s, really?"), o_name))) return FALSE;\r
5323 \r
5324                         if (!one_in_(3) &&\r
5325                                 (object_is_artifact(o_ptr) || have_flag(f, TR_BLESSED)))\r
5326                         {\r
5327                                 msg_format(_("%s は呪いを跳ね返した。", "%s resists the effect."), o_name);\r
5328                                 if (one_in_(3))\r
5329                                 {\r
5330                                         if (o_ptr->to_d > 0)\r
5331                                         {\r
5332                                                 o_ptr->to_d -= randint1(3) % 2;\r
5333                                                 if (o_ptr->to_d < 0) o_ptr->to_d = 0;\r
5334                                         }\r
5335                                         if (o_ptr->to_h > 0)\r
5336                                         {\r
5337                                                 o_ptr->to_h -= randint1(3) % 2;\r
5338                                                 if (o_ptr->to_h < 0) o_ptr->to_h = 0;\r
5339                                         }\r
5340                                         if (o_ptr->to_a > 0)\r
5341                                         {\r
5342                                                 o_ptr->to_a -= randint1(3) % 2;\r
5343                                                 if (o_ptr->to_a < 0) o_ptr->to_a = 0;\r
5344                                         }\r
5345                                         msg_format(_("%s は劣化してしまった。", "Your %s was disenchanted!"), o_name);\r
5346                                 }\r
5347                         }\r
5348                         else\r
5349                         {\r
5350                                 int curse_rank = 0;\r
5351                                 msg_format(_("恐怖の暗黒オーラがあなたの%sを包み込んだ!", "A terrible black aura blasts your %s!"), o_name);\r
5352                                 o_ptr->curse_flags |= (TRC_CURSED);\r
5353 \r
5354                                 if (object_is_artifact(o_ptr) || object_is_ego(o_ptr))\r
5355                                 {\r
5356 \r
5357                                         if (one_in_(3)) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);\r
5358                                         if (one_in_(666))\r
5359                                         {\r
5360                                                 o_ptr->curse_flags |= (TRC_TY_CURSE);\r
5361                                                 if (one_in_(666)) o_ptr->curse_flags |= (TRC_PERMA_CURSE);\r
5362 \r
5363                                                 add_flag(o_ptr->art_flags, TR_AGGRAVATE);\r
5364                                                 add_flag(o_ptr->art_flags, TR_VORPAL);\r
5365                                                 add_flag(o_ptr->art_flags, TR_VAMPIRIC);\r
5366                                                 msg_print(_("血だ!血だ!血だ!", "Blood, Blood, Blood!"));\r
5367                                                 curse_rank = 2;\r
5368                                         }\r
5369                                 }\r
5370 \r
5371                                 o_ptr->curse_flags |= get_curse(curse_rank, o_ptr);\r
5372                         }\r
5373 \r
5374                         p_ptr->update |= (PU_BONUS);\r
5375                         add = FALSE;\r
5376                 }\r
5377                 break;\r
5378 \r
5379         case 6:\r
5380                 if (name) return _("邪悪感知", "Evil detection");\r
5381                 if (desc) return _("周囲の邪悪なモンスターを感知する。", "Detects evil monsters.");\r
5382                 if (info) return info_range(MAX_SIGHT);\r
5383                 if (cast)\r
5384                 {\r
5385                         msg_print(_("邪悪な生物の存在を感じ取ろうとした。", "You attend to the presence of evil creatures."));\r
5386                 }\r
5387                 break;\r
5388 \r
5389         case 7:\r
5390                 if (name) return _("我慢", "Patience");\r
5391                 if (desc) return _("数ターン攻撃を耐えた後、受けたダメージを地獄の業火として周囲に放出する。", \r
5392                         "Bursts hell fire strongly after patients any damage while few turns.");\r
5393                 power = MIN(200, (HEX_REVENGE_POWER(p_ptr) * 2));\r
5394                 if (info) return info_damage(0, 0, power);\r
5395                 if (cast)\r
5396                 {\r
5397                         int a = 3 - (p_ptr->pspeed - 100) / 10;\r
5398                         MAGIC_NUM2 r = 3 + randint1(3) + MAX(0, MIN(3, a));\r
5399 \r
5400                         if (HEX_REVENGE_TURN(p_ptr) > 0)\r
5401                         {\r
5402                                 msg_print(_("すでに我慢をしている。", "You are already patienting."));\r
5403                                 return NULL;\r
5404                         }\r
5405 \r
5406                         HEX_REVENGE_TYPE(p_ptr) = 1;\r
5407                         HEX_REVENGE_TURN(p_ptr) = r;\r
5408                         HEX_REVENGE_POWER(p_ptr) = 0;\r
5409                         msg_print(_("じっと耐えることにした。", "You decide to patient all damages."));\r
5410                         add = FALSE;\r
5411                 }\r
5412                 if (cont)\r
5413                 {\r
5414                         int rad = 2 + (power / 50);\r
5415 \r
5416                         HEX_REVENGE_TURN(p_ptr)--;\r
5417 \r
5418                         if ((HEX_REVENGE_TURN(p_ptr) <= 0) || (power >= 200))\r
5419                         {\r
5420                                 msg_print(_("我慢が解かれた!", "Time for end of patioence!"));\r
5421                                 if (power)\r
5422                                 {\r
5423                                         project(0, rad, p_ptr->y, p_ptr->x, power, GF_HELL_FIRE,\r
5424                                                 (PROJECT_STOP | PROJECT_GRID | PROJECT_ITEM | PROJECT_KILL), -1);\r
5425                                 }\r
5426                                 if (p_ptr->wizard)\r
5427                                 {\r
5428                                         msg_format(_("%d点のダメージを返した。", "You return %d damages."), power);\r
5429                                 }\r
5430 \r
5431                                 /* Reset */\r
5432                                 HEX_REVENGE_TYPE(p_ptr) = 0;\r
5433                                 HEX_REVENGE_TURN(p_ptr) = 0;\r
5434                                 HEX_REVENGE_POWER(p_ptr) = 0;\r
5435                         }\r
5436                 }\r
5437                 break;\r
5438 \r
5439         /*** 2nd book (8-15) ***/\r
5440         case 8:\r
5441                 if (name) return _("氷の鎧", "Ice armor");\r
5442                 if (desc) return _("氷のオーラを身にまとい、防御力が上昇する。", "Gives fire aura and bonus to AC.");\r
5443                 if (cast)\r
5444                 {\r
5445                         msg_print(_("体が氷の鎧で覆われた。", "You have enveloped by ice armor!"));\r
5446                 }\r
5447                 if (stop)\r
5448                 {\r
5449                         msg_print(_("氷の鎧が消え去った。", "Ice armor disappeared."));\r
5450                 }\r
5451                 break;\r
5452 \r
5453         case 9:\r
5454                 if (name) return _("重傷の治癒", "Cure serious wounds");\r
5455                 if (desc) return _("体力や傷を多少回復させる。", "Heals cut and HP more.");\r
5456                 if (info) return info_heal(2, 10, 0);\r
5457                 if (cast)\r
5458                 {\r
5459                         msg_print(_("気分が良くなってくる。", "You feel better and better."));\r
5460                 }\r
5461                 if (cast || cont)\r
5462                 {\r
5463                         hp_player(damroll(2, 10));\r
5464                         set_cut((p_ptr->cut / 2) - 10);\r
5465                 }\r
5466                 break;\r
5467 \r
5468         case 10:\r
5469                 if (name) return _("薬品吸入", "Inhail potion");\r
5470                 if (desc) return _("呪文詠唱を中止することなく、薬の効果を得ることができる。", "Quaffs a potion without canceling of casting a spell.");\r
5471                 if (cast)\r
5472                 {\r
5473                         CASTING_HEX_FLAGS(p_ptr) |= (1L << HEX_INHAIL);\r
5474                         do_cmd_quaff_potion();\r
5475                         CASTING_HEX_FLAGS(p_ptr) &= ~(1L << HEX_INHAIL);\r
5476                         add = FALSE;\r
5477                 }\r
5478                 break;\r
5479 \r
5480         case 11:\r
5481                 if (name) return _("衰弱の霧", "Hypodynamic mist");\r
5482                 if (desc) return _("視界内のモンスターに微弱量の衰弱属性のダメージを与える。", \r
5483                         "Deals few damages of hypodynamia to all monsters in your sight.");\r
5484                 power = (plev / 2) + 5;\r
5485                 if (info) return info_damage(1, power, 0);\r
5486                 if (cast || cont)\r
5487                 {\r
5488                         project_hack(GF_HYPODYNAMIA, randint1(power));\r
5489                 }\r
5490                 break;\r
5491 \r
5492         case 12:\r
5493                 if (name) return _("魔剣化", "Swords to runeswords");\r
5494                 if (desc) return _("武器の攻撃力を上げる。切れ味を得、呪いに応じて与えるダメージが上昇し、善良なモンスターに対するダメージが2倍になる。", \r
5495                         "Gives vorpal ability to your weapon. Increases damages by your weapon acccording to curse of your weapon.");\r
5496                 if (cast)\r
5497                 {\r
5498 #ifdef JP\r
5499                         msg_print("あなたの武器が黒く輝いた。");\r
5500 #else\r
5501                         if (!empty_hands(FALSE))\r
5502                                 msg_print("Your weapons glow bright black.");\r
5503                         else\r
5504                                 msg_print("Your weapon glows bright black.");\r
5505 #endif\r
5506                 }\r
5507                 if (stop)\r
5508                 {\r
5509 #ifdef JP\r
5510                         msg_print("武器の輝きが消え去った。");\r
5511 #else\r
5512                         msg_format("Brightness of weapon%s disappeared.", (empty_hands(FALSE)) ? "" : "s");\r
5513 #endif\r
5514                 }\r
5515                 break;\r
5516 \r
5517         case 13:\r
5518                 if (name) return _("混乱の手", "Touch of confusion");\r
5519                 if (desc) return _("攻撃した際モンスターを混乱させる。", "Confuses a monster when you attack.");\r
5520                 if (cast)\r
5521                 {\r
5522                         msg_print(_("あなたの手が赤く輝き始めた。", "Your hands glow bright red."));\r
5523                 }\r
5524                 if (stop)\r
5525                 {\r
5526                         msg_print(_("手の輝きがなくなった。", "Brightness on your hands disappeard."));\r
5527                 }\r
5528                 break;\r
5529 \r
5530         case 14:\r
5531                 if (name) return _("肉体強化", "Building up");\r
5532                 if (desc) return _("術者の腕力、器用さ、耐久力を上昇させる。攻撃回数の上限を 1 増加させる。", \r
5533                         "Attempts to increases your strength, dexterity and constitusion.");\r
5534                 if (cast)\r
5535                 {\r
5536                         msg_print(_("身体が強くなった気がした。", "You feel your body is developed more now."));\r
5537                 }\r
5538                 break;\r
5539 \r
5540         case 15:\r
5541                 if (name) return _("反テレポート結界", "Anti teleport barrier");\r
5542                 if (desc) return _("視界内のモンスターのテレポートを阻害するバリアを張る。", "Obstructs all teleportations by monsters in your sight.");\r
5543                 power = plev * 3 / 2;\r
5544                 if (info) return info_power(power);\r
5545                 if (cast)\r
5546                 {\r
5547                         msg_print(_("テレポートを防ぐ呪いをかけた。", "You feel anyone can not teleport except you."));\r
5548                 }\r
5549                 break;\r
5550 \r
5551         /*** 3rd book (16-23) ***/\r
5552         case 16:\r
5553                 if (name) return _("衝撃のクローク", "Cloak of shock");\r
5554                 if (desc) return _("電気のオーラを身にまとい、動きが速くなる。", "Gives lightning aura and a bonus to speed.");\r
5555                 if (cast)\r
5556                 {\r
5557                         msg_print(_("体が稲妻のオーラで覆われた。", "You have enveloped by electrical aura!"));\r
5558                 }\r
5559                 if (stop)\r
5560                 {\r
5561                         msg_print(_("稲妻のオーラが消え去った。", "Electrical aura disappeared."));\r
5562                 }\r
5563                 break;\r
5564 \r
5565         case 17:\r
5566                 if (name) return _("致命傷の治癒", "Cure critical wounds");\r
5567                 if (desc) return _("体力や傷を回復させる。", "Heals cut and HP greatry.");\r
5568                 if (info) return info_heal(4, 10, 0);\r
5569                 if (cast)\r
5570                 {\r
5571                         msg_print(_("気分が良くなってくる。", "You feel better and better."));\r
5572                 }\r
5573                 if (cast || cont)\r
5574                 {\r
5575                         hp_player(damroll(4, 10));\r
5576                         set_stun(0);\r
5577                         set_cut(0);\r
5578                         set_poisoned(0);\r
5579                 }\r
5580                 break;\r
5581 \r
5582         case 18:\r
5583                 if (name) return _("呪力封入", "Recharging");\r
5584                 if (desc) return _("魔法の道具に魔力を再充填する。", "Recharges a magic device.");\r
5585                 power = plev * 2;\r
5586                 if (info) return info_power(power);\r
5587                 if (cast)\r
5588                 {\r
5589                         if (!recharge(power)) return NULL;\r
5590                         add = FALSE;\r
5591                 }\r
5592                 break;\r
5593 \r
5594         case 19:\r
5595                 if (name) return _("死者復活", "Animate Dead");\r
5596                 if (desc) return _("死体を蘇らせてペットにする。", "Raises corpses and skeletons from dead.");\r
5597                 if (cast)\r
5598                 {\r
5599                         msg_print(_("死者への呼びかけを始めた。", "You start to call deads.!"));\r
5600                 }\r
5601                 if (cast || cont)\r
5602                 {\r
5603                         animate_dead(0, p_ptr->y, p_ptr->x);\r
5604                 }\r
5605                 break;\r
5606 \r
5607         case 20:\r
5608                 if (name) return _("防具呪縛", "Curse armor");\r
5609                 if (desc) return _("装備している防具に呪いをかける。", "Curse a piece of armour that you wielding.");\r
5610                 if (cast)\r
5611                 {\r
5612                         OBJECT_IDX item;\r
5613                         cptr q, s;\r
5614                         char o_name[MAX_NLEN];\r
5615                         object_type *o_ptr;\r
5616                         u32b f[TR_FLAG_SIZE];\r
5617 \r
5618                         item_tester_hook = object_is_armour;\r
5619                         q = _("どれを呪いますか?", "Which piece of armour do you curse?");\r
5620                         s = _("防具を装備していない。", "You wield no piece of armours.");\r
5621 \r
5622                         if (!get_item(&item, q, s, (USE_EQUIP))) return FALSE;\r
5623 \r
5624                         o_ptr = &inventory[item];\r
5625                         object_desc(o_name, o_ptr, OD_NAME_ONLY);\r
5626                         object_flags(o_ptr, f);\r
5627 \r
5628                         if (!get_check(format(_("本当に %s を呪いますか?", "Do you curse %s, really?"), o_name))) return FALSE;\r
5629 \r
5630                         if (!one_in_(3) &&\r
5631                                 (object_is_artifact(o_ptr) || have_flag(f, TR_BLESSED)))\r
5632                         {\r
5633                                 msg_format(_("%s は呪いを跳ね返した。", "%s resists the effect."), o_name);\r
5634                                 if (one_in_(3))\r
5635                                 {\r
5636                                         if (o_ptr->to_d > 0)\r
5637                                         {\r
5638                                                 o_ptr->to_d -= randint1(3) % 2;\r
5639                                                 if (o_ptr->to_d < 0) o_ptr->to_d = 0;\r
5640                                         }\r
5641                                         if (o_ptr->to_h > 0)\r
5642                                         {\r
5643                                                 o_ptr->to_h -= randint1(3) % 2;\r
5644                                                 if (o_ptr->to_h < 0) o_ptr->to_h = 0;\r
5645                                         }\r
5646                                         if (o_ptr->to_a > 0)\r
5647                                         {\r
5648                                                 o_ptr->to_a -= randint1(3) % 2;\r
5649                                                 if (o_ptr->to_a < 0) o_ptr->to_a = 0;\r
5650                                         }\r
5651                                         msg_format(_("%s は劣化してしまった。", "Your %s was disenchanted!"), o_name);\r
5652                                 }\r
5653                         }\r
5654                         else\r
5655                         {\r
5656                                 int curse_rank = 0;\r
5657                                 msg_format(_("恐怖の暗黒オーラがあなたの%sを包み込んだ!", "A terrible black aura blasts your %s!"), o_name);\r
5658                                 o_ptr->curse_flags |= (TRC_CURSED);\r
5659 \r
5660                                 if (object_is_artifact(o_ptr) || object_is_ego(o_ptr))\r
5661                                 {\r
5662 \r
5663                                         if (one_in_(3)) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);\r
5664                                         if (one_in_(666))\r
5665                                         {\r
5666                                                 o_ptr->curse_flags |= (TRC_TY_CURSE);\r
5667                                                 if (one_in_(666)) o_ptr->curse_flags |= (TRC_PERMA_CURSE);\r
5668 \r
5669                                                 add_flag(o_ptr->art_flags, TR_AGGRAVATE);\r
5670                                                 add_flag(o_ptr->art_flags, TR_RES_POIS);\r
5671                                                 add_flag(o_ptr->art_flags, TR_RES_DARK);\r
5672                                                 add_flag(o_ptr->art_flags, TR_RES_NETHER);\r
5673                                                 msg_print(_("血だ!血だ!血だ!", "Blood, Blood, Blood!"));\r
5674                                                 curse_rank = 2;\r
5675                                         }\r
5676                                 }\r
5677 \r
5678                                 o_ptr->curse_flags |= get_curse(curse_rank, o_ptr);\r
5679                         }\r
5680 \r
5681                         p_ptr->update |= (PU_BONUS);\r
5682                         add = FALSE;\r
5683                 }\r
5684                 break;\r
5685 \r
5686         case 21:\r
5687                 if (name) return _("影のクローク", "Cloak of shadow");\r
5688                 if (desc) return _("影のオーラを身にまとい、敵に影のダメージを与える。", "Gives aura of shadow.");\r
5689                 if (cast)\r
5690                 {\r
5691                         object_type *o_ptr = &inventory[INVEN_OUTER];\r
5692 \r
5693                         if (!o_ptr->k_idx)\r
5694                         {\r
5695                                 msg_print(_("クロークを身につけていない!", "You don't ware any cloak."));\r
5696                                 return NULL;\r
5697                         }\r
5698                         else if (!object_is_cursed(o_ptr))\r
5699                         {\r
5700                                 msg_print(_("クロークは呪われていない!", "Your cloak is not cursed."));\r
5701                                 return NULL;\r
5702                         }\r
5703                         else\r
5704                         {\r
5705                                 msg_print(_("影のオーラを身にまとった。", "You have enveloped by shadow aura!"));\r
5706                         }\r
5707                 }\r
5708                 if (cont)\r
5709                 {\r
5710                         object_type *o_ptr = &inventory[INVEN_OUTER];\r
5711 \r
5712                         if ((!o_ptr->k_idx) || (!object_is_cursed(o_ptr)))\r
5713                         {\r
5714                                 do_spell(REALM_HEX, spell, SPELL_STOP);\r
5715                                 CASTING_HEX_FLAGS(p_ptr) &= ~(1L << spell);\r
5716                                 CASTING_HEX_NUM(p_ptr)--;\r
5717                                 if (!SINGING_SONG_ID(p_ptr)) set_action(ACTION_NONE);\r
5718                         }\r
5719                 }\r
5720                 if (stop)\r
5721                 {\r
5722                         msg_print(_("影のオーラが消え去った。", "Shadow aura disappeared."));\r
5723                 }\r
5724                 break;\r
5725 \r
5726         case 22:\r
5727                 if (name) return _("苦痛を魔力に", "Pains to mana");\r
5728                 if (desc) return _("視界内のモンスターに精神ダメージ与え、魔力を吸い取る。", "Deals psychic damages to all monsters in sight, and drains some mana.");\r
5729                 power = plev * 3 / 2;\r
5730                 if (info) return info_damage(1, power, 0);\r
5731                 if (cast || cont)\r
5732                 {\r
5733                         project_hack(GF_PSI_DRAIN, randint1(power));\r
5734                 }\r
5735                 break;\r
5736 \r
5737         case 23:\r
5738                 if (name) return _("目には目を", "Eye for an eye");\r
5739                 if (desc) return _("打撃や魔法で受けたダメージを、攻撃元のモンスターにも与える。", "Returns same damage which you got to the monster which damaged you.");\r
5740                 if (cast)\r
5741                 {\r
5742                         msg_print(_("復讐したい欲望にかられた。", "You wish strongly you want to revenge anything."));\r
5743                 }\r
5744                 break;\r
5745 \r
5746         /*** 4th book (24-31) ***/\r
5747         case 24:\r
5748                 if (name) return _("反増殖結界", "Anti multiply barrier");\r
5749                 if (desc) return _("その階の増殖するモンスターの増殖を阻止する。", "Obstructs all multiplying by monsters in entire floor.");\r
5750                 if (cast)\r
5751                 {\r
5752                         msg_print(_("増殖を阻止する呪いをかけた。", "You feel anyone can not already multiply."));\r
5753                 }\r
5754                 break;\r
5755 \r
5756         case 25:\r
5757                 if (name) return _("全復活", "Restoration");\r
5758                 if (desc) return _("経験値を徐々に復活し、減少した能力値を回復させる。", "Restores experience and status.");\r
5759                 if (cast)\r
5760                 {\r
5761                         msg_print(_("体が元の活力を取り戻し始めた。", "You feel your lost status starting to return."));\r
5762                 }\r
5763                 if (cast || cont)\r
5764                 {\r
5765                         bool flag = FALSE;\r
5766                         int d = (p_ptr->max_exp - p_ptr->exp);\r
5767                         int r = (p_ptr->exp / 20);\r
5768                         int i;\r
5769 \r
5770                         if (d > 0)\r
5771                         {\r
5772                                 if (d < r)\r
5773                                         p_ptr->exp = p_ptr->max_exp;\r
5774                                 else\r
5775                                         p_ptr->exp += r;\r
5776 \r
5777                                 /* Check the experience */\r
5778                                 check_experience();\r
5779 \r
5780                                 flag = TRUE;\r
5781                         }\r
5782                         for (i = A_STR; i < 6; i ++)\r
5783                         {\r
5784                                 if (p_ptr->stat_cur[i] < p_ptr->stat_max[i])\r
5785                                 {\r
5786                                         if (p_ptr->stat_cur[i] < 18)\r
5787                                                 p_ptr->stat_cur[i]++;\r
5788                                         else\r
5789                                                 p_ptr->stat_cur[i] += 10;\r
5790 \r
5791                                         if (p_ptr->stat_cur[i] > p_ptr->stat_max[i])\r
5792                                                 p_ptr->stat_cur[i] = p_ptr->stat_max[i];\r
5793 \r
5794                                         /* Recalculate bonuses */\r
5795                                         p_ptr->update |= (PU_BONUS);\r
5796 \r
5797                                         flag = TRUE;\r
5798                                 }\r
5799                         }\r
5800 \r
5801                         if (!flag)\r
5802                         {\r
5803                                 msg_format(_("%sの呪文の詠唱をやめた。", "Finish casting '%^s'."), do_spell(REALM_HEX, HEX_RESTORE, SPELL_NAME));\r
5804                                 CASTING_HEX_FLAGS(p_ptr) &= ~(1L << HEX_RESTORE);\r
5805                                 if (cont) CASTING_HEX_NUM(p_ptr)--;\r
5806                                 if (CASTING_HEX_NUM(p_ptr)) p_ptr->action = ACTION_NONE;\r
5807 \r
5808                                 /* Redraw status */\r
5809                                 p_ptr->update |= (PU_BONUS | PU_HP | PU_MANA | PU_SPELLS);\r
5810                                 p_ptr->redraw |= (PR_EXTRA);\r
5811 \r
5812                                 return "";\r
5813                         }\r
5814                 }\r
5815                 break;\r
5816 \r
5817         case 26:\r
5818                 if (name) return _("呪力吸収", "Drain curse power");\r
5819                 if (desc) return _("呪われた武器の呪いを吸収して魔力を回復する。", "Drains curse on your weapon and heals SP a little.");\r
5820                 if (cast)\r
5821                 {\r
5822                         OBJECT_IDX item;\r
5823                         cptr s, q;\r
5824                         u32b f[TR_FLAG_SIZE];\r
5825                         object_type *o_ptr;\r
5826 \r
5827                         item_tester_hook = item_tester_hook_cursed;\r
5828                         q = _("どの装備品から吸収しますか?", "Which cursed equipment do you drain mana from?");\r
5829                         s = _("呪われたアイテムを装備していない。", "You have no cursed equipment.");\r
5830 \r
5831                         if (!get_item(&item, q, s, (USE_EQUIP))) return FALSE;\r
5832 \r
5833                         o_ptr = &inventory[item];\r
5834                         object_flags(o_ptr, f);\r
5835 \r
5836                         p_ptr->csp += (p_ptr->lev / 5) + randint1(p_ptr->lev / 5);\r
5837                         if (have_flag(f, TR_TY_CURSE) || (o_ptr->curse_flags & TRC_TY_CURSE)) p_ptr->csp += randint1(5);\r
5838                         if (p_ptr->csp > p_ptr->msp) p_ptr->csp = p_ptr->msp;\r
5839 \r
5840                         if (o_ptr->curse_flags & TRC_PERMA_CURSE)\r
5841                         {\r
5842                                 /* Nothing */\r
5843                         }\r
5844                         else if (o_ptr->curse_flags & TRC_HEAVY_CURSE)\r
5845                         {\r
5846                                 if (one_in_(7))\r
5847                                 {\r
5848                                         msg_print(_("呪いを全て吸い取った。", "Heavy curse vanished away."));\r
5849                                         o_ptr->curse_flags = 0L;\r
5850                                 }\r
5851                         }\r
5852                         else if ((o_ptr->curse_flags & (TRC_CURSED)) && one_in_(3))\r
5853                         {\r
5854                                 msg_print(_("呪いを全て吸い取った。", "Curse vanished away."));\r
5855                                 o_ptr->curse_flags = 0L;\r
5856                         }\r
5857 \r
5858                         add = FALSE;\r
5859                 }\r
5860                 break;\r
5861 \r
5862         case 27:\r
5863                 if (name) return _("吸血の刃", "Swords to vampires");\r
5864                 if (desc) return _("吸血属性で攻撃する。", "Gives vampiric ability to your weapon.");\r
5865                 if (cast)\r
5866                 {\r
5867 #ifdef JP\r
5868                         msg_print("あなたの武器が血を欲している。");\r
5869 #else\r
5870                         if (!empty_hands(FALSE))\r
5871                                 msg_print("Your weapons want more blood now.");\r
5872                         else\r
5873                                 msg_print("Your weapon wants more blood now.");\r
5874 #endif\r
5875                 }\r
5876                 if (stop)\r
5877                 {\r
5878 #ifdef JP\r
5879                         msg_print("武器の渇望が消え去った。");\r
5880 #else\r
5881                         msg_format("Thirsty of weapon%s disappeared.", (empty_hands(FALSE)) ? "" : "s");\r
5882 #endif\r
5883                 }\r
5884                 break;\r
5885 \r
5886         case 28:\r
5887                 if (name) return _("朦朧の言葉", "Word of stun");\r
5888                 if (desc) return _("視界内のモンスターを朦朧とさせる。", "Stuns all monsters in your sight.");\r
5889                 power = plev * 4;\r
5890                 if (info) return info_power(power);\r
5891                 if (cast || cont)\r
5892                 {\r
5893                         stun_monsters(power);\r
5894                 }\r
5895                 break;\r
5896 \r
5897         case 29:\r
5898                 if (name) return _("影移動", "Moving into shadow");\r
5899                 if (desc) return _("モンスターの隣のマスに瞬間移動する。", "Teleports you close to a monster.");\r
5900                 if (cast)\r
5901                 {\r
5902                         int i, dir;\r
5903                         POSITION y, x;\r
5904                         bool flag;\r
5905 \r
5906                         for (i = 0; i < 3; i++)\r
5907                         {\r
5908                                 if (!tgt_pt(&x, &y)) return FALSE;\r
5909 \r
5910                                 flag = FALSE;\r
5911 \r
5912                                 for (dir = 0; dir < 8; dir++)\r
5913                                 {\r
5914                                         int dy = y + ddy_ddd[dir];\r
5915                                         int dx = x + ddx_ddd[dir];\r
5916                                         if (dir == 5) continue;\r
5917                                         if(cave[dy][dx].m_idx) flag = TRUE;\r
5918                                 }\r
5919 \r
5920                                 if (!cave_empty_bold(y, x) || (cave[y][x].info & CAVE_ICKY) ||\r
5921                                         (distance(y, x, p_ptr->y, p_ptr->x) > plev + 2))\r
5922                                 {\r
5923                                         msg_print(_("そこには移動できない。", "Can not teleport to there."));\r
5924                                         continue;\r
5925                                 }\r
5926                                 break;\r
5927                         }\r
5928 \r
5929                         if (flag && randint0(plev * plev / 2))\r
5930                         {\r
5931                                 teleport_player_to(y, x, 0L);\r
5932                         }\r
5933                         else\r
5934                         {\r
5935                                 msg_print(_("おっと!", "Oops!"));\r
5936                                 teleport_player(30, 0L);\r
5937                         }\r
5938 \r
5939                         add = FALSE;\r
5940                 }\r
5941                 break;\r
5942 \r
5943         case 30:\r
5944                 if (name) return _("反魔法結界", "Anti magic barrier");\r
5945                 if (desc) return _("視界内のモンスターの魔法を阻害するバリアを張る。", "Obstructs all magic spell of monsters in your sight.");\r
5946                 power = plev * 3 / 2;\r
5947                 if (info) return info_power(power);\r
5948                 if (cast)\r
5949                 {\r
5950                         msg_print(_("魔法を防ぐ呪いをかけた。", "You feel anyone can not cast spells except you."));\r
5951                 }\r
5952                 break;\r
5953 \r
5954         case 31:\r
5955                 if (name) return _("復讐の宣告", "Revenge sentence");\r
5956                 if (desc) return _("数ターン後にそれまで受けたダメージに応じた威力の地獄の劫火の弾を放つ。", \r
5957                         "Fires  a ball of hell fire to try revenging after few turns.");\r
5958                 power = HEX_REVENGE_POWER(p_ptr);\r
5959                 if (info) return info_damage(0, 0, power);\r
5960                 if (cast)\r
5961                 {\r
5962                         MAGIC_NUM2 r;\r
5963                         int a = 3 - (p_ptr->pspeed - 100) / 10;\r
5964                         r = 1 + randint1(2) + MAX(0, MIN(3, a));\r
5965 \r
5966                         if (HEX_REVENGE_TURN(p_ptr) > 0)\r
5967                         {\r
5968                                 msg_print(_("すでに復讐は宣告済みだ。", "You already pronounced your revenge."));\r
5969                                 return NULL;\r
5970                         }\r
5971 \r
5972                         HEX_REVENGE_TYPE(p_ptr) = 2;\r
5973                         HEX_REVENGE_TURN(p_ptr) = r;\r
5974                         msg_format(_("あなたは復讐を宣告した。あと %d ターン。", "You pronounce your revenge. %d turns left."), r);\r
5975                         add = FALSE;\r
5976                 }\r
5977                 if (cont)\r
5978                 {\r
5979                         HEX_REVENGE_TURN(p_ptr)--;\r
5980 \r
5981                         if (HEX_REVENGE_TURN(p_ptr) <= 0)\r
5982                         {\r
5983                                 int dir;\r
5984 \r
5985                                 if (power)\r
5986                                 {\r
5987                                         command_dir = 0;\r
5988 \r
5989                                         do\r
5990                                         {\r
5991                                                 msg_print(_("復讐の時だ!", "Time to revenge!"));\r
5992                                         }\r
5993                                         while (!get_aim_dir(&dir));\r
5994 \r
5995                                         fire_ball(GF_HELL_FIRE, dir, power, 1);\r
5996 \r
5997                                         if (p_ptr->wizard)\r
5998                                         {\r
5999                                                 msg_format(_("%d点のダメージを返した。", "You return %d damages."), power);\r
6000                                         }\r
6001                                 }\r
6002                                 else\r
6003                                 {\r
6004                                         msg_print(_("復讐する気が失せた。", "You are not a mood to revenge."));\r
6005                                 }\r
6006                                 HEX_REVENGE_POWER(p_ptr) = 0;\r
6007                         }\r
6008                 }\r
6009                 break;\r
6010         }\r
6011 \r
6012         /* start casting */\r
6013         if ((cast) && (add))\r
6014         {\r
6015                 /* add spell */\r
6016                 CASTING_HEX_FLAGS(p_ptr) |= 1L << (spell);\r
6017                 CASTING_HEX_NUM(p_ptr)++;\r
6018 \r
6019                 if (p_ptr->action != ACTION_SPELL) set_action(ACTION_SPELL);\r
6020         }\r
6021 \r
6022         /* Redraw status */\r
6023         if (!info)\r
6024         {\r
6025                 p_ptr->update |= (PU_BONUS | PU_HP | PU_MANA | PU_SPELLS);\r
6026                 p_ptr->redraw |= (PR_EXTRA | PR_HP | PR_MANA);\r
6027         }\r
6028 \r
6029         return "";\r
6030 }\r
6031 \r
6032 \r
6033 /*!\r
6034  * @brief 魔法処理のメインルーチン\r
6035  * @param realm 魔法領域のID\r
6036  * @param spell 各領域の魔法ID\r
6037  * @param mode 求める処理\r
6038  * @return 各領域魔法に各種テキストを求めた場合は文字列参照ポインタ、そうでない場合はNULLポインタを返す。\r
6039  */\r
6040 cptr do_spell(REALM_IDX realm, SPELL_IDX spell, BIT_FLAGS mode)\r
6041 {\r
6042         switch (realm)\r
6043         {\r
6044         case REALM_LIFE:     return do_life_spell(spell, mode);\r
6045         case REALM_SORCERY:  return do_sorcery_spell(spell, mode);\r
6046         case REALM_NATURE:   return do_nature_spell(spell, mode);\r
6047         case REALM_CHAOS:    return do_chaos_spell(spell, mode);\r
6048         case REALM_DEATH:    return do_death_spell(spell, mode);\r
6049         case REALM_TRUMP:    return do_trump_spell(spell, mode);\r
6050         case REALM_ARCANE:   return do_arcane_spell(spell, mode);\r
6051         case REALM_CRAFT:    return do_craft_spell(spell, mode);\r
6052         case REALM_DAEMON:   return do_daemon_spell(spell, mode);\r
6053         case REALM_CRUSADE:  return do_crusade_spell(spell, mode);\r
6054         case REALM_MUSIC:    return do_music_spell(spell, mode);\r
6055         case REALM_HISSATSU: return do_hissatsu_spell(spell, mode);\r
6056         case REALM_HEX:      return do_hex_spell(spell, mode);\r
6057         }\r
6058 \r
6059         return NULL;\r
6060 }\r