1 #include "angband.h"
\r
2 #include "cmd-spell.h"
\r
3 #include "projection.h"
\r
4 #include "spells-summon.h"
\r
9 * @brief 自然領域魔法の各処理を行う
\r
11 * @param mode 処理内容 (SPELL_NAME / SPELL_DESC / SPELL_INFO / SPELL_CAST)
\r
12 * @return SPELL_NAME / SPELL_DESC / SPELL_INFO 時には文字列ポインタを返す。SPELL_CAST時はNULL文字列を返す。
\r
14 concptr do_nature_spell(SPELL_IDX spell, BIT_FLAGS mode)
\r
16 bool name = (mode == SPELL_NAME) ? TRUE : FALSE;
\r
17 bool desc = (mode == SPELL_DESC) ? TRUE : FALSE;
\r
18 bool info = (mode == SPELL_INFO) ? TRUE : FALSE;
\r
19 bool cast = (mode == SPELL_CAST) ? TRUE : FALSE;
\r
22 PLAYER_LEVEL plev = p_ptr->lev;
\r
27 if (name) return _("モンスター感知", "Detect Creatures");
\r
28 if (desc) return _("近くの全ての見えるモンスターを感知する。", "Detects all monsters in your vicinity unless invisible.");
\r
31 POSITION rad = DETECT_RAD_DEFAULT;
\r
33 if (info) return info_radius(rad);
\r
37 detect_monsters_normal(rad);
\r
43 if (name) return _("稲妻", "Lightning");
\r
44 if (desc) return _("電撃の短いビームを放つ。", "Fires a short beam of lightning.");
\r
47 DICE_NUMBER dice = 3 + (plev - 1) / 5;
\r
49 POSITION range = plev / 6 + 2;
\r
51 if (info) return format("%s%dd%d %s%d", KWD_DAM, dice, sides, KWD_RANGE, range);
\r
55 project_length = range;
\r
57 if (!get_aim_dir(&dir)) return NULL;
\r
59 fire_beam(GF_ELEC, dir, damroll(dice, sides));
\r
65 if (name) return _("罠と扉感知", "Detect Doors and Traps");
\r
66 if (desc) return _("近くの全ての罠と扉を感知する。", "Detects traps, doors, and stairs in your vicinity.");
\r
69 POSITION rad = DETECT_RAD_DEFAULT;
\r
71 if (info) return info_radius(rad);
\r
75 detect_traps(rad, TRUE);
\r
83 if (name) return _("食糧生成", "Produce Food");
\r
84 if (desc) return _("食料を一つ作り出す。", "Produces a Ration of Food.");
\r
89 object_type forge, *q_ptr = &forge;
\r
90 msg_print(_("食料を生成した。", "A food ration is produced."));
\r
92 /* Create the food ration */
\r
93 object_prep(q_ptr, lookup_kind(TV_FOOD, SV_FOOD_RATION));
\r
95 /* Drop the object from heaven */
\r
96 (void)drop_near(q_ptr, -1, p_ptr->y, p_ptr->x);
\r
102 if (name) return _("日の光", "Daylight");
\r
103 if (desc) return _("光源が照らしている範囲か部屋全体を永久に明るくする。", "Lights up nearby area and the inside of a room permanently.");
\r
106 DICE_NUMBER dice = 2;
\r
107 DICE_SID sides = plev / 2;
\r
108 POSITION rad = (plev / 10) + 1;
\r
110 if (info) return info_damage(dice, sides, 0);
\r
114 lite_area(damroll(dice, sides), rad);
\r
116 if ((prace_is_(RACE_VAMPIRE) || (p_ptr->mimic_form == MIMIC_VAMPIRE)) && !p_ptr->resist_lite)
\r
118 msg_print(_("日の光があなたの肉体を焦がした!", "The daylight scorches your flesh!"));
\r
119 take_hit(DAMAGE_NOESCAPE, damroll(2, 2), _("日の光", "daylight"), -1);
\r
126 if (name) return _("動物習し", "Animal Taming");
\r
127 if (desc) return _("動物1体を魅了する。抵抗されると無効。", "Attempts to charm an animal.");
\r
132 if (info) return info_power(power);
\r
136 if (!get_aim_dir(&dir)) return NULL;
\r
138 charm_animal(dir, plev);
\r
144 if (name) return _("環境への耐性", "Resist Environment");
\r
145 if (desc) return _("一定時間、冷気、炎、電撃に対する耐性を得る。装備による耐性に累積する。",
\r
146 "Gives resistance to fire, cold and electricity for a while. These resistances can be added to which from equipment for more powerful resistances.");
\r
151 if (info) return info_duration(base, base);
\r
155 set_oppose_cold(randint1(base) + base, FALSE);
\r
156 set_oppose_fire(randint1(base) + base, FALSE);
\r
157 set_oppose_elec(randint1(base) + base, FALSE);
\r
163 if (name) return _("傷と毒治療", "Cure Wounds & Poison");
\r
164 if (desc) return _("怪我を全快させ、毒を体から完全に取り除き、体力を少し回復させる。", "Heals all cut and poison status. Heals HP a little.");
\r
167 DICE_NUMBER dice = 2;
\r
168 DICE_SID sides = 8;
\r
170 if (info) return info_heal(dice, sides, 0);
\r
174 hp_player(damroll(dice, sides));
\r
182 if (name) return _("岩石溶解", "Stone to Mud");
\r
183 if (desc) return _("壁を溶かして床にする。", "Turns one rock square to mud.");
\r
186 DICE_NUMBER dice = 1;
\r
187 DICE_SID sides = 30;
\r
190 if (info) return info_damage(dice, sides, base);
\r
194 if (!get_aim_dir(&dir)) return NULL;
\r
196 wall_to_mud(dir, 20 + randint1(30));
\r
202 if (name) return _("アイス・ボルト", "Frost Bolt");
\r
203 if (desc) return _("冷気のボルトもしくはビームを放つ。", "Fires a bolt or beam of cold.");
\r
206 DICE_NUMBER dice = 3 + (plev - 5) / 4;
\r
207 DICE_SID sides = 8;
\r
209 if (info) return info_damage(dice, sides, 0);
\r
213 if (!get_aim_dir(&dir)) return NULL;
\r
214 fire_bolt_or_beam(beam_chance() - 10, GF_COLD, dir, damroll(dice, sides));
\r
220 if (name) return _("自然の覚醒", "Nature Awareness");
\r
221 if (desc) return _("周辺の地形を感知し、近くの罠、扉、階段、全てのモンスターを感知する。",
\r
222 "Maps nearby area. Detects all monsters, traps, doors and stairs.");
\r
225 int rad1 = DETECT_RAD_MAP;
\r
226 int rad2 = DETECT_RAD_DEFAULT;
\r
228 if (info) return info_radius(MAX(rad1, rad2));
\r
233 detect_traps(rad2, TRUE);
\r
234 detect_doors(rad2);
\r
235 detect_stairs(rad2);
\r
236 detect_monsters_normal(rad2);
\r
242 if (name) return _("ファイア・ボルト", "Fire Bolt");
\r
243 if (desc) return _("火炎のボルトもしくはビームを放つ。", "Fires a bolt or beam of fire.");
\r
246 DICE_NUMBER dice = 5 + (plev - 5) / 4;
\r
247 DICE_SID sides = 8;
\r
249 if (info) return info_damage(dice, sides, 0);
\r
253 if (!get_aim_dir(&dir)) return NULL;
\r
254 fire_bolt_or_beam(beam_chance() - 10, GF_FIRE, dir, damroll(dice, sides));
\r
260 if (name) return _("太陽光線", "Ray of Sunlight");
\r
261 if (desc) return _("光線を放つ。光りを嫌うモンスターに効果がある。", "Fires a beam of light which damages to light-sensitive monsters.");
\r
264 DICE_NUMBER dice = 6;
\r
265 DICE_SID sides = 8;
\r
267 if (info) return info_damage(dice, sides, 0);
\r
271 if (!get_aim_dir(&dir)) return NULL;
\r
272 msg_print(_("太陽光線が現れた。", "A line of sunlight appears."));
\r
273 lite_line(dir, damroll(6, 8));
\r
279 if (name) return _("足かせ", "Entangle");
\r
280 if (desc) return _("視界内の全てのモンスターを減速させる。抵抗されると無効。", "Attempts to slow all monsters in sight.");
\r
283 if (info) return info_power(power);
\r
284 if (cast) slow_monsters(plev);
\r
289 if (name) return _("動物召喚", "Summon Animal");
\r
290 if (desc) return _("動物を1体召喚する。", "Summons an animal.");
\r
295 if (!(summon_specific(-1, p_ptr->y, p_ptr->x, plev, SUMMON_ANIMAL_RANGER, (PM_ALLOW_GROUP | PM_FORCE_PET), '\0')))
\r
297 msg_print(_("動物は現れなかった。", "No animals arrive."));
\r
305 if (name) return _("薬草治療", "Herbal Healing");
\r
306 if (desc) return _("体力を大幅に回復させ、負傷、朦朧状態、毒から全快する。", "Heals HP greatly. And heals cut, stun and poison completely.");
\r
309 if (info) return info_heal(0, 0, heal);
\r
310 if (cast) (void)cure_critical_wounds(heal);
\r
315 if (name) return _("階段生成", "Stair Building");
\r
316 if (desc) return _("自分のいる位置に階段を作る。", "Creates a stair which goes down or up.");
\r
327 if (name) return _("肌石化", "Stone Skin");
\r
328 if (desc) return _("一定時間、ACを上昇させる。", "Gives bonus to AC for a while.");
\r
332 DICE_SID sides = 30;
\r
334 if (info) return info_duration(base, sides);
\r
338 set_shield(randint1(sides) + base, FALSE);
\r
344 if (name) return _("真・耐性", "Resistance True");
\r
345 if (desc) return _("一定時間、酸、電撃、炎、冷気、毒に対する耐性を得る。装備による耐性に累積する。",
\r
346 "Gives resistance to fire, cold, electricity, acid and poison for a while. These resistances can be added to which from equipment for more powerful resistances.");
\r
351 if (info) return info_duration(base, base);
\r
355 set_oppose_acid(randint1(base) + base, FALSE);
\r
356 set_oppose_elec(randint1(base) + base, FALSE);
\r
357 set_oppose_fire(randint1(base) + base, FALSE);
\r
358 set_oppose_cold(randint1(base) + base, FALSE);
\r
359 set_oppose_pois(randint1(base) + base, FALSE);
\r
365 if (name) return _("森林創造", "Forest Creation");
\r
366 if (desc) return _("周囲に木を作り出す。", "Creates trees in all adjacent squares.");
\r
377 if (name) return _("動物友和", "Animal Friendship");
\r
378 if (desc) return _("視界内の全ての動物を魅了する。抵抗されると無効。", "Attempts to charm all animals in sight.");
\r
381 int power = plev * 2;
\r
382 if (info) return info_power(power);
\r
383 if (cast) charm_animals(power);
\r
388 if (name) return _("試金石", "Stone Tell");
\r
389 if (desc) return _("アイテムの持つ能力を完全に知る。", "*Identifies* an item.");
\r
394 if (!identify_fully(FALSE)) return NULL;
\r
400 if (name) return _("石の壁", "Wall of Stone");
\r
401 if (desc) return _("自分の周囲に花崗岩の壁を作る。", "Creates granite walls in all adjacent squares.");
\r
412 if (name) return _("腐食防止", "Protect from Corrosion");
\r
413 if (desc) return _("アイテムを酸で傷つかないよう加工する。", "Makes an equipment acid-proof.");
\r
418 if (!rustproof()) return NULL;
\r
424 if (name) return _("地震", "Earthquake");
\r
425 if (desc) return _("周囲のダンジョンを揺らし、壁と床をランダムに入れ変える。",
\r
426 "Shakes dungeon structure, and results in random swapping of floors and walls.");
\r
431 if (info) return info_radius(rad);
\r
435 earthquake(p_ptr->y, p_ptr->x, rad);
\r
441 if (name) return _("カマイタチ", "Whirlwind");
\r
442 if (desc) return _("全方向に向かって攻撃する。", "Attacks all adjacent monsters.");
\r
443 if (cast) massacre();
\r
447 if (name) return _("ブリザード", "Blizzard");
\r
448 if (desc) return _("巨大な冷気の球を放つ。", "Fires a huge ball of cold.");
\r
451 HIT_POINT dam = 70 + plev * 3 / 2;
\r
452 POSITION rad = plev / 12 + 1;
\r
454 if (info) return info_damage(0, 0, dam);
\r
458 if (!get_aim_dir(&dir)) return NULL;
\r
460 fire_ball(GF_COLD, dir, dam, rad);
\r
466 if (name) return _("稲妻嵐", "Lightning Storm");
\r
467 if (desc) return _("巨大な電撃の球を放つ。", "Fires a huge electric ball.");
\r
470 HIT_POINT dam = 90 + plev * 3 / 2;
\r
471 POSITION rad = plev / 12 + 1;
\r
473 if (info) return info_damage(0, 0, dam);
\r
477 if (!get_aim_dir(&dir)) return NULL;
\r
478 fire_ball(GF_ELEC, dir, dam, rad);
\r
485 if (name) return _("渦潮", "Whirlpool");
\r
486 if (desc) return _("巨大な水の球を放つ。", "Fires a huge ball of water.");
\r
489 HIT_POINT dam = 100 + plev * 3 / 2;
\r
490 POSITION rad = plev / 12 + 1;
\r
492 if (info) return info_damage(0, 0, dam);
\r
496 if (!get_aim_dir(&dir)) return NULL;
\r
497 fire_ball(GF_WATER, dir, dam, rad);
\r
503 if (name) return _("陽光召喚", "Call Sunlight");
\r
504 if (desc) return _("自分を中心とした光の球を発生させる。さらに、その階全体を永久に照らし、ダンジョン内すべてのアイテムを感知する。",
\r
505 "Generates ball of light centered on you. Maps and lights whole dungeon level. Knows all objects location.");
\r
508 HIT_POINT dam = 150;
\r
511 if (info) return info_damage(0, 0, dam / 2);
\r
515 fire_ball(GF_LITE, 0, dam, rad);
\r
516 chg_virtue(V_KNOWLEDGE, 1);
\r
517 chg_virtue(V_ENLIGHTEN, 1);
\r
520 if ((prace_is_(RACE_VAMPIRE) || (p_ptr->mimic_form == MIMIC_VAMPIRE)) && !p_ptr->resist_lite)
\r
522 msg_print(_("日光があなたの肉体を焦がした!", "The sunlight scorches your flesh!"));
\r
523 take_hit(DAMAGE_NOESCAPE, 50, _("日光", "sunlight"), -1);
\r
530 if (name) return _("精霊の刃", "Elemental Branding");
\r
531 if (desc) return _("武器に炎か冷気の属性をつける。", "Makes current weapon fire or frost branded.");
\r
536 brand_weapon(randint0(2));
\r
542 if (name) return _("自然の脅威", "Nature's Wrath");
\r
543 if (desc) return _("近くの全てのモンスターにダメージを与え、地震を起こし、自分を中心とした分解の球を発生させる。",
\r
544 "Damages all monsters in sight. Makes quake. Generates disintegration ball centered on you.");
\r
547 int d_dam = 4 * plev;
\r
548 int b_dam = (100 + plev) * 2;
\r
549 POSITION b_rad = 1 + plev / 12;
\r
550 POSITION q_rad = 20 + plev / 2;
\r
552 if (info) return format("%s%d+%d", KWD_DAM, d_dam, b_dam / 2);
\r
556 dispel_monsters(d_dam);
\r
557 earthquake(p_ptr->y, p_ptr->x, q_rad);
\r
558 project(0, b_rad, p_ptr->y, p_ptr->x, b_dam, GF_DISINTEGRATE, PROJECT_KILL | PROJECT_ITEM, -1);
\r