OSDN Git Service

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