From: PatR Date: Fri, 31 Jan 2020 01:35:32 +0000 (-0800) Subject: more simplification of achievement tracking X-Git-Tag: NetHack-3.7.0_WIP-2020-02-14~93 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=6c479f2317551f88b44b3c06567bd9a90da291a6;p=nethack more simplification of achievement tracking 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. --- diff --git a/dat/minend-1.lua b/dat/minend-1.lua index 109cc0737..7fce31a28 100644 --- a/dat/minend-1.lua +++ b/dat/minend-1.lua @@ -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("*") diff --git a/dat/minend-2.lua b/dat/minend-2.lua index d8370d102..39a7750eb 100644 --- a/dat/minend-2.lua +++ b/dat/minend-2.lua @@ -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("*") diff --git a/dat/minend-3.lua b/dat/minend-3.lua index a40d7448a..92be571b1 100644 --- a/dat/minend-3.lua +++ b/dat/minend-3.lua @@ -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("?") diff --git a/dat/soko1-1.lua b/dat/soko1-1.lua index efcb3dd13..d05d5ee27 100644 --- a/dat/soko1-1.lua +++ b/dat/soko1-1.lua @@ -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" }); diff --git a/dat/soko1-2.lua b/dat/soko1-2.lua index 6a6361d53..7ad218b39 100644 --- a/dat/soko1-2.lua +++ b/dat/soko1-2.lua @@ -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" }); diff --git a/include/context.h b/include/context.h index dafc0c3f8..a872fa405 100644 --- a/include/context.h +++ b/include/context.h @@ -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 { diff --git a/include/flag.h b/include/flag.h index 28e9fdefe..1379ebce8 100644 --- a/include/flag.h +++ b/include/flag.h @@ -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 diff --git a/include/sp_lev.h b/include/sp_lev.h index 060be4400..803315688 100644 --- a/include/sp_lev.h +++ b/include/sp_lev.h @@ -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 { diff --git a/src/options.c b/src/options.c index 638222145..cd2a60710 100644 --- a/src/options.c +++ b/src/options.c @@ -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); diff --git a/src/sp_lev.c b/src/sp_lev.c index b1e6bcf56..8b8dee95d 100644 --- a/src/sp_lev.c +++ b/src/sp_lev.c @@ -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);