OSDN Git Service

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