OSDN Git Service

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