OSDN Git Service

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