From 0fe9905cf83327c06b5c6c907427d908cc2ba9a9 Mon Sep 17 00:00:00 2001 From: PatR Date: Sun, 26 Jul 2020 07:46:07 -0700 Subject: [PATCH] rocks vs unicorns A reddit thread mentioned that throwing rocks at unicorns behaved the same as throwing gems at them: not treated as an attack and if teleporting away is allowed, they will. Change to treat shooting gems and glass at unicorns with a sling as an attack rather than as just giving the gem or piece of glass to them, and treat throwing or shooting rocks and gray stones as an attack too. If picked up by blind hero while not yet seen, gems and glass format as "gem" and rocks and gray stones format as "stone" so the player can always tell the difference. Forgetting to unwield a sling before interacting with a unicorn is on the player's head. --- doc/fixes37.0 | 3 ++- src/dothrow.c | 31 ++++++++++++++++++++----------- 2 files changed, 22 insertions(+), 12 deletions(-) diff --git a/doc/fixes37.0 b/doc/fixes37.0 index e24f9302c..72352f307 100644 --- a/doc/fixes37.0 +++ b/doc/fixes37.0 @@ -1,4 +1,4 @@ -$NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.256 $ $NHDT-Date: 1595668889 2020/07/25 09:21:29 $ +$NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.257 $ $NHDT-Date: 1595774758 2020/07/26 14:45:58 $ General Fixes and Modified Features ----------------------------------- @@ -228,6 +228,7 @@ hero poly'd into a mind flayer who used #monster to emit a psychic blast was some hero attacks that should have gotten a skill bonus or penalty didn't change internal name of " venom" to "splash of venom" singularize "splashes" to "splash" instead of "splashe" +treat slinging gems and tossing or slinging stones at unicorns as attacks Fixes to 3.7.0-x Problems that Were Exposed Via git Repository diff --git a/src/dothrow.c b/src/dothrow.c index 1e6930c8e..f5d93cd37 100644 --- a/src/dothrow.c +++ b/src/dothrow.c @@ -1,4 +1,4 @@ -/* NetHack 3.6 dothrow.c $NHDT-Date: 1584398443 2020/03/16 22:40:43 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.184 $ */ +/* NetHack 3.6 dothrow.c $NHDT-Date: 1595774758 2020/07/26 14:45:58 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.187 $ */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /*-Copyright (c) Robert Patrick Rankin, 2013. */ /* NetHack may be freely redistributed. See license for details. */ @@ -1611,7 +1611,13 @@ register struct obj *obj; /* g.thrownobj or g.kickedobj or uwep */ tmp += 1000; /* Guaranteed hit */ } - if (obj->oclass == GEM_CLASS && is_unicorn(mon->data)) { + /* throwing real gems to co-aligned unicorns boosts Luck, + to cross-aligned unicorns changes Luck by random amount; + throwing worthless glass doesn't affect Luck but doesn't anger them; + 3.7: treat rocks and gray stones as attacks rather than like glass + and also treat gems or glass shot via sling as attacks */ + if (obj->oclass == GEM_CLASS && is_unicorn(mon->data) + && objects[obj->otyp].oc_material != MINERAL && !uslinging()) { if (mon->msleeping || !mon->mcanmove) { tmiss(obj, mon, FALSE); return 0; @@ -1628,8 +1634,8 @@ register struct obj *obj; /* g.thrownobj or g.kickedobj or uwep */ at leader... (kicked artifact is ok too; HMON_APPLIED could occur if quest artifact polearm or grapnel ever gets added) */ if (hmode != HMON_APPLIED && quest_arti_hits_leader(obj, mon)) { - /* AIS: changes to wakeup() means that it's now less inappropriate here - than it used to be, but the manual version works just as well */ + /* AIS: changes to wakeup() means that it's now less inappropriate + here than it used to be, but manual version works just as well */ mon->msleeping = 0; mon->mstrategy &= ~STRAT_WAITMASK; @@ -1823,15 +1829,16 @@ gem_accept(mon, obj) register struct monst *mon; register struct obj *obj; { + static NEARDATA const char + nogood[] = " is not interested in your junk.", + acceptgift[] = " accepts your gift.", + maybeluck[] = " hesitatingly", + noluck[] = " graciously", + addluck[] = " gratefully"; char buf[BUFSZ]; boolean is_buddy = sgn(mon->data->maligntyp) == sgn(u.ualign.type); boolean is_gem = objects[obj->otyp].oc_material == GEMSTONE; int ret = 0; - static NEARDATA const char nogood[] = " is not interested in your junk."; - static NEARDATA const char acceptgift[] = " accepts your gift."; - static NEARDATA const char maybeluck[] = " hesitatingly"; - static NEARDATA const char noluck[] = " graciously"; - static NEARDATA const char addluck[] = " gratefully"; Strcpy(buf, Monnam(mon)); mon->mpeaceful = 1; @@ -1851,7 +1858,8 @@ register struct obj *obj; Strcat(buf, nogood); goto nopick; } - /* making guesses */ + + /* making guesses */ } else if (has_oname(obj) || objects[obj->otyp].oc_uname) { if (is_gem) { if (is_buddy) { @@ -1865,7 +1873,8 @@ register struct obj *obj; Strcat(buf, nogood); goto nopick; } - /* value completely unknown to @ */ + + /* value completely unknown to @ */ } else { if (is_gem) { if (is_buddy) {