OSDN Git Service

[Refactor] #37353 monster1~monster-hook間整理。 / Refactor between monster1 and monster...
[hengband/hengband.git] / src / cmd-activate.c
index 74faefa..46a236e 100644 (file)
@@ -9,6 +9,7 @@
 #include "angband.h"
 #include "cmd-activate.h"
 #include "object-hook.h"
+#include "spells-summon.h"
 
 /*!
 * @brief ペット入りモンスターボールをソートするための比較関数
@@ -63,9 +64,11 @@ static bool ang_sort_comp_pet(vptr u, vptr v, int a, int b)
  * the user hits "escape" at the "direction" prompt.
  * </pre>
  */
-void do_cmd_activate_aux(int item)
+void do_cmd_activate_aux(INVENTORY_IDX item)
 {
-       int         dir, lev, chance, fail;
+       DIRECTION dir;
+       DEPTH lev;
+       int chance, fail;
        object_type *o_ptr;
        bool success;
 
@@ -82,7 +85,6 @@ void do_cmd_activate_aux(int item)
                o_ptr = &o_list[0 - item];
        }
 
-       /* Take a turn */
        p_ptr->energy_use = 100;
 
        /* Extract the item level */
@@ -159,7 +161,6 @@ void do_cmd_activate_aux(int item)
        /* Activate the artifact */
        msg_print(_("始動させた...", "You activate it..."));
 
-       /* Sound */
        sound(SOUND_ZAP);
 
        /* Activate object */
@@ -167,7 +168,6 @@ void do_cmd_activate_aux(int item)
        {
                (void)activate_artifact(o_ptr);
 
-               /* Window stuff */
                p_ptr->window |= (PW_INVEN | PW_EQUIP);
 
                /* Success */
@@ -180,14 +180,6 @@ void do_cmd_activate_aux(int item)
                if (music_singing_any()) stop_singing();
                if (hex_spelling_any()) stop_hex_spell_all();
 
-#if 0
-               if (object_is_cursed(o_ptr))
-               {
-                       msg_print(_("カン高い音が響き渡った。", "You produce a shrill whistling sound."));
-                       aggravate_monsters(0);
-               }
-               else
-#endif
                {
                        IDX pet_ctr, i;
                        IDX *who;
@@ -220,7 +212,7 @@ void do_cmd_activate_aux(int item)
                        /* Free the "who" array */
                        C_KILL(who, max_m_idx, IDX);
                }
-               o_ptr->timeout = 100+randint1(100);
+               o_ptr->timeout = 100 + randint1(100);
                return;
        }
        else if (o_ptr->tval == TV_CAPTURE)
