OSDN Git Service

1767c15051ac4e520df9a0f095bd98e73ac8ea08
[hengband/hengband.git] / src / realm / realm-trump.c
1 #include "system/angband.h"
2 #include "util.h"
3
4 #include "cmd-spell.h"
5 #include "mutation/mutation.h"
6 #include "spell/spells-summon.h"
7 #include "spell/spells-status.h"
8 #include "spell/spells-object.h"
9 #include "player/player-effects.h"
10 #include "player/player-class.h"
11 #include "io/targeting.h"
12 #include "effect/spells-effect-util.h"
13 #include "realm/realm-trump.h"
14 #include "spell/spells-type.h"
15 #include "spell/spells2.h"
16 #include "spell/spells3.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_trump_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         bool fail = (mode == SPELL_FAIL) ? TRUE : FALSE;
32
33         DIRECTION dir;
34         PLAYER_LEVEL plev = caster_ptr->lev;
35
36         switch (spell)
37         {
38         case 0:
39                 if (name) return _("ショート・テレポート", "Phase Door");
40                 if (desc) return _("近距離のテレポートをする。", "Teleports you a short distance.");
41
42                 {
43                         POSITION range = 10;
44
45                         if (info) return info_range(range);
46
47                         if (cast)
48                         {
49                                 teleport_player(caster_ptr, range, TELEPORT_SPONTANEOUS);
50                         }
51                 }
52                 break;
53
54         case 1:
55                 if (name) return _("蜘蛛のカード", "Trump Spiders");
56                 if (desc) return _("蜘蛛を召喚する。", "Summons spiders.");
57
58                 {
59                         if (cast || fail)
60                         {
61                                 msg_print(_("あなたは蜘蛛のカードに集中する...", "You concentrate on the trump of an spider..."));
62                                 if (trump_summoning(caster_ptr, 1, !fail, caster_ptr->y, caster_ptr->x, 0, SUMMON_SPIDER, PM_ALLOW_GROUP))
63                                 {
64                                         if (fail)
65                                         {
66                                                 msg_print(_("召喚された蜘蛛は怒っている!", "The summoned spiders get angry!"));
67                                         }
68                                 }
69                         }
70                 }
71                 break;
72
73         case 2:
74                 if (name) return _("シャッフル", "Shuffle");
75                 if (desc) return _("カードの占いをする。", "Causes random effects.");
76
77                 {
78                         if (info) return KWD_RANDOM;
79
80                         if (cast)
81                         {
82                                 cast_shuffle(caster_ptr);
83                         }
84                 }
85                 break;
86
87         case 3:
88                 if (name) return _("フロア・リセット", "Reset Recall");
89                 if (desc) return _("最深階を変更する。", "Resets the 'deepest' level for recall spell.");
90
91                 {
92                         if (cast)
93                         {
94                                 if (!reset_recall(caster_ptr)) return NULL;
95                         }
96                 }
97                 break;
98
99         case 4:
100                 if (name) return _("テレポート", "Teleport");
101                 if (desc) return _("遠距離のテレポートをする。", "Teleports you a long distance.");
102
103                 {
104                         POSITION range = plev * 4;
105
106                         if (info) return info_range(range);
107
108                         if (cast)
109                         {
110                                 teleport_player(caster_ptr, range, TELEPORT_SPONTANEOUS);
111                         }
112                 }
113                 break;
114
115         case 5:
116                 if (name) return _("感知のカード", "Trump Spying");
117                 if (desc) return _("一定時間、テレパシー能力を得る。", "Gives telepathy for a while.");
118
119                 {
120                         int base = 25;
121                         DICE_SID sides = 30;
122
123                         if (info) return info_duration(base, sides);
124
125                         if (cast)
126                         {
127                                 set_tim_esp(caster_ptr, randint1(sides) + base, FALSE);
128                         }
129                 }
130                 break;
131
132         case 6:
133                 if (name) return _("テレポート・モンスター", "Teleport Away");
134                 if (desc) return _("モンスターをテレポートさせるビームを放つ。抵抗されると無効。", "Teleports all monsters on the line away unless resisted.");
135
136                 {
137                         int power = plev;
138
139                         if (info) return info_power(power);
140
141                         if (cast)
142                         {
143                                 if (!get_aim_dir(caster_ptr, &dir)) return NULL;
144
145                                 fire_beam(caster_ptr, GF_AWAY_ALL, dir, power);
146                         }
147                 }
148                 break;
149
150         case 7:
151                 if (name) return _("動物のカード", "Trump Animals");
152                 if (desc) return _("1体の動物を召喚する。", "Summons an animal.");
153
154                 {
155                         if (cast || fail)
156                         {
157                                 int type = (!fail ? SUMMON_ANIMAL_RANGER : SUMMON_ANIMAL);
158                                 msg_print(_("あなたは動物のカードに集中する...", "You concentrate on the trump of an animal..."));
159                                 if (trump_summoning(caster_ptr, 1, !fail, caster_ptr->y, caster_ptr->x, 0, type, 0L))
160                                 {
161                                         if (fail)
162                                         {
163                                                 msg_print(_("召喚された動物は怒っている!", "The summoned animal gets angry!"));
164                                         }
165                                 }
166                         }
167                 }
168                 break;
169
170         case 8:
171                 if (name) return _("移動のカード", "Trump Reach");
172                 if (desc) return _("アイテムを自分の足元へ移動させる。", "Pulls a distant item close to you.");
173
174                 {
175                         WEIGHT weight = plev * 15;
176
177                         if (info) return info_weight(weight);
178
179                         if (cast)
180                         {
181                                 if (!get_aim_dir(caster_ptr, &dir)) return NULL;
182
183                                 fetch(caster_ptr, dir, weight, FALSE);
184                         }
185                 }
186                 break;
187
188         case 9:
189                 if (name) return _("カミカゼのカード", "Trump Kamikaze");
190                 if (desc) return _("複数の爆発するモンスターを召喚する。", "Summons monsters which explode by itself.");
191
192                 {
193                         if (cast || fail)
194                         {
195                                 POSITION x, y;
196                                 int type;
197
198                                 if (cast)
199                                 {
200                                         if (!target_set(caster_ptr, TARGET_KILL)) return NULL;
201                                         x = target_col;
202                                         y = target_row;
203                                 }
204                                 else
205                                 {
206                                         /* Summons near player when failed */
207                                         x = caster_ptr->x;
208                                         y = caster_ptr->y;
209                                 }
210
211                                 if (caster_ptr->pclass == CLASS_BEASTMASTER)
212                                         type = SUMMON_KAMIKAZE_LIVING;
213                                 else
214                                         type = SUMMON_KAMIKAZE;
215
216                                 msg_print(_("あなたはカミカゼのカードに集中する...", "You concentrate on several trumps at once..."));
217                                 if (trump_summoning(caster_ptr, 2 + randint0(plev / 7), !fail, y, x, 0, type, 0L))
218                                 {
219                                         if (fail)
220                                         {
221                                                 msg_print(_("召喚されたモンスターは怒っている!", "The summoned creatures get angry!"));
222                                         }
223                                 }
224                         }
225                 }
226                 break;
227
228         case 10:
229                 if (name) return _("幻霊召喚", "Phantasmal Servant");
230                 if (desc) return _("1体の幽霊を召喚する。", "Summons a ghost.");
231
232                 {
233                         /* Phantasmal Servant is not summoned as enemy when failed */
234                         if (cast)
235                         {
236                                 int summon_lev = plev * 2 / 3 + randint1(plev / 2);
237
238                                 if (trump_summoning(caster_ptr, 1, !fail, caster_ptr->y, caster_ptr->x, (summon_lev * 3 / 2), SUMMON_PHANTOM, 0L))
239                                 {
240                                         msg_print(_("御用でございますか、御主人様?", "'Your wish, master?'"));
241                                 }
242                         }
243                 }
244                 break;
245
246         case 11:
247                 if (name) return _("スピード・モンスター", "Haste Monster");
248                 if (desc) return _("モンスター1体を加速させる。", "Hastes a monster.");
249
250                 {
251                         if (cast)
252                         {
253                                 bool result;
254
255                                 /* Temporary enable target_pet option */
256                                 bool old_target_pet = target_pet;
257                                 target_pet = TRUE;
258
259                                 result = get_aim_dir(caster_ptr, &dir);
260
261                                 /* Restore target_pet option */
262                                 target_pet = old_target_pet;
263
264                                 if (!result) return NULL;
265
266                                 speed_monster(caster_ptr, dir, plev);
267                         }
268                 }
269                 break;
270
271         case 12:
272                 if (name) return _("テレポート・レベル", "Teleport Level");
273                 if (desc) return _("瞬時に上か下の階にテレポートする。", "Instantly teleports you up or down a level.");
274
275                 {
276                         if (cast)
277                         {
278                                 if (!get_check(_("本当に他の階にテレポートしますか?", "Are you sure? (Teleport Level)"))) return NULL;
279                                 teleport_level(caster_ptr, 0);
280                         }
281                 }
282                 break;
283
284         case 13:
285                 if (name) return _("次元の扉", "Dimension Door");
286                 if (desc) return _("短距離内の指定した場所にテレポートする。", "Teleports you to a given location.");
287
288                 {
289                         POSITION range = plev / 2 + 10;
290
291                         if (info) return info_range(range);
292
293                         if (cast)
294                         {
295                                 msg_print(_("次元の扉が開いた。目的地を選んで下さい。", "You open a dimensional gate. Choose a destination."));
296                                 if (!dimension_door(caster_ptr)) return NULL;
297                         }
298                 }
299                 break;
300
301         case 14:
302                 if (name) return _("帰還の呪文", "Word of Recall");
303                 if (desc) return _("地上にいるときはダンジョンの最深階へ、ダンジョンにいるときは地上へと移動する。",
304                         "Recalls player from dungeon to town or from town to the deepest level of dungeon.");
305
306                 {
307                         int base = 15;
308                         DICE_SID sides = 20;
309
310                         if (info) return info_delay(base, sides);
311
312                         if (cast)
313                         {
314                                 if (!recall_player(caster_ptr, randint0(21) + 15)) return NULL;
315                         }
316                 }
317                 break;
318
319         case 15:
320                 if (name) return _("怪物追放", "Banish");
321                 if (desc) return _("視界内の全てのモンスターをテレポートさせる。抵抗されると無効。", "Teleports all monsters in sight away unless resisted.");
322
323                 {
324                         int power = plev * 4;
325
326                         if (info) return info_power(power);
327
328                         if (cast)
329                         {
330                                 banish_monsters(caster_ptr, power);
331                         }
332                 }
333                 break;
334
335         case 16:
336                 if (name) return _("位置交換のカード", "Swap Position");
337                 if (desc) return _("1体のモンスターと位置を交換する。", "Swap positions of you and a monster.");
338
339                 {
340                         if (cast)
341                         {
342                                 bool result;
343
344                                 /* HACK -- No range limit */
345                                 project_length = -1;
346
347                                 result = get_aim_dir(caster_ptr, &dir);
348
349                                 /* Restore range to default */
350                                 project_length = 0;
351
352                                 if (!result) return NULL;
353
354                                 teleport_swap(caster_ptr, dir);
355                         }
356                 }
357                 break;
358
359         case 17:
360                 if (name) return _("アンデッドのカード", "Trump Undead");
361                 if (desc) return _("1体のアンデッドを召喚する。", "Summons an undead monster.");
362
363                 {
364                         if (cast || fail)
365                         {
366                                 msg_print(_("あなたはアンデッドのカードに集中する...", "You concentrate on the trump of an undead creature..."));
367                                 if (trump_summoning(caster_ptr, 1, !fail, caster_ptr->y, caster_ptr->x, 0, SUMMON_UNDEAD, 0L))
368                                 {
369                                         if (fail)
370                                         {
371                                                 msg_print(_("召喚されたアンデッドは怒っている!", "The summoned undead creature gets angry!"));
372                                         }
373                                 }
374                         }
375                 }
376                 break;
377
378         case 18:
379                 if (name) return _("爬虫類のカード", "Trump Reptile");
380                 if (desc) return _("1体のヒドラを召喚する。", "Summons a hydra.");
381
382                 {
383                         if (cast || fail)
384                         {
385                                 msg_print(_("あなたは爬虫類のカードに集中する...", "You concentrate on the trump of a reptile..."));
386                                 if (trump_summoning(caster_ptr, 1, !fail, caster_ptr->y, caster_ptr->x, 0, SUMMON_HYDRA, 0L))
387                                 {
388                                         if (fail)
389                                         {
390                                                 msg_print(_("召喚された爬虫類は怒っている!", "The summoned reptile gets angry!"));
391                                         }
392                                 }
393                         }
394                 }
395                 break;
396
397         case 19:
398                 if (name) return _("モンスターのカード", "Trump Monsters");
399                 if (desc) return _("複数のモンスターを召喚する。", "Summons some monsters.");
400
401                 {
402                         if (cast || fail)
403                         {
404                                 int type;
405                                 msg_print(_("あなたはモンスターのカードに集中する...", "You concentrate on several trumps at once..."));
406                                 if (caster_ptr->pclass == CLASS_BEASTMASTER)
407                                         type = SUMMON_LIVING;
408                                 else
409                                         type = 0;
410
411                                 if (trump_summoning(caster_ptr, (1 + (plev - 15) / 10), !fail, caster_ptr->y, caster_ptr->x, 0, type, 0L))
412                                 {
413                                         if (fail)
414                                         {
415                                                 msg_print(_("召喚されたモンスターは怒っている!", "The summoned creatures get angry!"));
416                                         }
417                                 }
418
419                         }
420                 }
421                 break;
422
423         case 20:
424                 if (name) return _("ハウンドのカード", "Trump Hounds");
425                 if (desc) return _("1グループのハウンドを召喚する。", "Summons a group of hounds.");
426
427                 {
428                         if (cast || fail)
429                         {
430                                 msg_print(_("あなたはハウンドのカードに集中する...", "You concentrate on the trump of a hound..."));
431                                 if (trump_summoning(caster_ptr, 1, !fail, caster_ptr->y, caster_ptr->x, 0, SUMMON_HOUND, PM_ALLOW_GROUP))
432                                 {
433                                         if (fail)
434                                         {
435                                                 msg_print(_("召喚されたハウンドは怒っている!", "The summoned hounds get angry!"));
436                                         }
437                                 }
438                         }
439                 }
440                 break;
441
442         case 21:
443                 if (name) return _("トランプの刃", "Trump Branding");
444                 if (desc) return _("武器にトランプの属性をつける。", "Makes current weapon a Trump weapon.");
445
446                 {
447                         if (cast)
448                         {
449                                 brand_weapon(caster_ptr, 5);
450                         }
451                 }
452                 break;
453
454         case 22:
455                 if (name) return _("人間トランプ", "Living Trump");
456                 if (desc) return _("ランダムにテレポートする突然変異か、自分の意思でテレポートする突然変異が身につく。",
457                         "Gives mutation which makes you teleport randomly or makes you able to teleport at will.");
458                 if (cast) become_living_trump(caster_ptr);
459                 break;
460
461         case 23:
462                 if (name) return _("サイバーデーモンのカード", "Trump Cyberdemon");
463                 if (desc) return _("1体のサイバーデーモンを召喚する。", "Summons a cyber demon.");
464
465                 {
466                         if (cast || fail)
467                         {
468                                 msg_print(_("あなたはサイバーデーモンのカードに集中する...", "You concentrate on the trump of a Cyberdemon..."));
469                                 if (trump_summoning(caster_ptr, 1, !fail, caster_ptr->y, caster_ptr->x, 0, SUMMON_CYBER, 0L))
470                                 {
471                                         if (fail)
472                                         {
473                                                 msg_print(_("召喚されたサイバーデーモンは怒っている!", "The summoned Cyberdemon gets angry!"));
474                                         }
475                                 }
476                         }
477                 }
478                 break;
479
480         case 24:
481                 if (name) return _("予見のカード", "Trump Divination");
482                 if (desc) return _("近くの全てのモンスター、罠、扉、階段、財宝、そしてアイテムを感知する。",
483                         "Detects all monsters, traps, doors, stairs, treasures and items in your vicinity.");
484
485                 {
486                         POSITION rad = DETECT_RAD_DEFAULT;
487
488                         if (info) return info_radius(rad);
489
490                         if (cast)
491                         {
492                                 detect_all(caster_ptr, rad);
493                         }
494                 }
495                 break;
496
497         case 25:
498                 if (name) return _("知識のカード", "Trump Lore");
499                 if (desc) return _("アイテムの持つ能力を完全に知る。", "*Identifies* an item.");
500
501                 {
502                         if (cast)
503                         {
504                                 if (!identify_fully(caster_ptr, FALSE, 0)) return NULL;
505                         }
506                 }
507                 break;
508
509         case 26:
510                 if (name) return _("回復モンスター", "Heal Monster");
511                 if (desc) return _("モンスター1体の体力を回復させる。", "Heals a monster.");
512
513                 {
514                         int heal = plev * 10 + 200;
515
516                         if (info) return info_heal(0, 0, heal);
517
518                         if (cast)
519                         {
520                                 bool result;
521
522                                 /* Temporary enable target_pet option */
523                                 bool old_target_pet = target_pet;
524                                 target_pet = TRUE;
525
526                                 result = get_aim_dir(caster_ptr, &dir);
527
528                                 /* Restore target_pet option */
529                                 target_pet = old_target_pet;
530
531                                 if (!result) return NULL;
532
533                                 heal_monster(caster_ptr, dir, heal);
534                         }
535                 }
536                 break;
537
538         case 27:
539                 if (name) return _("ドラゴンのカード", "Trump Dragon");
540                 if (desc) return _("1体のドラゴンを召喚する。", "Summons a dragon.");
541
542                 {
543                         if (cast || fail)
544                         {
545                                 msg_print(_("あなたはドラゴンのカードに集中する...", "You concentrate on the trump of a dragon..."));
546                                 if (trump_summoning(caster_ptr, 1, !fail, caster_ptr->y, caster_ptr->x, 0, SUMMON_DRAGON, 0L))
547                                 {
548                                         if (fail)
549                                         {
550                                                 msg_print(_("召喚されたドラゴンは怒っている!", "The summoned dragon gets angry!"));
551                                         }
552                                 }
553                         }
554                 }
555                 break;
556
557         case 28:
558                 if (name) return _("隕石のカード", "Trump Meteor");
559                 if (desc) return _("自分の周辺に隕石を落とす。", "Causes meteorites to fall down on nearby random locations.");
560
561                 {
562                         HIT_POINT dam = plev * 2;
563                         POSITION rad = 2;
564
565                         if (info) return info_multi_damage(dam);
566
567                         if (cast)
568                         {
569                                 cast_meteor(caster_ptr, dam, rad);
570                         }
571                 }
572                 break;
573
574         case 29:
575                 if (name) return _("デーモンのカード", "Trump Demon");
576                 if (desc) return _("1体の悪魔を召喚する。", "Summons a demon.");
577
578                 {
579                         if (cast || fail)
580                         {
581                                 msg_print(_("あなたはデーモンのカードに集中する...", "You concentrate on the trump of a demon..."));
582                                 if (trump_summoning(caster_ptr, 1, !fail, caster_ptr->y, caster_ptr->x, 0, SUMMON_DEMON, 0L))
583                                 {
584                                         if (fail)
585                                         {
586                                                 msg_print(_("召喚されたデーモンは怒っている!", "The summoned demon gets angry!"));
587                                         }
588                                 }
589                         }
590                 }
591                 break;
592
593         case 30:
594                 if (name) return _("地獄のカード", "Trump Greater Undead");
595                 if (desc) return _("1体の上級アンデッドを召喚する。", "Summons a greater undead.");
596
597                 {
598                         if (cast || fail)
599                         {
600                                 msg_print(_("あなたは強力なアンデッドのカードに集中する...", "You concentrate on the trump of a greater undead being..."));
601                                 /* May allow unique depend on level and dice roll */
602                                 if (trump_summoning(caster_ptr, 1, !fail, caster_ptr->y, caster_ptr->x, 0, SUMMON_HI_UNDEAD, PM_ALLOW_UNIQUE))
603                                 {
604                                         if (fail)
605                                         {
606                                                 msg_print(_("召喚された上級アンデッドは怒っている!", "The summoned greater undead creature gets angry!"));
607                                         }
608                                 }
609                         }
610                 }
611                 break;
612
613         case 31:
614                 if (name) return _("古代ドラゴンのカード", "Trump Ancient Dragon");
615                 if (desc) return _("1体の古代ドラゴンを召喚する。", "Summons an ancient dragon.");
616
617                 {
618                         if (cast)
619                         {
620                                 int type;
621
622                                 if (caster_ptr->pclass == CLASS_BEASTMASTER)
623                                         type = SUMMON_HI_DRAGON_LIVING;
624                                 else
625                                         type = SUMMON_HI_DRAGON;
626
627                                 msg_print(_("あなたは古代ドラゴンのカードに集中する...", "You concentrate on the trump of an ancient dragon..."));
628                                 /* May allow unique depend on level and dice roll */
629                                 if (trump_summoning(caster_ptr, 1, !fail, caster_ptr->y, caster_ptr->x, 0, type, PM_ALLOW_UNIQUE))
630                                 {
631                                         if (fail)
632                                         {
633                                                 msg_print(_("召喚された古代ドラゴンは怒っている!", "The summoned ancient dragon gets angry!"));
634                                         }
635                                 }
636                         }
637                 }
638                 break;
639         }
640
641         return "";
642 }