]> granicus.if.org Git - nethack/commitdiff
artifacts in final score
authornethack.rankin <nethack.rankin>
Wed, 8 Jan 2003 22:07:06 +0000 (22:07 +0000)
committernethack.rankin <nethack.rankin>
Wed, 8 Jan 2003 22:07:06 +0000 (22:07 +0000)
     Fix the problem From a bug report.  An earlier fix (3.3.1)
made them be listed during final disclosure, but the points shown for
them actually got left out of the total due to misplaced brackets.
Rather than just fixing the brackets, merge the two inventory scanning
loops so that both passes will always be synchronized with each other.

doc/fixes34.1
src/end.c

index 89f06dce3352267e9965aecec9ab98eb81c93e03..c78b9afece1b48343000beaf8721188643530366 100644 (file)
@@ -348,6 +348,8 @@ allow "grey spellbook" as alternative spelling of "gray spellbook"
 handle attacks by cancelled monsters more consistently
 armor worn by monsters might negate some magic attacks like it does for hero
 give feedback and discovery when visible monster puts on cloak of invisibility
+really add artifacts inside carried containers to final score (3.3.1 fix
+       displayed them them but didn't include any points for them)
 
 
 Platform- and/or Interface-Specific Fixes
index 7d677e53d0368389a627bafe9c0f7c41cc9e24ff..515c5d4e3bb416fee8a192dda15f4a1aabcf2da1 100644 (file)
--- a/src/end.c
+++ b/src/end.c
@@ -1,4 +1,4 @@
-/*     SCCS Id: @(#)end.c      3.4     2002/11/20      */
+/*     SCCS Id: @(#)end.c      3.4     2003/01/08      */
 /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
 /* NetHack may be freely redistributed.  See license for details. */
 
@@ -37,8 +37,7 @@ static void FDECL(done_hangup, (int));
 STATIC_DCL void FDECL(disclose,(int,BOOLEAN_P));
 STATIC_DCL void FDECL(get_valuables, (struct obj *));
 STATIC_DCL void FDECL(sort_valuables, (struct valuable_data *,int));
-STATIC_DCL void FDECL(add_artifact_score, (struct obj *));
-STATIC_DCL void FDECL(display_artifact_score, (struct obj *,winid));
+STATIC_DCL void FDECL(artifact_score, (struct obj *,BOOLEAN_P,winid));
 STATIC_DCL void FDECL(savelife, (int));
 STATIC_DCL void FDECL(list_vanquished, (int, BOOLEAN_P));
 STATIC_DCL void FDECL(list_genocided, (int, BOOLEAN_P));
@@ -490,52 +489,41 @@ int size;         /* max value is less than 20 */
     return;
 }
 
+/* called twice; first to calculate total, then to list relevant items */
 STATIC_OVL void
-add_artifact_score(list)
-struct obj *list;
-{
-    struct obj *otmp;
-
-    for (otmp = list; otmp; otmp = otmp->nobj)
-       if (otmp->oartifact ||
-                       otmp->otyp == BELL_OF_OPENING ||
-                       otmp->otyp == SPE_BOOK_OF_THE_DEAD ||
-                       otmp->otyp == CANDELABRUM_OF_INVOCATION) {
-           u.urexp += (arti_cost(otmp) * 5 / 2);
-       if (Has_contents(otmp))
-           add_artifact_score(otmp->cobj);
-    }
-}
-
-STATIC_OVL void
-display_artifact_score(list,endwin)
+artifact_score(list, counting, endwin)
 struct obj *list;
+boolean counting;      /* true => add up points; false => display them */
 winid endwin;
 {
     char pbuf[BUFSZ];
     struct obj *otmp;
+    long value, points;
+    short dummy;       /* object type returned by artifact_name() */
 
     for (otmp = list; otmp; otmp = otmp->nobj) {
        if (otmp->oartifact ||
                        otmp->otyp == BELL_OF_OPENING ||
                        otmp->otyp == SPE_BOOK_OF_THE_DEAD ||
                        otmp->otyp == CANDELABRUM_OF_INVOCATION) {
-           short dummy;
-
-           makeknown(otmp->otyp);
-           otmp->known = otmp->bknown = otmp->dknown =
-               otmp->rknown = 1;
-           /* assumes artifacts don't have quan>1 */
-           Sprintf(pbuf, "%s%s (worth %ld %s and %ld points)",
-               the_unique_obj(otmp) ? "The " : "",
-               otmp->oartifact ? artifact_name(xname(otmp), &dummy) :
-                       OBJ_NAME(objects[otmp->otyp]),
-               arti_cost(otmp), currency(2L), 
-               arti_cost(otmp) * 5 / 2);
-           putstr(endwin, 0, pbuf);
+           value = arti_cost(otmp);    /* zorkmid value */
+           points = value * 5 / 2;     /* score value */
+           if (counting) {
+               u.rexp += points;
+           } else {
+               makeknown(otmp->otyp);
+               otmp->known = otmp->dknown = otmp->bknown = otmp->rknown = 1;
+               /* assumes artifacts don't have quan > 1 */
+               Sprintf(pbuf, "%s%s (worth %ld %s and %ld points)",
+                       the_unique_obj(otmp) ? "The " : "",
+                       otmp->oartifact ? artifact_name(xname(otmp), &dummy) :
+                               OBJ_NAME(objects[otmp->otyp]),
+                       value, currency(value), points);
+               putstr(endwin, 0, pbuf);
+           }
        }
        if (Has_contents(otmp))
-           display_artifact_score(otmp->cobj,endwin);
+           artifact_score(otmp->cobj, counting, endwin);
     }
 }
 
@@ -807,7 +795,8 @@ die:
                        u.urexp += val->list[i].count
                                  * (long)objects[val->list[i].typ].oc_cost;
 
-           add_artifact_score(invent);
+           /* count the points for artifacts */
+           artifact_score(invent, TRUE, endwin);
 
            keepdogs(TRUE);
            viz_array[0][0] |= IN_SIGHT; /* need visibility for naming */
@@ -835,7 +824,7 @@ die:
            }
 
            if (!done_stopprint)
-               display_artifact_score(invent,endwin);
+               artifact_score(invent, FALSE, endwin);  /* list artifacts */
 
            /* list valuables here */
            for (val = valuables; val->list; val++) {