OSDN Git Service

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