OSDN Git Service

summon_specific() や、place_monster()等の仕様変更。
authormogami <mogami@0568b783-4c39-0410-ac80-bf13821ea2a2>
Fri, 17 May 2002 14:47:06 +0000 (14:47 +0000)
committermogami <mogami@0568b783-4c39-0410-ac80-bf13821ea2a2>
Fri, 17 May 2002 14:47:06 +0000 (14:47 +0000)
u32b mode という変数一つで全部のフラグを表現するようにした。

25 files changed:
src/artifact.c
src/cmd1.c
src/cmd2.c
src/cmd5.c
src/cmd6.c
src/defines.h
src/dungeon.c
src/externs.h
src/generate.c
src/grid.c
src/init1.c
src/mane.c
src/melee2.c
src/mind.c
src/monster2.c
src/mspells1.c
src/mspells2.c
src/mspells3.c
src/mutation.c
src/rooms.c
src/spells1.c
src/spells2.c
src/spells3.c
src/wizard2.c
src/xtra2.c

index 1fba65a..e4d7f7b 100644 (file)
@@ -2356,7 +2356,7 @@ bool activate_random_artifact(object_type * o_ptr)
 
                case ACT_SUMMON_ANIMAL:
                {
-                       (void)summon_specific(-1, py, px, plev, SUMMON_ANIMAL_RANGER, TRUE, TRUE, TRUE, FALSE, FALSE);
+                       (void)summon_specific(-1, py, px, plev, SUMMON_ANIMAL_RANGER, (PM_ALLOW_GROUP | PM_FORCE_PET));
                        o_ptr->timeout = 200 + randint1(300);
                        break;
                }
@@ -2369,7 +2369,7 @@ bool activate_random_artifact(object_type * o_ptr)
                        msg_print("You summon a phantasmal servant.");
 #endif
 
-                       (void)summon_specific(-1, py, px, dun_level, SUMMON_PHANTOM, TRUE, TRUE, TRUE, FALSE, FALSE);
+                       (void)summon_specific(-1, py, px, dun_level, SUMMON_PHANTOM, (PM_ALLOW_GROUP | PM_FORCE_PET));
                        o_ptr->timeout = 200 + randint1(200);
                        break;
                }
@@ -2377,9 +2377,13 @@ bool activate_random_artifact(object_type * o_ptr)
                case ACT_SUMMON_ELEMENTAL:
                {
                        bool pet = one_in_(3);
-                       bool group = !(pet && (plev < 50));
+                       u32b mode = 0L;
 
-                       if (summon_specific((pet ? -1 : 0), py, px, ((plev * 3) / 2), SUMMON_ELEMENTAL, group, FALSE, pet, FALSE, (bool)(!pet)))
+                       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), py, px, ((plev * 3) / 2), SUMMON_ELEMENTAL, mode))
                        {
 #ifdef JP
                                msg_print("¥¨¥ì¥á¥ó¥¿¥ë¤¬¸½¤ì¤¿...");
@@ -2411,9 +2415,13 @@ bool activate_random_artifact(object_type * o_ptr)
                case ACT_SUMMON_DEMON:
                {
                        bool pet = one_in_(3);
-                       bool group = !(pet && (plev < 50));
+                       u32b 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), py, px, ((plev * 3) / 2), SUMMON_DEMON, group, FALSE, pet, FALSE, (bool)(!pet)))
+                       if (summon_specific((pet ? -1 : 0), py, px, ((plev * 3) / 2), SUMMON_DEMON, mode))
                        {
 #ifdef JP
                                msg_print("ⲫ¤Î°­½­¤¬½¼Ëþ¤·¤¿¡£");
@@ -2444,24 +2452,16 @@ bool activate_random_artifact(object_type * o_ptr)
                case ACT_SUMMON_UNDEAD:
                {
                        bool pet = one_in_(3);
-                       bool group;
-                       bool unique_okay;
                        int type;
+                       u32b mode = 0L;
 
                        type = (plev > 47 ? SUMMON_HI_UNDEAD : SUMMON_UNDEAD);
-                       if (pet)
-                       {
-                               group = (((plev > 24) && one_in_(3)) ? TRUE : FALSE);
-                               unique_okay = FALSE;
-                       }
-                       else
-                       {
-                               group = TRUE;
-                               unique_okay = TRUE;
-                       }
 
-                       if (summon_specific((pet ? -1 : 0), py, px, ((plev * 3) / 2), type,
-                                           group, FALSE, pet, unique_okay, (bool)(!pet)))
+                       if (!pet || ((plev > 24) && one_in_(3))) mode |= PM_ALLOW_GROUP;
+                       if (pet) mode |= PM_FORCE_PET;
+                       else mode |= (PM_ALLOW_UNIQUE | PM_NO_PET);
+
+                       if (summon_specific((pet ? -1 : 0), py, px, ((plev * 3) / 2), type, mode))
                        {
 #ifdef JP
                                msg_print("Î䤿¤¤É÷¤¬¤¢¤Ê¤¿¤Î¼þ¤ê¤Ë¿á¤­»Ï¤á¤¿¡£¤½¤ì¤ÏÉåÇÔ½­¤ò±¿¤ó¤Ç¤¤¤ë...");
index 288541c..646ecc8 100644 (file)
@@ -1208,7 +1208,7 @@ static void hit_trap(bool break_trap)
                        num = 2 + randint1(3);
                        for (i = 0; i < num; i++)
                        {
-                               (void)summon_specific(0, y, x, dun_level, 0, TRUE, FALSE, FALSE, TRUE, TRUE);
+                               (void)summon_specific(0, y, x, dun_level, 0, (PM_ALLOW_GROUP | PM_ALLOW_UNIQUE | PM_NO_PET));
                        }
 
                        if (dun_level > randint1(100)) /* No nasty effect for low levels */
index 8126c36..16b07d6 100644 (file)
@@ -656,7 +656,7 @@ static void chest_trap(int y, int x, s16b o_idx)
                        if (randint1(100)<dun_level)
                                activate_hi_summon(py, px, FALSE);
                        else
-                               (void)summon_specific(0, y, x, mon_level, 0, TRUE, FALSE, FALSE, TRUE, TRUE);
+                               (void)summon_specific(0, y, x, mon_level, 0, (PM_ALLOW_GROUP | PM_ALLOW_UNIQUE | PM_NO_PET));
                }
        }
 
@@ -670,7 +670,7 @@ static void chest_trap(int y, int x, s16b o_idx)
 #endif
                for (i = 0; i < randint1(3) + 5; i++)
                {
-                       (void)summon_specific(0, y, x, mon_level, SUMMON_ELEMENTAL, TRUE, FALSE, FALSE, TRUE, TRUE);
+                       (void)summon_specific(0, y, x, mon_level, SUMMON_ELEMENTAL, (PM_ALLOW_GROUP | PM_ALLOW_UNIQUE | PM_NO_PET));
                }
        }
 
@@ -688,7 +688,7 @@ static void chest_trap(int y, int x, s16b o_idx)
 
                for (i = 0; i < randint1(5) + o_ptr->pval / 5; i++)
                {
-                       (void)summon_specific(0, y, x, mon_level, SUMMON_BIRD, TRUE, FALSE, FALSE, TRUE, TRUE);
+                       (void)summon_specific(0, y, x, mon_level, SUMMON_BIRD, (PM_ALLOW_GROUP | PM_ALLOW_UNIQUE | PM_NO_PET));
                }
        }
 
@@ -707,7 +707,7 @@ static void chest_trap(int y, int x, s16b o_idx)
                        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, TRUE, FALSE, FALSE, TRUE, TRUE);
+                               (void)summon_specific(0, y, x, mon_level, SUMMON_DEMON, (PM_ALLOW_GROUP | PM_ALLOW_UNIQUE | PM_NO_PET));
                        }
                }
 
@@ -722,7 +722,7 @@ static void chest_trap(int y, int x, s16b o_idx)
 
                        for (i = 0; i < randint1(3) + 2; i++)
                        {
-                               (void)summon_specific(0, y, x, mon_level, SUMMON_DRAGON, TRUE, FALSE, FALSE, TRUE, TRUE);
+                               (void)summon_specific(0, y, x, mon_level, SUMMON_DRAGON, (PM_ALLOW_GROUP | PM_ALLOW_UNIQUE | PM_NO_PET));
                        }
                }
 
@@ -737,7 +737,7 @@ static void chest_trap(int y, int x, s16b o_idx)
 
                        for (i = 0; i < randint1(5) + 3; i++)
                        {
-                               (void)summon_specific(0, y, x, mon_level, SUMMON_HYBRID, TRUE, FALSE, FALSE, TRUE, TRUE);
+                               (void)summon_specific(0, y, x, mon_level, SUMMON_HYBRID, (PM_ALLOW_GROUP | PM_ALLOW_UNIQUE | PM_NO_PET));
                        }
                }
 
@@ -752,7 +752,7 @@ static void chest_trap(int y, int x, s16b o_idx)
 
                        for (i = 0; i < randint1(3) + 2; i++)
                        {
-                               (void)summon_specific(0, y, x, mon_level, SUMMON_VORTEX, TRUE, FALSE, FALSE, TRUE, TRUE);
+                               (void)summon_specific(0, y, x, mon_level, SUMMON_VORTEX, (PM_ALLOW_GROUP | PM_ALLOW_UNIQUE | PM_NO_PET));
                        }
                }
        }
