OSDN Git Service

[Refactor] #40414 Separated spells-launcher.c/h from spells2.c/h
[hengband/hengband.git] / src / realm / realm-life.c
1 #include "realm/realm-life.h"
2 #include "cmd-action/cmd-spell.h"
3 #include "floor/floor.h"
4 #include "io/targeting.h"
5 #include "player/player-effects.h"
6 #include "player/player-status.h"
7 #include "spell/spells-detection.h"
8 #include "spell/spells-floor.h"
9 #include "spell/spells-launcher.h"
10 #include "spell/spells-status.h"
11 #include "spell/spells-type.h"
12 #include "spell/spells2.h"
13 #include "spell/spells3.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_life_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 _("軽傷の治癒", "Cure Light Wounds");
36                 if (desc) return _("怪我と体力を少し回復させる。", "Heals cuts and HP a little.");
37                 {
38                         DICE_NUMBER dice = 2;
39                         DICE_SID sides = 10;
40                         if (info) return info_heal(dice, sides, 0);
41                         if (cast) (void)cure_light_wounds(caster_ptr, dice, sides);
42                 }
43                 break;
44
45         case 1:
46                 if (name) return _("祝福", "Bless");
47                 if (desc) return _("一定時間、命中率とACにボーナスを得る。", "Gives a bonus to hit and AC for a few turns.");
48                 {
49                         int base = 12;
50
51                         if (info) return info_duration(base, base);
52
53                         if (cast)
54                         {
55                                 set_blessed(caster_ptr, randint1(base) + base, FALSE);
56                         }
57                 }
58                 break;
59
60         case 2:
61                 if (name) return _("軽傷", "Cause Light Wounds");
62                 if (desc) return _("1体のモンスターに小ダメージを与える。抵抗されると無効。", "Wounds a monster a little unless resisted.");
63                 {
64                         DICE_NUMBER dice = 3 + (plev - 1) / 5;
65                         DICE_SID sides = 4;
66
67                         if (info) return info_damage(dice, sides, 0);
68
69                         if (cast)
70                         {
71                                 if (!get_aim_dir(caster_ptr, &dir)) return NULL;
72                                 fire_ball_hide(caster_ptr, GF_WOUNDS, dir, damroll(dice, sides), 0);
73                         }
74                 }
75                 break;
76
77         case 3:
78                 if (name) return _("光の召喚", "Call Light");
79                 if (desc) return _("光源が照らしている範囲か部屋全体を永久に明るくする。", "Lights up nearby area and the inside of a room permanently.");
80                 {
81                         DICE_NUMBER dice = 2;
82                         DICE_SID sides = plev / 2;
83                         POSITION rad = plev / 10 + 1;
84
85                         if (info) return info_damage(dice, sides, 0);
86
87                         if (cast)
88                         {
89                                 lite_area(caster_ptr, damroll(dice, sides), rad);
90                         }
91                 }
92                 break;
93
94         case 4:
95                 if (name) return _("罠 & 隠し扉感知", "Detect Doors & Traps");
96                 if (desc) return _("近くの全ての罠と扉と階段を感知する。", "Detects traps, doors, and stairs in your vicinity.");
97                 {
98                         POSITION rad = DETECT_RAD_DEFAULT;
99
100                         if (info) return info_radius(rad);
101
102                         if (cast)
103                         {
104                                 detect_traps(caster_ptr, rad, TRUE);
105                                 detect_doors(caster_ptr, rad);
106                                 detect_stairs(caster_ptr, rad);
107                         }
108                 }
109                 break;
110
111         case 5:
112                 if (name) return _("重傷の治癒", "Cure Medium Wounds");
113                 if (desc) return _("怪我と体力を中程度回復させる。", "Heals cuts and HP more.");
114                 {
115                         DICE_NUMBER dice = 4;
116                         DICE_SID sides = 10;
117
118                         if (info) return info_heal(dice, sides, 0);
119                         if (cast) (void)cure_serious_wounds(caster_ptr, dice, sides);
120                 }
121                 break;
122
123         case 6:
124                 if (name) return _("解毒", "Cure Poison");
125                 if (desc) return _("体内の毒を取り除く。", "Cures yourself of any poisons.");
126                 {
127                         if (cast)
128                         {
129                                 set_poisoned(caster_ptr, 0);
130                         }
131                 }
132                 break;
133
134         case 7:
135                 if (name) return _("空腹充足", "Satisfy Hunger");
136                 if (desc) return _("満腹にする。", "Satisfies hunger.");
137                 {
138                         if (cast)
139                         {
140                                 set_food(caster_ptr, PY_FOOD_MAX - 1);
141                         }
142                 }
143                 break;
144
145         case 8:
146                 if (name) return _("解呪", "Remove Curse");
147                 if (desc) return _("アイテムにかかった弱い呪いを解除する。", "Removes normal curses from equipped items.");
148                 {
149                         if (cast) (void)remove_curse(caster_ptr);
150                 }
151                 break;
152
153         case 9:
154                 if (name) return _("重傷", "Cause Medium Wounds");
155                 if (desc) return _("1体のモンスターに中ダメージを与える。抵抗されると無効。", "Wounds a monster unless resisted.");
156                 {
157                         DICE_SID sides = 8 + (plev - 5) / 4;
158                         DICE_NUMBER dice = 8;
159
160                         if (info) return info_damage(dice, sides, 0);
161
162                         if (cast)
163                         {
164                                 if (!get_aim_dir(caster_ptr, &dir)) return NULL;
165                                 fire_ball_hide(caster_ptr, GF_WOUNDS, dir, damroll(dice, sides), 0);
166                         }
167                 }
168                 break;
169
170         case 10:
171                 if (name) return _("致命傷の治癒", "Cure Critical Wounds");
172                 if (desc) return _("体力を大幅に回復させ、負傷と朦朧状態も全快する。", "Heals HP greatly. Also cures cuts and being stunned.");
173                 {
174                         DICE_NUMBER dice = 8;
175                         DICE_SID sides = 10;
176
177                         if (info) return info_heal(dice, sides, 0);
178                         if (cast) (void)cure_critical_wounds(caster_ptr, damroll(dice, sides));
179                 }
180                 break;
181
182         case 11:
183                 if (name) return _("耐熱耐寒", "Resist Heat and Cold");
184                 if (desc) return _("一定時間、火炎と冷気に対する耐性を得る。装備による耐性に累積する。",
185                         "Gives resistance to fire and cold. These resistances can be added to those from equipment for more powerful resistances.");
186
187                 {
188                         int base = 20;
189
190                         if (info) return info_duration(base, base);
191
192                         if (cast)
193                         {
194                                 set_oppose_cold(caster_ptr, randint1(base) + base, FALSE);
195                                 set_oppose_fire(caster_ptr, randint1(base) + base, FALSE);
196                         }
197                 }
198                 break;
199
200         case 12:
201                 if (name) return _("周辺感知", "Sense Surroundings");
202                 if (desc) return _("周辺の地形を感知する。", "Maps nearby area.");
203
204                 {
205                         POSITION rad = DETECT_RAD_MAP;
206
207                         if (info) return info_radius(rad);
208
209                         if (cast)
210                         {
211                                 map_area(caster_ptr, rad);
212                         }
213                 }
214                 break;
215
216         case 13:
217                 if (name) return _("パニック・アンデッド", "Turn Undead");
218                 if (desc) return _("視界内のアンデッドを恐怖させる。抵抗されると無効。", "Attempts to scare undead monsters in sight.");
219
220                 {
221                         if (cast)
222                         {
223                                 turn_undead(caster_ptr);
224                         }
225                 }
226                 break;
227
228         case 14:
229                 if (name) return _("体力回復", "Healing");
230                 if (desc) return _("極めて強力な回復呪文で、負傷と朦朧状態も全快する。", "Is very powerful healing magic. Also completely cures cuts and being stunned.");
231
232                 {
233                         int heal = 300;
234                         if (info) return info_heal(0, 0, heal);
235                         if (cast) (void)cure_critical_wounds(caster_ptr, heal);
236                 }
237                 break;
238
239         case 15:
240                 if (name) return _("結界の紋章", "Glyph of Warding");
241                 if (desc) return _("自分のいる床の上に、モンスターが通り抜けたり召喚されたりすることができなくなるルーンを描く。",
242                         "Sets a glyph on the floor beneath you. If you are on a glyph, monsters cannot attack you but can try to break the glyph.");
243
244                 {
245                         if (cast)
246                         {
247                                 warding_glyph(caster_ptr);
248                         }
249                 }
250                 break;
251
252         case 16:
253                 if (name) return _("*解呪*", "Dispel Curse");
254                 if (desc) return _("アイテムにかかった強力な呪いを解除する。", "Removes normal and heavy curse from equipped items.");
255                 {
256                         if (cast) (void)remove_all_curse(caster_ptr);
257                 }
258                 break;
259
260         case 17:
261                 if (name) return _("鑑識", "Perception");
262                 if (desc) return _("アイテムを識別する。", "Identifies an item.");
263
264                 {
265                         if (cast)
266                         {
267                                 if (!ident_spell(caster_ptr, FALSE, 0)) return NULL;
268                         }
269                 }
270                 break;
271
272         case 18:
273                 if (name) return _("アンデッド退散", "Dispel Undead");
274                 if (desc) return _("視界内の全てのアンデッドにダメージを与える。", "Damages all undead monsters in sight.");
275
276                 {
277                         DICE_NUMBER dice = 1;
278                         DICE_SID sides = plev * 5;
279
280                         if (info) return info_damage(dice, sides, 0);
281
282                         if (cast)
283                         {
284                                 dispel_undead(caster_ptr, damroll(dice, sides));
285                         }
286                 }
287                 break;
288
289         case 19:
290                 if (name) return _("凪の刻", "Day of the Dove");
291                 if (desc) return _("視界内の全てのモンスターを魅了する。抵抗されると無効。", "Attempts to charm all monsters in sight.");
292
293                 {
294                         int power = plev * 2;
295
296                         if (info) return info_power(power);
297
298                         if (cast)
299                         {
300                                 charm_monsters(caster_ptr, power);
301                         }
302                 }
303                 break;
304
305         case 20:
306                 if (name) return _("致命傷", "Cause Critical Wounds");
307                 if (desc) return _("1体のモンスターに大ダメージを与える。抵抗されると無効。", "Wounds a monster critically unless resisted.");
308
309                 {
310                         DICE_NUMBER dice = 5 + (plev - 5) / 3;
311                         DICE_SID sides = 15;
312
313                         if (info) return info_damage(dice, sides, 0);
314
315                         if (cast)
316                         {
317                                 if (!get_aim_dir(caster_ptr, &dir)) return NULL;
318                                 fire_ball_hide(caster_ptr, GF_WOUNDS, dir, damroll(dice, sides), 0);
319                         }
320                 }
321                 break;
322
323         case 21:
324                 if (name) return _("帰還の詔", "Word of Recall");
325                 if (desc) return _("地上にいるときはダンジョンの最深階へ、ダンジョンにいるときは地上へと移動する。", "Recalls player from dungeon to town or from town to the deepest level of dungeon.");
326
327                 {
328                         int base = 15;
329                         DICE_SID sides = 20;
330
331                         if (info) return info_delay(base, sides);
332
333                         if (cast)
334                         {
335                                 if (!recall_player(caster_ptr, randint0(21) + 15)) return NULL;
336                         }
337                 }
338                 break;
339
340         case 22:
341                 if (name) return _("真実の祭壇", "Alter Reality");
342                 if (desc) return _("現在の階を再構成する。", "Recreates current dungeon level.");
343
344                 {
345                         int base = 15;
346                         DICE_SID sides = 20;
347
348                         if (info) return info_delay(base, sides);
349
350                         if (cast)
351                         {
352                                 reserve_alter_reality(caster_ptr);
353                         }
354                 }
355                 break;
356
357         case 23:
358                 if (name) return _("真・結界", "Warding True");
359                 if (desc) return _("自分のいる床と周囲8マスの床の上に、モンスターが通り抜けたり召喚されたりすることができなくなるルーンを描く。", "Creates glyphs in all adjacent squares and under you.");
360
361                 {
362                         POSITION rad = 1;
363
364                         if (info) return info_radius(rad);
365
366                         if (cast)
367                         {
368                                 warding_glyph(caster_ptr);
369                                 glyph_creation(caster_ptr, caster_ptr->y, caster_ptr->x);
370                         }
371                 }
372                 break;
373
374         case 24:
375                 if (name) return _("不毛化", "Sterilization");
376                 if (desc) return _("この階の増殖するモンスターが増殖できなくなる。", "Prevents any breeders on current level from breeding.");
377
378                 {
379                         if (cast)
380                         {
381                                 caster_ptr->current_floor_ptr->num_repro += MAX_REPRO;
382                         }
383                 }
384                 break;
385
386         case 25:
387                 if (name) return _("全感知", "Detection");
388                 if (desc) return _("近くの全てのモンスター、罠、扉、階段、財宝、そしてアイテムを感知する。", "Detects all monsters, traps, doors, stairs, treasures and items in your vicinity.");
389
390                 {
391                         POSITION rad = DETECT_RAD_DEFAULT;
392
393                         if (info) return info_radius(rad);
394
395                         if (cast)
396                         {
397                                 detect_all(caster_ptr, rad);
398                         }
399                 }
400                 break;
401
402         case 26:
403                 if (name) return _("アンデッド消滅", "Annihilate Undead");
404                 if (desc) return _("自分の周囲にいるアンデッドを現在の階から消し去る。抵抗されると無効。",
405                         "Eliminates all nearby undead monsters, exhausting you. Powerful or unique monsters may be able to resist.");
406
407                 {
408                         int power = plev + 50;
409
410                         if (info) return info_power(power);
411
412                         if (cast)
413                         {
414                                 mass_genocide_undead(caster_ptr, power, TRUE);
415                         }
416                 }
417                 break;
418
419         case 27:
420                 if (name) return _("千里眼", "Clairvoyance");
421                 if (desc) return _("その階全体を永久に照らし、ダンジョン内すべてのアイテムを感知する。", "Maps and lights whole dungeon level. Knows all objects location. And gives telepathy for a while.");
422
423                 {
424                         if (cast)
425                         {
426                                 wiz_lite(caster_ptr, FALSE);
427                         }
428                 }
429                 break;
430
431         case 28:
432                 if (name) return _("全復活", "Restoration");
433                 if (desc) return _("すべてのステータスと経験値を回復する。", "Restores all stats and experience.");
434
435                 {
436                         if (cast)
437                         {
438                                 (void)restore_all_status(caster_ptr);
439                                 restore_level(caster_ptr);
440                         }
441                 }
442                 break;
443
444         case 29:
445                 if (name) return _("*体力回復*", "Healing True");
446                 if (desc) return _("最強の治癒の魔法で、負傷と朦朧状態も全快する。", "Is the greatest healing magic. Heals all HP, cuts and being stunned.");
447
448                 {
449                         int heal = 2000;
450                         if (info) return info_heal(0, 0, heal);
451                         if (cast) (void)cure_critical_wounds(caster_ptr, heal);
452                 }
453                 break;
454
455         case 30:
456                 if (name) return _("聖なるビジョン", "Holy Vision");
457                 if (desc) return _("アイテムの持つ能力を完全に知る。", "*Identifies* an item.");
458
459                 {
460                         if (cast)
461                         {
462                                 if (!identify_fully(caster_ptr, FALSE, 0)) return NULL;
463                         }
464                 }
465                 break;
466
467         case 31:
468                 if (name) return _("究極の耐性", "Ultimate Resistance");
469                 if (desc) return _("一定時間、あらゆる耐性を付け、ACと魔法防御能力を上昇させる。", "Gives ultimate resistance, bonus to AC and speed.");
470
471                 {
472                         TIME_EFFECT base = (TIME_EFFECT)plev / 2;
473
474                         if (info) return info_duration(base, base);
475
476                         if (cast)
477                         {
478                                 TIME_EFFECT v = randint1(base) + base;
479                                 set_fast(caster_ptr, v, FALSE);
480                                 set_oppose_acid(caster_ptr, v, FALSE);
481                                 set_oppose_elec(caster_ptr, v, FALSE);
482                                 set_oppose_fire(caster_ptr, v, FALSE);
483                                 set_oppose_cold(caster_ptr, v, FALSE);
484                                 set_oppose_pois(caster_ptr, v, FALSE);
485                                 set_ultimate_res(caster_ptr, v, FALSE);
486                         }
487                 }
488                 break;
489         }
490
491         return "";
492 }