OSDN Git Service

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