From: hoge Date: Fri, 15 Mar 2002 12:10:24 +0000 (+0000) Subject: 呪いは外れないだけではなく、いろいろイヤな効果がある。 X-Git-Tag: v2.1.2~2396 X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=355949d3246c3e5d99de083fcb912c1a9d23ddb7;p=hengband%2Fhengband.git 呪いは外れないだけではなく、いろいろイヤな効果がある。 --- diff --git a/configure.in b/configure.in index 73fa0adbb..3c7913028 100644 --- a/configure.in +++ b/configure.in @@ -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], diff --git a/lib/edit/a_info_j.txt b/lib/edit/a_info_j.txt index 804b42ff0..1c404fbfe 100644 --- a/lib/edit/a_info_j.txt +++ b/lib/edit/a_info_j.txt @@ -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:»ÈÍѤ¹¤ë¼Ô¤ËºÒ¤¤¤ò¤â¤¿¤é¤¹¡£ diff --git a/lib/edit/e_info_j.txt b/lib/edit/e_info_j.txt index b99dc8de2..832012f6f 100644 --- a/lib/edit/e_info_j.txt +++ b/lib/edit/e_info_j.txt @@ -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) diff --git a/lib/edit/k_info_j.txt b/lib/edit/k_info_j.txt index 069108936..00a2c126c 100644 --- a/lib/edit/k_info_j.txt +++ b/lib/edit/k_info_j.txt @@ -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 ##### diff --git a/src/artifact.c b/src/artifact.c index 23cc90959..76e7a3865 100644 --- a/src/artifact.c +++ b/src/artifact.c @@ -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); diff --git a/src/cmd1.c b/src/cmd1.c index 6f3d610a9..16bb7a8de 100644 --- a/src/cmd1.c +++ b/src/cmd1.c @@ -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) { diff --git a/src/cmd2.c b/src/cmd2.c index 86ddd81de..e232246c1 100644 --- a/src/cmd2.c +++ b/src/cmd2.c @@ -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 diff --git a/src/cmd3.c b/src/cmd3.c index 1525a84ab..023bcbdd9 100644 --- a/src/cmd3.c +++ b/src/cmd3.c @@ -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 diff --git a/src/cmd6.c b/src/cmd6.c index 0a975893f..b13d089d1 100644 --- a/src/cmd6.c +++ b/src/cmd6.c @@ -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; diff --git a/src/defines.h b/src/defines.h index 94e62f461..0af50574d 100644 --- a/src/defines.h +++ b/src/defines.h @@ -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 @@ -2845,7 +2845,9 @@ #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 */ @@ -2930,7 +2932,7 @@ #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 @@ -2987,9 +2989,6 @@ #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 */ @@ -3002,6 +3001,12 @@ #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 */ /* @@ -3015,6 +3020,42 @@ 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 ***/ @@ -3689,7 +3730,7 @@ * Cursed items. */ #define cursed_p(T) \ - ((T)->ident & (IDENT_CURSED)) + ((T)->curse_flags) /* diff --git a/src/dungeon.c b/src/dungeon.c index 271df195f..9e68db669 100644 --- a/src/dungeon.c +++ b/src/dungeon.c @@ -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) diff --git a/src/effects.c b/src/effects.c index 741503af7..c052e1159 100644 --- a/src/effects.c +++ b/src/effects.c @@ -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) { diff --git a/src/externs.h b/src/externs.h index 34edfc381..ec1c4fc8e 100644 --- a/src/externs.h +++ b/src/externs.h @@ -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); diff --git a/src/files.c b/src/files.c index f2b8a99d5..9cd48c218 100644 --- a/src/files.c +++ b/src/files.c @@ -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 }; diff --git a/src/init1.c b/src/init1.c index ba3f022b3..4b4c646b4 100644 --- a/src/init1.c +++ b/src/init1.c @@ -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", diff --git a/src/load.c b/src/load.c index eca59056f..e74c61ed8 100644 --- a/src/load.c +++ b/src/load.c @@ -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); diff --git a/src/mane.c b/src/mane.c index caf892c92..6650f43a8 100644 --- a/src/mane.c +++ b/src/mane.c @@ -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]]; diff --git a/src/melee2.c b/src/melee2.c index c02d0194b..9a98a9d48 100644 --- a/src/melee2.c +++ b/src/melee2.c @@ -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; diff --git a/src/mind.c b/src/mind.c index f0f5af9d7..52e83dd45 100644 --- a/src/mind.c +++ b/src/mind.c @@ -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); diff --git a/src/mspells1.c b/src/mspells1.c index bf6e09399..83b65c2c2 100644 --- a/src/mspells1.c +++ b/src/mspells1.c @@ -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;iident & IDENT_CURSED)) + if(!cursed_p(o_ptr)) { object_flags(o_ptr, &f1, &f2, &f3); diff --git a/src/mspells2.c b/src/mspells2.c index 1acbf6956..d173fdf68 100644 --- a/src/mspells2.c +++ b/src/mspells2.c @@ -3266,7 +3266,7 @@ msg_format("%^s for (i=INVEN_RARM;iident & IDENT_CURSED)) + if(!cursed_p(o_ptr)) { object_flags(o_ptr, &f1, &f2, &f3); diff --git a/src/mspells3.c b/src/mspells3.c index 6d5842a54..d7b17ee5d 100644 --- a/src/mspells3.c +++ b/src/mspells3.c @@ -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); diff --git a/src/object1.c b/src/object1.c index d0bf8a6e6..4bf5c830e 100644 --- a/src/object1.c +++ b/src/object1.c @@ -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 } diff --git a/src/object2.c b/src/object2.c index a5ec4ea75..d00620448 100644 --- a/src/object2.c +++ b/src/object2.c @@ -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--; diff --git a/src/save.c b/src/save.c index 764b7b2b3..460f8d13b 100644 --- a/src/save.c +++ b/src/save.c @@ -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); diff --git a/src/spells1.c b/src/spells1.c index 7eed9474f..e566087de 100644 --- a/src/spells1.c +++ b/src/spells1.c @@ -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 = "¤Ï¤¢¤Ê¤¿¤ËŨ°Õ¤òÊú¤¤¤Æ¤¤¤ë¡ª"; diff --git a/src/spells2.c b/src/spells2.c index 5dba2dcee..33b70f5fb 100644 --- a/src/spells2.c +++ b/src/spells2.c @@ -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 diff --git a/src/spells3.c b/src/spells3.c index 6a2e0f666..e6a6d0162 100644 --- a/src/spells3.c +++ b/src/spells3.c @@ -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); diff --git a/src/types.h b/src/types.h index 7a8595fdc..f8d6ea96d 100644 --- a/src/types.h +++ b/src/types.h @@ -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; diff --git a/src/wizard1.c b/src/wizard1.c index ecd94c676..d8ae52e89 100644 --- a/src/wizard1.c +++ b/src/wizard1.c @@ -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++ = "¼ö¤¤"; diff --git a/src/wizard2.c b/src/wizard2.c index 2d3295dab..35edaf794 100644 --- a/src/wizard2.c +++ b/src/wizard2.c @@ -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); diff --git a/src/xtra1.c b/src/xtra1.c index c12b1c83d..8fc2cda8a 100644 --- a/src/xtra1.c +++ b/src/xtra1.c @@ -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); }