OSDN Git Service

呪いは外れないだけではなく、いろいろイヤな効果がある。
authorhoge <hoge@0568b783-4c39-0410-ac80-bf13821ea2a2>
Fri, 15 Mar 2002 12:10:24 +0000 (12:10 +0000)
committerhoge <hoge@0568b783-4c39-0410-ac80-bf13821ea2a2>
Fri, 15 Mar 2002 12:10:24 +0000 (12:10 +0000)
32 files changed:
configure.in
lib/edit/a_info_j.txt
lib/edit/e_info_j.txt
lib/edit/k_info_j.txt
src/artifact.c
src/cmd1.c
src/cmd2.c
src/cmd3.c
src/cmd6.c
src/defines.h
src/dungeon.c
src/effects.c
src/externs.h
src/files.c
src/init1.c
src/load.c
src/mane.c
src/melee2.c
src/mind.c
src/mspells1.c
src/mspells2.c
src/mspells3.c
src/object1.c
src/object2.c
src/save.c
src/spells1.c
src/spells2.c
src/spells3.c
src/types.h
src/wizard1.c
src/wizard2.c
src/xtra1.c

index 73fa0ad..3c79130 100644 (file)
@@ -3,7 +3,7 @@ AC_INIT(src/main.c)
 
 AM_CONFIG_HEADER(src/autoconf.h)
 
-AM_INIT_AUTOMAKE(hengband, 1.0.10)
+AM_INIT_AUTOMAKE(hengband, 1.0.11)
 
 AC_ARG_WITH(setgid,
 [  --with-setgid=NAME      install hengband as group NAME],
index 804b42f..1c404fb 100644 (file)
@@ -1078,7 +1078,7 @@ P:2:1d1:-11:-12:0
 F:STR | DEX | HIDE_TYPE | RES_DISEN | RES_NEXUS | IM_FIRE |
 F:HOLD_LIFE | RES_NETHER | RES_CONF | RES_CHAOS | RES_POIS | IM_COLD |
 F:AGGRAVATE | CURSED | SHOW_MODS | HEAVY_CURSE | TY_CURSE | TELEPORT
-
+F:RANDOM_CURSE1
 
 # The Set of Cesti of Fingolfin
 
@@ -1464,6 +1464,7 @@ W:30:15:250:0
 P:0:4d6:-40:-60:-50
 F:SPEED | IM_FIRE | RES_FIRE | BRAND_FIRE | RES_DISEN | RES_FEAR |
 F:AGGRAVATE | CURSED | HEAVY_CURSE | SHOW_MODS | TY_CURSE | LITE
+F:RANDOM_CURSE2
 D:Ë̲¤¿ÀÏäˤª¤¤¤Æ±ê¤Îµð¿Í¥¹¥ë¥È¤¬À¤³¦¤Ë²Ð¤òÊü¤Ã¤¿Ç³¤¨¤ë·õ¤À¡£
 
 # The Cutlass 'Gondricam'
@@ -2536,6 +2537,7 @@ W:30:20:500:0
 P:0:8d6:0:30:0
 F:STEALTH | INT | WIS | AGGRAVATE | CURSED | HEAVY_CURSE |
 F:SHOW_MODS | CHAOTIC | IMPACT | SPEED
+F:RANDOM_CURSE0
 D:¥Þ¥¤¥¯¥í¥ó¥Õ¥È¤Ë¤è¤Ã¤Æºî¤é¤ì¤¿¤â¤Î¤Ç¡¢½Å¤¯¤ÆÇ˲õÎϤ¬¤¢¤ë¡£
 D:»ÈÍѤ¹¤ë¼Ô¤ËºÒ¤¤¤ò¤â¤¿¤é¤¹¡£
 
index b99dc8d..832012f 100644 (file)
@@ -788,6 +788,7 @@ X:24:0
 W:0:36:0:0
 C:20:20:10:0
 F:SEE_INVIS | AGGRAVATE | HEAVY_CURSE | CURSED
+F:RANDOM_CURSE2
 
 # 103 (unused)
 
index 0691089..00a2c12 100644 (file)
@@ -1384,6 +1384,7 @@ I:45:0:-5
 W:50:0:2:0
 A:50/1
 F:CURSED | TELEPORT | WIS | CHR | HIDE_TYPE
+F:RANDOM_CURSE0
 
 N:150:̵ÃÎ
 E:Stupidity
@@ -1579,7 +1580,7 @@ A:50/1
 P:0:7d7:-5:-5:5
 F:CURSED | HEAVY_CURSE | STR | INT | WIS | DEX | CON | CHR | 
 F:TY_CURSE | NO_TELE | NO_MAGIC | REGEN | 
-F:HIDE_TYPE
+F:HIDE_TYPE | RANDOM_CURSE2
 
 
 ##### Scrolls #####
index 23cc909..76e7a38 100644 (file)
@@ -165,9 +165,10 @@ static void curse_artifact(object_type * o_ptr)
        if (o_ptr->to_h > 0) o_ptr->to_h = 0 - (o_ptr->to_h + randint1(4));
        if (o_ptr->to_d > 0) o_ptr->to_d = 0 - (o_ptr->to_d + randint1(4));
 
-       o_ptr->art_flags3 |= (TR3_HEAVY_CURSE | TR3_CURSED);
+       o_ptr->curse_flags |= (TRC_HEAVY_CURSE | TRC_CURSED);
+       o_ptr->art_flags3 &= ~(TR3_BLESSED);
 
-       if (one_in_(4)) o_ptr->art_flags3 |= TR3_PERMA_CURSE;
+       if (one_in_(4)) o_ptr->curse_flags |= TRC_PERMA_CURSE;
        if (one_in_(3)) o_ptr->art_flags3 |= TR3_TY_CURSE;
        if (one_in_(2)) o_ptr->art_flags3 |= TR3_AGGRAVATE;
        if (one_in_(3)) o_ptr->art_flags3 |= TR3_DRAIN_EXP;
@@ -176,8 +177,6 @@ static void curse_artifact(object_type * o_ptr)
 
        if ((p_ptr->pclass != CLASS_WARRIOR) && (p_ptr->pclass != CLASS_ARCHER) && (p_ptr->pclass != CLASS_CAVALRY) && (p_ptr->pclass != CLASS_BERSERKER) && (p_ptr->pclass != CLASS_SMITH) && one_in_(3))
                o_ptr->art_flags3 |= TR3_NO_MAGIC;
-
-       o_ptr->ident |= IDENT_CURSED;
 }
 
 
@@ -2912,8 +2911,10 @@ void random_artifact_resistance(object_type * o_ptr, artifact_type *a_ptr)
                else
                {
                        o_ptr->art_flags3 |=
-                           (TR3_CURSED | TR3_HEAVY_CURSE | TR3_AGGRAVATE | TR3_TY_CURSE);
-                       o_ptr->ident |= IDENT_CURSED;
+                           (TR3_AGGRAVATE | TR3_TY_CURSE);
+                       o_ptr->curse_flags |=
+                           (TRC_CURSED | TRC_HEAVY_CURSE);
+                       o_ptr->curse_flags |= get_curse(2, o_ptr);
                        return;
                }
        }
@@ -2921,8 +2922,8 @@ void random_artifact_resistance(object_type * o_ptr, artifact_type *a_ptr)
        {
                if (p_ptr->pclass != CLASS_SAMURAI)
                {
-                       o_ptr->art_flags3 |= (TR3_NO_MAGIC | TR3_HEAVY_CURSE);
-                       o_ptr->ident |= IDENT_CURSED;
+                       o_ptr->art_flags3 |= (TR3_NO_MAGIC);
+                       o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
                }
        }
 
@@ -2958,72 +2959,6 @@ void random_artifact_resistance(object_type * o_ptr, artifact_type *a_ptr)
                if (one_in_(2)) give_resistance = TRUE;
                else give_power = TRUE;
        }
