diff --git a/doc/fixes37.0 b/doc/fixes37.0 index 72535099e..987be58e0 100644 --- a/doc/fixes37.0 +++ b/doc/fixes37.0 @@ -717,6 +717,7 @@ mark some messages as urgent ("You die*.", having equipment stolen, being if a leashed pet changed name (#name m) or an unnamed pet changed type (polymorph or grow-up) and perm_invent was On, persistent inventory display didn't get updated to show the leash's changed information +give some dragon armor extra effects when worn Fixes to 3.7.0-x Problems that Were Exposed Via git Repository diff --git a/include/youprop.h b/include/youprop.h index 1cb1e337f..22fe2ca38 100644 --- a/include/youprop.h +++ b/include/youprop.h @@ -66,7 +66,8 @@ /* Intrinsics only */ #define HSick_resistance u.uprops[SICK_RES].intrinsic -#define Sick_resistance (HSick_resistance || defends(AD_DISE, uwep)) +#define ESick_resistance u.uprops[SICK_RES].extrinsic +#define Sick_resistance (HSick_resistance || ESick_resistance || defends(AD_DISE, uwep)) #define Invulnerable u.uprops[INVULNERABLE].intrinsic /* [Tom] */ diff --git a/src/do_wear.c b/src/do_wear.c index 4cfef9ac7..890a7c1c6 100644 --- a/src/do_wear.c +++ b/src/do_wear.c @@ -30,6 +30,7 @@ static int Gloves_on(void); static void wielding_corpse(struct obj *, boolean); static int Shield_on(void); static int Shirt_on(void); +static void dragon_armor_handling(struct obj *, boolean); static void Amulet_on(void); static void learnring(struct obj *, boolean); static void Ring_off_or_gone(struct obj *, boolean); @@ -691,16 +692,100 @@ Shirt_off(void) return 0; } +/* handle extra abilities for hero wearing dragon scale armor */ +static void +dragon_armor_handling(struct obj *otmp, boolean puton) +{ + if (!otmp) + return; + + switch (otmp->otyp) { + /* grey: no extra effect */ + /* silver: no extra effect */ + case BLACK_DRAGON_SCALES: + case BLACK_DRAGON_SCALE_MAIL: + if (puton) { + EDrain_resistance |= W_ARM; + } else { + EDrain_resistance &= ~W_ARM; + } + break; + case BLUE_DRAGON_SCALES: + case BLUE_DRAGON_SCALE_MAIL: + if (puton) { + if (!Very_fast) + pline("You speed up%s.", Fast ? " a bit more" : ""); + EFast |= W_ARM; + } else { + EFast &= ~W_ARM; + if (!Very_fast && !g.context.takeoff.cancelled_don) + pline("You slow down."); + } + break; + case GREEN_DRAGON_SCALES: + case GREEN_DRAGON_SCALE_MAIL: + if (puton) { + ESick_resistance |= W_ARM; + } else { + ESick_resistance &= ~W_ARM; + } + break; + case RED_DRAGON_SCALES: + case RED_DRAGON_SCALE_MAIL: + if (puton) { + EInfravision |= W_ARM; + } else { + EInfravision &= ~W_ARM; + } + see_monsters(); + break; + case GOLD_DRAGON_SCALES: + case GOLD_DRAGON_SCALE_MAIL: + (void) make_hallucinated((long) !puton, + g.program_state.restoring ? FALSE : TRUE, + W_ARM); + break; + case ORANGE_DRAGON_SCALES: + case ORANGE_DRAGON_SCALE_MAIL: + if (puton) { + Free_action |= W_ARM; + } else { + Free_action &= ~W_ARM; + } + break; + case YELLOW_DRAGON_SCALES: + case YELLOW_DRAGON_SCALE_MAIL: + if (puton) { + EStone_resistance |= W_ARM; + } else { + EStone_resistance &= ~W_ARM; + } + break; + case WHITE_DRAGON_SCALES: + case WHITE_DRAGON_SCALE_MAIL: + if (puton) { + ESlow_digestion |= W_ARM; + } else { + ESlow_digestion &= ~W_ARM; + } + break; + default: + break; + } +} + static int Armor_on(void) { - /* - * Gold DSM requires special handling since it emits light when worn. - */ if (!uarm) /* no known instances of !uarm here but play it safe */ return 0; uarm->known = 1; /* suit's +/- evident because of status line AC */ + dragon_armor_handling(uarm, TRUE); + + /* + * Gold DSM requires special handling since it emits light when worn. + */ if (artifact_light(uarm) && !uarm->lamplit) { begin_burn(uarm, FALSE); if (!Blind) @@ -721,6 +806,8 @@ Armor_off(void) setworn((struct obj *) 0, W_ARM); g.context.takeoff.cancelled_don = FALSE; + dragon_armor_handling(otmp, FALSE); + if (was_arti_light && !artifact_light(otmp)) { end_burn(otmp, FALSE); if (!Blind) @@ -745,6 +832,8 @@ Armor_gone(void) setnotworn(uarm); g.context.takeoff.cancelled_don = FALSE; + dragon_armor_handling(otmp, FALSE); + if (was_arti_light && !artifact_light(otmp)) { end_burn(otmp, FALSE); if (!Blind)