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"
24 * @brief 生命領域魔法の各処理を行う
25 * @param caster_ptr プレーヤーへの参照ポインタ
27 * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_INFO / SPELL_CAST)
28 * @return SPELL_NAME / SPELL_DESC / SPELL_INFO 時には文字列ポインタを返す。SPELL_CAST時はNULL文字列を返す。
30 concptr do_life_spell(player_type *caster_ptr, SPELL_IDX spell, spell_type mode)
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;
38 PLAYER_LEVEL plev = caster_ptr->lev;
43 if (name) return _("軽傷の治癒", "Cure Light Wounds");
44 if (desc) return _("怪我と体力を少し回復させる。", "Heals cuts and HP a little.");
48 if (info) return info_heal(dice, sides, 0);
49 if (cast) (void)cure_light_wounds(caster_ptr, dice, sides);
54 if (name) return _("祝福", "Bless");
55 if (desc) return _("一定時間、命中率とACにボーナスを得る。", "Gives a bonus to hit and AC for a few turns.");
59 if (info) return info_duration(base, base);
63 set_blessed(caster_ptr, randint1(base) + base, FALSE);
69 if (name) return _("軽傷", "Cause Light Wounds");
70 if (desc) return _("1体のモンスターに小ダメージを与える。抵抗されると無効。", "Wounds a monster a little unless resisted.");
72 DICE_NUMBER dice = 3 + (plev - 1) / 5;
75 if (info) return info_damage(dice, sides, 0);
79 if (!get_aim_dir(caster_ptr, &dir)) return NULL;
80 fire_ball_hide(caster_ptr, GF_WOUNDS, dir, damroll(dice, sides), 0);
86 if (name) return _("光の召喚", "Call Light");
87 if (desc) return _("光源が照らしている範囲か部屋全体を永久に明るくする。", "Lights up nearby area and the inside of a room permanently.");
90 DICE_SID sides = plev / 2;
91 POSITION rad = plev / 10 + 1;
93 if (info) return info_damage(dice, sides, 0);
97 lite_area(caster_ptr, damroll(dice, sides), rad);
103 if (name) return _("罠 & 隠し扉感知", "Detect Doors & Traps");
104 if (desc) return _("近くの全ての罠と扉と階段を感知する。", "Detects traps, doors, and stairs in your vicinity.");
106 POSITION rad = DETECT_RAD_DEFAULT;
108 if (info) return info_radius(rad);
112 detect_traps(caster_ptr, rad, TRUE);
113 detect_doors(caster_ptr, rad);
114 detect_stairs(caster_ptr, rad);
120 if (name) return _("重傷の治癒", "Cure Medium Wounds");
121 if (desc) return _("怪我と体力を中程度回復させる。", "Heals cuts and HP more.");
123 DICE_NUMBER dice = 4;
126 if (info) return info_heal(dice, sides, 0);
127 if (cast) (void)cure_serious_wounds(caster_ptr, dice, sides);
132 if (name) return _("解毒", "Cure Poison");
133 if (desc) return _("体内の毒を取り除く。", "Cures yourself of any poisons.");
137 set_poisoned(caster_ptr, 0);
143 if (name) return _("空腹充足", "Satisfy Hunger");
144 if (desc) return _("満腹にする。", "Satisfies hunger.");
148 set_food(caster_ptr, PY_FOOD_MAX - 1);
154 if (name) return _("解呪", "Remove Curse");
155 if (desc) return _("アイテムにかかった弱い呪いを解除する。", "Removes normal curses from equipped items.");
157 if (cast) (void)remove_curse(caster_ptr);
162 if (name) return _("重傷", "Cause Medium Wounds");
163 if (desc) return _("1体のモンスターに中ダメージを与える。抵抗されると無効。", "Wounds a monster unless resisted.");
165 DICE_SID sides = 8 + (plev - 5) / 4;
166 DICE_NUMBER dice = 8;
168 if (info) return info_damage(dice, sides, 0);
172 if (!get_aim_dir(caster_ptr, &dir)) return NULL;
173 fire_ball_hide(caster_ptr, GF_WOUNDS, dir, damroll(dice, sides), 0);
179 if (name) return _("致命傷の治癒", "Cure Critical Wounds");
180 if (desc) return _("体力を大幅に回復させ、負傷と朦朧状態も全快する。", "Heals HP greatly. Also cures cuts and being stunned.");
182 DICE_NUMBER dice = 8;
185 if (info) return info_heal(dice, sides, 0);
186 if (cast) (void)cure_critical_wounds(caster_ptr, damroll(dice, sides));
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.");
198 if (info) return info_duration(base, base);
202 set_oppose_cold(caster_ptr, randint1(base) + base, FALSE);
203 set_oppose_fire(caster_ptr, randint1(base) + base, FALSE);
209 if (name) return _("周辺感知", "Sense Surroundings");
210 if (desc) return _("周辺の地形を感知する。", "Maps nearby area.");
213 POSITION rad = DETECT_RAD_MAP;
215 if (info) return info_radius(rad);
219 map_area(caster_ptr, rad);
225 if (name) return _("パニック・アンデッド", "Turn Undead");
226 if (desc) return _("視界内のアンデッドを恐怖させる。抵抗されると無効。", "Attempts to scare undead monsters in sight.");
231 turn_undead(caster_ptr);
237 if (name) return _("体力回復", "Healing");
238 if (desc) return _("極めて強力な回復呪文で、負傷と朦朧状態も全快する。", "Is very powerful healing magic. Also completely cures cuts and being stunned.");
242 if (info) return info_heal(0, 0, heal);
243 if (cast) (void)cure_critical_wounds(caster_ptr, heal);
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.");
255 warding_glyph(caster_ptr);
261 if (name) return _("*解呪*", "Dispel Curse");
262 if (desc) return _("アイテムにかかった強力な呪いを解除する。", "Removes normal and heavy curse from equipped items.");
264 if (cast) (void)remove_all_curse(caster_ptr);
269 if (name) return _("鑑識", "Perception");
270 if (desc) return _("アイテムを識別する。", "Identifies an item.");
275 if (!ident_spell(caster_ptr, FALSE, 0)) return NULL;
281 if (name) return _("アンデッド退散", "Dispel Undead");
282 if (desc) return _("視界内の全てのアンデッドにダメージを与える。", "Damages all undead monsters in sight.");
285 DICE_NUMBER dice = 1;
286 DICE_SID sides = plev * 5;
288 if (info) return info_damage(dice, sides, 0);
292 dispel_undead(caster_ptr, damroll(dice, sides));
298 if (name) return _("凪の刻", "Day of the Dove");
299 if (desc) return _("視界内の全てのモンスターを魅了する。抵抗されると無効。", "Attempts to charm all monsters in sight.");
302 int power = plev * 2;
304 if (info) return info_power(power);
308 charm_monsters(caster_ptr, power);
314 if (name) return _("致命傷", "Cause Critical Wounds");
315 if (desc) return _("1体のモンスターに大ダメージを与える。抵抗されると無効。", "Wounds a monster critically unless resisted.");
318 DICE_NUMBER dice = 5 + (plev - 5) / 3;
321 if (info) return info_damage(dice, sides, 0);
325 if (!get_aim_dir(caster_ptr, &dir)) return NULL;
326 fire_ball_hide(caster_ptr, GF_WOUNDS, dir, damroll(dice, sides), 0);
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.");
339 if (info) return info_delay(base, sides);
343 if (!recall_player(caster_ptr, randint0(21) + 15)) return NULL;
349 if (name) return _("真実の祭壇", "Alter Reality");
350 if (desc) return _("現在の階を再構成する。", "Recreates current dungeon level.");
356 if (info) return info_delay(base, sides);
360 reserve_alter_reality(caster_ptr);
366 if (name) return _("真・結界", "Warding True");
367 if (desc) return _("自分のいる床と周囲8マスの床の上に、モンスターが通り抜けたり召喚されたりすることができなくなるルーンを描く。", "Creates glyphs in all adjacent squares and under you.");
372 if (info) return info_radius(rad);
376 warding_glyph(caster_ptr);
377 glyph_creation(caster_ptr, caster_ptr->y, caster_ptr->x);
383 if (name) return _("不毛化", "Sterilization");
384 if (desc) return _("この階の増殖するモンスターが増殖できなくなる。", "Prevents any breeders on current level from breeding.");
389 caster_ptr->current_floor_ptr->num_repro += MAX_REPRO;
395 if (name) return _("全感知", "Detection");
396 if (desc) return _("近くの全てのモンスター、罠、扉、階段、財宝、そしてアイテムを感知する。", "Detects all monsters, traps, doors, stairs, treasures and items in your vicinity.");
399 POSITION rad = DETECT_RAD_DEFAULT;
401 if (info) return info_radius(rad);
405 detect_all(caster_ptr, rad);
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.");
416 int power = plev + 50;
418 if (info) return info_power(power);
422 mass_genocide_undead(caster_ptr, power, TRUE);
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.");
434 wiz_lite(caster_ptr, FALSE);
440 if (name) return _("全復活", "Restoration");
441 if (desc) return _("すべてのステータスと経験値を回復する。", "Restores all stats and experience.");
446 (void)restore_all_status(caster_ptr);
447 restore_level(caster_ptr);
453 if (name) return _("*体力回復*", "Healing True");
454 if (desc) return _("最強の治癒の魔法で、負傷と朦朧状態も全快する。", "Is the greatest healing magic. Heals all HP, cuts and being stunned.");
458 if (info) return info_heal(0, 0, heal);
459 if (cast) (void)cure_critical_wounds(caster_ptr, heal);
464 if (name) return _("聖なるビジョン", "Holy Vision");
465 if (desc) return _("アイテムの持つ能力を完全に知る。", "*Identifies* an item.");
470 if (!identify_fully(caster_ptr, FALSE, 0)) return NULL;
476 if (name) return _("究極の耐性", "Ultimate Resistance");
477 if (desc) return _("一定時間、あらゆる耐性を付け、ACと魔法防御能力を上昇させる。", "Gives ultimate resistance, bonus to AC and speed.");
480 TIME_EFFECT base = (TIME_EFFECT)plev / 2;
482 if (info) return info_duration(base, base);
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);