OSDN Git Service

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