]> granicus.if.org Git - nethack/commitdiff
fix github issue #752 - characteristics init
authorPatR <rankin@nethack.org>
Sat, 7 May 2022 07:25:03 +0000 (00:25 -0700)
committerPatR <rankin@nethack.org>
Sat, 7 May 2022 07:25:03 +0000 (00:25 -0700)
Issue #752 by vultur-cadens:  initialization of characteristics had
off by one errors when reducing over-allocation and when increasing
under-allocation, biasing Str over Cha.

This simplifies the code very slightly but it still seems somewhat
confusing to me.

A couple of reformatting bits are included.

Closes #752

doc/fixes3-7-0.txt
src/attrib.c

index 6bf827a35df58745d164cd597ee2fd728de07fd9..cd9fc8e24bd16f78f83a227b3cbb2903e70bb66f 100644 (file)
@@ -1,4 +1,4 @@
-HDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.906 $ $NHDT-Date: 1651886993 2022/05/07 01:29:53 $
+HDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.907 $ $NHDT-Date: 1651908301 2022/05/07 07:25:01 $
 
 General Fixes and Modified Features
 -----------------------------------
@@ -903,6 +903,10 @@ using wizard mode ^V in endgame to return to previously visited Plane of Water
        likewise for clouds on Plane of Air
 on tty at least, "version incompatibility for save/123xyzzy" was invisible:
        a blank message of appropriate length followed by --More--
+fix a pair of off-by-one bugs when doling out initial characteristics points,
+       resulting in an unintentional bias toward Str and away from Cha;
+       negligible effect on individual games but had a minor cumulative
+       effect across a large set of games
 
 
 Fixes to 3.7.0-x Problems that Were Exposed Via git Repository
index 11004eb44d0034a50265df71dba0e77b0185a1ff..50ead76a5472fb2387672845870f1c9a6be3ccb2 100644 (file)
@@ -1,4 +1,4 @@
-/* NetHack 3.7 attrib.c        $NHDT-Date: 1626312521 2021/07/15 01:28:41 $  $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.79 $ */
+/* NetHack 3.7 attrib.c        $NHDT-Date: 1651908297 2022/05/07 07:24:57 $  $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.86 $ */
 /*      Copyright 1988, 1989, 1990, 1992, M. Stephenson           */
 /* NetHack may be freely redistributed.  See license for details. */
 
@@ -459,14 +459,11 @@ exerper(void)
 {
     if (!(g.moves % 10)) {
         /* Hunger Checks */
-
-        int hs = (u.uhunger > 1000) ? SATIATED : (u.uhunger > 150)
-                                                     ? NOT_HUNGRY
-                                                     : (u.uhunger > 50)
-                                                           ? HUNGRY
-                                                           : (u.uhunger > 0)
-                                                                 ? WEAK
-                                                                 : FAINTING;
+        int hs = (u.uhunger > 1000) ? SATIATED
+                 : (u.uhunger > 150) ? NOT_HUNGRY
+                   : (u.uhunger > 50) ? HUNGRY
+                     : (u.uhunger > 0) ? WEAK
+                       : FAINTING;
 
         debugpline0("exerper: Hunger checks");
         switch (hs) {
@@ -578,19 +575,13 @@ exerchk(void)
                 goto nextattrib;
 
             debugpline2("exerchk: testing %s (%d).",
-                        (i == A_STR)
-                            ? "Str"
-                            : (i == A_INT)
-                                  ? "Int?"
-                                  : (i == A_WIS)
-                                        ? "Wis"
-                                        : (i == A_DEX)
-                                              ? "Dex"
-                                              : (i == A_CON)
-                                                    ? "Con"
-                                                    : (i == A_CHA)
-                                                          ? "Cha?"
-                                                          : "???",
+                        (i == A_STR) ? "Str"
+                        : (i == A_INT) ? "Int?"
+                          : (i == A_WIS) ? "Wis"
+                            : (i == A_DEX) ? "Dex"
+                              : (i == A_CON) ? "Con"
+                                : (i == A_CHA) ? "Cha?"
+                                  : "???",
                         ax);
             /*
              *  Law of diminishing returns (Part III):
@@ -617,10 +608,12 @@ exerchk(void)
             AEXE(i) = (abs(ax) / 2) * mod_val;
         }
         g.context.next_attrib_check += rn1(200, 800);
-        debugpline1("exerchk: next check at %ld.", g.context.next_attrib_check);
+        debugpline1("exerchk: next check at %ld.",
+                    g.context.next_attrib_check);
     }
 }
 
+/* allocate hero's initial characteristics */
 void
 init_attr(int np)
 {
@@ -632,15 +625,15 @@ init_attr(int np)
         np -= g.urole.attrbase[i];
     }
 
+    /* 3.7: the x -= ... calculation used to have an off by 1 error that
+       resulted in the values being biased toward Str and away from Cha */
     tryct = 0;
     while (np > 0 && tryct < 100) {
         x = rn2(100);
-        for (i = 0; (i < A_MAX) && ((x -= g.urole.attrdist[i]) > 0); i++)
-            ;
-        if (i >= A_MAX)
-            continue; /* impossible */
-
-        if (ABASE(i) >= ATTRMAX(i)) {
+        for (i = 0; i < A_MAX; ++i)
+            if ((x -= g.urole.attrdist[i]) < 0)
+                break;
+        if (i >= A_MAX || ABASE(i) >= ATTRMAX(i)) {
             tryct++;
             continue;
         }
@@ -652,14 +645,11 @@ init_attr(int np)
 
     tryct = 0;
     while (np < 0 && tryct < 100) { /* for redistribution */
-
         x = rn2(100);
-        for (i = 0; (i < A_MAX) && ((x -= g.urole.attrdist[i]) > 0); i++)
-            ;
-        if (i >= A_MAX)
-            continue; /* impossible */
-
-        if (ABASE(i) <= ATTRMIN(i)) {
+        for (i = 0; i < A_MAX; ++i)
+            if ((x -= g.urole.attrdist[i]) < 0)
+                break;
+        if (i >= A_MAX || ABASE(i) <= ATTRMIN(i)) {
             tryct++;
             continue;
         }