-#if 0
-       switch (o_ptr->name1)
-       {
-               case ART_JULIAN:
-               case ART_ARVEDUI:
-               case ART_CASPANION:
-               case ART_HITHLOMIR:
-               case ART_ROHIRRIM:
-               case ART_CELEGORM:
-               case ART_ANARION:
-               case ART_THRANDUIL:
-               case ART_LUTHIEN:
-               case ART_THROR:
-               case ART_THORIN:
-               case ART_NIMTHANC:
-               case ART_DETHANC:
-               case ART_NARTHANC:
-               case ART_STING:
-               case ART_TURMIL:
-               case ART_THALKETTOTH:
-               case ART_JIZO:
-                       {
-                               /* Give a resistance */
-                               give_resistance = TRUE;
-                       }
-                       break;
-               case ART_MAEDHROS:
-               case ART_GLAMDRING:
-               case ART_ORCRIST:
-               case ART_ANDURIL:
-               case ART_ZARCUTHRA:
-               case ART_GURTHANG:
-               case ART_SOULSWORD:
-               case ART_BRAND:
-               case ART_DAWN:
-               case ART_BUCKLAND:
-               case ART_AZAGHAL:
-                       {
-                               /* Give a resistance OR a power */
-                               if (one_in_(2)) give_resistance = TRUE;
-                               else give_power = TRUE;
-                       }
-                       break;
-               case ART_NENYA:
-               case ART_VILYA:
-               case ART_BERUTHIEL:
-               case ART_THINGOL:
-               case ART_ULMO:
-               case ART_GANDALF:
-                       {
-                               /* Give a power */
-                               give_power = TRUE;
-                       }
-                       break;
-               case ART_CRIMSON:
-               case ART_POWER:
-               case ART_AMBER:
-               case ART_AULE:
-                       {
-                               /* Give both */
-                               give_power = TRUE;
-                               give_resistance = TRUE;
-                       }
-                       break;
-       }
-#endif
 
        if (give_power)
        {
@@ -3076,8 +3011,13 @@ void create_named_art(int a_idx, int y, int x)
        q_ptr->to_d = a_ptr->to_d;
        q_ptr->weight = a_ptr->weight;
 
-       /* Hack -- acquire "cursed" flag */
-       if (a_ptr->flags3 & TR3_CURSED) q_ptr->ident |= (IDENT_CURSED);
+       /* Hack -- extract the "cursed" flag */
+       if (a_ptr->gen_flags & TRG_CURSED) q_ptr->curse_flags |= (TRC_CURSED);
+       if (a_ptr->gen_flags & TRG_HEAVY_CURSE) q_ptr->curse_flags |= (TRC_HEAVY_CURSE);
+       if (a_ptr->gen_flags & TRG_PERMA_CURSE) q_ptr->curse_flags |= (TRC_PERMA_CURSE);
+       if (a_ptr->gen_flags & (TRG_RANDOM_CURSE0)) q_ptr->curse_flags |= get_curse(0, q_ptr);
+       if (a_ptr->gen_flags & (TRG_RANDOM_CURSE1)) q_ptr->curse_flags |= get_curse(1, q_ptr);
+       if (a_ptr->gen_flags & (TRG_RANDOM_CURSE2)) q_ptr->curse_flags |= get_curse(2, q_ptr);
 
        random_artifact_resistance(q_ptr, a_ptr);
 
index 6f3d610..16bb7a8 100644 (file)
@@ -2468,7 +2468,7 @@ static void py_attack_aux(int y, int x, bool *fear, bool *mdeath, s16b hand, int
        {
                int tmp = p_ptr->lev*6+(p_ptr->skill_stl+10)*4;
                if (p_ptr->monlite && (mode != HISSATSU_NYUSIN)) tmp /= 3;
-               if (p_ptr->aggravate) tmp /= 2;
+               if (p_ptr->cursed & TRC_AGGRAVATE) tmp /= 2;
                if (r_ptr->level > (p_ptr->lev*p_ptr->lev/20+10)) tmp /= 3;
                if (m_ptr->csleep && m_ptr->ml)
                {
index 86ddd81..e232246 100644 (file)
@@ -4475,14 +4475,14 @@ note_dies = "
                j = 100;
 
                if (!(summon_named_creature(y, x, q_ptr->pval, FALSE, FALSE, FALSE,
-                     (bool)!(q_ptr->ident & IDENT_CURSED))))
+                     (bool)!(cursed_p(q_ptr)))))
 #ifdef JP
 msg_print("¿Í·Á¤ÏDZ¤¸¶Ê¤¬¤êºÕ¤±»¶¤Ã¤Æ¤·¤Þ¤Ã¤¿¡ª");
 #else
                        msg_print("The Figurine writhes and then shatters.");
 #endif
 
-               else if (q_ptr->ident & IDENT_CURSED)
+               else if (cursed_p(q_ptr))
 #ifdef JP
 msg_print("¤³¤ì¤Ï¤¢¤Þ¤êÎɤ¯¤Ê¤¤µ¤¤¬¤¹¤ë¡£");
 #else
index 1525a84..023bcbd 100644 (file)
@@ -749,12 +749,7 @@ void do_cmd_takeoff(void)
        /* Item is cursed */
        if (cursed_p(o_ptr))
        {
-               u32b f1, f2, f3;
-
-               /* Extract the flags */
-               object_flags(o_ptr, &f1, &f2, &f3);
-
-               if ((f3 & TR3_PERMA_CURSE) || (p_ptr->pclass != CLASS_BERSERKER))
+               if ((o_ptr->curse_flags & TRC_PERMA_CURSE) || (p_ptr->pclass != CLASS_BERSERKER))
                {
                        /* Oops */
 #ifdef JP
@@ -767,7 +762,7 @@ void do_cmd_takeoff(void)
                        return;
                }
 
-               if (((f3 & TR3_HEAVY_CURSE) && one_in_(7)) || one_in_(4))
+               if (((o_ptr->curse_flags & TRC_HEAVY_CURSE) && one_in_(7)) || one_in_(4))
                {
 #ifdef JP
                        msg_print("¼ö¤ï¤ì¤¿ÁõÈ÷¤òÎϤŤ¯¤ÇÇí¤¬¤·¤¿¡ª");
@@ -775,17 +770,10 @@ void do_cmd_takeoff(void)
                        msg_print("You teared a cursed equipment off by sheer strength!");
 #endif
 
-                       /* Uncurse it */
-                       o_ptr->ident &= ~(IDENT_CURSED);
-
                        /* Hack -- Assume felt */
                        o_ptr->ident |= (IDENT_SENSE);
 
-                       if (o_ptr->art_flags3 & TR3_CURSED)
-                               o_ptr->art_flags3 &= ~(TR3_CURSED);
-
-                       if (o_ptr->art_flags3 & TR3_HEAVY_CURSE)
-                       o_ptr->art_flags3 &= ~(TR3_HEAVY_CURSE);
+                       o_ptr->curse_flags = 0L;
 
                        /* Take note */
                        o_ptr->feeling = FEEL_NONE;
@@ -1214,7 +1202,6 @@ void do_cmd_observe(void)
        msg_format("Examining %s...", o_name);
 #endif
 
-
        /* Describe it fully */
 #ifdef JP
        if (!identify_fully_aux(o_ptr)) msg_print("ÆäËÊѤï¤Ã¤¿¤È¤³¤í¤Ï¤Ê¤¤¤è¤¦¤À¡£");
@@ -1373,9 +1360,11 @@ static flag_insc_table flag_insc_misc[] =
        { "¼Í", "Xs", TR3_XTRA_SHOTS, 3, 0 },
        { "ÅÜ", "Ag", TR3_AGGRAVATE, 3, 0 },
        { "½Ë", "Bs", TR3_BLESSED, 3, 0 },
+#if 0
        { "±Ê¼ö", "Pc", TR3_PERMA_CURSE, 3, 0 },
        { "¼ö", "Cu", TR3_HEAVY_CURSE, 3, TR3_PERMA_CURSE },
        { "´÷", "Ty", TR3_TY_CURSE, 3, 0 },
+#endif
        { NULL, 0, 0, 0 }
 };
 
@@ -1495,9 +1484,11 @@ static flag_insc_table flag_insc_misc[] =
        { "Xs", TR3_XTRA_SHOTS, 3, 0 },
        { "Ag", TR3_AGGRAVATE, 3, 0 },
        { "Bs", TR3_BLESSED, 3, 0 },
+#if 0
        { "Pc", TR3_PERMA_CURSE, 3, 0 },
        { "Cu", TR3_HEAVY_CURSE, 3, TR3_PERMA_CURSE },
        { "Ty", TR3_TY_CURSE, 3, 0 },
+#endif
 #if 0
        { "De", TR3_DRAIN_EXP, 3, 0 },
 #endif
index 0a97589..b13d089 100644 (file)
@@ -6885,7 +6885,7 @@ static bool select_magic_eater(int mode)
                                        {
                                                chance -= 3 * (p_ptr->lev - level);
                                        }
-                                       if (p_ptr->pseikaku == SEIKAKU_NAMAKE) chance += 10;
+                                       chance += p_ptr->to_m_chance;
                                        if (p_ptr->heavy_spell) chance += 20;
                                        if(p_ptr->dec_mana && p_ptr->easy_spell) chance-=4;
                                        else if (p_ptr->easy_spell) chance-=3;
@@ -7070,7 +7070,7 @@ msg_print("
        {
                chance -= 3 * (p_ptr->lev - level);
        }
-       if (p_ptr->pseikaku == SEIKAKU_NAMAKE) chance += 10;
+       chance += p_ptr->to_m_chance;
        if (p_ptr->heavy_spell) chance += 20;
        if(p_ptr->dec_mana && p_ptr->easy_spell) chance-=4;
        else if (p_ptr->easy_spell) chance-=3;
index 94e62f4..0af5057 100644 (file)
@@ -51,7 +51,7 @@
 #define FAKE_VERSION   0
 #define FAKE_VER_MAJOR 11
 #define FAKE_VER_MINOR 0
-#define FAKE_VER_PATCH 10
+#define FAKE_VER_PATCH 11
 
 #define ANGBAND_2_8_1
 #define ZANGBAND
 #define IDENT_KNOWN     0x08    /* Item abilities are known */
 #define IDENT_STOREB    0x10    /* Item is storebought !!!! */
 #define IDENT_MENTAL    0x20    /* Item information is known */
+#if 0
 #define IDENT_CURSED    0x40    /* Item is temporarily cursed */
+#endif
 #define IDENT_BROKEN    0x80    /* Item is permanently worthless */
 
 
 #define TR2_SUST_DEX            0x00000008L
 #define TR2_SUST_CON            0x00000010L
 #define TR2_SUST_CHR            0x00000020L
-#define TR2_RIDING               0x00000040L     /* Later */
+#define TR2_RIDING              0x00000040L     /* Later */
 #define TR2_XXX2                0x00000080L     /* Later */
 #define TR2_IM_ACID             0x00000100L
 #define TR2_IM_ELEC             0x00000200L
 #define TR3_TELEPORT            0x04000000L     /* Item teleports player */
 #define TR3_AGGRAVATE           0x08000000L     /* Item aggravates monsters */
 #define TR3_BLESSED             0x10000000L     /* Item is Blessed */
-#define TR3_CURSED              0x20000000L     /* Item is Cursed */
-#define TR3_HEAVY_CURSE         0x40000000L     /* Item is Heavily Cursed */
-#define TR3_PERMA_CURSE         0x80000000L     /* Item is Perma Cursed */
 
 
 #define TRG_INSTA_ART           0x00000001L     /* Item must be an artifact */
 #define TRG_XTRA_L_RES          0x00000080L     /* Extra lordly resistance */
 #define TRG_XTRA_D_RES          0x00000100L     /* Extra dragon resistance */
 #define TRG_XTRA_RES            0x00000200L     /* Extra resistance */
+#define TRG_CURSED              0x00000400L     /* Item is Cursed */
+#define TRG_HEAVY_CURSE         0x00000800L     /* Item is Heavily Cursed */
+#define TRG_PERMA_CURSE         0x00001000L     /* Item is Perma Cursed */
+#define TRG_RANDOM_CURSE0       0x00002000L     /* Item is Random Cursed */
+#define TRG_RANDOM_CURSE1       0x00004000L     /* Item is Random Cursed */
+#define TRG_RANDOM_CURSE2       0x00008000L     /* Item is Random Cursed */
 
 
 /*
         TR1_TUNNEL | TR1_SPEED | TR1_BLOWS)
 
 
+#define MAX_CURSE 17
+
+#define TRC_CURSED              0x00000001L
+#define TRC_HEAVY_CURSE         0x00000002L
+#define TRC_PERMA_CURSE         0x00000004L
+#define TRC_XXX1                0x00000008L
+#define TRC_TY_CURSE            0x00000010L
+#define TRC_AGGRAVATE           0x00000020L
+#define TRC_DRAIN_EXP           0x00000040L
+#define TRC_SLOW_REGEN          0x00000080L
+#define TRC_ADD_L_CURSE         0x00000100L
+#define TRC_ADD_H_CURSE         0x00000200L
+#define TRC_CALL_ANIMAL         0x00000400L
+#define TRC_CALL_DEMON          0x00000800L
+#define TRC_CALL_DRAGON         0x00001000L
+#define TRC_COWARDICE           0x00002000L
+#define TRC_TELEPORT            0x00004000L
+#define TRC_LOW_MELEE           0x00008000L
+#define TRC_LOW_AC              0x00010000L
+#define TRC_LOW_MAGIC           0x00020000L
+#define TRC_FAST_DIGEST         0x00040000L
+#define TRC_DRAIN_HP            0x00080000L
+#define TRC_DRAIN_MANA          0x00100000L
+
+#define TRC_TELEPORT_SELF       0x00000001L
+#define TRC_CHAINSWORD          0x00000002L
+
+#define TRC_HEAVY_MASK   \
+       (TRC_TY_CURSE | TRC_AGGRAVATE | TRC_DRAIN_EXP | TRC_ADD_H_CURSE | \
+        TRC_CALL_DEMON | TRC_CALL_DRAGON)
+
+#define TRC_P_FLAG_MASK  \
+       (TRC_TY_CURSE | TRC_DRAIN_EXP | TRC_ADD_L_CURSE | TRC_ADD_H_CURSE | \
+        TRC_CALL_ANIMAL | TRC_CALL_DEMON | TRC_CALL_DRAGON | TRC_COWARDICE | \
+        TRC_TELEPORT | TRC_DRAIN_HP | TRC_DRAIN_MANA)
+
 
 /*** Monster blow constants ***/
 
  * Cursed items.
  */
 #define cursed_p(T) \
-       ((T)->ident & (IDENT_CURSED))
+       ((T)->curse_flags)
 
 
 /*
index 271df19..9e68db6 100644 (file)
@@ -1446,6 +1446,33 @@ static void check_music()
         gere_music(p_ptr->magic_num1[0]);
 }
 
+/* Choose one of items that have cursed flag */
+object_type *choose_cursed_obj_name(u32b flag)
+{
+       int i;
+       int choices[INVEN_TOTAL-INVEN_RARM];
+       int number = 0;
+
+       /* Paranoia -- Player has no warning-item */
+       if (!(p_ptr->cursed & flag)) return NULL;
+
+       /* Search Inventry */
+       for (i = INVEN_RARM; i < INVEN_TOTAL; i++)
+       {
+               object_type *o_ptr = &inventory[i];
+
+               if (o_ptr->curse_flags & flag)
+               {
+                       choices[number] = i;
+                       number++;
+               }
+       }
+
+       /* Choice one of them */
+       return (&inventory[choices[randint0(number)]]);
+}
+
+
 /*
  * Handle certain things once every 10 game turns
  */
@@ -2181,12 +2208,15 @@ take_hit(DAMAGE_NOESCAPE, i, "
                                /* Regeneration takes more food */
                                if (p_ptr->regenerate) i += 20;
                                if (p_ptr->special_defense & (KAMAE_MASK | KATA_MASK)) i+= 20;
+                               if (p_ptr->cursed & TRC_FAST_DIGEST) i += 30;
 
                                /* Slow digestion takes less food */
                                if (p_ptr->slow_digest) i -= 5;
 
                                /* Minimal digestion */
                                if (i < 1) i = 1;
+                               /* Maximal digestion */
+                               if (i > 100) i = 100;
 
                                /* Digest some food */
                                (void)set_food(p_ptr->food - i);
@@ -2274,6 +2304,10 @@ msg_print("
                {
                        regen_amount /= 2;
                }
+               if (p_ptr->cursed & TRC_SLOW_REGEN)
+               {
+                       regen_amount /= 5;
+               }
        }
 
 
@@ -3284,10 +3318,44 @@ msg_print("
 
        /*** Process Inventory ***/
 
-       /* Handle experience draining */
-       if (p_ptr->exp_drain)
+       if ((p_ptr->cursed & TRC_P_FLAG_MASK) && !p_ptr->wild_mode)
        {
-               if (randint0(100) < 25)
+               /*
+                * Hack: Uncursed teleporting items (e.g. Trump Weapons)
+                * can actually be useful!
+                */
+               if ((p_ptr->cursed & TRC_TELEPORT_SELF) && one_in_(100))
+               {
+#ifdef JP
+if (get_check_strict("¥Æ¥ì¥Ý¡¼¥È¤·¤Þ¤¹¤«¡©", 1))
+#else
+                       if (get_check("Teleport? "))
+#endif
+                       {
+                               disturb(0, 0);
+                               teleport_player(50);
+                       }
+               }
+               /* Make a chainsword noise */
+               if ((p_ptr->cursed & TRC_CHAINSWORD) && one_in_(CHAINSWORD_NOISE))
+               {
+                       char noise[1024];
+#ifdef JP
+if (!get_rnd_line("chainswd_j.txt", 0, noise))
+#else
+                       if (!get_rnd_line("chainswd.txt", 0, noise))
+#endif
+                               msg_print(noise);
+                       disturb(FALSE, FALSE);
+               }
+               /* TY Curse */
+               if ((p_ptr->cursed & TRC_TY_CURSE) && one_in_(TY_CURSE_CHANCE))
+               {
+                       int count = 0;
+                       (void)activate_ty_curse(FALSE, &count);
+               }
+               /* Handle experience draining */
+               if ((p_ptr->cursed & TRC_DRAIN_EXP) && one_in_(4))
                {
                        p_ptr->exp -= (p_ptr->lev+1)/2;
                        if (p_ptr->exp < 0) p_ptr->exp = 0;
@@ -3295,95 +3363,200 @@ msg_print("
                        if (p_ptr->max_exp < 0) p_ptr->max_exp = 0;
                        check_experience();
                }
-       }
-
-       /* Rarely, take damage from the Jewel of Judgement */
-       if (one_in_(999) && !p_ptr->anti_magic)
-       {
-               if ((inventory[INVEN_LITE].tval) &&
-                   (inventory[INVEN_LITE].sval == SV_LITE_THRAIN))
+               /* Add light curse (Later) */
+               if ((p_ptr->cursed & TRC_ADD_L_CURSE) && one_in_(4000))
                {
+                       u32b new_curse;
+                       bool changed = FALSE;
+                       object_type *o_ptr;
+                       char o_name[MAX_NLEN];
+
+                       o_ptr = choose_cursed_obj_name(TRC_ADD_L_CURSE);
+                       object_desc(o_name, o_ptr, FALSE, 0);
+
+                       new_curse = get_curse(0, o_ptr);
+                       if (!(o_ptr->curse_flags & new_curse))
+                       {
+                               changed = TRUE;
+                               o_ptr->curse_flags |= new_curse;
+                       }
+                       if (changed)
+                       {
 #ifdef JP
-msg_print("¡Ø¿³È½¤ÎÊõÀС٤Ϥ¢¤Ê¤¿¤ÎÂÎÎϤòµÛ¼ý¤·¤¿¡ª");
-take_hit(DAMAGE_LOSELIFE, MIN(p_ptr->lev, 50), "¿³È½¤ÎÊõÀÐ", -1);
+msg_format("°­°Õ¤ËËþ¤Á¤¿¹õ¤¤¥ª¡¼¥é¤¬%s¤ò¤È¤ê¤Þ¤¤¤¿...", o_name);
 #else
-                       msg_print("The Jewel of Judgement drains life from you!");
-                       take_hit(DAMAGE_LOSELIFE, MIN(p_ptr->lev, 50), "the Jewel of Judgement", -1);
+                               msg_format("There is a malignant black aura surrounding %s...", o_name);
 #endif
 
+                               o_ptr->feeling = FEEL_NONE;
+                       }
+                       p_ptr->update |= (PU_BONUS);
                }
-       }
+               /* Add heavy curse (Later) */
+               if ((p_ptr->cursed & TRC_ADD_H_CURSE) && one_in_(4000))
+               {
+                       u32b new_curse;
+                       bool changed = FALSE;
+                       object_type *o_ptr;
+                       char o_name[MAX_NLEN];
 
+                       o_ptr = choose_cursed_obj_name(TRC_ADD_H_CURSE);
+                       object_desc(o_name, o_ptr, FALSE, 0);
 
-       /* Process equipment */
-       for (j = 0, i = INVEN_RARM; i < INVEN_TOTAL; i++)
-       {
-               /* Get the object */
-               o_ptr = &inventory[i];
+                       new_curse = get_curse(1, o_ptr);
+                       if (!(o_ptr->curse_flags & new_curse))
+                       {
+                               changed = TRUE;
+                               o_ptr->curse_flags |= new_curse;
+                       }
+                       if (changed)
+                       {
+#ifdef JP
+msg_format("°­°Õ¤ËËþ¤Á¤¿¹õ¤¤¥ª¡¼¥é¤¬%s¤ò¤È¤ê¤Þ¤¤¤¿...", o_name);
+#else
+                               msg_format("There is a malignant black aura surrounding %s...", o_name);
+#endif
 
-               object_flags(o_ptr, &f1, &f2, &f3);
+                               o_ptr->feeling = FEEL_NONE;
+                       }
+                       p_ptr->update |= (PU_BONUS);
+               }
+               /* Call animal */
+               if ((p_ptr->cursed & TRC_CALL_ANIMAL) && one_in_(1500))
+               {
+                       if (summon_specific(0, py, px, dun_level, SUMMON_ANIMAL,
+                           TRUE, FALSE, FALSE, TRUE, TRUE))
+                       {
+                               char o_name[MAX_NLEN];
 
-               /* Skip non-objects */
-               if (!o_ptr->k_idx) continue;
+                               object_desc(o_name, choose_cursed_obj_name(TRC_CALL_ANIMAL), FALSE, 0);
+#ifdef JP
+msg_format("%s¤¬Æ°Êª¤ò°ú¤­´ó¤»¤¿¡ª", o_name);
+#else
+                               msg_format("%s have attracted an animal!", o_name);
+#endif
 
-               if (!p_ptr->inside_battle)
+                               disturb(0, 0);
+                       }
+               }
+               /* Call demon */
+               if ((p_ptr->cursed & TRC_CALL_DEMON) && one_in_(666))
                {
-                       /* TY Curse */
-                       if ((f3 & TR3_TY_CURSE) && one_in_(TY_CURSE_CHANCE))
+                       if (summon_specific(0, py, px, dun_level, SUMMON_DEMON,
+                           TRUE, FALSE, FALSE, TRUE, TRUE))
                        {
-                               int count = 0;
+                               char o_name[MAX_NLEN];
+
+                               object_desc(o_name, choose_cursed_obj_name(TRC_CALL_DEMON), FALSE, 0);
+#ifdef JP
+msg_format("%s¤¬°­Ëâ¤ò°ú¤­´ó¤»¤¿¡ª", o_name);
+#else
+                               msg_format("%s have attracted a demon!", o_name);
+#endif
 
-                               (void)activate_ty_curse(FALSE, &count);
+                               disturb(0, 0);
                        }
+               }
+               /* Call dragon */
+               if ((p_ptr->cursed & TRC_CALL_DRAGON) && one_in_(400))
+               {
+                       if (summon_specific(0, py, px, dun_level, SUMMON_DRAGON,
+                           TRUE, FALSE, FALSE, TRUE, TRUE))
+                       {
+                               char o_name[MAX_NLEN];
+
+                               object_desc(o_name, choose_cursed_obj_name(TRC_CALL_DRAGON), FALSE, 0);
+#ifdef JP
+msg_format("%s¤¬¥É¥é¥´¥ó¤ò°ú¤­´ó¤»¤¿¡ª", o_name);
+#else
+                               msg_format("%s have attracted an animal!", o_name);
+#endif
 
-                       /* Make a chainsword noise */
-                       if ((o_ptr->name1 == ART_CHAINSWORD) && one_in_(CHAINSWORD_NOISE))
+                               disturb(0, 0);
+                       }
+               }
+               if ((p_ptr->cursed & TRC_COWARDICE) && one_in_(1500))
+               {
+                       if (!(p_ptr->resist_fear || p_ptr->hero || p_ptr->shero))
                        {
-                               char noise[1024];
+                               disturb(0, 0);
 #ifdef JP
-if (!get_rnd_line("chainswd_j.txt", 0, noise))
+msg_print("¤È¤Æ¤â°Å¤¤... ¤È¤Æ¤â¶²¤¤¡ª");
 #else
-                               if (!get_rnd_line("chainswd.txt", 0, noise))
+                               msg_print("It's so dark... so scary!");
 #endif
 
-                                       msg_print(noise);
-                               disturb(FALSE, FALSE);
+                               set_afraid(p_ptr->afraid + 13 + randint1(26));
                        }
+               }
+               /* Teleport player */
+               if ((p_ptr->cursed & TRC_TELEPORT) && one_in_(100) && !p_ptr->anti_tele)
+               {
+                       disturb(0, 0);
 
-                       /*
-                        * Hack: Uncursed teleporting items (e.g. Trump Weapons)
-                        * can actually be useful!
-                        */
-                       if ((f3 & TR3_TELEPORT) && (randint0(100) < 1))
-                       {
-                               if ((o_ptr->ident & IDENT_CURSED) && !p_ptr->anti_tele)
-                               {
-                                       disturb(0, 0);
+                       /* Teleport player */
+                       teleport_player(40);
+               }
+               /* Handle HP draining */
+               if ((p_ptr->cursed & TRC_DRAIN_HP) && one_in_(666))
+               {
+                       char o_name[MAX_NLEN];
 
-                                       /* Teleport player */
-                                       teleport_player(40);
-                               }
-                               else
-                               {
-                                       if (p_ptr->wild_mode || (o_ptr->inscription &&
-                                           (strchr(quark_str(o_ptr->inscription),'.'))))
-                                       {
-                                               /* Do nothing */
-                                               /* msg_print("Teleport aborted.") */ ;
-                                       }
+                       object_desc(o_name, choose_cursed_obj_name(TRC_DRAIN_HP), FALSE, 0);
 #ifdef JP
-else if (get_check_strict("¥Æ¥ì¥Ý¡¼¥È¤·¤Þ¤¹¤«¡©", 1))
+msg_format("%s¤Ï¤¢¤Ê¤¿¤ÎÂÎÎϤòµÛ¼ý¤·¤¿¡ª", o_name);
 #else
-                                       else if (get_check("Teleport? "))
+                       msg_format("%s drains HP from you!", o_name);
 #endif
+                       take_hit(DAMAGE_LOSELIFE, MIN(p_ptr->lev*2, 100), o_name, -1);
+               }
+               /* Handle mana draining */
+               if ((p_ptr->cursed & TRC_DRAIN_MANA) && one_in_(666))
+               {
+                       char o_name[MAX_NLEN];
 
-                                       {
-                                               disturb(0, 0);
-                                               teleport_player(50);
-                                       }
-                               }
+                       object_desc(o_name, choose_cursed_obj_name(TRC_DRAIN_MANA), FALSE, 0);
+#ifdef JP
+msg_format("%s¤Ï¤¢¤Ê¤¿¤ÎËâÎϤòµÛ¼ý¤·¤¿¡ª", o_name);
+#else
+                       msg_format("%s drains mana from you!", o_name);
+#endif
+                       p_ptr->csp -= MIN(p_ptr->lev, 50);
+                       if (p_ptr->csp < 0)
+                       {
+                               p_ptr->csp = 0;
+                               p_ptr->csp_frac = 0;
                        }
+                       p_ptr->redraw |= PR_MANA;
                }
+       }
+
+       /* Rarely, take damage from the Jewel of Judgement */
+       if (one_in_(999) && !p_ptr->anti_magic)
+       {
+               if ((inventory[INVEN_LITE].tval) &&
+                   (inventory[INVEN_LITE].sval == SV_LITE_THRAIN))
+               {
+#ifdef JP
+msg_print("¡Ø¿³È½¤ÎÊõÀС٤Ϥ¢¤Ê¤¿¤ÎÂÎÎϤòµÛ¼ý¤·¤¿¡ª");
+take_hit(DAMAGE_LOSELIFE, MIN(p_ptr->lev, 50), "¿³È½¤ÎÊõÀÐ", -1);
+#else
+                       msg_print("The Jewel of Judgement drains life from you!");
+                       take_hit(DAMAGE_LOSELIFE, MIN(p_ptr->lev, 50), "the Jewel of Judgement", -1);
+#endif
+
+               }
+       }
+
+
+       /* Process equipment */
+       for (j = 0, i = INVEN_RARM; i < INVEN_TOTAL; i++)
+       {
+               /* Get the object */
+               o_ptr = &inventory[i];
+
+               /* Skip non-objects */
+               if (!o_ptr->k_idx) continue;
 
                /* Recharge activatable objects */
                if (o_ptr->timeout > 0)
index 741503a..c052e11 100644 (file)
@@ -5242,8 +5242,7 @@ void calc_android_exp(void)
 
                object_copy(q_ptr, o_ptr);
                q_ptr->discount = 0;
-               q_ptr->ident &= ~(IDENT_CURSED);
-               q_ptr->art_flags3 &= ~(TR3_CURSED | TR3_HEAVY_CURSE | TR3_PERMA_CURSE | TR3_TY_CURSE);
+               q_ptr->curse_flags = 0L;
 
                if (o_ptr->name1)
                {
index 34edfc3..ec1c4fc 100644 (file)
@@ -759,6 +759,7 @@ extern errr rd_savefile_new(void);
 extern bool make_attack_normal(int m_idx);
 extern bool make_attack_spell(int m_idx);
 extern void process_monsters(void);
+extern u32b get_curse(int power, object_type *o_ptr);
 extern void curse_equipment(int chance, int heavy_chance);
 extern void mon_take_hit_mon(bool is_psy_spear, int m_idx, int dam, bool *fear, cptr note, int who);
 extern bool process_the_world(int num, int who, bool vs_player);
index f2b8a99..9cd48c2 100644 (file)
@@ -2971,7 +2971,7 @@ static void display_player_flag_aux(int row, int col, char *header,
                                    u32b im_f[], u32b vul_f)
 {
        int     i;
-       u32b    f[3];
+       u32b    f[4];
        bool    vuln = FALSE;
 
        if ((vul_f & flag1) && !((im_f[0] | im_f[1] | im_f[2]) & flag1))
@@ -2987,13 +2987,14 @@ static void display_player_flag_aux(int row, int col, char *header,
        for (i = INVEN_RARM; i < INVEN_TOTAL; i++)
        {
                object_type *o_ptr;
-               f[0] = f[1] = f[2] = 0L;
+               f[0] = f[1] = f[2] = f[3] = 0L;
 
                /* Object */
                o_ptr = &inventory[i];
 
                /* Known flags */
                object_flags_known(o_ptr, &f[0], &f[1], &f[2]);
+               f[3] = o_ptr->curse_flags;
 
                /* Default */
                c_put_str((byte)(vuln ? TERM_RED : TERM_SLATE), ".", row, col);
@@ -3008,6 +3009,7 @@ static void display_player_flag_aux(int row, int col, char *header,
 
        /* Player flags */
        player_flags(&f[0], &f[1], &f[2]);
+       f[3] = 0L;
 
        /* Default */
        c_put_str((byte)(vuln ? TERM_RED : TERM_SLATE), ".", row, col);
@@ -3017,6 +3019,7 @@ static void display_player_flag_aux(int row, int col, char *header,
 
        /* Timed player flags */
        tim_player_flags(&f[0], &f[1], &f[2], TRUE);
+       f[3] = 0L;
 
        /* Check flags */
        if (f[n-1] & flag1) c_put_str((byte)(vuln ? TERM_ORANGE : TERM_YELLOW), "#", row, col);
@@ -3132,7 +3135,7 @@ display_player_flag_aux(row+5, col, "
 display_player_flag_aux(row+6, col, "µÞ²óÉü    :", 3, TR3_REGEN, 0, im_f[2], vul_f[2]);
 display_player_flag_aux(row+7, col, "ÉâÍ·      :", 3, TR3_FEATHER, 0, im_f[2], vul_f[2]);
 display_player_flag_aux(row+8, col, "±Ê±ó¸÷¸»  :", 3, TR3_LITE, 0, im_f[2], vul_f[2]);
-display_player_flag_aux(row+9, col, "¼ö¤¤      :", 3, (TR3_CURSED | TR3_HEAVY_CURSE), TR3_PERMA_CURSE, im_f[2], vul_f[2]);
+display_player_flag_aux(row+9, col, "¼ö¤¤      :", 4, (TRC_CURSED | TRC_HEAVY_CURSE), TRC_PERMA_CURSE, im_f[2], vul_f[2]);
 #else
        display_player_flag_aux(row+0, col, "Speed     :", 1, TR1_SPEED, 0, im_f[0], vul_f[0]);
        display_player_flag_aux(row+1, col, "FreeAction:", 2, TR2_FREE_ACT, 0, im_f[1], vul_f[1]);
@@ -3143,7 +3146,7 @@ display_player_flag_aux(row+9, col, "
        display_player_flag_aux(row+6, col, "Regene.   :", 3, TR3_REGEN, 0, im_f[2], vul_f[2]);
        display_player_flag_aux(row+7, col, "Levitation:", 3, TR3_FEATHER, 0, im_f[2], vul_f[2]);
        display_player_flag_aux(row+8, col, "Perm Lite :", 3, TR3_LITE, 0, im_f[2], vul_f[2]);
-       display_player_flag_aux(row+9, col, "Cursed    :", 3, (TR3_CURSED | TR3_HEAVY_CURSE), TR3_PERMA_CURSE, im_f[2], vul_f[2]);
+       display_player_flag_aux(row+9, col, "Cursed    :", 4, (TRC_CURSED | TRC_HEAVY_CURSE), TRC_PERMA_CURSE, im_f[2], vul_f[2]);
 #endif
 
 }
@@ -3720,9 +3723,9 @@ NULL,
 "¥Æ¥ì¥Ý¡¼¥È",
 "È¿´¶",
 "½ËÊ¡",
-"¼ö¤¤",
-"½Å¤¤¼ö¤¤",
-"±Ê±ó¤Î¼ö¤¤"
+NULL,
+NULL,
+NULL,
 #else
        "NoTeleport",
        "AntiMagic",
@@ -3749,9 +3752,9 @@ NULL,
        "Teleport",
        "Aggravate",
        "Blessed",
-       "Cursed",
-       "Hvy Curse",
-       "Prm Curse"
+       NULL,
+       NULL,
+       NULL,
 #endif
 
 };
index ba3f022..4b4c646 100644 (file)
@@ -600,9 +600,9 @@ static cptr k_info_flags3[] =
        "TELEPORT",
        "AGGRAVATE",
        "BLESSED",
-       "CURSED",
-       "HEAVY_CURSE",
-       "PERMA_CURSE"
+       "XXX1",
+       "XXX2",
+       "XXX3",
 };
 
 
@@ -618,12 +618,12 @@ static cptr k_info_gen_flags[] =
        "XTRA_L_RES",
        "XTRA_D_RES",
        "XTRA_RES",
-       "XXX",
-       "XXX",
-       "XXX",
-       "XXX",
-       "XXX",
-       "XXX",
+       "CURSED",
+       "HEAVY_CURSE",
+       "PERMA_CURSE",
+       "RANDOM_CURSE0",
+       "RANDOM_CURSE1",
+       "RANDOM_CURSE2",
        "XXX",
        "XXX",
        "XXX",
index eca5905..e74c61e 100644 (file)
@@ -344,6 +344,34 @@ static void rd_item(object_type *o_ptr)
        rd_u32b(&o_ptr->art_flags2);
        rd_u32b(&o_ptr->art_flags3);
 
+       if (z_older_than(11, 0, 11))
+       {
+               o_ptr->curse_flags = 0L;
+               if (o_ptr->ident & 0x40)
+               {
+                       o_ptr->curse_flags |= TRC_CURSED;
+                       if (o_ptr->art_flags3 & 0x40000000L) o_ptr->curse_flags |= TRC_HEAVY_CURSE;
+                       if (o_ptr->art_flags3 & 0x80000000L) o_ptr->curse_flags |= TRC_PERMA_CURSE;
+                       if (o_ptr->name1)
+                       {
+                               artifact_type *a_ptr = &a_info[o_ptr->name1];
+                               if (a_ptr->gen_flags & (TRG_HEAVY_CURSE)) o_ptr->curse_flags |= TRC_HEAVY_CURSE;
+                               if (a_ptr->gen_flags & (TRG_PERMA_CURSE)) o_ptr->curse_flags |= TRC_PERMA_CURSE;
+                       }
+                       else if (o_ptr->name2)
+                       {
+                               ego_item_type *e_ptr = &e_info[o_ptr->name2];
+                               if (e_ptr->gen_flags & (TRG_HEAVY_CURSE)) o_ptr->curse_flags |= TRC_HEAVY_CURSE;
+                               if (e_ptr->gen_flags & (TRG_PERMA_CURSE)) o_ptr->curse_flags |= TRC_PERMA_CURSE;
+                       }
+               }
+               o_ptr->art_flags3 &= (0x1FFFFFFFL);
+       }
+       else
+       {
+               rd_u32b(&o_ptr->curse_flags);
+       }
+
        /* Monster holding object */
        rd_s16b(&o_ptr->held_m_idx);
 
index caf892c..6650f43 100644 (file)
@@ -175,9 +175,7 @@ put_str("
 
                                        if (spell.manedam) chance = chance * mane_dam[i] / spell.manedam;
 
-                                       if (p_ptr->pseikaku == SEIKAKU_NAMAKE) chance += 10;
-                                       if (p_ptr->pseikaku == SEIKAKU_KIREMONO) chance -= 3;
-                                       if ((p_ptr->pseikaku == SEIKAKU_GAMAN) || (p_ptr->pseikaku == SEIKAKU_CHIKARA)) chance++;
+                                       chance += p_ptr->to_m_chance;
 
                                        /* Extract the minimum failure rate */
                                        minfail = adj_mag_fail[p_ptr->stat_ind[spell.use_stat]];
index c02d019..9a98a9d 100644 (file)
@@ -2346,7 +2346,7 @@ static void process_monster(int m_idx)
        {
                int tmp = p_ptr->lev*6+(p_ptr->skill_stl+10)*4;
                if (p_ptr->monlite) tmp /= 3;
-               if (p_ptr->aggravate) tmp /= 2;
+               if (p_ptr->cursed & TRC_AGGRAVATE) tmp /= 2;
                if (r_ptr->level > (p_ptr->lev*p_ptr->lev/20+10)) tmp /= 3;
                /* Low-level monsters will find it difficult to locate the player. */
                if (randint0(tmp) > (r_ptr->level+20)) aware = FALSE;
@@ -2489,7 +2489,7 @@ msg_print("
                u32b notice = 0;
 
                /* Hack -- handle non-aggravation */
-               if (!p_ptr->aggravate) notice = randint0(1024);
+               if (!(p_ptr->cursed & TRC_AGGRAVATE)) notice = randint0(1024);
 
                /* Nightmare monsters are more alert */
                if (ironman_nightmare) notice /= 2;
@@ -2504,7 +2504,7 @@ msg_print("
                        if (m_ptr->cdis < 50) d = (100 / m_ptr->cdis);
 
                        /* Hack -- handle aggravation */
-                       if (p_ptr->aggravate) d = m_ptr->csleep;
+                       if (p_ptr->cursed & TRC_AGGRAVATE) d = m_ptr->csleep;
 
                        /* Still asleep */
                        if (m_ptr->csleep > d)
@@ -2738,7 +2738,7 @@ msg_format("%^s
        }
 
        /* No one wants to be your friend if you're aggravating */
-       if (is_friendly(m_ptr) && p_ptr->aggravate)
+       if (is_friendly(m_ptr) && (p_ptr->cursed & TRC_AGGRAVATE))
                gets_angry = TRUE;
 
        /* Paranoia... no pet uniques outside wizard mode -- TY */
@@ -3930,7 +3930,7 @@ void process_monsters(void)
 
                /* Handle "sight" and "aggravation" */
                else if ((m_ptr->cdis <= MAX_SIGHT) &&
-                       (player_has_los_bold(fy, fx) || p_ptr->aggravate))
+                       (player_has_los_bold(fy, fx) || (p_ptr->cursed & TRC_AGGRAVATE)))
                {
                        /* We can "see" or "feel" the player */
                        test = TRUE;
index f0f5af9..52e83dd 100644 (file)
@@ -693,9 +693,7 @@ put_str(format("Lv   %s   Fail Info", ((use_mind == MIND_BERSERKER) || (use_mind
                                                        chance += 5 * (mana_cost - p_ptr->csp);
                                                }
 
-                                               if (p_ptr->pseikaku == SEIKAKU_NAMAKE) chance += 10;
-                                               if (p_ptr->pseikaku == SEIKAKU_KIREMONO) chance -= 3;
-                                               if ((p_ptr->pseikaku == SEIKAKU_GAMAN) || (p_ptr->pseikaku == SEIKAKU_CHIKARA)) chance++;
+                                               chance += p_ptr->to_m_chance;
 
                                                /* Extract the minimum failure rate */
                                                minfail = adj_mag_fail[p_ptr->stat_ind[mp_ptr->spell_stat]];
@@ -1971,9 +1969,7 @@ if (!get_check("
                /* Reduce failure rate by "effective" level adjustment */
                chance -= 3 * (plev - spell.min_lev);
 
-               if (p_ptr->pseikaku == SEIKAKU_NAMAKE) chance += 10;
-               if (p_ptr->pseikaku == SEIKAKU_KIREMONO) chance -= 3;
-               if ((p_ptr->pseikaku == SEIKAKU_GAMAN) || (p_ptr->pseikaku == SEIKAKU_CHIKARA)) chance++;
+               chance += p_ptr->to_m_chance;
 
                /* Reduce failure rate by INT/WIS adjustment */
                chance -= 3 * (adj_mag_stat[p_ptr->stat_ind[mp_ptr->spell_stat]] - 1);
index bf6e093..83b65c2 100644 (file)
@@ -529,11 +529,36 @@ static void breath(int y, int x, int m_idx, int typ, int dam_hp, int rad, bool b
 }
 
 
+u32b get_curse(int power, object_type *o_ptr)
+{
+       u32b new_curse;
+
+       while(1)
+       {
+               new_curse = (1 << (randint0(MAX_CURSE)+4));
+               if (power == 2)
+               {
+                       if (!(new_curse & TRC_HEAVY_MASK)) continue;
+               }
+               else if (power == 0)
+               {
+                       if (new_curse & TRC_HEAVY_MASK) continue;
+               }
+               if (((o_ptr->tval < TV_BOW) || (o_ptr->tval > TV_SWORD)) && (new_curse == TRC_LOW_MELEE)) continue;
+               if (((o_ptr->tval < TV_BOOTS) || (o_ptr->tval > TV_DRAG_ARMOR)) && (new_curse == TRC_LOW_AC)) continue;
+               break;
+       }
+       return new_curse;
+}
+
 void curse_equipment(int chance, int heavy_chance)
 {
        bool        changed = FALSE;
+       int         curse_power = 0;
+       u32b        new_curse;
        u32b        o1, o2, o3;
        object_type *o_ptr = &inventory[INVEN_RARM + randint0(12)];
+       char o_name[MAX_NLEN];
 
        if (randint1(100) > chance) return;
 
@@ -541,12 +566,11 @@ void curse_equipment(int chance, int heavy_chance)
 
        object_flags(o_ptr, &o1, &o2, &o3);
 
+       object_desc(o_name, o_ptr, FALSE, 0);
 
        /* Extra, biased saving throw for blessed items */
        if ((o3 & TR3_BLESSED) && (randint1(888) > chance))
        {
-               char o_name[MAX_NLEN];
-               object_desc(o_name, o_ptr, FALSE, 0);
 #ifdef JP
 msg_format("%s¤Ï¼ö¤¤¤òÄ·¤ÍÊÖ¤·¤¿¡ª", o_name,
 #else
@@ -561,30 +585,38 @@ msg_format("%s
        if ((randint1(100) <= heavy_chance) &&
                (o_ptr->name1 || o_ptr->name2 || o_ptr->art_name))
        {
-               if (!(o3 & TR3_HEAVY_CURSE))
+               if (!(o_ptr->curse_flags & TRC_HEAVY_CURSE))
                        changed = TRUE;
-               o_ptr->art_flags3 |= TR3_HEAVY_CURSE;
-               o_ptr->art_flags3 |= TR3_CURSED;
-               o_ptr->ident |= IDENT_CURSED;
+               o_ptr->curse_flags |= TRC_HEAVY_CURSE;
+               o_ptr->curse_flags |= TRC_CURSED;
+               curse_power++;
        }
        else
        {
-               if (!(o_ptr->ident & IDENT_CURSED))
+               if (!cursed_p(o_ptr))
                        changed = TRUE;
-               o_ptr->art_flags3 |= TR3_CURSED;
-               o_ptr->ident |= IDENT_CURSED;
+               o_ptr->curse_flags |= TRC_CURSED;
+       }
+       if (heavy_chance >= 50) curse_power = 2;
+
+       new_curse = get_curse(curse_power, o_ptr);
+       if (!(o_ptr->curse_flags & new_curse))
+       {
+               changed = TRUE;
+               o_ptr->curse_flags |= new_curse;
        }
 
        if (changed)
        {
 #ifdef JP
-msg_print("°­°Õ¤ËËþ¤Á¤¿¹õ¤¤¥ª¡¼¥é¤¬¤¢¤Ê¤¿¤ò¤È¤ê¤Þ¤¤¤¿...");
+msg_format("°­°Õ¤ËËþ¤Á¤¿¹õ¤¤¥ª¡¼¥é¤¬%s¤ò¤È¤ê¤Þ¤¤¤¿...", o_name);
 #else
-               msg_print("There is a malignant black aura surrounding you...");
+               msg_format("There is a malignant black aura surrounding %s...", o_name);
 #endif
 
                o_ptr->feeling = FEEL_NONE;
        }
+       p_ptr->update |= (PU_BONUS);
 }
 
 
@@ -3558,7 +3590,7 @@ msg_format("%^s
                                for (i=INVEN_RARM;i<INVEN_TOTAL;i++)
                                {
                                        o_ptr = &inventory[i];
-                                       if(!(o_ptr->ident & IDENT_CURSED))
+                                       if(!cursed_p(o_ptr))
                                        {
                                                object_flags(o_ptr, &f1, &f2, &f3);
 
index 1acbf69..d173fdf 100644 (file)
@@ -3266,7 +3266,7 @@ msg_format("%^s
                                        for (i=INVEN_RARM;i<INVEN_TOTAL;i++)
                                        {
                                                o_ptr = &inventory[i];
-                                               if(!(o_ptr->ident & IDENT_CURSED))
+                                               if(!cursed_p(o_ptr))
                                                {
                                                        object_flags(o_ptr, &f1, &f2, &f3);
 
index 6d5842a..d7b17ee 100644 (file)
@@ -574,9 +574,7 @@ put_str("MP 
                                        if (plev > spell.level) chance -= 3 * (plev - spell.level);
                                        else chance += (spell.level - plev);
 
-                                       if (p_ptr->pseikaku == SEIKAKU_NAMAKE) chance += 10;
-                                       if (p_ptr->pseikaku == SEIKAKU_KIREMONO) chance -= 3;
-                                       if ((p_ptr->pseikaku == SEIKAKU_GAMAN) || (p_ptr->pseikaku == SEIKAKU_CHIKARA)) chance++;
+                                       chance += p_ptr->to_m_chance;
 
                                        /* Reduce failure rate by INT/WIS adjustment */
                                        chance -= 3 * (adj_mag_stat[p_ptr->stat_ind[A_INT]] - 1);
@@ -2036,9 +2034,7 @@ if (!get_check("
        if (plev > spell.level) chance -= 3 * (plev - spell.level);
        else chance += (spell.level - plev);
 
-       if (p_ptr->pseikaku == SEIKAKU_NAMAKE) chance += 10;
-       if (p_ptr->pseikaku == SEIKAKU_KIREMONO) chance -= 3;
-       if ((p_ptr->pseikaku == SEIKAKU_GAMAN) || (p_ptr->pseikaku == SEIKAKU_CHIKARA)) chance++;
+       chance += p_ptr->to_m_chance;
 
        /* Reduce failure rate by INT/WIS adjustment */
        chance -= 3 * (adj_mag_stat[p_ptr->stat_ind[A_INT]] - 1);
index d0bf8a6..4bf5c83 100644 (file)
@@ -116,10 +116,6 @@ void object_flags(object_type *o_ptr, u32b *f1, u32b *f2, u32b *f3)
                (*f1) = a_ptr->flags1;
                (*f2) = a_ptr->flags2;
                (*f3) = a_ptr->flags3;
-               if (!cursed_p(o_ptr))
-               {
-                       (*f3) &= ~(TR3_HEAVY_CURSE | TR3_CURSED);
-               }
        }
 
        /* Ego-item */
@@ -276,11 +272,6 @@ void object_flags_known(object_type *o_ptr, u32b *f1, u32b *f2, u32b *f3)
                        (*f1) = a_ptr->flags1;
                        (*f2) = a_ptr->flags2;
                        (*f3) = a_ptr->flags3;
-
-                       if (!cursed_p(o_ptr))
-                       {
-                               (*f3) &= ~(TR3_HEAVY_CURSE | TR3_CURSED);
-                       }
                }
 
                /* Random artifact ! */
@@ -342,14 +333,6 @@ void object_flags_known(object_type *o_ptr, u32b *f1, u32b *f2, u32b *f3)
                        (*f2) |= (TR2_RES_ACID | TR2_RES_ELEC | TR2_RES_FIRE | TR2_RES_COLD);;
                }
        }
-
-       if (cursed_p(o_ptr))
-       {
-               if (o_ptr->art_flags3 & TR3_CURSED)
-                       (*f3) |= (TR3_CURSED);
-               if (o_ptr->art_flags3 & TR3_HEAVY_CURSE)
-                       (*f3) |= (TR3_HEAVY_CURSE);
-       }
 }
 
 
@@ -3389,25 +3372,57 @@ info[i++] = "
 
        }
 
-       if (f3 & (TR3_DRAIN_EXP))
+       if (f3 & TR3_BLESSED)
        {
 #ifdef JP
-info[i++] = "¤½¤ì¤Ï·Ð¸³ÃͤòµÛ¤¤¼è¤ë¡£";
+info[i++] = "¤½¤ì¤Ï¿À¤Ë½ËÊ¡¤µ¤ì¤Æ¤¤¤ë¡£";
 #else
-               info[i++] = "It drains experience.";
+               info[i++] = "It has been blessed by the gods.";
 #endif
 
        }
-       if (f3 & (TR3_TELEPORT))
+
+       if (cursed_p(o_ptr))
        {
+               if (o_ptr->curse_flags & TRC_PERMA_CURSE)
+               {
 #ifdef JP
-info[i++] = "¤½¤ì¤Ï¥é¥ó¥À¥à¤Ê¥Æ¥ì¥Ý¡¼¥È¤ò°ú¤­µ¯¤³¤¹¡£";
+info[i++] = "¤½¤ì¤Ï±Ê±ó¤Î¼ö¤¤¤¬¤«¤±¤é¤ì¤Æ¤¤¤ë¡£";
 #else
-               info[i++] = "It induces random teleportation.";
+                       info[i++] = "It is permanently cursed.";
+#endif
+
+               }
+               else if (o_ptr->curse_flags & TRC_HEAVY_CURSE)
+               {
+#ifdef JP
+info[i++] = "¤½¤ì¤Ï¶¯ÎϤʼö¤¤¤¬¤«¤±¤é¤ì¤Æ¤¤¤ë¡£";
+#else
+                       info[i++] = "It is heavily cursed.";
+#endif
+
+               }
+               else
+               {
+#ifdef JP
+info[i++] = "¤½¤ì¤Ï¼ö¤ï¤ì¤Æ¤¤¤ë¡£";
+#else
+                       info[i++] = "It is cursed.";
 #endif
 
+               }
        }
-       if (f3 & TR3_AGGRAVATE)
+
+       if ((f3 & TR3_TY_CURSE) || (o_ptr->curse_flags & TRC_TY_CURSE))
+       {
+#ifdef JP
+info[i++] = "¤½¤ì¤ÏÂÀ¸Å¤Î²Ò¡¹¤·¤¤±åÇ°¤¬½É¤Ã¤Æ¤¤¤ë¡£";
+#else
+               info[i++] = "It carries an ancient foul curse.";
+#endif
+
+       }
+       if ((f3 & TR3_AGGRAVATE) || (o_ptr->curse_flags & TRC_AGGRAVATE))
        {
 #ifdef JP
 info[i++] = "¤½¤ì¤ÏÉÕ¶á¤Î¥â¥ó¥¹¥¿¡¼¤òÅܤ餻¤ë¡£";
@@ -3416,54 +3431,138 @@ info[i++] = "
 #endif
 
        }
+       if ((f3 & (TR3_DRAIN_EXP)) || (o_ptr->curse_flags & TRC_DRAIN_EXP))
+       {
+#ifdef JP
+info[i++] = "¤½¤ì¤Ï·Ð¸³ÃͤòµÛ¤¤¼è¤ë¡£";
+#else
+               info[i++] = "It drains experience.";
+#endif
 
-       if (f3 & TR3_BLESSED)
+       }
+       if (o_ptr->curse_flags & TRC_SLOW_REGEN)
        {
 #ifdef JP
-info[i++] = "¤½¤ì¤Ï¿À¤Ë½ËÊ¡¤µ¤ì¤Æ¤¤¤ë¡£";
+info[i++] = "¤½¤ì¤Ï²óÉüÎϤò¼å¤á¤ë¡£";
 #else
-               info[i++] = "It has been blessed by the gods.";
+               info[i++] = "It nanka.";
 #endif
 
        }
+       if (o_ptr->curse_flags & TRC_ADD_L_CURSE)
+       {
+#ifdef JP
+info[i++] = "¤½¤ì¤Ï¼å¤¤¼ö¤¤¤òÁý¤ä¤¹¡£";
+#else
+               info[i++] = "It nanka.";
+#endif
 
-       if (cursed_p(o_ptr))
+       }
+       if (o_ptr->curse_flags & TRC_ADD_H_CURSE)
        {
-               if (f3 & TR3_PERMA_CURSE)
-               {
 #ifdef JP
-info[i++] = "¤½¤ì¤Ï±Ê±ó¤Î¼ö¤¤¤¬¤«¤±¤é¤ì¤Æ¤¤¤ë¡£";
+info[i++] = "¤½¤ì¤Ï¶¯ÎϤʼö¤¤¤òÁý¤ä¤¹¡£";
 #else
-                       info[i++] = "It is permanently cursed.";
+               info[i++] = "It nanka.";
 #endif
 
-               }
-               else if (f3 & TR3_HEAVY_CURSE)
-               {
+       }
+       if (o_ptr->curse_flags & TRC_CALL_ANIMAL)
+       {
 #ifdef JP
-info[i++] = "¤½¤ì¤Ï¶¯ÎϤʼö¤¤¤¬¤«¤±¤é¤ì¤Æ¤¤¤ë¡£";
+info[i++] = "¤½¤ì¤Ïưʪ¤ò¸Æ¤Ó´ó¤»¤ë¡£";
 #else
-                       info[i++] = "It is heavily cursed.";
+               info[i++] = "It nanka.";
 #endif
 
-               }
-               else
-               {
+       }
+       if (o_ptr->curse_flags & TRC_CALL_DEMON)
+       {
 #ifdef JP
-info[i++] = "¤½¤ì¤Ï¼ö¤ï¤ì¤Æ¤¤¤ë¡£";
+info[i++] = "¤½¤ì¤Ï°­Ëâ¤ò¸Æ¤Ó´ó¤»¤ë¡£";
 #else
-                       info[i++] = "It is cursed.";
+               info[i++] = "It nanka.";
 #endif
 
-               }
        }
+       if (o_ptr->curse_flags & TRC_CALL_DRAGON)
+       {
+#ifdef JP
+info[i++] = "¤½¤ì¤Ï¥É¥é¥´¥ó¤ò¸Æ¤Ó´ó¤»¤ë¡£";
+#else
+               info[i++] = "It nanka.";
+#endif
 
-       if (f3 & TR3_TY_CURSE)
+       }
+       if (o_ptr->curse_flags & TRC_COWARDICE)
        {
 #ifdef JP
-info[i++] = "¤½¤ì¤ÏÂÀ¸Å¤Î²Ò¡¹¤·¤¤±åÇ°¤¬½É¤Ã¤Æ¤¤¤ë¡£";
+info[i++] = "¤½¤ì¤Ï¶²ÉÝ´¶¤ò°ú¤­µ¯¤³¤¹¡£";
 #else
-               info[i++] = "It carries an ancient foul curse.";
+               info[i++] = "It nanka.";
+#endif
+
+       }
+       if ((f3 & (TR3_TELEPORT)) || (o_ptr->curse_flags & TRC_TELEPORT))
+       {
+#ifdef JP
+info[i++] = "¤½¤ì¤Ï¥é¥ó¥À¥à¤Ê¥Æ¥ì¥Ý¡¼¥È¤ò°ú¤­µ¯¤³¤¹¡£";
+#else
+               info[i++] = "It induces random teleportation.";
+#endif
+
+       }
+       if (o_ptr->curse_flags & TRC_LOW_MELEE)
+       {
+#ifdef JP
+info[i++] = "¤½¤ì¤Ï¹¶·â¤ò³°¤·¤ä¤¹¤¤¡£";
+#else
+               info[i++] = "It nanka.";
+#endif
+
+       }
+       if (o_ptr->curse_flags & TRC_LOW_AC)
+       {
+#ifdef JP
+info[i++] = "¤½¤ì¤Ï¹¶·â¤ò¼õ¤±¤ä¤¹¤¤¡£";
+#else
+               info[i++] = "It nanka.";
+#endif
+
+       }
+       if (o_ptr->curse_flags & TRC_LOW_MAGIC)
+       {
+#ifdef JP
+info[i++] = "¤½¤ì¤ÏËâË¡¤ò¾§¤¨¤Ë¤¯¤¯¤¹¤ë¡£";
+#else
+               info[i++] = "It nanka.";
+#endif
+
+       }
+       if (o_ptr->curse_flags & TRC_FAST_DIGEST)
+       {
+#ifdef JP
+info[i++] = "¤½¤ì¤Ï¤¢¤Ê¤¿¤Î¿·ÄÄÂå¼Õ¤ò®¤¯¤¹¤ë¡£";
+#else
+               info[i++] = "It nanka.";
+#endif
+
+       }
+       if (o_ptr->curse_flags & TRC_DRAIN_HP)
+       {
+#ifdef JP
+info[i++] = "¤½¤ì¤Ï¤¢¤Ê¤¿¤ÎÂÎÎϤòµÛ¤¤¼è¤ë¡£";
+#else
+               info[i++] = "It nanka.";
+#endif
+
+       }
+       if (o_ptr->curse_flags & TRC_DRAIN_MANA)
+       {
+#ifdef JP
+info[i++] = "¤½¤ì¤Ï¤¢¤Ê¤¿¤ÎËâÎϤòµÛ¤¤¼è¤ë¡£";
+#else
+               info[i++] = "It nanka.";
 #endif
 
        }
index a5ec4ea..d006204 100644 (file)
@@ -1010,16 +1010,16 @@ s32b flag_cost(object_type * o_ptr, int plusses)
        if (f3 & TR3_DRAIN_EXP) total -= 12500;
        if (f3 & TR3_TELEPORT)
        {
-               if (o_ptr->ident & IDENT_CURSED)
+               if (cursed_p(o_ptr))
                        total -= 7500;
                else
                        total += 250;
        }
        if (f3 & TR3_AGGRAVATE) total -= 10000;
        if (f3 & TR3_BLESSED) total += 750;
-       if (f3 & TR3_CURSED) total -= 5000;
-       if (f3 & TR3_HEAVY_CURSE) total -= 12500;
-       if (f3 & TR3_PERMA_CURSE) total -= 15000;
+       if (o_ptr->curse_flags & TRC_CURSED) total -= 5000;
+       if (o_ptr->curse_flags & TRC_HEAVY_CURSE) total -= 12500;
+       if (o_ptr->curse_flags & TRC_PERMA_CURSE) total -= 15000;
 
        /* Also, give some extra for activatable powers... */
        if (o_ptr->art_name && (o_ptr->art_flags3 & TR3_ACTIVATE))
@@ -1675,7 +1675,7 @@ bool object_similar_part(object_type *o_ptr, object_type *j_ptr)
                return (0);
 
        /* Hack -- Require identical "cursed" status */
-       if ((o_ptr->ident & (IDENT_CURSED)) != (j_ptr->ident & (IDENT_CURSED))) return (0);
+       if (o_ptr->curse_flags != j_ptr->curse_flags) return (0);
 
        /* Hack -- Require identical "broken" status */
        if ((o_ptr->ident & (IDENT_BROKEN)) != (j_ptr->ident & (IDENT_BROKEN))) return (0);
@@ -1877,7 +1877,12 @@ void object_prep(object_type *o_ptr, int k_idx)
        if (get_object_cost(o_ptr) <= 0) o_ptr->ident |= (IDENT_BROKEN);
 
        /* Hack -- cursed items are always "cursed" */
-       if (k_ptr->flags3 & (TR3_CURSED)) o_ptr->ident |= (IDENT_CURSED);
+       if (k_ptr->gen_flags & (TRG_CURSED)) o_ptr->curse_flags |= (TRC_CURSED);
+       if (k_ptr->gen_flags & (TRG_HEAVY_CURSE)) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
+       if (k_ptr->gen_flags & (TRG_PERMA_CURSE)) o_ptr->curse_flags |= (TRC_PERMA_CURSE);
+       if (k_ptr->gen_flags & (TRG_RANDOM_CURSE0)) o_ptr->curse_flags |= get_curse(0, o_ptr);
+       if (k_ptr->gen_flags & (TRG_RANDOM_CURSE1)) o_ptr->curse_flags |= get_curse(1, o_ptr);
+       if (k_ptr->gen_flags & (TRG_RANDOM_CURSE2)) o_ptr->curse_flags |= get_curse(2, o_ptr);
 }
 
 
@@ -2260,7 +2265,7 @@ static void a_m_aux_1(object_type *o_ptr, int level, int power)
                }
 
                /* Cursed (if "bad") */
-               if (o_ptr->to_h + o_ptr->to_d < 0) o_ptr->ident |= (IDENT_CURSED);
+               if (o_ptr->to_h + o_ptr->to_d < 0) o_ptr->curse_flags |= TRC_CURSED;
        }
 
        if ((o_ptr->tval == TV_SWORD) && (o_ptr->sval == SV_DIAMOND_EDGE)) return;
@@ -2529,7 +2534,7 @@ static void a_m_aux_2(object_type *o_ptr, int level, int power)
                }
 
                /* Cursed (if "bad") */
-               if (o_ptr->to_a < 0) o_ptr->ident |= (IDENT_CURSED);
+               if (o_ptr->to_a < 0) o_ptr->curse_flags |= TRC_CURSED;
        }
 
 
@@ -2893,7 +2898,7 @@ static void a_m_aux_3(object_type *o_ptr, int level, int power)
                                                o_ptr->ident |= (IDENT_BROKEN);
 
                                                /* Cursed */
-                                               o_ptr->ident |= (IDENT_CURSED);
+                                               o_ptr->curse_flags |= TRC_CURSED;
 
                                                /* Reverse pval */
                                                o_ptr->pval = 0 - (o_ptr->pval);
@@ -2922,7 +2927,7 @@ static void a_m_aux_3(object_type *o_ptr, int level, int power)
                                                o_ptr->ident |= (IDENT_BROKEN);
 
                                                /* Cursed */
-                                               o_ptr->ident |= (IDENT_CURSED);
+                                               o_ptr->curse_flags |= TRC_CURSED;
 
                                                /* Reverse pval */
                                                o_ptr->pval = 0 - (o_ptr->pval);
@@ -2947,7 +2952,7 @@ static void a_m_aux_3(object_type *o_ptr, int level, int power)
                                                o_ptr->ident |= (IDENT_BROKEN);
 
                                                /* Cursed */
-                                               o_ptr->ident |= (IDENT_CURSED);
+                                               o_ptr->curse_flags |= TRC_CURSED;
 
                                                /* Reverse pval */
                                                o_ptr->pval = 0 - (o_ptr->pval);
@@ -2991,7 +2996,7 @@ static void a_m_aux_3(object_type *o_ptr, int level, int power)
                                                o_ptr->ident |= (IDENT_BROKEN);
 
                                                /* Cursed */
-                                               o_ptr->ident |= (IDENT_CURSED);
+                                               o_ptr->curse_flags |= TRC_CURSED;
 
                                                /* Reverse pval */
                                                o_ptr->pval = 0 - (o_ptr->pval);
@@ -3019,7 +3024,7 @@ static void a_m_aux_3(object_type *o_ptr, int level, int power)
                                        o_ptr->ident |= (IDENT_BROKEN);
 
                                        /* Cursed */
-                                       o_ptr->ident |= (IDENT_CURSED);
+                                       o_ptr->curse_flags |= TRC_CURSED;
 
                                        /* Penalize */
                                        o_ptr->pval = 0 - (1 + m_bonus(5, level));
@@ -3035,7 +3040,7 @@ static void a_m_aux_3(object_type *o_ptr, int level, int power)
                                        o_ptr->ident |= (IDENT_BROKEN);
 
                                        /* Cursed */
-                                       o_ptr->ident |= (IDENT_CURSED);
+                                       o_ptr->curse_flags |= TRC_CURSED;
 
                                        /* Penalize */
                                        o_ptr->to_a = 0 - (5 + m_bonus(10, level));
@@ -3058,7 +3063,7 @@ static void a_m_aux_3(object_type *o_ptr, int level, int power)
                                                o_ptr->ident |= (IDENT_BROKEN);
 
                                                /* Cursed */
-                                               o_ptr->ident |= (IDENT_CURSED);
+                                               o_ptr->curse_flags |= TRC_CURSED;
 
                                                /* Reverse bonus */
                                                o_ptr->to_d = 0 - o_ptr->to_d;
@@ -3080,7 +3085,7 @@ static void a_m_aux_3(object_type *o_ptr, int level, int power)
                                                o_ptr->ident |= (IDENT_BROKEN);
 
                                                /* Cursed */
-                                               o_ptr->ident |= (IDENT_CURSED);
+                                               o_ptr->curse_flags |= TRC_CURSED;
 
                                                /* Reverse tohit */
                                                o_ptr->to_h = 0 - o_ptr->to_h;
@@ -3102,7 +3107,7 @@ static void a_m_aux_3(object_type *o_ptr, int level, int power)
                                                o_ptr->ident |= (IDENT_BROKEN);
 
                                                /* Cursed */
-                                               o_ptr->ident |= (IDENT_CURSED);
+                                               o_ptr->curse_flags |= TRC_CURSED;
 
                                                /* Reverse toac */
                                                o_ptr->to_a = 0 - o_ptr->to_a;
@@ -3125,7 +3130,7 @@ static void a_m_aux_3(object_type *o_ptr, int level, int power)
                                                o_ptr->ident |= (IDENT_BROKEN);
 
                                                /* Cursed */
-                                               o_ptr->ident |= (IDENT_CURSED);
+                                               o_ptr->curse_flags |= TRC_CURSED;
 
                                                /* Reverse bonuses */
                                                o_ptr->to_h = 0 - o_ptr->to_h;
@@ -3147,7 +3152,7 @@ static void a_m_aux_3(object_type *o_ptr, int level, int power)
                                                o_ptr->ident |= (IDENT_BROKEN);
 
                                                /* Cursed */
-                                               o_ptr->ident |= (IDENT_CURSED);
+                                               o_ptr->curse_flags |= TRC_CURSED;
 
                                                /* Reverse bonuses */
                                                o_ptr->pval = 0 - o_ptr->pval;
@@ -3161,13 +3166,13 @@ static void a_m_aux_3(object_type *o_ptr, int level, int power)
                                        o_ptr->ident |= (IDENT_BROKEN);
 
                                        /* Cursed */
-                                       o_ptr->ident |= (IDENT_CURSED);
+                                       o_ptr->curse_flags |= TRC_CURSED;
 
                                        if (power > 0) power = 0 - power;
                                        break;
                                }
                        }
-                       if (one_in_(400) && (power > 0) && !(o_ptr->ident & IDENT_CURSED) && (level > 79))
+                       if (one_in_(400) && (power > 0) && !cursed_p(o_ptr) && (level > 79))
                        {
                                o_ptr->pval = MIN(o_ptr->pval,4);
                                /* Randart amulet */
@@ -3318,13 +3323,7 @@ static void a_m_aux_3(object_type *o_ptr, int level, int power)
                                        }
                                }
                                /* Uncurse it */
-                               o_ptr->ident &= ~(IDENT_CURSED);
-
-                               if (o_ptr->art_flags3 & TR3_CURSED)
-                                       o_ptr->art_flags3 &= ~(TR3_CURSED);
-
-                               if (o_ptr->art_flags3 & TR3_HEAVY_CURSE)
-                                       o_ptr->art_flags3 &= ~(TR3_HEAVY_CURSE);
+                               o_ptr->curse_flags = 0L;
                        }
                        else if ((power == -2) && one_in_(2))
                        {
@@ -3363,7 +3362,7 @@ static void a_m_aux_3(object_type *o_ptr, int level, int power)
                                o_ptr->ident |= (IDENT_BROKEN);
 
                                /* Cursed */
-                               o_ptr->ident |= (IDENT_CURSED);
+                               o_ptr->curse_flags |= (TRC_CURSED | TRC_HEAVY_CURSE);
                        }
                        break;
                }
@@ -3387,7 +3386,7 @@ static void a_m_aux_3(object_type *o_ptr, int level, int power)
                                                o_ptr->ident |= (IDENT_BROKEN);
 
                                                /* Cursed */
-                                               o_ptr->ident |= (IDENT_CURSED);
+                                               o_ptr->curse_flags |= (TRC_CURSED);
 
                                                /* Reverse bonuses */
                                                o_ptr->pval = 0 - o_ptr->pval;
@@ -3409,7 +3408,7 @@ static void a_m_aux_3(object_type *o_ptr, int level, int power)
                                                o_ptr->ident |= (IDENT_BROKEN);
 
                                                /* Cursed */
-                                               o_ptr->ident |= (IDENT_CURSED);
+                                               o_ptr->curse_flags |= (TRC_CURSED);
 
                                                /* Reverse bonuses */
                                                o_ptr->pval = 0 - o_ptr->pval;
@@ -3422,7 +3421,7 @@ static void a_m_aux_3(object_type *o_ptr, int level, int power)
                                {
                                        if (power < 0)
                                        {
-                                               o_ptr->ident |= (IDENT_CURSED);
+                                               o_ptr->curse_flags |= (TRC_CURSED);
                                        }
                                        break;
                                }
@@ -3446,7 +3445,7 @@ static void a_m_aux_3(object_type *o_ptr, int level, int power)
                                                o_ptr->ident |= (IDENT_BROKEN);
 
                                                /* Cursed */
-                                               o_ptr->ident |= (IDENT_CURSED);
+                                               o_ptr->curse_flags |= (TRC_CURSED);
 
                                                /* Reverse bonuses */
                                                o_ptr->pval = 0 - (o_ptr->pval);
@@ -3477,7 +3476,7 @@ static void a_m_aux_3(object_type *o_ptr, int level, int power)
                                        o_ptr->ident |= (IDENT_BROKEN);
 
                                        /* Cursed */
-                                       o_ptr->ident |= (IDENT_CURSED);
+                                       o_ptr->curse_flags |= (TRC_CURSED);
 
                                        /* Penalize */
                                        o_ptr->pval = 0 - (randint1(5) + m_bonus(5, level));
@@ -3498,7 +3497,7 @@ static void a_m_aux_3(object_type *o_ptr, int level, int power)
                                                o_ptr->ident |= (IDENT_BROKEN);
 
                                                /* Cursed */
-                                               o_ptr->ident |= (IDENT_CURSED);
+                                               o_ptr->curse_flags |= (TRC_CURSED);
 
                                                /* Reverse bonuses */
                                                o_ptr->pval = 0 - o_ptr->pval;
@@ -3507,7 +3506,7 @@ static void a_m_aux_3(object_type *o_ptr, int level, int power)
                                        break;
                                }
                        }
-                       if (one_in_(150) && (power > 0) && !(o_ptr->ident & IDENT_CURSED) && (level > 79))
+                       if (one_in_(150) && (power > 0) && !cursed_p(o_ptr) && (level > 79))
                        {
                                o_ptr->pval = MIN(o_ptr->pval,4);
                                /* Randart amulet */
@@ -3609,13 +3608,7 @@ static void a_m_aux_3(object_type *o_ptr, int level, int power)
                                        }
                                }
                                /* Uncurse it */
-                               o_ptr->ident &= ~(IDENT_CURSED);
-
-                               if (o_ptr->art_flags3 & TR3_CURSED)
-                                       o_ptr->art_flags3 &= ~(TR3_CURSED);
-
-                               if (o_ptr->art_flags3 & TR3_HEAVY_CURSE)
-                                       o_ptr->art_flags3 &= ~(TR3_HEAVY_CURSE);
+                               o_ptr->curse_flags = 0L;
                        }
                        else if ((power == -2) && one_in_(2))
                        {
@@ -3654,7 +3647,7 @@ static void a_m_aux_3(object_type *o_ptr, int level, int power)
                                o_ptr->ident |= (IDENT_BROKEN);
 
                                /* Cursed */
-                               o_ptr->ident |= (IDENT_CURSED);
+                               o_ptr->curse_flags |= (TRC_CURSED | TRC_HEAVY_CURSE);
                        }
                        break;
                }
@@ -3704,7 +3697,7 @@ static void a_m_aux_4(object_type *o_ptr, int level, int power)
                                o_ptr->ident |= (IDENT_BROKEN);
 
                                /* Cursed */
-                               o_ptr->ident |= (IDENT_CURSED);
+                               o_ptr->curse_flags |= (TRC_CURSED);
                        }
 #endif
                        break;
@@ -3823,7 +3816,7 @@ static void a_m_aux_4(object_type *o_ptr, int level, int power)
                        o_ptr->pval = i;
 
                        /* Some figurines are cursed */
-                       if (one_in_(6)) o_ptr->ident |= IDENT_CURSED;
+                       if (one_in_(6)) o_ptr->curse_flags |= TRC_CURSED;
 
                        if (cheat_peek)
                        {
@@ -3834,7 +3827,7 @@ static void a_m_aux_4(object_type *o_ptr, int level, int power)
 #endif
 
                                                          r_name + r_ptr->name, check - 1,
-                                                         !(o_ptr->ident & IDENT_CURSED) ? "" : " {cursed}");
+                                                         !cursed_p(o_ptr) ? "" : " {cursed}");
                        }
 
                        break;
@@ -4107,7 +4100,12 @@ void apply_magic(object_type *o_ptr, int lev, bool okay, bool good, bool great,
                if (!a_ptr->cost) o_ptr->ident |= (IDENT_BROKEN);
 
                /* Hack -- extract the "cursed" flag */
-               if (a_ptr->flags3 & TR3_CURSED) o_ptr->ident |= (IDENT_CURSED);
+               if (a_ptr->gen_flags & TRG_CURSED) o_ptr->curse_flags |= (TRC_CURSED);
+               if (a_ptr->gen_flags & TRG_HEAVY_CURSE) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
+               if (a_ptr->gen_flags & TRG_PERMA_CURSE) o_ptr->curse_flags |= (TRC_PERMA_CURSE);
+               if (a_ptr->gen_flags & (TRG_RANDOM_CURSE0)) o_ptr->curse_flags |= get_curse(0, o_ptr);
+               if (a_ptr->gen_flags & (TRG_RANDOM_CURSE1)) o_ptr->curse_flags |= get_curse(1, o_ptr);
+               if (a_ptr->gen_flags & (TRG_RANDOM_CURSE2)) o_ptr->curse_flags |= get_curse(2, o_ptr);
 
                /* Mega-Hack -- increase the rating */
                rating += 10;
@@ -4217,7 +4215,12 @@ void apply_magic(object_type *o_ptr, int lev, bool okay, bool good, bool great,
                if (!e_ptr->cost) o_ptr->ident |= (IDENT_BROKEN);
 
                /* Hack -- acquire "cursed" flag */
-               if (e_ptr->flags3 & (TR3_CURSED)) o_ptr->ident |= (IDENT_CURSED);
+               if (e_ptr->gen_flags & TRG_CURSED) o_ptr->curse_flags |= (TRC_CURSED);
+               if (e_ptr->gen_flags & TRG_HEAVY_CURSE) o_ptr->curse_flags |= (TRC_HEAVY_CURSE);
+               if (e_ptr->gen_flags & TRG_PERMA_CURSE) o_ptr->curse_flags |= (TRC_PERMA_CURSE);
+               if (e_ptr->gen_flags & (TRG_RANDOM_CURSE0)) o_ptr->curse_flags |= get_curse(0, o_ptr);
+               if (e_ptr->gen_flags & (TRG_RANDOM_CURSE1)) o_ptr->curse_flags |= get_curse(1, o_ptr);
+               if (e_ptr->gen_flags & (TRG_RANDOM_CURSE2)) o_ptr->curse_flags |= get_curse(2, o_ptr);
 
                if (e_ptr->gen_flags & (TRG_ONE_SUSTAIN)) one_sustain(o_ptr);
                if (e_ptr->gen_flags & (TRG_XTRA_POWER)) one_ability(o_ptr);
@@ -4314,7 +4317,12 @@ void apply_magic(object_type *o_ptr, int lev, bool okay, bool good, bool great,
                if (!get_object_cost(o_ptr)) o_ptr->ident |= (IDENT_BROKEN);
 
                /* Hack -- acquire "cursed" flag */
-               if (k_ptr->flags3 & (TR3_CURSED)) o_ptr->ident |= (IDENT_CURSED);
+               if (k_ptr->gen_flags & (TRG_CURSED)) o_ptr->curse_flags |= (TRC_CURSED);
+               if (k_ptr->gen_flags & (TRG_HEAVY_CURSE)) o_ptr->curse_flags |= TRC_HEAVY_CURSE;
+               if (k_ptr->gen_flags & (TRG_PERMA_CURSE)) o_ptr->curse_flags |= TRC_PERMA_CURSE;
+               if (k_ptr->gen_flags & (TRG_RANDOM_CURSE0)) o_ptr->curse_flags |= get_curse(0, o_ptr);
+               if (k_ptr->gen_flags & (TRG_RANDOM_CURSE1)) o_ptr->curse_flags |= get_curse(1, o_ptr);
+               if (k_ptr->gen_flags & (TRG_RANDOM_CURSE2)) o_ptr->curse_flags |= get_curse(2, o_ptr);
        }
 }
 
@@ -6709,7 +6717,7 @@ static void drain_essence(void)
        old_dd = o_ptr->dd;
        old_pval = o_ptr->pval;
        old_name2 = o_ptr->name2;
-       if (old_f3 & (TR3_CURSED | TR3_HEAVY_CURSE | TR3_PERMA_CURSE)) dec--;
+       if (o_ptr->curse_flags & (TRC_CURSED | TRC_HEAVY_CURSE | TRC_PERMA_CURSE)) dec--;
        if (old_f3 & (TR3_AGGRAVATE)) dec--;
        if (old_f3 & (TR3_NO_TELE)) dec--;
        if (old_f3 & (TR3_DRAIN_EXP)) dec--;
index 764b7b2..460f8d1 100644 (file)
@@ -568,6 +568,8 @@ static void wr_item(object_type *o_ptr)
        wr_u32b(o_ptr->art_flags2);
        wr_u32b(o_ptr->art_flags3);
 
+       wr_u32b(o_ptr->curse_flags);
+
        /* Held by monster index */
        wr_s16b(o_ptr->held_m_idx);
 
index 7eed947..e566087 100644 (file)
@@ -3794,7 +3794,7 @@ note = "
 
                                if (one_in_(4)) m_ptr->mflag2 |= MFLAG_NOPET;
                        }
-                       else if (p_ptr->aggravate)
+                       else if (p_ptr->cursed & TRC_AGGRAVATE)
                        {
 #ifdef JP
 note = "¤Ï¤¢¤Ê¤¿¤ËŨ°Õ¤òÊú¤¤¤Æ¤¤¤ë¡ª";
@@ -3873,7 +3873,7 @@ note = "
                                obvious = FALSE;
                                if (one_in_(4)) m_ptr->mflag2 |= MFLAG_NOPET;
                        }
-                       else if (p_ptr->aggravate)
+                       else if (p_ptr->cursed & TRC_AGGRAVATE)
                        {
 #ifdef JP
 note = "¤Ï¤¢¤Ê¤¿¤ËŨ°Õ¤òÊú¤¤¤Æ¤¤¤ë¡ª";
@@ -3948,7 +3948,7 @@ note = "
                                obvious = FALSE;
                                if (one_in_(4)) m_ptr->mflag2 |= MFLAG_NOPET;
                        }
-                       else if (p_ptr->aggravate)
+                       else if (p_ptr->cursed & TRC_AGGRAVATE)
                        {
 #ifdef JP
 note = "¤Ï¤¢¤Ê¤¿¤ËŨ°Õ¤òÊú¤¤¤Æ¤¤¤ë¡ª";
@@ -4032,7 +4032,7 @@ note = "
                                obvious = FALSE;
                                if (one_in_(4)) m_ptr->mflag2 |= MFLAG_NOPET;
                        }
-                       else if (p_ptr->aggravate)
+                       else if (p_ptr->cursed & TRC_AGGRAVATE)
                        {
 #ifdef JP
 note = "¤Ï¤¢¤Ê¤¿¤ËŨ°Õ¤òÊú¤¤¤Æ¤¤¤ë¡ª";
@@ -4121,7 +4121,7 @@ note = "
                                obvious = FALSE;
                                if (one_in_(4)) m_ptr->mflag2 |= MFLAG_NOPET;
                        }
-                       else if (p_ptr->aggravate)
+                       else if (p_ptr->cursed & TRC_AGGRAVATE)
                        {
 #ifdef JP
 note = "¤Ï¤¢¤Ê¤¿¤ËŨ°Õ¤òÊú¤¤¤Æ¤¤¤ë¡ª";
index 5dba2dc..33b70f5 100644 (file)
@@ -1773,7 +1773,16 @@ info[i++] = "
 #endif
 
        }
-       if (p_ptr->aggravate)
+       if (p_ptr->cursed & TRC_TY_CURSE)
+       {
+#ifdef JP
+info[i++] = "¤¢¤Ê¤¿¤Ï¼Ù°­¤Ê±åÇ°¤ËÊñ¤Þ¤ì¤Æ¤¤¤ë¡£";
+#else
+               info[i++] = "You nanka.";
+#endif
+
+       }
+       if (p_ptr->cursed & TRC_AGGRAVATE)
        {
 #ifdef JP
 info[i++] = "¤¢¤Ê¤¿¤Ï¥â¥ó¥¹¥¿¡¼¤òÅܤ餻¤Æ¤¤¤ë¡£";
@@ -1782,7 +1791,79 @@ info[i++] = "
 #endif
 
        }
-       if (p_ptr->teleport)
+       if (p_ptr->cursed & TRC_DRAIN_EXP)
+       {
+#ifdef JP
+info[i++] = "¤¢¤Ê¤¿¤Ï·Ð¸³ÃͤòµÛ¤ï¤ì¤Æ¤¤¤ë¡£";
+#else
+               info[i++] = "You nanka.";
+#endif
+
+       }
+       if (p_ptr->cursed & TRC_SLOW_REGEN)
+       {
+#ifdef JP
+info[i++] = "¤¢¤Ê¤¿¤Î²óÉüÎϤÏÈó¾ï¤ËÃÙ¤¤¡£";
+#else
+               info[i++] = "You nanka.";
+#endif
+
+       }
+       if (p_ptr->cursed & TRC_ADD_L_CURSE)
+       {
+#ifdef JP
+info[i++] = "¤¢¤Ê¤¿¤Ï..."; /* nanka */
+#else
+               info[i++] = "You nanka.";
+#endif
+
+       }
+       if (p_ptr->cursed & TRC_ADD_H_CURSE)
+       {
+#ifdef JP
+info[i++] = "¤¢¤Ê¤¿¤Ï..."; /* nanka */
+#else
+               info[i++] = "You nanka.";
+#endif
+
+       }
+       if (p_ptr->cursed & TRC_CALL_ANIMAL)
+       {
+#ifdef JP
+info[i++] = "¤¢¤Ê¤¿¤Ïưʪ¤ËÁÀ¤ï¤ì¤Æ¤¤¤ë¡£";
+#else
+               info[i++] = "You nanka.";
+#endif
+
+       }
+       if (p_ptr->cursed & TRC_CALL_DEMON)
+       {
+#ifdef JP
+info[i++] = "¤¢¤Ê¤¿¤Ï°­Ëâ¤ËÁÀ¤ï¤ì¤Æ¤¤¤ë¡£";
+#else
+               info[i++] = "You nanka.";
+#endif
+
+       }
+       if (p_ptr->cursed & TRC_CALL_DRAGON)
+       {
+#ifdef JP
+info[i++] = "¤¢¤Ê¤¿¤Ï¥É¥é¥´¥ó¤ËÁÀ¤ï¤ì¤Æ¤¤¤ë¡£";
+#else
+               info[i++] = "You nanka.";
+#endif
+
+       }
+       if (p_ptr->cursed & TRC_COWARDICE)
+       {
+#ifdef JP
+info[i++] = "¤¢¤Ê¤¿¤Ï»þ¡¹²²É¤ˤʤ롣";
+#else
+               info[i++] = "You are subject to cowardice.";
+#endif
+
+       }
+       if (p_ptr->cursed & TRC_TELEPORT)
        {
 #ifdef JP
 info[i++] = "¤¢¤Ê¤¿¤Î°ÌÃ֤ϤҤ¸¤ç¤¦¤ËÉÔ°ÂÄê¤À¡£";
@@ -1791,6 +1872,60 @@ info[i++] = "
 #endif
 
        }
+       if (p_ptr->cursed & TRC_LOW_MELEE)
+       {
+#ifdef JP
+info[i++] = "¤¢¤Ê¤¿¤ÎÉð´ï¤Ï¹¶·â¤ò³°¤·¤ä¤¹¤¤¡£";
+#else
+               info[i++] = "You nanka.";
+#endif
+
+       }
+       if (p_ptr->cursed & TRC_LOW_AC)
+       {
+#ifdef JP
+info[i++] = "¤¢¤Ê¤¿¤Ï¹¶·â¤ò¼õ¤±¤ä¤¹¤¤¡£";
+#else
+               info[i++] = "You nanka.";
+#endif
+
+       }
+       if (p_ptr->cursed & TRC_LOW_MAGIC)
+       {
+#ifdef JP
+info[i++] = "¤¢¤Ê¤¿¤ÏËâË¡¤ò¼ºÇÔ¤·¤ä¤¹¤¤¡£";
+#else
+               info[i++] = "You nanka.";
+#endif
+
+       }
+       if (p_ptr->cursed & TRC_FAST_DIGEST)
+       {
+#ifdef JP
+info[i++] = "¤¢¤Ê¤¿¤Ï¤¹¤°¤ªÊ¢¤¬¤Ø¤ë¡£";
+#else
+               info[i++] = "You nanka.";
+#endif
+
+       }
+       if (p_ptr->cursed & TRC_DRAIN_HP)
+       {
+#ifdef JP
+info[i++] = "¤¢¤Ê¤¿¤ÏÂÎÎϤòµÛ¤ï¤ì¤Æ¤¤¤ë¡£";
+#else
+               info[i++] = "You nanka.";
+#endif
+
+       }
+       if (p_ptr->cursed & TRC_DRAIN_MANA)
+       {
+#ifdef JP
+info[i++] = "¤¢¤Ê¤¿¤ÏËâÎϤòµÛ¤ï¤ì¤Æ¤¤¤ë¡£";
+#else
+               info[i++] = "You nanka.";
+#endif
+
+       }
        if (p_ptr->blessed)
        {
 #ifdef JP
index 6a2e0f6..e6a6d01 100644 (file)
@@ -1766,8 +1766,6 @@ static int remove_curse_aux(int all)
        /* Attempt to uncurse items being worn */
        for (i = INVEN_RARM; i < INVEN_TOTAL; i++)
        {
-               u32b f1, f2, f3;
-
                object_type *o_ptr = &inventory[i];
 
                /* Skip non-objects */
@@ -1776,27 +1774,18 @@ static int remove_curse_aux(int all)
                /* Uncursed already */
                if (!cursed_p(o_ptr)) continue;
 
-               /* Extract the flags */
-               object_flags(o_ptr, &f1, &f2, &f3);
-
                /* Heavily Cursed Items need a special spell */
-               if (!all && (f3 & TR3_HEAVY_CURSE)) continue;
+               if (!all && (o_ptr->curse_flags & TRC_HEAVY_CURSE)) continue;
 
                /* Perma-Cursed Items can NEVER be uncursed */
-               if (f3 & TR3_PERMA_CURSE) continue;
+               if (o_ptr->curse_flags & TRC_PERMA_CURSE) continue;
 
                /* Uncurse it */
-               o_ptr->ident &= ~(IDENT_CURSED);
+               o_ptr->curse_flags = 0L;
 
                /* Hack -- Assume felt */
                o_ptr->ident |= (IDENT_SENSE);
 
-               if (o_ptr->art_flags3 & TR3_CURSED)
-                       o_ptr->art_flags3 &= ~(TR3_CURSED);
-
-               if (o_ptr->art_flags3 & TR3_HEAVY_CURSE)
-                       o_ptr->art_flags3 &= ~(TR3_HEAVY_CURSE);
-
                /* Take note */
                o_ptr->feeling = FEEL_NONE;
 
@@ -2206,12 +2195,7 @@ bool item_tester_hook_nameless_weapon_armour(object_type *o_ptr)
  */
 static void break_curse(object_type *o_ptr)
 {
-       u32b    f1, f2, f3;
-
-       /* Extract the flags */
-       object_flags(o_ptr, &f1, &f2, &f3);
-
-       if (cursed_p(o_ptr) && !(f3 & TR3_PERMA_CURSE) && !(f3 & TR3_HEAVY_CURSE) && (randint0(100) < 25))
+       if (cursed_p(o_ptr) && !(o_ptr->curse_flags & TRC_PERMA_CURSE) && !(o_ptr->curse_flags & TRC_HEAVY_CURSE) && (randint0(100) < 25))
        {
 #ifdef JP
 msg_print("¤«¤±¤é¤ì¤Æ¤¤¤¿¼ö¤¤¤¬ÂǤÁÇˤé¤ì¤¿¡ª");
@@ -2219,13 +2203,10 @@ msg_print("
                msg_print("The curse is broken!");
 #endif
 
+               o_ptr->curse_flags = 0L;
 
-               o_ptr->ident &= ~(IDENT_CURSED);
                o_ptr->ident |= (IDENT_SENSE);
 
-               if (o_ptr->art_flags3 & TR3_CURSED)
-                       o_ptr->art_flags3 &= ~(TR3_CURSED);
-
                o_ptr->feeling = FEEL_NONE;
        }
 }
@@ -3319,10 +3300,10 @@ s = "
        /* Extract the flags */
        object_flags(o_ptr, &f1, &f2, &f3);
 
-       if (o_ptr->ident & IDENT_CURSED)
+       if (cursed_p(o_ptr))
        {
-               if (((f3 & TR3_HEAVY_CURSE) && (randint1(100) < 33)) ||
-                   (f3 & TR3_PERMA_CURSE))
+               if (((o_ptr->curse_flags & TRC_HEAVY_CURSE) && (randint1(100) < 33)) ||
+                   (o_ptr->curse_flags & TRC_PERMA_CURSE))
                {
 #ifdef JP
 msg_format("%s¤òʤ¤¦¹õ¤¤¥ª¡¼¥é¤Ï½ËÊ¡¤òÄ·¤ÍÊÖ¤·¤¿¡ª",
@@ -3345,7 +3326,7 @@ msg_format("%s 
 
 
                /* Uncurse it */
-               o_ptr->ident &= ~(IDENT_CURSED);
+               o_ptr->curse_flags = 0L;
 
                /* Hack -- Assume felt */
                o_ptr->ident |= (IDENT_SENSE);
@@ -3984,9 +3965,7 @@ s16b spell_chance(int spell, int realm)
                chance += 5 * (shouhimana - p_ptr->csp);
        }
 
-       if (p_ptr->pseikaku == SEIKAKU_NAMAKE) chance += 10;
-       if (p_ptr->pseikaku == SEIKAKU_KIREMONO) chance -= 3;
-       if ((p_ptr->pseikaku == SEIKAKU_GAMAN) || (p_ptr->pseikaku == SEIKAKU_CHIKARA)) chance++;
+       chance += p_ptr->to_m_chance;
        if (((realm + 1) != p_ptr->realm1) && ((p_ptr->pclass == CLASS_MAGE) || (p_ptr->pclass == CLASS_PRIEST))) chance += 5;
 
        /* Extract the minimum failure rate */
@@ -5196,7 +5175,7 @@ s = "
 
        o_ptr->art_flags3 |= TR3_IGNORE_ACID;
 
-       if ((o_ptr->to_a < 0) && !(o_ptr->ident & IDENT_CURSED))
+       if ((o_ptr->to_a < 0) && !cursed_p(o_ptr))
        {
 #ifdef JP
 msg_format("%s¤Ï¿·ÉÊƱÍͤˤʤä¿¡ª",o_name);
@@ -5284,7 +5263,7 @@ msg_format("
                o_ptr->art_flags3 = 0;
 
                /* Curse it */
-               o_ptr->ident |= (IDENT_CURSED);
+               o_ptr->curse_flags = TRC_CURSED;
 
                /* Break it */
                o_ptr->ident |= (IDENT_BROKEN);
@@ -5364,7 +5343,7 @@ if (!force) msg_format("
 
 
                /* Curse it */
-               o_ptr->ident |= (IDENT_CURSED);
+               o_ptr->curse_flags = TRC_CURSED;
 
                /* Break it */
                o_ptr->ident |= (IDENT_BROKEN);
index 7a8595f..f8d6ea9 100644 (file)
@@ -526,6 +526,8 @@ struct object_type
        u32b art_flags2;        /* Flags, set 2  for the random artifacts of*/
        u32b art_flags3;        /* Flags, set 3  Zangband */
 
+       u32b curse_flags;        /* Flags for curse */
+
        s16b next_o_idx;        /* Next object in stack (if any) */
 
        s16b held_m_idx;        /* Monster holding us (if any) */
@@ -1180,13 +1182,10 @@ struct player_type
        bool sustain_con;       /* Keep constitution */
        bool sustain_chr;       /* Keep charisma */
 
-       bool aggravate;         /* Aggravate monsters */
-       bool teleport;          /* Random teleporting */
+       u32b cursed;            /* Player is cursed */
        bool sutemi;
        bool counter;
 
-       bool exp_drain;         /* Experience draining */
-
        bool can_swim;                  /* No damage falling */
        bool ffall;                     /* No damage falling */
        bool lite;                      /* Permanent light */
@@ -1221,6 +1220,8 @@ struct player_type
        s16b to_d_m;                    /* Bonus to dam (misc) */
        s16b to_a;                      /* Bonus to ac */
 
+       s16b to_m_chance;               /* Minusses to cast chance */
+
        bool ryoute;
        bool migite;
        bool hidarite;
index ecd94c6..d8ae52e 100644 (file)
@@ -1193,7 +1193,7 @@ static void analyze_misc_magic (object_type *o_ptr, cptr *misc_list)
                        *misc_list++ = "Ancient Curse";
 #endif
                }
-               if (f3 & TR3_PERMA_CURSE)
+               if (o_ptr->curse_flags & TRC_PERMA_CURSE)
                {
 #ifdef JP
                        *misc_list++ = "±Ê±ó¤Î¼ö¤¤";
@@ -1201,7 +1201,7 @@ static void analyze_misc_magic (object_type *o_ptr, cptr *misc_list)
                        *misc_list++ = "Permanently Cursed";
 #endif
                }
-               else if (f3 & TR3_HEAVY_CURSE)
+               else if (o_ptr->curse_flags & TRC_HEAVY_CURSE)
                {
 #ifdef JP
                        *misc_list++ = "¶¯ÎϤʼö¤¤";
@@ -1210,7 +1210,7 @@ static void analyze_misc_magic (object_type *o_ptr, cptr *misc_list)
 #endif
                }
 /*             else */
-               else if (f3 & TR3_CURSED)
+               else if (o_ptr->curse_flags & TRC_CURSED)
                {
 #ifdef JP
                        *misc_list++ = "¼ö¤¤";
index 2d3295d..35edaf7 100644 (file)
@@ -571,26 +571,26 @@ static void wiz_display_item(object_type *o_ptr)
 
        prt("+------------FLAGS1------------+", 10, j);
        prt("AFFECT........SLAY........BRAND.", 11, j);
-       prt("      mr      cvae      xsqpaefc", 12, j);
-       prt("siwdccsissidsahanvudotgddhuoclio", 13, j);
-       prt("tnieohtrtrnipttmiinmrrnrrraiierl", 14, j);
-       prt("rtsxnarylcfgdkcpmldncltggpksdced", 15, j);
+       prt("      mf      cvae      xsqpaefc", 12, j);
+       prt("siwdccsossidsahanvudotgddhuoclio", 13, j);
+       prt("tnieohtctrnipttmiinmrrnrrraiierl", 14, j);
+       prt("rtsxnarelcfgdkcpmldncltggpksdced", 15, j);
        prt_binary(f1, 16, j);
 
        prt("+------------FLAGS2------------+", 17, j);
        prt("SUST....IMMUN.RESIST............", 18, j);
-       prt("        aefctrpsaefcpfldbc sn   ", 19, j);
-       prt("siwdcc  clioheatcliooeialoshtncd", 20, j);
-       prt("tnieoh  ierlrfraierliatrnnnrhehi", 21, j);
-       prt("rtsxna..dcedwlatdcedsrekdfddrxss", 22, j);
+       prt("      r aefctrpsaefcpfldbc sn   ", 19, j);
+       prt("siwdcci clioheatcliooeialoshtncd", 20, j);
+       prt("tnieohd ierlrfraierliatrnnnrhehi", 21, j);
+       prt("rtsxnae.dcedwlatdcedsrekdfddrxss", 22, j);
        prt_binary(f2, 23, j);
 
        prt("+------------FLAGS3------------+", 10, j+32);
-       prt("fe cnn t      stdrmsiiii d abchp", 11, j+32);
-       prt("aa aoomywhs lleeieihgggg rtgluvr", 12, j+32);
-       prt("uu utmacaih eielgggonnnnaaerercc", 13, j+32);
-       prt("rr reanurdo vtieeehtrrrrcilassuu", 14, j+32);
-       prt("aa algarnew ienpsntsaefctnevserr", 15, j+32);
+       prt("fe cnn t      stdrmsiiii d ab   ", 11, j+32);
+       prt("aa aoomywhs lleeieihgggg rtgl   ", 12, j+32);
+       prt("uu utmacaih eielgggonnnnaaere   ", 13, j+32);
+       prt("rr reanurdo vtieeehtrrrrcilas   ", 14, j+32);
+       prt("aa algarnew ienpsntsaefctnevs   ", 15, j+32);
        prt_binary(f3, 16, j+32);
 }
 
@@ -1382,7 +1382,7 @@ static void wiz_create_item(void)
 static void do_cmd_wiz_cure_all(void)
 {
        /* Remove curses */
-       (void)remove_all_curse();
+//     (void)remove_all_curse();
 
        /* Restore stats */
        (void)res_stat(A_STR);
index c12b1c8..8fc2cda 100644 (file)
@@ -3215,6 +3215,8 @@ void calc_bonuses(void)
        p_ptr->to_h_m = 0;
        p_ptr->to_d_m = 0;
 
+       p_ptr->to_m_chance = 0;
+
        /* Start with "normal" speed */
        p_ptr->pspeed = 110;
 
@@ -3232,9 +3234,7 @@ void calc_bonuses(void)
        p_ptr->tval_ammo = 0;
 
        /* Clear all the flags */
-       p_ptr->aggravate = FALSE;
-       p_ptr->teleport = FALSE;
-       p_ptr->exp_drain = FALSE;
+       p_ptr->cursed = 0L;
        p_ptr->bless_blade = FALSE;
        p_ptr->xtra_might = FALSE;
        p_ptr->impact[0] = FALSE;
@@ -3773,7 +3773,10 @@ void calc_bonuses(void)
        }
 
        /* Sexy Gal */
-       if (p_ptr->pseikaku == SEIKAKU_SEXY) p_ptr->aggravate = TRUE;
+       if (p_ptr->pseikaku == SEIKAKU_SEXY) p_ptr->cursed |= (TRC_AGGRAVATE);
+       if (p_ptr->pseikaku == SEIKAKU_NAMAKE) p_ptr->to_m_chance += 10;
+       if (p_ptr->pseikaku == SEIKAKU_KIREMONO) p_ptr->to_m_chance -= 3;
+       if ((p_ptr->pseikaku == SEIKAKU_GAMAN) || (p_ptr->pseikaku == SEIKAKU_CHIKARA)) p_ptr->to_m_chance++;
 
        /* Lucky man */
        if (p_ptr->pseikaku == SEIKAKU_LUCKY) p_ptr->muta3 |= MUT3_GOOD_LUCK;
@@ -3992,11 +3995,13 @@ void calc_bonuses(void)
 
                /* Skip non-objects */
                if (!o_ptr->k_idx) continue;
-               if (o_ptr->tval == TV_CAPTURE) continue;
 
                /* Extract the item flags */
                object_flags(o_ptr, &f1, &f2, &f3);
 
+               p_ptr->cursed |= (o_ptr->curse_flags & (0xFFFFFFF0L));
+               if (o_ptr->name1 == ART_CHAINSWORD) p_ptr->cursed |= TRC_CHAINSWORD;
+
                /* Affect stats */
                if (f1 & (TR1_STR)) p_ptr->stat_add[A_STR] += o_ptr->pval;
                if (f1 & (TR1_INT)) p_ptr->stat_add[A_INT] += o_ptr->pval;
@@ -4040,10 +4045,10 @@ void calc_bonuses(void)
                if (f3 & (TR3_XTRA_SHOTS)) extra_shots++;
 
                /* Various flags */
+               if (f3 & (TR3_AGGRAVATE))   p_ptr->cursed |= TRC_AGGRAVATE;
+               if (f3 & (TR3_DRAIN_EXP))   p_ptr->cursed |= TRC_DRAIN_EXP;
+               if (f3 & (TR3_TY_CURSE))    p_ptr->cursed |= TRC_TY_CURSE;
                if (f3 & (TR3_DEC_MANA))    p_ptr->dec_mana = TRUE;
-               if (f3 & (TR3_AGGRAVATE))   p_ptr->aggravate = TRUE;
-               if (f3 & (TR3_TELEPORT))    p_ptr->teleport = TRUE;
-               if (f3 & (TR3_DRAIN_EXP))   p_ptr->exp_drain = TRUE;
                if (f3 & (TR3_BLESSED))     p_ptr->bless_blade = TRUE;
                if (f3 & (TR3_XTRA_MIGHT))  p_ptr->xtra_might = TRUE;
                if (f3 & (TR3_SLOW_DIGEST)) p_ptr->slow_digest = TRUE;
@@ -4055,6 +4060,13 @@ void calc_bonuses(void)
                if (f2 & (TR2_HOLD_LIFE))   p_ptr->hold_life = TRUE;
                if (f3 & (TR3_WARNING))     p_ptr->warning = TRUE;
 
+               if (f3 & (TR3_TELEPORT))
+               {
+                       if (cursed_p(o_ptr)) p_ptr->cursed |= TRC_TELEPORT;
+                       else if (!o_ptr->inscription || !(strchr(quark_str(o_ptr->inscription),'.')))
+                               p_ptr->cursed |= TRC_TELEPORT_SELF;
+               }
+
                /* Immunity flags */
                if (f2 & (TR2_IM_FIRE)) p_ptr->immune_fire = TRUE;
                if (f2 & (TR2_IM_ACID)) p_ptr->immune_acid = TRUE;
@@ -4102,6 +4114,20 @@ void calc_bonuses(void)
                if (o_ptr->name2 == EGO_AMU_FOOL) p_ptr->heavy_spell = TRUE;
                if (o_ptr->name2 == EGO_AMU_NAIVETY) down_saving = TRUE;
 
+               if (o_ptr->curse_flags & TRC_LOW_MAGIC)
+               {
+                       if (o_ptr->curse_flags & TRC_HEAVY_CURSE)
+                       {
+                               p_ptr->to_m_chance += 10;
+                       }
+                       else
+                       {
+                               p_ptr->to_m_chance += 3;
+                       }
+               }
+
+               if (o_ptr->tval == TV_CAPTURE) continue;
+
                /* Modify the base armor class */
                p_ptr->ac += o_ptr->ac;
 
@@ -4114,6 +4140,51 @@ void calc_bonuses(void)
                /* Apply the mental bonuses to armor class, if known */
                if (object_known_p(o_ptr)) p_ptr->dis_to_a += o_ptr->to_a;
 
+               if (o_ptr->curse_flags & TRC_LOW_MELEE)
+               {
+                       int slot = i - INVEN_RARM;
+                       if (slot < 2)
+                       {
+                               if (o_ptr->curse_flags & TRC_HEAVY_CURSE)
+                               {
+                                       p_ptr->to_h[slot] -= 15;
+                                       if (o_ptr->ident & IDENT_MENTAL) p_ptr->dis_to_h[slot] -= 15;
+                               }
+                               else
+                               {
+                                       p_ptr->to_h[slot] -= 5;
+                                       if (o_ptr->ident & IDENT_MENTAL) p_ptr->dis_to_h[slot] -= 5;
+                               }
+                       }
+                       else
+                       {
+                               if (o_ptr->curse_flags & TRC_HEAVY_CURSE)
+                               {
+                                       p_ptr->to_h_b -= 15;
+                                       if (o_ptr->ident & IDENT_MENTAL) p_ptr->dis_to_h_b -= 15;
+                               }
+                               else
+                               {
+                                       p_ptr->to_h_b -= 5;
+                                       if (o_ptr->ident & IDENT_MENTAL) p_ptr->dis_to_h_b -= 5;
+                               }
+                       }
+               }
+
+               if (o_ptr->curse_flags & TRC_LOW_AC)
+               {
+                       if (o_ptr->curse_flags & TRC_HEAVY_CURSE)
+                       {
+                               p_ptr->to_a -= 30;
+                               if (o_ptr->ident & IDENT_MENTAL) p_ptr->dis_to_a -= 30;
+                       }
+                       else
+                       {
+                               p_ptr->to_a -= 10;
+                               if (o_ptr->ident & IDENT_MENTAL) p_ptr->dis_to_a -= 10;
+                       }
+               }
+
                /* Hack -- do not apply "weapon" bonuses */
                if (i == INVEN_RARM && buki_motteruka(i)) continue;
                if (i == INVEN_LARM && buki_motteruka(i)) continue;
@@ -4186,6 +4257,8 @@ void calc_bonuses(void)
                }
        }
 
+       if (p_ptr->cursed & TRC_TELEPORT) p_ptr->cursed &= ~(TRC_TELEPORT_SELF);
+
        /* Monks get extra ac for armour _not worn_ */
        if (((p_ptr->pclass == CLASS_MONK) || (p_ptr->pclass == CLASS_FORCETRAINER)) && !heavy_armor())
        {
@@ -5247,9 +5320,9 @@ void calc_bonuses(void)
        p_ptr->skill_tht += ((cp_ptr->x_thb * p_ptr->lev / 10) + (ap_ptr->a_thb * p_ptr->lev / 50));
 
 
-       if ((prace_is_(RACE_S_FAIRY)) && (p_ptr->pseikaku != SEIKAKU_SEXY) && p_ptr->aggravate)
+       if ((prace_is_(RACE_S_FAIRY)) && (p_ptr->pseikaku != SEIKAKU_SEXY) && (p_ptr->cursed & TRC_AGGRAVATE))
        {
-               p_ptr->aggravate = FALSE;
+               p_ptr->cursed &= ~(TRC_AGGRAVATE);
                p_ptr->skill_stl = MIN(p_ptr->skill_stl - 3, (p_ptr->skill_stl + 2) / 2);
        }