OSDN Git Service

Initial revision
[hengband/hengband.git] / src / mind.c
1 /* File: mind.c */
2
3 /* Purpose: Mindcrafter code */
4
5 /*
6  * Copyright (c) 1989 James E. Wilson, Robert A. Koeneke
7  *
8  * This software may be copied and distributed for educational, research, and
9  * not for profit purposes provided that this copyright and statement are
10  * included in all such copies.
11  */
12
13 #include "angband.h"
14 #include "mindtips.h"
15
16
17 mind_power mind_powers[5] =
18 {
19   {
20     {
21       /* Level gained,  cost,  %fail,  name */
22 #ifdef JP
23       { 1,   1,  15, "Îî»ë"             , "Precognition"},
24       { 2,   1,  20, "¿À·Ð¹¶·â"         , "Neural Blast"},
25       { 3,   2,  25, "¼¡¸µ¤Î½Ö¤­"       , "Minor Displacement"},
26       { 7,   6,  35, "µõ¶õ¤Î¸¸±Æ"       , "Major Displacement"},
27       { 9,   7,  50, "Àº¿À»ÙÇÛ"         , "Domination"},
28       { 11,  7,  30, "Ç°Æ°¾×·âÃÆ"       , "Pulverise"},
29       { 13, 12,  50, "³»²½"             , "Character Armour"},
30       { 15, 12,  60, "¥µ¥¤¥³¥á¥È¥ê¡¼" , "Psychometry" },
31       { 18, 10,  45, "Àº¿ÀÇÈÆ°", "Mind Wave" },
32       { 23, 15,  50, "¥¢¥É¥ì¥Ê¥ê¥ó¡¦¥É¡¼¥Ô¥ó¥°" , "Adrenaline Channeling"},
33       { 26, 28,  60, "¥Æ¥ì¥­¥Í¥·¥¹" ,"Telekinesis"},
34       { 28, 10,  40, "¥µ¥¤¥­¥Ã¥¯¡¦¥É¥ì¥¤¥ó" ,"Psychic Drain"},
35       { 35, 35,  75, "¸÷¤Î·õ",  "Psycho-Spear"},
36       { 45,150,  85, "´°Á´¤ÊÀ¤³¦",  "The World"},
37       { 99,  0,   0, ""},
38       { 99,  0,   0, ""},
39       { 99,  0,   0, ""},
40       { 99,  0,   0, ""},
41       { 99,  0,   0, ""},
42       { 99,  0,   0, ""},
43       { 99,  0,   0, ""},
44 #else
45       { 1,   1,  15, "Precognition"},
46       { 2,   1,  20, "Neural Blast"},
47       { 3,   2,  25, "Minor Displacement"},
48       { 7,   6,  35, "Major Displacement"},
49       { 9,   7,  50, "Domination"},
50       { 11,  7,  30, "Pulverise"},
51       { 13, 12,  50, "Character Armour"},
52       { 15, 12,  60, "Psychometry" },
53       { 18, 10,  45, "Mind Wave" },
54       { 23, 15,  50, "Adrenaline Channeling"},
55       { 26, 28,  60, "Telekinesis"},
56       { 28, 10,  40, "Psychic Drain"},
57       { 35, 35,  75, "Psycho-Spear"},
58       { 45,150,  85, "The World"},
59       { 99,  0,   0, ""},
60       { 99,  0,   0, ""},
61       { 99,  0,   0, ""},
62       { 99,  0,   0, ""},
63       { 99,  0,   0, ""},
64       { 99,  0,   0, ""},
65       { 99,  0,   0, ""},
66 #endif
67       
68     }
69   },
70   
71   {
72     {
73       /* Level gained,  cost,  %fail,  name */
74 #ifdef JP
75       { 1,   1,  15, "¾®Î¶"             , "Small Force Ball"},
76       { 3,   3,  30, "Á®¸÷"             , "Flash Light"},
77       { 5,   6,  35, "Éñ¶õ½Ñ"           , "Flying Technique"},
78       { 8,   5,  40, "¥«¥á¥Ï¥áÇÈ"       , "Kamehameha"},
79       { 10,  7,  45, "ÂÐËâË¡Ëɸæ"       , "Magic Resistance"},
80       { 13,  5,  60, "Îýµ¤"             , "Improve Force"},
81       { 17, 17,  50, "ŻƮµ¤"           , "Aura of Force"},
82       { 20, 20,  50, "¾×ÇÈ"             , "Shock Power"},
83       { 23, 18,  55, "×Âζ"             , "Large Force Ball"},
84       { 25, 30,  70, "¤¤¤Æ¤Ä¤¯ÇÈÆ°"     , "Dispel"},
85       { 28, 26,  50, "¸¸Î´­"         , "Summon Ghost"},
86       { 32, 35,  65, "Îû¹ö²Ð±ê"         , "Exploding Frame"},
87       { 38, 42,  75, "Ķ¥«¥á¥Ï¥áÇÈ"     , "Super Kamehameha"},
88       { 44, 50,  80, "¸÷®°ÜÆ°"         , "Light Speed"},
89       { 99,  0,   0, ""},
90       { 99,  0,   0, ""},
91       { 99,  0,   0, ""},
92       { 99,  0,   0, ""},
93       { 99,  0,   0, ""},
94       { 99,  0,   0, ""},
95       { 99,  0,   0, ""},
96 #else
97       { 1,   1,  15, "Small Force Ball"},
98       { 3,   3,  30, "Flash Light"},
99       { 5,   6,  35, "Flying Technique"},
100       { 8,   5,  40, "Kamehameha"},
101       { 10,  7,  45, "Magic Resistance"},
102       { 13,  5,  60, "Improve Force"},
103       { 17, 17,  50, "Aura of Force"},
104       { 20, 20,  50, "Shock Power"},
105       { 23, 18,  55, "Large Force Ball"},
106       { 25, 30,  70, "Dispel Magic"},
107       { 28, 26,  50, "Summon Ghost"},
108       { 32, 35,  65, "Exploding Frame"},
109       { 38, 42,  75, "Super Kamehameha"},
110       { 44, 50,  80, "Light Speed"},
111       { 99,  0,   0, ""},
112       { 99,  0,   0, ""},
113       { 99,  0,   0, ""},
114       { 99,  0,   0, ""},
115       { 99,  0,   0, ""},
116       { 99,  0,   0, ""},
117       { 99,  0,   0, ""},
118 #endif
119       
120     }
121   },
122   
123   {
124     {
125       /* Level gained,  cost,  %fail,  name */
126 #ifdef JP
127       {  8,  5,  40, "»¦µ¤´¶ÃÎ"         , "Detect Atmosphere of Menace"},
128       { 15, 20,   0, "ÆÍ·â"             , "Charge"},
129       { 20, 15,   0, "¥È¥é¥Ã¥×Ê´ºÕ"     , "Smash a Trap"},
130       { 25, 20,  60, "ÃÏ¿Ì"             , "Quake"},
131       { 30, 80,  75, "³§»¦¤·"   , "Massacre"},
132       { 99,  0,   0, ""                 , ""},
133       { 99,  0,   0, ""                 , ""},
134       { 99,  0,   0, ""                 , ""},
135       { 99,  0,   0, ""                 , ""},
136       { 99,  0,   0, ""                 , ""},
137       { 99,  0,   0, ""                 , ""},
138       { 99,  0,   0, ""                 , ""},
139       { 99,  0,   0, ""                 , ""},
140       { 99,  0,   0, ""                 , ""},
141       { 99,  0,   0, ""                 , ""},
142       { 99,  0,   0, ""                 , ""},
143       { 99,  0,   0, ""                 , ""},
144       { 99,  0,   0, ""                 , ""},
145       { 99,  0,   0, ""                 , ""},
146       { 99,  0,   0, ""                 , ""},
147       { 99,  0,   0, ""                 , ""},
148 #else
149       {  8,  5,  40, "Detect Atmosphere of Menace"},
150       { 15, 20,   0, "Charge"},
151       { 20, 15,   0, "Smash a Trap"},
152       { 25, 20,  60, "Quake"},
153       { 30, 80,  75, "Massacre"},
154       { 99,  0,   0, ""},
155       { 99,  0,   0, ""},
156       { 99,  0,   0, ""},
157       { 99,  0,   0, ""},
158       { 99,  0,   0, ""},
159       { 99,  0,   0, ""},
160       { 99,  0,   0, ""},
161       { 99,  0,   0, ""},
162       { 99,  0,   0, ""},
163       { 99,  0,   0, ""},
164       { 99,  0,   0, ""},
165       { 99,  0,   0, ""},
166       { 99,  0,   0, ""},
167       { 99,  0,   0, ""},
168       { 99,  0,   0, ""},
169       { 99,  0,   0, ""},
170 #endif
171       
172     }
173   },
174
175   {
176     {
177       /* Level gained,  cost,  %fail,  name */
178 #ifdef JP
179       { 1,   1,  15, "¿¿¸«¤Î¶À"         , "Mirror of Seeing"},
180       { 1,   2,  40, "¶ÀÀ¸À®"           , "Making a Mirror"},
181       { 2,   2,  20, "¸÷¤Î¤·¤º¤¯"       , "Drip of Light"},
182       { 3,   2,  20, "ÏĤó¤À¶À"         , "Warped Mirror"},
183       { 5,   3,  35, "Á®¸÷¶À"           , "Mirror of Light"},
184       { 6,   5,  35, "×Ǥ¨¤ë¶À"         , "Mirror of Wandering"},
185
186       { 10,  5,  30, "Èù¿Ð±£¤ì"         , "Robe of Dust"},
187       { 12, 12,  30, "ÄÉÊü¤Î¶À"         , "Banishing Mirror"},
188       { 15, 15,  30, "¶ÀºÕ¤­"           , "Mirror Clashing"},
189       { 19, 13,  30, "ºÅ̲¶À"           , "Mirror Sleeping"},
190       { 23, 18,  50, "¥·¡¼¥«¡¼¥ì¥¤"     , "Seeker Ray"},
191
192       { 25, 20,  40, "¶À¤ÎÉõ°õ"         , "Seal of Mirror"},
193       { 27, 30,  60, "¿å¶À¤Î½â"         , "Shield of Water"},
194       { 29, 30,  60, "¥¹¡¼¥Ñ¡¼¥ì¥¤"     , "Super Ray"},
195       { 31, 35,  60, "¸¸ÏǤθ÷"         , "Illusion Light"},
196       { 33, 50,  80, "¶À¤Î¹ñ"           , "Mirror Shift"},
197
198       { 36, 30,  80, "¶ÀÈ´¤±"           , "Mirror Tunnel"},
199       { 38, 40,  70, "µ¢´Ô¤Î¶À"         , "Mirror of Recall"},
200       { 40, 50,  55, "±Æʬ¿È"           , "Multi-Shadow"},
201       { 43, 55,  70, "ÉõËâ·ë³¦"         , "Binding Field"},
202       { 46, 70,  75, "¥é¥Õ¥Î¡¼¥ë¤Î¶À"   , "Mirror of Ruffnor"},
203 #else
204       { 1,   1,  15, "Mirror of Seeing"},
205       { 1,   2,  40, "Making a Mirror"},
206       { 2,   2,  20, "Drip of Light"},
207       { 3,   2,  20, "Warped Mirror"},
208       { 5,   3,  35, "Mirror of Light"},
209       { 6,   5,  35, "Mirror of Wandering"},
210
211       { 10,  5,  30, "Robe of Dust"},
212       { 12, 12,  30, "Banishing Mirror"},
213       { 15, 15,  30, "Mirror Clashing"},
214       { 19, 13,  30, "Mirror Sleeping"},
215       { 23, 18,  50, "Seeker Ray"},
216
217       { 25, 20,  40, "Seal of Mirror"},
218       { 27, 30,  60, "Shield of Water"},
219       { 29, 30,  60, "Super Ray"},
220       { 31, 35,  60, "Illusion Light"},
221       { 33, 50,  80, "Mirror Shift"},
222
223       { 36, 30,  80, "Mirror Tunnel"},
224       { 38, 40,  70, "Mirror of Recall"},
225       { 40, 50,  55, "Multi-Shadow"},
226       { 43, 55,  70, "Binding Field"},
227       { 46, 70,  75, "Mirror of Ruffnor"},
228 #endif
229       
230     }
231   },
232   
233   {
234     {
235       /* Level gained,  cost,  %fail,  name */
236 #ifdef JP
237       {  1,  1,  20, "°Å°ÇÀ¸À®"         , "Create Darkness"},
238       {  2,  2,  25, "¼þÊÕÄ´ºº"         , "Detect Near"},
239       {  3,  3,  25, "ÍÕ±£¤ì"           , "Hide in Leafs"},
240       {  5,  3,  30, "ÊѤï¤ê¿È"         , "Quick Substitution"},
241       {  7,  8,  35, "¹âÈô¤Ó"           , "Absconding"},
242       {  8, 10,  35, "°ì·âΥæ"         , "Hit And Away"},
243       { 10, 10,  40, "¶âÇû¤ê"           , "Bind Monster"},
244       { 12, 12,  70, "¸Å¤Î¸ýÅÁ"         , "Ancient Knowledge"},
245       { 15, 10,  50, "Éâ±À"             , "Floating"},
246       { 17, 12,  45, "²ÐÆÛ"             , "Hide in Flame"},
247       { 18, 20,  40, "Æþ¿È"             , "Surprise Attack"},
248       { 20,  5,  50, "ȬÊý¼ê΢·õ"       , "Syuriken Spread"},
249       { 22, 15,  55, "º¿³ù"             , "Chain Hook"},
250       { 25, 32,  60, "±ì¶Ì"             , "Smoke Ball"},
251       { 28, 32,  60, "ž¿È"             , "Swap Step"},
252       { 30, 30,  70, "Çúȯ¤ÎÌæ¾Ï"       , "Glyph of Explosion"},
253       { 32, 40,  40, "ÅÚÆÛ"             , "Hide in Mud"},
254       { 34, 35,  50, "̸±£¤ì"           , "Hide in Mist"},
255       { 38, 40,  60, "Îû¹ö²Ð±ê"         , "Flame Hell"},
256       { 41, 50,  55, "ʬ¿È"             , "Multi Shadow"},
257       { 99,  0,   0, ""                 , ""},
258 #else
259       {  1,  1,  20, "Create Darkness"},
260       {  2,  2,  25, "Detect Near"},
261       {  3,  3,  25, "Hide in Leafs"},
262       {  5,  3,  30, "Kawarimi"},
263       {  7,  8,  35, "Absconding"},
264       {  8, 10,  35, "Hit and Away"},
265       { 10, 10,  40, "Bind Monster"},
266       { 12, 12,  70, "Ancient Knowledge"},
267       { 15, 10,  50, "Floating"},
268       { 17, 12,  45, "Hide in Flame"},
269       { 18, 20,  40, "Nyusin"},
270       { 20,  5,  50, "Syuriken Spreading"},
271       { 22, 15,  55, "Chain Hook"},
272       { 25, 32,  60, "Smoke Ball"},
273       { 28, 32,  60, "Swap Position"},
274       { 30, 30,  70, "Glyph of Explosion"},
275       { 32, 40,  40, "Hide in Mud"},
276       { 34, 35,  50, "Hide in Mist"},
277       { 38, 40,  60, "Rengoku-Kaen"},
278       { 41, 50,  55, "Bunshin"},
279       { 99,  0,   0, ""},
280 #endif
281       
282     }
283   },
284 };
285
286
287 void mindcraft_info(char *p, int use_mind, int power)
288 {
289 #ifdef JP
290         cptr s_dam = "»½ý:";
291         cptr s_dur = "´ü´Ö:";
292         cptr s_range = "ÈÏ°Ï:";
293 #else
294         cptr s_dam = "dam ";
295         cptr s_dur = "dur ";
296         cptr s_range = "range ";
297 #endif
298   int plev = p_ptr->lev;
299
300   strcpy(p, "");
301
302   switch (use_mind)
303     {
304     case MIND_MINDCRAFTER:
305       switch (power)
306         {
307         case 0:  break;
308         case 1:  sprintf(p, " %s%dd%d", s_dam, 3 + ((plev - 1) / 4), 3 + plev/15); break;
309         case 2:  sprintf(p, " %s10", s_range); break;
310         case 3:  sprintf(p, " %s%d", s_range, plev * 5);  break;
311         case 4:  break;
312         case 5: sprintf(p, " %s%dd8", s_dam, 8 + ((plev - 5) / 4));  break;
313         case 6:  sprintf(p, " %s%d", s_dur, plev);  break;
314         case 7:  break;
315         case 8:  sprintf(p, (plev < 25 ? " %s%d" : " %sd%d"), s_dam, (plev < 25 ? plev * 3 / 2 : plev * ((plev - 5) / 10 + 1))); break;
316         case 9:  sprintf(p, " %s10+d%d", s_dur, plev * 3 / 2);  break;
317 #ifdef JP
318         case 10: sprintf(p, " ºÇÂç½ÅÎÌ:%d.%dkg", lbtokg1(plev * 15),lbtokg2(plev * 15));  break;
319 #else
320         case 10: sprintf(p, " max wgt %d", plev * 15);  break;
321 #endif
322         case 11: sprintf(p, " %s%dd6", s_dam, plev / 2);  break;
323         case 12: sprintf(p, " %sd%d+%d", s_dam, plev * 3, plev * 3); break;
324 #ifdef JP
325         case 13: sprintf(p, " ¹ÔÆ°:%d²ó", (p_ptr->csp + p_ptr->energy - 50)/100); break;
326 #else
327         case 13: sprintf(p, " %d acts.", (p_ptr->csp + p_ptr->energy - 50)/100); break;
328 #endif
329         }
330       break;
331     case MIND_KI:
332       {
333         int boost = p_ptr->magic_num1[0];
334
335         if (heavy_armor()) boost /= 2;
336
337         switch (power)
338           {
339           case 0:  sprintf(p, " %s%dd4", s_dam, 3 + ((plev - 1) / 5) + boost / 12); break;
340           case 1:  break;
341           case 2:  sprintf(p, " %s%d+d30", s_dur, 30 + boost / 5); break;
342           case 3:  sprintf(p, " %s%dd5", s_dam, 5 + ((plev - 1) / 5) + boost / 10); break;
343           case 4:  sprintf(p, " %s%d+d20", s_dur, 20 + boost / 5); break;
344           case 5:  break;
345           case 6:  sprintf(p, " %s%d+d%d", s_dur, 15 + boost / 7, plev / 2); break;
346           case 7:  sprintf(p, " %s%dd8", s_dam, 8 + ((plev - 5) / 5) + boost / 12); break;
347           case 8:  sprintf(p, " %s10d6+%d", s_dam, plev * 3 / 2 + boost * 3 / 5); break;
348           case 9:  break;
349 #ifdef JP
350           case 10: sprintf(p, " ºÇÂç%dɤ", 1+boost/100); break;
351 #else
352           case 10: sprintf(p, " max %d", 1+boost/100); break;
353 #endif
354           case 11: sprintf(p, " %s%d", s_dam, 100 + plev + boost); break;
355           case 12: sprintf(p, " %s%dd15", s_dam, 10 + plev / 2 + boost * 3 / 10); break;
356 #ifdef JP
357           case 13: sprintf(p, " ¹ÔÆ°:%d+d16²ó", 16+boost/20); break;
358 #else
359           case 13: sprintf(p, " %d+d16 acts", 16+boost/20); break;
360 #endif
361           }
362         break;
363       case MIND_MIRROR_MASTER:
364         {
365           switch (power)
366             {
367             case 0:  break;
368             case 1:  break;
369             case 2:  sprintf(p, " %s%dd4", s_dam,  3 + ((plev - 1) / 5) ); break;
370             case 3:  sprintf(p, " %s10", s_range); break;
371             case 4:  break;
372             case 5:  sprintf(p, " %s%d", s_range, plev *5); break;
373             case 6:  sprintf(p, " %s20+d20", s_dur);  break;
374             case 7:  break;
375             case 8:  sprintf(p, " %s%dd8", s_dam, 8+((plev -5)/4) ); break;
376             case 9:  break;
377             case 10: sprintf(p, " %s%dd8", s_dam, 11+(plev-5)/4 ); break;
378             case 11: break;
379             case 12: sprintf(p, " %s20+d20", s_dur);  break;
380             case 13: sprintf(p, " %s150+d%d", s_dam, plev*2 ); break;
381             case 14: break;
382             case 15: break;
383             case 16: sprintf(p, " %s%d", s_range, plev/2 +10); break;
384             case 17: break;
385             case 18: sprintf(p, " %s6+d6", s_dur);  break;
386             case 19: sprintf(p, " %s%d", s_dam, plev*11+5 ); break;
387             case 20: sprintf(p, " %s4+d4", s_dur);  break;
388             }
389           break;
390         }
391       case MIND_NINJUTSU:
392         {
393           switch (power)
394             {
395             case 0:  break;
396             case 1:  break;
397             case 2:  sprintf(p, " %s10", s_range); break;
398             case 3:  break;
399             case 4:  sprintf(p, " %s%d", s_range , plev *5); break;
400             case 5:  sprintf(p, " %s30", s_range); break;
401             case 6:  break;
402             case 7:  break;
403             case 8:  sprintf(p, " %s20+d20", s_dur);  break;
404             case 9:  sprintf(p, " %s%d", s_dam, (50+plev)/2 ); break;
405             case 10: break;
406             case 11: break;
407             case 12: break;
408             case 13: break;
409             case 14: break;
410             case 15: break;
411             case 16: sprintf(p, " %s%d+d%d", s_dur, plev/2, plev/2);  break;
412             case 17: sprintf(p, " %s%d*3", s_dam, (75+plev*2/3)/2 ); break;
413             case 18: sprintf(p, " %s%dd10", s_dam, 6+plev/8 ); break;
414             case 19: sprintf(p, " %s6+d6", s_dur);  break;
415             }
416           break;
417         }
418       }
419     }
420 }
421
422   /*
423  * Allow user to choose a mindcrafter power.
424  *
425  * If a valid spell is chosen, saves it in '*sn' and returns TRUE
426  * If the user hits escape, returns FALSE, and set '*sn' to -1
427  * If there are no legal choices, returns FALSE, and sets '*sn' to -2
428  *
429  * The "prompt" should be "cast", "recite", or "study"
430  * The "known" should be TRUE for cast/pray, FALSE for study
431  *
432  * nb: This function has a (trivial) display bug which will be obvious
433  * when you run it. It's probably easy to fix but I haven't tried,
434  * sorry.
435  */
436   static int get_mind_power(int *sn, bool only_browse)
437     {
438       int             i;
439       int             num = 0;
440       int             y = 1;
441       int             x = 10;
442       int             minfail = 0;
443       int             plev = p_ptr->lev;
444       int             chance = 0;
445       int             ask = TRUE;
446       char            choice;
447       char            out_val[160];
448       char            comment[80];
449       cptr            p;
450
451       mind_type       spell;
452       mind_power      *mind_ptr;
453       bool            flag, redraw;
454       int             use_mind;
455       int menu_line = (use_menu ? 1 : 0);
456
457       switch(p_ptr->pclass)
458         {
459         case CLASS_MINDCRAFTER:
460           {
461             use_mind = MIND_MINDCRAFTER;
462 #ifdef JP
463             p = "ĶǽÎÏ";
464 #else
465             p = "mindcraft";
466 #endif
467             break;
468           }
469         case CLASS_FORCETRAINER:
470           {
471             use_mind = MIND_KI;
472 #ifdef JP
473             p = "Îýµ¤½Ñ";
474 #else
475             p = "Force";
476 #endif
477             break;
478           }
479         case CLASS_BERSERKER:
480           {
481             use_mind = MIND_BERSERKER;
482 #ifdef JP
483             p = "µ»";
484 #else
485             p = "brutal power";
486 #endif
487             break;
488           }
489         case CLASS_MIRROR_MASTER:
490           {
491             use_mind = MIND_MIRROR_MASTER;
492 #ifdef JP
493             p = "¶ÀËâË¡";
494 #else
495             p = "magic";
496 #endif
497             break;
498           }
499         case CLASS_NINJA:
500           {
501             use_mind = MIND_NINJUTSU;
502 #ifdef JP
503             p = "Ǧ½Ñ";
504 #else
505             p = "ninjutsu";
506 #endif
507             break;
508           }
509         default:
510           {
511             use_mind = 0;
512 #ifdef JP
513             p = "ĶǽÎÏ";
514 #else
515             p = "mindcraft";
516 #endif
517             break;
518           }
519         }
520       mind_ptr = &mind_powers[use_mind];
521
522         /* Assume cancelled */
523       *sn = (-1);
524
525 #ifdef ALLOW_REPEAT /* TNB */
526
527       /* Get the spell, if available */
528       if (repeat_pull(sn))
529         {
530           /* Verify the spell */
531           if (mind_ptr->info[*sn].min_lev <= plev)
532             {
533               /* Success */
534               return (TRUE);
535             }
536         }
537
538 #endif /* ALLOW_REPEAT -- TNB */
539
540       /* Nothing chosen yet */
541       flag = FALSE;
542
543       /* No redraw yet */
544       redraw = FALSE;
545
546       for (i = 0; i < MAX_MIND_POWERS; i++)
547         {
548           if (mind_ptr->info[i].min_lev <= plev)
549             {
550               num++;
551             }
552         }
553
554       /* Build a prompt (accept all spells) */
555       if (only_browse)
556         {
557 #ifdef JP
558           (void) strnfmt(out_val, 78, "(%^s %c-%c, '*'¤Ç°ìÍ÷, ESC) ¤É¤Î%s¤Ë¤Ä¤¤¤ÆÃΤê¤Þ¤¹¤«¡©",
559 #else
560           (void) strnfmt(out_val, 78, "(%^ss %c-%c, *=List, ESC=exit) Use which %s? ",
561 #endif
562                                        p, I2A(0), I2A(num - 1), p);
563           }
564         else
565           {
566 #ifdef JP
567 (void) strnfmt(out_val, 78, "(%^s %c-%c, '*'¤Ç°ìÍ÷, ESC) ¤É¤Î%s¤ò»È¤¤¤Þ¤¹¤«¡©",
568 #else
569                 (void)strnfmt(out_val, 78, "(%^ss %c-%c, *=List, ESC=exit) Use which %s? ",
570 #endif
571                 p, I2A(0), I2A(num - 1), p);
572         }
573
574         if (use_menu && !only_browse) screen_save();
575         /* Get a spell from the user */
576
577         choice= (always_show_list || use_menu) ? ESCAPE:1 ;
578         while (!flag)
579         {
580                 if(choice==ESCAPE) choice = ' '; 
581                 else if( !get_com(out_val, &choice, TRUE) )break;
582
583                 if (use_menu && choice != ' ')
584                 {
585                         switch(choice)
586                         {
587                                 case '0':
588                                 {
589                                         if (!only_browse) screen_load();
590                                         return (FALSE);
591                                         break;
592                                 }
593
594                                 case '8':
595                                 case 'k':
596                                 case 'K':
597                                 {
598                                         menu_line += (num - 1);
599                                         break;
600                                 }
601
602                                 case '2':
603                                 case 'j':
604                                 case 'J':
605                                 {
606                                         menu_line++;
607                                         break;
608                                 }
609
610                                 case 'x':
611                                 case 'X':
612                                 case '\r':
613                                 {
614                                         i = menu_line - 1;
615                                         ask = FALSE;
616                                         break;
617                                 }
618                         }
619                         if (menu_line > num) menu_line -= num;
620                 }
621                 /* Request redraw */
622                 if ((choice == ' ') || (choice == '*') || (choice == '?') || (use_menu && ask))
623                 {
624                         /* Show the list */
625                         if (!redraw || use_menu)
626                         {
627                                 char psi_desc[80];
628                                 bool has_weapon[2];
629
630                                 /* Show list */
631                                 redraw = TRUE;
632
633                                 /* Save the screen */
634                                 if (!only_browse && !use_menu) screen_save();
635
636                                 /* Display a list of spells */
637                                 prt("", y, x);
638 #ifdef JP
639 put_str("̾Á°", y, x + 5);
640 #else
641                                 put_str("Name", y, x + 5);
642 #endif
643
644 #ifdef JP
645 put_str(format("Lv   %s   ¼ºÎ¨ ¸ú²Ì", ((use_mind == MIND_BERSERKER) || (use_mind == MIND_NINJUTSU)) ? "HP" : "MP"), y, x + 35);
646 #else
647 put_str(format("Lv   %s   Fail Info", ((use_mind == MIND_BERSERKER) || (use_mind == MIND_NINJUTSU)) ? "HP" : "MP"), y, x + 35);
648 #endif
649                                 has_weapon[0] = buki_motteruka(INVEN_RARM);
650                                 has_weapon[1] = buki_motteruka(INVEN_LARM);
651
652                                 /* Dump the spells */
653                                 for (i = 0; i < MAX_MIND_POWERS; i++)
654                                 {
655                                         int mana_cost;
656
657                                         /* Access the spell */
658                                         spell = mind_ptr->info[i];
659
660                                         if (spell.min_lev > plev)   break;
661
662                                         chance = spell.fail;
663
664                                         mana_cost = spell.mana_cost;
665                                         if (chance)
666                                         {
667
668                                                 /* Reduce failure rate by "effective" level adjustment */
669                                                 chance -= 3 * (plev - spell.min_lev);
670
671                                                 /* Reduce failure rate by INT/WIS adjustment */
672                                                 chance -= 3 * (adj_mag_stat[p_ptr->stat_ind[mp_ptr->spell_stat]] - 1);
673
674                                                 if (use_mind == MIND_KI)
675                                                 {
676                                                         if (heavy_armor()) chance += 20;
677                                                         if (p_ptr->icky_wield[0]) chance += 20;
678                                                         else if (has_weapon[0]) chance += 10;
679                                                         if (p_ptr->icky_wield[1]) chance += 20;
680                                                         else if (has_weapon[1]) chance += 10;
681                                                         if (i == 5)
682                                                         {
683                                                                 int j;
684                                                                 for (j = 0; j < p_ptr->magic_num1[0] / 50; j++)
685                                                                         mana_cost += (j+1) * 3 / 2;
686                                                         }
687                                                 }
688
689                                                 /* Not enough mana to cast */
690                                                 if ((use_mind != MIND_BERSERKER) && (use_mind != MIND_NINJUTSU) && (mana_cost > p_ptr->csp))
691                                                 {
692                                                         chance += 5 * (mana_cost - p_ptr->csp);
693                                                 }
694
695                                                 if (p_ptr->pseikaku == SEIKAKU_NAMAKE) chance += 10;
696                                                 if (p_ptr->pseikaku == SEIKAKU_KIREMONO) chance -= 3;
697                                                 if ((p_ptr->pseikaku == SEIKAKU_GAMAN) || (p_ptr->pseikaku == SEIKAKU_CHIKARA)) chance++;
698
699                                                 /* Extract the minimum failure rate */
700                                                 minfail = adj_mag_fail[p_ptr->stat_ind[mp_ptr->spell_stat]];
701
702                                                 /* Minimum failure rate */
703                                                 if (chance < minfail) chance = minfail;
704
705                                                 /* Stunning makes spells harder */
706                                                 if (p_ptr->stun > 50) chance += 25;
707                                                 else if (p_ptr->stun) chance += 15;
708
709                                                 if (use_mind == MIND_KI)
710                                                 {
711                                                         if (heavy_armor()) chance += 5;
712                                                         if (p_ptr->icky_wield[0]) chance += 5;
713                                                         if (p_ptr->icky_wield[1]) chance += 5;
714                                                 }
715                                                 /* Always a 5 percent chance of working */
716                                                 if (chance > 95) chance = 95;
717                                         }
718
719                                         /* Get info */
720                                         mindcraft_info(comment, use_mind, i);
721
722                                         if (use_menu)
723                                         {
724                                                 if (i == (menu_line-1)) strcpy(psi_desc, "  ¡Õ ");
725                                                 else strcpy(psi_desc, "     ");
726                                         }
727                                         else
728                                                 sprintf(psi_desc, "  %c) ",I2A(i));
729                                         /* Dump the spell --(-- */
730                                         strcat(psi_desc,
731                                                format("%-30s%2d %4d%s %3d%%%s",
732                                                       spell.name, spell.min_lev, mana_cost,
733 #ifdef JP
734                                                       (((use_mind == MIND_MINDCRAFTER) && (i == 13)) ? "¡Á" : "  "), 
735 #else
736                                                       (((use_mind == MIND_MINDCRAFTER) && (i == 13)) ? "~ " : "  "), 
737 #endif
738                                                       chance, comment));
739                                         prt(psi_desc, y + i + 1, x);
740                                 }
741
742                                 /* Clear the bottom line */
743                                 prt("", y + i + 1, x);
744                         }
745
746                         /* Hide the list */
747                         else if (!only_browse)
748                         {
749                                 /* Hide list */
750                                 redraw = FALSE;
751
752                                 /* Restore the screen */
753                                 screen_load();
754                         }
755
756                         /* Redo asking */
757                         continue;
758                 }
759
760                 if (!use_menu)
761                 {
762                         /* Note verify */
763                         ask = isupper(choice);
764
765                         /* Lowercase */
766                         if (ask) choice = tolower(choice);
767
768                         /* Extract request */
769                         i = (islower(choice) ? A2I(choice) : -1);
770                 }
771
772                 /* Totally Illegal */
773                 if ((i < 0) || (i >= num))
774                 {
775                         bell();
776                         continue;
777                 }
778
779                 /* Save the spell index */
780                 spell = mind_ptr->info[i];
781
782                 /* Verify it */
783                 if (ask)
784                 {
785                         char tmp_val[160];
786
787                         /* Prompt */
788 #ifdef JP
789 (void) strnfmt(tmp_val, 78, "%s¤ò»È¤¤¤Þ¤¹¤«¡©", spell.name);
790 #else
791                         (void)strnfmt(tmp_val, 78, "Use %s? ", spell.name);
792 #endif
793
794
795                         /* Belay that order */
796                         if (!get_check(tmp_val)) continue;
797                 }
798
799                 /* Stop the loop */
800                 flag = TRUE;
801         }
802
803         /* Restore the screen */
804         if (redraw && !only_browse) screen_load();
805
806         /* Show choices */
807         if (show_choices)
808         {
809                 /* Update */
810                 p_ptr->window |= (PW_SPELL);
811
812                 /* Window stuff */
813                 window_stuff();
814         }
815
816         /* Abort if needed */
817         if (!flag) return (FALSE);
818
819         /* Save the choice */
820         (*sn) = i;
821
822 #ifdef ALLOW_REPEAT /* TNB */
823
824         repeat_push(*sn);
825
826 #endif /* ALLOW_REPEAT -- TNB */
827
828         /* Success */
829         return (TRUE);
830 }
831
832
833 /*
834  * do_cmd_cast calls this function if the player's class
835  * is 'mindcrafter'.
836  */
837 static bool cast_mindcrafter_spell(int spell)
838 {
839         int             b = 0;
840         int             dir;
841         int             plev = p_ptr->lev;
842
843         /* spell code */
844         switch (spell)
845         {
846         case 0:   /* Precog */
847                 if (plev > 44)
848                 {
849                         chg_virtue(V_KNOWLEDGE, 1);
850                         chg_virtue(V_ENLIGHTEN, 1);
851                         wiz_lite(FALSE, FALSE);
852                 }
853                 else if (plev > 19)
854                         map_area(DETECT_RAD_MAP);
855
856                 if (plev < 30)
857                 {
858                         b = detect_monsters_normal(DETECT_RAD_DEFAULT);
859                         if (plev > 14) b |= detect_monsters_invis(DETECT_RAD_DEFAULT);
860                         if (plev > 4)  {
861                                 b |= detect_traps(DETECT_RAD_DEFAULT);
862                                 b |= detect_doors(DETECT_RAD_DEFAULT);
863                         }
864                 }
865                 else
866                 {
867                         b = detect_all(DETECT_RAD_DEFAULT);
868                 }
869
870                 if ((plev > 24) && (plev < 40))
871                         set_tim_esp(plev, FALSE);
872
873 #ifdef JP
874 if (!b) msg_print("°ÂÁ´¤Êµ¤¤¬¤¹¤ë¡£");
875 #else
876                 if (!b) msg_print("You feel safe.");
877 #endif
878
879                 break;
880         case 1:
881                 /* Mindblast */
882                 if (!get_aim_dir(&dir)) return FALSE;
883
884                 if (randint(100) < plev * 2)
885                         fire_beam(GF_PSI, dir, damroll(3 + ((plev - 1) / 4), (3 + plev / 15)));
886                 else
887                         fire_ball(GF_PSI, dir, damroll(3 + ((plev - 1) / 4), (3 + plev / 15)), 0);
888                 break;
889         case 2:
890                 /* Minor displace */
891                 teleport_player(10);
892                 break;
893         case 3:
894                 /* Major displace */
895                 teleport_player(plev * 5);
896                 break;
897         case 4:
898                 /* Domination */
899                 if (plev < 30)
900                 {
901                         if (!get_aim_dir(&dir)) return FALSE;
902
903                         fire_ball(GF_DOMINATION, dir, plev, 0);
904                 }
905                 else
906                 {
907                         charm_monsters(plev * 2);
908                 }
909                 break;
910         case 5:
911                 /* Fist of Force  ---  not 'true' TK  */
912                 if (!get_aim_dir(&dir)) return FALSE;
913
914                 fire_ball(GF_TELEKINESIS, dir, damroll(8 + ((plev - 5) / 4), 8),
915                         (plev > 20 ? (plev - 20) / 8 + 1 : 0));
916                 break;
917         case 6:
918                 /* Character Armour */
919                 set_shield(plev, FALSE);
920                 if (plev > 14) set_oppose_acid(plev, FALSE);
921                 if (plev > 19) set_oppose_fire(plev, FALSE);
922                 if (plev > 24) set_oppose_cold(plev, FALSE);
923                 if (plev > 29) set_oppose_elec(plev, FALSE);
924                 if (plev > 34) set_oppose_pois(plev, FALSE);
925                 break;
926         case 7:
927                 /* Psychometry */
928                 if (plev < 25)
929                         return psychometry();
930                 else
931                         return ident_spell(FALSE);
932                 break;
933         case 8:
934                 /* Mindwave */
935 #ifdef JP
936 msg_print("Àº¿À¤òDZ¤¸¶Ê¤²¤ëÇÈÆ°¤òȯÀ¸¤µ¤»¤¿¡ª");
937 #else
938                 msg_print("Mind-warping forces emanate from your brain!");
939 #endif
940
941                 if (plev < 25)
942                         project(0, 2 + plev / 10, py, px,
943                         (plev * 3), GF_PSI, PROJECT_KILL, -1);
944                 else
945                         (void)mindblast_monsters(randint(plev * ((plev - 5) / 10 + 1)));
946                 break;
947         case 9:
948                 /* Adrenaline */
949                 set_afraid(0);
950                 set_stun(0);
951
952                 /*
953                  * Only heal when Adrenalin Channeling is not active. We check
954                  * that by checking if the player isn't fast and 'heroed' atm.
955                  */
956                 if (!p_ptr->fast || !p_ptr->hero)
957                 {
958                         hp_player(plev);
959                 }
960
961                 b = 10 + randint((plev * 3) / 2);
962                 set_hero(b, FALSE);
963                 /* Haste */
964                 (void)set_fast(b, FALSE);
965                 break;
966         case 10:
967                 /* Telekinesis */
968                 if (!get_aim_dir(&dir)) return FALSE;
969
970                 fetch(dir, plev * 15, FALSE);
971
972                 break;
973         case 11:
974                 /* Psychic Drain */
975                 if (!get_aim_dir(&dir)) return FALSE;
976
977                 b = damroll(plev / 2, 6);
978
979                 /* This is always a radius-0 ball now */
980                 if (fire_ball(GF_PSI_DRAIN, dir, b, 0))
981                         p_ptr->energy -= randint(150);
982                 break;
983         case 12:
984                 /* psycho-spear */
985                 if (!get_aim_dir(&dir)) return FALSE;
986
987                 fire_beam(GF_PSY_SPEAR, dir, randint(plev*3)+plev*3);
988                 break;
989         case 13:
990         {
991                 if (world_player)
992                 {
993 #ifdef JP
994                         msg_print("´û¤Ë»þ¤Ï»ß¤Þ¤Ã¤Æ¤¤¤ë¡£");
995 #else
996                         msg_print("Time is already stopped.");
997 #endif
998                         return (FALSE);
999                 }
1000                 world_player = TRUE;
1001 #ifdef JP
1002                 msg_print("¡Ö»þ¤è¡ª¡×");
1003 #else
1004                 msg_print("You yell 'Time!'");
1005 #endif
1006                 msg_print(NULL);
1007
1008                 p_ptr->energy += (p_ptr->csp + 950);
1009
1010                 /* Redraw map */
1011                 p_ptr->redraw |= (PR_MAP);
1012
1013                 /* Update monsters */
1014                 p_ptr->update |= (PU_MONSTERS);
1015
1016                 /* Window stuff */
1017                 p_ptr->window |= (PW_OVERHEAD | PW_DUNGEON);
1018
1019                 handle_stuff();
1020                 break;
1021         }
1022         default:
1023 #ifdef JP
1024 msg_print("¤Ê¤Ë¡©");
1025 #else
1026                 msg_print("Zap?");
1027 #endif
1028
1029         }
1030
1031         return TRUE;
1032 }
1033
1034
1035 /*
1036  * do_cmd_cast calls this function if the player's class
1037  * is 'ForceTrainer'.
1038  */
1039 static bool cast_force_spell(int spell)
1040 {
1041         int             dir;
1042         int             plev = p_ptr->lev;
1043         int             boost = p_ptr->magic_num1[0];
1044
1045         if (heavy_armor()) boost /= 2;
1046
1047         /* spell code */
1048         switch (spell)
1049         {
1050         case 0:
1051                 if (!get_aim_dir(&dir)) return FALSE;
1052                 fire_ball(GF_MISSILE, dir, damroll(3 + ((plev - 1) / 5) + boost / 12, 4), 0);
1053                 break;
1054         case 1:
1055                 (void)lite_area(damroll(2, (plev / 2)), (plev / 10) + 1);
1056                 break;
1057         case 2:
1058                 set_tim_ffall(randint(30) + 30 + boost / 5, FALSE);
1059                 break;
1060         case 3:
1061                 project_length = plev / 8 + 3;
1062                 if (!get_aim_dir(&dir)) return FALSE;
1063
1064                 fire_beam(GF_MISSILE, dir, damroll(5 + ((plev - 1) / 5) + boost / 10, 5));
1065                 break;
1066         case 4:
1067                 set_resist_magic(randint(20) + 20 + boost / 5, FALSE);
1068                 break;
1069         case 5:
1070 #ifdef JP
1071                 msg_print("µ¤¤òÎý¤Ã¤¿¡£");
1072 #else
1073                 msg_print("You improved the Force.");
1074 #endif
1075                 p_ptr->magic_num1[0] += (70 + plev);
1076                 if (randint(p_ptr->magic_num1[0]) > (plev * 4 + 120))
1077                 {
1078 #ifdef JP
1079                         msg_print("µ¤¤¬Ë½Áö¤·¤¿¡ª");
1080 #else
1081                         msg_print("The Force exploded!");
1082 #endif
1083                         fire_ball(GF_MANA, 0, p_ptr->magic_num1[0] / 2, 10);
1084 #ifdef JP
1085                         take_hit(DAMAGE_LOSELIFE, p_ptr->magic_num1[0] / 2, "µ¤¤Î˽Áö", -1);
1086 #else
1087                         take_hit(DAMAGE_LOSELIFE, p_ptr->magic_num1[0] / 2, "Explosion of the Force", -1);
1088 #endif
1089                 }
1090                 else return TRUE;
1091                 break;
1092         case 6:
1093                 set_tim_sh_touki(randint(plev / 2) + 15 + boost / 7, FALSE);
1094                 break;
1095         case 7:
1096         {
1097                 int y, x, dam;
1098                 project_length = 1;
1099                 if (!get_aim_dir(&dir)) return FALSE;
1100
1101                 y = py + ddy[dir];
1102                 x = px + ddx[dir];
1103                 dam = damroll(8 + ((plev - 5) / 4) + boost / 12, 8);
1104                 fire_beam(GF_MISSILE, dir, dam);
1105                 if (cave[y][x].m_idx)
1106                 {
1107                         int i;
1108                         int ty = y, tx = x;
1109                         int oy = y, ox = x;
1110                         int m_idx = cave[y][x].m_idx;
1111                         monster_type *m_ptr = &m_list[m_idx];
1112                         char m_name[80];
1113
1114                         monster_desc(m_name, m_ptr, 0);
1115
1116                         if (randint(r_info[m_ptr->r_idx].level * 3 / 2) > rand_int(dam / 2) + dam/2)
1117                         {
1118 #ifdef JP
1119                                 msg_format("%s¤ÏÈô¤Ð¤µ¤ì¤Ê¤«¤Ã¤¿¡£", m_name);
1120 #else
1121                                 msg_format("%^s was not blown away.", m_name);
1122 #endif
1123                         }
1124                         else
1125                         {
1126                                 for (i = 0; i < 5; i++)
1127                                 {
1128                                         y += ddy[dir];
1129                                         x += ddx[dir];
1130                                         if (cave_empty_bold(y, x))
1131                                         {
1132                                                 ty = y;
1133                                                 tx = x;
1134                                         }
1135                                         else break;
1136                                 }
1137                                 if ((ty != oy) || (tx != ox))
1138                                 {
1139 #ifdef JP
1140                                         msg_format("%s¤ò¿á¤­Èô¤Ð¤·¤¿¡ª", m_name);
1141 #else
1142                                         msg_format("You blow %s away!", m_name);
1143 #endif
1144                                         cave[oy][ox].m_idx = 0;
1145                                         cave[ty][tx].m_idx = m_idx;
1146                                         m_ptr->fy = ty;
1147                                         m_ptr->fx = tx;
1148
1149                                         update_mon(m_idx, TRUE);
1150                                         lite_spot(oy, ox);
1151                                         lite_spot(ty, tx);
1152                                 }
1153                         }
1154                 }
1155                 break;
1156         }
1157         case 8:
1158                 if (!get_aim_dir(&dir)) return FALSE;
1159                 fire_ball(GF_MISSILE, dir, damroll(10, 6) + plev * 3 / 2 + boost * 3 / 5, (plev < 30) ? 2 : 3);
1160                 break;
1161         case 9:
1162         {
1163                 monster_type *m_ptr;
1164                 char m_name[80];
1165
1166                 if (!target_set(TARGET_KILL)) return FALSE;
1167                 if (!cave[target_row][target_col].m_idx) break;
1168                 if (!los(py, px, target_row, target_col)) break;
1169                 m_ptr = &m_list[cave[target_row][target_col].m_idx];
1170                 monster_desc(m_name, m_ptr, 0);
1171                 if (m_ptr->invulner)
1172                 {
1173                         m_ptr->invulner = 0;
1174 #ifdef JP
1175 msg_format("%s¤Ï¤â¤¦ÌµÅ¨¤Ç¤Ï¤Ê¤¤¡£", m_name);
1176 #else
1177                         msg_format("%^s is no longer invulnerable.", m_name);
1178 #endif
1179                 }
1180                 if (m_ptr->fast)
1181                 {
1182                         m_ptr->fast = 0;
1183 #ifdef JP
1184 msg_format("%s¤Ï¤â¤¦²Ã®¤µ¤ì¤Æ¤¤¤Ê¤¤¡£", m_name);
1185 #else
1186                         msg_format("%^s is no longer fast.", m_name);
1187 #endif
1188                 }
1189                 if (m_ptr->slow)
1190                 {
1191                         m_ptr->slow = 0;
1192 #ifdef JP
1193 msg_format("%s¤Ï¤â¤¦¸ºÂ®¤µ¤ì¤Æ¤¤¤Ê¤¤¡£", m_name);
1194 #else
1195                         msg_format("%^s is no longer slow.", m_name);
1196 #endif
1197                 }
1198                 p_ptr->redraw |= (PR_HEALTH);
1199                 if (p_ptr->riding == cave[target_row][target_col].m_idx) p_ptr->redraw |= (PR_UHEALTH);
1200
1201                 break;
1202         }
1203         case 10:
1204         {
1205                 int i;
1206                 bool success = FALSE;
1207
1208                 for (i = 0; i < 1 + boost/100; i++)
1209                         if (summon_specific(-1, py, px, plev, SUMMON_PHANTOM, FALSE, TRUE, TRUE, FALSE, FALSE))
1210                                 success = TRUE;
1211                 if (success)
1212                 {
1213 #ifdef JP
1214 msg_print("¸æÍѤǤ´¤¶¤¤¤Þ¤¹¤¬¡¢¸æ¼ç¿ÍÍÍ¡©");
1215 #else
1216                         msg_print("'Your wish, master?'");
1217 #endif
1218                 }
1219                 else
1220                 {
1221 #ifdef JP
1222                         msg_print("²¿¤â¸½¤ì¤Ê¤«¤Ã¤¿¡£");
1223 #else
1224                         msg_print("Nothing happen.");
1225 #endif
1226                 }
1227                 break;
1228         }
1229         case 11:
1230                 fire_ball(GF_FIRE, 0, 200 + (2 * plev) + boost * 2, 10);
1231                 break;
1232         case 12:
1233                 if (!get_aim_dir(&dir)) return FALSE;
1234
1235                 fire_beam(GF_MANA, dir, damroll(10 + (plev / 2) + boost * 3 / 10, 15));
1236                 break;
1237         case 13:
1238                 set_lightspeed(randint(16) + 16 + boost / 20, FALSE);
1239                 break;
1240         default:
1241 #ifdef JP
1242 msg_print("¤Ê¤Ë¡©");
1243 #else
1244                 msg_print("Zap?");
1245 #endif
1246
1247         }
1248         p_ptr->magic_num1[0] = 0;
1249
1250         return TRUE;
1251 }
1252
1253 /* by henkma */
1254 /* calculate mirrors */
1255 static int number_of_mirrors( void )
1256 {
1257   int x,y;
1258   int val=0;
1259   for( x=0 ; x < cur_wid ; x++ ){
1260     for( y=0 ; y < cur_hgt ; y++ ){
1261       if( cave[y][x].feat == FEAT_MIRROR )val++;
1262     }
1263   }
1264   return val;
1265 }
1266
1267 static bool cast_mirror_spell(int spell)
1268 {
1269         int             dir;
1270         int             plev = p_ptr->lev;
1271         int             tmp;
1272         int             x,y;
1273
1274         /* spell code */
1275         switch (spell)
1276         {
1277         /* mirror of seeing */
1278         case 0:
1279           tmp = cave[py][px].feat == FEAT_MIRROR ? 4 : 0;
1280           if( plev + tmp > 4)detect_monsters_normal(DETECT_RAD_DEFAULT);
1281           if( plev + tmp > 18 )detect_monsters_invis(DETECT_RAD_DEFAULT);
1282           if( plev + tmp > 28 )set_tim_esp(plev,FALSE);
1283           if( plev + tmp > 38 )map_area(DETECT_RAD_MAP);
1284           if( tmp == 0 && plev < 5 ){
1285 #ifdef JP
1286             msg_print("¶À¤¬¤Ê¤¯¤Æ½¸Ãæ¤Ç¤­¤Ê¤«¤Ã¤¿¡ª");
1287 #else
1288             msg_print("You need a mirror to concentrate!");
1289 #endif
1290           }
1291           break;
1292         /* drip of light */
1293         case 1:
1294           if( number_of_mirrors() < 4 + plev/10 ){
1295             warding_mirror();
1296           }
1297           else {
1298 #ifdef JP
1299 msg_format("¤³¤ì°Ê¾å¶À¤ÏÀ©¸æ¤Ç¤­¤Ê¤¤¡ª");
1300 #else
1301 msg_format("There are too many mirrors to control!");
1302 #endif
1303           }
1304           break;
1305         case 2:
1306           if (!get_aim_dir(&dir)) return FALSE;
1307           if ( plev > 9 && cave[py][px].feat == FEAT_MIRROR ){
1308             fire_beam(GF_LITE, dir,damroll(3+((plev-1)/5),4));
1309           }
1310           else {
1311             fire_bolt(GF_LITE, dir,damroll(3+((plev-1)/5),4));
1312           }
1313           break;
1314         /* warped mirror */
1315         case 3:
1316           teleport_player(10);
1317           break;
1318         /* mirror of light */
1319         case 4:
1320           (void)lite_area(damroll(2, (plev / 2)), (plev / 10) + 1);
1321           break;
1322         /* mirror of wandering */
1323         case 5:
1324           teleport_player(plev * 5);
1325           break;
1326         /* robe of dust */
1327         case 6:
1328           set_dustrobe(20+randint(20),FALSE);
1329           break;
1330         /* banishing mirror */
1331         case 7:
1332           if (!get_aim_dir(&dir)) return FALSE;
1333           (void)fire_beam(GF_AWAY_ALL, dir , plev);
1334           break;
1335         /* mirror clashing */
1336         case 8:
1337           if (!get_aim_dir(&dir)) return FALSE;
1338           fire_ball(GF_SHARDS, dir, damroll(8 + ((plev - 5) / 4), 8),
1339                     (plev > 20 ? (plev - 20) / 8 + 1 : 0));
1340           break;
1341         /* mirror sleeping */
1342         case 9:
1343           for(x=0;x<cur_wid;x++){
1344             for(y=0;y<cur_hgt;y++){
1345               if(cave[y][x].feat == FEAT_MIRROR){
1346                 project(0,2,y,x,plev,GF_OLD_SLEEP,(PROJECT_GRID|PROJECT_ITEM|PROJECT_KILL|PROJECT_JUMP|PROJECT_NO_REF|PROJECT_NO_HANGEKI),-1);
1347               }
1348             }
1349           }
1350           break;
1351         /* seeker ray */
1352         case 10:
1353           if (!get_aim_dir(&dir)) return FALSE;
1354           fire_beam(GF_SEEKER,dir, damroll(11+(plev-5)/4,8));
1355           break;
1356         /* seal of mirror */
1357         case 11:
1358           seal_of_mirror(plev*4+100);
1359           break;
1360         /* shield of water */
1361         case 12:
1362           tmp = 20+randint(20);
1363           set_shield(tmp, FALSE);
1364           if( plev > 31 )set_tim_reflect(tmp, FALSE);
1365           if( plev > 39 )set_resist_magic(tmp,FALSE);
1366           break;
1367         /* super ray */
1368         case 13:
1369           if (!get_aim_dir(&dir)) return FALSE;
1370           fire_beam(GF_SUPER_RAY,dir, 150+randint(2*plev));
1371           break;
1372         /* illusion light */
1373         case 14:
1374           tmp = cave[py][px].feat == FEAT_MIRROR ? 4 : 3;
1375           slow_monsters();
1376           stun_monsters(plev*tmp);
1377           confuse_monsters(plev*tmp);
1378           turn_monsters(plev*tmp);
1379           stun_monsters(plev*tmp);
1380           stasis_monsters(plev*tmp);
1381           break;
1382         /* mirror shift */
1383         case 15:
1384           if(  cave[py][px].feat != FEAT_MIRROR ){
1385 #ifdef JP
1386                 msg_print("¶À¤Î¹ñ¤Î¾ì½ê¤¬¤ï¤«¤é¤Ê¤¤¡ª");
1387 #else
1388                 msg_print("You cannot find out where is the world of mirror!");
1389 #endif
1390                 break;
1391           }
1392           alter_reality();
1393           break;
1394         /* mirror tunnel */
1395         case 16:
1396 #ifdef JP
1397           msg_print("¶À¤ÎÀ¤³¦¤òÄ̤êÈ´¤±¡Ä  ");
1398 #else
1399           msg_print("Go through the world of mirror...");
1400 #endif
1401           return dimension_door();
1402         /* mirror of recall */
1403         case 17:
1404           if(!word_of_recall())return FALSE;
1405           break;
1406         /* multi-shadow */
1407         case 18:
1408           set_multishadow(6+randint(6),FALSE);
1409           break;
1410         /* binding field */
1411         case 19:
1412 #ifdef JP
1413           if( !binding_field(plev*11+5) )msg_print("ŬÅö¤Ê¶À¤òÁª¤Ù¤Ê¤«¤Ã¤¿¡ª");
1414 #else
1415           if( !binding_field(plev*11+5) )msg_print("You were not able to choose suitable mirrors!");
1416 #endif
1417           break;
1418         /* mirror of Ruffnor */
1419         case 20:
1420           (void)set_invuln(randint(4)+4,FALSE);
1421           break;
1422         default:
1423 #ifdef JP
1424 msg_print("¤Ê¤Ë¡©");
1425 #else
1426                 msg_print("Zap?");
1427 #endif
1428
1429         }
1430         p_ptr->magic_num1[0] = 0;
1431
1432         return TRUE;
1433 }
1434
1435
1436 /*
1437  * do_cmd_cast calls this function if the player's class
1438  * is 'berserker'.
1439  */
1440 static bool cast_berserk_spell(int spell)
1441 {
1442         int y, x;
1443         int dir;
1444
1445         /* spell code */
1446         switch (spell)
1447         {
1448         case 0:
1449                 detect_monsters_mind(DETECT_RAD_DEFAULT);
1450                 break;
1451         case 1:
1452         {
1453                 if (p_ptr->riding)
1454                 {
1455 #ifdef JP
1456                         msg_print("¾èÇÏÃæ¤Ë¤Ï̵Íý¤À¡£");
1457 #else
1458                         msg_print("You cannot do it when riding.");
1459 #endif
1460                         return FALSE;
1461                 }
1462
1463                 if (!get_rep_dir2(&dir)) return FALSE;
1464
1465                 if (dir == 5) return FALSE;
1466                 y = py + ddy[dir];
1467                 x = px + ddx[dir];
1468
1469                 if (!cave[y][x].m_idx)
1470                 {
1471 #ifdef JP
1472                         msg_print("¤½¤ÎÊý¸þ¤Ë¤Ï¥â¥ó¥¹¥¿¡¼¤Ï¤¤¤Þ¤»¤ó¡£");
1473 #else
1474                         msg_print("There is no monster.");
1475 #endif
1476                         return FALSE;
1477                 }
1478
1479                 py_attack(y, x, 0);
1480
1481                 if (!player_can_enter(cave[y][x].feat) || is_trap(cave[y][x].feat))
1482                         break;
1483
1484                 y += ddy[dir];
1485                 x += ddx[dir];
1486
1487                 if (player_can_enter(cave[y][x].feat) && !is_trap(cave[y][x].feat) && !cave[y][x].m_idx)
1488                 {
1489                         int oy, ox;
1490
1491                         msg_print(NULL);
1492
1493                         /* Save the old location */
1494                         oy = py;
1495                         ox = px;
1496
1497                         /* Move the player */
1498                         py = y;
1499                         px = x;
1500
1501                         forget_flow();
1502
1503                         /* Redraw the old spot */
1504                         lite_spot(oy, ox);
1505
1506                         /* Redraw the new spot */
1507                         lite_spot(py, px);
1508
1509                         /* Check for new panel (redraw map) */
1510                         verify_panel();
1511
1512                         /* Update stuff */
1513                         p_ptr->update |= (PU_VIEW | PU_LITE | PU_FLOW);
1514
1515                         /* Update the monsters */
1516                         p_ptr->update |= (PU_DISTANCE);
1517
1518                         /* Window stuff */
1519                         p_ptr->window |= (PW_OVERHEAD | PW_DUNGEON);
1520
1521                         /* Handle stuff XXX XXX XXX */
1522                         handle_stuff();
1523                 }
1524                 break;
1525         }
1526         case 2:
1527         {
1528                 if (!get_rep_dir2(&dir)) return FALSE;
1529                 y = py + ddy[dir];
1530                 x = px + ddx[dir];
1531                 move_player(dir, easy_disarm, TRUE);
1532                 break;
1533         }
1534         case 3:
1535                 earthquake(py, px, 8+rand_int(5));
1536                 break;
1537         case 4:
1538         {
1539                 cave_type       *c_ptr;
1540                 monster_type    *m_ptr;
1541
1542                 for (dir = 0; dir < 8; dir++)
1543                 {
1544                         y = py + ddy_ddd[dir];
1545                         x = px + ddx_ddd[dir];
1546                         c_ptr = &cave[y][x];
1547
1548                         /* Get the monster */
1549                         m_ptr = &m_list[c_ptr->m_idx];
1550
1551                         /* Hack -- attack monsters */
1552                         if (c_ptr->m_idx && (m_ptr->ml || cave_floor_bold(y, x)))
1553                                 py_attack(y, x, 0);
1554                 }
1555                 break;
1556         }
1557         default:
1558 #ifdef JP
1559 msg_print("¤Ê¤Ë¡©");
1560 #else
1561                 msg_print("Zap?");
1562 #endif
1563
1564         }
1565         return TRUE;
1566 }
1567
1568
1569
1570 /*
1571  * do_cmd_cast calls this function if the player's class
1572  * is 'ninja'.
1573  */
1574 static bool cast_ninja_spell(int spell)
1575 {
1576         int x, y;
1577         int dir;
1578         int plev = p_ptr->lev;
1579
1580         /* spell code */
1581         switch (spell)
1582         {
1583         case 0:
1584                 (void)unlite_area(0, 3);
1585                 break;
1586         case 1:
1587                 if (plev > 44)
1588                 {
1589                         wiz_lite(FALSE, TRUE);
1590                 }
1591                 detect_monsters_normal(DETECT_RAD_DEFAULT);
1592                 if (plev > 4)
1593                 {
1594                         detect_traps(DETECT_RAD_DEFAULT);
1595                         detect_doors(DETECT_RAD_DEFAULT);
1596                         detect_stairs(DETECT_RAD_DEFAULT);
1597                 }
1598                 if (plev > 14)
1599                 {
1600                         detect_objects_normal(DETECT_RAD_DEFAULT);
1601                 }
1602                 break;
1603         case 2:
1604         {
1605                 teleport_player(10);
1606                 if (cave[py][px].info & (CAVE_GLOW | CAVE_MNLT)) set_superstealth(FALSE);
1607                 else if (p_ptr->cur_lite <= 0) set_superstealth(TRUE);
1608                 break;
1609         }
1610         case 3:
1611         {
1612                 if (!(p_ptr->special_defense & NINJA_KAWARIMI))
1613                 {
1614 #ifdef JP
1615                         msg_print("Ũ¤Î¹¶·â¤ËÂФ·¤ÆÉÒ´¶¤Ë¤Ê¤Ã¤¿¡£");
1616 #else
1617                         msg_print("You are now prepare to evade any attacks.");
1618 #endif
1619
1620                         p_ptr->special_defense |= NINJA_KAWARIMI;
1621                         p_ptr->redraw |= (PR_STATUS);
1622                 }
1623                 break;
1624         }
1625         case 4:
1626         {
1627                 teleport_player(p_ptr->lev*5);
1628                 if (cave[py][px].info & (CAVE_GLOW | CAVE_MNLT)) set_superstealth(FALSE);
1629                 else if (p_ptr->cur_lite <= 0) set_superstealth(TRUE);
1630                 break;
1631         }
1632         case 5:
1633         {
1634                 if (!get_rep_dir(&dir, FALSE)) return FALSE;
1635                 y = py + ddy[dir];
1636                 x = px + ddx[dir];
1637                 if (cave[y][x].m_idx)
1638                 {
1639                         py_attack(y, x, 0);
1640                         if (rand_int(p_ptr->skill_dis) < 7)
1641 #ifdef JP
1642 msg_print("¤¦¤Þ¤¯Æ¨¤²¤é¤ì¤Ê¤«¤Ã¤¿¡£");
1643 #else
1644                                 msg_print("You failed to run away.");
1645 #endif
1646                         else
1647                         {
1648                                 teleport_player(30);
1649                                 if (cave[py][px].info & (CAVE_GLOW | CAVE_MNLT)) set_superstealth(FALSE);
1650                                 else if (p_ptr->cur_lite <= 0) set_superstealth(TRUE);
1651                         }
1652                 }
1653                 else
1654                 {
1655 #ifdef JP
1656 msg_print("¤½¤ÎÊý¸þ¤Ë¤Ï¥â¥ó¥¹¥¿¡¼¤Ï¤¤¤Þ¤»¤ó¡£");
1657 #else
1658                         msg_print("You don't see any monster in this direction");
1659 #endif
1660
1661                         msg_print(NULL);
1662                 }
1663                 break;
1664         }
1665         case 6:
1666         {
1667                 if (!get_aim_dir(&dir)) return FALSE;
1668                 (void)stasis_monster(dir);
1669                 break;
1670         }
1671         case 7:
1672                 return ident_spell(FALSE);
1673                 break;
1674         case 8:
1675                 set_tim_ffall(randint(20) + 20, FALSE);
1676                 break;
1677         case 9:
1678                 fire_ball(GF_FIRE, 0, 50+plev, plev/10+2);
1679                 teleport_player(30);
1680                 if (cave[py][px].info & (CAVE_GLOW | CAVE_MNLT)) set_superstealth(FALSE);
1681                 else if (p_ptr->cur_lite <= 0) set_superstealth(TRUE);
1682                 set_oppose_fire(plev, FALSE);
1683                 break;
1684         case 10:
1685                 project_length = 5;
1686                 if (!get_aim_dir(&dir)) return FALSE;
1687                 project_hook(GF_ATTACK, dir, HISSATSU_NYUSIN, PROJECT_STOP | PROJECT_KILL | PROJECT_NO_REF);
1688
1689                 break;
1690         case 11:
1691         {
1692                 int i;
1693                 for (i = 0; i < 8; i++)
1694                 {
1695                         int slot;
1696
1697                         for (slot = 0; slot < INVEN_PACK; slot++)
1698                         {
1699                                 if (inventory[slot].tval == TV_SPIKE) break;
1700                         }
1701                         if (slot == INVEN_PACK)
1702                         {
1703 #ifdef JP
1704                                 if (!i) msg_print("¤¯¤µ¤Ó¤ò»ý¤Ã¤Æ¤¤¤Ê¤¤¡£");
1705                                 else msg_print("¤¯¤µ¤Ó¤¬¤Ê¤¯¤Ê¤Ã¤¿¡£");
1706 #else
1707                                 if (!i) msg_print("You have no Iron Spikes.");
1708                                 else msg_print("You have no more Iron Spikes.");
1709 #endif
1710                                 return FALSE;
1711                         }
1712
1713                         /* Gives a multiplier of 2 at first, up to 3 at 40th */
1714                         do_cmd_throw_aux(1, FALSE, slot);
1715
1716                         energy_use = 100;
1717                 }
1718                 break;
1719         }
1720         case 12:
1721         {
1722                 monster_type *m_ptr;
1723                 int m_idx;
1724                 char m_name[80];
1725                 int i;
1726                 int path_n;
1727                 u16b path_g[512];
1728                 int ty,tx;
1729
1730                 if (!target_set(TARGET_KILL)) return FALSE;
1731                 m_idx = cave[target_row][target_col].m_idx;
1732                 if (!m_idx) break;
1733                 if (!player_has_los_bold(target_row, target_col)) break;
1734                 m_ptr = &m_list[m_idx];
1735                 monster_desc(m_name, m_ptr, 0);
1736 #ifdef JP
1737                 msg_format("%s¤ò°ú¤­Ìᤷ¤¿¡£", m_name);
1738 #else
1739                 msg_format("You pull back %s.", m_name);
1740 #endif
1741
1742                 path_n = project_path(path_g, MAX_RANGE, target_row, target_col, py, px, 0);
1743                 ty = target_row, tx = target_col;
1744                 for (i = 1; i < path_n; i++)
1745                 {
1746                         int ny = GRID_Y(path_g[i]);
1747                         int nx = GRID_X(path_g[i]);
1748                         
1749                         if (in_bounds(ny, nx) && cave_empty_bold(ny, nx) &&
1750                             cave[ny][nx].feat != FEAT_GLYPH &&
1751                             cave[ny][nx].feat != FEAT_MINOR_GLYPH &&
1752                             !(cave[ny][nx].feat >= FEAT_PATTERN_START &&
1753                               cave[ny][nx].feat <= FEAT_PATTERN_XTRA2))
1754                         {
1755                                 ty = ny;
1756                                 tx = nx;
1757                         }
1758                 }
1759                 /* Update the old location */
1760                 cave[target_row][target_col].m_idx = 0;
1761
1762                 /* Update the new location */
1763                 cave[ty][tx].m_idx = m_idx;
1764
1765                 /* Move the monster */
1766                 m_ptr->fy = ty;
1767                 m_ptr->fx = tx;
1768
1769                 /* Wake the monster up */
1770                 m_ptr->csleep = 0;
1771
1772                 /* Update the monster (new location) */
1773                 update_mon(m_idx, TRUE);
1774
1775                 /* Redraw the old grid */
1776                 lite_spot(target_row, target_col);
1777
1778                 /* Redraw the new grid */
1779                 lite_spot(ty, tx);
1780
1781                 p_ptr->update |= (PU_MON_LITE);
1782
1783                 break;
1784         }
1785         case 13:
1786                 if (!get_aim_dir(&dir)) return FALSE;
1787                 fire_ball(GF_OLD_CONF, dir, plev*3, 3);
1788                 break;
1789         case 14:
1790                 project_length = -1;
1791                 if (!get_aim_dir(&dir))
1792                 {
1793                         project_length = 0;
1794                         return FALSE;
1795                 }
1796                 project_length = 0;
1797
1798                 (void)teleport_swap(dir);
1799                 break;
1800         case 15:
1801                 explosive_rune();
1802                 break;
1803         case 16:
1804                 (void)set_kabenuke(randint(plev/2) + plev/2, FALSE);
1805                 set_oppose_acid(plev, FALSE);
1806                 break;
1807         case 17:
1808                 fire_ball(GF_POIS, 0, 75+plev*2/3, plev/5+2);
1809                 fire_ball(GF_OLD_DRAIN, 0, 75+plev*2/3, plev/5+2);
1810                 fire_ball(GF_CONFUSION, 0, 75+plev*2/3, plev/5+2);
1811                 teleport_player(30);
1812                 if (cave[py][px].info & (CAVE_GLOW | CAVE_MNLT)) set_superstealth(FALSE);
1813                 else if (p_ptr->cur_lite <= 0) set_superstealth(TRUE);
1814                 break;
1815         case 18:
1816         {
1817                 int k;
1818                 int num = damroll(3, 9);
1819
1820                 for (k = 0; k < num; k++)
1821                 {
1822                         int typ = one_in_(2) ? GF_FIRE : one_in_(3) ? GF_NETHER : GF_PLASMA;
1823                         int attempts = 1000;
1824
1825                         while(attempts--)
1826                         {
1827                                 scatter(&y, &x, py, px, 4, 0);
1828
1829                                 if ((y != py) || (x != px)) break;
1830                         }
1831                         project(0, 0, y, x, damroll(6 + plev / 8, 10), typ,
1832                                 (PROJECT_BEAM | PROJECT_THRU | PROJECT_GRID | PROJECT_KILL), -1);
1833                 }
1834                 break;
1835         }
1836         case 19:
1837                 set_multishadow(6+randint(6), FALSE);
1838                 break;
1839         default:
1840 #ifdef JP
1841 msg_print("¤Ê¤Ë¡©");
1842 #else
1843                 msg_print("Zap?");
1844 #endif
1845
1846         }
1847         return TRUE;
1848 }
1849
1850
1851
1852 /*
1853  * do_cmd_cast calls this function if the player's class
1854  * is 'mindcrafter'.
1855  */
1856 void do_cmd_mind(void)
1857 {
1858         int             n = 0,  b = 0;
1859         int             chance;
1860         int             minfail = 0;
1861         int             plev = p_ptr->lev;
1862         int             old_csp = p_ptr->csp;
1863         mind_type       spell;
1864         bool            cast;
1865         int             use_mind, mana_cost;
1866 #ifdef JP
1867         cptr            p;
1868 #endif
1869         bool            on_mirror = FALSE;
1870
1871         /* not if confused */
1872         if (p_ptr->confused)
1873         {
1874 #ifdef JP
1875 msg_print("º®Í𤷤Ƥ¤¤Æ½¸Ãæ¤Ç¤­¤Ê¤¤¡ª");
1876 #else
1877                 msg_print("You are too confused!");
1878 #endif
1879
1880                 return;
1881         }
1882
1883         /* get power */
1884         if (!get_mind_power(&n, FALSE)) return;
1885
1886 #ifdef JP
1887         switch(p_ptr->pclass)
1888         {
1889                 case CLASS_MINDCRAFTER: use_mind = MIND_MINDCRAFTER;p = "Àº¿À";break;
1890                 case CLASS_FORCETRAINER:          use_mind = MIND_KI;p = "µ¤";break;
1891                 case CLASS_BERSERKER:   use_mind = MIND_BERSERKER;p = "Åܤê";break;
1892                 case CLASS_MIRROR_MASTER:   use_mind = MIND_MIRROR_MASTER;p = "¶ÀËâË¡";break;
1893                 case CLASS_NINJA:       use_mind = MIND_NINJUTSU;p = "Àº¿À";break;
1894                 default:                use_mind = 0;p = "ĶǽÎÏ";break;
1895         }
1896 #else
1897         switch(p_ptr->pclass)
1898         {
1899                 case CLASS_MINDCRAFTER: use_mind = MIND_MINDCRAFTER;break;
1900                 case CLASS_FORCETRAINER:          use_mind = MIND_KI;break;
1901                 case CLASS_BERSERKER:   use_mind = MIND_BERSERKER;break;
1902                 case CLASS_MIRROR_MASTER:   use_mind = MIND_MIRROR_MASTER;break;
1903                 case CLASS_NINJA:       use_mind = MIND_NINJUTSU;break;
1904                 default:                use_mind = 0;break;
1905         }
1906 #endif
1907         spell = mind_powers[use_mind].info[n];
1908
1909         /* Spell failure chance */
1910         chance = spell.fail;
1911
1912         mana_cost = spell.mana_cost;
1913         if (use_mind == MIND_KI)
1914         {
1915                 if (heavy_armor()) chance += 20;
1916                 if (p_ptr->icky_wield[0]) chance += 20;
1917                 else if (buki_motteruka(INVEN_RARM)) chance += 10;
1918                 if (p_ptr->icky_wield[1]) chance += 20;
1919                 else if (buki_motteruka(INVEN_LARM)) chance += 10;
1920                 if (n == 5)
1921                 {
1922                         int j;
1923                         for (j = 0; j < p_ptr->magic_num1[0] / 50; j++)
1924                                 mana_cost += (j+1) * 3 / 2;
1925                 }
1926         }
1927
1928         /* Verify "dangerous" spells */
1929         if ((use_mind == MIND_BERSERKER) || (use_mind == MIND_NINJUTSU))
1930         {
1931                 if (mana_cost > p_ptr->chp)
1932                 {
1933 #ifdef JP
1934 msg_print("£È£Ð¤¬Â­¤ê¤Þ¤»¤ó¡£");
1935 #else
1936                         msg_print("You do not have enough hp to use this power.");
1937 #endif
1938                         return;
1939                 }
1940         }
1941         else if (mana_cost > p_ptr->csp)
1942         {
1943                 /* Warning */
1944 #ifdef JP
1945 msg_print("£Í£Ð¤¬Â­¤ê¤Þ¤»¤ó¡£");
1946 #else
1947                 msg_print("You do not have enough mana to use this power.");
1948 #endif
1949
1950
1951                 if (!over_exert) return;
1952
1953                 /* Verify */
1954 #ifdef JP
1955 if (!get_check("¤½¤ì¤Ç¤âÄ©À路¤Þ¤¹¤«? ")) return;
1956 #else
1957                 if (!get_check("Attempt it anyway? ")) return;
1958 #endif
1959
1960         }
1961
1962         if (chance)
1963         {
1964                 /* Reduce failure rate by "effective" level adjustment */
1965                 chance -= 3 * (plev - spell.min_lev);
1966
1967                 if (p_ptr->pseikaku == SEIKAKU_NAMAKE) chance += 10;
1968                 if (p_ptr->pseikaku == SEIKAKU_KIREMONO) chance -= 3;
1969                 if ((p_ptr->pseikaku == SEIKAKU_GAMAN) || (p_ptr->pseikaku == SEIKAKU_CHIKARA)) chance++;
1970
1971                 /* Reduce failure rate by INT/WIS adjustment */
1972                 chance -= 3 * (adj_mag_stat[p_ptr->stat_ind[mp_ptr->spell_stat]] - 1);
1973
1974                 /* Not enough mana to cast */
1975                 if ((mana_cost > p_ptr->csp) && (use_mind != MIND_BERSERKER) && (use_mind != MIND_NINJUTSU))
1976                 {
1977                         chance += 5 * (mana_cost - p_ptr->csp);
1978                 }
1979
1980                 /* Extract the minimum failure rate */
1981                 minfail = adj_mag_fail[p_ptr->stat_ind[mp_ptr->spell_stat]];
1982
1983                 /* Minimum failure rate */
1984                 if (chance < minfail) chance = minfail;
1985
1986                 /* Stunning makes spells harder */
1987                 if (p_ptr->stun > 50) chance += 25;
1988                 else if (p_ptr->stun) chance += 15;
1989
1990                 if (use_mind == MIND_KI)
1991                 {
1992                         if (heavy_armor()) chance += 5;
1993                         if (p_ptr->icky_wield[0]) chance += 5;
1994                         if (p_ptr->icky_wield[1]) chance += 5;
1995                 }
1996         }
1997
1998         /* Always a 5 percent chance of working */
1999         if (chance > 95) chance = 95;
2000
2001         /* Failed spell */
2002         if (rand_int(100) < chance)
2003         {
2004                 if (flush_failure) flush();
2005 #ifdef JP
2006 msg_format("%s¤Î½¸Ãæ¤Ë¼ºÇÔ¤·¤¿¡ª",p);
2007 #else
2008                 msg_format("You failed to concentrate hard enough!");
2009 #endif
2010
2011                 sound(SOUND_FAIL);
2012
2013                 if ((use_mind != MIND_BERSERKER) && (use_mind != MIND_NINJUTSU))
2014                 {
2015                         if ((use_mind == MIND_KI) && (n != 5) && p_ptr->magic_num1[0])
2016                         {
2017                                 msg_print("µ¤¤¬»¶¤Ã¤Æ¤·¤Þ¤Ã¤¿¡¥¡¥¡¥");
2018                                 p_ptr->magic_num1[0] = 0;
2019                         }
2020
2021                         if (randint(100) < (chance / 2))
2022                         {
2023                                 /* Backfire */
2024                           b = randint(100);
2025
2026                           if( use_mind == MIND_MINDCRAFTER ){
2027                                 if (b < 5)
2028                                 {
2029 #ifdef JP
2030 msg_print("¤Ê¤ó¤Æ¤³¤Ã¤¿¡ªÆ¬¤ÎÃ椬¿¿¤ÃÇò¤Ë¤Ê¤Ã¤¿¡ª");
2031 #else
2032                                         msg_print("Oh, no! Your mind has gone blank!");
2033 #endif
2034
2035                                         lose_all_info();
2036                                 }
2037                                 else if (b < 15)
2038                                 {
2039 #ifdef JP
2040 msg_print("´ñ̯¤Ê¸÷·Ê¤¬ÌܤÎÁ°¤ÇÍ٤äƤ¤¤ë...");
2041 #else
2042                                         msg_print("Weird visions seem to dance before your eyes...");
2043 #endif
2044
2045                                         set_image(p_ptr->image + 5 + randint(10));
2046                                 }
2047                                 else if (b < 45)
2048                                 {
2049 #ifdef JP
2050 msg_print("¤¢¤Ê¤¿¤ÎƬ¤Ïº®Í𤷤¿¡ª");
2051 #else
2052                                         msg_print("Your brain is addled!");
2053 #endif
2054
2055                                         set_confused(p_ptr->confused + randint(8));
2056                                 }
2057                                 else if (b < 90)
2058                                 {
2059                                         set_stun(p_ptr->stun + randint(8));
2060                                 }
2061                                 else
2062                                 {
2063                                         /* Mana storm */
2064 #ifdef JP
2065 msg_format("%s¤ÎÎϤ¬À©¸æ¤Ç¤­¤Ê¤¤ÈÅή¤È¤Ê¤Ã¤Æ²òÊü¤µ¤ì¤¿¡ª", p);
2066 #else
2067                                         msg_print("Your mind unleashes its power in an uncontrollable storm!");
2068 #endif
2069
2070                                         project(1, 2 + plev / 10, py, px, plev * 2,
2071                                                 GF_MANA, PROJECT_JUMP | PROJECT_KILL | PROJECT_GRID | PROJECT_ITEM, -1);
2072                                         p_ptr->csp = MAX(0, p_ptr->csp - plev * MAX(1, plev / 10));
2073                                 }
2074                           }
2075                           if( use_mind == MIND_MIRROR_MASTER ){
2076                                 if (b < 51)
2077                                 {
2078                                   /* Nothing has happen */
2079                                 }
2080                                 else if (b < 81)
2081                                 {
2082 #ifdef JP
2083 msg_print("¶À¤ÎÀ¤³¦¤Î´³¾Ä¤ò¼õ¤±¤¿¡ª");
2084 #else
2085                                         msg_print("Weird visions seem to dance before your eyes...");
2086 #endif
2087                                         teleport_player(10);
2088                                         
2089                                 }
2090                                 else if (b < 96)
2091                                 {
2092 #ifdef JP
2093 msg_print("¤Þ¤ï¤ê¤Î¤â¤Î¤¬¥­¥é¥­¥éµ±¤¤¤Æ¤¤¤ë¡ª");
2094 #else
2095                                         msg_print("Your brain is addled!");
2096 #endif
2097
2098                                         set_image(p_ptr->image + 5 + randint(10));
2099                                 }
2100                                 else
2101                                 {
2102                                         /* Mana storm */
2103 #ifdef JP
2104 msg_format("%s¤ÎÎϤ¬À©¸æ¤Ç¤­¤Ê¤¤ÈÅή¤È¤Ê¤Ã¤Æ²òÊü¤µ¤ì¤¿¡ª", p);
2105 #else
2106                                         msg_print("Your mind unleashes its power in an uncontrollable storm!");
2107 #endif
2108
2109                                         project(1, 2 + plev / 10, py, px, plev * 2,
2110                                                 GF_MANA, PROJECT_JUMP | PROJECT_KILL | PROJECT_GRID | PROJECT_ITEM, -1);
2111                                         p_ptr->csp = MAX(0, p_ptr->csp - plev * MAX(1, plev / 10));
2112                                 }
2113                           }
2114                         }
2115                 }
2116         }
2117         else
2118         {
2119                 sound(SOUND_ZAP);
2120
2121                 switch(use_mind)
2122                 {
2123                 case MIND_MINDCRAFTER:
2124                         /* Cast the spell */
2125                         cast = cast_mindcrafter_spell(n);
2126                         break;
2127                 case MIND_KI:
2128                         /* Cast the spell */
2129                         cast = cast_force_spell(n);
2130                         break;
2131                 case MIND_BERSERKER:
2132                         /* Cast the spell */
2133                         cast = cast_berserk_spell(n);
2134                         break;
2135                 case MIND_MIRROR_MASTER:
2136                         /* Cast the spell */
2137                         if( cave[py][px].feat == FEAT_MIRROR )on_mirror = TRUE;
2138                         cast = cast_mirror_spell(n);
2139                         break;
2140                 case MIND_NINJUTSU:
2141                         /* Cast the spell */
2142                         cast = cast_ninja_spell(n);
2143                         break;
2144                 default:
2145 #ifdef JP
2146                         msg_format("Ææ¤ÎǽÎÏ:%d, %d",use_mind, n);
2147 #else
2148                         msg_format("Mystery power:%d, %d",use_mind, n);
2149 #endif
2150                         return;
2151                 }
2152
2153                 if (!cast) return;
2154         }
2155
2156
2157         /* Take a turn */
2158         energy_use = 100;
2159         /* teleport from mirror costs small energy */
2160         if( on_mirror && p_ptr->pclass == CLASS_MIRROR_MASTER )
2161         {
2162           if( n==2 || n==4 || n==6 || n==15 )energy_use = 50;
2163         }
2164
2165         if ((use_mind == MIND_BERSERKER) || (use_mind == MIND_NINJUTSU))
2166         {
2167 #ifdef JP
2168                 take_hit(DAMAGE_USELIFE, mana_cost, "²áÅ٤ν¸Ãæ", -1);
2169 #else
2170                 take_hit(DAMAGE_USELIFE, mana_cost, "concentrating too hard", -1);
2171 #endif
2172                 /* Redraw hp */
2173                 p_ptr->redraw |= (PR_HP);
2174         }
2175
2176         /* Sufficient mana */
2177         else if (mana_cost <= old_csp)
2178         {
2179                 /* Use some mana */
2180                 p_ptr->csp -= mana_cost;
2181
2182                 /* Limit */
2183                 if (p_ptr->csp < 0) p_ptr->csp = 0;
2184
2185                 if ((use_mind == MIND_MINDCRAFTER) && (n == 13))
2186                 {
2187                         /* No mana left */
2188                         p_ptr->csp = 0;
2189                         p_ptr->csp_frac = 0;
2190                 }
2191         }
2192
2193         /* Over-exert the player */
2194         else
2195         {
2196                 int oops = mana_cost - old_csp;
2197
2198                 /* No mana left */
2199                 if ((p_ptr->csp - mana_cost) < 0) p_ptr->csp_frac = 0;
2200                 p_ptr->csp = MAX(0, p_ptr->csp - mana_cost);
2201
2202                 /* Message */
2203 #ifdef JP
2204 msg_format("%s¤ò½¸Ã椷¤¹¤®¤Æµ¤¤ò¼º¤Ã¤Æ¤·¤Þ¤Ã¤¿¡ª",p);
2205 #else
2206                 msg_print("You faint from the effort!");
2207 #endif
2208
2209
2210                 /* Hack -- Bypass free action */
2211                 (void)set_paralyzed(p_ptr->paralyzed + randint(5 * oops + 1));
2212
2213                 /* Damage WIS (possibly permanently) */
2214                 if (rand_int(100) < 50)
2215                 {
2216                         bool perm = (rand_int(100) < 25);
2217
2218                         /* Message */
2219 #ifdef JP
2220 msg_print("¼«Ê¬¤ÎÀº¿À¤ò¹¶·â¤·¤Æ¤·¤Þ¤Ã¤¿¡ª");
2221 #else
2222                         msg_print("You have damaged your mind!");
2223 #endif
2224
2225
2226                         /* Reduce constitution */
2227                         (void)dec_stat(A_WIS, 15 + randint(10), perm);
2228                 }
2229         }
2230
2231         /* Redraw mana */
2232         p_ptr->redraw |= (PR_MANA);
2233
2234         /* Window stuff */
2235         p_ptr->window |= (PW_PLAYER);
2236         p_ptr->window |= (PW_SPELL);
2237 }
2238
2239
2240 /*
2241  * do_cmd_cast calls this function if the player's class
2242  * is 'mindcrafter'.
2243  */
2244 void do_cmd_mind_browse(void)
2245 {
2246         int n = 0;
2247         int j, line;
2248         char temp[62*5];
2249         int use_mind = 0;
2250
2251         if (p_ptr->pclass == CLASS_MINDCRAFTER) use_mind = MIND_MINDCRAFTER;
2252         else if (p_ptr->pclass == CLASS_FORCETRAINER) use_mind = MIND_KI;
2253         else if (p_ptr->pclass == CLASS_BERSERKER) use_mind = MIND_BERSERKER;
2254         else if (p_ptr->pclass == CLASS_NINJA) use_mind = MIND_NINJUTSU;
2255         else if (p_ptr->pclass == CLASS_MIRROR_MASTER)
2256           use_mind = MIND_MIRROR_MASTER;
2257
2258         screen_save();
2259
2260         while(1)
2261         {
2262                 /* get power */
2263                 if (!get_mind_power(&n, TRUE))
2264                 {
2265                         screen_load();
2266                         return;
2267                 }
2268
2269                 /* Clear lines, position cursor  (really should use strlen here) */
2270                 Term_erase(12, 21, 255);
2271                 Term_erase(12, 20, 255);
2272                 Term_erase(12, 19, 255);
2273                 Term_erase(12, 18, 255);
2274                 Term_erase(12, 17, 255);
2275                 Term_erase(12, 16, 255);
2276
2277                 roff_to_buf( mind_tips[use_mind][n],62,temp);
2278                 for(j=0, line = 17;temp[j];j+=(1+strlen(&temp[j])))
2279                 {
2280                         prt(&temp[j], line, 15);
2281                         line++;
2282                 }
2283                 switch (use_mind)
2284                 {
2285                 case MIND_MIRROR_MASTER:
2286                 case MIND_NINJUTSU:
2287 #ifdef JP
2288                   prt("²¿¤«¥­¡¼¤ò²¡¤·¤Æ²¼¤µ¤¤¡£",0,0);
2289 #else
2290                   prt("Hit any key.",0,0);
2291 #endif
2292                   (void)inkey();
2293                 }
2294         }
2295
2296         screen_load();
2297 }