From 40fdbccf84a5c745dd76c03088c8890039610c1f Mon Sep 17 00:00:00 2001 From: PatR Date: Fri, 1 May 2015 19:44:56 -0700 Subject: [PATCH 01/27] enlightenment for polymorph & lycanthropy Fine-tune lycanthropy feedback by combining "you are a werecritter" and "you are in beast form" into one message. Also, add some new feedback when lycanthropy and intrinsic polymorph are blocked by intrinsic unchanging. --- src/cmd.c | 51 +++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 39 insertions(+), 12 deletions(-) diff --git a/src/cmd.c b/src/cmd.c index 24b1791c5..973a447cd 100644 --- a/src/cmd.c +++ b/src/cmd.c @@ -1,4 +1,4 @@ -/* NetHack 3.5 cmd.c $NHDT-Date$ $NHDT-Branch$:$NHDT-Revision$ */ +/* NetHack 3.5 cmd.c $NHDT-Date: 1430534601 2015/05/02 02:43:21 $ $NHDT-Branch: master $:$NHDT-Revision: 1.186 $ */ /* NetHack 3.5 cmd.c $Date: 2013/03/16 01:44:28 $ $Revision: 1.162 $ */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ @@ -1935,27 +1935,54 @@ int final; } if (Half_physical_damage) enlght_halfdmg(HALF_PHDAM, final); if (Half_spell_damage) enlght_halfdmg(HALF_SPDAM, final); + /* polymorph and other shape change */ if (Protection_from_shape_changers) you_are("protected from shape changers", from_what(PROT_FROM_SHAPE_CHANGERS)); - if (Polymorph) you_are("polymorphing", from_what(POLYMORPH)); + if (Unchanging) { + const char *what = 0; + + if (!Upolyd) /* Upolyd handled below after current form */ + you_can("not change from your current form", + from_what(UNCHANGING)); + /* blocked shape changes */ + if (Polymorph) + what = !final ? "polymorph" : "have polymorphed"; + else if (u.ulycn >= LOW_PM) + what = !final ? "change shape" : "have changed shape"; + if (what) { + Sprintf(buf, "would %s periodically", what); + /* omit from_what(UNCHANGING); too verbose */ + enl_msg(You_, buf, buf, + " if not locked into your current form", ""); + } + } else if (Polymorph) { + you_are("polymorphing periodically", from_what(POLYMORPH)); + } if (Polymorph_control) you_have("polymorph control",from_what(POLYMORPH_CONTROL)); - if (u.ulycn >= LOW_PM) { - Strcpy(buf, an(mons[u.ulycn].mname)); + if (Upolyd && u.umonnum != u.ulycn) { + /* foreign shape (except were-form which is handled below) */ + Sprintf(buf, "polymorphed into %s", an(youmonst.data->mname)); + if (wizard) Sprintf(eos(buf), " (%d)", u.mtimedone); you_are(buf,""); } - if (Upolyd) { - if (u.umonnum == u.ulycn) Strcpy(buf, "in beast form"); - else Sprintf(buf, "polymorphed into %s", an(youmonst.data->mname)); - if (wizard) Sprintf(eos(buf), " (%d)", u.mtimedone); - you_are(buf,""); - if (lays_eggs(youmonst.data) && flags.female) + if (lays_eggs(youmonst.data) && flags.female) /* Upolyd */ you_can("lay eggs", ""); + if (u.ulycn >= LOW_PM) { + /* "you are a werecreature [in beast form]" */ + Strcpy(buf, an(mons[u.ulycn].mname)); + if (u.umonnum == u.ulycn) { + Strcat(buf, " in beast form"); + if (wizard) Sprintf(eos(buf), " (%d)", u.mtimedone); + } + you_are(buf,""); } - if (Unchanging) you_can("not change from your current form", - from_what(UNCHANGING)); + if (Unchanging && Upolyd) /* !Upolyd handled above */ + you_can("not change from your current form", + from_what(UNCHANGING)); if (Hate_silver) you_are("harmed by silver",""); + /* movement and non-armor-based protection */ if (Fast) you_are(Very_fast ? "very fast" : "fast",from_what(FAST)); if (Reflecting) you_have("reflection",from_what(REFLECTING)); if (Free_action) you_have("free action",from_what(FREE_ACTION)); From ee854e5c7685edd89a2ee2826db361c9461809f1 Mon Sep 17 00:00:00 2001 From: PatR Date: Sat, 2 May 2015 02:44:57 -0700 Subject: [PATCH 02/27] more owornmask sanity_check Fix the problem with erroneously detecting wielded or quivered chained ball which legitimately has more than one mask bit set. Add an additional check for valid wornmask of an item somehow worn in an invalid slot (such as an amulet in one of the ring slots). Only lightly tested; it really needs debugger assistance to force various invalid situations but I don't know gdb well enough for that. --- src/mkobj.c | 58 ++++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 49 insertions(+), 9 deletions(-) diff --git a/src/mkobj.c b/src/mkobj.c index 50f2b5b7e..899581128 100644 --- a/src/mkobj.c +++ b/src/mkobj.c @@ -1,4 +1,4 @@ -/* NetHack 3.5 mkobj.c $NHDT-Date: 1430472720 2015/05/01 09:32:00 $ $NHDT-Branch: master $:$NHDT-Revision: 1.95 $ */ +/* NetHack 3.5 mkobj.c $NHDT-Date: 1430559882 2015/05/02 09:44:42 $ $NHDT-Branch: master $:$NHDT-Revision: 1.96 $ */ /* NetHack 3.5 mkobj.c $Date: 2012/03/10 02:49:08 $ $Revision: 1.70 $ */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ @@ -2180,32 +2180,44 @@ struct obj *obj; /* [W_ART,W_ARTI are property bits for items which aren't worn] */ }; char maskbuf[60]; - unsigned long allmask = 0L; + unsigned long owornmask, allmask = 0L; int i, n = 0; + /* use owornmask for testing and bit twiddling, but use original + obj->owornmask for printing */ + owornmask = obj->owornmask; + /* figure out how many bits are set, and also which are viable */ for (i = 0; wearbits[i]; ++i) { + if ((owornmask & wearbits[i]) != 0L) ++n; allmask |= wearbits[i]; - if ((obj->owornmask & wearbits[i]) != 0L) ++n; + } + if (n == 2 && carried(obj) && obj == uball && (owornmask & W_BALL) != 0L + && (owornmask & (W_WEP|W_SWAPWEP|W_QUIVER)) != 0L) { + /* chained ball can be wielded/alt-wielded/quivered; if so, + pretend it's not chained in order to check the weapon pointer + (we've already verified the ball pointer by successfully passing + the if-condition to get here...) */ + owornmask &= ~W_BALL; + n = 1; } if (n > 1) { /* multiple bits set */ Sprintf(maskbuf, "worn mask (multiple) 0x%08lx", obj->owornmask); insane_object(obj, ofmt0, maskbuf, (struct monst *)0); } - if ((obj->owornmask & ~allmask) != 0L - || (carried(obj) && (obj->owornmask & W_SADDLE) != 0L)) { + if ((owornmask & ~allmask) != 0L + || (carried(obj) && (owornmask & W_SADDLE) != 0L)) { /* non-wearable bit(s) set */ Sprintf(maskbuf, "worn mask (bogus)) 0x%08lx", obj->owornmask); insane_object(obj, ofmt0, maskbuf, (struct monst *)0); } - if (n == 1 && (carried(obj) - || (obj->owornmask & (W_BALL|W_CHAIN)) != 0L)) { + if (n == 1 && (carried(obj) || (owornmask & (W_BALL|W_CHAIN)) != 0L)) { const char *what = 0; /* verify that obj in hero's invent (or ball/chain elsewhere) with owornmask of W_foo is the object pointed to by ufoo */ - switch (obj->owornmask) { - case W_ARM: if (obj != uarm) what = "armor"; /* suit */ + switch (owornmask) { + case W_ARM: if (obj != uarm) what = "suit"; break; case W_ARMC: if (obj != uarmc) what = "cloak"; break; @@ -2245,6 +2257,34 @@ struct obj *obj; Sprintf(maskbuf, "worn mask 0x%08lx != %s", obj->owornmask, what); insane_object(obj, ofmt0, maskbuf, (struct monst *)0); } + /* check for items worn in invalid slots; practically anything can + be wielded/alt-wielded/quivered, so skip obj if it's one of those */ + what = 0; + if (owornmask & W_ARMOR) { + if (obj->oclass != ARMOR_CLASS) what = "armor"; + } else if (owornmask & W_AMUL) { + if (obj->oclass != AMULET_CLASS) what = "amulet"; + } else if (owornmask & W_RING) { + if (obj->oclass != RING_CLASS && obj->otyp != MEAT_RING) + what = "ring"; + } else if (owornmask & W_TOOL) { + if (obj->otyp != BLINDFOLD && obj->otyp != TOWEL + && obj->otyp != LENSES) what = "blindfold"; + } else if (owornmask & W_BALL) { + if (obj->oclass != BALL_CLASS) what = "chained ball"; + } else if (owornmask & W_CHAIN) { + if (obj->oclass != CHAIN_CLASS) what = "chain"; + } + if (what) { + char oclassname[30]; + + /* if we've found a potion worn in the amulet slot, + this yields "worn (potion amulet)" */ + Strcpy(oclassname, def_oc_syms[(uchar)obj->oclass].name); + Sprintf(maskbuf, "worn (%s %s)", + makesingular(oclassname), what); + insane_object(obj, ofmt0, maskbuf, (struct monst *)0); + } } #else /* not (BETA || DEBUG) */ /* dummy use of obj to avoid "arg not used" complaint */ From b234c7032f5b1a19c756997b2907e2ca131a285a Mon Sep 17 00:00:00 2001 From: Pasi Kallinen Date: Sat, 2 May 2015 18:29:31 +0300 Subject: [PATCH 03/27] Make the Valley have slight variations --- dat/gehennom.des | 18 ++++++++++++++++++ util/lev_comp.y | 4 ++-- 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/dat/gehennom.des b/dat/gehennom.des index 470d0dea0..8d4c72445 100644 --- a/dat/gehennom.des +++ b/dat/gehennom.des @@ -31,6 +31,24 @@ MAP | |..|..B...........| |.|..........|.| |.|........| | ---------------------------------------------------------------------------- ENDMAP + +# Make the path somewhat unpredictable +# If you get "lucky", you may have to go through all three graveyards. +IF [50%] { + TERRAIN:line (50,8),(53,8), '-' + TERRAIN:line (40,8),(43,8), 'B' +} +IF [50%] { + TERRAIN:(27,12),'|' + TERRAIN:line (27,3),(29,3), 'B' + TERRAIN:(28,2), '-' +} +IF [50%] { + TERRAIN:line (16,10),(16,11),'|' + TERRAIN:line (9,13),(14,13), 'B' +} + + # Dungeon Description # The shrine to Moloch. REGION:(01,06,05,14),lit,"temple" diff --git a/util/lev_comp.y b/util/lev_comp.y index 0a153bef2..9b7ed7c47 100644 --- a/util/lev_comp.y +++ b/util/lev_comp.y @@ -2450,11 +2450,11 @@ ter_selection_x : coord_or_var { add_opvars(splev, "o", VA_PASS1(SPO_SEL_FILLRECT)); } - | line_ID coord_or_var '-' coord_or_var + | line_ID coord_or_var ',' coord_or_var { add_opvars(splev, "o", VA_PASS1(SPO_SEL_LINE)); } - | randline_ID coord_or_var '-' coord_or_var ',' math_expr_var + | randline_ID coord_or_var ',' coord_or_var ',' math_expr_var { /* randline (x1,y1),(x2,y2), roughness */ add_opvars(splev, "o", VA_PASS1(SPO_SEL_RNDLINE)); From 537acc98dc28de9a5a0165e33fd92449cac8e6b7 Mon Sep 17 00:00:00 2001 From: Pasi Kallinen Date: Sat, 2 May 2015 18:33:14 +0300 Subject: [PATCH 04/27] Update pregenerated levcomp lex and yacc files --- sys/share/lev_yacc.c | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/sys/share/lev_yacc.c b/sys/share/lev_yacc.c index d2280994c..88aebc857 100644 --- a/sys/share/lev_yacc.c +++ b/sys/share/lev_yacc.c @@ -895,7 +895,7 @@ union yyalloc /* YYFINAL -- State number of the termination state. */ #define YYFINAL 9 /* YYLAST -- Last index in YYTABLE. */ -#define YYLAST 1031 +#define YYLAST 1033 /* YYNTOKENS -- Number of terminals. */ #define YYNTOKENS 194 @@ -1176,9 +1176,9 @@ static const yytype_int16 yypact[] = -654, 309, 387, 555, 556, 558, 733, 733, -654, -654, 66, -31, 671, 46, 698, 571, 567, 672, 573, 66, 215, 700, 566, 581, 66, 587, 359, 589, 66, 359, - -18, -18, 672, 663, 664, -654, -654, 541, 544, 521, - -654, -18, -18, 307, -654, 595, 590, 672, 597, 66, - 67, 186, 659, 730, 604, 669, -1, 8, -654, 606, + -18, -18, 672, 663, 664, -654, -654, 592, 593, 521, + -654, -18, -18, 307, -654, 598, 596, 672, 597, 66, + 67, 186, 660, 730, 604, 669, -1, 8, -654, 606, 607, -1, -1, -1, 66, 609, 89, -18, 141, 12, 57, 665, -654, 52, 52, -654, 156, 605, -38, 697, -654, -654, 331, 347, 168, 168, -654, -654, -654, 56, @@ -1339,9 +1339,9 @@ static const yytype_int16 yypgoto[] = -654, -654, -654, -654, -654, -654, -654, -654, -654, -654, -654, -654, -654, -654, -654, -654, -654, 421, -653, 200, -654, -385, -492, -654, -654, -654, 369, 682, -168, -136, - -312, 583, 150, -308, -386, -485, -418, -473, 596, -459, - -132, -55, -654, 396, -654, -654, 610, -654, -654, 781, - -135, 576, -392, -654, -654, -654, -654, -654, -124, -654 + -312, 583, 150, -308, -386, -485, -418, -473, 602, -459, + -132, -55, -654, 396, -654, -654, 610, -654, -654, 778, + -135, 575, -392, -654, -654, -654, -654, -654, -124, -654 }; /* YYDEFGOTO[NTERM-NUM]. */ @@ -1442,8 +1442,8 @@ static const yytype_int16 yytable[] = 433, 719, 720, 721, 722, 723, 724, 725, 726, 727, 728, 442, 443, 444, 446, 451, 452, 310, 311, 312, 313, 314, 453, 310, 311, 312, 313, 314, 455, 857, - 457, 463, 464, 480, 481, 864, 493, 465, 483, 819, - 466, 202, 203, 193, 494, 495, 496, 501, 502, 16, + 457, 463, 464, 465, 466, 864, 480, 493, 483, 819, + 481, 202, 203, 193, 494, 495, 496, 501, 502, 16, 507, 526, -159, 537, 194, 195, 554, 17, 845, 552, 18, 19, 20, 21, 22, 23, 24, 25, 26, 555, 557, 853, 27, 28, 29, 558, 561, 586, 30, 31, @@ -1472,8 +1472,8 @@ static const yytype_int16 yytable[] = 839, 840, 833, 841, 843, 846, 848, 850, 849, 10, 851, 172, 855, 856, 434, 861, 863, 339, 166, 865, 508, 807, 560, 292, 796, 802, 753, 299, 826, 222, - 847, 838, 731, 437, 668, 698, 556, 547, 0, 535, - 374, 581 + 847, 838, 731, 437, 668, 698, 556, 374, 0, 535, + 581, 0, 0, 547 }; static const yytype_int16 yycheck[] = @@ -1550,8 +1550,8 @@ static const yytype_int16 yycheck[] = 132, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 3, 131, 136, 131, 5, 140, 185, 186, 187, 188, 189, 131, 185, 186, 187, 188, 189, 131, 855, - 131, 58, 58, 128, 134, 861, 67, 186, 131, 784, - 186, 59, 60, 139, 4, 131, 67, 131, 131, 6, + 131, 58, 58, 131, 131, 861, 128, 67, 131, 784, + 134, 59, 60, 139, 4, 131, 67, 131, 131, 6, 131, 136, 77, 131, 150, 151, 3, 14, 831, 138, 17, 18, 19, 20, 21, 22, 23, 24, 25, 131, 134, 844, 29, 30, 31, 4, 139, 131, 35, 36, @@ -1580,8 +1580,8 @@ static const yytype_int16 yycheck[] = 4, 134, 192, 134, 134, 131, 134, 134, 129, 5, 134, 55, 131, 131, 336, 131, 860, 192, 49, 134, 396, 767, 450, 164, 754, 762, 678, 169, 795, 139, - 833, 821, 653, 341, 603, 629, 443, 431, -1, 419, - 249, 455 + 833, 821, 653, 341, 603, 629, 443, 249, -1, 419, + 455, -1, -1, 431 }; /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing @@ -1634,7 +1634,7 @@ static const yytype_uint16 yystos[] = 335, 132, 132, 132, 209, 207, 335, 321, 3, 3, 133, 297, 3, 131, 136, 344, 131, 335, 64, 65, 271, 5, 140, 131, 335, 131, 208, 131, 335, 208, - 323, 323, 344, 58, 58, 186, 186, 58, 267, 344, + 323, 323, 344, 58, 58, 131, 131, 58, 267, 344, 323, 323, 3, 7, 133, 158, 159, 328, 329, 344, 128, 134, 344, 131, 335, 55, 59, 316, 59, 61, 62, 317, 320, 67, 4, 131, 67, 352, 59, 133, From 03a1fcfc56d50c71f1a49f026db5b2d5841726dc Mon Sep 17 00:00:00 2001 From: Pasi Kallinen Date: Sat, 2 May 2015 19:27:05 +0300 Subject: [PATCH 05/27] Put Rogue quest home monsters on the "streets" --- dat/Rogue.des | 32 ++++++++++++-------------------- 1 file changed, 12 insertions(+), 20 deletions(-) diff --git a/dat/Rogue.des b/dat/Rogue.des index 38921c371..f8231baf6 100644 --- a/dat/Rogue.des +++ b/dat/Rogue.des @@ -39,6 +39,10 @@ MAP ENDMAP # Dungeon Description #REGION:(00,00,75,20),lit,"ordinary" + +$streets = selection: floodfill(0,12) + + # The down stairs is at one of the 4 "exits". The others are mimics, # mimicing stairwells. $place = { (33,0), (0,12), (25,20), (75,05) } @@ -149,26 +153,14 @@ MONSTER: ('l',"leprechaun"),(74,04),hostile # South exit MONSTER: ('l',"leprechaun"),(25,19),hostile MONSTER: ('n',"water nymph"),(25,18),hostile -# Wandering the streets. What I'd really like for this is a random -# location, but make sure we're on a given type, e.g. street (if they -# existed, of course). -MONSTER: ('n',"water nymph"),(07,05),hostile -MONSTER: ('l',"leprechaun"),(28,06),hostile -MONSTER: ('n',"water nymph"),(38,07),hostile -MONSTER: ('l',"leprechaun"),(45,01),hostile -MONSTER: ('n',"water nymph"),(59,07),hostile -MONSTER: ('l',"leprechaun"),(62,14),hostile -MONSTER: ('n',"water nymph"),(71,14),hostile -MONSTER: ('l',"leprechaun"),(39,13),hostile -MONSTER: ('n',"water nymph"),(18,14),hostile -MONSTER: (':',"chameleon"),(19,08),hostile -MONSTER: (':',"chameleon"),(22,08),hostile -MONSTER: (':',"chameleon"),(16,08),hostile -MONSTER: (':',"chameleon"),random,hostile -MONSTER: (':',"chameleon"),random,hostile -MONSTER: (':',"chameleon"),random,hostile -MONSTER: (':',"chameleon"),random,hostile -MONSTER: (':',"chameleon"),random,hostile +# Wandering the streets. +LOOP [ 4 + 1d3 ] { + MONSTER: ('n',"water nymph"),rndcoord($streets),hostile + MONSTER: ('l',"leprechaun"),rndcoord($streets),hostile +} +LOOP [ 7 + 1d3 ] { + MONSTER: (':',"chameleon"),rndcoord($streets),hostile +} # # The "locate" level for the quest. From 37d76d1ea5846f0cb56d49779d0eba173778eef5 Mon Sep 17 00:00:00 2001 From: Pasi Kallinen Date: Sat, 2 May 2015 19:54:45 +0300 Subject: [PATCH 06/27] Add trees to Priest quest home level --- dat/Priest.des | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/dat/Priest.des b/dat/Priest.des index f8d3d4b75..0312698bc 100644 --- a/dat/Priest.des +++ b/dat/Priest.des @@ -38,6 +38,11 @@ ENDMAP # Dungeon Description REGION:(00,00,75,19),lit,"ordinary" REGION:(24,06,33,13),lit,"temple" + +REPLACE_TERRAIN:(0,0,10,19),'.','T',10% +REPLACE_TERRAIN:(65,0,75,19),'.','T',10% +TERRAIN:(05,04),'.' + # Portal arrival point BRANCH:(05,04,05,04),(0,0,0,0) # Stairs @@ -77,7 +82,7 @@ MONSTER:('@',"acolyte"),(33,08) MONSTER:('@',"acolyte"),(33,11) MONSTER:('@',"acolyte"),(33,12) # Non diggable walls -NON_DIGGABLE:(00,00,75,19) +NON_DIGGABLE:(18,03,55,16) # Random traps TRAP:"dart",(20,09) TRAP:"dart",(20,10) From 1b0e806f7259c3bc00aec575d7f23385913b86d3 Mon Sep 17 00:00:00 2001 From: Pasi Kallinen Date: Sat, 2 May 2015 20:29:15 +0300 Subject: [PATCH 07/27] Add some clouds to the Wiz quest --- dat/Wizard.des | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/dat/Wizard.des b/dat/Wizard.des index d70be72d6..1b4ed5d86 100644 --- a/dat/Wizard.des +++ b/dat/Wizard.des @@ -34,6 +34,12 @@ MAP ..........C.C.........................C............C...........}}}}}........ ......................CCC.C................................................. ENDMAP + +# first do cloud everywhere +REPLACE_TERRAIN:(0,0, 75,19), '.', 'C', 10% +# then replace clouds inside the tower back to floor +REPLACE_TERRAIN:(13,5, 33,15), 'C', '.', 100% + # Dungeon Description REGION:(00,00,75,19),lit,"ordinary" REGION:(35,00,49,03),unlit,"ordinary" @@ -43,6 +49,7 @@ REGION:(30,10,31,10),unlit,"ordinary" # Stairs STAIR:(30,10),down # Portal arrival point +TERRAIN:(63,06),'.' BRANCH:(63,06,63,06),(0,0,0,0) # Doors DOOR:closed,(31,09) @@ -129,6 +136,11 @@ MAP ............. .............}}}}}}}.}}}}}}}}}}}}}}}}}}}.}}}}}}}....... ............. ....................................................... ENDMAP + +REPLACE_TERRAIN:(0,0,30,20), '.', 'C', 15% +REPLACE_TERRAIN:(68,0,75,20), '.', '}', 25% +REPLACE_TERRAIN:(34,1,68,19), '}', '.', 2% + # Dungeon Description REGION:(00,00,75,20),lit,"ordinary" REGION:(37,04,65,16),unlit,"ordinary" @@ -148,6 +160,7 @@ DOOR:locked,(55,12) DOOR:locked,(47,08) DOOR:locked,(47,12) # Stairs +TERRAIN:(03,17),'.' STAIR:(03,17),up STAIR:(48,10),down # Non diggable walls From 04bea1029806de32d0772a339dcfb989ec74c922 Mon Sep 17 00:00:00 2001 From: Pasi Kallinen Date: Sat, 2 May 2015 20:47:02 +0300 Subject: [PATCH 08/27] Random melted spots in Valk quest home --- dat/Valkyrie.des | 53 ++++++++++++++++++++++++++++++------------------ 1 file changed, 33 insertions(+), 20 deletions(-) diff --git a/dat/Valkyrie.des b/dat/Valkyrie.des index ad9c942bf..f9a9f2213 100644 --- a/dat/Valkyrie.des +++ b/dat/Valkyrie.des @@ -12,28 +12,41 @@ # MAZE: "Val-strt",' ' FLAGS: noteleport,hardfloor,icedpools +INIT_MAP:solidfill,'I' + +$pools = selection: random & random & random & random & random & + random & random & random & random & random & random & + random & random & + grow(west, random) & + grow(north, random) & + grow(random & random) +# This works because the random coordinates in $pools are evaluated once, +# when the variable is initialized. +TERRAIN:grow($pools), 'P' +TERRAIN:$pools, 'L' + GEOMETRY:center,center MAP -IIIIIIPPPIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII -IIIIPPPPPIIIIIIII..IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII...IIIIIIIIIIIIIIIIIIIII -IIIIPLLPPIIIIIII..IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII..{..IIIIIIIIIIIIIIIIIIII -IIIIPLPPIIIIIII..IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII.....IIIIIIPPPIIIIIIIIII -IIIPPPPPIIIIII..IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII.IIIIIPPLPIIIIIIIIII -IIIIPIIIIIIII..IIIIPPPIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII.IIIIIPLPPIIIIIIIIII -IIIIIIIIIIII..IIIIIPLPPIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII..IIIIIPPPIIIIIIIIIII -IIIIIIII.....IIIIIIPPPIIII|----------------|IIIIIPPPIII.IIIIIIIIIIIIIIIIIIII -IIIIIII..III...IIIIIIIIIII|................|IIIIIPLPII..IIIIIIIIIIIIIIIIIIII -IIIIII..IIIIII......IIIII.|................|.IIIIPPPII.IIIIIIIIIIIIIIIIIIIII -IIIII..IIIIIIIIIIII.......+................+...IIIIIII.IIIIIIIIIIIIIIIIIIIII -IIII..IIIIIIIII.....IIIII.|................|.I...IIIII.IIIIIIIIIIIIIIIIIIIII -III..IIIIIIIII..IIIIIIIIII|................|IIII.......IIIIIIIIIIIIIIIIIIIII -IIII..IIIIIII..IIIIIIIIIII|----------------|IIIIIIIIII...IIIIIIIIIIIIIIIIIII -IIIIII..IIII..IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIPPPPIIII...IIIIIIIIIIIIIIIII -IIIIIII......IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIPLLPPIIIII...IIIIIIIIIIIIIII -IIIIPPPIP...IIIIIIIIIIIPIIIIIIIIIIIIIIIIIIIIIIIIPPPPIIIIIIII...I......IIIIII -IIIPPLPPIIIIIIIIIIIIIIPPPIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII.........IIIII -IIIIPPPIIIIIIIIIIIIIIPPLPIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII.......IIIIII -IIIIIIIIIIIIIIIIIIIIIIPPPIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII +xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx +xxxxxxxxxxxxxxxxx..xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx...xxxxxxxxxxxxxxxxxxxxx +xxxxxxxxxxxxxxxx..xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx..{..xxxxxxxxxxxxxxxxxxxx +xxxxxxxxxxxxxxx..xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.....xxxxxxxxxxxxxxxxxxx +xxxxxxxxxxxxxx..xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.xxxxxxxxxxxxxxxxxxx +xxxxxxxxxxxxx..xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.xxxxxxxxxxxxxxxxxxx +xxxxxxxxxxxx..xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx..xxxxxxxxxxxxxxxxxxx +xxxxxxxx.....xxxxxxxxxxxxx|----------------|xxxxxxxxxxx.xxxxxxxxxxxxxxxxxxxx +xxxxxxx..xxx...xxxxxxxxxxx|................|xxxxxxxxxx..xxxxxxxxxxxxxxxxxxxx +xxxxxx..xxxxxx......xxxxx.|................|.xxxxxxxxx.xxxxxxxxxxxxxxxxxxxxx +xxxxx..xxxxxxxxxxxx.......+................+...xxxxxxx.xxxxxxxxxxxxxxxxxxxxx +xxxx..xxxxxxxxx.....xxxxx.|................|.x...xxxxx.xxxxxxxxxxxxxxxxxxxxx +xxx..xxxxxxxxx..xxxxxxxxxx|................|xxxx.......xxxxxxxxxxxxxxxxxxxxx +xxxx..xxxxxxx..xxxxxxxxxxx|----------------|xxxxxxxxxx...xxxxxxxxxxxxxxxxxxx +xxxxxx..xxxx..xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx...xxxxxxxxxxxxxxxxx +xxxxxxx......xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx...xxxxxxxxxxxxxxx +xxxxxxxxx...xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx...x......xxxxxx +xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.........xxxxx +xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.......xxxxxx +xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ENDMAP # Dungeon Description REGION:(00,00,75,19),lit,"ordinary" From e05a9655db0e29358434df709cd8cdde348e2605 Mon Sep 17 00:00:00 2001 From: Pasi Kallinen Date: Sat, 2 May 2015 20:55:32 +0300 Subject: [PATCH 09/27] Random holes in the walls of Sam quest goal --- dat/Samurai.des | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/dat/Samurai.des b/dat/Samurai.des index 6dd53ac4f..3149c2347 100644 --- a/dat/Samurai.des +++ b/dat/Samurai.des @@ -247,7 +247,7 @@ GEOMETRY:center,center MAP ....................... - ......---------.---------...... + ......-------------------...... ......----.................----...... ....----.....-------------.....----.... ....--.....----...........----.....--.... @@ -255,11 +255,11 @@ MAP ...|....--....---.......---....--....|... ....|...||...---...--+--...---...||...|.... ....|...|....|....|-...-|....|....|...|.... - ....|...|....|....+.....+....|........|.... + ....|...|....|....+.....+....|....|...|.... ....|...|....|....|-...-|....|....|...|.... ....|...||...---...--+--...---...||...|.... ...|....--....---.......---....--....|... - ...||....---....----.----....---....||... + ...||....---....---------....---....||... ....--.....----...........----.....--.... ....----.....-------------.....----.... ......----.................----...... @@ -278,6 +278,18 @@ DOOR:closed,(22,12) DOOR:closed,(25,10) # Stairs STAIR:$place[0],up + +# Holes in the concentric ring walls +$place = { (22,14),(30,10),(22, 6),(14,10) } +SHUFFLE:$place +TERRAIN:$place[0],'.' +$place = { (22, 4),(35,10),(22,16),( 9,10) } +SHUFFLE:$place +TERRAIN:$place[0],'.' +$place = { (22, 2),(22,18) } +SHUFFLE:$place +TERRAIN:$place[0],'.' + # Non diggable walls NON_DIGGABLE:(00,00,44,19) # Objects From 655611c6abfa142045ee5d827f5528e6a2dd48b8 Mon Sep 17 00:00:00 2001 From: Pasi Kallinen Date: Sat, 2 May 2015 21:04:19 +0300 Subject: [PATCH 10/27] Add random trees to Ranger quest home --- dat/Ranger.des | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/dat/Ranger.des b/dat/Ranger.des index f44c28779..cde5cf2ea 100644 --- a/dat/Ranger.des +++ b/dat/Ranger.des @@ -13,11 +13,12 @@ MAZE: "Ran-strt",'.' FLAGS: noteleport,hardfloor,arboreal INIT_MAP:mines,'.','.',true,true,lit,false +REPLACE_TERRAIN:(0,0,76,19),'.', 'T', 5% GEOMETRY:left,center #1234567890123456789012345678901234567890123456789012345678901234567890 MAP - .. - ................................... . + xx + ................................... x .. .. .. ...............F............... .. . .. .F. .. . @@ -35,8 +36,8 @@ MAP . .. .F. .. . .. ...............F............... .. .. .. - ................................... . - .. + ................................... x + xx ENDMAP # Dungeon Description REGION:(00,00,40,20),lit,"ordinary" From 1746131f603d07a2cdc78fd3b8781ff96fd1f09f Mon Sep 17 00:00:00 2001 From: Pasi Kallinen Date: Sat, 2 May 2015 21:20:36 +0300 Subject: [PATCH 11/27] Make Monk quest home match Priest one --- dat/Monk.des | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/dat/Monk.des b/dat/Monk.des index cb87649e2..836468259 100644 --- a/dat/Monk.des +++ b/dat/Monk.des @@ -38,7 +38,12 @@ ENDMAP # Dungeon Description REGION:(00,00,75,19),lit,"ordinary" REGION:(24,06,33,13),lit,"temple" + +REPLACE_TERRAIN:(0,0,10,19),'.','T',10% +REPLACE_TERRAIN:(65,0,75,19),'.','T',10% + # Portal arrival point +TERRAIN:(05,04),'.' BRANCH:(05,04,05,04),(0,0,0,0) # Stairs STAIR:(52,09),down @@ -76,7 +81,7 @@ MONSTER:('@',"abbot"),(33,08) MONSTER:('@',"abbot"),(33,11) MONSTER:('@',"abbot"),(33,12) # Non diggable walls -NON_DIGGABLE:(00,00,75,19) +NON_DIGGABLE:(18,03,55,16) # Random traps TRAP:"dart",(20,09) TRAP:"dart",(20,10) From 7fc44412f9ffd80164c41539e972d14f27cf9a2b Mon Sep 17 00:00:00 2001 From: Pasi Kallinen Date: Sat, 2 May 2015 22:04:40 +0300 Subject: [PATCH 12/27] More minetown and mine end variation --- dat/mines.des | 97 +++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 74 insertions(+), 23 deletions(-) diff --git a/dat/mines.des b/dat/mines.des index c8be29d35..62b35b1d1 100644 --- a/dat/mines.des +++ b/dat/mines.des @@ -193,44 +193,44 @@ ROOM: "ordinary" , lit, (3,3), (center,center), (31,15) { FOUNTAIN: (17, 5) FOUNTAIN: (13, 8) -SUBROOM: "ordinary", random, (2,0), (2,2) { +[75%]: SUBROOM: "ordinary", random, (2,0), (2,2) { ROOMDOOR: false, closed, west, random } -SUBROOM: "ordinary", unlit, (5,0), (2,2) { +[75%]: SUBROOM: "ordinary", unlit, (5,0), (2,2) { ROOMDOOR: false, closed, south, random } -SUBROOM: "ordinary", random, (8,0), (2,2) { +[75%]: SUBROOM: "ordinary", random, (8,0), (2,2) { ROOMDOOR: false, closed, east, random } -SUBROOM: "ordinary", lit, (16,0), (2,2) { +[75%]: SUBROOM: "ordinary", lit, (16,0), (2,2) { ROOMDOOR: false, closed, west, random } -SUBROOM: "ordinary", unlit, (19,0), (2,2) { +[75%]: SUBROOM: "ordinary", unlit, (19,0), (2,2) { ROOMDOOR: false, closed, south, random } -SUBROOM: "ordinary", random, (22,0), (2,2) { +[75%]: SUBROOM: "ordinary", random, (22,0), (2,2) { ROOMDOOR: false, locked, south, random MONSTER: ('G', "gnome"), random } -SUBROOM: "ordinary", unlit, (25,0), (2,2) { +[75%]: SUBROOM: "ordinary", unlit, (25,0), (2,2) { ROOMDOOR: false, closed, east, random } -SUBROOM: "ordinary", lit, (2,5), (2,2) { +[75%]: SUBROOM: "ordinary", lit, (2,5), (2,2) { ROOMDOOR: false, closed, north, random } -SUBROOM: "ordinary", lit, (5,5), (2,2) { +[75%]: SUBROOM: "ordinary", lit, (5,5), (2,2) { ROOMDOOR: false, closed, south, random } -SUBROOM: "ordinary", random, (8,5), (2,2) { +[75%]: SUBROOM: "ordinary", random, (8,5), (2,2) { ROOMDOOR: false, locked, north, random MONSTER: ('G', "gnome"), random } @@ -251,7 +251,7 @@ SUBROOM: "candle shop", lit, (11,10), (4,3) { ROOMDOOR: false, closed, east, random } -SUBROOM: "ordinary", unlit, (7,10), (3,3) { +[75%]: SUBROOM: "ordinary", unlit, (7,10), (3,3) { ROOMDOOR: false, locked, north, random MONSTER: ('G', "gnome"), random } @@ -263,7 +263,7 @@ SUBROOM: "temple", lit, (19,5), (4,4) { MONSTER: ('G', "gnomish wizard"), random } -SUBROOM: "ordinary", lit, (18,10), (4,3) { +[75%]: SUBROOM: "ordinary", lit, (18,10), (4,3) { ROOMDOOR: false, locked, west, random MONSTER: ('G', "gnome lord"), random } @@ -534,6 +534,32 @@ MAP ----- ------ ------- --------------- ENDMAP +IF [75%] { + IF [50%] { + TERRAIN:line (25,8),(25,9), '|' + } ELSE { + TERRAIN:line (16,13),(17,13), '-' + } +} +IF [75%] { + IF [50%] { + TERRAIN:line (36,10),(36,11), '|' + } ELSE { + TERRAIN:line (32,15),(33,15), '-' + } +} +IF [50%] { + TERRAIN:fillrect (21,4,22,5), '.' + TERRAIN:line (14,9),(14,10), '|' +} +IF [50%] { + TERRAIN:(46,13), '|' + TERRAIN:line (43,5),(47,5), '-' + TERRAIN:line (42,6),(46,6), '.' + TERRAIN:line (46,7),(47,7), '.' +} +[50%]: TERRAIN:fillrect (69,11,71,11), '-' + STAIR:(01,01),up STAIR:(46,03),down FOUNTAIN:(50,09) @@ -693,19 +719,19 @@ ROOM: "ordinary" , lit, (3,3), (center,center), (30,15) { FOUNTAIN: (12, 07) FOUNTAIN: (11, 13) -SUBROOM: "ordinary", random, (2,2), (4,2) { +[75%]: SUBROOM: "ordinary", random, (2,2), (4,2) { ROOMDOOR: false, closed, south, random } -SUBROOM: "ordinary", random, (7,2), (2,2) { +[75%]: SUBROOM: "ordinary", random, (7,2), (2,2) { ROOMDOOR: false, closed, north, random } -SUBROOM: "ordinary", random, (7,5), (2,2) { +[75%]: SUBROOM: "ordinary", random, (7,5), (2,2) { ROOMDOOR: false, closed, south, random } -SUBROOM: "ordinary", lit, (10,2), (3,4) { +[75%]: SUBROOM: "ordinary", lit, (10,2), (3,4) { MONSTER:('G',"gnome"),random MONSTER:('Y',"monkey"),random MONSTER:('Y',"monkey"),random @@ -713,16 +739,16 @@ SUBROOM: "ordinary", lit, (10,2), (3,4) { ROOMDOOR: false, closed, south, random } -SUBROOM: "ordinary", random, (14,2), (4,2) { +[75%]: SUBROOM: "ordinary", random, (14,2), (4,2) { ROOMDOOR: false, closed, south, 0 MONSTER: 'n', random } -SUBROOM: "ordinary", random, (16,5), (2,2) { +[75%]: SUBROOM: "ordinary", random, (16,5), (2,2) { ROOMDOOR: false, closed, south, random } -SUBROOM: "ordinary", unlit, (19,2), (2,2) { +[75%]: SUBROOM: "ordinary", unlit, (19,2), (2,2) { ROOMDOOR: false, locked, east, random MONSTER: ('G',"gnome king"),random } @@ -731,7 +757,7 @@ SUBROOM: "food shop" [50%], lit, (19,5), (2,3) { ROOMDOOR: false, closed, south, random } -SUBROOM: "ordinary", random, (2,7), (2,2) { +[75%]: SUBROOM: "ordinary", random, (2,7), (2,2) { ROOMDOOR: false, closed, east, random } @@ -743,7 +769,7 @@ SUBROOM: "candle shop", lit, (5,10),(3,3) { ROOMDOOR: false, closed, north, random } -SUBROOM: "ordinary", random, (11,10), (2,2) { +[75%]: SUBROOM: "ordinary", random, (11,10), (2,2) { ROOMDOOR: false, locked, west, random MONSTER: 'G',random } @@ -752,11 +778,11 @@ SUBROOM: "shop" [60%], lit, (14,10), (2,3) { ROOMDOOR: false, closed, north, random } -SUBROOM: "ordinary", random, (17,11), (4,2) { +[75%]: SUBROOM: "ordinary", random, (17,11), (4,2) { ROOMDOOR: false, closed, north, random } -SUBROOM: "ordinary", random, (22,11), (2,2) { +[75%]: SUBROOM: "ordinary", random, (22,11), (2,2) { ROOMDOOR: false, closed, south, random SINK: (00,00) } @@ -953,6 +979,31 @@ MAP --------------------------------------------------------------------------- ENDMAP +IF [50%] { + TERRAIN:(55,14),'-' + TERRAIN:(56,14),'-' + TERRAIN:(61,15),'|' + TERRAIN:(52,5), 'S' + DOOR:locked, (52,5) +} +IF [50%] { + TERRAIN:(18,1), '|' + TERRAIN:rect (7,12, 8,13), '.' +} +IF [50%] { + TERRAIN:(49,4), '|' + TERRAIN:(21,5), '.' +} +IF [50%] { + IF [50%] { + TERRAIN:(22,1), '|' + } ELSE { + TERRAIN:(50,7), '-' + TERRAIN:(51,7), '-' + } +} + + # Dungeon Description FOUNTAIN:(14,13) REGION:(23,03,48,06),lit,"ordinary" From 816b562e999c9fac22eb82bfb20de671a08fb83a Mon Sep 17 00:00:00 2001 From: Pasi Kallinen Date: Sat, 2 May 2015 22:10:07 +0300 Subject: [PATCH 13/27] Replace some pools in Hea quest home with floor --- dat/Healer.des | 3 +++ 1 file changed, 3 insertions(+) diff --git a/dat/Healer.des b/dat/Healer.des index dcbb01b2a..e5e006d6b 100644 --- a/dat/Healer.des +++ b/dat/Healer.des @@ -35,6 +35,9 @@ PP...............PPPPP................................PPPP...PPPP........PPP PPP.............PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP....PPPPPP PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP ENDMAP + +REPLACE_TERRAIN:(01,01,74,18), 'P', '.', 10% + # Dungeon Description REGION:(00,00,75,19),lit,"ordinary" # Stairs From 5d116a892a71b3907c289bc468b5b0b59ef1eaa5 Mon Sep 17 00:00:00 2001 From: Pasi Kallinen Date: Sat, 2 May 2015 22:17:47 +0300 Subject: [PATCH 14/27] Minor variation for Earth and Astral planes --- dat/endgame.des | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/dat/endgame.des b/dat/endgame.des index 4f2cbd9de..8cf84ed75 100644 --- a/dat/endgame.des +++ b/dat/endgame.des @@ -45,6 +45,9 @@ MAP .. ENDMAP + +REPLACE_TERRAIN:(0,0,75,19), ' ', ('.', unlit), 5% + # Since there are no stairs, this forces the hero's initial placement TELEPORT_REGION:(69,16,69,16),(0,0,0,0) PORTAL:(0,0,75,19),(65,13,75,19),"air" @@ -503,6 +506,19 @@ MAP |...............| ----------------- ENDMAP + +IF [75%] { + TERRAIN:fillrect (17,14, 30,18),'.' + TERRAIN:fillrect (44,14, 57,18),'.' + WALLIFY + + $hall = selection:floodfill(37,18) + LOOP [6 + 3d4] { + MONSTER:('A',"Angel"),rndcoord($hall),noalign,hostile + [50%]: MONSTER:random,rndcoord($hall),hostile + } +} + # Rider locations $place = { (23,9),(37,14),(51,9) } SHUFFLE: $place From 862c78530b4c06215ebdb5bf6a0d131c060dfa27 Mon Sep 17 00:00:00 2001 From: Pasi Kallinen Date: Sat, 2 May 2015 23:04:13 +0300 Subject: [PATCH 15/27] More variations for bigrm-1 --- dat/bigroom.des | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/dat/bigroom.des b/dat/bigroom.des index 83a852e96..d8fd0a319 100644 --- a/dat/bigroom.des +++ b/dat/bigroom.des @@ -30,6 +30,32 @@ MAP |.........................................................................| --------------------------------------------------------------------------- ENDMAP + +$terrains = TERRAIN:{'-', 'F', 'L', 'T', 'C'} +SHUFFLE:$terrains + +[50%]: SWITCH [ 4 ] { + CASE 0: + TERRAIN:line (10,8),(65, 8), $terrains[0] + BREAK + CASE 1: + TERRAIN:line (15,4),(15, 13), $terrains[0] + TERRAIN:line (59,4),(59, 13), $terrains[0] + BREAK + CASE 2: + TERRAIN:line (10,8),(38, 8), $terrains[0] + TERRAIN:line (37,8),(65, 8), $terrains[0] + TERRAIN:line (37,3),(37, 8), $terrains[0] + TERRAIN:line (37,8),(37,14), $terrains[0] + BREAK + CASE 3: + TERRAIN:rect (4,4,70,13), $terrains[0] + TERRAIN:line (25, 4),(50, 4), '.' + TERRAIN:line (25,13),(50,13), '.' + BREAK + DEFAULT: +} + # Dungeon Description REGION:(01,01,73,16),lit,"ordinary" # Stairs From b950031f55be399f5b8a565db4efcfad98e54dd4 Mon Sep 17 00:00:00 2001 From: Pasi Kallinen Date: Sat, 2 May 2015 23:19:38 +0300 Subject: [PATCH 16/27] Occasionally fog maze bigrm is not made of fog --- dat/bigroom.des | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/dat/bigroom.des b/dat/bigroom.des index d8fd0a319..62937e8e7 100644 --- a/dat/bigroom.des +++ b/dat/bigroom.des @@ -680,6 +680,15 @@ MAP ....................................................................... ENDMAP +IF [33%] { + # occasionally it's not a fog maze + $terrain = TERRAIN:{ 'L', '}', 'T', '-', 'F' } + SHUFFLE:$terrain + # break it up a bit + REPLACE_TERRAIN:(0,0,70,18),'C', '.', 5% + REPLACE_TERRAIN:(0,0,70,18),'C', $terrain[0], 100% +} + REGION:(00,00,70,18),lit,"ordinary" # when falling down on this level, never end up in the fog maze From d44e55b9a2c9e7c5ce3479161f30d45f4ad3d333 Mon Sep 17 00:00:00 2001 From: Pasi Kallinen Date: Sat, 2 May 2015 23:23:04 +0300 Subject: [PATCH 17/27] Make the slanted bigrm have more variance --- dat/bigroom.des | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/dat/bigroom.des b/dat/bigroom.des index 62937e8e7..381e95e85 100644 --- a/dat/bigroom.des +++ b/dat/bigroom.des @@ -587,6 +587,12 @@ MAP ---------------------------------------------- ENDMAP +IF [40%] { + $terrain = TERRAIN:{ 'L', '}', 'T', '.', '-', 'C' } + SHUFFLE:$terrain + REPLACE_TERRAIN:(0,0,74,17),'F', $terrain[0], 100% +} + REGION:(01,01,73,16),lit,"ordinary" STAIR:random,up From be643386c5387cee88308e365f174e285c867335 Mon Sep 17 00:00:00 2001 From: nhmall Date: Sat, 2 May 2015 18:04:20 -0400 Subject: [PATCH 18/27] permanent wiz_identify correction wiz_identify (^I) is supposed to bring up the inventory list with the items identified, in contrast to the regular (I) inventory, but only for that inventory display. It is intended that if you then hit ^I again while at that wiz_identify inventory menu, you'll trigger permanent identification of itemsand any other key is supposed to leave them as they were. In tty however, was doing the same thing as the second ^I, and permanently identifying everything. So, for those that like to through menus (like me) this makes it work as originally intended and requires a deliberate second ^I at the menu to permanently identify. (It might also allow trigger permanent ID if you hit underscore, but nobody "underscores" through menus, so that's ok.) --- src/invent.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/invent.c b/src/invent.c index 1a2a3b2dd..3d9ac0843 100644 --- a/src/invent.c +++ b/src/invent.c @@ -1912,9 +1912,8 @@ long* out_cnt; any.a_char = -1; /* wiz_identify stuffed the wiz_identify cmd character into iflags.override_ID */ - Sprintf(prompt, "Debug Identify (%s to permanently identify)", - visctrl(iflags.override_ID)); - add_menu(win, NO_GLYPH, &any,' ', iflags.override_ID, ATR_NONE, + Sprintf(prompt, "Debug Identify (%s to permanently identify)",visctrl(iflags.override_ID)); + add_menu(win, NO_GLYPH, &any,'.', iflags.override_ID, ATR_NONE, prompt, MENU_UNSELECTED); } nextclass: From 02de9d1313365ad09441c106402ad141c48f0bb1 Mon Sep 17 00:00:00 2001 From: nhmall Date: Sat, 2 May 2015 18:16:11 -0400 Subject: [PATCH 19/27] commit the latest update for wiz_identify git add mistake on my part --- src/invent.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/invent.c b/src/invent.c index 3d9ac0843..a23c92166 100644 --- a/src/invent.c +++ b/src/invent.c @@ -1912,8 +1912,9 @@ long* out_cnt; any.a_char = -1; /* wiz_identify stuffed the wiz_identify cmd character into iflags.override_ID */ - Sprintf(prompt, "Debug Identify (%s to permanently identify)",visctrl(iflags.override_ID)); - add_menu(win, NO_GLYPH, &any,'.', iflags.override_ID, ATR_NONE, + Sprintf(prompt, "Debug Identify (%s to permanently identify)", + visctrl(iflags.override_ID)); + add_menu(win, NO_GLYPH, &any,'_', iflags.override_ID, ATR_NONE, prompt, MENU_UNSELECTED); } nextclass: From 4283bbde646e444c5eadae3f8b6772eb3de8f875 Mon Sep 17 00:00:00 2001 From: PatR Date: Sat, 2 May 2015 19:44:35 -0700 Subject: [PATCH 20/27] tiletxt lint Use 'const' for string literals when compiling win/share/tilemap.c with '-DTILETEXT' to generate util/tiletxt.o. --- win/share/tilemap.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/win/share/tilemap.c b/win/share/tilemap.c index 5e05a1888..209088929 100644 --- a/win/share/tilemap.c +++ b/win/share/tilemap.c @@ -1,4 +1,4 @@ -/* NetHack 3.5 tilemap.c $NHDT-Date: 1429464668 2015/04/19 17:31:08 $ $NHDT-Branch: master $:$NHDT-Revision: 1.18 $ */ +/* NetHack 3.5 tilemap.c $NHDT-Date: 1430621065 2015/05/03 02:44:25 $ $NHDT-Branch: master $:$NHDT-Revision: 1.19 $ */ /* SCCS Id: @(#)tilemap.c 3.5 2000/06/04 */ /* NetHack may be freely redistributed. See license for details. */ @@ -177,7 +177,7 @@ int set, entry; i = entry - tilenum; if (i < (MAXEXPCHARS * EXPL_MAX)) { if (set == OTH_GLYPH) { - static char *explosion_types[] = { /* hack.h */ + static const char *explosion_types[] = { /* hack.h */ "dark", "noxious", "muddy", "wet", "magical", "fiery", "frosty" }; From 15a5fe8d766bd68b5596a5488fe5184fb2934361 Mon Sep 17 00:00:00 2001 From: Pasi Kallinen Date: Sun, 3 May 2015 08:56:39 +0300 Subject: [PATCH 21/27] Barb quest home has a forest --- dat/Barb.des | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/dat/Barb.des b/dat/Barb.des index ea8ab9738..0f94f5668 100644 --- a/dat/Barb.des +++ b/dat/Barb.des @@ -35,6 +35,15 @@ MAP ....................................PP...PP................................. ....................................PP....PP................................ ENDMAP + +# the forest beyond the river +REPLACE_TERRAIN:(37,0,59,19),'.','T', 5% +REPLACE_TERRAIN:(60,0,64,19),'.','T', 10% +REPLACE_TERRAIN:(65,0,75,19),'.','T', 20% +# guarantee a path and free spot for the portal +TERRAIN:(randline (37,7),(62,02),7), '.' +TERRAIN:(62,02),'.' + # Dungeon Description REGION:(00,00,75,19),lit,"ordinary" REGION:(09,05,11,05),unlit,"ordinary" From be60ad6676047b6de800332b0e17bd8de65c6167 Mon Sep 17 00:00:00 2001 From: Pasi Kallinen Date: Sun, 3 May 2015 10:31:24 +0300 Subject: [PATCH 22/27] Randomize secret door locations ... in the Wizard quest locate level and Rodney tower entrance --- dat/Wizard.des | 40 ++++++++++++++++++++++++---------------- dat/yendor.des | 7 ++++--- 2 files changed, 28 insertions(+), 19 deletions(-) diff --git a/dat/Wizard.des b/dat/Wizard.des index 1b4ed5d86..faf3827d8 100644 --- a/dat/Wizard.des +++ b/dat/Wizard.des @@ -115,25 +115,25 @@ FLAGS: hardfloor GEOMETRY:center,center MAP ............. ....................................................... -.............. .............}}}}}}}.}}}}}}}}}}}}}}}}}}}.}}}}}}}....... +.............. .............}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}....... .............. ..............}.................................}....... -.............. ..............}.---------S---------------------.}....... +.............. ..............}.-------------------------------.}....... ............... .........C....}.|.............................|.}....... ............... ..........C....}.|.---------------------------.|.}....... -............... .........CCC.....|.|.........................|.|......... -................ ....C....CCC...}.|.|.---S-------------------.|.|.}....... +............... .........CCC...}.|.|.........................|.|.}....... +................ ....C....CCC...}.|.|.-----------------------.|.|.}....... .......C..C..... .....C....CCC...}.|.|.|......+.......+......|.|.|.}....... .............C..CC.....C....CCC...}.|.|.|......|-------|......|.|.|.}....... -................ ....C....CCC...}.|.|.|......|.......S......|.|.|.}....... +................ ....C....CCC...}.|.|.|......|.......|......|.|.|.}....... ......C..C..... ....C....CCC...}.|.|.|......|-------|......|.|.|.}....... ............C.. ...C....CCC...}.|.|.|......+.......+......|.|.|.}....... ........C...... ....C....CCC...}.|.|.-----------------------.|.|.}....... -....C......C... ........CCC.....|.|.........................|.|......... -......C..C.... .........C....}.|.--------------------S------.|.}....... +....C......C... ........CCC...}.|.|.........................|.|.}....... +......C..C.... .........C....}.|.---------------------------.|.}....... .............. .........C....}.|.............................|.}....... ............. ..............}.-------------------------------.}....... ............. .............}.................................}....... -............. .............}}}}}}}.}}}}}}}}}}}}}}}}}}}.}}}}}}}....... +............. .............}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}....... ............. ....................................................... ENDMAP @@ -143,18 +143,26 @@ REPLACE_TERRAIN:(34,1,68,19), '}', '.', 2% # Dungeon Description REGION:(00,00,75,20),lit,"ordinary" -REGION:(37,04,65,16),unlit,"ordinary" -REGION:(41,08,46,12),lit,"ordinary" -REGION:(56,08,61,12),lit,"ordinary" +REGION:(37,04,65,16),unlit,"ordinary",filled,irregular { + ROOMDOOR:true,closed,north|south|west|east,random +} +REGION:(39,06,63,14),unlit,"ordinary",filled,irregular { + ROOMDOOR:true,closed,north|south|west|east,random +} + +REGION:(41,08,46,12),lit,"ordinary",filled,irregular { + ROOMDOOR:true,closed,north|south|west,random +} +REGION:(56,08,61,12),lit,"ordinary",filled,irregular { + ROOMDOOR:true,closed,north|south|east,random +} REGION:(48,08,54,08),unlit,"ordinary" REGION:(48,12,54,12),unlit,"ordinary" -REGION:(48,10,54,10),unlit,"ordinary" +REGION:(48,10,54,10),unlit,"ordinary",filled,irregular { + ROOMDOOR:true,closed,north|south|west|east,random +} # Doors -DOOR:locked,(45,03) -DOOR:locked,(43,07) -DOOR:locked,(58,15) -DOOR:locked,(55,10) DOOR:locked,(55,08) DOOR:locked,(55,12) DOOR:locked,(47,08) diff --git a/dat/yendor.des b/dat/yendor.des index dcb77c986..5dcc0baf8 100644 --- a/dat/yendor.des +++ b/dat/yendor.des @@ -162,7 +162,7 @@ MAP |..---|.}--.--}.|..|.......|. |.....|.}}---}}.|..|.......|. |.....S.}}}}}}}.|..|.......|. -|.....|.........|..S.......|. +|.....|.........|..|.......|. ----------------------------. ENDMAP STAIR:levregion(01,00,79,20),(0,0,28,12),up @@ -175,9 +175,10 @@ REGION:(07,03,15,11),unlit,"morgue",unfilled REGION:(17,06,18,11),unlit,"beehive" # make the entry chamber a real room; it affects monster arrival; # `unfilled' is a kludge to force an ordinary room to remain a room -REGION:(20,06,26,11),unlit,"ordinary",unfilled +REGION:(20,06,26,11),unlit,"ordinary",unfilled { + ROOMDOOR:true, closed, north|west, random +} DOOR:closed,(18,05) -DOOR:closed,(19,11) LADDER:(11,07),up # Non diggable walls # Walls inside the moat stay diggable From 23a671147f6aba3f4e00a04e73f71d8121dc128c Mon Sep 17 00:00:00 2001 From: PatR Date: Sun, 3 May 2015 00:47:10 -0700 Subject: [PATCH 23/27] tiles-related build stuff * Add missing entry for include/tile.h to (top)/Files; also add new entry for generated file util/tiletxt.c (Unix only); * Add several missing entries for tile utility programs that can be built by sys/unix/Makefile.utl to util/.gitignore; * Update sys/unix/Makefile.utl to build 'tilemap' differently so that it won't leave behind an unwanted subdirectory tree under OSX: util/tilemap.dSYM/ util/tilemap.dSYM/Contents/ util/tilemap.dSYM/Contents/Info.plist util/tilemap.dSYM/Contents/Resources/ util/tilemap.dSYM/Contents/Resources/DWARF/ util/tilemap.dSYM/Contents/Resources/DWARF/tilemap It now generates util/tiletxt.c on the fly, to be compiled into tiletxt.o, so that tilemap.c can be compiled in the ordinary manner and tilemap.o can be kept around for dependency checking. (Creating real source file win/share/tiletxt.c would be a little bit cleaner, but it's effectively two lines long so seems silly to be in the source distribution.) I looked to see whether I could find a linker or compiler option to suppress that stuff but failed. I'm sure something of the sort must exist but didn't pursue it. Someday I might actually learn about how OSX works.... --- Files | 4 ++++ sys/unix/Makefile.utl | 27 ++++++++++++++++++++------- util/.gitignore | 20 +++++++++++++------- 3 files changed, 37 insertions(+), 14 deletions(-) diff --git a/Files b/Files index 658cfc3ee..be68c61ef 100644 --- a/Files +++ b/Files @@ -322,6 +322,8 @@ include: date.h onames.h pm.h vis_tab.h (files generated by yacc (or copied from sys/share) at compile time) dgn_comp.h lev_comp.h +(file for tiles support copied from win/share at compile time) +tile.h (files for win32 that are moved into include at compile time) win32api.h @@ -342,6 +344,8 @@ nethack.ico util: (files generated by lex and yacc (or copied from sys/share) at compile time) dgn_lex.c dgn_yacc.c lev_lex.c lev_yacc.c +(file generated for unix at compile time if various tiles utilities are built) +tiletxt.c (files generated for win32 at compile time) uudecode.exe diff --git a/sys/unix/Makefile.utl b/sys/unix/Makefile.utl index e1c677c2f..f73c94400 100644 --- a/sys/unix/Makefile.utl +++ b/sys/unix/Makefile.utl @@ -1,5 +1,5 @@ # Makefile for NetHack's utility programs. -# NetHack 3.5 Makefile.utl $NHDT-Date$ $NHDT-Branch$:$NHDT-Revision$ +# NetHack 3.5 Makefile.utl $NHDT-Date: 1430639195 2015/05/03 07:46:35 $ $NHDT-Branch: master $:$NHDT-Revision: 1.19 $ # NetHack 3.5 Makefile.utl $Date: 2012/01/10 17:47:30 $ $Revision: 1.18 $ # Root of source tree: @@ -325,8 +325,13 @@ xpm2img.ttp: xpm2img.o bitmfile.o tile2beos: tile2beos.o $(TEXT_IO) $(CC) $(LFLAGS) -o tile2beos tile2beos.o $(TEXT_IO) -lbe -tilemap: ../win/share/tilemap.c $(HACK_H) - $(CC) $(CFLAGS) $(LFLAGS) -o tilemap ../win/share/tilemap.c $(LIBS) +#--compiling and linking in one step leaves extra debugging files (in their +# own subdirectories!) on OSX; compile and link separately to suppress +# that without mucking about with extra OS-specific CFLAGS and/or LFLAGS +#tilemap: ../win/share/tilemap.c $(HACK_H) +# $(CC) $(CFLAGS) $(LFLAGS) -o tilemap ../win/share/tilemap.c $(LIBS) +tilemap: tilemap.o + $(CC) $(LFLAGS) -o tilemap tilemap.o $(LIBS) ../src/tile.c: tilemap ./tilemap @@ -334,9 +339,17 @@ tilemap: ../win/share/tilemap.c $(HACK_H) cp ../win/share/tile.h ../include/tile.h tiletext.o: ../win/share/tiletext.c $(CONFIG_H) ../include/tile.h $(CC) $(CFLAGS) -c ../win/share/tiletext.c -tiletxt.o: ../win/share/tilemap.c $(HACK_H) - $(CC) $(CFLAGS) -c -DTILETEXT ../win/share/tilemap.c - mv tilemap.o tiletxt.o +tiletxt.c: ./Makefile + echo '/* alternate compilation for tilemap.c to create tiletxt.o' > tiletxt.c + echo ' that does not rely on "cc -c -o tiletxt.o tilemap.c"' >> tiletxt.c + echo ' since many pre-POSIX compilers did not support that */' >> tiletxt.c + echo '#define TILETEXT' >> tiletxt.c + echo '#include "../win/share/tilemap.c"' >> tiletxt.c + echo '/*tiletxt.c*/' >> tiletxt.c +tiletxt.o: tiletxt.c ../win/share/tilemap.c $(HACK_H) + $(CC) $(CFLAGS) -c tiletxt.c +tilemap.o: ../win/share/tilemap.c $(HACK_H) + $(CC) $(CFLAGS) -c ../win/share/tilemap.c gifread.o: ../win/share/gifread.c $(CONFIG_H) ../include/tile.h $(CC) $(CFLAGS) -c ../win/share/gifread.c @@ -402,7 +415,7 @@ clean: spotless: clean -rm -f lev_lex.c lev_yacc.c dgn_lex.c dgn_yacc.c -rm -f ../include/lev_comp.h ../include/dgn_comp.h - -rm -f ../include/tile.h + -rm -f ../include/tile.h tiletxt.c -rm -f makedefs lev_comp dgn_comp recover dlb -rm -f gif2txt txt2ppm tile2x11 tile2img.ttp xpm2img.ttp tilemap diff --git a/util/.gitignore b/util/.gitignore index 22139b7ab..6982f2d05 100644 --- a/util/.gitignore +++ b/util/.gitignore @@ -1,13 +1,19 @@ -dgn_yacc.c dgn_lex.c -makedefs -tilemap -dgn_comp +dgn_yacc.c lev_lex.c lev_yacc.c -tile2x11 +tiletxt.c +makedefs +dgn_comp lev_comp -tileedit -tile2bmp dlb recover +tilemap +tileedit +tile2x11 +tile2bmp +tile2beos +gif2txt +txt2ppm +tile2img.ttp +xpm2ppm.ttp From fc567b5ce36e871b8b3fa660d9ad339b65a95ffa Mon Sep 17 00:00:00 2001 From: PatR Date: Sun, 3 May 2015 01:03:24 -0700 Subject: [PATCH 24/27] tiles lint Several instances of "comparison between signed and unsigned". win/share/tiletext.c win/X11/tile2x11.c --- win/X11/tile2x11.c | 12 ++++++------ win/share/tiletext.c | 6 +++--- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/win/X11/tile2x11.c b/win/X11/tile2x11.c index ebfd3bd9b..52d6e2896 100644 --- a/win/X11/tile2x11.c +++ b/win/X11/tile2x11.c @@ -1,10 +1,10 @@ +/* $NHDT-Date: 1430640199 2015/05/03 08:03:19 $ $NHDT-Branch: master $:$NHDT-Revision: 1.3 $ */ +/* $Date: 2002/03/17 20:02:47 $ $Revision: 1.2 $ */ + /* * Convert the given input files into an output file that is expected * by nethack. * - * $NHDT-Date$ $NHDT-Branch$:$NHDT-Revision$ - * $Date: 2002/03/17 20:02:47 $ $Revision: 1.2 $ - * * Assumptions: * + Two dimensional byte arrays are in row order and are not padded * between rows (x11_colormap[][]). @@ -28,7 +28,7 @@ static unsigned char pix_to_colormap(pix) pixel pix; { - int i; + unsigned i; for (i = 0; i < header.ncolors; i++) { if (pix.r == ColorMap[CM_RED][i] && @@ -80,9 +80,9 @@ convert_tiles(tb_ptr, total) static void merge_text_colormap() { - int i, j; + unsigned i, j; - for (i = 0; i < colorsinmap; i++) { + for (i = 0; i < (unsigned)colorsinmap; i++) { for (j = 0; j < header.ncolors; j++) if (x11_colormap[j][CM_RED] == ColorMap[CM_RED][i] && x11_colormap[j][CM_GREEN] == ColorMap[CM_GREEN][i] && diff --git a/win/share/tiletext.c b/win/share/tiletext.c index ea78eb02f..f5489d4fe 100644 --- a/win/share/tiletext.c +++ b/win/share/tiletext.c @@ -1,4 +1,4 @@ -/* NetHack 3.5 tiletext.c $NHDT-Date: 1429484196 2015/04/19 22:56:36 $ $NHDT-Branch: master $:$NHDT-Revision: 1.6 $ */ +/* NetHack 3.5 tiletext.c $NHDT-Date: 1430640200 2015/05/03 08:03:20 $ $NHDT-Branch: master $:$NHDT-Revision: 1.7 $ */ /* NetHack 3.5 tiletext.c $Date: 2009/05/06 10:59:03 $ $Revision: 1.4 $ */ /* SCCS Id: @(#)tiletext.c 3.5 1999/10/24 */ /* NetHack may be freely redistributed. See license for details. */ @@ -286,8 +286,8 @@ const char *type; /* Fill placeholder with noise */ if ( !placeholder_init ) { placeholder_init++; - for ( i=0; i Date: Sun, 3 May 2015 01:22:25 -0700 Subject: [PATCH 25/27] fix "gold wield inconsistency" 'w$' reported "you can't wield gold" but 'w*$', choosing from inventory and picking gold, let you wield gold. The old code checked whether gold had been picked before checking whether '?' or '*' had been picked to request selection from inventory. This wasn't an issue with 3.4.3's !GOLDINV configuration (but probably was for anyone who explicitly switched to GOLDINV) because getobj()'s callers only inserted gold into inventory when they intended to accept it as a valid choice. Fix is just to swap two adjacent 'if' blocks in getobj() so that '*' is processed before the test of whether '$' has been chosen. Most of the diff is indentation and other minor reformatting. --- src/invent.c | 63 ++++++++++++++++++++++++++-------------------------- 1 file changed, 32 insertions(+), 31 deletions(-) diff --git a/src/invent.c b/src/invent.c index a23c92166..7b3861e62 100644 --- a/src/invent.c +++ b/src/invent.c @@ -1111,7 +1111,30 @@ register const char *let,*word; } return(allownone ? &zeroobj : (struct obj *) 0); } - if(ilet == def_oc_syms[COIN_CLASS].sym) { + /* since gold is now kept in inventory, we need to do processing for + select-from-invent before checking whether gold has been picked */ + if (ilet == '?' || ilet == '*') { + char *allowed_choices = (ilet == '?') ? lets : (char *)0; + long ctmp = 0; + + if (ilet == '?' && !*lets && *altlets) + allowed_choices = altlets; + ilet = display_pickinv(allowed_choices, TRUE, + allowcnt ? &ctmp : (long *)0); + if (!ilet) continue; + if (allowcnt && ctmp >= 0) { + cnt = ctmp; + if (!cnt) prezero = TRUE; + allowcnt = 2; + } + if (ilet == '\033') { + if (flags.verbose) + pline1(Never_mind); + return (struct obj *)0; + } + /* they typed a letter (not a space) at the prompt */ + } + if (ilet == def_oc_syms[COIN_CLASS].sym) { if (!usegold) { You("cannot %s gold.", word); return(struct obj *)0; @@ -1124,43 +1147,21 @@ register const char *let,*word; */ if (allowcnt == 2 && cnt <= 0) { if (cnt < 0 || !prezero) - pline_The( - "LRS would be very interested to know you have that much."); + pline_The( + "LRS would be very interested to know you have that much."); return (struct obj *)0; } - } - if(ilet == '?' || ilet == '*') { - char *allowed_choices = (ilet == '?') ? lets : (char *)0; - long ctmp = 0; - - if (ilet == '?' && !*lets && *altlets) - allowed_choices = altlets; - ilet = display_pickinv(allowed_choices, TRUE, - allowcnt ? &ctmp : (long *)0); - if(!ilet) continue; - if (allowcnt && ctmp >= 0) { - cnt = ctmp; - if (!cnt) prezero = TRUE; - allowcnt = 2; - } - if(ilet == '\033') { - if(flags.verbose) - pline1(Never_mind); - return((struct obj *)0); - } - /* they typed a letter (not a space) at the prompt */ - } - if(allowcnt == 2 && !strcmp(word,"throw")) { + if (allowcnt == 2 && !strcmp(word,"throw")) { /* permit counts for throwing gold, but don't accept * counts for other things since the throw code will * split off a single item anyway */ if (ilet != def_oc_syms[COIN_CLASS].sym) - allowcnt = 1; - if(cnt == 0 && prezero) return((struct obj *)0); - if(cnt > 1) { - You("can only throw one item at a time."); - continue; + allowcnt = 1; + if (cnt == 0 && prezero) return (struct obj *)0; + if (cnt > 1) { + You("can only throw one item at a time."); + continue; } } context.botl = 1; /* May have changed the amount of money */ From 505f6246b5814df473e9942d33de4e6a4f13680a Mon Sep 17 00:00:00 2001 From: PatR Date: Sun, 3 May 2015 16:54:53 -0700 Subject: [PATCH 26/27] fix "deleting worn object" impossibility Migrating objects overload obj->owornmask with a destination code, so rot_corpse needs to clear that before deleting corpses. (Buried objects don't touch owornmask, so rot_organic, which does the actual object deletion, shouldn't need any similar change.) The corpses with owornmask 3 that have been observed recently were slated to arrive on the up stairs, so presumeably fell down the down stairs of the current level and rotted before the hero went down. Put plainly, it was the [post-3.4.3] impossible() check which was in error, not the active game data. --- src/dig.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/dig.c b/src/dig.c index 9f031f1c5..d356668b2 100644 --- a/src/dig.c +++ b/src/dig.c @@ -1,4 +1,4 @@ -/* NetHack 3.5 dig.c $NHDT-Date: 1426465434 2015/03/16 00:23:54 $ $NHDT-Branch: debug $:$NHDT-Revision: 1.73 $ */ +/* NetHack 3.5 dig.c $NHDT-Date: 1430697288 2015/05/03 23:54:48 $ $NHDT-Branch: master $:$NHDT-Revision: 1.86 $ */ /* NetHack 3.5 dig.c $Date: 2012/02/16 03:01:37 $ $Revision: 1.67 $ */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ @@ -1862,6 +1862,10 @@ long timeout; /* unused */ setmnotwielded(obj->ocarry,obj); MON_NOWEP(obj->ocarry); } + } else if (obj->where == OBJ_MIGRATING) { + /* clear destination flag so that obfree()'s check for + freeing a worn object doesn't get a false hit */ + obj->owornmask = 0L; } rot_organic(arg, timeout); if (on_floor) { From 3fa8ff9d62bbc1d443a8d300db0a032ea64ad588 Mon Sep 17 00:00:00 2001 From: PatR Date: Sun, 3 May 2015 16:57:09 -0700 Subject: [PATCH 27/27] owornmask sanity_check fix and enhancement Thinko fix: sanity checking for owornmask was mis-treating OBJ_MIGRATING as OBJ_MINVENT of migrating monsters rather than as unattended objects and would have had problems similar to obfree's inappropriate impossible check. Sanity checking for objects worn in invalid slots (amulet worn in a ring slot and so forth) is extended to items worn by monsters. Also add a check for wielded coins since the loophole that let them become wielded has been closed. --- src/mkobj.c | 31 +++++++++++++++++++++++++------ 1 file changed, 25 insertions(+), 6 deletions(-) diff --git a/src/mkobj.c b/src/mkobj.c index 899581128..e8447ee2e 100644 --- a/src/mkobj.c +++ b/src/mkobj.c @@ -1,4 +1,4 @@ -/* NetHack 3.5 mkobj.c $NHDT-Date: 1430559882 2015/05/02 09:44:42 $ $NHDT-Branch: master $:$NHDT-Revision: 1.96 $ */ +/* NetHack 3.5 mkobj.c $NHDT-Date: 1430697424 2015/05/03 23:57:04 $ $NHDT-Branch: master $:$NHDT-Revision: 1.97 $ */ /* NetHack 3.5 mkobj.c $Date: 2012/03/10 02:49:08 $ $Revision: 1.70 $ */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ @@ -2032,9 +2032,12 @@ const char *mesg; switch (obj->where) { case OBJ_INVENT: case OBJ_MINVENT: - case OBJ_MIGRATING: sanity_check_worn(obj); break; + case OBJ_MIGRATING: + /* migrating objects overload the owornmask field + with a destination code; skip attempt to check it */ + break; case OBJ_FLOOR: /* note: ball and chain can also be OBJ_FREE, but not across turns so this sanity check shouldn't encounter that */ @@ -2180,6 +2183,7 @@ struct obj *obj; /* [W_ART,W_ARTI are property bits for items which aren't worn] */ }; char maskbuf[60]; + const char *what; unsigned long owornmask, allmask = 0L; int i, n = 0; @@ -2212,8 +2216,7 @@ struct obj *obj; insane_object(obj, ofmt0, maskbuf, (struct monst *)0); } if (n == 1 && (carried(obj) || (owornmask & (W_BALL|W_CHAIN)) != 0L)) { - const char *what = 0; - + what = 0; /* verify that obj in hero's invent (or ball/chain elsewhere) with owornmask of W_foo is the object pointed to by ufoo */ switch (owornmask) { @@ -2257,11 +2260,24 @@ struct obj *obj; Sprintf(maskbuf, "worn mask 0x%08lx != %s", obj->owornmask, what); insane_object(obj, ofmt0, maskbuf, (struct monst *)0); } + } + if (n == 1 && (carried(obj) || (owornmask & (W_BALL|W_CHAIN)) != 0L + || mcarried(obj))) { /* check for items worn in invalid slots; practically anything can - be wielded/alt-wielded/quivered, so skip obj if it's one of those */ + be wielded/alt-wielded/quivered, so tests on those are limited */ what = 0; if (owornmask & W_ARMOR) { if (obj->oclass != ARMOR_CLASS) what = "armor"; + } else if (owornmask & (W_WEP|W_SWAPWEP|W_QUIVER)) { + /* monsters don't maintain alternate weapon or quiver */ + if (mcarried(obj) && (owornmask & (W_SWAPWEP|W_QUIVER)) != 0L) + what = (owornmask & W_SWAPWEP) != 0L ? "monst alt weapon?" + : "monst quiver?"; + /* hero can quiver gold but not wield it (hence not alt-wield + it either); also catches monster wielding gold */ + else if (obj->oclass == COIN_CLASS + && (owornmask & (W_WEP|W_SWAPWEP)) != 0L) + what = (owornmask & W_WEP) != 0L ? "weapon" : "alt weapon"; } else if (owornmask & W_AMUL) { if (obj->oclass != AMULET_CLASS) what = "amulet"; } else if (owornmask & W_RING) { @@ -2274,16 +2290,19 @@ struct obj *obj; if (obj->oclass != BALL_CLASS) what = "chained ball"; } else if (owornmask & W_CHAIN) { if (obj->oclass != CHAIN_CLASS) what = "chain"; + } else if (owornmask & W_SADDLE) { + if (obj->otyp != SADDLE) what = "saddle"; } if (what) { char oclassname[30]; + struct monst *mon = mcarried(obj) ? obj->ocarry : 0; /* if we've found a potion worn in the amulet slot, this yields "worn (potion amulet)" */ Strcpy(oclassname, def_oc_syms[(uchar)obj->oclass].name); Sprintf(maskbuf, "worn (%s %s)", makesingular(oclassname), what); - insane_object(obj, ofmt0, maskbuf, (struct monst *)0); + insane_object(obj, ofmt0, maskbuf, mon); } } #else /* not (BETA || DEBUG) */