+ break;
+ }
+
+ case ACT_JUDGE:
+ {
+ msg_format(_("%sは赤く明るく光った!", "The %s flashes bright red!"), name);
+ chg_virtue(V_KNOWLEDGE, 1);
+ chg_virtue(V_ENLIGHTEN, 1);
+ wiz_lite(FALSE);
+
+ msg_format(_("%sはあなたの体力を奪った...", "The %s drains your vitality..."), name);
+ take_hit(DAMAGE_LOSELIFE, damroll(3,8), _("審判の宝石", "the Jewel of Judgement"), -1);
+
+ (void)detect_traps(DETECT_RAD_DEFAULT, TRUE);
+ (void)detect_doors(DETECT_RAD_DEFAULT);
+ (void)detect_stairs(DETECT_RAD_DEFAULT);
+
+ if (get_check(_("帰還の力を使いますか?", "Activate recall? ")))
+ {
+ (void)word_of_recall();
+ }
+
+ break;
+ }
+
+ case ACT_TELEKINESIS:
+ {
+ if (!get_aim_dir(&dir)) return FALSE;
+ msg_format(_("%sを伸ばした。", "You stretched your %s."), name);
+ fetch(dir, 500, TRUE);
+ break;
+ }
+
+ case ACT_DETECT_UNIQUE:
+ {
+ int i;
+ monster_type *m_ptr;
+ monster_race *r_ptr;
+ msg_print(_("奇妙な場所が頭の中に浮かんだ...", "Some strange places show up in your mind. And you see ..."));
+ /* Process the monsters (backwards) */
+ for (i = m_max - 1; i >= 1; i--)
+ {
+ /* Access the monster */
+ m_ptr = &m_list[i];
+
+ /* Ignore "dead" monsters */
+ if (!m_ptr->r_idx) continue;
+
+ r_ptr = &r_info[m_ptr->r_idx];
+
+ if(r_ptr->flags1 & RF1_UNIQUE)
+ {
+ msg_format(_("%s. ", "%s. "),r_name + r_ptr->name);
+ }
+ }
+ break;
+ }
+
+ case ACT_ESCAPE:
+ {
+ switch (randint1(13))
+ {
+ case 1: case 2: case 3: case 4: case 5:
+ teleport_player(10, 0L);
+ break;
+ case 6: case 7: case 8: case 9: case 10:
+ teleport_player(222, 0L);
+ break;
+ case 11: case 12:
+ (void)stair_creation();
+ break;
+ default:
+ if (get_check(_("この階を去りますか?", "Leave this level? ")))
+ {
+ if (autosave_l) do_cmd_save_game(TRUE);
+
+ /* Leaving */
+ p_ptr->leaving = TRUE;
+ }
+ }
+ break;
+ }
+
+ case ACT_DISP_CURSE_XTRA:
+ {
+ msg_format(_("%sが真実を照らし出す...", "The %s exhibits the truth..."), name);
+ if (remove_all_curse())
+ {
+ msg_print(_("誰かに見守られているような気がする。", "You feel as if someone is watching over you."));
+ }
+ (void)probing();
+ break;
+ }
+
+ case ACT_BRAND_FIRE_BOLTS:
+ {
+ msg_format(_("%sが深紅に輝いた...", "Your %s glows deep red..."), name);
+ (void)brand_bolts();
+ break;
+ }
+
+ case ACT_RECHARGE_XTRA:
+ {
+ msg_format(_("%sが白く輝いた...", "The %s gleams with blinding light..."), name);
+ if (!recharge(1000)) return FALSE;
+ break;
+ }
+
+ case ACT_LORE:
+ {
+ msg_print(_("石が隠された秘密を写し出した...", "The stone reveals hidden mysteries..."));
+ if (!ident_spell(FALSE)) return FALSE;
+
+ if (mp_ptr->spell_book)
+ {
+ /* Sufficient mana */
+ if (20 <= p_ptr->csp)
+ {
+ /* Use some mana */
+ p_ptr->csp -= 20;
+ }
+
+ /* Over-exert the player */
+ else
+ {
+ int oops = 20 - p_ptr->csp;
+
+ /* No mana left */
+ p_ptr->csp = 0;
+ p_ptr->csp_frac = 0;
+
+ /* Message */
+ msg_print(_("石を制御できない!", "You are too weak to control the stone!"));
+ /* Hack -- Bypass free action */
+ (void)set_paralyzed(p_ptr->paralyzed +
+ randint1(5 * oops + 1));
+
+ /* Confusing. */
+ (void)set_confused(p_ptr->confused +
+ randint1(5 * oops + 1));
+ }
+
+ /* Redraw mana */
+ p_ptr->redraw |= (PR_MANA);
+ }
+ take_hit(DAMAGE_LOSELIFE, damroll(1, 12), _("危険な秘密", "perilous secrets"), -1);
+ /* Confusing. */
+ if (one_in_(5)) (void)set_confused(p_ptr->confused +
+ randint1(10));
+
+ /* Exercise a little care... */
+ if (one_in_(20))
+ take_hit(DAMAGE_LOSELIFE, damroll(4, 10), _("危険な秘密", "perilous secrets"), -1);
+ break;
+ }
+
+ case ACT_SHIKOFUMI:
+ {
+ msg_print(_("力強く四股を踏んだ。", "You stamp. (as if you are in a ring.)"));
+ (void)set_afraid(0);
+ (void)set_hero(randint1(20) + 20, FALSE);
+ dispel_evil(p_ptr->lev * 3);
+ break;
+ }
+
+ case ACT_PHASE_DOOR:
+ {
+ teleport_player(10, 0L);
+ break;
+ }
+
+ case ACT_DETECT_ALL_MONS:
+ {
+ (void)detect_monsters_invis(255);
+ (void)detect_monsters_normal(255);
+ break;
+ }
+
+ case ACT_ULTIMATE_RESIST:
+ {
+ int v = randint1(25)+25;
+ (void)set_afraid(0);
+ (void)set_hero(v, FALSE);
+ (void)hp_player(10);
+ (void)set_blessed(v, FALSE);
+ (void)set_oppose_acid(v, FALSE);
+ (void)set_oppose_elec(v, FALSE);
+ (void)set_oppose_fire(v, FALSE);
+ (void)set_oppose_cold(v, FALSE);
+ (void)set_oppose_pois(v, FALSE);
+ (void)set_ultimate_res(v, FALSE);
+ break;
+ }
+
+
+ /* Unique activation */
+ case ACT_CAST_OFF:
+ {
+ int inv, o_idx, t;
+ char o_name[MAX_NLEN];
+ object_type forge;
+
+ /* Cast off activated item */
+ for (inv = INVEN_RARM; inv <= INVEN_FEET; inv++)
+ {
+ if (o_ptr == &inventory[inv]) break;
+ }
+
+ /* Paranoia */
+ if (inv > INVEN_FEET) return FALSE;
+
+ object_copy(&forge, o_ptr);
+ inven_item_increase(inv, (0 - o_ptr->number));
+ inven_item_optimize(inv);
+ o_idx = drop_near(&forge, 0, p_ptr->y, p_ptr->x);
+ o_ptr = &o_list[o_idx];
+
+ object_desc(o_name, o_ptr, OD_NAME_ONLY);
+ msg_format(_("%sを脱ぎ捨てた。", "You cast off %s."), o_name);
+
+ /* Get effects */
+ msg_print(_("「燃え上がれ俺の小宇宙!」", "You say, 'Burn up my cosmo!"));
+ t = 20 + randint1(20);
+ (void)set_blind(p_ptr->blind + t);
+ (void)set_afraid(0);
+ (void)set_tim_esp(p_ptr->tim_esp + t, FALSE);
+ (void)set_tim_regen(p_ptr->tim_regen + t, FALSE);
+ (void)set_hero(p_ptr->hero + t, FALSE);
+ (void)set_blessed(p_ptr->blessed + t, FALSE);
+ (void)set_fast(p_ptr->fast + t, FALSE);
+ (void)set_shero(p_ptr->shero + t, FALSE);
+ if (p_ptr->pclass == CLASS_FORCETRAINER)
+ {
+ p_ptr->magic_num1[0] = plev * 5 + 190;
+ msg_print(_("気が爆発寸前になった。", "Your force are immediatly before explosion."));
+ }
+
+ break;
+ }
+
+ case ACT_FALLING_STAR:
+ {
+ msg_print(_("あなたは妖刀に魅入られた…", "You are enchanted by cursed blade..."));
+ msg_print(_("「狂ほしく 血のごとき 月はのぼれり 秘めおきし 魔剣 いずこぞや」", "'Behold the blade arts.'"));
+ massacre();
+ break;
+ }
+
+ case ACT_GRAND_CROSS:
+ {
+ msg_print(_("「闇に還れ!」", "You say, 'Return to darkness!'"));
+ project(0, 8, p_ptr->y, p_ptr->x, (randint1(100) + 200) * 2, GF_HOLY_FIRE, PROJECT_KILL | PROJECT_ITEM | PROJECT_GRID, -1);
+ break;
+ }
+
+ case ACT_TELEPORT_LEVEL:
+ {
+ if (!get_check(_("本当に他の階にテレポートしますか?", "Are you sure? (Teleport Level)"))) return FALSE;
+ teleport_level(0);
+ break;
+ }
+
+ case ACT_STRAIN_HASTE:
+ {
+ int t;
+ msg_format(_("%sはあなたの体力を奪った...", "The %s drains your vitality..."), name);
+ take_hit(DAMAGE_LOSELIFE, damroll(3, 8), _("加速した疲労", "the strain of haste"), -1);
+ t = 25 + randint1(25);
+ (void)set_fast(p_ptr->fast + t, FALSE);
+ break;
+ }
+
+ case ACT_FISHING:
+ {
+ int x, y;
+
+ if (!get_rep_dir2(&dir)) return FALSE;
+ y = p_ptr->y+ddy[dir];
+ x = p_ptr->x+ddx[dir];
+ tsuri_dir = dir;
+ if (!cave_have_flag_bold(y, x, FF_WATER))
+ {
+ msg_print(_("そこは水辺ではない。", "There is no fishing place."));
+ return FALSE;
+ }
+ else if (cave[y][x].m_idx)
+ {
+ char m_name[80];
+ monster_desc(m_name, &m_list[cave[y][x].m_idx], 0);
+ msg_format(_("%sが邪魔だ!", "%^s is stand in your way."), m_name);
+ p_ptr->energy_use = 0;
+ return FALSE;
+ }
+ set_action(ACTION_FISH);
+ p_ptr->redraw |= (PR_STATE);
+ break;
+ }
+
+ case ACT_INROU:
+ {
+ int count = 0, i;
+ monster_type *m_ptr;
+ cptr kakusan = "";
+
+ if (summon_named_creature(0, p_ptr->y, p_ptr->x, MON_SUKE, PM_FORCE_PET))
+ {
+ msg_print(_("『助さん』が現れた。", "Suke-san apperars."));
+ kakusan = "Suke-san";
+ count++;
+ }
+ if (summon_named_creature(0, p_ptr->y, p_ptr->x, MON_KAKU, PM_FORCE_PET))
+ {
+ msg_print(_("『格さん』が現れた。", "Kaku-san appears."));
+ kakusan = "Kaku-san";
+ count++;
+ }
+ if (!count)
+ {
+ for (i = m_max - 1; i > 0; i--)
+ {
+ m_ptr = &m_list[i];
+ if (!m_ptr->r_idx) continue;
+ if (!((m_ptr->r_idx == MON_SUKE) || (m_ptr->r_idx == MON_KAKU))) continue;
+ if (!los(m_ptr->fy, m_ptr->fx, p_ptr->y, p_ptr->x)) continue;
+ if (!projectable(m_ptr->fy, m_ptr->fx, p_ptr->y, p_ptr->x)) continue;
+ count++;
+ break;
+ }
+ }
+
+ if (count)
+ {
+ msg_format(_("「者ども、ひかえおろう!!!このお方をどなたとこころえる。」",
+ "%^s says 'WHO do you think this person is! Bow your head, down your knees!'"), kakusan);
+ sukekaku = TRUE;
+ stun_monsters(120);
+ confuse_monsters(120);
+ turn_monsters(120);
+ stasis_monsters(120);
+ sukekaku = FALSE;
+ }
+ else
+ {
+ msg_print(_("しかし、何も起きなかった。", "Nothing happen."));
+ }
+ break;
+ }
+
+ case ACT_MURAMASA:
+ {
+ /* Only for Muramasa */
+ if (o_ptr->name1 != ART_MURAMASA) return FALSE;
+ if (get_check(_("本当に使いますか?", "Are you sure?!")))
+ {
+ msg_print(_("村正が震えた...", "The Muramasa pulsates..."));
+ do_inc_stat(A_STR);
+ if (one_in_(2))
+ {
+ msg_print(_("村正は壊れた!", "The Muramasa is destroyed!"));
+ curse_weapon_object(TRUE, o_ptr);
+ }
+ }
+ break;
+ }
+
+ case ACT_BLOODY_MOON:
+ {
+ /* Only for Bloody Moon */
+ if (o_ptr->name1 != ART_BLOOD) return FALSE;
+ msg_print(_("鎌が明るく輝いた...", "Your scythe glows brightly!"));
+ get_bloody_moon_flags(o_ptr);
+ if (p_ptr->prace == RACE_ANDROID) calc_android_exp();
+ p_ptr->update |= (PU_BONUS | PU_HP);
+ break;
+ }
+
+ case ACT_CRIMSON:
+ {
+ int num = 1;
+ int i;
+ int flg = PROJECT_STOP | PROJECT_GRID | PROJECT_ITEM | PROJECT_KILL;
+ int tx, ty;
+
+ /* Only for Crimson */
+ if (o_ptr->name1 != ART_CRIMSON) return FALSE;
+
+ msg_print(_("せっかくだから『クリムゾン』をぶっぱなすぜ!", "I'll fire CRIMSON! SEKKAKUDAKARA!"));
+
+ if (!get_aim_dir(&dir)) return FALSE;
+
+ /* Use the given direction */
+ tx = p_ptr->x + 99 * ddx[dir];
+ ty = p_ptr->y + 99 * ddy[dir];
+
+ /* Hack -- Use an actual "target" */
+ if ((dir == 5) && target_okay())
+ {
+ tx = target_col;
+ ty = target_row;
+ }
+
+ if (p_ptr->pclass == CLASS_ARCHER)
+ {
+ /* Extra shot at level 10 */
+ if (p_ptr->lev >= 10) num++;
+
+ /* Extra shot at level 30 */
+ if (p_ptr->lev >= 30) num++;
+
+ /* Extra shot at level 45 */
+ if (p_ptr->lev >= 45) num++;
+ }
+
+ for (i = 0; i < num; i++)
+ project(0, p_ptr->lev/20+1, ty, tx, p_ptr->lev*p_ptr->lev*6/50, GF_ROCKET, flg, -1);