Skip to content

Commit

Permalink
Sync up some minor differences between EvilHack and Hack'EM dragon sc…
Browse files Browse the repository at this point in the history
…ales.
  • Loading branch information
elunna committed Sep 21, 2023
1 parent da2bc1a commit 01654ec
Show file tree
Hide file tree
Showing 5 changed files with 117 additions and 105 deletions.
2 changes: 1 addition & 1 deletion hackem_changelog.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down
2 changes: 1 addition & 1 deletion src/artifact.c
Original file line number Diff line number Diff line change
Expand Up @@ -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 */
Expand Down
34 changes: 13 additions & 21 deletions src/do_wear.c
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand All @@ -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:
Expand Down Expand Up @@ -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:
Expand Down
38 changes: 32 additions & 6 deletions src/mhitu.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}

Expand Down Expand Up @@ -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)) {
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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));
Expand Down Expand Up @@ -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));
}
Expand Down Expand Up @@ -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;
Expand Down
146 changes: 70 additions & 76 deletions src/uhitm.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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) {
Expand Down Expand Up @@ -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) {
Expand Down Expand Up @@ -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;
Expand All @@ -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!",
Expand Down Expand Up @@ -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) {
Expand All @@ -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);
Expand Down

0 comments on commit 01654ec

Please sign in to comment.