@@ -284,7 +276,7 @@ void do_cmd_activate_aux(int item)
                else
                {
                        success = FALSE;
-                       if (!get_rep_dir2(&dir)) return;
+                       if (!get_direction(&dir, FALSE, FALSE)) return;
                        if (monster_can_enter(p_ptr->y + ddy[dir], p_ptr->x + ddx[dir], &r_info[o_ptr->pval], 0))
                        {
                                if (place_monster_aux(0, p_ptr->y + ddy[dir], p_ptr->x + ddx[dir], o_ptr->pval, (PM_FORCE_PET | PM_NO_KAGE)))
@@ -372,8 +364,7 @@ void do_cmd_activate_aux(int item)
 void do_cmd_activate(void)
 {
        OBJECT_IDX item;
-       cptr    q, s;
-
+       cptr q, s;
 
        if (p_ptr->special_defense & (KATA_MUSOU | KATA_KOUKIJIN))
        {
@@ -381,10 +372,8 @@ void do_cmd_activate(void)
        }
 
        item_tester_no_ryoute = TRUE;
-       /* Prepare the hook */
        item_tester_hook = item_tester_hook_activate;
 
-       /* Get an item */
        q = _("どのアイテムを始動させますか? ", "Activate which item? ");
        s = _("始動できるアイテムを装備していない。", "You have nothing to activate.");
 
@@ -402,10 +391,11 @@ void do_cmd_activate(void)
 */
 static bool activate_dragon_breath(object_type *o_ptr)
 {
-       u32b flgs[TR_FLAG_SIZE]; /* for resistance flags */
+       BIT_FLAGS flgs[TR_FLAG_SIZE]; /* for resistance flags */
        int type[20];
        cptr name[20];
-       int i, dir, t, n = 0;
+       int i, t, n = 0;
+       DIRECTION dir;
 
        if (!get_aim_dir(&dir)) return FALSE;
 
@@ -639,25 +629,7 @@ bool activate_artifact(object_type *o_ptr)
 
        case ACT_WHIRLWIND:
        {
-               {
-                       int y = 0, x = 0;
-                       cave_type       *c_ptr;
-                       monster_type    *m_ptr;
-
-                       for (dir = 0; dir <= 9; dir++)
-                       {
-                               y = p_ptr->y + ddy[dir];
-                               x = p_ptr->x + ddx[dir];
-                               c_ptr = &cave[y][x];
-
-                               /* Get the monster */
-                               m_ptr = &m_list[c_ptr->m_idx];
-
-                               /* Hack -- attack monsters */
-                               if (c_ptr->m_idx && (m_ptr->ml || cave_have_flag_bold(y, x, FF_PROJECT)))
-                                       py_attack(y, x, 0);
-                       }
-               }
+               massacre();
                break;
        }
 
@@ -778,9 +750,7 @@ bool activate_artifact(object_type *o_ptr)
                        while (attempts--)
                        {
                                scatter(&y, &x, p_ptr->y, p_ptr->x, 4, 0);
-
                                if (!cave_have_flag_bold(y, x, FF_PROJECT)) continue;
-
                                if (!player_bold(y, x)) break;
                        }
 
@@ -819,6 +789,7 @@ bool activate_artifact(object_type *o_ptr)
                }
                break;
        }
+
        case ACT_BR_COLD:
        {
                if (!get_aim_dir(&dir)) return FALSE;
@@ -829,6 +800,7 @@ bool activate_artifact(object_type *o_ptr)
                }
                break;
        }
+
        case ACT_BR_DRAGON:
        {
                if (!activate_dragon_breath(o_ptr)) return FALSE;
@@ -836,7 +808,6 @@ bool activate_artifact(object_type *o_ptr)
        }
 
        /* Activate for other offensive action */
-
        case ACT_CONFUSE:
        {
                msg_print(_("様々な色の火花を発している...", "It glows in scintillating colours..."));
@@ -989,22 +960,7 @@ bool activate_artifact(object_type *o_ptr)
 
        case ACT_SUMMON_DEMON:
        {
-               bool pet = one_in_(3);
-               BIT_FLAGS mode = 0L;
-
-               if (!(pet && (plev < 50))) mode |= PM_ALLOW_GROUP;
-               if (pet) mode |= PM_FORCE_PET;
-               else mode |= PM_NO_PET;
-
-               if (summon_specific((pet ? -1 : 0), p_ptr->y, p_ptr->x, ((plev * 3) / 2), SUMMON_DEMON, mode))
-               {
-                       msg_print(_("硫黄の悪臭が充満した。", "The area fills with a stench of sulphur and brimstone."));
-                       if (pet)
-                               msg_print(_("「ご用でございますか、ご主人様」", "'What is thy bidding... Master?'"));
-                       else
-                               msg_print(_("「NON SERVIAM! Wretch! お前の魂を頂くぞ!」", "'NON SERVIAM! Wretch! I shall feast on thy mortal soul!'"));
-               }
-
+               cast_summon_demon((plev * 3) / 2);
                break;
        }
 
@@ -1085,14 +1041,8 @@ bool activate_artifact(object_type *o_ptr)
        case ACT_CHOIR_SINGS:
        {
                msg_print(_("天国の歌が聞こえる...", "A heavenly choir sings..."));
-               (void)set_poisoned(0);
-               (void)set_cut(0);
-               (void)set_stun(0);
-               (void)set_confused(0);
-               (void)set_blind(0);
-               (void)set_afraid(0);
+               (void)cure_critical_wounds(777);
                (void)set_hero(randint1(25) + 25, FALSE);
-               (void)hp_player(777);
                break;
        }
 
@@ -1128,12 +1078,7 @@ bool activate_artifact(object_type *o_ptr)
        case ACT_REST_ALL:
        {
                msg_print(_("濃緑色に輝いている...", "It glows a deep green..."));
-               (void)do_res_stat(A_STR);
-               (void)do_res_stat(A_INT);
-               (void)do_res_stat(A_WIS);
-               (void)do_res_stat(A_DEX);
-               (void)do_res_stat(A_CON);
-               (void)do_res_stat(A_CHR);
+               (void)restore_all_status();
                (void)restore_level();
                break;
        }
@@ -1142,8 +1087,7 @@ bool activate_artifact(object_type *o_ptr)
        {
                msg_print(_("深青色に輝いている...", "It glows deep blue..."));
                msg_print(_("体内に暖かい鼓動が感じられる...", "You feel a warm tingling inside..."));
-               (void)hp_player(700);
-               (void)set_cut(0);
+               (void)cure_critical_wounds(700);
                break;
        }
 
@@ -1151,53 +1095,21 @@ bool activate_artifact(object_type *o_ptr)
        {
                msg_print(_("白く明るく輝いている...", "It glows a bright white..."));
                msg_print(_("ひじょうに気分がよい...", "You feel much better..."));
-               (void)hp_player(1000);
-               (void)set_cut(0);
+               (void)cure_critical_wounds(1000);
                break;
        }
 
        case ACT_CURING:
        {
                msg_format(_("%sの優しさに癒される...", "the %s cures you affectionately ..."), name);
-               (void)set_poisoned(0);
-               (void)set_confused(0);
-               (void)set_blind(0);
-               (void)set_stun(0);
-               (void)set_cut(0);
-               (void)set_image(0);
-
+               true_healing(0);
                break;
        }
 
        case ACT_CURE_MANA_FULL:
        {
                msg_format(_("%sが青白く光った...", "The %s glows pale..."), name);
-               if (p_ptr->pclass == CLASS_MAGIC_EATER)
-               {
-                       int i;
-                       for (i = 0; i < EATER_EXT * 2; i++)
-                       {
-                               p_ptr->magic_num1[i] += (p_ptr->magic_num2[i] < 10) ? EATER_CHARGE * 3 : p_ptr->magic_num2[i] * EATER_CHARGE / 3;
-                               if (p_ptr->magic_num1[i] > p_ptr->magic_num2[i] * EATER_CHARGE) p_ptr->magic_num1[i] = p_ptr->magic_num2[i] * EATER_CHARGE;
-                       }
-                       for (; i < EATER_EXT * 3; i++)
-                       {
-                               KIND_OBJECT_IDX k_idx = lookup_kind(TV_ROD, i - EATER_EXT * 2);
-                               p_ptr->magic_num1[i] -= ((p_ptr->magic_num2[i] < 10) ? EATER_ROD_CHARGE * 3 : p_ptr->magic_num2[i] * EATER_ROD_CHARGE / 3)*k_info[k_idx].pval;
-                               if (p_ptr->magic_num1[i] < 0) p_ptr->magic_num1[i] = 0;
-                       }
-                       msg_print(_("頭がハッキリとした。", "You feel your head clear."));
-                       p_ptr->window |= (PW_PLAYER);
-               }
-               else if (p_ptr->csp < p_ptr->msp)
-               {
-                       p_ptr->csp = p_ptr->msp;
-                       p_ptr->csp_frac = 0;
-                       msg_print(_("頭がハッキリとした。", "You feel your head clear."));
-                       p_ptr->redraw |= (PR_MANA);
-                       p_ptr->window |= (PW_PLAYER);
-                       p_ptr->window |= (PW_SPELL);
-               }
+               restore_mana(TRUE);
                break;
        }
 
@@ -1211,12 +1123,7 @@ bool activate_artifact(object_type *o_ptr)
 
        case ACT_BERSERK:
        {
-               (void)set_afraid(0);
-               (void)set_shero(randint1(25) + 25, FALSE);
-               /* (void)set_afraid(0);
-               (void)set_hero(randint1(50) + 50, FALSE);
-               (void)set_blessed(randint1(50) + 50, FALSE);
-               o_ptr->timeout = 100 + randint1(100); */
+               (void)berserk(randint1(25) + 25);
                break;
        }
 
@@ -1533,10 +1440,7 @@ bool activate_artifact(object_type *o_ptr)
        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)remove_all_curse();
                (void)probing();
                break;
        }
