Resistances gained from worn or wielded items also protect inventory
This commit is contained in:
@@ -605,6 +605,7 @@ yet another fix for display problems during restore: if game is saved while
|
|||||||
restore will try to update hero's spot when making sure objects aren't
|
restore will try to update hero's spot when making sure objects aren't
|
||||||
being obfuscated by hallucination, but when displaying the hero there
|
being obfuscated by hallucination, but when displaying the hero there
|
||||||
instead it would access steed pointer before that has been set up
|
instead it would access steed pointer before that has been set up
|
||||||
|
resistances gained from worn or wielded items also protect hero's inventory
|
||||||
|
|
||||||
|
|
||||||
Fixes to 3.7.0-x Problems that Were Exposed Via git Repository
|
Fixes to 3.7.0-x Problems that Were Exposed Via git Repository
|
||||||
|
|||||||
@@ -3222,6 +3222,7 @@ extern void melt_ice_away(union any *, long);
|
|||||||
extern int zap_over_floor(xchar, xchar, int, boolean *, short);
|
extern int zap_over_floor(xchar, xchar, int, boolean *, short);
|
||||||
extern void fracture_rock(struct obj *);
|
extern void fracture_rock(struct obj *);
|
||||||
extern boolean break_statue(struct obj *);
|
extern boolean break_statue(struct obj *);
|
||||||
|
extern boolean u_adtyp_resistance_obj(int);
|
||||||
extern void destroy_item(int, int);
|
extern void destroy_item(int, int);
|
||||||
extern int destroy_mitem(struct monst *, int, int);
|
extern int destroy_mitem(struct monst *, int, int);
|
||||||
extern int resist(struct monst *, char, int, int);
|
extern int resist(struct monst *, char, int, int);
|
||||||
|
|||||||
@@ -1373,18 +1373,28 @@ attributes_enlightenment(int unused_mode UNUSED, int final)
|
|||||||
you_are("magic-protected", from_what(ANTIMAGIC));
|
you_are("magic-protected", from_what(ANTIMAGIC));
|
||||||
if (Fire_resistance)
|
if (Fire_resistance)
|
||||||
you_are("fire resistant", from_what(FIRE_RES));
|
you_are("fire resistant", from_what(FIRE_RES));
|
||||||
|
if (u_adtyp_resistance_obj(AD_FIRE))
|
||||||
|
enl_msg("Your items ", "are", "were", " protected from fire", "");
|
||||||
if (Cold_resistance)
|
if (Cold_resistance)
|
||||||
you_are("cold resistant", from_what(COLD_RES));
|
you_are("cold resistant", from_what(COLD_RES));
|
||||||
|
if (u_adtyp_resistance_obj(AD_COLD))
|
||||||
|
enl_msg("Your items ", "are", "were", " protected from cold", "");
|
||||||
if (Sleep_resistance)
|
if (Sleep_resistance)
|
||||||
you_are("sleep resistant", from_what(SLEEP_RES));
|
you_are("sleep resistant", from_what(SLEEP_RES));
|
||||||
if (Disint_resistance)
|
if (Disint_resistance)
|
||||||
you_are("disintegration-resistant", from_what(DISINT_RES));
|
you_are("disintegration-resistant", from_what(DISINT_RES));
|
||||||
|
if (u_adtyp_resistance_obj(AD_DISN))
|
||||||
|
enl_msg("Your items ", "are", "were", " protected from disintegration", "");
|
||||||
if (Shock_resistance)
|
if (Shock_resistance)
|
||||||
you_are("shock resistant", from_what(SHOCK_RES));
|
you_are("shock resistant", from_what(SHOCK_RES));
|
||||||
|
if (u_adtyp_resistance_obj(AD_ELEC))
|
||||||
|
enl_msg("Your items ", "are", "were", " protected from electric shocks", "");
|
||||||
if (Poison_resistance)
|
if (Poison_resistance)
|
||||||
you_are("poison resistant", from_what(POISON_RES));
|
you_are("poison resistant", from_what(POISON_RES));
|
||||||
if (Acid_resistance)
|
if (Acid_resistance)
|
||||||
you_are("acid resistant", from_what(ACID_RES));
|
you_are("acid resistant", from_what(ACID_RES));
|
||||||
|
if (u_adtyp_resistance_obj(AD_ACID))
|
||||||
|
enl_msg("Your items ", "are", "were", " protected from acid", "");
|
||||||
if (Drain_resistance)
|
if (Drain_resistance)
|
||||||
you_are("level-drain resistant", from_what(DRAIN_RES));
|
you_are("level-drain resistant", from_what(DRAIN_RES));
|
||||||
if (Sick_resistance)
|
if (Sick_resistance)
|
||||||
|
|||||||
@@ -187,6 +187,8 @@ erode_obj(
|
|||||||
|
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case ERODE_BURN:
|
case ERODE_BURN:
|
||||||
|
if (uvictim && u_adtyp_resistance_obj(AD_FIRE) && rn2(100))
|
||||||
|
return ER_NOTHING;
|
||||||
vulnerable = is_flammable(otmp);
|
vulnerable = is_flammable(otmp);
|
||||||
check_grease = FALSE;
|
check_grease = FALSE;
|
||||||
cost_type = COST_BURN;
|
cost_type = COST_BURN;
|
||||||
@@ -202,6 +204,8 @@ erode_obj(
|
|||||||
cost_type = COST_ROT;
|
cost_type = COST_ROT;
|
||||||
break;
|
break;
|
||||||
case ERODE_CORRODE:
|
case ERODE_CORRODE:
|
||||||
|
if (uvictim && u_adtyp_resistance_obj(AD_ACID) && rn2(100))
|
||||||
|
return ER_NOTHING;
|
||||||
vulnerable = is_corrodeable(otmp);
|
vulnerable = is_corrodeable(otmp);
|
||||||
is_primary = FALSE;
|
is_primary = FALSE;
|
||||||
cost_type = COST_CORRODE;
|
cost_type = COST_CORRODE;
|
||||||
@@ -3871,6 +3875,9 @@ acid_damage(struct obj* obj)
|
|||||||
victim = carried(obj) ? &g.youmonst : mcarried(obj) ? obj->ocarry : NULL;
|
victim = carried(obj) ? &g.youmonst : mcarried(obj) ? obj->ocarry : NULL;
|
||||||
vismon = victim && (victim != &g.youmonst) && canseemon(victim);
|
vismon = victim && (victim != &g.youmonst) && canseemon(victim);
|
||||||
|
|
||||||
|
if (victim == &g.youmonst && u_adtyp_resistance_obj(AD_ACID) && rn2(100))
|
||||||
|
return;
|
||||||
|
|
||||||
if (obj->greased) {
|
if (obj->greased) {
|
||||||
grease_protect(obj, (char *) 0, victim);
|
grease_protect(obj, (char *) 0, victim);
|
||||||
} else if (obj->oclass == SCROLL_CLASS && obj->otyp != SCR_BLANK_PAPER) {
|
} else if (obj->oclass == SCROLL_CLASS && obj->otyp != SCR_BLANK_PAPER) {
|
||||||
|
|||||||
@@ -23,6 +23,7 @@ static boolean zap_steed(struct obj *);
|
|||||||
static void skiprange(int, int *, int *);
|
static void skiprange(int, int *, int *);
|
||||||
static int zap_hit(int, int);
|
static int zap_hit(int, int);
|
||||||
static void disintegrate_mon(struct monst *, int, const char *);
|
static void disintegrate_mon(struct monst *, int, const char *);
|
||||||
|
static int adtyp_to_prop(int);
|
||||||
static void backfire(struct obj *);
|
static void backfire(struct obj *);
|
||||||
static int zap_ok(struct obj *);
|
static int zap_ok(struct obj *);
|
||||||
static void boxlock_invent(struct obj *);
|
static void boxlock_invent(struct obj *);
|
||||||
@@ -3965,10 +3966,14 @@ zhitu(int type, int nd, const char *fltxt, xchar sx, xchar sy)
|
|||||||
break;
|
break;
|
||||||
case ZT_DEATH:
|
case ZT_DEATH:
|
||||||
if (abstyp == ZT_BREATH(ZT_DEATH)) {
|
if (abstyp == ZT_BREATH(ZT_DEATH)) {
|
||||||
|
boolean disn_prot = u_adtyp_resistance_obj(AD_DISN) && rn2(100);
|
||||||
|
|
||||||
if (Disint_resistance) {
|
if (Disint_resistance) {
|
||||||
You("are not disintegrated.");
|
You("are not disintegrated.");
|
||||||
monstseesu(M_SEEN_DISINT);
|
monstseesu(M_SEEN_DISINT);
|
||||||
break;
|
break;
|
||||||
|
} else if (disn_prot) {
|
||||||
|
break;
|
||||||
} else if (uarms) {
|
} else if (uarms) {
|
||||||
/* destroy shield; other possessions are safe */
|
/* destroy shield; other possessions are safe */
|
||||||
(void) destroy_arm(uarms);
|
(void) destroy_arm(uarms);
|
||||||
@@ -4940,6 +4945,36 @@ break_statue(struct obj *obj)
|
|||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* convert attack damage AD_foo to property resistance */
|
||||||
|
static int
|
||||||
|
adtyp_to_prop(int dmgtyp)
|
||||||
|
{
|
||||||
|
switch (dmgtyp) {
|
||||||
|
case AD_COLD: return COLD_RES;
|
||||||
|
case AD_FIRE: return FIRE_RES;
|
||||||
|
case AD_ELEC: return SHOCK_RES;
|
||||||
|
case AD_ACID: return ACID_RES;
|
||||||
|
case AD_DISN: return DISINT_RES;
|
||||||
|
default: return 0; /* prop_types start at 1 */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* is hero wearing or wielding an object with resistance
|
||||||
|
to attack damage type */
|
||||||
|
boolean
|
||||||
|
u_adtyp_resistance_obj(int dmgtyp)
|
||||||
|
{
|
||||||
|
int prop = adtyp_to_prop(dmgtyp);
|
||||||
|
|
||||||
|
if (!prop)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
if ((u.uprops[prop].extrinsic & (W_ARMOR | W_ACCESSORY | W_WEP)) != 0)
|
||||||
|
return TRUE;
|
||||||
|
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* destroy_strings[dindx][0:singular,1:plural,2:killer_reason]
|
* destroy_strings[dindx][0:singular,1:plural,2:killer_reason]
|
||||||
* [0] freezing potion
|
* [0] freezing potion
|
||||||
@@ -4979,6 +5014,10 @@ destroy_one_item(struct obj *obj, int osym, int dmgtyp)
|
|||||||
dmg = dindx = 0;
|
dmg = dindx = 0;
|
||||||
quan = 0L;
|
quan = 0L;
|
||||||
|
|
||||||
|
/* external worn item protects inventory? */
|
||||||
|
if (u_adtyp_resistance_obj(dmgtyp) && rn2(100))
|
||||||
|
return;
|
||||||
|
|
||||||
switch (dmgtyp) {
|
switch (dmgtyp) {
|
||||||
case AD_COLD:
|
case AD_COLD:
|
||||||
if (osym == POTION_CLASS && obj->otyp != POT_OIL) {
|
if (osym == POTION_CLASS && obj->otyp != POT_OIL) {
|
||||||
|
|||||||
Reference in New Issue
Block a user