OSDN Git Service

[WIP] [Refactor] #39963 Separated spells2.h from spells1.h
[hengband/hengband.git] / src / chest.c
index b05e9f0..45c4dd8 100644 (file)
@@ -1,7 +1,17 @@
-
-#include "angband.h"
+#include "angband.h"
+#include "util.h"
+#include "main/sound-definitions-table.h"
+
+#include "spell/spells-type.h"
 #include "spells-summon.h"
+#include "floor.h"
+#include "trap.h"
 #include "player-status.h"
+#include "player-damage.h"
+#include "player-class.h"
+#include "player-effects.h"
+#include "grid.h"
+#include "spell/spells2.h"
 
 /*!
 * @brief 箱からアイテムを引き出す /
 * Small chests often contain "gold", while Large chests always contain
 * items.  Wooden chests contain 2 items, Iron chests contain 4 items,
 * and Steel chests contain 6 items.  The "value" of the items in a
-* chest is based on the "power" of the chest, which is in current_world_ptr->game_turn based
+* chest is based on the "power" of the chest, which is in turn based
 * on the level on which the chest is generated.
 * </pre>
 */
-void chest_death(bool scatter, POSITION y, POSITION x, OBJECT_IDX o_idx)
+void chest_death(player_type *owner_ptr, bool scatter, POSITION y, POSITION x, OBJECT_IDX o_idx)
 {
        int number;
 
        bool small;
-       BIT_FLAGS mode = AM_GOOD;
+       BIT_FLAGS mode = AM_GOOD | AM_FORBID_CHEST;
 
        object_type forge;
        object_type *q_ptr;
 
-       object_type *o_ptr = &current_floor_ptr->o_list[o_idx];
-
+       floor_type *floor_ptr = owner_ptr->current_floor_ptr;
+       object_type *o_ptr = &floor_ptr->o_list[o_idx];
 
        /* Small chests often hold "gold" */
        small = (o_ptr->sval < SV_CHEST_MIN_LARGE);
@@ -46,19 +56,17 @@ void chest_death(bool scatter, POSITION y, POSITION x, OBJECT_IDX o_idx)
                number = 5;
                small = FALSE;
                mode |= AM_GREAT;
-               current_floor_ptr->object_level = o_ptr->xtra3;
+               floor_ptr->object_level = o_ptr->xtra3;
        }
        else
        {
                /* Determine the "value" of the items */
-               current_floor_ptr->object_level = ABS(o_ptr->pval) + 10;
+               floor_ptr->object_level = ABS(o_ptr->pval) + 10;
        }
 
        /* Zero pval means empty chest */
        if (!o_ptr->pval) number = 0;
 
-       /* Opening a chest */
-       opening_chest = TRUE;
 
        /* Drop some objects (non-chests) */
        for (; number > 0; --number)
@@ -70,14 +78,14 @@ void chest_death(bool scatter, POSITION y, POSITION x, OBJECT_IDX o_idx)
                if (small && (randint0(100) < 25))
                {
                        /* Make some gold */
-                       if (!make_gold(q_ptr)) continue;
+                       if (!make_gold(floor_ptr, q_ptr)) continue;
                }
 
                /* Otherwise drop an item */
                else
                {
                        /* Make a good object */
-                       if (!make_object(q_ptr, mode)) continue;
+                       if (!make_object(owner_ptr, q_ptr, mode)) continue;
                }
 
                /* If chest scatters its contents, pick any floor square. */
@@ -91,24 +99,21 @@ void chest_death(bool scatter, POSITION y, POSITION x, OBJECT_IDX o_idx)
                                x = randint0(MAX_WID);
 
                                /* Must be an empty floor. */
-                               if (!cave_empty_bold(y, x)) continue;
+                               if (!is_cave_empty_bold(owner_ptr, y, x)) continue;
 
                                /* Place the object there. */
-                               (void)drop_near(q_ptr, -1, y, x);
+                               (void)drop_near(owner_ptr, q_ptr, -1, y, x);
 
                                /* Done. */
                                break;
                        }
                }
                /* Normally, drop object near the chest. */
-               else (void)drop_near(q_ptr, -1, y, x);
+               else (void)drop_near(owner_ptr, q_ptr, -1, y, x);
        }
 
        /* Reset the object level */
-       current_floor_ptr->object_level = current_floor_ptr->base_level;
-
-       /* No longer opening a chest */
-       opening_chest = FALSE;
+       floor_ptr->object_level = floor_ptr->base_level;
 
        /* Empty */
        o_ptr->pval = 0;
