OSDN Git Service

Changed to match the For2.2.2-Refactoring-Cocoa2 branch. Put se_maoudamashii_voice_m...
[hengbandforosx/hengbandosx.git] / src / realm-sorcery.c
1 #include "angband.h"
2 #include "cmd-spell.h"
3 #include "selfinfo.h"
4 #include "projection.h"
5 #include "avatar.h"
6 #include "spells-status.h"
7 #include "spells-floor.h"
8
9 /*!
10 * @brief 仙術領域魔法の各処理を行う
11 * @param spell 魔法ID
12 * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_INFO / SPELL_CAST)
13 * @return SPELL_NAME / SPELL_DESC / SPELL_INFO 時には文字列ポインタを返す。SPELL_CAST時はNULL文字列を返す。
14 */
15 concptr do_sorcery_spell(SPELL_IDX spell, BIT_FLAGS mode)
16 {
17         bool name = (mode == SPELL_NAME) ? TRUE : FALSE;
18         bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;
19         bool info = (mode == SPELL_INFO) ? TRUE : FALSE;
20         bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;
21
22         DIRECTION dir;
23         PLAYER_LEVEL plev = p_ptr->lev;
24
25         switch (spell)
26         {
27         case 0:
28                 if (name) return _("モンスター感知", "Detect Monsters");
29                 if (desc) return _("近くの全ての見えるモンスターを感知する。", "Detects all monsters in your vicinity unless invisible.");
30
31                 {
32                         POSITION rad = DETECT_RAD_DEFAULT;
33
34                         if (info) return info_radius(rad);
35
36                         if (cast)
37                         {
38                                 detect_monsters_normal(rad);
39                         }
40                 }
41                 break;
42
43         case 1:
44                 if (name) return _("ショート・テレポート", "Phase Door");
45                 if (desc) return _("近距離のテレポートをする。", "Teleports you a short distance.");
46
47                 {
48                         POSITION range = 10;
49
50                         if (info) return info_range(range);
51
52                         if (cast)
53                         {
54                                 teleport_player(range, 0L);
55                         }
56                 }
57                 break;
58
59         case 2:
60                 if (name) return _("罠と扉感知", "Detect Doors and Traps");
61                 if (desc) return _("近くの全ての扉と罠を感知する。", "Detects traps, doors, and stairs in your vicinity.");
62
63                 {
64                         POSITION rad = DETECT_RAD_DEFAULT;
65
66                         if (info) return info_radius(rad);
67
68                         if (cast)
69                         {
70                                 detect_traps(rad, TRUE);
71                                 detect_doors(rad);
72                                 detect_stairs(rad);
73                         }
74                 }
75                 break;
76
77         case 3:
78                 if (name) return _("ライト・エリア", "Light Area");
79                 if (desc) return _("光源が照らしている範囲か部屋全体を永久に明るくする。", "Lights up nearby area and the inside of a room permanently.");
80
81                 {
82                         DICE_NUMBER dice = 2;
83                         DICE_SID sides = plev / 2;
84                         POSITION rad = plev / 10 + 1;
85
86                         if (info) return info_damage(dice, sides, 0);
87
88                         if (cast)
89                         {
90                                 lite_area(damroll(dice, sides), rad);
91                         }
92                 }
93                 break;
94
95         case 4:
96                 if (name) return _("パニック・モンスター", "Confuse Monster");
97                 if (desc) return _("モンスター1体を混乱させる。抵抗されると無効。", "Attempts to confuse a monster.");
98
99                 {
100                         PLAYER_LEVEL power = (plev * 3) / 2;
101
102                         if (info) return info_power(power);
103
104                         if (cast)
105                         {
106                                 if (!get_aim_dir(&dir)) return NULL;
107
108                                 confuse_monster(dir, power);
109                         }
110                 }
111                 break;
112
113         case 5:
114                 if (name) return _("テレポート", "Teleport");
115                 if (desc) return _("遠距離のテレポートをする。", "Teleports you a long distance.");
116
117                 {
118                         POSITION range = plev * 5;
119
120                         if (info) return info_range(range);
121
122                         if (cast)
123                         {
124                                 teleport_player(range, 0L);
125                         }
126                 }
127                 break;
128
129         case 6:
130                 if (name) return _("スリープ・モンスター", "Sleep Monster");
131                 if (desc) return _("モンスター1体を眠らせる。抵抗されると無効。", "Attempts to put a monster to sleep.");
132
133                 {
134                         int power = plev;
135
136                         if (info) return info_power(power);
137
138                         if (cast)
139                         {
140                                 if (!get_aim_dir(&dir)) return NULL;
141
142                                 sleep_monster(dir, plev);
143                         }
144                 }
145                 break;
146
147         case 7:
148                 if (name) return _("魔力充填", "Recharging");
149                 if (desc) return _("杖/魔法棒の充填回数を増やすか、充填中のロッドの充填時間を減らす。", "Recharges staffs, wands or rods.");
150
151                 {
152                         int power = plev * 4;
153
154                         if (info) return info_power(power);
155
156                         if (cast)
157                         {
158                                 if (!recharge(power)) return NULL;
159                         }
160                 }
161                 break;
162
163         case 8:
164                 if (name) return _("魔法の地図", "Magic Mapping");
165                 if (desc) return _("周辺の地形を感知する。", "Maps nearby area.");
166
167                 {
168                         POSITION rad = DETECT_RAD_MAP;
169
170                         if (info) return info_radius(rad);
171
172                         if (cast)
173                         {
174                                 map_area(rad);
175                         }
176                 }
177                 break;
178
179         case 9:
180                 if (name) return _("鑑定", "Identify");
181                 if (desc) return _("アイテムを識別する。", "Identifies an item.");
182
183                 {
184                         if (cast)
185                         {
186                                 if (!ident_spell(FALSE)) return NULL;
187                         }
188                 }
189                 break;
190
191         case 10:
192                 if (name) return _("スロウ・モンスター", "Slow Monster");
193                 if (desc) return _("モンスター1体を減速さる。抵抗されると無効。", "Attempts to slow a monster.");
194
195                 {
196                         int power = plev;
197
198                         if (info) return info_power(power);
199
200                         if (cast)
201                         {
202                                 if (!get_aim_dir(&dir)) return NULL;
203
204                                 slow_monster(dir, plev);
205                         }
206                 }
207                 break;
208
209         case 11:
210                 if (name) return _("周辺スリープ", "Mass Sleep");
211                 if (desc) return _("視界内の全てのモンスターを眠らせる。抵抗されると無効。", "Attempts to put all monsters in sight to sleep.");
212
213                 {
214                         int power = plev;
215
216                         if (info) return info_power(power);
217
218                         if (cast)
219                         {
220                                 sleep_monsters(plev);
221                         }
222                 }
223                 break;
224
225         case 12:
226                 if (name) return _("テレポート・モンスター", "Teleport Away");
227                 if (desc) return _("モンスターをテレポートさせるビームを放つ。抵抗されると無効。", "Teleports all monsters on the line away unless resisted.");
228
229                 {
230                         int power = plev;
231
232                         if (info) return info_power(power);
233
234                         if (cast)
235                         {
236                                 if (!get_aim_dir(&dir)) return NULL;
237
238                                 fire_beam(GF_AWAY_ALL, dir, power);
239                         }
240                 }
241                 break;
242
243         case 13:
244                 if (name) return _("スピード", "Haste Self");
245                 if (desc) return _("一定時間、加速する。", "Hastes you for a while.");
246
247                 {
248                         int base = plev;
249                         DICE_SID sides = 20 + plev;
250
251                         if (info) return info_duration(base, sides);
252
253                         if (cast)
254                         {
255                                 set_fast(randint1(sides) + base, FALSE);
256                         }
257                 }
258                 break;
259
260         case 14:
261                 if (name) return _("真・感知", "Detection True");
262                 if (desc) return _("近くの全てのモンスター、罠、扉、階段、財宝、そしてアイテムを感知する。",
263                         "Detects all monsters, traps, doors, stairs, treasures and items in your vicinity.");
264
265                 {
266                         POSITION rad = DETECT_RAD_DEFAULT;
267
268                         if (info) return info_radius(rad);
269
270                         if (cast)
271                         {
272                                 detect_all(rad);
273                         }
274                 }
275                 break;
276
277         case 15:
278                 if (name) return _("真・鑑定", "Identify True");
279                 if (desc) return _("アイテムの持つ能力を完全に知る。", "*Identifies* an item.");
280
281                 {
282                         if (cast)
283                         {
284                                 if (!identify_fully(FALSE)) return NULL;
285                         }
286                 }
287                 break;
288
289         case 16:
290                 if (name) return _("物体と財宝感知", "Detect items and Treasure");
291                 if (desc) return _("近くの全てのアイテムと財宝を感知する。", "Detects all treasures and items in your vicinity.");
292
293                 {
294                         POSITION rad = DETECT_RAD_DEFAULT;
295
296                         if (info) return info_radius(rad);
297
298                         if (cast)
299                         {
300                                 detect_objects_normal(rad);
301                                 detect_treasure(rad);
302                                 detect_objects_gold(rad);
303                         }
304                 }
305                 break;
306
307         case 17:
308                 if (name) return _("チャーム・モンスター", "Charm Monster");
309                 if (desc) return _("モンスター1体を魅了する。抵抗されると無効。", "Attempts to charm a monster.");
310
311                 {
312                         int power = plev;
313
314                         if (info) return info_power(power);
315
316                         if (cast)
317                         {
318                                 if (!get_aim_dir(&dir)) return NULL;
319
320                                 charm_monster(dir, plev);
321                         }
322                 }
323                 break;
324
325         case 18:
326                 if (name) return _("精神感知", "Sense Minds");
327                 if (desc) return _("一定時間、テレパシー能力を得る。", "Gives telepathy for a while.");
328
329                 {
330                         int base = 25;
331                         DICE_SID sides = 30;
332
333                         if (info) return info_duration(base, sides);
334
335                         if (cast)
336                         {
337                                 set_tim_esp(randint1(sides) + base, FALSE);
338                         }
339                 }
340                 break;
341
342         case 19:
343                 if (name) return _("街移動", "Teleport to town");
344                 if (desc) return _("街へ移動する。地上にいるときしか使えない。", "Instantly teleports you to a town which you choose. Can only be used outdoors.");
345
346                 {
347                         if (cast)
348                         {
349                                 if (!tele_town()) return NULL;
350                         }
351                 }
352                 break;
353
354         case 20:
355                 if (name) return _("自己分析", "Self Knowledge");
356                 if (desc) return _("現在の自分の状態を完全に知る。",
357                         "Gives you useful info regarding your current resistances, the powers of your weapon and maximum limits of your stats.");
358
359                 {
360                         if (cast)
361                         {
362                                 self_knowledge();
363                         }
364                 }
365                 break;
366
367         case 21:
368                 if (name) return _("テレポート・レベル", "Teleport Level");
369                 if (desc) return _("瞬時に上か下の階にテレポートする。", "Instantly teleports you up or down a level.");
370
371                 {
372                         if (cast)
373                         {
374                                 if (!get_check(_("本当に他の階にテレポートしますか?", "Are you sure? (Teleport Level)"))) return NULL;
375                                 teleport_level(0);
376                         }
377                 }
378                 break;
379
380         case 22:
381                 if (name) return _("帰還の呪文", "Word of Recall");
382                 if (desc) return _("地上にいるときはダンジョンの最深階へ、ダンジョンにいるときは地上へと移動する。",
383                         "Recalls player from dungeon to town or from town to the deepest level of dungeon.");
384
385                 {
386                         int base = 15;
387                         DICE_SID sides = 20;
388
389                         if (info) return info_delay(base, sides);
390
391                         if (cast)
392                         {
393                                 if (!recall_player(p_ptr, randint0(21) + 15)) return NULL;
394                         }
395                 }
396                 break;
397
398         case 23:
399                 if (name) return _("次元の扉", "Dimension Door");
400                 if (desc) return _("短距離内の指定した場所にテレポートする。", "Teleports you to a given location.");
401
402                 {
403                         POSITION range = plev / 2 + 10;
404
405                         if (info) return info_range(range);
406
407                         if (cast)
408                         {
409                                 msg_print(_("次元の扉が開いた。目的地を選んで下さい。", "You open a dimensional gate. Choose a destination."));
410                                 if (!dimension_door()) return NULL;
411                         }
412                 }
413                 break;
414
415         case 24:
416                 if (name) return _("調査", "Probing");
417                 if (desc) return _("モンスターの属性、残り体力、最大体力、スピード、正体を知る。",
418                         "Probes all monsters' alignment, HP, speed and their true character.");
419
420                 {
421                         if (cast)
422                         {
423                                 probing();
424                         }
425                 }
426                 break;
427
428         case 25:
429                 if (name) return _("爆発のルーン", "Explosive Rune");
430                 if (desc) return _("自分のいる床の上に、モンスターが通ると爆発してダメージを与えるルーンを描く。",
431                         "Sets a glyph under you. The glyph will explode when a monster moves on it.");
432
433                 {
434                         DICE_NUMBER dice = 7;
435                         DICE_SID sides = 7;
436                         int base = plev;
437
438                         if (info) return info_damage(dice, sides, base);
439
440                         if (cast)
441                         {
442                                 explosive_rune();
443                         }
444                 }
445                 break;
446
447         case 26:
448                 if (name) return _("念動力", "Telekinesis");
449                 if (desc) return _("アイテムを自分の足元へ移動させる。", "Pulls a distant item close to you.");
450
451                 {
452                         WEIGHT weight = plev * 15;
453
454                         if (info) return info_weight(weight);
455
456                         if (cast)
457                         {
458                                 if (!get_aim_dir(&dir)) return NULL;
459
460                                 fetch(dir, weight, FALSE);
461                         }
462                 }
463                 break;
464
465         case 27:
466                 if (name) return _("千里眼", "Clairvoyance");
467                 if (desc) return _("その階全体を永久に照らし、ダンジョン内すべてのアイテムを感知する。さらに、一定時間テレパシー能力を得る。",
468                         "Maps and lights whole dungeon level. Knows all objects location. And gives telepathy for a while.");
469
470                 {
471                         int base = 25;
472                         DICE_SID sides = 30;
473
474                         if (info) return info_duration(base, sides);
475
476                         if (cast)
477                         {
478                                 chg_virtue(V_KNOWLEDGE, 1);
479                                 chg_virtue(V_ENLIGHTEN, 1);
480
481                                 wiz_lite(FALSE);
482
483                                 if (!p_ptr->telepathy)
484                                 {
485                                         set_tim_esp(randint1(sides) + base, FALSE);
486                                 }
487                         }
488                 }
489                 break;
490
491         case 28:
492                 if (name) return _("魅了の視線", "Charm monsters");
493                 if (desc) return _("視界内の全てのモンスターを魅了する。抵抗されると無効。", "Attempts to charm all monsters in sight.");
494
495                 {
496                         int power = plev * 2;
497
498                         if (info) return info_power(power);
499
500                         if (cast)
501                         {
502                                 charm_monsters(power);
503                         }
504                 }
505                 break;
506
507         case 29:
508                 if (name) return _("錬金術", "Alchemy");
509                 if (desc) return _("アイテム1つをお金に変える。", "Turns an item into 1/3 of its value in gold.");
510
511                 {
512                         if (cast)
513                         {
514                                 if (!alchemy()) return NULL;
515                         }
516                 }
517                 break;
518
519         case 30:
520                 if (name) return _("怪物追放", "Banishment");
521                 if (desc) return _("視界内の全てのモンスターをテレポートさせる。抵抗されると無効。", "Teleports all monsters in sight away unless resisted.");
522
523                 {
524                         int power = plev * 4;
525
526                         if (info) return info_power(power);
527
528                         if (cast)
529                         {
530                                 banish_monsters(power);
531                         }
532                 }
533                 break;
534
535         case 31:
536                 if (name) return _("無傷の球", "Globe of Invulnerability");
537                 if (desc) return _("一定時間、ダメージを受けなくなるバリアを張る。切れた瞬間に少しターンを消費するので注意。",
538                         "Generates a barrier which completely protects you from almost all damage. Takes a few of your turns when the barrier breaks or duration time is exceeded.");
539
540                 {
541                         int base = 4;
542
543                         if (info) return info_duration(base, base);
544
545                         if (cast)
546                         {
547                                 set_invuln(randint1(base) + base, FALSE);
548                         }
549                 }
550                 break;
551         }
552
553         return "";
554 }