@@ -1578,15 +1482,12 @@ bool activate_artifact(object_type *o_ptr)
                                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));
+                               (void)set_paralyzed(p_ptr->paralyzed + randint1(5 * oops + 1));
 
                                /* Confusing. */
-                               (void)set_confused(p_ptr->confused +
-                                       randint1(5 * oops + 1));
+                               (void)set_confused(p_ptr->confused + randint1(5 * oops + 1));
                        }
 
                        /* Redraw mana */
@@ -1594,12 +1495,10 @@ bool activate_artifact(object_type *o_ptr)
                }
                take_hit(DAMAGE_LOSELIFE, damroll(1, 12), _("危険な秘密", "perilous secrets"), -1);
                /* Confusing. */
-               if (one_in_(5)) (void)set_confused(p_ptr->confused +
-                       randint1(10));
+               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);
+               if (one_in_(20)) take_hit(DAMAGE_LOSELIFE, damroll(4, 10), _("危険な秘密", "perilous secrets"), -1);
                break;
        }
 
@@ -1645,7 +1544,8 @@ bool activate_artifact(object_type *o_ptr)
        /* Unique activation */
        case ACT_CAST_OFF:
        {
-               int inv, t;
+               INVENTORY_IDX inv;
+               int t;
                OBJECT_IDX o_idx;
                char o_name[MAX_NLEN];
                object_type forge;
@@ -1722,12 +1622,12 @@ bool activate_artifact(object_type *o_ptr)
 
        case ACT_FISHING:
        {
-               int x, y;
+               POSITION x, y;
 
-               if (!get_rep_dir2(&dir)) return FALSE;
+               if (!get_direction(&dir, FALSE, FALSE)) return FALSE;
                y = p_ptr->y + ddy[dir];
                x = p_ptr->x + ddx[dir];
-               tsuri_dir = dir;
+               p_ptr->fishing_dir = dir;
                if (!cave_have_flag_bold(y, x, FF_WATER))
                {
                        msg_print(_("そこは水辺ではない。", "There is no fishing place."));