OSDN Git Service

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