@@ -131,11 +136,11 @@ void chest_death(bool scatter, POSITION y, POSITION x, OBJECT_IDX o_idx)
 * Note that the chest itself is never destroyed.
 * </pre>
 */
-void chest_trap(POSITION y, POSITION x, OBJECT_IDX o_idx)
+void chest_trap(player_type *target_ptr, POSITION y, POSITION x, OBJECT_IDX o_idx)
 {
        int i, trap;
 
-       object_type *o_ptr = &current_floor_ptr->o_list[o_idx];
+       object_type *o_ptr = &target_ptr->current_floor_ptr->o_list[o_idx];
 
        int mon_level = o_ptr->xtra3;
 
@@ -149,25 +154,25 @@ void chest_trap(POSITION y, POSITION x, OBJECT_IDX o_idx)
        if (trap & (CHEST_LOSE_STR))
        {
                msg_print(_("仕掛けられていた小さな針に刺されてしまった!", "A small needle has pricked you!"));
-               take_hit(DAMAGE_NOESCAPE, damroll(1, 4), _("毒針", "a poison needle"), -1);
-               (void)do_dec_stat(A_STR);
+               take_hit(target_ptr, DAMAGE_NOESCAPE, damroll(1, 4), _("毒針", "a poison needle"), -1);
+               (void)do_dec_stat(target_ptr, A_STR);
        }
 
        /* Lose constitution */
        if (trap & (CHEST_LOSE_CON))
        {
                msg_print(_("仕掛けられていた小さな針に刺されてしまった!", "A small needle has pricked you!"));
-               take_hit(DAMAGE_NOESCAPE, damroll(1, 4), _("毒針", "a poison needle"), -1);
-               (void)do_dec_stat(A_CON);
+               take_hit(target_ptr, DAMAGE_NOESCAPE, damroll(1, 4), _("毒針", "a poison needle"), -1);
+               (void)do_dec_stat(target_ptr, A_CON);
        }
 
        /* Poison */
        if (trap & (CHEST_POISON))
        {
                msg_print(_("突如吹き出した緑色のガスに包み込まれた!", "A puff of green gas surrounds you!"));
-               if (!(p_ptr->resist_pois || IS_OPPOSE_POIS()))
+               if (!(target_ptr->resist_pois || is_oppose_pois(target_ptr)))
                {
-                       (void)set_poisoned(p_ptr->poisoned + 10 + randint1(20));
+                       (void)set_poisoned(target_ptr, target_ptr->poisoned + 10 + randint1(20));
                }
        }
 
@@ -175,9 +180,9 @@ void chest_trap(POSITION y, POSITION x, OBJECT_IDX o_idx)
        if (trap & (CHEST_PARALYZE))
        {
                msg_print(_("突如吹き出した黄色いガスに包み込まれた!", "A puff of yellow gas surrounds you!"));
-               if (!p_ptr->free_act)
+               if (!target_ptr->free_act)
                {
-                       (void)set_paralyzed(p_ptr->paralyzed + 10 + randint1(20));
+                       (void)set_paralyzed(target_ptr, target_ptr->paralyzed + 10 + randint1(20));
                }
        }
 
@@ -188,10 +193,10 @@ void chest_trap(POSITION y, POSITION x, OBJECT_IDX o_idx)
                msg_print(_("突如吹き出した煙に包み込まれた!", "You are enveloped in a cloud of smoke!"));
                for (i = 0; i < num; i++)
                {
-                       if (randint1(100)<current_floor_ptr->dun_level)
-                               activate_hi_summon(p_ptr->y, p_ptr->x, FALSE);
+                       if (randint1(100)<target_ptr->current_floor_ptr->dun_level)
+                               activate_hi_summon(target_ptr, target_ptr->y, target_ptr->x, FALSE);
                        else
-                               (void)summon_specific(0, y, x, mon_level, 0, (PM_ALLOW_GROUP | PM_ALLOW_UNIQUE | PM_NO_PET), '\0');
+                               (void)summon_specific(target_ptr, 0, y, x, mon_level, 0, (PM_ALLOW_GROUP | PM_ALLOW_UNIQUE | PM_NO_PET));
                }
        }
 
