From b1154399f16b7619320f65b54eb094a2b486bd3f Mon Sep 17 00:00:00 2001 From: PatR Date: Thu, 19 Sep 2019 12:48:41 -0700 Subject: [PATCH] fix github issue 223 - rubbing ring on touchstone Fixes #223 The touchstone code treated all rings as if they had gemstones, but quite a few don't and feedback could be unexpected. Cited case was an iron ring yielding a cyan (hi_metal) streak instead of the normal iron result ("scritch, scritch"). A gold ring yielded a yellow streak rather than a golden scratch. I didn't test silver ring but suspect it yielded a silver streak rather than a silvery scratch. This changes touchstones to treat non-gemstone rings like other classes of objects instead of like gems. I made mineral rings keep acting like gemstone rings--I'm not sure whether that's right. --- doc/fixes36.3 | 6 +++++- src/apply.c | 18 +++++++++++++----- 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/doc/fixes36.3 b/doc/fixes36.3 index c87d9022d..2d045e8aa 100644 --- a/doc/fixes36.3 +++ b/doc/fixes36.3 @@ -1,4 +1,4 @@ -$NHDT-Branch: NetHack-3.6 $:$NHDT-Revision: 1.113 $ $NHDT-Date: 1568831820 2019/09/18 18:37:00 $ +$NHDT-Branch: NetHack-3.6 $:$NHDT-Revision: 1.114 $ $NHDT-Date: 1568922510 2019/09/19 19:48:30 $ This fixes36.3 file is here to capture information about updates in the 3.6.x lineage following the release of 3.6.2 in May 2019. Please note, however, @@ -141,6 +141,10 @@ hallucination provides partial protection from passive gaze counterattack against hero's attack; check for that before checking for free action feedback from blessed potion of restore ability never reported "you feel great" due to bad logic for not-unihorn case in unfixable_trouble_count() +when rubbing a ring on a touchstone, all types of rings were treated as if + they were gems; an iron ring made a cyan streak instead of yielding + "scritch, scritch" and a gold ring made a yellow streak rather than + a golden scratch Fixes to Post-3.6.2 Problems that Were Exposed Via git Repository diff --git a/src/apply.c b/src/apply.c index cf1232bb5..11bd09d03 100644 --- a/src/apply.c +++ b/src/apply.c @@ -1,4 +1,4 @@ -/* NetHack 3.6 apply.c $NHDT-Date: 1568831822 2019/09/18 18:37:02 $ $NHDT-Branch: NetHack-3.6 $:$NHDT-Revision: 1.276 $ */ +/* NetHack 3.6 apply.c $NHDT-Date: 1568922511 2019/09/19 19:48:31 $ $NHDT-Branch: NetHack-3.6 $:$NHDT-Revision: 1.277 $ */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /*-Copyright (c) Robert Patrick Rankin, 2012. */ /* NetHack may be freely redistributed. See license for details. */ @@ -2317,13 +2317,14 @@ STATIC_OVL void use_stone(tstone) struct obj *tstone; { + static const char scritch[] = "\"scritch, scritch\""; + static const char allowall[3] = { COIN_CLASS, ALL_CLASSES, 0 }; + static const char coins_gems[3] = { COIN_CLASS, GEM_CLASS, 0 }; struct obj *obj; boolean do_scratch; const char *streak_color, *choices; char stonebuf[QBUFSZ]; - static const char scritch[] = "\"scritch, scritch\""; - static const char allowall[3] = { COIN_CLASS, ALL_CLASSES, 0 }; - static const char coins_gems[3] = { COIN_CLASS, GEM_CLASS, 0 }; + int oclass; /* in case it was acquired while blinded */ if (!Blind) @@ -2368,7 +2369,14 @@ struct obj *tstone; do_scratch = FALSE; streak_color = 0; - switch (obj->oclass) { + oclass = obj->oclass; + /* prevent non-gemstone rings from being treated like gems */ + if (oclass == RING_CLASS + && objects[obj->otyp].oc_material != GEMSTONE + && objects[obj->otyp].oc_material != MINERAL) + oclass = RANDOM_CLASS; /* something that's neither gem nor ring */ + + switch (oclass) { case GEM_CLASS: /* these have class-specific handling below */ case RING_CLASS: if (tstone->otyp != TOUCHSTONE) {