diff --git a/hackem_changelog.txt b/hackem_changelog.txt index de073c27f..c5dbb77cc 100644 --- a/hackem_changelog.txt +++ b/hackem_changelog.txt @@ -5,7 +5,7 @@ Version 1.2.1 (unreleased) - +Sync up some minor differences between EvilHack and Hack'EM dragon scales. Double the time power shield is usually active. Rename 'shield block' tech to 'power shield'. Add a warning to the guaranteed wands of wishing. diff --git a/src/artifact.c b/src/artifact.c index da6f09786..698fa0c64 100644 --- a/src/artifact.c +++ b/src/artifact.c @@ -607,7 +607,7 @@ struct obj *otmp; case AD_DRLI: return (otyp == DEEP_DRAGON_SCALES); /* Deep roots hold you firm */ case AD_COLD: - return (otyp == WHITE_DRAGON_SCALES + return (otyp == WHITE_DRAGON_SCALES || otyp == SILVER_DRAGON_SCALES); case AD_DRST: /* drain strength => poison */ case AD_DISE: /* blocks disease but not slime */ diff --git a/src/do_wear.c b/src/do_wear.c index eaace2f8a..fd3c9a713 100644 --- a/src/do_wear.c +++ b/src/do_wear.c @@ -958,27 +958,25 @@ dragon_armor_handling(struct obj *otmp, boolean puton) return; switch (Dragon_armor_to_scales(otmp)) { - /* gray: no extra effect */ - - case BLACK_DRAGON_SCALES: - if (puton) { - ESlow_digestion |= W_ARM; - } else { - ESlow_digestion &= ~W_ARM; - } - break; - case SILVER_DRAGON_SCALES: + /* gray: no extra effect */ + case GREEN_DRAGON_SCALES: if (puton) { - ECold_resistance |= W_ARM; + ESick_resistance |= W_ARM; + if (Sick) { + You_feel("cured. What a relief!"); + Sick = 0L; + } } else { - ECold_resistance &= ~W_ARM; + ESick_resistance &= ~W_ARM; } break; case GOLD_DRAGON_SCALES: if (puton) { EInfravision |= W_ARM; + EClairvoyant |= W_ARM; } else { EInfravision &= ~W_ARM; + EClairvoyant &= ~W_ARM; } break; case ORANGE_DRAGON_SCALES: @@ -988,15 +986,11 @@ dragon_armor_handling(struct obj *otmp, boolean puton) Free_action &= ~W_ARM; } break; - case GREEN_DRAGON_SCALES: + case SILVER_DRAGON_SCALES: if (puton) { - ESick_resistance |= W_ARM; - if (Sick) { - You_feel("cured. What a relief!"); - Sick = 0L; - } + ECold_resistance |= W_ARM; } else { - ESick_resistance &= ~W_ARM; + ECold_resistance &= ~W_ARM; } break; case BLUE_DRAGON_SCALES: @@ -1038,11 +1032,9 @@ dragon_armor_handling(struct obj *otmp, boolean puton) Stunned = 0L; } EStun_resistance |= W_ARM; - EPsychic_resistance |= W_ARM; } else { toggle_displacement(otmp, (EDisplaced & ~W_ARM), FALSE); EStun_resistance &= ~W_ARM; - EPsychic_resistance &= ~W_ARM; } break; case DEEP_DRAGON_SCALES: diff --git a/src/mhitu.c b/src/mhitu.c index 9ed730407..0819b379f 100644 --- a/src/mhitu.c +++ b/src/mhitu.c @@ -480,6 +480,9 @@ boolean message; unstuck(mtmp); /* ball&chain returned in unstuck() */ mnexto(mtmp); newsym(u.ux, u.uy); + /* to cover for a case where mtmp is not in a next square */ + if (um_dist(mtmp->mx, mtmp->my, 1)) + pline("Brrooaa... You land hard at some distance."); spoteffects(TRUE); } @@ -712,7 +715,6 @@ register struct monst *mtmp; if (youmonst.data->mlet != S_PIERCER && youmonst.data != &mons[PM_DROP_BEAR]) return 0; /* lurkers don't attack */ - obj = which_armor(mtmp, WORN_HELMET); if (obj && is_metallic(obj)) { @@ -4911,7 +4913,7 @@ struct attack *mattk; if (resists_disint(mtmp) || defended(mtmp, AD_DISN)) { if (canseemon(mtmp) && !rn2(3)) { shieldeff(mtmp->mx, mtmp->my); - Your("armor does not appear to affect %s", + Your("armor does not appear to affect %s.", mon_nam(mtmp)); } break; @@ -4950,7 +4952,19 @@ struct attack *mattk; if (canseemon(mtmp)) pline("%s is disintegrated completely!", Monnam(mtmp)); disint_mon_invent(mtmp); - xkilled(mtmp, XKILL_NOMSG | XKILL_NOCORPSE); + if (is_rider(mtmp->data)) { + if (canseemon(mtmp)) { + pline("%s body reintegrates before your %s!", + s_suffix(Monnam(mtmp)), + (eyecount(youmonst.data) == 1) + ? body_part(EYE) + : makeplural(body_part(EYE))); + pline("%s resurrects!", Monnam(mtmp)); + } + mtmp->mhp = mtmp->mhpmax; + } else { + xkilled(mtmp, XKILL_NOMSG | XKILL_NOCORPSE); + } if (!DEADMONSTER(mtmp)) return 1; return 2; @@ -5170,7 +5184,7 @@ struct attack *mattk; if (rn2(20)) { if (canseemon(mtmp)) pline("%s gets zapped!", Monnam(mtmp)); - damage_mon(mtmp, rnd(6), AD_ELEC); + damage_mon(mtmp, rnd(4), AD_ELEC); } else { if (canseemon(mtmp)) pline("%s is jolted with electricity!", Monnam(mtmp)); @@ -5287,7 +5301,7 @@ struct attack *mattk; if (resists_disint(mtmp) || defended(mtmp, AD_DISN)) { if (canseemon(mtmp) && !rn2(3)) { shieldeff(mtmp->mx, mtmp->my); - Your("deadly %s does not appear to affect %s", + Your("deadly %s does not appear to affect %s.", youmonst.data == &mons[PM_ANTIMATTER_VORTEX] ? "form" : "hide", mon_nam(mtmp)); } @@ -5330,7 +5344,19 @@ struct attack *mattk; youmonst.data == &mons[PM_ANTIMATTER_VORTEX] ? "form" : "hide", mon_nam(mtmp)); disint_mon_invent(mtmp); - xkilled(mtmp, XKILL_NOMSG | XKILL_NOCORPSE); + if (is_rider(mtmp->data)) { + if (canseemon(mtmp)) { + pline("%s body reintegrates before your %s!", + s_suffix(Monnam(mtmp)), + (eyecount(youmonst.data) == 1) + ? body_part(EYE) + : makeplural(body_part(EYE))); + pline("%s resurrects!", Monnam(mtmp)); + } + mtmp->mhp = mtmp->mhpmax; + } else { + xkilled(mtmp, XKILL_NOMSG | XKILL_NOCORPSE); + } if (!DEADMONSTER(mtmp)) return 1; return 2; diff --git a/src/uhitm.c b/src/uhitm.c index 8311b8383..35ffec2a6 100644 --- a/src/uhitm.c +++ b/src/uhitm.c @@ -38,7 +38,7 @@ struct monst *mdef; int hurt; { struct obj *target; - + /* What the following code does: it keeps looping until it * finds a target for the rust monster. * Head, feet, etc... not covered by metal, or covered by @@ -1967,7 +1967,7 @@ int dieroll; a slight damage boost */ if (uarm && Is_dragon_scaled_armor(uarm) && Dragon_armor_to_scales(uarm) == RED_DRAGON_SCALES) - tmp += rnd(6); + tmp += rnd(6); /* Stakes vs vampires */ if (uwep && uwep->otyp == STAKE && is_vampire(mdat) && !thrown) { @@ -5188,51 +5188,50 @@ boolean wep_was_destroyed; } } break; - case BLACK_DRAGON_SCALES: { - long protector = attk_protection((int) aatyp); - - /* hero using monsters' AT_MAGC attack is hitting hand to - hand rather than casting a spell */ - if (aatyp == AT_MAGC) - protector = W_ARMG; - - if (protector == 0L /* no protection */ - || (protector == W_ARMG && !uarmg && !uwep - && !wep_was_destroyed) - || (protector == W_ARMF && !uarmf) - || (protector == W_ARMH && !uarmh) - || (protector == (W_ARMC | W_ARMG) - && (!uarmc || !uarmg))) { - if (how_resistant(DISINT_RES) == 100) { - if (!rn2(3)) - You("are unaffected by %s deadly armor.", - s_suffix(mon_nam(mon))); - monstseesu(M_SEEN_DISINT); - break; - } else { - if (rn2(40)) { - You("partially disintegrate!"); - t = resist_reduce(t, DISINT_RES); - mdamageu(mon, t); + case BLACK_DRAGON_SCALES: + { + long protector = attk_protection((int) aatyp); + + /* hero using monsters' AT_MAGC attack is hitting hand to + hand rather than casting a spell */ + if (aatyp == AT_MAGC) + protector = W_ARMG; + + if (protector == 0L /* no protection */ + || (protector == W_ARMG && !uarmg + && !uwep && !wep_was_destroyed) + || (protector == W_ARMF && !uarmf) + || (protector == W_ARMH && !uarmh) + || (protector == (W_ARMC | W_ARMG) && (!uarmc || !uarmg))) { + if (how_resistant(DISINT_RES) == 100) { + if (!rn2(3)) + You("are unaffected by %s deadly armor.", + s_suffix(mon_nam(mon))); + monstseesu(M_SEEN_DISINT); + break; } else { - if (how_resistant(DISINT_RES) < 50) { - pline("%s deadly armor disintegrates you!", - s_suffix(Monnam(mon))); - u.ugrave_arise = -3; - done_in_by(mon, DIED); - return 2; - } else { + if (rn2(40)) { You("partially disintegrate!"); t = resist_reduce(t, DISINT_RES); mdamageu(mon, t); + } else { + if (how_resistant(DISINT_RES) < 50) { + pline("%s deadly armor disintegrates you!", + s_suffix(Monnam(mon))); + u.ugrave_arise = -3; + done_in_by(mon, DIED); + return 2; + } else { + You("partially disintegrate!"); + t = resist_reduce(t, DISINT_RES); + mdamageu(mon, t); + } } } } } - } if (!rn2(12)) { - if (!(uwep || (u.twoweap && uswapwep)) - && !wep_was_destroyed + if (!(uwep || (u.twoweap && uswapwep)) && !wep_was_destroyed && (aatyp == AT_WEAP || aatyp == AT_CLAW || aatyp == AT_MAGC || aatyp == AT_TUCH)) { if (uarmg) { @@ -5260,27 +5259,22 @@ boolean wep_was_destroyed; || aatyp == AT_MAGC || aatyp == AT_TUCH) { if (obj_resists(weapon, 0, 0)) { pline_The("%s %s and cannot be disintegrated.", - xname(weapon), - rn2(2) ? "resists completely" - : "defies physics"); + xname(weapon), rn2(2) ? "resists completely" : "defies physics"); break; } else if (weapon->otyp == BLACK_DRAGON_SCALES || (Is_dragon_scaled_armor(weapon) && Dragon_armor_to_scales(weapon) == BLACK_DRAGON_SCALES)) { pline("%s disintegration-proof and %s intact.", - Yobjnam2(weapon, "are"), - otense(weapon, "remain")); + Yobjnam2(weapon, "are"), otense(weapon, "remain")); break; } else if (weapon->oartifact && rn2(50)) { - pline("%s %s, but remains %s.", Yname2(weapon), - rn2(2) ? "shudders violently" - : "vibrates unexpectedly", - rn2(2) ? "whole" : "intact"); + pline("%s %s, but remains %s.", Yname2(weapon), + rn2(2) ? "shudders violently" : "vibrates unexpectedly", + rn2(2) ? "whole" : "intact"); break; } else if (rn2(2) - && (weapon->oerodeproof - || is_supermaterial(weapon))) { + && (weapon->oerodeproof || is_supermaterial(weapon))) { pline("%s being disintegrated!", Yobjnam2(weapon, "resist")); break; @@ -5301,7 +5295,7 @@ boolean wep_was_destroyed; update_inventory(); break; case SHIMMERING_DRAGON_SCALES: - /* These can have a few random effects: confuse, stun, and slow */ + /* These can have a few random effects: confuse, stun */ if (!rn2(3)) { if (ublindf && ublindf->oartifact == ART_EYES_OF_THE_OVERWORLD) { pline("%s protect you from %s shimmering armor!", @@ -5426,32 +5420,6 @@ boolean wep_was_destroyed; } } break; - case YELLOW_DRAGON_SCALES: - if (how_resistant(ACID_RES) == 100 - || Underwater) { - shieldeff(u.ux, u.uy); - monstseesu(M_SEEN_ACID); - You_feel("a mild sting from %s armor.", - s_suffix(mon_nam(mon))); - ugolemeffects(AD_ACID, t); - break; - } else { - if (rn2(20)) { - You_feel("a searing sensation!"); - t = resist_reduce(t, ACID_RES); - mdamageu(mon, t); - } else { - pline("%s acidic armor critically sears you!", - s_suffix(Monnam(mon))); - t = resist_reduce(t, ACID_RES); - mdamageu(mon, d(3, 6) + t); - } - } - if (rn2(u.twoweap ? 2 : 3)) - acid_damage(uwep); - if (u.twoweap && rn2(2)) - acid_damage(uswapwep); - break; case RED_DRAGON_SCALES: if (how_resistant(FIRE_RES) == 100 || Underwater) { @@ -5474,6 +5442,32 @@ boolean wep_was_destroyed; } } break; + case YELLOW_DRAGON_SCALES: + if (how_resistant(ACID_RES) == 100 + || Underwater) { + shieldeff(u.ux, u.uy); + monstseesu(M_SEEN_ACID); + You_feel("a mild sting from %s armor.", + s_suffix(mon_nam(mon))); + ugolemeffects(AD_ACID, t); + break; + } else { + if (rn2(20)) { + You_feel("a searing sensation!"); + t = resist_reduce(t, ACID_RES); + mdamageu(mon, t); + } else { + pline("%s acidic armor critically sears you!", + s_suffix(Monnam(mon))); + t = resist_reduce(t, ACID_RES); + mdamageu(mon, d(3, 6) + t); + } + } + if (rn2(u.twoweap ? 2 : 3)) + acid_damage(uwep); + if (u.twoweap && rn2(2)) + acid_damage(uswapwep); + break; case BLUE_DRAGON_SCALES: if (how_resistant(SHOCK_RES) == 100) { shieldeff(u.ux, u.uy);