@@ -201,7 +206,7 @@ void chest_trap(POSITION y, POSITION x, OBJECT_IDX o_idx)
                msg_print(_("宝を守るためにエレメンタルが現れた!", "Elemental beings appear to protect their treasures!"));
                for (i = 0; i < randint1(3) + 5; i++)
                {
-                       (void)summon_specific(0, y, x, mon_level, SUMMON_ELEMENTAL, (PM_ALLOW_GROUP | PM_ALLOW_UNIQUE | PM_NO_PET), '\0');
+                       (void)summon_specific(target_ptr, 0, y, x, mon_level, SUMMON_ELEMENTAL, (PM_ALLOW_GROUP | PM_ALLOW_UNIQUE | PM_NO_PET));
                }
        }
 
@@ -211,11 +216,11 @@ void chest_trap(POSITION y, POSITION x, OBJECT_IDX o_idx)
                msg_print(_("鳥の群れがあなたを取り巻いた!", "A storm of birds swirls around you!"));
 
                for (i = 0; i < randint1(3) + 3; i++)
-                       (void)fire_meteor(-1, GF_FORCE, y, x, o_ptr->pval / 5, 7);
+                       (void)fire_meteor(target_ptr, -1, GF_FORCE, y, x, o_ptr->pval / 5, 7);
 
                for (i = 0; i < randint1(5) + o_ptr->pval / 5; i++)
                {
-                       (void)summon_specific(0, y, x, mon_level, SUMMON_BIRD, (PM_ALLOW_GROUP | PM_ALLOW_UNIQUE | PM_NO_PET), '\0');
+                       (void)summon_specific(target_ptr, 0, y, x, mon_level, SUMMON_BIRD, (PM_ALLOW_GROUP | PM_ALLOW_UNIQUE | PM_NO_PET));
                }
        }
 
@@ -228,8 +233,8 @@ void chest_trap(POSITION y, POSITION x, OBJECT_IDX o_idx)
                        msg_print(_("炎と硫黄の雲の中に悪魔が姿を現した!", "Demons materialize in clouds of fire and brimstone!"));
                        for (i = 0; i < randint1(3) + 2; i++)
                        {
-                               (void)fire_meteor(-1, GF_FIRE, y, x, 10, 5);
-                               (void)summon_specific(0, y, x, mon_level, SUMMON_DEMON, (PM_ALLOW_GROUP | PM_ALLOW_UNIQUE | PM_NO_PET), '\0');
+                               (void)fire_meteor(target_ptr, -1, GF_FIRE, y, x, 10, 5);
+                               (void)summon_specific(target_ptr, 0, y, x, mon_level, SUMMON_DEMON, (PM_ALLOW_GROUP | PM_ALLOW_UNIQUE | PM_NO_PET));
                        }
                }
 
@@ -239,7 +244,7 @@ void chest_trap(POSITION y, POSITION x, OBJECT_IDX o_idx)
                        msg_print(_("暗闇にドラゴンの影がぼんやりと現れた!", "Draconic forms loom out of the darkness!"));
                        for (i = 0; i < randint1(3) + 2; i++)
                        {
-                               (void)summon_specific(0, y, x, mon_level, SUMMON_DRAGON, (PM_ALLOW_GROUP | PM_ALLOW_UNIQUE | PM_NO_PET), '\0');
+                               (void)summon_specific(target_ptr, 0, y, x, mon_level, SUMMON_DRAGON, (PM_ALLOW_GROUP | PM_ALLOW_UNIQUE | PM_NO_PET));
                        }
                }
 
@@ -249,7 +254,7 @@ void chest_trap(POSITION y, POSITION x, OBJECT_IDX o_idx)
                        msg_print(_("奇妙な姿の怪物が襲って来た!", "Creatures strange and twisted assault you!"));
                        for (i = 0; i < randint1(5) + 3; i++)
                        {
-                               (void)summon_specific(0, y, x, mon_level, SUMMON_HYBRID, (PM_ALLOW_GROUP | PM_ALLOW_UNIQUE | PM_NO_PET), '\0');
+                               (void)summon_specific(target_ptr, 0, y, x, mon_level, SUMMON_HYBRID, (PM_ALLOW_GROUP | PM_ALLOW_UNIQUE | PM_NO_PET));
                        }
                }
 
@@ -259,7 +264,7 @@ void chest_trap(POSITION y, POSITION x, OBJECT_IDX o_idx)
                        msg_print(_("渦巻が合体し、破裂した!", "Vortices coalesce and wreak destruction!"));
                        for (i = 0; i < randint1(3) + 2; i++)
                        {
-                               (void)summon_specific(0, y, x, mon_level, SUMMON_VORTEX, (PM_ALLOW_GROUP | PM_ALLOW_UNIQUE | PM_NO_PET), '\0');
+                               (void)summon_specific(target_ptr, 0, y, x, mon_level, SUMMON_VORTEX, (PM_ALLOW_GROUP | PM_ALLOW_UNIQUE | PM_NO_PET));
                        }
                }
        }