@@ -4482,8 +4482,8 @@ note_dies = "
        {
                j = 100;
 
-               if (!(summon_named_creature(0, y, x, q_ptr->pval, FALSE, FALSE, FALSE,
-                     (bool)!(cursed_p(q_ptr)))))
+               if (!(summon_named_creature(0, y, x, q_ptr->pval,
+                                           !(cursed_p(q_ptr)) ? PM_FORCE_PET : 0L)))
 #ifdef JP
 msg_print("¿Í·Á¤ÏDZ¤¸¶Ê¤¬¤êºÕ¤±»¶¤Ã¤Æ¤·¤Þ¤Ã¤¿¡ª");
 #else
index 8ebbdcf..36ed38c 100644 (file)
@@ -1016,7 +1016,7 @@ void wild_magic(int spell)
        case 35:
                while (counter++ < 8)
                {
-                       (void)summon_specific(0, py, px, (dun_level * 3) / 2, type, TRUE, FALSE, FALSE, FALSE, TRUE);
+                       (void)summon_specific(0, py, px, (dun_level * 3) / 2, type, (PM_ALLOW_GROUP | PM_NO_PET));
                }
                break;
        case 36:
@@ -1199,7 +1199,7 @@ msg_print("
                confuse_monsters(plev * 4);
                turn_monsters(plev * 4);
                stasis_monsters(plev * 4);
-               summon_specific(-1, py, px, plev, SUMMON_ANGEL, TRUE, TRUE, TRUE, FALSE, FALSE);
+               summon_specific(-1, py, px, plev, SUMMON_ANGEL, (PM_ALLOW_GROUP | PM_FORCE_PET));
                (void)set_hero(randint1(25) + 25, FALSE);
                (void)hp_player(300);
                (void)set_fast(randint1(20 + plev) + plev, FALSE);
@@ -1478,7 +1478,7 @@ msg_print("
                slow_monsters();
                break;
        case 14: /* Summon Animals */
-               if (!(summon_specific(-1, py, px, plev, SUMMON_ANIMAL_RANGER, TRUE, TRUE, TRUE, FALSE, FALSE)))
+               if (!(summon_specific(-1, py, px, plev, SUMMON_ANIMAL_RANGER, (PM_ALLOW_GROUP | PM_FORCE_PET))))
                        no_trump = TRUE;
                break;
        case 15: /* Herbal Healing */
@@ -1824,10 +1824,14 @@ msg_print("
                break;
        case 23: /* Summon monster, demon */
                {
+                       u32b mode = 0L;
                        bool pet = !one_in_(3);
-                       bool group = !(pet && (plev < 50));
 
-                       if (summon_specific((pet ? -1 : 0), py, px, (plev * 3) / 2, SUMMON_DEMON, group, FALSE, pet, FALSE, (bool)(!pet)))
+                       if (pet) mode |= PM_FORCE_PET;
+                       else mode |= PM_NO_PET;
+                       if (!(pet && (plev < 50))) mode |= PM_ALLOW_GROUP;
+
+                       if (summon_specific((pet ? -1 : 0), py, px, (plev * 3) / 2, SUMMON_DEMON, mode))
                        {
 #ifdef JP
 msg_print("ⲫ¤Î°­½­¤¬½¼Ëþ¤·¤¿¡£");
@@ -2096,7 +2100,7 @@ msg_print("
                                msg_print("Oh no! Mouldering forms rise from the earth around you!");
 #endif
 
-                               (void)summon_specific(0, py, px, dun_level, SUMMON_UNDEAD, TRUE, FALSE, FALSE, TRUE, TRUE);
+                               (void)summon_specific(0, py, px, dun_level, SUMMON_UNDEAD, (PM_ALLOW_GROUP | PM_ALLOW_UNIQUE | PM_NO_PET));
                                chg_virtue(V_UNLIFE, 1);
                        }
                        else if (die < 14)
@@ -2259,21 +2263,19 @@ msg_print("
                break;
        case 25: /* Raise the Dead */
                {
-                       bool pet = one_in_(3);
-                       bool group;
                        int type;
+                       bool pet = one_in_(3);
+                       u32b mode = 0L;
 
                        type = (plev > 47 ? SUMMON_HI_UNDEAD : SUMMON_UNDEAD);
-                       if (pet)
-                       {
-                               group = (((plev > 24) && one_in_(3)) ? TRUE : FALSE);
-                       }
-                       else
-                       {
-                               group = TRUE;
-                       }
 
-                       if (summon_specific((pet ? -1 : 0), py, px, (plev * 3) / 2, type, group, FALSE, pet, (bool)(!pet), (bool)(!pet)))
+                       if (!pet || (pet && (plev > 24) && one_in_(3)))
+                               mode |= PM_ALLOW_GROUP;
+
+                       if (pet) mode |= PM_FORCE_PET;
+                       else mode |= (PM_ALLOW_UNIQUE | PM_NO_PET);
+
+                       if (summon_specific((pet ? -1 : 0), py, px, (plev * 3) / 2, type, mode))
                        {
 #ifdef JP
 msg_print("Î䤿¤¤É÷¤¬¤¢¤Ê¤¿¤Î¼þ¤ê¤Ë¿á¤­»Ï¤á¤¿¡£¤½¤ì¤ÏÉåÇÔ½­¤ò±¿¤ó¤Ç¤¤¤ë...");
@@ -2367,6 +2369,10 @@ static bool cast_trump_spell(int spell, bool success)
                case 1: /* Trump Spiders */
                {
                        bool pet = success; /* (randint1(5) > 2) */
+                       u32b mode = PM_ALLOW_GROUP;
+
+                       if (pet) mode |= PM_FORCE_PET;
+                       else mode |= PM_NO_PET;
 
 #ifdef JP
 msg_print("¤¢¤Ê¤¿¤ÏÃØéá¤Î¥«¡¼¥É¤Ë½¸Ã椹¤ë...");
@@ -2374,8 +2380,7 @@ msg_print("
                        msg_print("You concentrate on the trump of an spider...");
 #endif
 
-
-                       if (summon_specific((pet ? -1 : 0), py, px, summon_lev, SUMMON_SPIDER, TRUE, FALSE, pet, FALSE, (bool)(!pet)))
+                       if (summon_specific((pet ? -1 : 0), py, px, summon_lev, SUMMON_SPIDER, mode))
                        {
                                if (!pet)
 #ifdef JP
@@ -2383,7 +2388,6 @@ msg_print("
 #else
                                        msg_print("The summoned spiders get angry!");
 #endif
-
                        }
                        else
                        {
@@ -2445,7 +2449,7 @@ msg_print("
                                        msg_print("Oh no! It's the Devil!");
 #endif
 
-                                       (void)summon_specific(0, py, px, dun_level, SUMMON_DEMON, TRUE, FALSE, FALSE, TRUE, TRUE);
+                                       (void)summon_specific(0, py, px, dun_level, SUMMON_DEMON, (PM_ALLOW_GROUP | PM_ALLOW_UNIQUE | PM_NO_PET));
                                }
                                else if (die < 18)
                                {
@@ -2487,7 +2491,7 @@ msg_print("
                                        msg_print("It's the picture of a strange monster.");
 #endif
 
-                                       if (!(summon_specific(0, py, px, (dun_level * 3) / 2, 32 + randint1(6), TRUE, FALSE, FALSE, TRUE, TRUE)))
+                                       if (!(summon_specific(0, py, px, (dun_level * 3) / 2, 32 + randint1(6), (PM_ALLOW_GROUP | PM_ALLOW_UNIQUE | PM_NO_PET))))
                                                no_trump = TRUE;
                                }
                                else if (die < 33)
@@ -2588,7 +2592,7 @@ msg_print("ͧ
                                        msg_print("It's the picture of a friendly monster.");
 #endif
 
-                                       if (!(summon_specific(-1, py, px, (dun_level * 3) / 2, SUMMON_BIZARRE1, FALSE, TRUE, TRUE, FALSE, FALSE)))
+                                       if (!(summon_specific(-1, py, px, (dun_level * 3) / 2, SUMMON_BIZARRE1, PM_FORCE_PET)))
                                                no_trump = TRUE;
                                }
                                else if (die < 84)
@@ -2599,7 +2603,7 @@ msg_print("ͧ
                                        msg_print("It's the picture of a friendly monster.");
 #endif
 
-                                       if (!(summon_specific(-1, py, px, (dun_level * 3) / 2, SUMMON_BIZARRE2, FALSE, TRUE, TRUE, FALSE, FALSE)))
+                                       if (!(summon_specific(-1, py, px, (dun_level * 3) / 2, SUMMON_BIZARRE2, PM_FORCE_PET)))
                                                no_trump = TRUE;
                                }
                                else if (die < 86)
@@ -2610,7 +2614,7 @@ msg_print("ͧ
                                        msg_print("It's the picture of a friendly monster.");
 #endif
 
-                                       if (!(summon_specific(-1, py, px, (dun_level * 3) / 2, SUMMON_BIZARRE4, FALSE, TRUE, TRUE, FALSE, FALSE)))
+                                       if (!(summon_specific(-1, py, px, (dun_level * 3) / 2, SUMMON_BIZARRE4, PM_FORCE_PET)))
                                                no_trump = TRUE;
                                }
                                else if (die < 88)
@@ -2621,7 +2625,7 @@ msg_print("ͧ
                                        msg_print("It's the picture of a friendly monster.");
 #endif
 
-                                       if (!(summon_specific(-1, py, px, (dun_level * 3) / 2, SUMMON_BIZARRE5, FALSE, TRUE, TRUE, FALSE, FALSE)))
+                                       if (!(summon_specific(-1, py, px, (dun_level * 3) / 2, SUMMON_BIZARRE5, PM_FORCE_PET)))
                                                no_trump = TRUE;
                                }
                                else if (die < 96)
@@ -2731,7 +2735,10 @@ msg_print("
                {
                        bool pet = success; /* was (randint1(5) > 2) */
                        int type = (pet ? SUMMON_ANIMAL_RANGER : SUMMON_ANIMAL);
-                       bool group = (pet ? FALSE : TRUE);
+                       u32b mode = 0L;
+
+                       if (pet) mode |= PM_FORCE_PET;
+                       else mode |= (PM_ALLOW_GROUP | PM_NO_PET);
 
 #ifdef JP
 msg_print("¤¢¤Ê¤¿¤Ïưʪ¤Î¥«¡¼¥É¤Ë½¸Ã椹¤ë...");
@@ -2740,7 +2747,7 @@ msg_print("
 #endif
 
 
-                       if (summon_specific((pet ? -1 : 0), py, px, summon_lev, type, group, FALSE, pet, FALSE, (bool)(!pet)))
+                       if (summon_specific((pet ? -1 : 0), py, px, summon_lev, type, mode))
                        {
                                if (!pet)
 #ifdef JP
@@ -2785,9 +2792,12 @@ msg_print("
                        for (dummy = 2 + randint0(plev / 7); dummy > 0; dummy--)
                        {
                                bool pet = success; /* was (randint1(10) > 3) */
-                               bool group = (pet ? FALSE : TRUE);
+                               u32b mode = 0L;
                                int type;
 
+                               if (pet) mode |= PM_FORCE_PET;
+                               else mode |= (PM_ALLOW_GROUP | PM_NO_PET);
+
                                if (p_ptr->pclass == CLASS_BEASTMASTER)
                                {
                                        type = SUMMON_KAMIKAZE_LIVING;
@@ -2797,7 +2807,7 @@ msg_print("
                                        type = SUMMON_KAMIKAZE;
                                }
 
-                               if (summon_specific((pet ? -1 : 0), y, x, summon_lev, type, group, FALSE, pet, FALSE, (bool)(!pet)))
+                               if (summon_specific((pet ? -1 : 0), y, x, summon_lev, type, mode))
                                {
                                        if (!pet)
 #ifdef JP
@@ -2814,7 +2824,7 @@ msg_print("
                case 10: /* Phantasmal Servant */
                        if (success)
                        {
-                               if (summon_specific(-1, py, px, (summon_lev * 3) / 2, SUMMON_PHANTOM, FALSE, TRUE, TRUE, FALSE, FALSE))
+                               if (summon_specific(-1, py, px, (summon_lev * 3) / 2, SUMMON_PHANTOM, PM_FORCE_PET))
                                {
 #ifdef JP
 msg_print("¸æÍѤǤ´¤¶¤¤¤Þ¤¹¤«¡¢¸æ¼ç¿ÍÍÍ¡©");
@@ -2897,7 +2907,10 @@ msg_print("
                case 17: /* Trump Undead */
                {
                        bool pet = success; /* (randint1(10) > 3) */
-                       bool group = (pet ? FALSE : TRUE);
+                       u32b mode = 0L;
+
+                       if (pet) mode |= PM_FORCE_PET;
+                       else mode |= (PM_ALLOW_GROUP | PM_NO_PET);
 
 #ifdef JP
 msg_print("¤¢¤Ê¤¿¤Ï¥¢¥ó¥Ç¥Ã¥É¤Î¥«¡¼¥É¤Ë½¸Ã椹¤ë...");
@@ -2906,7 +2919,7 @@ msg_print("
 #endif
 
 
-                       if (summon_specific((pet ? -1 : 0), py, px, summon_lev, SUMMON_UNDEAD, group, FALSE, pet, FALSE, (bool)(!pet)))
+                       if (summon_specific((pet ? -1 : 0), py, px, summon_lev, SUMMON_UNDEAD, mode))
                        {
                                if (!pet)
 #ifdef JP
@@ -2926,7 +2939,10 @@ msg_print("
                case 18: /* Trump Reptiles */
                {
                        bool pet = success; /* was (randint1(5) > 2) */
-                       bool group = !pet;
+                       u32b mode = 0L;
+
+                       if (pet) mode |= PM_FORCE_PET;
+                       else mode |= (PM_ALLOW_GROUP | PM_NO_PET);
 
 #ifdef JP
 msg_print("¤¢¤Ê¤¿¤Ïà¨ÃîÎà¤Î¥«¡¼¥É¤Ë½¸Ã椹¤ë...");
@@ -2935,7 +2951,7 @@ msg_print("
 #endif
 
 
-                       if (summon_specific((pet ? -1 : 0), py, px, summon_lev, SUMMON_HYDRA, group, FALSE, pet, FALSE, (bool)(!pet)))
+                       if (summon_specific((pet ? -1 : 0), py, px, summon_lev, SUMMON_HYDRA, mode))
                        {
                                if (!pet)
 #ifdef JP
@@ -2966,8 +2982,13 @@ msg_print("
                        for (dummy = 0; dummy < 1 + ((plev - 15)/ 10); dummy++)
                        {
                                bool pet = success; /* was (randint1(10) > 3) */
-                               bool group = (pet ? FALSE : TRUE);
                                int type;
+                               u32b mode = 0L;
+
+                               if (pet) mode |= PM_FORCE_PET;
+                               else mode |= (PM_ALLOW_GROUP | PM_NO_PET);
+
+                               if (unique_okay) mode |= PM_ALLOW_UNIQUE;
 
                                if (p_ptr->pclass == CLASS_BEASTMASTER)
                                {
@@ -2978,7 +2999,7 @@ msg_print("
                                        type = 0;
                                }
 
-                               if (summon_specific((pet ? -1 : 0), py, px, summon_lev, type, group, FALSE, pet, unique_okay, (bool)(!pet)))
+                               if (summon_specific((pet ? -1 : 0), py, px, summon_lev, type, mode))
                                {
                                        if (!pet)
 #ifdef JP
@@ -2995,6 +3016,10 @@ msg_print("
                case 20: /* Trump Hounds */
                {
                        bool pet = success; /* was (randint1(5) > 2) */
+                       u32b mode = PM_ALLOW_GROUP;
+
+                       if (pet) mode |= PM_FORCE_PET;
+                       else mode |= PM_NO_PET;
 
 #ifdef JP
 msg_print("¤¢¤Ê¤¿¤Ï¥Ï¥¦¥ó¥É¤Î¥«¡¼¥É¤Ë½¸Ã椹¤ë...");
@@ -3003,7 +3028,7 @@ msg_print("
 #endif
 
 
-                       if (summon_specific((pet ? -1 : 0), py, px, summon_lev, SUMMON_HOUND, TRUE, FALSE, pet, FALSE, (bool)(!pet)))
+                       if (summon_specific((pet ? -1 : 0), py, px, summon_lev, SUMMON_HOUND, mode))
                        {
                                if (!pet)
 #ifdef JP
@@ -3048,6 +3073,10 @@ msg_print("
                case 23: /* Trump Cyberdemon */
                {
                        bool pet = success; /* was (randint1(10) > 3) */
+                       u32b mode = 0L;
+
+                       if (pet) mode |= PM_FORCE_PET;
+                       else mode |= PM_NO_PET;
 
 #ifdef JP
 msg_print("¤¢¤Ê¤¿¤Ï¥µ¥¤¥Ð¡¼¥Ç¡¼¥â¥ó¤Î¥«¡¼¥É¤Ë½¸Ã椹¤ë...");
@@ -3056,7 +3085,7 @@ msg_print("
 #endif
 
 
-                       if (summon_specific((pet ? -1 : 0), py, px, summon_lev, SUMMON_CYBER, FALSE, FALSE, pet, FALSE, (bool)(!pet)))
+                       if (summon_specific((pet ? -1 : 0), py, px, summon_lev, SUMMON_CYBER, mode))
                        {
                                if (!pet)
 #ifdef JP
@@ -3103,7 +3132,10 @@ msg_print("
                case 27: /* Trump Dragon */
                {
                        bool pet = success; /* was (randint1(10) > 3) */
-                       bool group = (pet ? FALSE : TRUE);
+                       u32b mode = 0L;
+
+                       if (pet) mode |= PM_FORCE_PET;
+                       else mode |= (PM_ALLOW_GROUP | PM_NO_PET);
 
 #ifdef JP
 msg_print("¤¢¤Ê¤¿¤Ï¥É¥é¥´¥ó¤Î¥«¡¼¥É¤Ë½¸Ã椹¤ë...");
@@ -3112,7 +3144,7 @@ msg_print("
 #endif
 
 
-                       if (summon_specific((pet ? -1 : 0), py, px, summon_lev, SUMMON_DRAGON, group, FALSE, pet, FALSE, (bool)(!pet)))
+                       if (summon_specific((pet ? -1 : 0), py, px, summon_lev, SUMMON_DRAGON, mode))
                        {
                                if (!pet)
 #ifdef JP
@@ -3164,7 +3196,10 @@ msg_print("
                case 29: /* Trump Demon */
                {
                        bool pet = success; /* was (randint1(10) > 3) */
-                       bool group = (pet ? FALSE : TRUE);
+                       u32b mode = 0L;
+
+                       if (pet) mode |= PM_FORCE_PET;
+                       else mode |= (PM_ALLOW_GROUP | PM_NO_PET);
 
 #ifdef JP
 msg_print("¤¢¤Ê¤¿¤Ï¥Ç¡¼¥â¥ó¤Î¥«¡¼¥É¤Ë½¸Ã椹¤ë...");
@@ -3173,7 +3208,7 @@ msg_print("
 #endif
 
 
-                       if (summon_specific((pet ? -1 : 0), py, px, summon_lev, SUMMON_DEMON, group, FALSE, pet, FALSE, (bool)(!pet)))
+                       if (summon_specific((pet ? -1 : 0), py, px, summon_lev, SUMMON_DEMON, mode))
                        {
                                if (!pet)
 #ifdef JP
@@ -3193,7 +3228,12 @@ msg_print("
                case 30: /* Trump Greater Undead */
                {
                        bool pet = success; /* was (randint1(10) > 3) */
-                       bool group = (pet ? FALSE : TRUE);
+                       u32b mode = 0L;
+
+                       if (pet) mode |= PM_FORCE_PET;
+                       else mode |= (PM_ALLOW_GROUP | PM_NO_PET);
+
+                       if (unique_okay) mode |= PM_ALLOW_UNIQUE;
 
 #ifdef JP
 msg_print("¤¢¤Ê¤¿¤Ï¶¯ÎϤʥ¢¥ó¥Ç¥Ã¥É¤Î¥«¡¼¥É¤Ë½¸Ã椹¤ë...");
@@ -3202,7 +3242,7 @@ msg_print("
 #endif
 
 
-                       if (summon_specific((pet ? -1 : 0), py, px, summon_lev, SUMMON_HI_UNDEAD, group, FALSE, pet, unique_okay, (bool)(!pet)))
+                       if (summon_specific((pet ? -1 : 0), py, px, summon_lev, SUMMON_HI_UNDEAD, mode))
                        {
                                if (!pet)
 #ifdef JP
@@ -3222,8 +3262,14 @@ msg_print("
                case 31: /* Trump Ancient Dragon */
                {
                        bool pet = success; /* was (randint1(10) > 3) */
-                       bool group = (pet ? FALSE : TRUE);
                        int type;
+                       u32b mode = 0L;
+
+                       if (pet) mode |= PM_FORCE_PET;
+                       else mode |= (PM_ALLOW_GROUP | PM_NO_PET);
+
+                       if (unique_okay) mode |= PM_ALLOW_UNIQUE;
+
                        if (p_ptr->pclass == CLASS_BEASTMASTER)
                        {
                                type = SUMMON_HI_DRAGON_LIVING;
@@ -3240,7 +3286,7 @@ msg_print("
 #endif
 
 
-                       if (summon_specific((pet ? -1 : 0), py, px, summon_lev, type, group, FALSE, pet, unique_okay, (bool)(!pet)))
+                       if (summon_specific((pet ? -1 : 0), py, px, summon_lev, type, mode))
                        {
                                if (!pet)
 #ifdef JP
@@ -3392,7 +3438,7 @@ msg_print("
                (void)set_tim_invis(randint1(24) + 24, FALSE);
                break;
        case 25: /* Conjure Elemental */
-               if (!summon_specific(-1, py, px, plev, SUMMON_ELEMENTAL, TRUE, TRUE, TRUE, FALSE, FALSE))
+               if (!summon_specific(-1, py, px, plev, SUMMON_ELEMENTAL, (PM_ALLOW_GROUP | PM_FORCE_PET)))
                        no_trump = TRUE;
                break;
        case 26: /* Teleport Level */
@@ -3544,7 +3590,7 @@ static bool cast_enchant_spell(int spell)
                (void)pulish_shield();
                break;
        case 22: /* Create Golem */
-               if (summon_specific(-1, py, px, plev, SUMMON_GOLEM, FALSE, TRUE, TRUE, FALSE, FALSE))
+               if (summon_specific(-1, py, px, plev, SUMMON_GOLEM, PM_FORCE_PET))
                {
 #ifdef JP
 msg_print("¥´¡¼¥ì¥à¤òºî¤Ã¤¿¡£");
@@ -3675,7 +3721,7 @@ static bool cast_daemon_spell(int spell)
                    damroll(6 + ((plev - 5) / 4), 8));
                break;
        case 6: /* Summon monster, demon */
-               if (!summon_specific(-1, py, px, (plev * 3) / 2, SUMMON_MANES, TRUE, FALSE, TRUE, FALSE, FALSE))
+               if (!summon_specific(-1, py, px, (plev * 3) / 2, SUMMON_MANES, (PM_ALLOW_GROUP | PM_FORCE_PET)))
                {
 #ifdef JP
 msg_print("¸ÅÂå¤Î»àÎî¤Ï¸½¤ì¤Ê¤«¤Ã¤¿¡£");
@@ -3727,9 +3773,13 @@ msg_print("
        case 15: /* Summon monster, demon */
        {
                bool pet = !one_in_(3);
-               bool group = !(pet && (plev < 50));
+               u32b mode = 0L;
+
+               if (pet) mode |= PM_FORCE_PET;
+               else mode |= PM_NO_PET;
+               if (!(pet && (plev < 50))) mode |= PM_ALLOW_GROUP;
 
-               if (summon_specific((pet ? -1 : 0), py, px, plev*2/3+randint1(plev/2), SUMMON_DEMON, group, FALSE, pet, FALSE, (bool)(!pet)))
+               if (summon_specific((pet ? -1 : 0), py, px, plev*2/3+randint1(plev/2), SUMMON_DEMON, mode))
                {
 #ifdef JP
 msg_print("ⲫ¤Î°­½­¤¬½¼Ëþ¤·¤¿¡£");
@@ -3852,7 +3902,7 @@ else msg_print("<
                }
 
                summon_lev = p_ptr->lev * 2 / 3 + r_info[o_ptr->pval].level;
-               if (summon_specific(-1, py, px, summon_lev, SUMMON_HI_DEMON, TRUE, FALSE, TRUE, FALSE, FALSE))
+               if (summon_specific(-1, py, px, summon_lev, SUMMON_HI_DEMON, (PM_ALLOW_GROUP | PM_FORCE_PET)))
                {
 #ifdef JP
 msg_print("ⲫ¤Î°­½­¤¬½¼Ëþ¤·¤¿¡£");
@@ -4041,9 +4091,13 @@ static bool cast_haja_spell(int spell) /* nanka */
        case 23: /* Summon monster, angel */
                {
                        bool pet = !one_in_(3);
-                       bool group = !(pet && (plev < 50));
+                       u32b mode = 0L;
+
+                       if (pet) mode |= PM_FORCE_PET;
+                       else mode |= PM_NO_PET;
+                       if (!(pet && (plev < 50))) mode |= PM_ALLOW_GROUP;
 
-                       if (summon_specific((pet ? -1 : 0), py, px, (plev * 3) / 2, SUMMON_ANGEL, group, FALSE, pet, FALSE, (bool)(!pet)))
+                       if (summon_specific((pet ? -1 : 0), py, px, (plev * 3) / 2, SUMMON_ANGEL, mode))
                        {
                                if (pet)
 #ifdef JP
@@ -4128,7 +4182,7 @@ msg_print("
                                if (cave_empty_bold2(my, mx)) break;
                        }
                        if (attempt < 0) continue;
-                       summon_specific(-1, my, mx, plev, SUMMON_KNIGHTS, TRUE, FALSE, TRUE, FALSE, FALSE);
+                       summon_specific(-1, my, mx, plev, SUMMON_KNIGHTS, (PM_ALLOW_GROUP | PM_FORCE_PET));
                }
                (void)set_hero(randint1(25) + 25, FALSE);
                (void)set_blessed(randint1(25) + 25, FALSE);
index 2c1ce38..8c1e7bc 100644 (file)
@@ -1576,7 +1576,7 @@ static void do_cmd_read_scroll_aux(int item)
                {
                        for (k = 0; k < randint1(3); k++)
                        {
-                               if (summon_specific(0, py, px, dun_level, 0, TRUE, FALSE, FALSE, TRUE, TRUE))
+                               if (summon_specific(0, py, px, dun_level, 0, (PM_ALLOW_GROUP | PM_ALLOW_UNIQUE | PM_NO_PET)))
                                {
                                        ident = TRUE;
                                }
@@ -1588,7 +1588,7 @@ static void do_cmd_read_scroll_aux(int item)
                {
                        for (k = 0; k < randint1(3); k++)
                        {
-                               if (summon_specific(0, py, px, dun_level, SUMMON_UNDEAD, TRUE, FALSE, FALSE, TRUE, TRUE))
+                               if (summon_specific(0, py, px, dun_level, SUMMON_UNDEAD, (PM_ALLOW_GROUP | PM_ALLOW_UNIQUE | PM_NO_PET)))
                                {
                                        ident = TRUE;
                                }
@@ -1598,7 +1598,7 @@ static void do_cmd_read_scroll_aux(int item)
 
                case SV_SCROLL_SUMMON_PET:
                {
-                       if (summon_specific(-1, py, px, dun_level, 0, TRUE, TRUE, TRUE, FALSE, FALSE))
+                       if (summon_specific(-1, py, px, dun_level, 0, (PM_ALLOW_GROUP | PM_FORCE_PET)))
                        {
                                ident = TRUE;
                        }
@@ -1607,7 +1607,7 @@ static void do_cmd_read_scroll_aux(int item)
 
                case SV_SCROLL_SUMMON_KIN:
                {
-                       if (summon_kin_player(TRUE, p_ptr->lev, py, px, TRUE))
+                       if (summon_kin_player(p_ptr->lev, py, px, (PM_FORCE_PET | PM_ALLOW_GROUP)))
                        {
                                ident = TRUE;
                        }
@@ -2252,7 +2252,7 @@ static int staff_effect(int sval, bool *use_charge, bool magic)
                {
                        for (k = 0; k < randint1(4); k++)
                        {
-                               if (summon_specific(0, py, px, dun_level, 0, TRUE, FALSE, FALSE, TRUE, TRUE))
+                               if (summon_specific(0, py, px, dun_level, 0, (PM_ALLOW_GROUP | PM_ALLOW_UNIQUE | PM_NO_PET)))
                                {
                                        ident = TRUE;
                                }
@@ -4748,7 +4748,7 @@ msg_print("
                                msg_print("You summon the Legion of the Dawn.");
 #endif
 
-                               (void)summon_specific(-1, py, px, dun_level, SUMMON_DAWN, TRUE, TRUE, TRUE, FALSE, FALSE);
+                               (void)summon_specific(-1, py, px, dun_level, SUMMON_DAWN, (PM_ALLOW_GROUP | PM_FORCE_PET));
                                o_ptr->timeout = 500 + randint1(500);
                                break;
                        }
@@ -5320,9 +5320,12 @@ msg_print("
                        }
                        case ART_ARRYU:
                        {
+                               u32b mode = PM_ALLOW_GROUP;
                                bool pet = !one_in_(5);
+                               if (pet) mode |= PM_FORCE_PET;
+                               else mode |= PM_NO_PET;
 
-                               if (summon_specific((pet ? -1 : 0), py, px, ((p_ptr->lev * 3) / 2), SUMMON_HOUND, TRUE, FALSE, pet, FALSE, (bool)(!pet)))
+                               if (summon_specific((pet ? -1 : 0), py, px, ((p_ptr->lev * 3) / 2), SUMMON_HOUND, mode))
                                {
 
                                        if (pet)
@@ -5367,7 +5370,7 @@ msg_print("
                                cptr kakusan = "";
 #endif
 
-                               if (summon_named_creature(0, py, px, MON_SUKE, FALSE, FALSE, TRUE, TRUE))
+                               if (summon_named_creature(0, py, px, MON_SUKE, PM_FORCE_PET))
                                {
 #ifdef JP
                                        msg_print("¡Ø½õ¤µ¤ó¡Ù¤¬¸½¤ì¤¿¡£");
@@ -5377,7 +5380,7 @@ msg_print("
 #endif
                                        count++;
                                }
-                               if (summon_named_creature(0, py, px, MON_KAKU, FALSE, FALSE, TRUE, TRUE))
+                               if (summon_named_creature(0, py, px, MON_KAKU, PM_FORCE_PET))
                                {
 #ifdef JP
                                        msg_print("¡Ø³Ê¤µ¤ó¡Ù¤¬¸½¤ì¤¿¡£");
@@ -5551,9 +5554,11 @@ msg_print("
                        }
                        case ART_JIZO:
                        {
+                               u32b mode = PM_ALLOW_GROUP;
                                bool pet = !one_in_(5);
+                               if (pet) mode |= PM_FORCE_PET;
 
-                               if (summon_named_creature(0, py, px, MON_JIZOTAKO, FALSE, TRUE, FALSE, pet))
+                               if (summon_named_creature(0, py, px, MON_JIZOTAKO, mode))
                                {
                                        if (pet)
 #ifdef JP
@@ -6271,7 +6276,7 @@ msg_print("
                        if (!get_rep_dir2(&dir)) return;
                        if (cave_floor_bold(py+ddy[dir],px+ddx[dir]))
                        {
-                               if (place_monster_aux(0, py + ddy[dir], px + ddx[dir], o_ptr->pval, FALSE, FALSE, TRUE, TRUE, TRUE, FALSE))
+                               if (place_monster_aux(0, py + ddy[dir], px + ddx[dir], o_ptr->pval, (PM_FORCE_PET | PM_NO_KAGE)))
                                {
                                        if (o_ptr->xtra3) m_list[hack_m_idx_ii].mspeed = o_ptr->xtra3;
                                        if (o_ptr->xtra5) m_list[hack_m_idx_ii].max_maxhp = o_ptr->xtra5;
index 7241f44..1935112 100644 (file)
 #define PW_BORG_1       0x00004000L     /* Display borg messages */
 #define PW_BORG_2       0x00008000L     /* Display borg status */
 
+/*
+ * Bit flags for the place_monster_???() (etc)
+ */
+#define PM_ALLOW_SLEEP    0x00000001
+#define PM_ALLOW_GROUP    0x00000002
+#define PM_FORCE_FRIENDLY 0x00000004
+#define PM_FORCE_PET      0x00000008
+#define PM_NO_KAGE        0x00000010
+#define PM_NO_PET         0x00000020
+#define PM_ALLOW_UNIQUE   0x00000040
 
 
 /*
 #define is_friendly(A) \
         (bool)(((A)->smart & SM_FRIENDLY) ? TRUE : FALSE)
 
+#define is_friendly_idx(IDX) \
+        (bool)((IDX) > 0 && is_friendly(&m_list[(IDX)]))
+
 #define is_pet(A) \
         (bool)(((A)->smart & SM_PET) ? TRUE : FALSE)
 
index 6dc58e3..7c811c4 100644 (file)
@@ -2886,10 +2886,13 @@ msg_print("
                    !p_ptr->anti_magic && (randint1(6666) == 666))
                {
                        bool pet = one_in_(6);
-                       bool not_pet = (bool)(!pet);
+                       u32b mode = PM_ALLOW_GROUP;
+
+                       if (pet) mode |= PM_FORCE_PET;
+                       else mode |= (PM_ALLOW_UNIQUE | PM_NO_PET);
 
                        if (summon_specific((pet ? -1 : 0), py, px,
-                                   dun_level, SUMMON_DEMON, TRUE, FALSE, pet, not_pet, not_pet))
+                                   dun_level, SUMMON_DEMON, mode))
                        {
 #ifdef JP
 msg_print("¤¢¤Ê¤¿¤Ï¥Ç¡¼¥â¥ó¤ò°ú¤­´ó¤»¤¿¡ª");
@@ -3018,10 +3021,12 @@ msg_print("
                   !p_ptr->anti_magic && one_in_(7000))
                {
                        bool pet = one_in_(3);
-                       bool not_pet = (bool)(!pet);
+                       u32b mode = PM_ALLOW_GROUP;
+
+                       if (pet) mode |= PM_FORCE_PET;
+                       else mode |= (PM_ALLOW_UNIQUE | PM_NO_PET);
 
-                       if (summon_specific((pet ? -1 : 0), py, px, dun_level, SUMMON_ANIMAL,
-                           TRUE, FALSE, pet, not_pet, not_pet))
+                       if (summon_specific((pet ? -1 : 0), py, px, dun_level, SUMMON_ANIMAL, mode))
                        {
 #ifdef JP
 msg_print("ưʪ¤ò°ú¤­´ó¤»¤¿¡ª");
@@ -3124,10 +3129,12 @@ msg_print("
                   !p_ptr->anti_magic && one_in_(3000))
                {
                        bool pet = one_in_(5);
-                       bool not_pet = (bool)(!pet);
+                       u32b mode = PM_ALLOW_GROUP;
+
+                       if (pet) mode |= PM_FORCE_PET;
+                       else mode |= (PM_ALLOW_UNIQUE | PM_NO_PET);
 
-                       if (summon_specific((pet ? -1 : 0), py, px, dun_level, SUMMON_DRAGON,
-                           TRUE, FALSE, pet, not_pet, not_pet))
+                       if (summon_specific((pet ? -1 : 0), py, px, dun_level, SUMMON_DRAGON, mode))
                        {
 #ifdef JP
 msg_print("¥É¥é¥´¥ó¤ò°ú¤­´ó¤»¤¿¡ª");
@@ -3441,7 +3448,7 @@ msg_format("
                if ((p_ptr->cursed & TRC_CALL_ANIMAL) && one_in_(2500))
                {
                        if (summon_specific(0, py, px, dun_level, SUMMON_ANIMAL,
-                           TRUE, FALSE, FALSE, TRUE, TRUE))
+                           (PM_ALLOW_GROUP | PM_ALLOW_UNIQUE | PM_NO_PET)))
                        {
                                char o_name[MAX_NLEN];
 
@@ -3458,8 +3465,7 @@ msg_format("%s
                /* Call demon */
                if ((p_ptr->cursed & TRC_CALL_DEMON) && one_in_(1111))
                {
-                       if (summon_specific(0, py, px, dun_level, SUMMON_DEMON,
-                           TRUE, FALSE, FALSE, TRUE, TRUE))
+                       if (summon_specific(0, py, px, dun_level, SUMMON_DEMON, (PM_ALLOW_GROUP | PM_ALLOW_UNIQUE | PM_NO_PET)))
                        {
                                char o_name[MAX_NLEN];
 
@@ -3477,7 +3483,7 @@ msg_format("%s
                if ((p_ptr->cursed & TRC_CALL_DRAGON) && one_in_(800))
                {
                        if (summon_specific(0, py, px, dun_level, SUMMON_DRAGON,
-                           TRUE, FALSE, FALSE, TRUE, TRUE))
+                           (PM_ALLOW_GROUP | PM_ALLOW_UNIQUE | PM_NO_PET)))
                        {
                                char o_name[MAX_NLEN];
 
@@ -5033,7 +5039,7 @@ msg_print("
                                int y, x;
                                y = py+ddy[tsuri_dir];
                                x = px+ddx[tsuri_dir];
-                               if (place_monster_aux(0, y, x, r_idx, FALSE, FALSE, FALSE, FALSE, TRUE, FALSE))
+                               if (place_monster_aux(0, y, x, r_idx, PM_NO_KAGE))
                                {
                                        char m_name[80];
                                        monster_desc(m_name, &m_list[cave[y][x].m_idx], 0);
@@ -6596,7 +6602,7 @@ if (init_v_info()) quit("
                int pet_r_idx = ((p_ptr->pclass == CLASS_CAVALRY) ? MON_HORSE : MON_YASE_HORSE);
                monster_race *r_ptr = &r_info[pet_r_idx];
                place_monster_aux(0, py, px - 1, pet_r_idx,
-                                 FALSE, FALSE, TRUE, TRUE, TRUE, FALSE);
+                                 (PM_FORCE_PET | PM_NO_KAGE));
                m_ptr = &m_list[hack_m_idx_ii];
                m_ptr->mspeed = r_ptr->speed;
                m_ptr->maxhp = r_ptr->hdice*(r_ptr->hside+1)/2;
index 437ca64..944da84 100644 (file)
@@ -831,16 +831,16 @@ extern void lore_do_probe(int m_idx);
 extern void lore_treasure(int m_idx, int num_item, int num_gold);
 extern void update_mon(int m_idx, bool full);
 extern void update_monsters(bool full);
-extern bool place_monster_aux(int who, int y, int x, int r_idx, bool slp, bool grp, bool friendly, bool pet, bool no_kage, bool no_pet);
-extern bool place_monster(int y, int x, bool slp, bool grp);
+extern bool place_monster_aux(int who, int y, int x, int r_idx, u32b mode);
+extern bool place_monster(int y, int x, u32b mode);
 extern bool alloc_horde(int y, int x);
-extern bool alloc_monster(int dis, bool slp);
-extern bool summon_specific(int who, int y1, int x1, int lev, int type, bool group, bool friendly, bool pet, bool unique_okay, bool no_pet);
-extern bool summon_named_creature(int who, int oy, int ox, int r_idx, bool slp, bool group_ok, bool friendly, bool pet);
-extern bool multiply_monster(int m_idx, bool clone, bool friendly, bool pet);
+extern bool alloc_monster(int dis, u32b mode);
+extern bool summon_specific(int who, int y1, int x1, int lev, int type, u32b mode);
+extern bool summon_named_creature (int who, int oy, int ox, int r_idx, u32b mode);
+extern bool multiply_monster(int m_idx, bool clone, u32b mode);
 extern void update_smart_learn(int m_idx, int what);
 extern void choose_new_monster(int m_idx, bool born, int r_idx);
-extern bool place_monster_one(int who, int y, int x, int r_idx, bool slp, bool friendly, bool pet, bool no_pet);
+extern bool place_monster_one(int who, int y, int x, int r_idx, u32b mode);
 extern bool player_place(int y, int x);
 extern void monster_drop_carried_objects(monster_type *m_ptr);
 
@@ -1108,7 +1108,7 @@ extern bool curse_weapon(bool force, int slot);
 extern bool brand_bolts(void);
 extern bool polymorph_monster(int y, int x);
 extern bool dimension_door(void);
-extern bool summon_kin_player(bool pet, int level, int y, int x, bool group);
+extern bool summon_kin_player(int level, int y, int x, u32b mode);
 
 /* store.c */
 extern void do_cmd_store(void);
index b6cfd4a..01ff3a2 100644 (file)
@@ -959,7 +959,7 @@ if (cheat_room) msg_print("
                        }
                        else
                        {
-                               bool group;
+                               u32b mode = (PM_NO_KAGE | PM_NO_PET);
 
                                for (j = 0; j < (quest[i].max_num - quest[i].cur_num); j++)
                                {
@@ -979,13 +979,11 @@ if (cheat_room) msg_print("
                                                        else break;
                                                }
 
-                                               if (r_ptr->flags1 & RF1_FRIENDS)
-                                                       group = FALSE;
-                                               else
-                                                       group = TRUE;
+                                               if (!(r_ptr->flags1 & RF1_FRIENDS))
+                                                       mode |= PM_ALLOW_GROUP;
 
                                                /* Try to place the monster */
-                                               if (place_monster_aux(0, y, x, quest[i].r_idx, FALSE, group, FALSE, FALSE, TRUE, TRUE))
+                                               if (place_monster_aux(0, y, x, quest[i].r_idx, mode))
                                                {
                                                        /* Success */
                                                        break;
@@ -1070,7 +1068,7 @@ msg_format("
                         if (cave_empty_bold2(oy, ox) && monster_can_cross_terrain(cave[oy][ox].feat, &r_info[d_info[dungeon_type].final_guardian]))
                        {
                                /* Place the guardian */
-                               if (place_monster_aux(0, oy, ox, d_info[dungeon_type].final_guardian, FALSE, TRUE, FALSE, FALSE, TRUE, TRUE)) break;
+                               if (place_monster_aux(0, oy, ox, d_info[dungeon_type].final_guardian, (PM_ALLOW_GROUP | PM_NO_KAGE | PM_NO_PET))) break;
                        }
                         /* One less try */
                         try--;
@@ -1193,7 +1191,7 @@ static void arena_gen(void)
        build_arena();
 
        place_monster_aux(0, py + 5, px, arena_monsters[p_ptr->arena_number],
-           FALSE, FALSE, FALSE, FALSE, TRUE, TRUE);
+           (PM_NO_KAGE | PM_NO_PET));
 }
 
 
@@ -1292,7 +1290,7 @@ static void battle_gen(void)
        for(i=0;i<4;i++)
        {
                place_monster_aux(0, py + 5 + (i/2)*4, px - 2 + (i%2)*4, battle_mon[i],
-                                 FALSE, FALSE, FALSE, FALSE, TRUE, TRUE);
+                                 (PM_NO_KAGE | PM_NO_PET));
                set_friendly(&m_list[cave[py+5+(i/2)*4][px-2+(i%2)*4].m_idx]);
        }
        for(i = 1; i < m_max; i++)
index 75420e6..36cf621 100644 (file)
@@ -382,7 +382,7 @@ void vault_monsters(int y1, int x1, int num)
 
                        /* Place the monster (allow groups) */
                        monster_level = base_level + 2;
-                       (void)place_monster(y, x, TRUE, TRUE);
+                       (void)place_monster(y, x, (PM_ALLOW_SLEEP | PM_ALLOW_GROUP));
                        monster_level = base_level;
                }
        }
index e460840..6325cbe 100644 (file)
@@ -3323,7 +3323,7 @@ static errr process_dungeon_file_aux(char *buf, int ymin, int xmin, int ymax, in
                        {
                                monster_level = base_level + monster_index;
 
-                               place_monster(*y, *x, TRUE, TRUE);
+                               place_monster(*y, *x, (PM_ALLOW_SLEEP | PM_ALLOW_GROUP));
 
                                monster_level = base_level;
                        }
@@ -3357,7 +3357,7 @@ static errr process_dungeon_file_aux(char *buf, int ymin, int xmin, int ymax, in
                                }
 
                                /* Place it */
-                               place_monster_aux(0, *y, *x, monster_index, TRUE, FALSE, FALSE, FALSE, TRUE, FALSE);
+                               place_monster_aux(0, *y, *x, monster_index, (PM_ALLOW_SLEEP | PM_NO_KAGE));
                                if (clone)
                                {
                                        /* clone */
index 2571889..9886860 100644 (file)
@@ -292,8 +292,10 @@ static bool use_mane(int spell)
 {
        int             dir;
        int             plev = p_ptr->lev;
-       bool    unique_okay = FALSE;
-       if (randint1(50+plev) < plev/10) unique_okay = TRUE;
+       u32b mode = (PM_ALLOW_GROUP | PM_FORCE_PET);
+       u32b u_mode = 0L;
+
+       if (randint1(50+plev) < plev/10) u_mode = PM_ALLOW_UNIQUE;
 
 
        /* spell code */
@@ -1076,7 +1078,7 @@ msg_print("
 #endif
                for (k = 0;k < 4; k++)
                {
-                       (void)summon_kin_player(TRUE, plev, target_row, target_col, TRUE);
+                       (void)summon_kin_player(plev, target_row, target_col, (PM_FORCE_PET | PM_ALLOW_GROUP));
                }
                break;
        }
@@ -1092,7 +1094,7 @@ msg_print("
 #endif
                if (max_cyber > 4) max_cyber = 4;
                for (k = 0;k < max_cyber; k++)
-                       summon_specific(-1, target_row, target_col, plev, SUMMON_CYBER, TRUE, TRUE, TRUE, FALSE, FALSE);
+                       summon_specific(-1, target_row, target_col, plev, SUMMON_CYBER, mode);
                break;
        }
        case MS_S_MONSTER:
@@ -1105,7 +1107,7 @@ msg_print("
                        msg_print("You summons help.");
 #endif
                for (k = 0;k < 1; k++)
-                       summon_specific(-1, target_row, target_col, plev, 0, TRUE, TRUE, TRUE, unique_okay, FALSE);
+                       summon_specific(-1, target_row, target_col, plev, 0, (mode | u_mode));
                break;
        }
        case MS_S_MONSTERS:
@@ -1118,7 +1120,7 @@ msg_print("
                        msg_print("You summons monsters!");
 #endif
                for (k = 0;k < 6; k++)
-                       summon_specific(-1, target_row, target_col, plev, 0, TRUE, TRUE, TRUE, unique_okay, FALSE);
+                       summon_specific(-1, target_row, target_col, plev, 0, (mode | u_mode));
                break;
        }
        case MS_S_ANT:
@@ -1131,7 +1133,7 @@ msg_print("
                        msg_print("You summons ants.");
 #endif
                for (k = 0;k < 6; k++)
-                       summon_specific(-1, target_row, target_col, plev, SUMMON_ANT, TRUE, TRUE, TRUE, FALSE, FALSE);
+                       summon_specific(-1, target_row, target_col, plev, SUMMON_ANT, mode);
                break;
        }
        case MS_S_SPIDER:
@@ -1144,7 +1146,7 @@ msg_print("
                        msg_print("You summons spiders.");
 #endif
                for (k = 0;k < 6; k++)
-                       summon_specific(-1, target_row, target_col, plev, SUMMON_SPIDER, TRUE, TRUE, TRUE, FALSE, FALSE);
+                       summon_specific(-1, target_row, target_col, plev, SUMMON_SPIDER, mode);
                break;
        }
        case MS_S_HOUND:
@@ -1157,7 +1159,7 @@ msg_print("
                        msg_print("You summons hounds.");
 #endif
                for (k = 0;k < 4; k++)
-                       summon_specific(-1, target_row, target_col, plev, SUMMON_HOUND, TRUE, TRUE, TRUE, FALSE, FALSE);
+                       summon_specific(-1, target_row, target_col, plev, SUMMON_HOUND, mode);
                break;
        }
        case MS_S_HYDRA:
@@ -1170,7 +1172,7 @@ msg_print("
                        msg_print("You summons hydras.");
 #endif
                for (k = 0;k < 4; k++)
-                       summon_specific(-1, target_row, target_col, plev, SUMMON_HYDRA, TRUE, TRUE, TRUE, FALSE, FALSE);
+                       summon_specific(-1, target_row, target_col, plev, SUMMON_HYDRA, mode);
                break;
        }
        case MS_S_ANGEL:
@@ -1183,7 +1185,7 @@ msg_print("ŷ
                        msg_print("You summons angel!");
 #endif
                for (k = 0;k < 1; k++)
-                       summon_specific(-1, target_row, target_col, plev, SUMMON_ANGEL, TRUE, TRUE, TRUE, FALSE, FALSE);
+                       summon_specific(-1, target_row, target_col, plev, SUMMON_ANGEL, mode);
                break;
        }
        case MS_S_DEMON:
@@ -1196,7 +1198,7 @@ msg_print("
                        msg_print("You summons a demon from the Courts of Chaos!");
 #endif
                for (k = 0;k < 1; k++)
-                       summon_specific(-1, target_row, target_col, plev, SUMMON_DEMON, TRUE, TRUE, TRUE, unique_okay, FALSE);
+                       summon_specific(-1, target_row, target_col, plev, SUMMON_DEMON, (mode | u_mode));
                break;
        }
        case MS_S_UNDEAD:
@@ -1209,7 +1211,7 @@ msg_print("
                        msg_print("You summons an undead adversary!");
 #endif
                for (k = 0;k < 1; k++)
-                       summon_specific(-1, target_row, target_col, plev, SUMMON_UNDEAD, TRUE, TRUE, TRUE, unique_okay, FALSE);
+                       summon_specific(-1, target_row, target_col, plev, SUMMON_UNDEAD, (mode | u_mode));
                break;
        }
        case MS_S_DRAGON:
@@ -1222,7 +1224,7 @@ msg_print("
                        msg_print("You summons dragon!");
 #endif
                for (k = 0;k < 1; k++)
-                       summon_specific(-1, target_row, target_col, plev, SUMMON_DRAGON, TRUE, TRUE, TRUE, unique_okay, FALSE);
+                       summon_specific(-1, target_row, target_col, plev, SUMMON_DRAGON, (mode | u_mode));
                break;
        }
        case MS_S_HI_UNDEAD:
@@ -1235,7 +1237,7 @@ msg_print("
                        msg_print("You summons greater undead!");
 #endif
                for (k = 0;k < 6; k++)
-                       summon_specific(-1, target_row, target_col, plev, SUMMON_HI_UNDEAD, TRUE, TRUE, TRUE, unique_okay, FALSE);
+                       summon_specific(-1, target_row, target_col, plev, SUMMON_HI_UNDEAD, (mode | u_mode));
                break;
        }
        case MS_S_HI_DRAGON:
@@ -1248,7 +1250,7 @@ msg_print("
                        msg_print("You summons ancient dragons!");
 #endif
                for (k = 0;k < 4; k++)
-                       summon_specific(-1, target_row, target_col, plev, SUMMON_HI_DRAGON, TRUE, TRUE, TRUE, unique_okay, FALSE);
+                       summon_specific(-1, target_row, target_col, plev, SUMMON_HI_DRAGON, (mode | u_mode));
                break;
        }
        case MS_S_AMBERITE:
@@ -1261,7 +1263,7 @@ msg_print("
                        msg_print("You summons Lords of Amber!");
 #endif
                for (k = 0;k < 4; k++)
-                       summon_specific(-1, target_row, target_col, plev, SUMMON_AMBERITES, TRUE, TRUE, TRUE, TRUE, FALSE);
+                       summon_specific(-1, target_row, target_col, plev, SUMMON_AMBERITES, (mode | PM_ALLOW_UNIQUE));
                break;
        }
        case MS_S_UNIQUE:
@@ -1274,9 +1276,9 @@ msg_print("
                        msg_print("You summons special opponents!");
 #endif
                for (k = 0;k < 4; k++)
-                       if (summon_specific(-1, target_row, target_col, plev, SUMMON_UNIQUE, TRUE, TRUE, TRUE, TRUE, FALSE)) count++;
+                       if (summon_specific(-1, target_row, target_col, plev, SUMMON_UNIQUE, (mode | PM_ALLOW_UNIQUE))) count++;
                for (k = count;k < 4; k++)
-                       summon_specific(-1, target_row, target_col, plev, SUMMON_HI_UNDEAD, TRUE, TRUE, TRUE, unique_okay, FALSE);
+                       summon_specific(-1, target_row, target_col, plev, SUMMON_HI_UNDEAD, (mode | u_mode));
                break;
        }
        default:
index a5d8d3b..a68ad93 100644 (file)
@@ -2833,7 +2833,7 @@ msg_format("%^s
                if ((k < 4) && (!k || !randint0(k * MON_MULT_ADJ)))
                {
                        /* Try to multiply */
-                       if (multiply_monster(m_idx, FALSE, is_friendly(m_ptr), is_pet(m_ptr)))
+                       if (multiply_monster(m_idx, FALSE, (is_pet(m_ptr) ? PM_FORCE_PET : 0)))
                        {
                                /* Take note if visible */
                                if (m_ptr->ml)
index 1baa247..e53af3b 100644 (file)
@@ -1211,7 +1211,7 @@ msg_format("%s
                bool success = FALSE;
 
                for (i = 0; i < 1 + boost/100; i++)
-                       if (summon_specific(-1, py, px, plev, SUMMON_PHANTOM, FALSE, TRUE, TRUE, FALSE, FALSE))
+                       if (summon_specific(-1, py, px, plev, SUMMON_PHANTOM, PM_FORCE_PET))
                                success = TRUE;
                if (success)
                {
index 11166f0..b549d0d 100644 (file)
@@ -581,7 +581,7 @@ static int summon_specific_who = -1;
 /*
  * Hack -- the hostility of the summoned monster
  */
-static int summon_specific_hostile = TRUE;
+static bool summon_specific_hostile = TRUE;
 
 static bool summon_unique_okay = FALSE;
 
@@ -2690,7 +2690,8 @@ static int initial_r_appearance(int r_idx)
  * This is the only function which may place a monster in the dungeon,
  * except for the savefile loading code.
  */
-bool place_monster_one(int who, int y, int x, int r_idx, bool slp, bool friendly, bool pet, bool no_pet)
+//bool place_monster_one(int who, int y, int x, int r_idx, bool slp, bool friendly, bool pet, bool no_pet)
+bool place_monster_one(int who, int y, int x, int r_idx, u32b mode)
 {
        int                     i;
        int rune_dam = 0;
@@ -2942,29 +2943,32 @@ msg_print("
                m_ptr->mflag2 |= MFLAG_KAGE;
        }
 
-       if (no_pet) m_ptr->mflag2 |= MFLAG_NOPET;
+       if (mode & PM_NO_PET) m_ptr->mflag2 |= MFLAG_NOPET;
 
        /* Not visible */
        m_ptr->ml = FALSE;
 
        /* Pet? */
-       if (pet)
+       if (mode & PM_FORCE_PET)
        {
                set_pet(m_ptr);
        }
        /* Friendly? */
-       else if ((friendly || (r_ptr->flags7 & RF7_FRIENDLY)) &&
-                !(p_ptr->align >= 0 && (r_ptr->flags3 & RF3_EVIL)) &&
-                !(p_ptr->align < 0 && (r_ptr->flags3 & RF3_GOOD)))
+       else if ((r_ptr->flags7 & RF7_FRIENDLY) ||
+                (mode & PM_FORCE_FRIENDLY) || is_friendly_idx(who))
        {
-               set_friendly(m_ptr);
+               if (!(p_ptr->align >= 0 && (r_ptr->flags3 & RF3_EVIL)) &&
+                   !(p_ptr->align < 0 && (r_ptr->flags3 & RF3_GOOD)))
+               {
+                       set_friendly(m_ptr);
+               }
        }
 
        /* Assume no sleeping */
        m_ptr->csleep = 0;
 
        /* Enforce sleeping if needed */
-       if (slp && r_ptr->sleep && !ironman_nightmare)
+       if ((mode & PM_ALLOW_SLEEP) && r_ptr->sleep && !ironman_nightmare)
        {
                int val = r_ptr->sleep;
                m_ptr->csleep = ((val * 2) + randint1(val * 10));
@@ -3242,7 +3246,8 @@ static bool mon_scatter(int *yp, int *xp, int y, int x, int max_dist)
 /*
  * Attempt to place a "group" of monsters around the given location
  */
-static bool place_monster_group(int who, int y, int x, int r_idx, bool slp, bool friendly, bool pet, bool no_pet)
+//static bool place_monster_group(int who, int y, int x, int r_idx, bool slp, bool friendly, bool pet, bool no_pet)
+static bool place_monster_group(int who, int y, int x, int r_idx, u32b mode)
 {
        monster_race *r_ptr = &r_info[r_idx];
 
@@ -3311,7 +3316,7 @@ static bool place_monster_group(int who, int y, int x, int r_idx, bool slp, bool
                        if (!cave_empty_bold2(my, mx)) continue;
 
                        /* Attempt to place another monster */
-                       if (place_monster_one(who, my, mx, r_idx, slp, friendly, pet, no_pet))
+                       if (place_monster_one(who, my, mx, r_idx, mode))
                        {
                                /* Add it to the "hack" set */
                                hack_y[hack_n] = my;
@@ -3399,28 +3404,31 @@ static bool place_monster_okay(int r_idx)
  * Note the use of the new "monster allocation table" code to restrict
  * the "get_mon_num()" function to "legal" escort types.
  */
-bool place_monster_aux(int who, int y, int x, int r_idx, bool slp, bool grp, bool friendly, bool pet, bool no_kage, bool no_pet)
+//bool place_monster_aux(int who, int y, int x, int r_idx, bool slp, bool grp, bool friendly, bool pet, bool no_kage, bool no_pet)
+bool place_monster_aux(int who, int y, int x, int r_idx, u32b mode)
 {
        int             i;
        monster_race    *r_ptr = &r_info[r_idx];
 
-       if (one_in_(333) && !no_kage && !pet) is_kage = TRUE;
-       else is_kage = FALSE;
+       if (one_in_(333) && !(mode & PM_NO_KAGE) && !(mode & PM_FORCE_PET))
+               is_kage = TRUE;
+       else
+               is_kage = FALSE;
 
        /* Place one monster, or fail */
-       if (!place_monster_one(who, y, x, r_idx, slp, friendly, pet, no_pet)) return (FALSE);
+       if (!place_monster_one(who, y, x, r_idx, mode)) return (FALSE);
 
 
        /* Require the "group" flag */
-       if (!grp) return (TRUE);
-       place_monster_m_idx = hack_m_idx_ii;
+       if (!(mode & PM_ALLOW_GROUP)) return (TRUE);
 
+       place_monster_m_idx = hack_m_idx_ii;
 
        /* Friends for certain monsters */
        if (r_ptr->flags1 & (RF1_FRIENDS))
        {
                /* Attempt to place a group */
-               (void)place_monster_group(who, y, x, r_idx, slp, friendly, pet, no_pet);
+               (void)place_monster_group(who, y, x, r_idx, mode);
        }
 
 
@@ -3451,14 +3459,14 @@ bool place_monster_aux(int who, int y, int x, int r_idx, bool slp, bool grp, boo
                        if (!z) break;
 
                        /* Place a single escort */
-                       (void)place_monster_one(place_monster_m_idx, ny, nx, z, slp, friendly, pet, no_pet);
+                       (void)place_monster_one(place_monster_m_idx, ny, nx, z, mode);
 
                        /* Place a "group" of escorts if needed */
                        if ((r_info[z].flags1 & RF1_FRIENDS) ||
                            (r_ptr->flags1 & RF1_ESCORTS))
                        {
                                /* Place a group of monsters */
-                               (void)place_monster_group(place_monster_m_idx, ny, nx, z, slp, friendly, pet, no_pet);
+                               (void)place_monster_group(place_monster_m_idx, ny, nx, z, mode);
                        }
                }
        }
@@ -3473,7 +3481,8 @@ bool place_monster_aux(int who, int y, int x, int r_idx, bool slp, bool grp, boo
  *
  * Attempt to find a monster appropriate to the "monster_level"
  */
-bool place_monster(int y, int x, bool slp, bool grp)
+//bool place_monster(int y, int x, bool slp, bool grp)
+bool place_monster(int y, int x, u32b mode)
 {
        int r_idx;
 
@@ -3487,7 +3496,7 @@ bool place_monster(int y, int x, bool slp, bool grp)
        if (!r_idx) return (FALSE);
 
        /* Attempt to place the monster */
-       if (place_monster_aux(0, y, x, r_idx, slp, grp, FALSE, FALSE, FALSE, FALSE)) return (TRUE);
+       if (place_monster_aux(0, y, x, r_idx, mode)) return (TRUE);
 
        /* Oops */
        return (FALSE);
@@ -3533,7 +3542,7 @@ bool alloc_horde(int y, int x)
        while (--attempts)
        {
                /* Attempt to place the monster */
-               if (place_monster_aux(0, y, x, r_idx, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE)) break;
+               if (place_monster_aux(0, y, x, r_idx, 0L)) break;
        }
 
        if (attempts < 1) {horde_align = 0;return FALSE;}
@@ -3547,7 +3556,7 @@ bool alloc_horde(int y, int x)
        {
                scatter(&cy, &cx, y, x, 5, 0);
 
-               (void)summon_specific(m_idx, cy, cx, dun_level + 5, SUMMON_KIN, TRUE, FALSE, FALSE, FALSE, FALSE);
+               (void)summon_specific(m_idx, cy, cx, dun_level + 5, SUMMON_KIN, PM_ALLOW_GROUP);
 
                y = cy;
                x = cx;
@@ -3570,7 +3579,8 @@ bool alloc_horde(int y, int x)
  *
  * Use "monster_level" for the monster level
  */
-bool alloc_monster(int dis, bool slp)
+//bool alloc_monster(int dis, bool slp)
+bool alloc_monster(int dis, u32b mode)
 {
        int                     y = 0, x = 0;
        int         attempts_left = 10000;
@@ -3594,7 +3604,7 @@ bool alloc_monster(int dis, bool slp)
                         if (cave_empty_bold2(oy, ox) && monster_can_cross_terrain(cave[oy][ox].feat, &r_info[guardian]))
                        {
                                /* Place the guardian */
-                               if (place_monster_aux(0, oy, ox, guardian, FALSE, TRUE, FALSE, FALSE, TRUE, TRUE)) break;
+                               if (place_monster_aux(0, oy, ox, guardian, (PM_ALLOW_GROUP | PM_NO_KAGE | PM_NO_PET))) break;
                        }
                         /* One less try */
                         try--;
@@ -3658,7 +3668,7 @@ if (cheat_hear) msg_print("
 #endif /* MONSTER_HORDES */
 
                /* Attempt to place the monster, allow groups */
-               if (place_monster(y, x, slp, TRUE)) return (TRUE);
+               if (place_monster(y, x, (mode | PM_ALLOW_GROUP))) return (TRUE);
 
 #ifdef MONSTER_HORDES
        }
@@ -3761,12 +3771,11 @@ static bool summon_specific_okay(int r_idx)
  *
  * Note that this function may not succeed, though this is very rare.
  */
-bool summon_specific(int who, int y1, int x1, int lev, int type, bool group, bool friendly, bool pet, bool unique_okay, bool no_pet)
+//bool summon_specific(int who, int y1, int x1, int lev, int type, bool group, bool friendly, bool pet, bool unique_okay, bool no_pet)
+bool summon_specific(int who, int y1, int x1, int lev, int type, u32b mode)
 {
        int x, y, r_idx;
 
-       bool no_kage = FALSE;
-
        if (p_ptr->inside_arena) return (FALSE);
 
        if (!mon_scatter(&y, &x, y1, x1, 2)) return FALSE;
@@ -3777,10 +3786,10 @@ bool summon_specific(int who, int y1, int x1, int lev, int type, bool group, boo
        /* Save the "summon" type */
        summon_specific_type = type;
 
-       summon_unique_okay = unique_okay;
+       summon_unique_okay = (mode & PM_ALLOW_UNIQUE) ? TRUE : FALSE;
 
        /* Save the hostility */
-       summon_specific_hostile = (!friendly && !pet);
+       summon_specific_hostile = (!(mode & PM_FORCE_FRIENDLY) && !(is_friendly_idx(who)) && !(mode & PM_FORCE_PET));
 
        /* Prepare allocation table */
        get_mon_num_prep(summon_specific_okay, get_monster_hook2(y, x));
@@ -3795,10 +3804,10 @@ bool summon_specific(int who, int y1, int x1, int lev, int type, bool group, boo
                return (FALSE);
        }
 
-       if ((type == SUMMON_BLUE_HORROR) || (type == SUMMON_DAWN)) no_kage = TRUE;
+       if ((type == SUMMON_BLUE_HORROR) || (type == SUMMON_DAWN)) mode |= PM_NO_KAGE;
 
        /* Attempt to place the monster (awake, allow groups) */
-       if (!place_monster_aux(who, y, x, r_idx, FALSE, group, friendly, pet, no_kage, no_pet))
+       if (!place_monster_aux(who, y, x, r_idx, mode))
        {
                summon_specific_type = 0;
                return (FALSE);
@@ -3810,7 +3819,8 @@ bool summon_specific(int who, int y1, int x1, int lev, int type, bool group, boo
 }
 
 /* A "dangerous" function, creates a pet of the specified type */
-bool summon_named_creature (int who, int oy, int ox, int r_idx, bool slp, bool group_ok, bool friendly, bool pet)
+//bool summon_named_creature (int who, int oy, int ox, int r_idx, bool slp, bool group_ok, bool friendly, bool pet)
+bool summon_named_creature (int who, int oy, int ox, int r_idx, u32b mode)
 {
        int x, y;
 
@@ -3825,7 +3835,7 @@ bool summon_named_creature (int who, int oy, int ox, int r_idx, bool slp, bool g
        if (!mon_scatter(&y, &x, oy, ox, 2)) return FALSE;
 
        /* Place it (allow groups) */
-       return place_monster_aux(who, y, x, r_idx, slp, group_ok, friendly, pet, TRUE, FALSE);
+       return place_monster_aux(who, y, x, r_idx, (mode | PM_NO_KAGE));
 }
 
 
@@ -3834,7 +3844,8 @@ bool summon_named_creature (int who, int oy, int ox, int r_idx, bool slp, bool g
  *
  * Note that "reproduction" REQUIRES empty space.
  */
-bool multiply_monster(int m_idx, bool clone, bool friendly, bool pet)
+//bool multiply_monster(int m_idx, bool clone, bool friendly, bool pet)
+bool multiply_monster(int m_idx, bool clone, u32b mode)
 {
        monster_type    *m_ptr = &m_list[m_idx];
 
@@ -3843,8 +3854,10 @@ bool multiply_monster(int m_idx, bool clone, bool friendly, bool pet)
        if (!mon_scatter(&y, &x, m_ptr->fy, m_ptr->fx, 1))
                return FALSE;
 
+       if (m_ptr->mflag2 & MFLAG_NOPET) mode |= PM_NO_PET;
+
        /* Create a new monster (awake, no groups) */
-       if (!place_monster_aux(m_idx, y, x, m_ptr->r_idx, FALSE, FALSE, friendly, pet, TRUE, (bool)(m_ptr->mflag2 & MFLAG_NOPET)))
+       if (!place_monster_aux(m_idx, y, x, m_ptr->r_idx, (mode | PM_NO_KAGE)))
                return FALSE;
 
        if (clone)
index e526f77..2e28738 100644 (file)
@@ -1238,6 +1238,7 @@ bool make_attack_spell(int m_idx)
        bool            no_inate = FALSE;
        bool            do_disi = FALSE;
        int             dam = 0;
+       u32b mode = 0L;
        int s_num_6 = (easy_band ? 2 : 6);
        int s_num_4 = (easy_band ? 1 : 4);
 
@@ -1559,6 +1560,7 @@ msg_format("%^s
                }
        }
 
+
        /* Cast the spell. */
        switch (thrown_spell)
        {
@@ -3652,7 +3654,7 @@ msg_format("%^s
                                if (p_ptr->inside_arena || p_ptr->inside_battle) return FALSE;
                                for (k = 0; k < 6; k++)
                                {
-                                       count += summon_specific(m_idx, m_ptr->fy, m_ptr->fx, rlev, SUMMON_BIZARRE1, TRUE, FALSE, FALSE, FALSE, FALSE);
+                                       count += summon_specific(m_idx, m_ptr->fy, m_ptr->fx, rlev, SUMMON_BIZARRE1, PM_ALLOW_GROUP);
                                }
                                return FALSE;
                                
@@ -3665,10 +3667,10 @@ msg_format("%^s
 
                                        if (p_ptr->inside_arena || p_ptr->inside_battle || !summon_possible(m_ptr->fy, m_ptr->fx)) return FALSE;
                                        delete_monster_idx(cave[m_ptr->fy][m_ptr->fx].m_idx);
-                                       summon_named_creature(0, dummy_y, dummy_x, MON_BANOR, FALSE, FALSE, is_friendly(m_ptr), FALSE);
+                                       summon_named_creature(0, dummy_y, dummy_x, MON_BANOR, mode);
                                        m_list[hack_m_idx_ii].hp = dummy_hp;
                                        m_list[hack_m_idx_ii].maxhp = dummy_maxhp;
-                                       summon_named_creature(0, dummy_y, dummy_x, MON_LUPART, FALSE, FALSE, is_friendly(m_ptr), FALSE);
+                                       summon_named_creature(0, dummy_y, dummy_x, MON_LUPART, mode);
                                        m_list[hack_m_idx_ii].hp = dummy_hp;
                                        m_list[hack_m_idx_ii].maxhp = dummy_maxhp;
 
@@ -3703,7 +3705,7 @@ msg_format("%^s
                                                        delete_monster_idx(k);
                                                }
                                        }
-                                       summon_named_creature(0, dummy_y, dummy_x, MON_BANORLUPART, FALSE, FALSE, is_friendly(m_ptr), FALSE);
+                                       summon_named_creature(0, dummy_y, dummy_x, MON_BANORLUPART, mode);
                                        m_list[hack_m_idx_ii].hp = dummy_hp;
                                        m_list[hack_m_idx_ii].maxhp = dummy_maxhp;
 
@@ -3984,9 +3986,10 @@ else msg_format("%^s
                        if(m_ptr->r_idx == MON_ROLENTO)
                        {
                                int num = 1 + randint1(3);
+
                                for (k = 0; k < num; k++)
                                {
-                                       count += summon_named_creature(m_idx, y, x, MON_SHURYUUDAN, FALSE, FALSE, is_friendly(m_ptr), is_pet(m_ptr));
+                                       count += summon_named_creature(m_idx, y, x, MON_SHURYUUDAN, mode);
                                }
                        }
                        else if(m_ptr->r_idx == MON_LOUSY)
@@ -3994,7 +3997,7 @@ else msg_format("%^s
                                int num = 2 + randint1(3);
                                for (k = 0; k < num; k++)
                                {
-                                       count += summon_specific(m_idx, y, x, rlev, SUMMON_LOUSE, TRUE, FALSE, FALSE, FALSE, FALSE);
+                                       count += summon_specific(m_idx, y, x, rlev, SUMMON_LOUSE, PM_ALLOW_GROUP);
                                }
                        }
                        else if(m_ptr->r_idx == MON_BULLGATES)
@@ -4002,7 +4005,7 @@ else msg_format("%^s
                                int num = 2 + randint1(3);
                                for (k = 0; k < num; k++)
                                {
-                                       count += summon_named_creature(m_idx, y, x, 921, FALSE, FALSE, is_friendly(m_ptr), is_pet(m_ptr));
+                                       count += summon_named_creature(m_idx, y, x, 921, mode);
                                }
                        }
                        else if (m_ptr->r_idx == MON_CALDARM)
@@ -4010,7 +4013,7 @@ else msg_format("%^s
                                int num = randint1(3);
                                for (k = 0; k < num; k++)
                                {
-                                       count += summon_named_creature(m_idx, y, x, 930, FALSE, FALSE, is_friendly(m_ptr), is_pet(m_ptr));
+                                       count += summon_named_creature(m_idx, y, x, 930, mode);
                                }
                        }
                        else if (m_ptr->r_idx == MON_SERPENT || m_ptr->r_idx == MON_ZOMBI_SERPENT)
@@ -4029,7 +4032,7 @@ else msg_format("%^s
 
                                for (k = 0; k < num; k++)
                                {
-                                       count += summon_specific(m_idx, y, x, rlev, SUMMON_GUARDIANS, TRUE, FALSE, FALSE, TRUE, FALSE);
+                                       count += summon_specific(m_idx, y, x, rlev, SUMMON_GUARDIANS, (PM_ALLOW_GROUP | PM_ALLOW_UNIQUE));
                                }
                        }
                        else
@@ -4039,7 +4042,7 @@ else msg_format("%^s
 
                                for (k = 0; k < 4; k++)
                                {
-                                       count += summon_specific(m_idx, y, x, rlev, SUMMON_KIN, TRUE, FALSE, FALSE, FALSE, FALSE);
+                                       count += summon_specific(m_idx, y, x, rlev, SUMMON_KIN, PM_ALLOW_GROUP);
                                }
                        }
 #ifdef JP
@@ -4096,7 +4099,7 @@ else msg_format("%^s
 
                        for (k = 0; k < 1; k++)
                        {
-                               count += summon_specific(m_idx, y, x, rlev, 0, TRUE, FALSE, FALSE, TRUE, FALSE);
+                               count += summon_specific(m_idx, y, x, rlev, 0, (PM_ALLOW_GROUP | PM_ALLOW_UNIQUE));
                        }
 #ifdef JP
 if (blind && count) msg_print("²¿¤«¤¬´Ö¶á¤Ë¸½¤ì¤¿²»¤¬¤¹¤ë¡£");
@@ -4125,7 +4128,7 @@ else msg_format("%^s
 
                        for (k = 0; k < s_num_6; k++)
                        {
-                               count += summon_specific(m_idx, y, x, rlev, 0, TRUE, FALSE, FALSE, TRUE, FALSE);
+                               count += summon_specific(m_idx, y, x, rlev, 0, (PM_ALLOW_GROUP | PM_ALLOW_UNIQUE));
                        }
 #ifdef JP
 if (blind && count) msg_print("¿¤¯¤Î¤â¤Î¤¬´Ö¶á¤Ë¸½¤ì¤¿²»¤¬¤¹¤ë¡£");
@@ -4154,7 +4157,7 @@ else msg_format("%^s
 
                        for (k = 0; k < s_num_6; k++)
                        {
-                               count += summon_specific(m_idx, y, x, rlev, SUMMON_ANT, TRUE, FALSE, FALSE, FALSE, FALSE);
+                               count += summon_specific(m_idx, y, x, rlev, SUMMON_ANT, PM_ALLOW_GROUP);
                        }
 #ifdef JP
 if (blind && count) msg_print("¿¤¯¤Î¤â¤Î¤¬´Ö¶á¤Ë¸½¤ì¤¿²»¤¬¤¹¤ë¡£");
@@ -4183,7 +4186,7 @@ else msg_format("%^s
 
                        for (k = 0; k < s_num_6; k++)
                        {
-                               count += summon_specific(m_idx, y, x, rlev, SUMMON_SPIDER, TRUE, FALSE, FALSE, FALSE, FALSE);
+                               count += summon_specific(m_idx, y, x, rlev, SUMMON_SPIDER, PM_ALLOW_GROUP);
                        }
 #ifdef JP
 if (blind && count) msg_print("¿¤¯¤Î¤â¤Î¤¬´Ö¶á¤Ë¸½¤ì¤¿²»¤¬¤¹¤ë¡£");
@@ -4212,7 +4215,7 @@ else msg_format("%^s
 
                        for (k = 0; k < s_num_4; k++)
                        {
-                               count += summon_specific(m_idx, y, x, rlev, SUMMON_HOUND, TRUE, FALSE, FALSE, FALSE, FALSE);
+                               count += summon_specific(m_idx, y, x, rlev, SUMMON_HOUND, PM_ALLOW_GROUP);
                        }
 #ifdef JP
 if (blind && count) msg_print("¿¤¯¤Î¤â¤Î¤¬´Ö¶á¤Ë¸½¤ì¤¿²»¤¬¤¹¤ë¡£");
@@ -4241,7 +4244,7 @@ else msg_format("%^s
 
                        for (k = 0; k < s_num_4; k++)
                        {
-                               count += summon_specific(m_idx, y, x, rlev, SUMMON_HYDRA, TRUE, FALSE, FALSE, FALSE, FALSE);
+                               count += summon_specific(m_idx, y, x, rlev, SUMMON_HYDRA, PM_ALLOW_GROUP);
                        }
 #ifdef JP
 if (blind && count) msg_print("¿¤¯¤Î¤â¤Î¤¬´Ö¶á¤Ë¸½¤ì¤¿²»¤¬¤¹¤ë¡£");
@@ -4277,7 +4280,7 @@ else msg_format("%^s
 
                        for (k = 0; k < num; k++)
                        {
-                               count += summon_specific(m_idx, y, x, rlev, SUMMON_ANGEL, TRUE, FALSE, FALSE, FALSE, FALSE);
+                               count += summon_specific(m_idx, y, x, rlev, SUMMON_ANGEL, PM_ALLOW_GROUP);
                        }
 
                        if (count < 2)
@@ -4318,7 +4321,7 @@ else msg_format("%^s
 
                        for (k = 0; k < 1; k++)
                        {
-                               count += summon_specific(m_idx, y, x, rlev, SUMMON_DEMON, TRUE, FALSE, FALSE, FALSE, FALSE);
+                               count += summon_specific(m_idx, y, x, rlev, SUMMON_DEMON, PM_ALLOW_GROUP);
                        }
 #ifdef JP
 if (blind && count) msg_print("²¿¤«¤¬´Ö¶á¤Ë¸½¤ì¤¿²»¤¬¤¹¤ë¡£");
@@ -4347,7 +4350,7 @@ else msg_format("%^s
 
                        for (k = 0; k < 1; k++)
                        {
-                               count += summon_specific(m_idx, y, x, rlev, SUMMON_UNDEAD, TRUE, FALSE, FALSE, FALSE, FALSE);
+                               count += summon_specific(m_idx, y, x, rlev, SUMMON_UNDEAD, PM_ALLOW_GROUP);
                        }
 #ifdef JP
 if (blind && count) msg_print("²¿¤«¤¬´Ö¶á¤Ë¸½¤ì¤¿²»¤¬¤¹¤ë¡£");
@@ -4376,7 +4379,7 @@ else msg_format("%^s
 
                        for (k = 0; k < 1; k++)
                        {
-                               count += summon_specific(m_idx, y, x, rlev, SUMMON_DRAGON, TRUE, FALSE, FALSE, FALSE, FALSE);
+                               count += summon_specific(m_idx, y, x, rlev, SUMMON_DRAGON, PM_ALLOW_GROUP);
                        }
 #ifdef JP
 if (blind && count) msg_print("²¿¤«¤¬´Ö¶á¤Ë¸½¤ì¤¿²»¤¬¤¹¤ë¡£");
@@ -4424,7 +4427,7 @@ else msg_format("%^s
                                        }
                                        if (!cave_floor_bold(cy, cx)) continue;
 
-                                       if (summon_named_creature(m_idx, cy, cx, MON_NAZGUL, FALSE, FALSE, is_friendly(m_ptr), is_pet(m_ptr)))
+                                       if (summon_named_creature(m_idx, cy, cx, MON_NAZGUL, mode))
                                        {
                                                y = cy;
                                                x = cx;
@@ -4467,7 +4470,7 @@ else msg_format("%^s
 
                                for (k = 0; k < s_num_6; k++)
                                {
-                                       count += summon_specific(m_idx, y, x, rlev, SUMMON_HI_UNDEAD, TRUE, FALSE, FALSE, TRUE, FALSE);
+                                       count += summon_specific(m_idx, y, x, rlev, SUMMON_HI_UNDEAD, (PM_ALLOW_GROUP | PM_ALLOW_UNIQUE));
                                }
                        }
                        if (blind && count)
@@ -4500,7 +4503,7 @@ else msg_format("%^s
 
                        for (k = 0; k < s_num_4; k++)
                        {
-                               count += summon_specific(m_idx, y, x, rlev, SUMMON_HI_DRAGON, TRUE, FALSE, FALSE, TRUE, FALSE);
+                               count += summon_specific(m_idx, y, x, rlev, SUMMON_HI_DRAGON, (PM_ALLOW_GROUP | PM_ALLOW_UNIQUE));
                        }
                        if (blind && count)
                        {
@@ -4534,7 +4537,7 @@ else msg_format("%^s
 
                        for (k = 0; k < s_num_4; k++)
                        {
-                               count += summon_specific(m_idx, y, x, rlev, SUMMON_AMBERITES, TRUE, FALSE, FALSE, TRUE, FALSE);
+                               count += summon_specific(m_idx, y, x, rlev, SUMMON_AMBERITES, (PM_ALLOW_GROUP | PM_ALLOW_UNIQUE));
                        }
                        if (blind && count)
                        {
@@ -4566,20 +4569,20 @@ else msg_format("%^s
 
                        for (k = 0; k < s_num_4; k++)
                        {
-                               count += summon_specific(m_idx, y, x, rlev, SUMMON_UNIQUE, TRUE, FALSE, FALSE, TRUE, FALSE);
+                               count += summon_specific(m_idx, y, x, rlev, SUMMON_UNIQUE, (PM_ALLOW_GROUP | PM_ALLOW_UNIQUE));
                        }
                        if (r_ptr->flags3 & RF3_GOOD)
                        {
                                for (k = count; k < s_num_4; k++)
                                {
-                                       count += summon_specific(m_idx, y, x, rlev, SUMMON_ANGEL, TRUE, FALSE, FALSE, TRUE, FALSE);
+                                       count += summon_specific(m_idx, y, x, rlev, SUMMON_ANGEL, (PM_ALLOW_GROUP | PM_ALLOW_UNIQUE));
                                }
                        }
                        else
                        {
                                for (k = count; k < s_num_4; k++)
                                {
-                                       count += summon_specific(m_idx, y, x, rlev, SUMMON_HI_UNDEAD, TRUE, FALSE, FALSE, TRUE, FALSE);
+                                       count += summon_specific(m_idx, y, x, rlev, SUMMON_HI_UNDEAD, (PM_ALLOW_GROUP | PM_ALLOW_UNIQUE));
                                }
                        }
                        if (blind && count)
index f5b1912..9e31390 100644 (file)
@@ -153,6 +153,7 @@ bool monst_spell_monst(int m_idx)
        int dam = 0;
        int start;
        int plus = 1;
+       u32b p_mode = 0L, u_mode = 0L;
        int s_num_6 = (easy_band ? 2 : 6);
        int s_num_4 = (easy_band ? 1 : 4);
 
@@ -187,9 +188,11 @@ bool monst_spell_monst(int m_idx)
        bool see_both;
        bool known;
 
-       bool friendly = is_friendly(m_ptr);
        bool pet = is_pet(m_ptr);
-       bool not_pet = (bool)(!pet);
+
+       /* Prepare flags for summoning */
+       if (pet) p_mode |= PM_FORCE_PET;
+       if (!pet) u_mode |= PM_ALLOW_UNIQUE;
 
        /* Cannot cast spells when confused */
        if (m_ptr->confused) return (FALSE);
@@ -3322,7 +3325,7 @@ msg_format("%^s
                                        {
                                                for (k = 0; k < 6; k++)
                                                {
-                                                       summon_specific(m_idx, m_ptr->fy, m_ptr->fx, rlev, SUMMON_BIZARRE1, TRUE, FALSE, FALSE, FALSE, FALSE);
+                                                       summon_specific(m_idx, m_ptr->fy, m_ptr->fx, rlev, SUMMON_BIZARRE1, PM_ALLOW_GROUP);
                                                }
                                                return FALSE;
                                        }
@@ -3577,7 +3580,7 @@ msg_format("%s
                                        int num = 1 + randint1(3);
                                        for (k = 0; k < num; k++)
                                        {
-                                               count += summon_named_creature(m_idx, y, x, MON_SHURYUUDAN, FALSE, FALSE, is_friendly(m_ptr), pet);
+                                               count += summon_named_creature(m_idx, y, x, MON_SHURYUUDAN, p_mode);
                                        }
                                }
                                else if(m_ptr->r_idx == MON_LOUSY)
@@ -3585,7 +3588,7 @@ msg_format("%s
                                        int num = 2 + randint1(3);
                                        for (k = 0; k < num; k++)
                                        {
-                                               count += summon_specific(m_idx, y, x, rlev, SUMMON_LOUSE, TRUE, friendly, pet, FALSE, FALSE);
+                                               count += summon_specific(m_idx, y, x, rlev, SUMMON_LOUSE, (PM_ALLOW_GROUP | p_mode));
                                        }
                                }
                                else if(m_ptr->r_idx == MON_BULLGATES)
@@ -3593,7 +3596,7 @@ msg_format("%s
                                        int num = 2 + randint1(3);
                                        for (k = 0; k < num; k++)
                                        {
-                                               count += summon_named_creature(m_idx, y, x, 921, FALSE, FALSE, is_friendly(m_ptr), FALSE);
+                                               count += summon_named_creature(m_idx, y, x, 921, p_mode);
                                        }
                                }
                                else if (m_ptr->r_idx == MON_CALDARM)
@@ -3601,7 +3604,7 @@ msg_format("%s
                                        int num = randint1(3);
                                        for (k = 0; k < num; k++)
                                        {
-                                               count += summon_named_creature(m_idx, y, x, 930, FALSE, FALSE, is_friendly(m_ptr), FALSE);
+                                               count += summon_named_creature(m_idx, y, x, 930, p_mode);
                                        }
                                }
                                else if (m_ptr->r_idx == MON_SERPENT || m_ptr->r_idx == MON_ZOMBI_SERPENT)
@@ -3609,7 +3612,7 @@ msg_format("%s
                                        int num = 2 + randint1(3);
                                        for (k = 0; k < num; k++)
                                        {
-                                               count += summon_specific(m_idx, y, x, rlev, SUMMON_GUARDIANS, TRUE, friendly, pet, TRUE, FALSE);
+                                               count += summon_specific(m_idx, y, x, rlev, SUMMON_GUARDIANS, (PM_ALLOW_GROUP | p_mode | PM_ALLOW_UNIQUE));
                                        }
                                }
                                else
@@ -3618,7 +3621,7 @@ msg_format("%s
 
                                        for (k = 0; k < 4; k++)
                                        {
-                                               count += summon_specific(m_idx, y, x, rlev, SUMMON_KIN, TRUE, friendly, pet, FALSE, FALSE);
+                                               count += summon_specific(m_idx, y, x, rlev, SUMMON_KIN, (PM_ALLOW_GROUP | p_mode));
                                        }
                                }
 
@@ -3652,9 +3655,9 @@ msg_format("%^s
                                        }
                                }
 
-                               if (friendly)
+                               if (is_friendly(m_ptr))
                                {
-                                       count += summon_specific(m_idx, y, x, rlev, SUMMON_CYBER, TRUE, TRUE, pet, FALSE, FALSE);
+                                       count += summon_specific(m_idx, y, x, rlev, SUMMON_CYBER, (PM_ALLOW_GROUP | p_mode));
                                }
                                else
                                {
@@ -3691,7 +3694,7 @@ msg_format("%^s
                                        }
                                }
 
-                               count += summon_specific(m_idx, y, x, rlev, 0, FALSE, friendly, pet, not_pet, FALSE);
+                               count += summon_specific(m_idx, y, x, rlev, 0, (p_mode | u_mode));
 
                                if (known && !see_t && count)
                                {
@@ -3725,7 +3728,7 @@ msg_format("%^s
 
                                for (k = 0; k < s_num_6; k++)
                                {
-                                       count += summon_specific(m_idx, y, x, rlev, 0, TRUE, friendly, pet, not_pet, FALSE);
+                                       count += summon_specific(m_idx, y, x, rlev, 0, (PM_ALLOW_GROUP | p_mode | u_mode));
                                }
 
                                if (known && !see_t && count)
@@ -3760,7 +3763,7 @@ msg_format("%^s
 
                                for (k = 0; k < s_num_6; k++)
                                {
-                                       count += summon_specific(m_idx, y, x, rlev, SUMMON_ANT, TRUE, friendly, pet, FALSE, FALSE);
+                                       count += summon_specific(m_idx, y, x, rlev, SUMMON_ANT, (PM_ALLOW_GROUP | p_mode));
                                }
 
                                if (known && !see_t && count)
@@ -3795,7 +3798,7 @@ msg_format("%^s
 
                                for (k = 0; k < s_num_6; k++)
                                {
-                                       count += summon_specific(m_idx, y, x, rlev, SUMMON_SPIDER, TRUE, friendly, pet, FALSE, FALSE);
+                                       count += summon_specific(m_idx, y, x, rlev, SUMMON_SPIDER, (PM_ALLOW_GROUP | p_mode));
                                }
 
                                if (known && !see_t && count)
@@ -3830,7 +3833,7 @@ msg_format("%^s
 
                                for (k = 0; k < s_num_4; k++)
                                {
-                                       count += summon_specific(m_idx, y, x, rlev, SUMMON_HOUND, TRUE, friendly, pet, FALSE, FALSE);
+                                       count += summon_specific(m_idx, y, x, rlev, SUMMON_HOUND, (PM_ALLOW_GROUP | p_mode));
                                }
 
                                if (known && !see_t && count)
@@ -3865,7 +3868,7 @@ msg_format("%^s
 
                                for (k = 0; k < s_num_4; k++)
                                {
-                                       count += summon_specific(m_idx, y, x, rlev, SUMMON_HYDRA, TRUE, friendly, pet, FALSE, FALSE);
+                                       count += summon_specific(m_idx, y, x, rlev, SUMMON_HYDRA, (PM_ALLOW_GROUP | p_mode));
                                }
 
                                if (known && !see_t && count)
@@ -3906,7 +3909,7 @@ msg_format("%^s
 
                                for (k = 0; k < num; k++)
                                {
-                                       count += summon_specific(m_idx, y, x, rlev, SUMMON_ANGEL, TRUE, friendly, pet, FALSE, FALSE);
+                                       count += summon_specific(m_idx, y, x, rlev, SUMMON_ANGEL, (PM_ALLOW_GROUP | p_mode));
                                }
 
                                if (known && !see_t && count)
@@ -3941,7 +3944,7 @@ msg_format("%^s
 
                                for (k = 0; k < 1; k++)
                                {
-                                       count += summon_specific(m_idx, y, x, rlev, SUMMON_DEMON, TRUE, friendly, pet, FALSE, FALSE);
+                                       count += summon_specific(m_idx, y, x, rlev, SUMMON_DEMON, (PM_ALLOW_GROUP | p_mode));
                                }
 
                                if (known && !see_t && count)
@@ -3976,7 +3979,7 @@ msg_format("%s
 
                                for (k = 0; k < 1; k++)
                                {
-                                       count += summon_specific(m_idx, y, x, rlev, SUMMON_UNDEAD, TRUE, friendly, pet, FALSE, FALSE);
+                                       count += summon_specific(m_idx, y, x, rlev, SUMMON_UNDEAD, (PM_ALLOW_GROUP | p_mode));
                                }
 
                                if (known && !see_t && count)
@@ -4011,7 +4014,7 @@ msg_format("%^s
 
                                for (k = 0; k < 1; k++)
                                {
-                                       count += summon_specific(m_idx, y, x, rlev, SUMMON_DRAGON, TRUE, friendly, pet, FALSE, FALSE);
+                                       count += summon_specific(m_idx, y, x, rlev, SUMMON_DRAGON, (PM_ALLOW_GROUP | p_mode));
                                }
 
                                if (known && !see_t && count)
@@ -4046,7 +4049,7 @@ msg_format("%s
 
                                for (k = 0; k < s_num_6; k++)
                                {
-                                       count += summon_specific(m_idx, y, x, rlev, SUMMON_HI_UNDEAD, TRUE, friendly, pet, not_pet, FALSE);
+                                       count += summon_specific(m_idx, y, x, rlev, SUMMON_HI_UNDEAD, (PM_ALLOW_GROUP | p_mode | u_mode));
                                }
 
                                if (known && !see_t && count)
@@ -4081,7 +4084,7 @@ msg_format("%^s
 
                                for (k = 0; k < s_num_4; k++)
                                {
-                                       count += summon_specific(m_idx, y, x, rlev, SUMMON_HI_DRAGON, TRUE, friendly, pet, not_pet, FALSE);
+                                       count += summon_specific(m_idx, y, x, rlev, SUMMON_HI_DRAGON, (PM_ALLOW_GROUP | p_mode | u_mode));
                                }
 
                                if (known && !see_t && count)
@@ -4116,7 +4119,7 @@ msg_format("%^s
 
                                for (k = 0; k < s_num_4; k++)
                                {
-                                       count += summon_specific(m_idx, y, x, rlev, SUMMON_AMBERITES, TRUE, FALSE, FALSE, TRUE, FALSE);
+                                       count += summon_specific(m_idx, y, x, rlev, SUMMON_AMBERITES, (PM_ALLOW_GROUP | p_mode | PM_ALLOW_UNIQUE));
                                }
 
                                if (known && !see_t && count)
@@ -4151,7 +4154,7 @@ msg_format("%^s
 
                                for (k = 0; k < s_num_4; k++)
                                {
-                                       count += summon_specific(m_idx, y, x, rlev, SUMMON_UNIQUE, TRUE, FALSE, FALSE, TRUE, FALSE);
+                                       count += summon_specific(m_idx, y, x, rlev, SUMMON_UNIQUE, (PM_ALLOW_GROUP | p_mode | PM_ALLOW_UNIQUE));
                                }
 
                                if (known && !see_t && count)
index 5e1ec55..c24d6ac 100644 (file)
@@ -738,10 +738,20 @@ static bool cast_learned_spell(int spell, bool success)
        int             damage = 0;
        bool    unique_okay = FALSE;
        bool   pet = success;
-       bool   not_pet = (bool)(!pet);
        bool   no_trump = FALSE;
+       u32b p_mode, u_mode = 0L, g_mode;
 
-       if (!success || (randint1(50+plev) < plev/10)) unique_okay = TRUE;
+       if (pet)
+       {
+               p_mode = PM_FORCE_PET;
+       }
+       else
+       {
+               p_mode = PM_NO_PET;
+               g_mode = PM_ALLOW_GROUP;
+       }
+
+       if (!success || (randint1(50+plev) < plev/10)) u_mode = PM_ALLOW_UNIQUE;
 
        /* spell code */
        switch (spell)
@@ -1563,7 +1573,7 @@ msg_print("
 #endif
                for (k = 0;k < 1; k++)
                {
-                       if (summon_kin_player(pet, summon_lev, py, px, FALSE))
+                       if (summon_kin_player(summon_lev, py, px, (pet ? PM_FORCE_PET : 0L)))
                        {
                                if (!pet)
 #ifdef JP
@@ -1588,7 +1598,7 @@ msg_print("
                        msg_print("You summon a Cyberdemon!");
 #endif
                for (k = 0 ;k < 1 ; k++)
-                       if (summon_specific((pet ? -1 : 0), py, px, summon_lev, SUMMON_CYBER, FALSE, FALSE, pet, FALSE, not_pet))
+                       if (summon_specific((pet ? -1 : 0), py, px, summon_lev, SUMMON_CYBER, p_mode))
                        {
                                if (!pet)
 #ifdef JP
@@ -1612,7 +1622,7 @@ msg_print("
                        msg_print("You summon help.");
 #endif
                for (k = 0;k < 1; k++)
-                       if (summon_specific((pet ? -1 : 0), py, px, summon_lev, 0, FALSE, FALSE, pet, FALSE, not_pet))
+                       if (summon_specific((pet ? -1 : 0), py, px, summon_lev, 0, p_mode))
                        {
                                if (!pet)
 #ifdef JP
@@ -1636,7 +1646,7 @@ msg_print("
                        msg_print("You summon monsters!");
 #endif
                for (k = 0;k < plev / 15 + 2; k++)
-                       if(summon_specific((pet ? -1 : 0), py, px, summon_lev, 0, FALSE, FALSE, pet, unique_okay, not_pet))
+                       if(summon_specific((pet ? -1 : 0), py, px, summon_lev, 0, (p_mode | u_mode)))
                        {
                                if (!pet)
 #ifdef JP
@@ -1660,7 +1670,7 @@ msg_print("
                        msg_print("You summon ants.");
 #endif
                for (k = 0;k < 1; k++)
-                       if (summon_specific((pet ? -1 : 0), py, px, summon_lev, SUMMON_ANT, TRUE, FALSE, pet, FALSE, not_pet))
+                       if (summon_specific((pet ? -1 : 0), py, px, summon_lev, SUMMON_ANT, (PM_ALLOW_GROUP | p_mode)))
                        {
                                if (!pet)
 #ifdef JP
@@ -1684,7 +1694,7 @@ msg_print("
                        msg_print("You summon spiders.");
 #endif
                for (k = 0;k < 1; k++)
-                       if (summon_specific((pet ? -1 : 0), py, px, summon_lev, SUMMON_SPIDER, TRUE, FALSE, pet, FALSE, not_pet))
+                       if (summon_specific((pet ? -1 : 0), py, px, summon_lev, SUMMON_SPIDER, (PM_ALLOW_GROUP | p_mode)))
                        {
                                if (!pet)
 #ifdef JP
@@ -1708,7 +1718,7 @@ msg_print("
                        msg_print("You summon hounds.");
 #endif
                for (k = 0;k < 1; k++)
-                       if (summon_specific((pet ? -1 : 0), py, px, summon_lev, SUMMON_HOUND, TRUE, FALSE, pet, FALSE, not_pet))
+                       if (summon_specific((pet ? -1 : 0), py, px, summon_lev, SUMMON_HOUND, (PM_ALLOW_GROUP | p_mode)))
                        {
                                if (!pet)
 #ifdef JP
@@ -1732,7 +1742,7 @@ msg_print("
                        msg_print("You summon a hydras.");
 #endif
                for (k = 0;k < 1; k++)
-                       if (summon_specific((pet ? -1 : 0), py, px, summon_lev, SUMMON_HYDRA, not_pet, FALSE, pet, FALSE, not_pet))
+                       if (summon_specific((pet ? -1 : 0), py, px, summon_lev, SUMMON_HYDRA, (g_mode | p_mode)))
                        {
                                if (!pet)
 #ifdef JP
@@ -1756,7 +1766,7 @@ msg_print("ŷ
                        msg_print("You summon an angel!");
 #endif
                for (k = 0;k < 1; k++)
-                       if (summon_specific((pet ? -1 : 0), py, px, summon_lev, SUMMON_ANGEL, not_pet, FALSE, pet, FALSE, not_pet))
+                       if (summon_specific((pet ? -1 : 0), py, px, summon_lev, SUMMON_ANGEL, (g_mode | p_mode)))
                        {
                                if (!pet)
 #ifdef JP
@@ -1780,7 +1790,7 @@ msg_print("
                        msg_print("You summon a demon from the Courts of Chaos!");
 #endif
                for (k = 0;k < 1; k++)
-                       if (summon_specific((pet ? -1 : 0), py, px, summon_lev, SUMMON_DEMON, not_pet, FALSE, pet, FALSE, not_pet))
+                       if (summon_specific((pet ? -1 : 0), py, px, summon_lev, SUMMON_DEMON, (g_mode | p_mode)))
                        {
                                if (!pet)
 #ifdef JP
@@ -1804,7 +1814,7 @@ msg_print("
                        msg_print("You summon an undead adversary!");
 #endif
                for (k = 0;k < 1; k++)
-                       if (summon_specific((pet ? -1 : 0), py, px, summon_lev, SUMMON_UNDEAD, not_pet, FALSE, pet, FALSE, not_pet))
+                       if (summon_specific((pet ? -1 : 0), py, px, summon_lev, SUMMON_UNDEAD, (g_mode | p_mode)))
                        {
                                if (!pet)
 #ifdef JP
@@ -1828,7 +1838,7 @@ msg_print("
                        msg_print("You summon a dragon!");
 #endif
                for (k = 0;k < 1; k++)
-                       if (summon_specific((pet ? -1 : 0), py, px, summon_lev, SUMMON_DRAGON, not_pet, FALSE, pet, FALSE, not_pet))
+                       if (summon_specific((pet ? -1 : 0), py, px, summon_lev, SUMMON_DRAGON, (g_mode | p_mode)))
                        {
                                if (!pet)
 #ifdef JP
@@ -1852,7 +1862,7 @@ msg_print("
                        msg_print("You summon a greater undead!");
 #endif
                for (k = 0;k < 1; k++)
-                       if (summon_specific((pet ? -1 : 0), py, px, summon_lev, SUMMON_HI_UNDEAD, not_pet, FALSE, pet, unique_okay, not_pet))
+                       if (summon_specific((pet ? -1 : 0), py, px, summon_lev, SUMMON_HI_UNDEAD, (g_mode | p_mode | u_mode)))
                        {
                                if (!pet)
 #ifdef JP
@@ -1876,7 +1886,7 @@ msg_print("
                        msg_print("You summon an ancient dragon!");
 #endif
                for (k = 0;k < 1; k++)
-                       if (summon_specific((pet ? -1 : 0), py, px, summon_lev, SUMMON_HI_DRAGON, not_pet, FALSE, pet, unique_okay, not_pet))
+                       if (summon_specific((pet ? -1 : 0), py, px, summon_lev, SUMMON_HI_DRAGON, (g_mode | p_mode | u_mode)))
                        {
                                if (!pet)
 #ifdef JP
@@ -1900,7 +1910,7 @@ msg_print("
                        msg_print("You summon a Lord of Amber!");
 #endif
                for (k = 0;k < 1; k++)
-                       if (summon_specific((pet ? -1 : 0), py, px, summon_lev, SUMMON_AMBERITES, not_pet, FALSE, pet, unique_okay, not_pet))
+                       if (summon_specific((pet ? -1 : 0), py, px, summon_lev, SUMMON_AMBERITES, (g_mode | p_mode | u_mode)))
                        {
                                if (!pet)
 #ifdef JP
@@ -1924,7 +1934,7 @@ msg_print("
                        msg_print("You summon a special opponent!");
 #endif
                for (k = 0;k < 1; k++)
-                       if (summon_specific((pet ? -1 : 0), py, px, summon_lev, SUMMON_UNIQUE, not_pet, FALSE, pet, TRUE, not_pet))
+                       if (summon_specific((pet ? -1 : 0), py, px, summon_lev, SUMMON_UNIQUE, (g_mode | p_mode | PM_ALLOW_UNIQUE)))
                        {
                                count++;
                                if (!pet)
@@ -1935,7 +1945,7 @@ msg_print("Summoned special opponents are angry!");
 #endif
                        }
                for (k = count;k < 1; k++)
-                       if (summon_specific((pet ? -1 : 0), py, px, summon_lev, SUMMON_HI_UNDEAD, not_pet, FALSE, pet, TRUE, not_pet))
+                       if (summon_specific((pet ? -1 : 0), py, px, summon_lev, SUMMON_HI_UNDEAD, (g_mode | p_mode | PM_ALLOW_UNIQUE)))
                        {
                                count++;
                                if (!pet)
index 1d34866..7030b07 100644 (file)
@@ -3660,7 +3660,7 @@ msg_print("
                                int i;
                                for (i = 0; i < 8; i++)
                                {
-                                       summon_specific(-1, py, px, lvl, SUMMON_BIZARRE1, FALSE, TRUE, TRUE, FALSE, FALSE);
+                                       summon_specific(-1, py, px, lvl, SUMMON_BIZARRE1, PM_FORCE_PET);
                                }
                        }
                        break;
index 06d8d85..bb4138a 100644 (file)
@@ -1873,7 +1873,7 @@ msg_format("
                        int r_idx = what[randint0(64)];
 
                        /* Place that "random" monster (no groups) */
-                       (void)place_monster_aux(0, y, x, r_idx, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE);
+                       (void)place_monster_aux(0, y, x, r_idx, 0L);
                }
        }
 }
@@ -2133,51 +2133,51 @@ msg_format("%s
        /* Top and bottom rows */
        for (x = xval - 9; x <= xval + 9; x++)
        {
-               place_monster_aux(0, yval - 2, x, what[0], FALSE, FALSE, FALSE, FALSE, TRUE, FALSE);
-               place_monster_aux(0, yval + 2, x, what[0], FALSE, FALSE, FALSE, FALSE, TRUE, FALSE);
+               place_monster_aux(0, yval - 2, x, what[0], PM_NO_KAGE);
+               place_monster_aux(0, yval + 2, x, what[0], PM_NO_KAGE);
        }
 
        /* Middle columns */
        for (y = yval - 1; y <= yval + 1; y++)
        {
-               place_monster_aux(0, y, xval - 9, what[0], FALSE, FALSE, FALSE, FALSE, TRUE, FALSE);
-               place_monster_aux(0, y, xval + 9, what[0], FALSE, FALSE, FALSE, FALSE, TRUE, FALSE);
+               place_monster_aux(0, y, xval - 9, what[0], PM_NO_KAGE);
+               place_monster_aux(0, y, xval + 9, what[0], PM_NO_KAGE);
 
-               place_monster_aux(0, y, xval - 8, what[1], FALSE, FALSE, FALSE, FALSE, TRUE, FALSE);
-               place_monster_aux(0, y, xval + 8, what[1], FALSE, FALSE, FALSE, FALSE, TRUE, FALSE);
+               place_monster_aux(0, y, xval - 8, what[1], PM_NO_KAGE);
+               place_monster_aux(0, y, xval + 8, what[1], PM_NO_KAGE);
 
-               place_monster_aux(0, y, xval - 7, what[1], FALSE, FALSE, FALSE, FALSE, TRUE, FALSE);
-               place_monster_aux(0, y, xval + 7, what[1], FALSE, FALSE, FALSE, FALSE, TRUE, FALSE);
+               place_monster_aux(0, y, xval - 7, what[1], PM_NO_KAGE);
+               place_monster_aux(0, y, xval + 7, what[1], PM_NO_KAGE);
 
-               place_monster_aux(0, y, xval - 6, what[2], FALSE, FALSE, FALSE, FALSE, TRUE, FALSE);
-               place_monster_aux(0, y, xval + 6, what[2], FALSE, FALSE, FALSE, FALSE, TRUE, FALSE);
+               place_monster_aux(0, y, xval - 6, what[2], PM_NO_KAGE);
+               place_monster_aux(0, y, xval + 6, what[2], PM_NO_KAGE);
 
-               place_monster_aux(0, y, xval - 5, what[2], FALSE, FALSE, FALSE, FALSE, TRUE, FALSE);
-               place_monster_aux(0, y, xval + 5, what[2], FALSE, FALSE, FALSE, FALSE, TRUE, FALSE);
+               place_monster_aux(0, y, xval - 5, what[2], PM_NO_KAGE);
+               place_monster_aux(0, y, xval + 5, what[2], PM_NO_KAGE);
 
-               place_monster_aux(0, y, xval - 4, what[3], FALSE, FALSE, FALSE, FALSE, TRUE, FALSE);
-               place_monster_aux(0, y, xval + 4, what[3], FALSE, FALSE, FALSE, FALSE, TRUE, FALSE);
+               place_monster_aux(0, y, xval - 4, what[3], PM_NO_KAGE);
+               place_monster_aux(0, y, xval + 4, what[3], PM_NO_KAGE);
 
-               place_monster_aux(0, y, xval - 3, what[3], FALSE, FALSE, FALSE, FALSE, TRUE, FALSE);
-               place_monster_aux(0, y, xval + 3, what[3], FALSE, FALSE, FALSE, FALSE, TRUE, FALSE);
+               place_monster_aux(0, y, xval - 3, what[3], PM_NO_KAGE);
+               place_monster_aux(0, y, xval + 3, what[3], PM_NO_KAGE);
 
-               place_monster_aux(0, y, xval - 2, what[4], FALSE, FALSE, FALSE, FALSE, TRUE, FALSE);
-               place_monster_aux(0, y, xval + 2, what[4], FALSE, FALSE, FALSE, FALSE, TRUE, FALSE);
+               place_monster_aux(0, y, xval - 2, what[4], PM_NO_KAGE);
+               place_monster_aux(0, y, xval + 2, what[4], PM_NO_KAGE);
        }
 
        /* Above/Below the center monster */
        for (x = xval - 1; x <= xval + 1; x++)
        {
-               place_monster_aux(0, yval + 1, x, what[5], FALSE, FALSE, FALSE, FALSE, TRUE, FALSE);
-               place_monster_aux(0, yval - 1, x, what[5], FALSE, FALSE, FALSE, FALSE, TRUE, FALSE);
+               place_monster_aux(0, yval + 1, x, what[5], PM_NO_KAGE);
+               place_monster_aux(0, yval - 1, x, what[5], PM_NO_KAGE);
        }
 
        /* Next to the center monster */
-       place_monster_aux(0, yval, xval + 1, what[6], FALSE, FALSE, FALSE, FALSE, TRUE, FALSE);
-       place_monster_aux(0, yval, xval - 1, what[6], FALSE, FALSE, FALSE, FALSE, TRUE, FALSE);
+       place_monster_aux(0, yval, xval + 1, what[6], PM_NO_KAGE);
+       place_monster_aux(0, yval, xval - 1, what[6], PM_NO_KAGE);
 
        /* Center monster */
-       place_monster_aux(0, yval, xval, what[7], FALSE, FALSE, FALSE, FALSE, TRUE, FALSE);
+       place_monster_aux(0, yval, xval, what[7], PM_NO_KAGE);
 }
 
 
@@ -2349,7 +2349,7 @@ static void build_vault(int yval, int xval, int ymax, int xmax, cptr data,
                                case '&':
                                {
                                        monster_level = base_level + 5;
-                                       place_monster(y, x, TRUE, TRUE);
+                                       place_monster(y, x, (PM_ALLOW_SLEEP | PM_ALLOW_GROUP));
                                        monster_level = base_level;
                                        break;
                                }
@@ -2358,7 +2358,7 @@ static void build_vault(int yval, int xval, int ymax, int xmax, cptr data,
                                case '@':
                                {
                                        monster_level = base_level + 11;
-                                       place_monster(y, x, TRUE, TRUE);
+                                       place_monster(y, x, (PM_ALLOW_SLEEP | PM_ALLOW_GROUP));
                                        monster_level = base_level;
                                        break;
                                }
@@ -2367,7 +2367,7 @@ static void build_vault(int yval, int xval, int ymax, int xmax, cptr data,
                                case '9':
                                {
                                        monster_level = base_level + 9;
-                                       place_monster(y, x, TRUE, FALSE);
+                                       place_monster(y, x, PM_ALLOW_SLEEP);
                                        monster_level = base_level;
                                        object_level = base_level + 7;
                                        place_object(y, x, TRUE, FALSE);
@@ -2379,7 +2379,7 @@ static void build_vault(int yval, int xval, int ymax, int xmax, cptr data,
                                case '8':
                                {
                                        monster_level = base_level + 40;
-                                       place_monster(y, x, TRUE, FALSE);
+                                       place_monster(y, x, PM_ALLOW_SLEEP);
                                        monster_level = base_level;
                                        object_level = base_level + 20;
                                        place_object(y, x, TRUE, TRUE);
@@ -2393,7 +2393,7 @@ static void build_vault(int yval, int xval, int ymax, int xmax, cptr data,
                                        if (randint0(100) < 50)
                                        {
                                                monster_level = base_level + 3;
-                                               place_monster(y, x, TRUE, TRUE);
+                                               place_monster(y, x, (PM_ALLOW_SLEEP | PM_ALLOW_GROUP));
                                                monster_level = base_level;
                                        }
                                        if (randint0(100) < 50)
@@ -3665,7 +3665,7 @@ static void fill_treasure(int x1, int x2, int y1, int y2, int difficulty)
                                {
                                        /* Meanest monster + treasure */
                                        monster_level = base_level + 40;
-                                       place_monster(y, x, TRUE, TRUE);
+                                       place_monster(y, x, (PM_ALLOW_SLEEP | PM_ALLOW_GROUP));
                                        monster_level = base_level;
                                        object_level = base_level + 20;
                                        place_object(y, x, TRUE, FALSE);
@@ -3675,7 +3675,7 @@ static void fill_treasure(int x1, int x2, int y1, int y2, int difficulty)
                                {
                                        /* Mean monster +treasure */
                                        monster_level = base_level + 20;
-                                       place_monster(y, x, TRUE, TRUE);
+                                       place_monster(y, x, (PM_ALLOW_SLEEP | PM_ALLOW_GROUP));
                                        monster_level = base_level;
                                        object_level = base_level + 10;
                                        place_object(y, x, TRUE, FALSE);
@@ -3685,7 +3685,7 @@ static void fill_treasure(int x1, int x2, int y1, int y2, int difficulty)
                                {
                                        /* Monster */
                                        monster_level = base_level + 9;
-                                       place_monster(y, x, TRUE, TRUE);
+                                       place_monster(y, x, (PM_ALLOW_SLEEP | PM_ALLOW_GROUP));
                                        monster_level = base_level;
                                }
                                else if (value < 17)
@@ -3715,7 +3715,7 @@ static void fill_treasure(int x1, int x2, int y1, int y2, int difficulty)
                                {
                                        /* Monster and trap */
                                        monster_level = base_level + 5;
-                                       place_monster(y, x, TRUE, TRUE);
+                                       place_monster(y, x, (PM_ALLOW_SLEEP | PM_ALLOW_GROUP));
                                        monster_level = base_level;
                                        place_trap(y, x);
                                }
@@ -3725,7 +3725,7 @@ static void fill_treasure(int x1, int x2, int y1, int y2, int difficulty)
                                        if (randint0(100) < 50)
                                        {
                                                monster_level = base_level + 3;
-                                               place_monster(y, x, TRUE, TRUE);
+                                               place_monster(y, x, (PM_ALLOW_SLEEP | PM_ALLOW_GROUP));
                                                monster_level = base_level;
                                        }
                                        if (randint0(100) < 50)
@@ -3747,7 +3747,7 @@ static void fill_treasure(int x1, int x2, int y1, int y2, int difficulty)
                                        /* 20% monster, 40% trap, 20% object, 20% blank space */
                                        if (randint0(100) < 20)
                                        {
-                                               place_monster(y, x, TRUE, TRUE);
+                                               place_monster(y, x, (PM_ALLOW_SLEEP | PM_ALLOW_GROUP));
                                        }
                                        else if (randint0(100) < 50)
                                        {
index 08acf65..849029b 100644 (file)
@@ -1558,8 +1558,11 @@ msg_print("
                                if (o_ptr->tval == TV_CORPSE)
                                {
                                        int i;
-                                       bool friendly = (!who || is_friendly(&m_list[who]));
-                                       bool pet = (!who || is_pet(&m_list[who]));
+                                       u32b mode = 0L;
+
+                                       if (!who || is_pet(&m_list[who]))
+                                               mode |= PM_FORCE_PET;
+
                                        for (i = 0; i < o_ptr->number ; i++)
                                        {
                                                if (((o_ptr->sval == SV_CORPSE) && (randint1(100) > 80)) ||
@@ -1575,7 +1578,7 @@ note_kill = "
                                                        }
                                                        continue;
                                                }
-                                               else if (summon_named_creature(who, y, x, o_ptr->pval, FALSE, FALSE, friendly, pet))
+                                               else if (summon_named_creature(who, y, x, o_ptr->pval, mode))
                                                {
 #ifdef JP
 note_kill = "À¸¤­Ê֤ä¿¡£";
@@ -3411,9 +3414,6 @@ note = "
                /* Clone monsters (Ignore "dam") */
                case GF_OLD_CLONE:
                {
-                       bool friendly = FALSE;
-                       bool pet = FALSE;
-
                        if (seen) obvious = TRUE;
 
                        if (is_pet(m_ptr) || (r_ptr->flags1 & (RF1_UNIQUE | RF1_QUESTOR)) || (r_ptr->flags7 & (RF7_UNIQUE_7 | RF7_UNIQUE2)))
@@ -3430,7 +3430,7 @@ note = "
                                m_ptr->hp = m_ptr->maxhp;
 
                                /* Attempt to clone. */
-                               if (multiply_monster(c_ptr->m_idx, TRUE, friendly, pet))
+                               if (multiply_monster(c_ptr->m_idx, TRUE, 0L))
                                {
 #ifdef JP
 note = "¤¬Ê¬Îö¤·¤¿¡ª";
@@ -6157,17 +6157,13 @@ msg_print("
                                if (!one_in_(6)) break;
                        case 19: case 20: case 21: case 22:
                        {
-                               bool pet = FALSE, friendly = FALSE;
+                               bool pet = !one_in_(3);
+                               u32b mode = PM_ALLOW_GROUP;
 
-                               if (one_in_(3))
-                               {
-                                       friendly = TRUE;
-                               }
-                               else
-                               {
-                                       pet = TRUE;
-                               }
-                               count += summon_specific((pet ? -1 : 0), py, px, (pet ? p_ptr->lev*2/3+randint1(p_ptr->lev/2) : dun_level), 0, TRUE, friendly, pet, FALSE, (bool)(!pet));
+                               if (pet) mode |= PM_FORCE_PET;
+                               else mode |= (PM_NO_PET | PM_FORCE_FRIENDLY);
+
+                               count += summon_specific((pet ? -1 : 0), py, px, (pet ? p_ptr->lev*2/3+randint1(p_ptr->lev/2) : dun_level), 0, mode);
                                if (!one_in_(6)) break;
                        }
                        case 23: case 24: case 25:
index f4158f1..6d133eb 100644 (file)
@@ -6859,7 +6859,7 @@ msg_print("
                        (*count) += activate_hi_summon(py, px, FALSE);
                        if (!one_in_(6)) break;
                case 7: case 8: case 9: case 18:
-                       (*count) += summon_specific(0, py, px, dun_level, 0, TRUE, FALSE, FALSE, TRUE, TRUE);
+                       (*count) += summon_specific(0, py, px, dun_level, 0, (PM_ALLOW_GROUP | PM_ALLOW_UNIQUE | PM_NO_PET));
                        if (!one_in_(6)) break;
                case 10: case 11: case 12:
 #ifdef JP
@@ -6936,21 +6936,24 @@ int activate_hi_summon(int y, int x, bool can_pet)
 {
        int i;
        int count = 0;
-       bool pet = FALSE, friendly = FALSE, not_pet;
        int summon_lev;
+       u32b mode = PM_ALLOW_GROUP;
+       bool pet = FALSE;
 
        if (can_pet)
        {
                if (one_in_(4))
                {
-                       friendly = TRUE;
+                       mode |= PM_FORCE_FRIENDLY;
                }
                else
                {
+                       mode |= PM_FORCE_PET;
                        pet = TRUE;
                }
        }
-       not_pet = (bool)(!pet);
+
+       if (!pet) mode |= PM_NO_PET;
 
        summon_lev = (pet ? p_ptr->lev * 2 / 3 + randint1(p_ptr->lev / 2) : dun_level);
 
@@ -6959,48 +6962,51 @@ int activate_hi_summon(int y, int x, bool can_pet)
                switch (randint1(25) + (dun_level / 20))
                {
                        case 1: case 2:
-                               count += summon_specific((pet ? -1 : 0), y, x, summon_lev, SUMMON_ANT, TRUE, friendly, pet, FALSE, not_pet);
+                               count += summon_specific((pet ? -1 : 0), y, x, summon_lev, SUMMON_ANT, mode);
                                break;
                        case 3: case 4:
-                               count += summon_specific((pet ? -1 : 0), y, x, summon_lev, SUMMON_SPIDER, TRUE, friendly, pet, FALSE, not_pet);
+                               count += summon_specific((pet ? -1 : 0), y, x, summon_lev, SUMMON_SPIDER, mode);
                                break;
                        case 5: case 6:
-                               count += summon_specific((pet ? -1 : 0), y, x, summon_lev, SUMMON_HOUND, TRUE, friendly, pet, FALSE, not_pet);
+                               count += summon_specific((pet ? -1 : 0), y, x, summon_lev, SUMMON_HOUND, mode);
                                break;
                        case 7: case 8:
-                               count += summon_specific((pet ? -1 : 0), y, x, summon_lev, SUMMON_HYDRA, TRUE, friendly, pet, FALSE, not_pet);
+                               count += summon_specific((pet ? -1 : 0), y, x, summon_lev, SUMMON_HYDRA, mode);
                                break;
                        case 9: case 10:
-                               count += summon_specific((pet ? -1 : 0), y, x, summon_lev, SUMMON_ANGEL, TRUE, friendly, pet, FALSE, not_pet);
+                               count += summon_specific((pet ? -1 : 0), y, x, summon_lev, SUMMON_ANGEL, mode);
                                break;
                        case 11: case 12:
-                               count += summon_specific((pet ? -1 : 0), y, x, summon_lev, SUMMON_UNDEAD, TRUE, friendly, pet, FALSE, not_pet);
+                               count += summon_specific((pet ? -1 : 0), y, x, summon_lev, SUMMON_UNDEAD, mode);
                                break;
                        case 13: case 14:
-                               count += summon_specific((pet ? -1 : 0), y, x, summon_lev, SUMMON_DRAGON, TRUE, friendly, pet, FALSE, not_pet);
+                               count += summon_specific((pet ? -1 : 0), y, x, summon_lev, SUMMON_DRAGON, mode);
                                break;
                        case 15: case 16:
-                               count += summon_specific((pet ? -1 : 0), y, x, summon_lev, SUMMON_DEMON, TRUE, friendly, pet, FALSE, not_pet);
+                               count += summon_specific((pet ? -1 : 0), y, x, summon_lev, SUMMON_DEMON, mode);
                                break;
                        case 17:
-                               if (pet || friendly) break;
-                               count += summon_specific((pet ? -1 : 0), y, x, summon_lev, SUMMON_AMBERITES, TRUE, friendly, pet, TRUE, not_pet);
+                               if (can_pet) break;
+                               count += summon_specific((pet ? -1 : 0), y, x, summon_lev, SUMMON_AMBERITES, (mode | PM_ALLOW_UNIQUE));
                                break;
                        case 18: case 19:
-                               if (pet || friendly) break;
-                               count += summon_specific((pet ? -1 : 0), y, x, summon_lev, SUMMON_UNIQUE, TRUE, friendly, pet, TRUE, not_pet);
+                               if (can_pet) break;
+                               count += summon_specific((pet ? -1 : 0), y, x, summon_lev, SUMMON_UNIQUE, (mode | PM_ALLOW_UNIQUE));
                                break;
                        case 20: case 21:
-                               count += summon_specific((pet ? -1 : 0), y, x, summon_lev, SUMMON_HI_UNDEAD, TRUE, friendly, pet, (bool)(!friendly && !pet), not_pet);
+                               if (!can_pet) mode |= PM_ALLOW_UNIQUE;
+                               count += summon_specific((pet ? -1 : 0), y, x, summon_lev, SUMMON_HI_UNDEAD, mode);
                                break;
                        case 22: case 23:
-                               count += summon_specific((pet ? -1 : 0), y, x, summon_lev, SUMMON_HI_DRAGON, TRUE, friendly, pet, (bool)(!friendly && !pet), not_pet);
+                               if (!can_pet) mode |= PM_ALLOW_UNIQUE;
+                               count += summon_specific((pet ? -1 : 0), y, x, summon_lev, SUMMON_HI_DRAGON, mode);
                                break;
                        case 24:
-                               count += summon_specific((pet ? -1 : 0), y, x, 100, SUMMON_CYBER, TRUE, friendly, pet, FALSE, not_pet);
+                               count += summon_specific((pet ? -1 : 0), y, x, 100, SUMMON_CYBER, mode);
                                break;
                        default:
-                               count += summon_specific((pet ? -1 : 0), y, x,pet ? summon_lev : (((summon_lev * 3) / 2) + 5), 0, TRUE, friendly, pet, (bool)(!friendly && !pet), not_pet);
+                               if (!can_pet) mode |= PM_ALLOW_UNIQUE;
+                               count += summon_specific((pet ? -1 : 0), y, x,pet ? summon_lev : (((summon_lev * 3) / 2) + 5), 0, mode);
                }
        }
 
@@ -7014,23 +7020,20 @@ int summon_cyber(int who, int y, int x)
        int i;
        int max_cyber = (easy_band ? 1 : (dun_level / 50) + randint1(2));
        int count = 0;
-
-       bool friendly = FALSE;
-       bool pet = FALSE;
+       u32b mode = PM_ALLOW_GROUP;
 
        /* Summoned by a monster */
        if (who > 0)
        {
                monster_type *m_ptr = &m_list[who];
-               friendly = is_friendly(m_ptr);
-               pet = is_pet(m_ptr);
+               if (is_pet(m_ptr)) mode |= PM_FORCE_PET;
        }
 
        if (max_cyber > 4) max_cyber = 4;
 
        for (i = 0; i < max_cyber; i++)
        {
-               count += summon_specific(who, y, x, 100, SUMMON_CYBER, TRUE, friendly, pet, FALSE, FALSE);
+               count += summon_specific(who, y, x, 100, SUMMON_CYBER, mode);
        }
 
        return count;
index 96497ad..0a5aad4 100644 (file)
@@ -5505,7 +5505,6 @@ bool polymorph_monster(int y, int x)
 {
        cave_type *c_ptr = &cave[y][x];
        monster_type *m_ptr = &m_list[c_ptr->m_idx];
-       bool friendly, pet;
        bool polymorphed = FALSE;
        int new_r_idx;
        int old_r_idx = m_ptr->r_idx;
@@ -5520,21 +5519,24 @@ bool polymorph_monster(int y, int x)
        /* Memorize the monster before polymorphing */
        back_m = *m_ptr;
 
-       /* Get the monsters attitude */
-       friendly = is_friendly(m_ptr);
-       pet = is_pet(m_ptr);
-
        /* Pick a "new" monster race */
        new_r_idx = poly_r_idx(old_r_idx);
 
        /* Handle polymorph */
        if (new_r_idx != old_r_idx)
        {
+               u32b mode = 0L;
+
+               /* Get the monsters attitude */
+               if (is_friendly(m_ptr)) mode |= PM_FORCE_FRIENDLY;
+               if (is_pet(m_ptr)) mode |= PM_FORCE_PET;
+               if (m_ptr->mflag2 & MFLAG_NOPET) mode |= PM_NO_PET;
+
                /* "Kill" the "old" monster */
                delete_monster_idx(c_ptr->m_idx);
 
                /* Create a new monster (no groups) */
-               if (place_monster_aux(0, y, x, new_r_idx, FALSE, FALSE, friendly, pet, FALSE, (bool)(m_ptr->mflag2 & MFLAG_NOPET)))
+               if (place_monster_aux(0, y, x, new_r_idx, mode))
                {
                        /* Success */
                        polymorphed = TRUE;
@@ -5544,7 +5546,7 @@ bool polymorph_monster(int y, int x)
                        monster_terrain_sensitive = FALSE;
 
                        /* Placing the new monster failed */
-                       place_monster_aux(0, y, x, old_r_idx, FALSE, FALSE, friendly, pet, TRUE, (bool)(m_ptr->mflag2 & MFLAG_NOPET));
+                       place_monster_aux(0, y, x, old_r_idx, (mode | PM_NO_KAGE));
                        m_list[hack_m_idx_ii] = back_m;
 
                        monster_terrain_sensitive = TRUE;
@@ -5923,8 +5925,12 @@ msg_format("
 }
 
 
-bool summon_kin_player(bool pet, int level, int y, int x, bool group)
+//bool summon_kin_player(bool pet, int level, int y, int x, bool group)
+bool summon_kin_player(int level, int y, int x, u32b mode)
 {
+       bool pet = (bool)(mode & PM_FORCE_PET);
+       if (!pet) mode |= PM_NO_PET;
+
        switch (p_ptr->mimic_form)
        {
        case MIMIC_NONE:
@@ -6025,5 +6031,5 @@ bool summon_kin_player(bool pet, int level, int y, int x, bool group)
                summon_kin_type = 'V';
                break;
        }       
-       return summon_specific((pet ? -1 : 0), y, x, level, SUMMON_KIN, group, FALSE, pet, FALSE, (bool)(!pet));
+       return summon_specific((pet ? -1 : 0), y, x, level, SUMMON_KIN, mode);
 }
index 3bf5e04..de66e60 100644 (file)
@@ -1533,7 +1533,7 @@ static void do_cmd_wiz_summon(int num)
 
        for (i = 0; i < num; i++)
        {
-               (void)summon_specific(0, py, px, dun_level, 0, TRUE, FALSE, FALSE, TRUE, FALSE);
+               (void)summon_specific(0, py, px, dun_level, 0, (PM_ALLOW_GROUP | PM_ALLOW_UNIQUE));
        }
 }
 
@@ -1543,7 +1543,7 @@ static void do_cmd_wiz_summon(int num)
  *
  * XXX XXX XXX This function is rather dangerous
  */
-static void do_cmd_wiz_named(int r_idx, bool slp)
+static void do_cmd_wiz_named(int r_idx)
 {
        int i, x, y;
 
@@ -1565,7 +1565,7 @@ static void do_cmd_wiz_named(int r_idx, bool slp)
                if (!cave_empty_bold(y, x)) continue;
 
                /* Place it (allow groups) */
-               if (place_monster_aux(0, y, x, r_idx, slp, TRUE, FALSE, FALSE, FALSE, FALSE)) break;
+               if (place_monster_aux(0, y, x, r_idx, (PM_ALLOW_SLEEP | PM_ALLOW_GROUP))) break;
        }
 }
 
@@ -1575,9 +1575,9 @@ static void do_cmd_wiz_named(int r_idx, bool slp)
  *
  * XXX XXX XXX This function is rather dangerous
  */
-static void do_cmd_wiz_named_friendly(int r_idx, bool slp)
+static void do_cmd_wiz_named_friendly(int r_idx)
 {
-       (void) summon_named_creature(0, py, px, r_idx, slp, TRUE, TRUE, TRUE);
+       (void) summon_named_creature(0, py, px, r_idx, (PM_ALLOW_SLEEP | PM_ALLOW_GROUP | PM_FORCE_PET));
 }
 
 
@@ -1798,12 +1798,12 @@ void do_cmd_debug(void)
 
                /* Summon _friendly_ named monster */
                case 'N':
-                       do_cmd_wiz_named_friendly(command_arg, TRUE);
+                       do_cmd_wiz_named_friendly(command_arg);
                        break;
 
                /* Summon Named Monster */
                case 'n':
-                       do_cmd_wiz_named(command_arg, TRUE);
+                       do_cmd_wiz_named(command_arg);
                        break;
 
                /* Object playing routines */
index ef3abd2..bc6e548 100644 (file)
@@ -880,7 +880,10 @@ msg_print("
 
                        if (attempts > 0)
                        {
-                               if (summon_specific((pet ? -1 : 0), wy, wx, 100, SUMMON_DAWN, FALSE, is_friendly(m_ptr), pet, FALSE, FALSE))
+                               u32b mode = 0L;
+                               if (pet) mode |= PM_FORCE_PET;
+
+                               if (summon_specific((pet ? -1 : m_idx), wy, wx, 100, SUMMON_DAWN, mode))
                                {
                                        if (player_can_see_bold(wy, wx))
 #ifdef JP
@@ -904,8 +907,11 @@ msg_print("
                {
                        int wy = y, wx = x;
                        bool pet = is_pet(m_ptr);
+                       u32b mode = 0L;
+
+                       if (pet) mode |= PM_FORCE_PET;
 
-                       if (summon_specific((pet ? -1 : 0), wy, wx, 100, SUMMON_BLUE_HORROR, FALSE, is_friendly(m_ptr), pet, FALSE, FALSE))
+                       if (summon_specific((pet ? -1 : m_idx), wy, wx, 100, SUMMON_BLUE_HORROR, mode))
                        {
                                if (player_can_see_bold(wy, wx))
                                        notice = TRUE;
@@ -2030,13 +2036,14 @@ msg_format("%s
                {
                        int dummy_y = m_ptr->fy;
                        int dummy_x = m_ptr->fx;
-                       bool friend = is_friendly(m_ptr);
-                       bool pet = is_pet(m_ptr);
+                       u32b mode = 0L;
+
+                       if (is_pet(m_ptr)) mode |= PM_FORCE_PET;
 
                        /* Delete the monster */
                        delete_monster_idx(m_idx);
 
-                       if (summon_named_creature(0, dummy_y, dummy_x, MON_BIKETAL, FALSE, FALSE, friend, pet))
+                       if (summon_named_creature(0, dummy_y, dummy_x, MON_BIKETAL, mode))
                        {
 #ifdef JP
                                msg_print("¡Ö¥Ï¥¡¥Ã¥Ï¥Ã¥Ï¥Ã¥Ï¡ª¡ª»ä¤¬¥Ð¥¤¥±¥¿¥ë¤À¡ª¡ª¡×");
@@ -4958,7 +4965,7 @@ msg_print("
 
                        for (dummy = 0; dummy < randint1(5) + 1; dummy++)
                        {
-                               (void)summon_specific(0, py, px, dun_level, 0, TRUE, FALSE, FALSE, TRUE, TRUE);
+                               (void)summon_specific(0, py, px, dun_level, 0, (PM_ALLOW_GROUP | PM_ALLOW_UNIQUE | PM_NO_PET));
                        }
 #ifdef JP
                        reward = "¥â¥ó¥¹¥¿¡¼¤ò¾¤´­¤µ¤ì¤¿¡£";
@@ -5419,7 +5426,7 @@ msg_format("%s
                        msg_format("%s rewards you with a demonic servant!",chaos_patrons[p_ptr->chaos_patron]);
 #endif
 
-                       if (!summon_specific(-1, py, px, dun_level, SUMMON_DEMON, FALSE, TRUE, TRUE, FALSE, FALSE))
+                       if (!summon_specific(-1, py, px, dun_level, SUMMON_DEMON, PM_FORCE_PET))
 #ifdef JP
 msg_print("²¿¤â¸½¤ì¤Ê¤«¤Ã¤¿...");
 #else
@@ -5440,7 +5447,7 @@ msg_format("%s
                        msg_format("%s rewards you with a servant!",chaos_patrons[p_ptr->chaos_patron]);
 #endif
 
-                       if (!summon_specific(-1, py, px, dun_level, 0, FALSE, TRUE, TRUE, FALSE, FALSE))
+                       if (!summon_specific(-1, py, px, dun_level, 0, PM_FORCE_PET))
 #ifdef JP
 msg_print("²¿¤â¸½¤ì¤Ê¤«¤Ã¤¿...");
 #else
@@ -5461,7 +5468,7 @@ msg_format("%s
                        msg_format("%s rewards you with an undead servant!",chaos_patrons[p_ptr->chaos_patron]);
 #endif
 
-                       if (!summon_specific(-1, py, px, dun_level, SUMMON_UNDEAD, FALSE, TRUE, TRUE, FALSE, FALSE))
+                       if (!summon_specific(-1, py, px, dun_level, SUMMON_UNDEAD, PM_FORCE_PET))
 #ifdef JP
 msg_print("²¿¤â¸½¤ì¤Ê¤«¤Ã¤¿...");
 #else