OSDN Git Service

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