@@ -275,30 +280,30 @@ void chest_trap(POSITION y, POSITION x, OBJECT_IDX o_idx)
                for (; nasty_tricks_count > 0; nasty_tricks_count--)
                {
                        /* ...but a high saving throw does help a little. */
-                       if (randint1(100 + o_ptr->pval * 2) > p_ptr->skill_sav)
+                       if (randint1(100 + o_ptr->pval * 2) > target_ptr->skill_sav)
                        {
-                               if (one_in_(6)) take_hit(DAMAGE_NOESCAPE, damroll(5, 20), _("破滅のトラップの宝箱", "a chest dispel-player trap"), -1);
-                               else if (one_in_(5)) (void)set_cut(p_ptr->cut + 200);
+                               if (one_in_(6)) take_hit(target_ptr, DAMAGE_NOESCAPE, damroll(5, 20), _("破滅のトラップの宝箱", "a chest dispel-player trap"), -1);
+                               else if (one_in_(5)) (void)set_cut(target_ptr,target_ptr->cut + 200);
                                else if (one_in_(4))
                                {
-                                       if (!p_ptr->free_act)
-                                               (void)set_paralyzed(p_ptr->paralyzed + 2 +
+                                       if (!target_ptr->free_act)
+                                               (void)set_paralyzed(target_ptr, target_ptr->paralyzed + 2 +
                                                        randint0(6));
                                        else
-                                               (void)set_stun(p_ptr->stun + 10 +
+                                               (void)set_stun(target_ptr, target_ptr->stun + 10 +
                                                        randint0(100));
                                }
-                               else if (one_in_(3)) apply_disenchant(0);
+                               else if (one_in_(3)) apply_disenchant(target_ptr, 0);
                                else if (one_in_(2))
                                {
-                                       (void)do_dec_stat(A_STR);
-                                       (void)do_dec_stat(A_DEX);
-                                       (void)do_dec_stat(A_CON);
-                                       (void)do_dec_stat(A_INT);
-                                       (void)do_dec_stat(A_WIS);
-                                       (void)do_dec_stat(A_CHR);
+                                       (void)do_dec_stat(target_ptr, A_STR);
+                                       (void)do_dec_stat(target_ptr, A_DEX);
+                                       (void)do_dec_stat(target_ptr, A_CON);
+                                       (void)do_dec_stat(target_ptr, A_INT);
+                                       (void)do_dec_stat(target_ptr, A_WIS);
+                                       (void)do_dec_stat(target_ptr, A_CHR);
                                }
-                               else (void)fire_meteor(-1, GF_NETHER, y, x, 150, 1);
+                               else (void)fire_meteor(target_ptr, -1, GF_NETHER, y, x, 150, 1);
                        }
                }
        }
@@ -307,7 +312,7 @@ void chest_trap(POSITION y, POSITION x, OBJECT_IDX o_idx)
        if (trap & (CHEST_ALARM))
        {
                msg_print(_("けたたましい音が鳴り響いた!", "An alarm sounds!"));
-               aggravate_monsters(0);
+               aggravate_monsters(target_ptr, 0);
        }
 
        /* Explode */
@@ -317,13 +322,13 @@ void chest_trap(POSITION y, POSITION x, OBJECT_IDX o_idx)
                msg_print(_("箱の中の物はすべて粉々に砕け散った!", "Everything inside the chest is destroyed!"));
                o_ptr->pval = 0;
                sound(SOUND_EXPLODE);
-               take_hit(DAMAGE_ATTACK, damroll(5, 8), _("爆発する箱", "an exploding chest"), -1);
+               take_hit(target_ptr, DAMAGE_ATTACK, damroll(5, 8), _("爆発する箱", "an exploding chest"), -1);
        }
        /* Scatter contents. */
        if ((trap & (CHEST_SCATTER)) && o_ptr->k_idx)
        {
                msg_print(_("宝箱の中身はダンジョンじゅうに散乱した!", "The contents of the chest scatter all over the dungeon!"));
-               chest_death(TRUE, y, x, o_idx);
+               chest_death(target_ptr, TRUE, y, x, o_idx);
                o_ptr->pval = 0;
        }
 }