]> granicus.if.org Git - nethack/commitdiff
more simplification of achievement tracking
authorPatR <rankin@nethack.org>
Fri, 31 Jan 2020 01:35:32 +0000 (17:35 -0800)
committerPatR <rankin@nethack.org>
Fri, 31 Jan 2020 01:35:32 +0000 (17:35 -0800)
Instead of hardcoding the "prize" type and then watching for that
to be created, specify it in the level description.

Also, instead of giving both Sokoban end levels 50:50 chance for
either prize, bias the one that used to always have the bag of
holding to now have 75% chance for that and 25% chance for amulet
of reflection, with the other one having those chances reversed.
So still 50:50 overall.

dat/minend-1.lua
dat/minend-2.lua
dat/minend-3.lua
dat/soko1-1.lua
dat/soko1-2.lua
include/context.h
include/flag.h
include/sp_lev.h
src/options.c
src/sp_lev.c

index 109cc07371e5945018251d1d9ad2199e05015f32..7fce31a28e1dbb6acfb4717ff3c66311321c0125 100644 (file)
@@ -35,7 +35,8 @@ des.map([[
 local place = { {08,16},{13,07},{21,08},{41,14},{50,04},{50,16},{66,01} }
 shuffle(place)
 
-des.region({ region={26,01,32,01},lit=0,type="ordinary",prefilled=0,irregular=1 })
+des.region({ region={26,01,32,01}, lit=0, type="ordinary",
+            prefilled=0, irregular=1 })
 des.region(selection.area(20,08,21,08),"unlit")
 des.region(selection.area(23,08,25,08),"unlit");
 -- Secret doors
@@ -73,7 +74,7 @@ des.object("ruby",place[4])
 des.object("loadstone",place[4])
 des.object("ruby",place[5])
 des.object("worthless piece of red glass",place[5])
-des.object("luckstone",place[5])
+des.object({ id="luckstone", coord=place[5], buc="not-cursed", achievement=1 })
 -- Random objects
 des.object("*")
 des.object("*")
index d8370d10222e10e12a422b538bcf9956f8ace16b..39a7750eb43115f61e69d9b936cefec080f85ea9 100644 (file)
@@ -78,8 +78,9 @@ des.non_diggable(selection.area(53,07,55,07))
 des.non_diggable(selection.area(53,14,61,14))
 -- The Gnome King's wine cellar.
 -- the Trespassers sign is a long-running joke
-des.engraving({12,03},"engrave","You are now entering the Gnome King's wine cellar.")
-des.engraving({12,04},"engrave","Trespassers will be persecuted!")
+des.engraving({12,03}, "engrave",
+             "You are now entering the Gnome King's wine cellar.")
+des.engraving({12,04}, "engrave", "Trespassers will be persecuted!")
 des.object("booze", 10, 07)
 des.object("booze", 10, 07)
 des.object("!", 10, 07)
@@ -107,7 +108,8 @@ des.object("ruby", 70, 05)
 des.object("amethyst", 70, 05)
 des.object("*", 70, 05)
 des.object("amethyst", 70, 05)
-des.object("luckstone", 70, 05)
+des.object({ id="luckstone", x=70, y=05,
+            buc="not-cursed", achievement=1 });
 -- Scattered gems...
 des.object("*")
 des.object("*")
index a40d7448a92467d1bc897946e56103d244d13d17..92be571b17cff4df96b16287de06c534264d758e 100644 (file)
@@ -64,7 +64,7 @@ des.object("ruby")
 des.object("amethyst")
 des.object("*")
 des.object("amethyst")
-des.object("luckstone",place[2])
+des.object({ id="luckstone", coord=place[2], buc="not-cursed", achievement=1 })
 des.object("flint",place[1])
 des.object("?")
 des.object("?")
index efcb3dd137709666066055cc57ab00582f472811..d05d5ee27e3282d3f3a5c89cfeb2ec41b78b9c09 100644 (file)
@@ -94,13 +94,16 @@ des.door("closed", 17, 11);
 des.door("closed", 17, 13);
 des.door("closed", 17, 15);
 
-des.region({ region={18,10, 22,16}, lit = 1, type = "zoo", prefilled = 0, irregular = 1 });
+des.region({ region={18,10, 22,16}, lit = 1, type = "zoo",
+            prefilled = 0, irregular = 1 });
 
 px, py = selection.rndcoord(place);
-if math.random(0, 99) < 50 then
-   des.object("bag of holding", px, py);
+if math.random(0, 99) < 75 then
+   des.object({ id="bag of holding", x=px, y=py,
+               buc="not-cursed", achievement=1 });
 else
-   des.object("amulet of reflection", px, py);
+   des.object({ id="amulet of reflection", x=px, y=py,
+               buc="not-cursed", achievement=1 });
 end
 des.engraving({ x = px, y = py, type = "burn", text = "Elbereth" });
 des.object({ id = "scare monster", x = px, y = py, buc = "cursed" });
index 6a6361d5372d159d74b4ef5b691a1e04e80482a2..7ad218b395f3f158a2bda8c87be83b1b804c11ae 100644 (file)
@@ -96,13 +96,16 @@ des.door("locked",23,12)
 des.door("closed",17,10)
 des.door("closed",17,12)
 des.door("closed",17,14)
-des.region({ region={18,09, 22,15}, lit = 1, type = "zoo", prefilled = 0, irregular = 1 });
+des.region({ region={18,09, 22,15}, lit = 1, type = "zoo",
+            prefilled = 0, irregular = 1 });
 
 px, py = selection.rndcoord(place);
-if math.random(0, 99) < 50 then
-  des.object("bag of holding",px,py);
+if math.random(0, 99) < 25 then
+   des.object({ id="bag of holding", x=px, y=py,
+               buc="not-cursed", achievement=1 });
 else
-  des.object("amulet of reflection",px,py);
+   des.object({ id="amulet of reflection", x=px, y=py,
+               buc="not-cursed", achievement=1 });
 end
 des.engraving({ x = px, y = py, type = "burn", text = "Elbereth" });
 des.object({ id = "scare monster", x = px, y = py, buc = "cursed" });
index dafc0c3f8f05b2089b545129b31a568c1490e111..a872fa40550cf5dd3bec5ab0549f394936ff6e38 100644 (file)
@@ -1,4 +1,4 @@
-/* NetHack 3.6 context.h       $NHDT-Date: 1577050216 2019/12/22 21:30:16 $  $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.36 $ */
+/* NetHack 3.6 context.h       $NHDT-Date: 1580434522 2020/01/31 01:35:22 $  $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.39 $ */
 /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
 /*-Copyright (c) Michael Allison, 2006. */
 /* NetHack may be freely redistributed.  See license for details. */
@@ -107,7 +107,7 @@ struct novel_tracking { /* for choosing random passage when reading novel */
 
 struct achievement_tracking {
     unsigned mines_prize_oid, soko_prize_oid; /* obj->o_id */
-    short mines_prize_type, soko_prize_typ1, soko_prize_typ2; /* obj->otyp */
+    /* short mines_prize_type, soko_prize_typ1, soko_prize_typ2; */
 };
 
 struct context_info {
index 28e9fdefe2b8e21569c7652bc81dd1d754c3c060..1379ebce847d13bce92e4fb524a0d4155cbbb02b 100644 (file)
@@ -1,4 +1,4 @@
-/* NetHack 3.7 flag.h  $NHDT-Date: 1579261284 2020/01/17 11:41:24 $  $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.172 $ */
+/* NetHack 3.7 flag.h  $NHDT-Date: 1580434522 2020/01/31 01:35:22 $  $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.175 $ */
 /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
 /*-Copyright (c) Michael Allison, 2006. */
 /* NetHack may be freely redistributed.  See license for details. */
@@ -400,11 +400,6 @@ struct instance_flags {
     Bitfield(save_uswallow, 1);
     Bitfield(save_uinwater, 1);
     Bitfield(save_uburied, 1);
-    /* item types used to acomplish "special achievements"; find the target
-       object and you'll be flagged as having achieved something... */
-    short mines_prize_type;     /* luckstone */
-    short soko_prize_type1;     /* bag of holding or    */
-    short soko_prize_type2;     /* amulet of reflection */
     struct debug_flags debug;
     boolean windowtype_locked;  /* windowtype can't change from configfile */
     boolean windowtype_deferred; /* pick a windowport and store it in
index 060be4400fb0b19099be43e662184e2d4f4222a4..803315688678b8c324cb9235be22317c8718d74d 100644 (file)
@@ -1,4 +1,4 @@
-/* NetHack 3.6 sp_lev.h        $NHDT-Date: 1544930819 2018/12/16 03:26:59 $  $NHDT-Branch: NetHack-3.6.2-beta01 $:$NHDT-Revision: 1.25 $ */
+/* NetHack 3.6 sp_lev.h        $NHDT-Date: 1580434523 2020/01/31 01:35:23 $  $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.33 $ */
 /* Copyright (c) 1989 by Jean-Christophe Collet                          */
 /* NetHack may be freely redistributed.  See license for details. */
 
@@ -142,7 +142,8 @@ typedef struct {
     int quan;
     short buried;
     short lit;
-    short eroded, locked, trapped, recharged, invis, greased, broken;
+    short eroded, locked, trapped, recharged, invis, greased, broken,
+          achievement;
 } object;
 
 typedef struct {
index 638222145121bb7e28c6c1bdedcc500b4a6287fa..cd2a60710e6bd3e4cd79ee6f3be9263e40530618 100644 (file)
@@ -1,4 +1,4 @@
-/* NetHack 3.7 options.c       $NHDT-Date: 1579261293 2020/01/17 11:41:33 $  $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.428 $ */
+/* NetHack 3.7 options.c       $NHDT-Date: 1580434523 2020/01/31 01:35:23 $  $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.439 $ */
 /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
 /*-Copyright (c) Michael Allison, 2008. */
 /* NetHack may be freely redistributed.  See license for details. */
@@ -738,12 +738,6 @@ initoptions_init()
     for (i = 0; i < WARNCOUNT; i++)
         g.warnsyms[i] = def_warnsyms[i].sym;
 
-    /* for "special achievement" tracking (see obj.h,
-       create_object(sp_lev.c), addinv_core1(invent.c) */
-    g.context.achieveo.mines_prize_type = LUCKSTONE;
-    g.context.achieveo.soko_prize_typ1 = BAG_OF_HOLDING;
-    g.context.achieveo.soko_prize_typ2 = AMULET_OF_REFLECTION;
-
     /* assert( sizeof flags.inv_order == sizeof def_inv_order ); */
     (void) memcpy((genericptr_t) flags.inv_order,
                   (genericptr_t) def_inv_order, sizeof flags.inv_order);
index b1e6bcf5617e2fc0513b43eb265c324a5df7bad3..8b8dee95d534893e4bd1b659b5302553b7dfeafa 100644 (file)
@@ -1,4 +1,4 @@
-/* NetHack 3.6 sp_lev.c        $NHDT-Date: 1580431541 2020/01/31 00:45:41 $  $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.149 $ */
+/* NetHack 3.6 sp_lev.c        $NHDT-Date: 1580434524 2020/01/31 01:35:24 $  $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.150 $ */
 /*      Copyright (c) 1989 by Jean-Christophe Collet */
 /* NetHack may be freely redistributed.  See license for details. */
 
@@ -1581,25 +1581,10 @@ struct mkroom *croom;
         }
     }
 
-    if (o->id != -1) {
+    if (o->achievement) {
         static const char prize_warning[] = "multiple prizes on %s level";
 
-        /*
-         * If this is a specific item of the right type and it is being
-         * created on the right level, record its obj->o_id to be able
-         * to recognize it as the designated item
-         * used to detect a special achievement (to whit, reaching and
-         * exploring the target level, although the exploration part
-         * might be short-circuited if a monster brings object to hero).
-         * Achievement is accomplished and the recorded o_id is cleared
-         * if/when it gets added into hero's inventory.
-         *
-         * Random items of the appropriate type won't trigger a false
-         * match--they'll fail the (id != -1) test above--but the level
-         * definition should not include a second instance of any prize.
-         */
-        if (Is_mineend_level(&u.uz)
-            && otmp->otyp == g.context.achieveo.mines_prize_type) {
+        if (Is_mineend_level(&u.uz)) {
             if (!g.context.achieveo.mines_prize_oid) {
                 g.context.achieveo.mines_prize_oid = otmp->o_id;
                 /* prevent stacking; cleared when achievement is recorded */
@@ -1607,15 +1592,19 @@ struct mkroom *croom;
             } else {
                 impossible(prize_warning, "mines end");
             }
-        } else if (Is_sokoend_level(&u.uz)
-                   && (otmp->otyp == g.context.achieveo.soko_prize_typ1
-                       || otmp->otyp == g.context.achieveo.soko_prize_typ2)) {
+        } else if (Is_sokoend_level(&u.uz)) {
             if (!g.context.achieveo.soko_prize_oid) {
                 g.context.achieveo.soko_prize_oid = otmp->o_id;
                 otmp->nomerge = 1; /* redundant; Sokoban prizes don't stack */
             } else {
                 impossible(prize_warning, "sokoban end");
             }
+        } else {
+            char lbuf[QBUFSZ];
+
+            (void) describe_level(lbuf); /* always has a trailing space */
+            impossible("create_object: unknown achievement (%s\"%s\")",
+                       lbuf, simpleonames(otmp));
         }
     }
 
@@ -2745,6 +2734,7 @@ lua_State *L;
         tmpobj.recharged = get_table_int_opt(L, "recharged", 0);
         tmpobj.greased = get_table_boolean_opt(L, "greased", 0);
         tmpobj.broken = get_table_boolean_opt(L, "broken", 0);
+        tmpobj.achievement = get_table_boolean_opt(L, "achievement", 0);
 
         ox = get_table_int_opt(L, "x", -1);
         oy = get_table_int_opt(L, "y", -1);