OSDN Git Service

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