OSDN Git Service

[Refactor] #37353 コメント整理 / Refactor comments.
[hengband/hengband.git] / src / realm-hex.c
1 /*!
2  * @file hex.c
3  * @brief 呪術の処理実装 / Hex code
4  * @date 2014/01/14
5  * @author
6  * 2014 Deskull rearranged comment for Doxygen.\n
7  * @details
8  * p_ptr-magic_num1\n
9  * 0: Flag bits of spelling spells\n
10  * 1: Flag bits of despelled spells\n
11  * 2: Revange damage\n
12  * p_ptr->magic_num2\n
13  * 0: Number of spelling spells\n
14  * 1: Type of revenge\n
15  * 2: Turn count for revenge\n
16  */
17
18 #include "angband.h"
19 #include "cmd-spell.h"
20 #include "cmd-quaff.h"
21 #include "object-hook.h"
22 #include "object-curse.h"
23
24 #define MAX_KEEP 4 /*!<呪術の最大詠唱数 */
25
26 /*!
27  * @brief プレイヤーが詠唱中の全呪術を停止する
28  * @return なし
29  */
30 bool stop_hex_spell_all(void)
31 {
32         int i;
33
34         for (i = 0; i < 32; i++)
35         {
36                 if (hex_spelling(i)) do_spell(REALM_HEX, i, SPELL_STOP);
37         }
38
39         CASTING_HEX_FLAGS(p_ptr) = 0;
40         CASTING_HEX_NUM(p_ptr) = 0;
41
42         /* Print message */
43         if (p_ptr->action == ACTION_SPELL) set_action(ACTION_NONE);
44
45         /* Redraw status */
46         p_ptr->update |= (PU_BONUS | PU_HP | PU_MANA | PU_SPELLS);
47         p_ptr->redraw |= (PR_EXTRA | PR_HP | PR_MANA);
48
49         return TRUE;
50 }
51
52 /*!
53  * @brief プレイヤーが詠唱中の呪術から一つを選んで停止する
54  * @return なし
55  */
56 bool stop_hex_spell(void)
57 {
58         int spell;
59         char choice;
60         char out_val[160];
61         bool flag = FALSE;
62         TERM_LEN y = 1;
63         TERM_LEN x = 20;
64         int sp[MAX_KEEP];
65
66         if (!hex_spelling_any())
67         {
68                 msg_print(_("呪文を詠唱していません。", "You are casting no spell."));
69                 return FALSE;
70         }
71
72         /* Stop all spells */
73         else if ((CASTING_HEX_NUM(p_ptr) == 1) || (p_ptr->lev < 35))
74         {
75                 return stop_hex_spell_all();
76         }
77         else
78         {
79 #ifdef JP
80                 strnfmt(out_val, 78, "どの呪文の詠唱を中断しますか?(呪文 %c-%c, 'l'全て, ESC)",
81                         I2A(0), I2A(CASTING_HEX_NUM(p_ptr) - 1));
82 #else
83                 strnfmt(out_val, 78, "Which spell do you stop casting? (Spell %c-%c, 'l' to all, ESC)",
84                         I2A(0), I2A(CASTING_HEX_NUM(p_ptr) - 1));
85 #endif
86
87                 screen_save();
88
89                 while (!flag)
90                 {
91                         int n = 0;
92                         Term_erase(x, y, 255);
93                         prt("     名前", y, x + 5);
94                         for (spell = 0; spell < 32; spell++)
95                         {
96                                 if (hex_spelling(spell))
97                                 {
98                                         Term_erase(x, y + n + 1, 255);
99                                         put_str(format("%c)  %s", I2A(n), do_spell(REALM_HEX, spell, SPELL_NAME)), y + n + 1, x + 2);
100                                         sp[n++] = spell;
101                                 }
102                         }
103
104                         if (!get_com(out_val, &choice, TRUE)) break;
105                         if (isupper(choice)) choice = (char)tolower(choice);
106
107                         if (choice == 'l')      /* All */
108                         {
109                                 screen_load();
110                                 return stop_hex_spell_all();
111                         }
112                         if ((choice < I2A(0)) || (choice > I2A(CASTING_HEX_NUM(p_ptr) - 1))) continue;
113                         flag = TRUE;
114                 }
115         }
116
117         screen_load();
118
119         if (flag)
120         {
121                 int n = sp[A2I(choice)];
122
123                 do_spell(REALM_HEX, n, SPELL_STOP);
124                 CASTING_HEX_FLAGS(p_ptr) &= ~(1L << n);
125                 CASTING_HEX_NUM(p_ptr)--;
126         }
127
128         /* Redraw status */
129         p_ptr->update |= (PU_BONUS | PU_HP | PU_MANA | PU_SPELLS);
130         p_ptr->redraw |= (PR_EXTRA | PR_HP | PR_MANA);
131
132         return flag;
133 }
134
135
136 /*!
137  * @brief 一定時間毎に呪術で消費するMPを処理する /
138  * Upkeeping hex spells Called from dungeon.c
139  * @return なし
140  */
141 void check_hex(void)
142 {
143         int spell;
144         s32b need_mana;
145         u32b need_mana_frac;
146         bool res = FALSE;
147
148         /* Spells spelled by player */
149         if (p_ptr->realm1 != REALM_HEX) return;
150         if (!CASTING_HEX_FLAGS(p_ptr) && !p_ptr->magic_num1[1]) return;
151
152         if (p_ptr->magic_num1[1])
153         {
154                 p_ptr->magic_num1[0] = p_ptr->magic_num1[1];
155                 p_ptr->magic_num1[1] = 0;
156                 res = TRUE;
157         }
158
159         /* Stop all spells when anti-magic ability is given */
160         if (p_ptr->anti_magic)
161         {
162                 stop_hex_spell_all();
163                 return;
164         }
165
166         need_mana = 0;
167         for (spell = 0; spell < 32; spell++)
168         {
169                 if (hex_spelling(spell))
170                 {
171                         const magic_type *s_ptr;
172                         s_ptr = &technic_info[REALM_HEX - MIN_TECHNIC][spell];
173                         need_mana += mod_need_mana(s_ptr->smana, spell, REALM_HEX);
174                 }
175         }
176
177
178         /* Culcurates final mana cost */
179         need_mana_frac = 0;
180         s64b_div(&need_mana, &need_mana_frac, 0, 3); /* Divide by 3 */
181         need_mana += (CASTING_HEX_NUM(p_ptr) - 1);
182
183
184         /* Not enough mana */
185         if (s64b_cmp(p_ptr->csp, p_ptr->csp_frac, need_mana, need_mana_frac) < 0)
186         {
187                 stop_hex_spell_all();
188                 return;
189         }
190
191         /* Enough mana */
192         else
193         {
194                 s64b_sub(&(p_ptr->csp), &(p_ptr->csp_frac), need_mana, need_mana_frac);
195
196                 p_ptr->redraw |= PR_MANA;
197                 if (res)
198                 {
199 #ifdef JP
200                         msg_print("詠唱を再開した。");
201 #else
202                         msg_print("You restart spelling.");
203 #endif
204                         p_ptr->action = ACTION_SPELL;
205
206                         /* Recalculate bonuses */
207                         p_ptr->update |= (PU_BONUS | PU_HP);
208
209                         /* Redraw map and status bar */
210                         p_ptr->redraw |= (PR_MAP | PR_STATUS | PR_STATE);
211
212                         /* Update monsters */
213                         p_ptr->update |= (PU_MONSTERS);
214
215                         p_ptr->window |= (PW_OVERHEAD | PW_DUNGEON);
216                 }
217         }
218
219         /* Gain experiences of spelling spells */
220         for (spell = 0; spell < 32; spell++)
221         {
222                 const magic_type *s_ptr;
223
224                 if (!hex_spelling(spell)) continue;
225
226                 s_ptr = &technic_info[REALM_HEX - MIN_TECHNIC][spell];
227
228                 if (p_ptr->spell_exp[spell] < SPELL_EXP_BEGINNER)
229                         p_ptr->spell_exp[spell] += 5;
230                 else if(p_ptr->spell_exp[spell] < SPELL_EXP_SKILLED)
231                 { if (one_in_(2) && (dun_level > 4) && ((dun_level + 10) > p_ptr->lev)) p_ptr->spell_exp[spell] += 1; }
232                 else if(p_ptr->spell_exp[spell] < SPELL_EXP_EXPERT)
233                 { if (one_in_(5) && ((dun_level + 5) > p_ptr->lev) && ((dun_level + 5) > s_ptr->slevel)) p_ptr->spell_exp[spell] += 1; }
234                 else if(p_ptr->spell_exp[spell] < SPELL_EXP_MASTER)
235                 { if (one_in_(5) && ((dun_level + 5) > p_ptr->lev) && (dun_level > s_ptr->slevel)) p_ptr->spell_exp[spell] += 1; }
236         }
237
238         /* Do any effects of continual spells */
239         for (spell = 0; spell < 32; spell++)
240         {
241                 if (hex_spelling(spell))
242                 {
243                         do_spell(REALM_HEX, spell, SPELL_CONT);
244                 }
245         }
246 }
247
248 /*!
249  * @brief プレイヤーの呪術詠唱枠がすでに最大かどうかを返す
250  * @return すでに全枠を利用しているならTRUEを返す
251  */
252 bool hex_spell_fully(void)
253 {
254         int k_max = 0;
255
256         k_max = (p_ptr->lev / 15) + 1;
257
258         /* Paranoia */
259         k_max = MIN(k_max, MAX_KEEP);
260
261         if (CASTING_HEX_NUM(p_ptr) < k_max) return FALSE;
262
263         return TRUE;
264 }
265
266 /*!
267  * @brief 一定ゲームターン毎に復讐処理の残り期間の判定を行う
268  * @return なし
269  */
270 void revenge_spell(void)
271 {
272         if (p_ptr->realm1 != REALM_HEX) return;
273         if (HEX_REVENGE_TURN(p_ptr) <= 0) return;
274
275         switch(HEX_REVENGE_TYPE(p_ptr))
276         {
277                 case 1: do_spell(REALM_HEX, HEX_PATIENCE, SPELL_CONT); break;
278                 case 2: do_spell(REALM_HEX, HEX_REVENGE, SPELL_CONT); break;
279         }
280 }
281
282 /*!
283  * @brief 復讐ダメージの追加を行う
284  * @param dam 蓄積されるダメージ量
285  * @return なし
286  */
287 void revenge_store(HIT_POINT dam)
288 {
289         if (p_ptr->realm1 != REALM_HEX) return;
290         if (HEX_REVENGE_TURN(p_ptr) <= 0) return;
291
292         HEX_REVENGE_POWER(p_ptr) += dam;
293 }
294
295 /*!
296  * @brief 反テレポート結界の判定
297  * @param m_idx 判定の対象となるモンスターID
298  * @return 反テレポートの効果が適用されるならTRUEを返す
299  */
300 bool teleport_barrier(MONSTER_IDX m_idx)
301 {
302         monster_type *m_ptr = &m_list[m_idx];
303         monster_race *r_ptr = &r_info[m_ptr->r_idx];
304
305         if (!hex_spelling(HEX_ANTI_TELE)) return FALSE;
306         if ((p_ptr->lev * 3 / 2) < randint1(r_ptr->level)) return FALSE;
307
308         return TRUE;
309 }
310
311 /*!
312  * @brief 反魔法結界の判定
313  * @param m_idx 判定の対象となるモンスターID
314  * @return 反魔法の効果が適用されるならTRUEを返す
315  */
316 bool magic_barrier(MONSTER_IDX m_idx)
317 {
318         monster_type *m_ptr = &m_list[m_idx];
319         monster_race *r_ptr = &r_info[m_ptr->r_idx];
320
321         if (!hex_spelling(HEX_ANTI_MAGIC)) return FALSE;
322         if ((p_ptr->lev * 3 / 2) < randint1(r_ptr->level)) return FALSE;
323
324         return TRUE;
325 }
326
327 /*!
328  * @brief 反増殖結界の判定
329  * @param m_idx 判定の対象となるモンスターID
330  * @return 反増殖の効果が適用されるならTRUEを返す
331  */
332 bool multiply_barrier(MONSTER_IDX m_idx)
333 {
334         monster_type *m_ptr = &m_list[m_idx];
335         monster_race *r_ptr = &r_info[m_ptr->r_idx];
336
337         if (!hex_spelling(HEX_ANTI_MULTI)) return FALSE;
338         if ((p_ptr->lev * 3 / 2) < randint1(r_ptr->level)) return FALSE;
339
340         return TRUE;
341 }
342
343 /*!
344 * @brief 呪術領域魔法の各処理を行う
345 * @param spell 魔法ID
346 * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_INFO / SPELL_CAST / SPELL_CONT / SPELL_STOP)
347 * @return SPELL_NAME / SPELL_DESC / SPELL_INFO 時には文字列ポインタを返す。SPELL_CAST / SPELL_CONT / SPELL_STOP 時はNULL文字列を返す。
348 */
349 cptr do_hex_spell(SPELL_IDX spell, BIT_FLAGS mode)
350 {
351         bool name = (mode == SPELL_NAME) ? TRUE : FALSE;
352         bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;
353         bool info = (mode == SPELL_INFO) ? TRUE : FALSE;
354         bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;
355         bool cont = (mode == SPELL_CONT) ? TRUE : FALSE;
356         bool stop = (mode == SPELL_STOP) ? TRUE : FALSE;
357
358         bool add = TRUE;
359
360         PLAYER_LEVEL plev = p_ptr->lev;
361         HIT_POINT power;
362
363         switch (spell)
364         {
365                 /*** 1st book (0-7) ***/
366         case 0:
367                 if (name) return _("邪なる祝福", "Evily blessing");
368                 if (desc) return _("祝福により攻撃精度と防御力が上がる。", "Attempts to increase +to_hit of a weapon and AC");
369                 if (cast)
370                 {
371                         if (!p_ptr->blessed)
372                         {
373                                 msg_print(_("高潔な気分になった!", "You feel righteous!"));
374                         }
375                 }
376                 if (stop)
377                 {
378                         if (!p_ptr->blessed)
379                         {
380                                 msg_print(_("高潔な気分が消え失せた。", "The prayer has expired."));
381                         }
382                 }
383                 break;
384
385         case 1:
386                 if (name) return _("軽傷の治癒", "Cure light wounds");
387                 if (desc) return _("HPや傷を少し回復させる。", "Heals cut and HP a little.");
388                 if (info) return info_heal(1, 10, 0);
389                 if (cast)
390                 {
391                         msg_print(_("気分が良くなってくる。", "You feel better and better."));
392                 }
393                 if (cast || cont) (void)cure_light_wounds(1, 10);
394                 break;
395
396         case 2:
397                 if (name) return _("悪魔のオーラ", "Demonic aura");
398                 if (desc) return _("炎のオーラを身にまとい、回復速度が速くなる。", "Gives fire aura and regeneration.");
399                 if (cast)
400                 {
401                         msg_print(_("体が炎のオーラで覆われた。", "You have enveloped by fiery aura!"));
402                 }
403                 if (stop)
404                 {
405                         msg_print(_("炎のオーラが消え去った。", "Fiery aura disappeared."));
406                 }
407                 break;
408
409         case 3:
410                 if (name) return _("悪臭霧", "Stinking mist");
411                 if (desc) return _("視界内のモンスターに微弱量の毒のダメージを与える。", "Deals few damages of poison to all monsters in your sight.");
412                 power = plev / 2 + 5;
413                 if (info) return info_damage(1, power, 0);
414                 if (cast || cont)
415                 {
416                         project_hack(GF_POIS, randint1(power));
417                 }
418                 break;
419
420         case 4:
421                 if (name) return _("腕力強化", "Extra might");
422                 if (desc) return _("術者の腕力を上昇させる。", "Attempts to increase your strength.");
423                 if (cast)
424                 {
425                         msg_print(_("何だか力が湧いて来る。", "You feel you get stronger."));
426                 }
427                 break;
428
429         case 5:
430                 if (name) return _("武器呪縛", "Curse weapon");
431                 if (desc) return _("装備している武器を呪う。", "Curses your weapon.");
432                 if (cast)
433                 {
434                         OBJECT_IDX item;
435                         cptr q, s;
436                         char o_name[MAX_NLEN];
437                         object_type *o_ptr;
438                         u32b f[TR_FLAG_SIZE];
439
440                         item_tester_hook = item_tester_hook_weapon_except_bow;
441                         q = _("どれを呪いますか?", "Which weapon do you curse?");
442                         s = _("武器を装備していない。", "You wield no weapons.");
443
444                         if (!get_item(&item, q, s, (USE_EQUIP))) return FALSE;
445
446                         o_ptr = &inventory[item];
447                         object_desc(o_name, o_ptr, OD_NAME_ONLY);
448                         object_flags(o_ptr, f);
449
450                         if (!get_check(format(_("本当に %s を呪いますか?", "Do you curse %s, really?"), o_name))) return FALSE;
451
452                         if (!one_in_(3) &&
453                                 (object_is_artifact(o_ptr) || have_flag(f, TR_BLESSED)))
454                         {
455                                 msg_format(_("%s は呪いを跳ね返した。", "%s resists the effect."), o_name);
456                                 if (one_in_(3))
457                                 {
458                                         if (o_ptr->to_d > 0)
459                                         {
460                                                 o_ptr->to_d -= randint1(3) % 2;
461                                                 if (o_ptr->to_d < 0) o_ptr->to_d = 0;
462                                         }
463                                         if (o_ptr->to_h > 0)
464                                         {
465                                                 o_ptr->to_h -= randint1(3) % 2;
466                                                 if (o_ptr->to_h < 0) o_ptr->to_h = 0;
467                                         }
468                                         if (o_ptr->to_a > 0)
469                                         {
470                                                 o_ptr->to_a -= randint1(3) % 2;
471                                                 if (o_ptr->to_a < 0) o_ptr->to_a = 0;
472                                         }
473                                         msg_format(_("%s は劣化してしまった。", "Your %s was disenchanted!"), o_name);
474                                 }
475                         }
476                         else
477                         {
478                                 int curse_rank = 0;
479                                 msg_format(_("恐怖の暗黒オーラがあなたの%sを包み込んだ!", "A terrible black aura blasts your %s!"), o_name);
480                                 o_ptr->curse_flags |= (TRC_CURSED);
481
482                                 if (object_is_artifact(o_ptr) || object_is_ego(o_ptr))
483                                 {
484
485                                         if (one_in_(3)) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
486                                         if (one_in_(666))
487                                         {
488                                                 o_ptr->curse_flags |= (TRC_TY_CURSE);
489                                                 if (one_in_(666)) o_ptr->curse_flags |= (TRC_PERMA_CURSE);
490
491                                                 add_flag(o_ptr->art_flags, TR_AGGRAVATE);
492                                                 add_flag(o_ptr->art_flags, TR_VORPAL);
493                                                 add_flag(o_ptr->art_flags, TR_VAMPIRIC);
494                                                 msg_print(_("血だ!血だ!血だ!", "Blood, Blood, Blood!"));
495                                                 curse_rank = 2;
496                                         }
497                                 }
498
499                                 o_ptr->curse_flags |= get_curse(curse_rank, o_ptr);
500                         }
501
502                         p_ptr->update |= (PU_BONUS);
503                         add = FALSE;
504                 }
505                 break;
506
507         case 6:
508                 if (name) return _("邪悪感知", "Evil detection");
509                 if (desc) return _("周囲の邪悪なモンスターを感知する。", "Detects evil monsters.");
510                 if (info) return info_range(MAX_SIGHT);
511                 if (cast)
512                 {
513                         msg_print(_("邪悪な生物の存在を感じ取ろうとした。", "You attend to the presence of evil creatures."));
514                 }
515                 break;
516
517         case 7:
518                 if (name) return _("我慢", "Patience");
519                 if (desc) return _("数ターン攻撃を耐えた後、受けたダメージを地獄の業火として周囲に放出する。",
520                         "Bursts hell fire strongly after patients any damage while few turns.");
521                 power = MIN(200, (HEX_REVENGE_POWER(p_ptr) * 2));
522                 if (info) return info_damage(0, 0, power);
523                 if (cast)
524                 {
525                         int a = 3 - (p_ptr->pspeed - 100) / 10;
526                         MAGIC_NUM2 r = 3 + randint1(3) + MAX(0, MIN(3, a));
527
528                         if (HEX_REVENGE_TURN(p_ptr) > 0)
529                         {
530                                 msg_print(_("すでに我慢をしている。", "You are already patienting."));
531                                 return NULL;
532                         }
533
534                         HEX_REVENGE_TYPE(p_ptr) = 1;
535                         HEX_REVENGE_TURN(p_ptr) = r;
536                         HEX_REVENGE_POWER(p_ptr) = 0;
537                         msg_print(_("じっと耐えることにした。", "You decide to patient all damages."));
538                         add = FALSE;
539                 }
540                 if (cont)
541                 {
542                         POSITION rad = 2 + (power / 50);
543
544                         HEX_REVENGE_TURN(p_ptr)--;
545
546                         if ((HEX_REVENGE_TURN(p_ptr) <= 0) || (power >= 200))
547                         {
548                                 msg_print(_("我慢が解かれた!", "Time for end of patioence!"));
549                                 if (power)
550                                 {
551                                         project(0, rad, p_ptr->y, p_ptr->x, power, GF_HELL_FIRE,
552                                                 (PROJECT_STOP | PROJECT_GRID | PROJECT_ITEM | PROJECT_KILL), -1);
553                                 }
554                                 if (p_ptr->wizard)
555                                 {
556                                         msg_format(_("%d点のダメージを返した。", "You return %d damages."), power);
557                                 }
558
559                                 /* Reset */
560                                 HEX_REVENGE_TYPE(p_ptr) = 0;
561                                 HEX_REVENGE_TURN(p_ptr) = 0;
562                                 HEX_REVENGE_POWER(p_ptr) = 0;
563                         }
564                 }
565                 break;
566
567                 /*** 2nd book (8-15) ***/
568         case 8:
569                 if (name) return _("氷の鎧", "Ice armor");
570                 if (desc) return _("氷のオーラを身にまとい、防御力が上昇する。", "Gives fire aura and bonus to AC.");
571                 if (cast)
572                 {
573                         msg_print(_("体が氷の鎧で覆われた。", "You have enveloped by ice armor!"));
574                 }
575                 if (stop)
576                 {
577                         msg_print(_("氷の鎧が消え去った。", "Ice armor disappeared."));
578                 }
579                 break;
580
581         case 9:
582                 if (name) return _("重傷の治癒", "Cure serious wounds");
583                 if (desc) return _("体力や傷を多少回復させる。", "Heals cut and HP more.");
584                 if (info) return info_heal(2, 10, 0);
585                 if (cast)
586                 {
587                         msg_print(_("気分が良くなってくる。", "You feel better and better."));
588                 }
589                 if (cast || cont) (void)cure_serious_wounds(2, 10);
590                 break;
591
592         case 10:
593                 if (name) return _("薬品吸入", "Inhail potion");
594                 if (desc) return _("呪文詠唱を中止することなく、薬の効果を得ることができる。", "Quaffs a potion without canceling of casting a spell.");
595                 if (cast)
596                 {
597                         CASTING_HEX_FLAGS(p_ptr) |= (1L << HEX_INHAIL);
598                         do_cmd_quaff_potion();
599                         CASTING_HEX_FLAGS(p_ptr) &= ~(1L << HEX_INHAIL);
600                         add = FALSE;
601                 }
602                 break;
603
604         case 11:
605                 if (name) return _("衰弱の霧", "Hypodynamic mist");
606                 if (desc) return _("視界内のモンスターに微弱量の衰弱属性のダメージを与える。",
607                         "Deals few damages of hypodynamia to all monsters in your sight.");
608                 power = (plev / 2) + 5;
609                 if (info) return info_damage(1, power, 0);
610                 if (cast || cont)
611                 {
612                         project_hack(GF_HYPODYNAMIA, randint1(power));
613                 }
614                 break;
615
616         case 12:
617                 if (name) return _("魔剣化", "Swords to runeswords");
618                 if (desc) return _("武器の攻撃力を上げる。切れ味を得、呪いに応じて与えるダメージが上昇し、善良なモンスターに対するダメージが2倍になる。",
619                         "Gives vorpal ability to your weapon. Increases damages by your weapon acccording to curse of your weapon.");
620                 if (cast)
621                 {
622 #ifdef JP
623                         msg_print("あなたの武器が黒く輝いた。");
624 #else
625                         if (!empty_hands(FALSE))
626                                 msg_print("Your weapons glow bright black.");
627                         else
628                                 msg_print("Your weapon glows bright black.");
629 #endif
630                 }
631                 if (stop)
632                 {
633 #ifdef JP
634                         msg_print("武器の輝きが消え去った。");
635 #else
636                         msg_format("Brightness of weapon%s disappeared.", (empty_hands(FALSE)) ? "" : "s");
637 #endif
638                 }
639                 break;
640
641         case 13:
642                 if (name) return _("混乱の手", "Touch of confusion");
643                 if (desc) return _("攻撃した際モンスターを混乱させる。", "Confuses a monster when you attack.");
644                 if (cast)
645                 {
646                         msg_print(_("あなたの手が赤く輝き始めた。", "Your hands glow bright red."));
647                 }
648                 if (stop)
649                 {
650                         msg_print(_("手の輝きがなくなった。", "Brightness on your hands disappeard."));
651                 }
652                 break;
653
654         case 14:
655                 if (name) return _("肉体強化", "Building up");
656                 if (desc) return _("術者の腕力、器用さ、耐久力を上昇させる。攻撃回数の上限を 1 増加させる。",
657                         "Attempts to increases your strength, dexterity and constitusion.");
658                 if (cast)
659                 {
660                         msg_print(_("身体が強くなった気がした。", "You feel your body is developed more now."));
661                 }
662                 break;
663
664         case 15:
665                 if (name) return _("反テレポート結界", "Anti teleport barrier");
666                 if (desc) return _("視界内のモンスターのテレポートを阻害するバリアを張る。", "Obstructs all teleportations by monsters in your sight.");
667                 power = plev * 3 / 2;
668                 if (info) return info_power(power);
669                 if (cast)
670                 {
671                         msg_print(_("テレポートを防ぐ呪いをかけた。", "You feel anyone can not teleport except you."));
672                 }
673                 break;
674
675                 /*** 3rd book (16-23) ***/
676         case 16:
677                 if (name) return _("衝撃のクローク", "Cloak of shock");
678                 if (desc) return _("電気のオーラを身にまとい、動きが速くなる。", "Gives lightning aura and a bonus to speed.");
679                 if (cast)
680                 {
681                         msg_print(_("体が稲妻のオーラで覆われた。", "You have enveloped by electrical aura!"));
682                 }
683                 if (stop)
684                 {
685                         msg_print(_("稲妻のオーラが消え去った。", "Electrical aura disappeared."));
686                 }
687                 break;
688
689         case 17:
690                 if (name) return _("致命傷の治癒", "Cure critical wounds");
691                 if (desc) return _("体力や傷を回復させる。", "Heals cut and HP greatry.");
692                 if (info) return info_heal(4, 10, 0);
693                 if (cast)
694                 {
695                         msg_print(_("気分が良くなってくる。", "You feel better and better."));
696                 }
697                 if (cast || cont) (void)cure_critical_wounds(damroll(4, 10));
698                 break;
699
700         case 18:
701                 if (name) return _("呪力封入", "Recharging");
702                 if (desc) return _("魔法の道具に魔力を再充填する。", "Recharges a magic device.");
703                 power = plev * 2;
704                 if (info) return info_power(power);
705                 if (cast)
706                 {
707                         if (!recharge(power)) return NULL;
708                         add = FALSE;
709                 }
710                 break;
711
712         case 19:
713                 if (name) return _("死者復活", "Animate Dead");
714                 if (desc) return _("死体を蘇らせてペットにする。", "Raises corpses and skeletons from dead.");
715                 if (cast)
716                 {
717                         msg_print(_("死者への呼びかけを始めた。", "You start to call deads.!"));
718                 }
719                 if (cast || cont)
720                 {
721                         animate_dead(0, p_ptr->y, p_ptr->x);
722                 }
723                 break;
724
725         case 20:
726                 if (name) return _("防具呪縛", "Curse armor");
727                 if (desc) return _("装備している防具に呪いをかける。", "Curse a piece of armour that you wielding.");
728                 if (cast)
729                 {
730                         OBJECT_IDX item;
731                         cptr q, s;
732                         char o_name[MAX_NLEN];
733                         object_type *o_ptr;
734                         u32b f[TR_FLAG_SIZE];
735
736                         item_tester_hook = object_is_armour;
737                         q = _("どれを呪いますか?", "Which piece of armour do you curse?");
738                         s = _("防具を装備していない。", "You wield no piece of armours.");
739
740                         if (!get_item(&item, q, s, (USE_EQUIP))) return FALSE;
741
742                         o_ptr = &inventory[item];
743                         object_desc(o_name, o_ptr, OD_NAME_ONLY);
744                         object_flags(o_ptr, f);
745
746                         if (!get_check(format(_("本当に %s を呪いますか?", "Do you curse %s, really?"), o_name))) return FALSE;
747
748                         if (!one_in_(3) &&
749                                 (object_is_artifact(o_ptr) || have_flag(f, TR_BLESSED)))
750                         {
751                                 msg_format(_("%s は呪いを跳ね返した。", "%s resists the effect."), o_name);
752                                 if (one_in_(3))
753                                 {
754                                         if (o_ptr->to_d > 0)
755                                         {
756                                                 o_ptr->to_d -= randint1(3) % 2;
757                                                 if (o_ptr->to_d < 0) o_ptr->to_d = 0;
758                                         }
759                                         if (o_ptr->to_h > 0)
760                                         {
761                                                 o_ptr->to_h -= randint1(3) % 2;
762                                                 if (o_ptr->to_h < 0) o_ptr->to_h = 0;
763                                         }
764                                         if (o_ptr->to_a > 0)
765                                         {
766                                                 o_ptr->to_a -= randint1(3) % 2;
767                                                 if (o_ptr->to_a < 0) o_ptr->to_a = 0;
768                                         }
769                                         msg_format(_("%s は劣化してしまった。", "Your %s was disenchanted!"), o_name);
770                                 }
771                         }
772                         else
773                         {
774                                 int curse_rank = 0;
775                                 msg_format(_("恐怖の暗黒オーラがあなたの%sを包み込んだ!", "A terrible black aura blasts your %s!"), o_name);
776                                 o_ptr->curse_flags |= (TRC_CURSED);
777
778                                 if (object_is_artifact(o_ptr) || object_is_ego(o_ptr))
779                                 {
780
781                                         if (one_in_(3)) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
782                                         if (one_in_(666))
783                                         {
784                                                 o_ptr->curse_flags |= (TRC_TY_CURSE);
785                                                 if (one_in_(666)) o_ptr->curse_flags |= (TRC_PERMA_CURSE);
786
787                                                 add_flag(o_ptr->art_flags, TR_AGGRAVATE);
788                                                 add_flag(o_ptr->art_flags, TR_RES_POIS);
789                                                 add_flag(o_ptr->art_flags, TR_RES_DARK);
790                                                 add_flag(o_ptr->art_flags, TR_RES_NETHER);
791                                                 msg_print(_("血だ!血だ!血だ!", "Blood, Blood, Blood!"));
792                                                 curse_rank = 2;
793                                         }
794                                 }
795
796                                 o_ptr->curse_flags |= get_curse(curse_rank, o_ptr);
797                         }
798
799                         p_ptr->update |= (PU_BONUS);
800                         add = FALSE;
801                 }
802                 break;
803
804         case 21:
805                 if (name) return _("影のクローク", "Cloak of shadow");
806                 if (desc) return _("影のオーラを身にまとい、敵に影のダメージを与える。", "Gives aura of shadow.");
807                 if (cast)
808                 {
809                         object_type *o_ptr = &inventory[INVEN_OUTER];
810
811                         if (!o_ptr->k_idx)
812                         {
813                                 msg_print(_("クロークを身につけていない!", "You don't ware any cloak."));
814                                 return NULL;
815                         }
816                         else if (!object_is_cursed(o_ptr))
817                         {
818                                 msg_print(_("クロークは呪われていない!", "Your cloak is not cursed."));
819                                 return NULL;
820                         }
821                         else
822                         {
823                                 msg_print(_("影のオーラを身にまとった。", "You have enveloped by shadow aura!"));
824                         }
825                 }
826                 if (cont)
827                 {
828                         object_type *o_ptr = &inventory[INVEN_OUTER];
829
830                         if ((!o_ptr->k_idx) || (!object_is_cursed(o_ptr)))
831                         {
832                                 do_spell(REALM_HEX, spell, SPELL_STOP);
833                                 CASTING_HEX_FLAGS(p_ptr) &= ~(1L << spell);
834                                 CASTING_HEX_NUM(p_ptr)--;
835                                 if (!SINGING_SONG_ID(p_ptr)) set_action(ACTION_NONE);
836                         }
837                 }
838                 if (stop)
839                 {
840                         msg_print(_("影のオーラが消え去った。", "Shadow aura disappeared."));
841                 }
842                 break;
843
844         case 22:
845                 if (name) return _("苦痛を魔力に", "Pains to mana");
846                 if (desc) return _("視界内のモンスターに精神ダメージ与え、魔力を吸い取る。", "Deals psychic damages to all monsters in sight, and drains some mana.");
847                 power = plev * 3 / 2;
848                 if (info) return info_damage(1, power, 0);
849                 if (cast || cont)
850                 {
851                         project_hack(GF_PSI_DRAIN, randint1(power));
852                 }
853                 break;
854
855         case 23:
856                 if (name) return _("目には目を", "Eye for an eye");
857                 if (desc) return _("打撃や魔法で受けたダメージを、攻撃元のモンスターにも与える。", "Returns same damage which you got to the monster which damaged you.");
858                 if (cast)
859                 {
860                         msg_print(_("復讐したい欲望にかられた。", "You wish strongly you want to revenge anything."));
861                 }
862                 break;
863
864                 /*** 4th book (24-31) ***/
865         case 24:
866                 if (name) return _("反増殖結界", "Anti multiply barrier");
867                 if (desc) return _("その階の増殖するモンスターの増殖を阻止する。", "Obstructs all multiplying by monsters in entire floor.");
868                 if (cast)
869                 {
870                         msg_print(_("増殖を阻止する呪いをかけた。", "You feel anyone can not already multiply."));
871                 }
872                 break;
873
874         case 25:
875                 if (name) return _("全復活", "Restoration");
876                 if (desc) return _("経験値を徐々に復活し、減少した能力値を回復させる。", "Restores experience and status.");
877                 if (cast)
878                 {
879                         msg_print(_("体が元の活力を取り戻し始めた。", "You feel your lost status starting to return."));
880                 }
881                 if (cast || cont)
882                 {
883                         bool flag = FALSE;
884                         int d = (p_ptr->max_exp - p_ptr->exp);
885                         int r = (p_ptr->exp / 20);
886                         int i;
887
888                         if (d > 0)
889                         {
890                                 if (d < r)
891                                         p_ptr->exp = p_ptr->max_exp;
892                                 else
893                                         p_ptr->exp += r;
894
895                                 /* Check the experience */
896                                 check_experience();
897
898                                 flag = TRUE;
899                         }
900                         for (i = A_STR; i < 6; i++)
901                         {
902                                 if (p_ptr->stat_cur[i] < p_ptr->stat_max[i])
903                                 {
904                                         if (p_ptr->stat_cur[i] < 18)
905                                                 p_ptr->stat_cur[i]++;
906                                         else
907                                                 p_ptr->stat_cur[i] += 10;
908
909                                         if (p_ptr->stat_cur[i] > p_ptr->stat_max[i])
910                                                 p_ptr->stat_cur[i] = p_ptr->stat_max[i];
911
912                                         /* Recalculate bonuses */
913                                         p_ptr->update |= (PU_BONUS);
914
915                                         flag = TRUE;
916                                 }
917                         }
918
919                         if (!flag)
920                         {
921                                 msg_format(_("%sの呪文の詠唱をやめた。", "Finish casting '%^s'."), do_spell(REALM_HEX, HEX_RESTORE, SPELL_NAME));
922                                 CASTING_HEX_FLAGS(p_ptr) &= ~(1L << HEX_RESTORE);
923                                 if (cont) CASTING_HEX_NUM(p_ptr)--;
924                                 if (CASTING_HEX_NUM(p_ptr)) p_ptr->action = ACTION_NONE;
925
926                                 /* Redraw status */
927                                 p_ptr->update |= (PU_BONUS | PU_HP | PU_MANA | PU_SPELLS);
928                                 p_ptr->redraw |= (PR_EXTRA);
929
930                                 return "";
931                         }
932                 }
933                 break;
934
935         case 26:
936                 if (name) return _("呪力吸収", "Drain curse power");
937                 if (desc) return _("呪われた武器の呪いを吸収して魔力を回復する。", "Drains curse on your weapon and heals SP a little.");
938                 if (cast)
939                 {
940                         OBJECT_IDX item;
941                         cptr s, q;
942                         u32b f[TR_FLAG_SIZE];
943                         object_type *o_ptr;
944
945                         item_tester_hook = item_tester_hook_cursed;
946                         q = _("どの装備品から吸収しますか?", "Which cursed equipment do you drain mana from?");
947                         s = _("呪われたアイテムを装備していない。", "You have no cursed equipment.");
948
949                         if (!get_item(&item, q, s, (USE_EQUIP))) return FALSE;
950
951                         o_ptr = &inventory[item];
952                         object_flags(o_ptr, f);
953
954                         p_ptr->csp += (p_ptr->lev / 5) + randint1(p_ptr->lev / 5);
955                         if (have_flag(f, TR_TY_CURSE) || (o_ptr->curse_flags & TRC_TY_CURSE)) p_ptr->csp += randint1(5);
956                         if (p_ptr->csp > p_ptr->msp) p_ptr->csp = p_ptr->msp;
957
958                         if (o_ptr->curse_flags & TRC_PERMA_CURSE)
959                         {
960                                 /* Nothing */
961                         }
962                         else if (o_ptr->curse_flags & TRC_HEAVY_CURSE)
963                         {
964                                 if (one_in_(7))
965                                 {
966                                         msg_print(_("呪いを全て吸い取った。", "Heavy curse vanished away."));
967                                         o_ptr->curse_flags = 0L;
968                                 }
969                         }
970                         else if ((o_ptr->curse_flags & (TRC_CURSED)) && one_in_(3))
971                         {
972                                 msg_print(_("呪いを全て吸い取った。", "Curse vanished away."));
973                                 o_ptr->curse_flags = 0L;
974                         }
975
976                         add = FALSE;
977                 }
978                 break;
979
980         case 27:
981                 if (name) return _("吸血の刃", "Swords to vampires");
982                 if (desc) return _("吸血属性で攻撃する。", "Gives vampiric ability to your weapon.");
983                 if (cast)
984                 {
985 #ifdef JP
986                         msg_print("あなたの武器が血を欲している。");
987 #else
988                         if (!empty_hands(FALSE))
989                                 msg_print("Your weapons want more blood now.");
990                         else
991                                 msg_print("Your weapon wants more blood now.");
992 #endif
993                 }
994                 if (stop)
995                 {
996 #ifdef JP
997                         msg_print("武器の渇望が消え去った。");
998 #else
999                         msg_format("Thirsty of weapon%s disappeared.", (empty_hands(FALSE)) ? "" : "s");
1000 #endif
1001                 }
1002                 break;
1003
1004         case 28:
1005                 if (name) return _("朦朧の言葉", "Word of stun");
1006                 if (desc) return _("視界内のモンスターを朦朧とさせる。", "Stuns all monsters in your sight.");
1007                 power = plev * 4;
1008                 if (info) return info_power(power);
1009                 if (cast || cont)
1010                 {
1011                         stun_monsters(power);
1012                 }
1013                 break;
1014
1015         case 29:
1016                 if (name) return _("影移動", "Moving into shadow");
1017                 if (desc) return _("モンスターの隣のマスに瞬間移動する。", "Teleports you close to a monster.");
1018                 if (cast)
1019                 {
1020                         int i, dir;
1021                         POSITION y, x;
1022                         bool flag;
1023
1024                         for (i = 0; i < 3; i++)
1025                         {
1026                                 if (!tgt_pt(&x, &y)) return FALSE;
1027
1028                                 flag = FALSE;
1029
1030                                 for (dir = 0; dir < 8; dir++)
1031                                 {
1032                                         int dy = y + ddy_ddd[dir];
1033                                         int dx = x + ddx_ddd[dir];
1034                                         if (dir == 5) continue;
1035                                         if (cave[dy][dx].m_idx) flag = TRUE;
1036                                 }
1037
1038                                 if (!cave_empty_bold(y, x) || (cave[y][x].info & CAVE_ICKY) ||
1039                                         (distance(y, x, p_ptr->y, p_ptr->x) > plev + 2))
1040                                 {
1041                                         msg_print(_("そこには移動できない。", "Can not teleport to there."));
1042                                         continue;
1043                                 }
1044                                 break;
1045                         }
1046
1047                         if (flag && randint0(plev * plev / 2))
1048                         {
1049                                 teleport_player_to(y, x, 0L);
1050                         }
1051                         else
1052                         {
1053                                 msg_print(_("おっと!", "Oops!"));
1054                                 teleport_player(30, 0L);
1055                         }
1056
1057                         add = FALSE;
1058                 }
1059                 break;
1060
1061         case 30:
1062                 if (name) return _("反魔法結界", "Anti magic barrier");
1063                 if (desc) return _("視界内のモンスターの魔法を阻害するバリアを張る。", "Obstructs all magic spell of monsters in your sight.");
1064                 power = plev * 3 / 2;
1065                 if (info) return info_power(power);
1066                 if (cast)
1067                 {
1068                         msg_print(_("魔法を防ぐ呪いをかけた。", "You feel anyone can not cast spells except you."));
1069                 }
1070                 break;
1071
1072         case 31:
1073                 if (name) return _("復讐の宣告", "Revenge sentence");
1074                 if (desc) return _("数ターン後にそれまで受けたダメージに応じた威力の地獄の劫火の弾を放つ。",
1075                         "Fires  a ball of hell fire to try revenging after few turns.");
1076                 power = HEX_REVENGE_POWER(p_ptr);
1077                 if (info) return info_damage(0, 0, power);
1078                 if (cast)
1079                 {
1080                         MAGIC_NUM2 r;
1081                         int a = 3 - (p_ptr->pspeed - 100) / 10;
1082                         r = 1 + randint1(2) + MAX(0, MIN(3, a));
1083
1084                         if (HEX_REVENGE_TURN(p_ptr) > 0)
1085                         {
1086                                 msg_print(_("すでに復讐は宣告済みだ。", "You already pronounced your revenge."));
1087                                 return NULL;
1088                         }
1089
1090                         HEX_REVENGE_TYPE(p_ptr) = 2;
1091                         HEX_REVENGE_TURN(p_ptr) = r;
1092                         msg_format(_("あなたは復讐を宣告した。あと %d ターン。", "You pronounce your revenge. %d turns left."), r);
1093                         add = FALSE;
1094                 }
1095                 if (cont)
1096                 {
1097                         HEX_REVENGE_TURN(p_ptr)--;
1098
1099                         if (HEX_REVENGE_TURN(p_ptr) <= 0)
1100                         {
1101                                 DIRECTION dir;
1102
1103                                 if (power)
1104                                 {
1105                                         command_dir = 0;
1106
1107                                         do
1108                                         {
1109                                                 msg_print(_("復讐の時だ!", "Time to revenge!"));
1110                                         } while (!get_aim_dir(&dir));
1111
1112                                         fire_ball(GF_HELL_FIRE, dir, power, 1);
1113
1114                                         if (p_ptr->wizard)
1115                                         {
1116                                                 msg_format(_("%d点のダメージを返した。", "You return %d damages."), power);
1117                                         }
1118                                 }
1119                                 else
1120                                 {
1121                                         msg_print(_("復讐する気が失せた。", "You are not a mood to revenge."));
1122                                 }
1123                                 HEX_REVENGE_POWER(p_ptr) = 0;
1124                         }
1125                 }
1126                 break;
1127         }
1128
1129         /* start casting */
1130         if ((cast) && (add))
1131         {
1132                 /* add spell */
1133                 CASTING_HEX_FLAGS(p_ptr) |= 1L << (spell);
1134                 CASTING_HEX_NUM(p_ptr)++;
1135
1136                 if (p_ptr->action != ACTION_SPELL) set_action(ACTION_SPELL);
1137         }
1138
1139         /* Redraw status */
1140         if (!info)
1141         {
1142                 p_ptr->update |= (PU_BONUS | PU_HP | PU_MANA | PU_SPELLS);
1143                 p_ptr->redraw |= (PR_EXTRA | PR_HP | PR_MANA);
1144         }
1145
1146         return "";
1147 }