OSDN Git Service

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