diff --git a/doc/fixes36.2 b/doc/fixes36.2 index 94986c5b0..15d5b2d6d 100644 --- a/doc/fixes36.2 +++ b/doc/fixes36.2 @@ -234,6 +234,8 @@ dismount that kills steed because there is no room to put it on map blamed the to emphasize that it's not a light source, change description of wielded Sting from "(glowing light blue)" to "(light blue aura)" when sighted and from "(glowing)" to nothing (not warm enough to feel) when blind +glowing Sting quivers if hero becomes blind and quivering Sting glows if + blindness ends; it worked for timed blindness but not for blindfold Fixes to Post-3.6.1 Problems that Were Exposed Via git Repository @@ -253,6 +255,9 @@ life-saving while poly'd and Unchanging wasn't restoring u.mh (HP as monster) change in searching stopped finding unseen monsters except hiders and eels buliding with EXTRA_SANITY_CHECKS enabled would issue "no monster to remove" warning if steed was killed out from under the hero +changing Sting's description to be "(weapon in hand) (light blue aura)" was + too close to feedback when objects become blessed; change it again, + to "(weapon in hand, flickering/glimmering/gleaming light blue)" tty: turn off an optimization that is the suspected cause of Windows reported partial status lines following level changes tty: ensure that current status fields are always copied to prior status diff --git a/include/extern.h b/include/extern.h index e4c2f82fe..16b10859b 100644 --- a/include/extern.h +++ b/include/extern.h @@ -1,4 +1,4 @@ -/* NetHack 3.6 extern.h $NHDT-Date: 1543185068 2018/11/25 22:31:08 $ $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.663 $ */ +/* NetHack 3.6 extern.h $NHDT-Date: 1543745352 2018/12/02 10:09:12 $ $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.664 $ */ /* Copyright (c) Steve Creps, 1988. */ /* NetHack may be freely redistributed. See license for details. */ @@ -90,6 +90,7 @@ E boolean FDECL(artifact_has_invprop, (struct obj *, UCHAR_P)); E long FDECL(arti_cost, (struct obj *)); E struct obj *FDECL(what_gives, (long *)); E const char *FDECL(glow_color, (int)); +E const char *FDECL(glow_verb, (int, BOOLEAN_P)); E void FDECL(Sting_effects, (int)); E int FDECL(retouch_object, (struct obj **, BOOLEAN_P)); E void FDECL(retouch_equipment, (int)); @@ -1912,11 +1913,12 @@ E void FDECL(set_itimeout, (long *, long)); E void FDECL(incr_itimeout, (long *, int)); E void FDECL(make_confused, (long, BOOLEAN_P)); E void FDECL(make_stunned, (long, BOOLEAN_P)); -E void FDECL(make_blinded, (long, BOOLEAN_P)); E void FDECL(make_sick, (long, const char *, BOOLEAN_P, int)); E void FDECL(make_slimed, (long, const char *)); E void FDECL(make_stoned, (long, const char *, int, const char *)); E void FDECL(make_vomiting, (long, BOOLEAN_P)); +E void FDECL(make_blinded, (long, BOOLEAN_P)); +E void NDECL(toggle_blindness); E boolean FDECL(make_hallucinated, (long, BOOLEAN_P, long)); E void FDECL(make_deaf, (long, BOOLEAN_P)); E void NDECL(self_invis_message); diff --git a/src/artifact.c b/src/artifact.c index 87cbf3b61..80332f325 100644 --- a/src/artifact.c +++ b/src/artifact.c @@ -1,4 +1,4 @@ -/* NetHack 3.6 artifact.c $NHDT-Date: 1509836679 2017/11/04 23:04:39 $ $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.106 $ */ +/* NetHack 3.6 artifact.c $NHDT-Date: 1543745353 2018/12/02 10:09:13 $ $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.127 $ */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /*-Copyright (c) Robert Patrick Rankin, 2013. */ /* NetHack may be freely redistributed. See license for details. */ @@ -27,6 +27,7 @@ STATIC_DCL boolean FDECL(Mb_hit, (struct monst * magr, struct monst *mdef, struct obj *, int *, int, BOOLEAN_P, char *)); STATIC_DCL unsigned long FDECL(abil_to_spfx, (long *)); STATIC_DCL uchar FDECL(abil_to_adtyp, (long *)); +STATIC_DCL int FDECL(glow_strength, (int)); STATIC_DCL boolean FDECL(untouchable, (struct obj *, BOOLEAN_P)); STATIC_DCL int FDECL(count_surround_traps, (int, int)); @@ -1852,6 +1853,37 @@ int arti_indx; return hcolor(colorstr); } +/* glow verb; [0] holds the value used when blind */ +static const char *glow_verbs[] = { + "quiver", "flicker", "glimmer", "gleam" +}; + +/* relative strength that Sting is glowing (0..3), to select verb */ +STATIC_OVL int +glow_strength(count) +int count; +{ + /* glow strength should also be proportional to proximity and + probably difficulty, but we don't have that information and + gathering it is more trouble than this would be worth */ + return (count > 12) ? 3 : (count > 4) ? 2 : (count > 0); +} + +const char * +glow_verb(count, ingsfx) +int count; /* 0 means blind rather than no applicable creatures */ +boolean ingsfx; +{ + static char resbuf[20]; + + Strcpy(resbuf, glow_verbs[glow_strength(count)]); + /* ing_suffix() will double the last consonant for all the words + we're using and none of them should have that, so bypass it */ + if (ingsfx) + Strcat(resbuf, "ing"); + return resbuf; +} + /* use for warning "glow" for Sting, Orcrist, and Grimtooth */ void Sting_effects(orc_count) @@ -1861,22 +1893,28 @@ int orc_count; /* new count (warn_obj_cnt is old count); -1 is a flag value */ && (uwep->oartifact == ART_STING || uwep->oartifact == ART_ORCRIST || uwep->oartifact == ART_GRIMTOOTH)) { + int oldstr = glow_strength(warn_obj_cnt), + newstr = glow_strength(orc_count); + if (orc_count == -1 && warn_obj_cnt > 0) { /* -1 means that blindness has just been toggled; give a 'continue' message that eventual 'stop' message will match */ pline("%s is %s.", bare_artifactname(uwep), - !Blind ? "glowing" : "quivering"); - } else if (orc_count > 0 && warn_obj_cnt == 0) { + glow_verb(Blind ? 0 : warn_obj_cnt, TRUE)); + } else if (newstr > 0 && newstr != oldstr) { /* 'start' message */ if (!Blind) - pline("%s %s %s!", bare_artifactname(uwep), - otense(uwep, "glow"), glow_color(uwep->oartifact)); - else - pline("%s quivers slightly.", bare_artifactname(uwep)); + pline("%s %s %s%c", bare_artifactname(uwep), + otense(uwep, glow_verb(orc_count, FALSE)), + glow_color(uwep->oartifact), + (newstr > oldstr) ? '!' : '.'); + else if (oldstr == 0) /* quivers */ + pline("%s %s slightly.", bare_artifactname(uwep), + otense(uwep, glow_verb(0, FALSE))); } else if (orc_count == 0 && warn_obj_cnt > 0) { /* 'stop' message */ pline("%s stops %s.", bare_artifactname(uwep), - !Blind ? "glowing" : "quivering"); + glow_verb(Blind ? 0 : warn_obj_cnt, TRUE)); } } } diff --git a/src/do_wear.c b/src/do_wear.c index 7ab53a79e..8300bd0c2 100644 --- a/src/do_wear.c +++ b/src/do_wear.c @@ -1,4 +1,4 @@ -/* NetHack 3.6 do_wear.c $NHDT-Date: 1514072526 2017/12/23 23:42:06 $ $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.100 $ */ +/* NetHack 3.6 do_wear.c $NHDT-Date: 1543745354 2018/12/02 10:09:14 $ $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.103 $ */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /*-Copyright (c) Robert Patrick Rankin, 2012. */ /* NetHack may be freely redistributed. See license for details. */ @@ -1112,13 +1112,7 @@ register struct obj *otmp; You("can see!"); } if (changed) { - /* blindness has just been toggled */ - if (Blind_telepat || Infravision) - see_monsters(); - vision_full_recalc = 1; /* recalc vision limits */ - if (!Blind) - learn_unseen_invent(); - context.botl = 1; + toggle_blindness(); /* potion.c */ } } @@ -1157,13 +1151,7 @@ register struct obj *otmp; } } if (changed) { - /* blindness has just been toggled */ - if (Blind_telepat || Infravision) - see_monsters(); - vision_full_recalc = 1; /* recalc vision limits */ - if (!Blind) - learn_unseen_invent(); - context.botl = 1; + toggle_blindness(); /* potion.c */ } } diff --git a/src/objnam.c b/src/objnam.c index af74c3bf0..7ed8f33fb 100644 --- a/src/objnam.c +++ b/src/objnam.c @@ -1,4 +1,4 @@ -/* NetHack 3.6 objnam.c $NHDT-Date: 1543544340 2018/11/30 02:19:00 $ $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.226 $ */ +/* NetHack 3.6 objnam.c $NHDT-Date: 1543745355 2018/12/02 10:09:15 $ $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.227 $ */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /*-Copyright (c) Robert Patrick Rankin, 2011. */ /* NetHack may be freely redistributed. See license for details. */ @@ -1150,15 +1150,16 @@ unsigned doname_flags; if (bimanual(obj)) hand_s = makeplural(hand_s); + /* note: Sting's glow message, if added, will insert text + in front of "(weapon in hand)"'s closing paren */ Sprintf(eos(bp), " (%sweapon in %s)", (obj->otyp == AKLYS) ? "tethered " : "", hand_s); if (warn_obj_cnt && obj == uwep && (EWarn_of_mon & W_WEP) != 0L) { - /* this used to be "(glowing )" when sighted or - "(glowing)" when blind (via feeling warmth), but it - isn't a light source so describe something fainter */ - if (!Blind) - Sprintf(eos(bp), " (%s aura)", glow_color(obj->oartifact)); + if (!Blind) /* we know bp[] ends with ')'; overwrite that */ + Sprintf(eos(bp) - 1, ", %s %s)", + glow_verb(warn_obj_cnt, TRUE), + glow_color(obj->oartifact)); } } } diff --git a/src/potion.c b/src/potion.c index 8985755bb..dc96331e6 100644 --- a/src/potion.c +++ b/src/potion.c @@ -1,4 +1,4 @@ -/* NetHack 3.6 potion.c $NHDT-Date: 1520797133 2018/03/11 19:38:53 $ $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.144 $ */ +/* NetHack 3.6 potion.c $NHDT-Date: 1543745356 2018/12/02 10:09:16 $ $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.155 $ */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /*-Copyright (c) Robert Patrick Rankin, 2013. */ /* NetHack may be freely redistributed. See license for details. */ @@ -306,32 +306,43 @@ boolean talk; set_itimeout(&Blinded, xtime); if (u_could_see ^ can_see_now) { /* one or the other but not both */ - context.botl = TRUE; - vision_full_recalc = 1; /* blindness just got toggled */ - /* this vision recalculation used to be deferred until - moveloop(), but that made it possible for vision - irregularities to occur (cited case was force bolt - hitting adjacent potion of blindness and then a - secret door; hero was blinded by vapors but then - got the message "a door appears in the wall") */ - vision_recalc(0); - if (Blind_telepat || Infravision) - see_monsters(); - - /* avoid either of the sequences - "Sting starts glowing", [become blind], "Sting stops quivering" or - "Sting starts quivering", [regain sight], "Sting stops glowing" - by giving "Sting is quivering" when becoming blind or - "Sting is glowing" when regaining sight so that the eventual - "stops" message matches */ - if (warn_obj_cnt && uwep && (EWarn_of_mon & W_WEP) != 0L) - Sting_effects(-1); - /* update dknown flag for inventory picked up while blind */ - if (can_see_now) - learn_unseen_invent(); + toggle_blindness(); } } +/* blindness has just started or just ended--caller enforces that; + called by Blindf_on(), Blindf_off(), and make_blinded() */ +void +toggle_blindness() +{ + boolean Stinging = (uwep && (EWarn_of_mon & W_WEP) != 0L); + + /* blindness has just been toggled */ + context.botl = TRUE; /* status conditions need update */ + vision_full_recalc = 1; /* vision has changed */ + /* this vision recalculation used to be deferred until moveloop(), + but that made it possible for vision irregularities to occur + (cited case was force bolt hitting an adjacent potion of blindness + and then a secret door; hero was blinded by vapors but then got the + message "a door appears in the wall" because wall spot was IN_SIGHT) */ + vision_recalc(0); + if (Blind_telepat || Infravision || Stinging) + see_monsters(); /* also counts EWarn_of_mon monsters */ + /* + * Avoid either of the sequences + * "Sting starts glowing", [become blind], "Sting stops quivering" or + * "Sting starts quivering", [regain sight], "Sting stops glowing" + * by giving "Sting is quivering" when becoming blind or + * "Sting is glowing" when regaining sight so that the eventual + * "stops" message matches the most recent "Sting is ..." one. + */ + if (Stinging) + Sting_effects(-1); + /* update dknown flag for inventory picked up while blind */ + if (!Blind) + learn_unseen_invent(); +} + boolean make_hallucinated(xtime, talk, mask) long xtime; /* nonzero if this is an attempt to turn on hallucination */