Path: utzoo!utgpu!jarvis.csri.toronto.edu!mailrus!cs.utexas.edu!uunet!zephyr.ens.tek.com!tekgen!tekred!saab!billr
From: billr@saab.CNA.TEK.COM (Bill Randle)
Newsgroups: comp.sources.games
Subject: v08i040: NetHack3 - display oriented dungeons & dragons (Ver. 3.0), Patch4d
Message-ID: <4630@tekred.CNA.TEK.COM>
Date: 29 Sep 89 21:10:03 GMT
Sender: nobody@tekred.CNA.TEK.COM
Lines: 2046
Approved: billr@saab.CNA.TEK.COM
Submitted-by: Izchak Miller
Posting-number: Volume 8, Issue 40
Archive-name: NetHack3/Patch4d
Patch-To: NetHack3: Volume 7, Issue 56-93
#! /bin/sh
# This is a shell archive. Remove anything before this line, then unpack
# it by saving it into a file and typing "sh file". To overwrite existing
# files, type "sh file -c". You can also feed this as standard input via
# unshar, or by typing "sh 'patches04d' <<'END_OF_FILE'
X*** src/Old/polyself.c Wed Sep 27 12:09:55 1989
X--- src/polyself.c Mon Sep 25 21:35:23 1989
X***************
X*** 102,109 ****
X--- 102,115 ----
X goto newname;
X }
X (void)strncpy(plname, buf, sizeof(plname)-1);
X+ #ifdef VMS
X+ Sprintf(SAVEF, "[.save]%d%s", getuid(), plname);
X+ regularize(SAVEF+7);
X+ Strcat(SAVEF, ";1");
X+ #else
X Sprintf(SAVEF, "save/%d%s", getuid(), plname);
X regularize(SAVEF+5); /* avoid . or / in name */
X+ #endif
X #ifdef WIZARD
X }
X #endif
X***************
X*** 123,129 ****
X int mntmp = -1;
X int tries=0;
X boolean draconian = (uarm && uarm->otyp==DRAGON_SCALE_MAIL &&
X! uarm->corpsenm >= PM_GREY_DRAGON &&
X uarm->corpsenm <= PM_YELLOW_DRAGON);
X boolean iswere = (u.ulycn > -1 || is_were(uasmon));
X boolean isvamp = (u.usym == S_VAMPIRE || u.umonnum == PM_VAMPIRE_BAT);
X--- 129,135 ----
X int mntmp = -1;
X int tries=0;
X boolean draconian = (uarm && uarm->otyp==DRAGON_SCALE_MAIL &&
X! uarm->corpsenm >= PM_GRAY_DRAGON &&
X uarm->corpsenm <= PM_YELLOW_DRAGON);
X boolean iswere = (u.ulycn > -1 || is_were(uasmon));
X boolean isvamp = (u.usym == S_VAMPIRE || u.umonnum == PM_VAMPIRE_BAT);
X***************
X*** 222,230 ****
X--- 228,245 ----
X u.acurr = u.macurr;
X u.amax = u.mamax;
X }
X+ tmp = u.umonnum;
X u.umonnum = mntmp;
X set_uasmon();
X u.usym = mons[mntmp].mlet;
X+
X+ if (tmp != mntmp)
X+ You("turn into a%s %s!",
X+ index(vowels, *(mons[mntmp].mname)) ? "n" : "",
X+ mons[mntmp].mname);
X+ else
X+ You("feel like a new %s!", mons[mntmp].mname);
X+
X /* New stats for monster, to last only as long as polymorphed.
X * Currently only strength gets changed.
X */
X***************
X*** 238,244 ****
X Sick = 0;
X You("no longer feel sick.");
X }
X! if (u.usym == S_DRAGON && mntmp >= PM_GREY_DRAGON) u.mhmax = 80;
X #ifdef GOLEMS
X else if (is_golem(uasmon)) u.mhmax = golemhp(mntmp);
X #endif /* GOLEMS */
X--- 253,259 ----
X Sick = 0;
X You("no longer feel sick.");
X }
X! if (u.usym == S_DRAGON && mntmp >= PM_GRAY_DRAGON) u.mhmax = 80;
X #ifdef GOLEMS
X else if (is_golem(uasmon)) u.mhmax = golemhp(mntmp);
X #endif /* GOLEMS */
X***************
X*** 255,263 ****
X else u.mhmax = d(tmp, 8);
X }
X u.mh = u.mhmax;
X- You("turn into a%s %s!",
X- index(vowels, *(mons[mntmp].mname)) ? "n" : "",
X- mons[mntmp].mname);
X if (uskin && mntmp != uskin->corpsenm)
X skinback();
X break_armor();
X--- 270,275 ----
X***************
X*** 433,438 ****
X--- 445,451 ----
X
X if (!getdir(1)) return(0);
X otmp = mksobj(u.umonnum==PM_COBRA ? BLINDING_VENOM : ACID_VENOM, FALSE);
X+ otmp->spe = 1; /* to indicate it's yours */
X (void) throwit(otmp);
X return(1);
X }
X*** src/Old/potion.c Wed Sep 27 12:10:40 1989
X--- src/potion.c Mon Sep 25 21:30:15 1989
X***************
X*** 146,164 ****
X register struct obj *otmp;
X
X #ifdef FOUNTAINS
X!
X! /* Is there something to drink here, i.e., a fountain? */
X! if (IS_FOUNTAIN(levl[u.ux][u.uy].typ)) {
X! pline("Drink from the fountain? ");
X! if(yn() == 'y') {
X! (void) drinkfountain();
X! return(1);
X! }
X! }
X!
X! #endif /* FOUNTAINS /**/
X #ifdef SINKS
X! /* Now, check for kitchen sinks... */
X if (IS_SINK(levl[u.ux][u.uy].typ)) {
X pline("Drink from the sink? ");
X if (yn() == 'y') {
X--- 146,162 ----
X register struct obj *otmp;
X
X #ifdef FOUNTAINS
X! /* Is there a fountain to drink from here? */
X! if (IS_FOUNTAIN(levl[u.ux][u.uy].typ)) {
X! pline("Drink from the fountain? ");
X! if(yn() == 'y') {
X! (void) drinkfountain();
X! return 1;
X! }
X! }
X! #endif
X #ifdef SINKS
X! /* Or a kitchen sink? */
X if (IS_SINK(levl[u.ux][u.uy].typ)) {
X pline("Drink from the sink? ");
X if (yn() == 'y') {
X***************
X*** 168,174 ****
X }
X #endif
X
X- unkn = 0;
X otmp = getobj(beverages, "drink");
X if(!otmp) return(0);
X if(objects[otmp->otyp].oc_descr && !strcmp(objects[otmp->otyp].oc_descr, "smoky") && !rn2(13)) {
X--- 166,171 ----
X***************
X*** 190,196 ****
X {
X int retval;
X
X! nothing = 0;
X if((retval = peffects(otmp)) >= 0) return(retval);
X
X if(nothing) {
X--- 187,193 ----
X {
X int retval;
X
X! nothing = unkn = 0;
X if((retval = peffects(otmp)) >= 0) return(retval);
X
X if(nothing) {
X***************
X*** 807,814 ****
X if(!(obj = getobj("#", "dip")))
X return(0);
X #ifdef FOUNTAINS
X! /* Is there something to dip into here, i.e., a fountain? */
X! if (levl[u.ux][u.uy].typ == FOUNTAIN) {
X pline("Dip it into the fountain? ");
X if(yn() == 'y') {
X dipfountain(obj);
X--- 804,811 ----
X if(!(obj = getobj("#", "dip")))
X return(0);
X #ifdef FOUNTAINS
X! /* Is there a fountain to dip into here? */
X! if (IS_FOUNTAIN(levl[u.ux][u.uy].typ)) {
X pline("Dip it into the fountain? ");
X if(yn() == 'y') {
X dipfountain(obj);
X***************
X*** 959,965 ****
X char buf[BUFSZ];
X Strcpy(buf, xname(potion));
X pline("The %s form%s a coating on the %s.",
X! buf, (potion->quan==1) ? "s" : "", xname(obj));
X obj->opoisoned = 1;
X goto poof;
X } else if(obj->opoisoned &&
X--- 956,962 ----
X char buf[BUFSZ];
X Strcpy(buf, xname(potion));
X pline("The %s form%s a coating on the %s.",
X! buf, potion->quan==1 ? "s" : "", xname(obj));
X obj->opoisoned = 1;
X goto poof;
X } else if(obj->opoisoned &&
X*** src/Old/pray.c Wed Sep 27 12:11:32 1989
X--- src/pray.c Tue Sep 26 12:59:40 1989
X***************
X*** 38,62 ****
X 0,0,0,0
X };
X
X! #define TROUBLE_STONED 8
X! #define TROUBLE_STRANGLED 7
X! #define TROUBLE_SICK 6
X! #define TROUBLE_STARVING 5
X! #define TROUBLE_HIT 4
X #define TROUBLE_STUCK_IN_WALL 3
X #define TROUBLE_CURSED_BLINDFOLD 2
X #define TROUBLE_CURSED_LEVITATION 1
X
X! #define TROUBLE_LYCANTHROPE (-1)
X! #define TROUBLE_PUNISHED (-2)
X! #define TROUBLE_CURSED_ITEMS (-3)
X! #define TROUBLE_BLIND (-4)
X! #define TROUBLE_HUNGRY (-5)
X! #define TROUBLE_POISONED (-6)
X! #define TROUBLE_WOUNDED_LEGS (-7)
X! #define TROUBLE_STUNNED (-8)
X! #define TROUBLE_CONFUSED (-9)
X! #define TROUBLE_HALLUCINATION (-10)
X
X /* We could force rehumanize of polyselfed people, but we can't tell
X unintentional shape changes from the other kind. Oh well. */
X--- 38,62 ----
X 0,0,0,0
X };
X
X! #define TROUBLE_STONED 9
X! #define TROUBLE_STRANGLED 8
X! #define TROUBLE_SICK 7
X! #define TROUBLE_STARVING 6
X! #define TROUBLE_HIT 5
X! #define TROUBLE_LYCANTHROPE 4
X #define TROUBLE_STUCK_IN_WALL 3
X #define TROUBLE_CURSED_BLINDFOLD 2
X #define TROUBLE_CURSED_LEVITATION 1
X
X! #define TROUBLE_PUNISHED (-1)
X! #define TROUBLE_CURSED_ITEMS (-2)
X! #define TROUBLE_BLIND (-3)
X! #define TROUBLE_HUNGRY (-4)
X! #define TROUBLE_POISONED (-5)
X! #define TROUBLE_WOUNDED_LEGS (-6)
X! #define TROUBLE_STUNNED (-7)
X! #define TROUBLE_CONFUSED (-8)
X! #define TROUBLE_HALLUCINATION (-9)
X
X /* We could force rehumanize of polyselfed people, but we can't tell
X unintentional shape changes from the other kind. Oh well. */
X***************
X*** 102,107 ****
X--- 102,110 ----
X if (!isok(u.ux+i, u.uy+j) || IS_ROCK(levl[u.ux+i][u.uy+j].typ))
X count++;
X }
X+ #ifdef POLYSELF
X+ if(u.ulycn >= 0) return(TROUBLE_LYCANTHROPE);
X+ #endif
X if(count==8
X #ifdef POLYSELF
X && !passes_walls(uasmon)
X***************
X*** 113,121 ****
X return(TROUBLE_CURSED_LEVITATION);
X if(ublindf && ublindf->cursed) return(TROUBLE_CURSED_BLINDFOLD);
X
X- #ifdef POLYSELF
X- if(u.ulycn >= 0) return(TROUBLE_LYCANTHROPE);
X- #endif
X if(Punished) return(TROUBLE_PUNISHED);
X for(otmp=invent; otmp; otmp=otmp->nobj)
X if((otmp->otyp==LOADSTONE || otmp->otyp==LUCKSTONE) &&
X--- 116,121 ----
X***************
X*** 411,417 ****
X int trouble = in_trouble (); /* what's your worst difficulty? */
X int pat_on_head = 0;
X
X- if (u.ugangr > 0) u.ugangr--;
X You("feel that %s is pleased.",
X #ifndef ALTARS
X u_gname());
X--- 411,416 ----
X***************
X*** 675,680 ****
X--- 674,681 ----
X {
X if (Hallucination)
X pline ("Your sacrifice sprouts wings and a propeller and roars away!");
X+ else if (Blind && u.ualigntyp == U_LAWFUL)
X+ pline("Your sacrifice disappears!");
X else pline ("Your sacrifice is consumed in a %s!",
X u.ualigntyp == U_LAWFUL ? "flash of light" : "burst of flame");
X useup(otmp);
X***************
X*** 718,724 ****
X register struct permonst *mtmp = &mons[otmp->corpsenm];
X extern int monstr[];
X
X! if (otmp->corpsenm == PM_ACID_BLOB || (moves <= otmp->age + 50))
X value = monstr[otmp->corpsenm] + 1;
X
X if (is_human(mtmp)) { /* Human sacrifice! */
X--- 719,725 ----
X register struct permonst *mtmp = &mons[otmp->corpsenm];
X extern int monstr[];
X
X! if (otmp->corpsenm == PM_ACID_BLOB || (monstermoves <= otmp->age + 50))
X value = monstr[otmp->corpsenm] + 1;
X
X if (is_human(mtmp)) { /* Human sacrifice! */
X***************
X*** 777,783 ****
X int unicalign;
X
X if (mtmp == &mons[PM_BLACK_UNICORN]) unicalign = -1;
X! else if (mtmp == &mons[PM_GREY_UNICORN]) unicalign = 0;
X else if (mtmp == &mons[PM_WHITE_UNICORN]) unicalign = 1;
X if (unicalign == u.ualigntyp) {
X pline("Such an action is an insult to %s!", (unicalign== -1)
X--- 778,784 ----
X int unicalign;
X
X if (mtmp == &mons[PM_BLACK_UNICORN]) unicalign = -1;
X! else if (mtmp == &mons[PM_GRAY_UNICORN]) unicalign = 0;
X else if (mtmp == &mons[PM_WHITE_UNICORN]) unicalign = 1;
X if (unicalign == u.ualigntyp) {
X pline("Such an action is an insult to %s!", (unicalign== -1)
X*** src/Old/pri.c Wed Sep 27 12:12:22 1989
X--- src/pri.c Wed Sep 27 11:25:39 1989
X***************
X*** 10,20 ****
X #include "epri.h"
X #endif
X
X! static void hilite P((UCHAR_P, UCHAR_P));
X static void cornbot P((int));
X static boolean ismnst P((CHAR_P));
X! #if !defined(DECRAINBOW) && !defined(UNIX)
X # define g_putch (void) putchar
X #endif
X
X #ifndef g_putch
X--- 10,31 ----
X #include "epri.h"
X #endif
X
X! static void hilite P((int,int,UCHAR_P, UCHAR_P));
X static void cornbot P((int));
X static boolean ismnst P((CHAR_P));
X! #ifdef TEXTCOLOR
X! static uchar mimic_color P((UCHAR_P));
X! #endif
X!
X! #if defined(MSDOS) && !defined(TERMLIB) && !defined(DECRAINBOW)
X! # define g_putch (void) putchar
X! #endif
X!
X! /* This is the same logic used for "#define IBMXASCII" in file "termcap.c" */
X! #if !defined(AMIGA) && !defined(TOS)
X! # if defined(TERMLIB) || !(defined(DECRAINBOW) || defined(OS2))
X # define g_putch (void) putchar
X+ # endif
X #endif
X
X #ifndef g_putch
X***************
X*** 49,55 ****
X curx = u.ux+2;
X curs(u.ux-1, u.uy+2);
X (void) putchar('|');
X! hilite(u.usym, AT_MON);
X (void) putchar('|');
X curx = u.ux+2;
X curs(u.ux-1, u.uy+3);
X--- 60,66 ----
X curx = u.ux+2;
X curs(u.ux-1, u.uy+2);
X (void) putchar('|');
X! hilite(u.ux, u.uy, u.usym, AT_MON);
X (void) putchar('|');
X curx = u.ux+2;
X curs(u.ux-1, u.uy+3);
X***************
X*** 140,146 ****
X y += 2;
X curs(x,y);
X
X! hilite(ch,typ);
X curx++;
X }
X
X--- 151,157 ----
X y += 2;
X curs(x,y);
X
X! hilite(x, y-2, ch, typ);
X curx++;
X }
X
X***************
X*** 385,397 ****
X if(obj->olet == FOOD_SYM && obj->otyp == CORPSE) {
X
X if(mons[obj->corpsenm].mlet == S_TROLL &&
X! obj->age + 20 < moves) {
X boolean visible = cansee(obj->ox,obj->oy);
X struct monst *mtmp = revive(obj, FALSE);
X
X if (mtmp && visible)
X pline("%s rises from the dead!", Monnam(mtmp));
X! } else if (obj->age + 250 < moves) delobj(obj);
X }
X }
X
X--- 396,408 ----
X if(obj->olet == FOOD_SYM && obj->otyp == CORPSE) {
X
X if(mons[obj->corpsenm].mlet == S_TROLL &&
X! obj->age + 20 < monstermoves) {
X boolean visible = cansee(obj->ox,obj->oy);
X struct monst *mtmp = revive(obj, FALSE);
X
X if (mtmp && visible)
X pline("%s rises from the dead!", Monnam(mtmp));
X! } else if (obj->age + 250 < monstermoves) delobj(obj);
X }
X }
X
X***************
X*** 399,405 ****
X obj2 = obj->nobj;
X if(obj->otyp == CORPSE) {
X if(mons[obj->corpsenm].mlet == S_TROLL
X! && obj->age + 20 < moves) {
X boolean wielded = (obj==uwep);
X struct monst *mtmp = revive(obj, TRUE);
X
X--- 410,416 ----
X obj2 = obj->nobj;
X if(obj->otyp == CORPSE) {
X if(mons[obj->corpsenm].mlet == S_TROLL
X! && obj->age + 20 < monstermoves) {
X boolean wielded = (obj==uwep);
X struct monst *mtmp = revive(obj, TRUE);
X
X***************
X*** 408,414 ****
X mtmp->data->mname, xname(obj));
X else if (mtmp)
X You("feel squirming in your backpack!");
X! } else if (obj->age + 250 < moves) useup(obj);
X }
X }
X }
X--- 419,425 ----
X mtmp->data->mname, xname(obj));
X else if (mtmp)
X You("feel squirming in your backpack!");
X! } else if (obj->age + 250 < monstermoves) useup(obj);
X }
X }
X }
X***************
X*** 1070,1095 ****
X return hcolors[rn2(SIZE(hcolors))];
X }
X
X! /* Bug: if a level character is the same as an object/monster, it may be
X! * hilited, because we use a kludge to figure out if a character is an
X! * object/monster symbol. It's smarter than it was in 2.3, but you
X! * can still fool it (ex. if an object is in a doorway you have not seen,
X! * and you look at a map, the '+' will be taken as a spellbook symbol).
X! *
X! * The problem is that whenever a portion of the map needs to be redrawn
X! * (by ^R, after an inventory dropover, after regurgitation...), the
X! * levl[][].scrsym field is used to redraw the map. A great duplication
X! * of code would be needed to trace back every scrsym to find out what color
X! * it should be.
X! *
X! * What is really needed is a levl[][].color field; the color be figured
X! * out at the same time as the screen symbol, and be restored with
X! * redraws. Unfortunately, as this requires much time and testing,
X! * it will have to wait for NetHack 3.1. -3.
X! */
X!
X static void
X! hilite(let,typ)
X uchar let, typ;
X {
X
X--- 1081,1090 ----
X return hcolors[rn2(SIZE(hcolors))];
X }
X
X! /*ARGSUSED*/
X static void
X! hilite(x, y, let, typ)
X! int x, y;
X uchar let, typ;
X {
X
X***************
X*** 1122,1152 ****
X case S_MIMIC_DEF:
X typ = HI_OBJ;
X break;
X- case S_YLIGHT: /* make 'em "glow" */
X- typ = YELLOW;
X- break;
X default:
X! typ = HI_MON;
X }
X break;
X case AT_OBJ:
X! switch (let) {
X! case GOLD_SYM:
X! typ = HI_GOLD;
X! break;
X! case WEAPON_SYM:
X! case ARMOR_SYM:
X! case RING_SYM:
X! case AMULET_SYM:
X! typ = HI_METAL;
X! break;
X! case FOOD_SYM:
X! case POTION_SYM:
X! typ = HI_ORGANIC;
X! break;
X! default:
X! typ = HI_OBJ;
X! }
X break;
X case AT_MAP:
X #ifdef FOUNTAINS
X--- 1117,1137 ----
X case S_MIMIC_DEF:
X typ = HI_OBJ;
X break;
X default:
X! if (u.ux == x && u.uy == y)
X! typ = uasmon->mcolor;
X! else
X! typ = level.monsters[x][y]->data->mcolor;
X }
X break;
X case AT_OBJ:
X! if (let == GOLD_SYM)
X! typ = HI_GOLD;
X! else if (level.objects[x][y] &&
X! let == objects[level.objects[x][y]->otyp].oc_olet)
X! typ = objects[level.objects[x][y]->otyp].oc_color;
X! else
X! typ = mimic_color(let);
X break;
X case AT_MAP:
X #ifdef FOUNTAINS
X***************
X*** 1154,1178 ****
X #else
X typ = (let == POOL_SYM
X #endif
X! && HI_COLOR[BLUE] != HI ? BLUE : 0);
X break;
X case AT_ZAP:
X typ = HI_ZAP;
X break;
X }
X! if (typ)
X! xputs(HI_COLOR[typ]);
X! #else
X! if (typ == AT_MON) revbeg();
X #endif
X
X g_putch(let);
X
X #ifdef TEXTCOLOR
X! if (typ) xputs(HE);
X! #else
X! if (typ == AT_MON) m_end();
X #endif
X }
X
X static boolean
X--- 1139,1166 ----
X #else
X typ = (let == POOL_SYM
X #endif
X! && hilites[BLUE] != HI ? BLUE :
X! #ifdef THRONES
X! let == THRONE_SYM && hilites[HI_GOLD] != HI ? HI_GOLD :
X! #endif
X! 0);
X break;
X case AT_ZAP:
X typ = HI_ZAP;
X break;
X }
X! if (typ && flags.use_color)
X! xputs(hilites[typ]);
X! else
X #endif
X+ if (typ == AT_MON) revbeg();
X
X g_putch(let);
X
X #ifdef TEXTCOLOR
X! if (typ && flags.use_color) xputs(HE); else
X #endif
X+ if (typ == AT_MON) m_end();
X }
X
X static boolean
X***************
X*** 1194,1196 ****
X--- 1182,1201 ----
X #endif
X return 0;
X }
X+
X+ #ifdef TEXTCOLOR
X+ /* pick an appropriate color for a mimic imitating an object */
X+
X+ static uchar
X+ mimic_color(let)
X+ uchar let;
X+ {
X+ int i;
X+
X+ for(i = 0; i < NROFOBJECTS; i++) {
X+ if (objects[i].oc_olet == let)
X+ return objects[i].oc_color;
X+ }
X+ return HI_OBJ;
X+ }
X+ #endif
X*** src/Old/priest.c Wed Sep 27 12:13:05 1989
X--- src/priest.c Thu Sep 14 23:31:18 1989
X***************
X*** 85,94 ****
X #endif
X
X if(nix != omx || niy != omy) {
X! levl[omx][omy].mmask = 0;
X! levl[nix][niy].mmask = 1;
X! mtmp->mx = nix;
X! mtmp->my = niy;
X pmon(mtmp);
X if(ib) {
X if (cansee(mtmp->mx,mtmp->my))
X--- 85,92 ----
X #endif
X
X if(nix != omx || niy != omy) {
X! remove_monster(omx, omy);
X! place_monster(mtmp, nix, niy);
X pmon(mtmp);
X if(ib) {
X if (cansee(mtmp->mx,mtmp->my))
X***************
X*** 110,116 ****
X {
X register int roomno = inroom(x, y);
X
X! if (roomno < 0 || rooms[roomno].rtype != TEMPLE) return(FALSE);
X return(&rooms[roomno]);
X }
X
X--- 108,115 ----
X {
X register int roomno = inroom(x, y);
X
X! if (roomno < 0 || rooms[roomno].rtype != TEMPLE)
X! return((struct mkroom *)0);
X return(&rooms[roomno]);
X }
X
X***************
X*** 183,189 ****
X #ifdef SPELLS
X register int cnt;
X #endif
X! if(levl[sx+1][sy].mmask) rloc(m_at(sx+1, sy)); /* insurance */
X
X if(priest = makemon(&mons[!rn2(2) ? PM_TEMPLE_PRIEST :
X PM_TEMPLE_PRIESTESS], sx+1, sy)) {
X--- 182,188 ----
X #ifdef SPELLS
X register int cnt;
X #endif
X! if(MON_AT(sx+1, sy)) rloc(m_at(sx+1, sy)); /* insurance */
X
X if(priest = makemon(&mons[!rn2(2) ? PM_TEMPLE_PRIEST :
X PM_TEMPLE_PRIESTESS], sx+1, sy)) {
X*** src/Old/prisym.c Wed Sep 27 12:13:29 1989
X--- src/prisym.c Thu Sep 14 14:11:55 1989
X***************
X*** 216,222 ****
X /* the only lit corridor squares should be the entrances to
X * outside castle areas */
X return;
X! if(room->mmask) mtmp = m_at(x,y);
X if(mtmp && !mtmp->mhide &&
X (!mtmp->minvis || See_invisible)) {
X #ifdef WORM
X--- 216,222 ----
X /* the only lit corridor squares should be the entrances to
X * outside castle areas */
X return;
X! if(MON_AT(x, y)) mtmp = m_at(x,y);
X if(mtmp && !mtmp->mhide &&
X (!mtmp->minvis || See_invisible)) {
X #ifdef WORM
X***************
X*** 227,233 ****
X pmon(mtmp);
X }
X else if(OBJ_AT(x, y) && !is_pool(x,y)) {
X! otmp = o_at(x,y);
X atl(x,y,Hallucination ? rndobjsym() : otmp->olet);
X }
X else if(room->gmask && !is_pool(x,y))
X--- 227,233 ----
X pmon(mtmp);
X }
X else if(OBJ_AT(x, y) && !is_pool(x,y)) {
X! otmp = level.objects[x][y];
X atl(x,y,Hallucination ? rndobjsym() : otmp->olet);
X }
X else if(room->gmask && !is_pool(x,y))
X***************
X*** 263,269 ****
X if(!room->seen) tmp = STONE_SYM;
X else if(room->typ == POOL || room->typ == MOAT) tmp = POOL_SYM;
X else if(OBJ_AT(x, y) && !Blind && room->scrsym) {
X! otmp = o_at(x,y);
X tmp = Hallucination ? rndobjsym() : otmp->olet;
X }
X else if(room->gmask && !Blind && room->scrsym)
X--- 263,269 ----
X if(!room->seen) tmp = STONE_SYM;
X else if(room->typ == POOL || room->typ == MOAT) tmp = POOL_SYM;
X else if(OBJ_AT(x, y) && !Blind && room->scrsym) {
X! otmp = level.objects[x][y];
X tmp = Hallucination ? rndobjsym() : otmp->olet;
X }
X else if(room->gmask && !Blind && room->scrsym)
X***************
X*** 483,489 ****
X {
X if(x == u.ux && y == u.uy && !Invisible) return(1);
X
X! if(levl[x][y].mmask)
X if (Blind && Telepat || canseemon(m_at(x,y)))
X return(1);
X else return ((HTelepat & WORN_HELMET) &&
X--- 483,489 ----
X {
X if(x == u.ux && y == u.uy && !Invisible) return(1);
X
X! if(MON_AT(x, y))
X if (Blind && Telepat || canseemon(m_at(x,y)))
X return(1);
X else return ((HTelepat & WORN_HELMET) &&
X*** src/Old/read.c Wed Sep 27 12:13:53 1989
X--- src/read.c Sat Sep 23 00:46:44 1989
X***************
X*** 216,222 ****
X return(1);
X }
X } else { /* armor and scroll both cursed */
X! Your("%s vibrates", xname(otmp));
X otmp->spe--;
X make_stunned(HStun + rn1(10, 10), TRUE);
X }
X--- 216,222 ----
X return(1);
X }
X } else { /* armor and scroll both cursed */
X! Your("%s vibrates.", xname(otmp));
X otmp->spe--;
X make_stunned(HStun + rn1(10, 10), TRUE);
X }
X***************
X*** 363,369 ****
X register struct monst *mtmp;
X
X for(i = -bd; i <= bd; i++) for(j = -bd; j <= bd; j++)
X! if(levl[u.ux+i][u.uy+j].mmask && (mtmp = m_at(u.ux+i, u.uy+j))) {
X if(sobj->cursed) {
X if(!mtmp->mtame) mtmp->mpeaceful = 0;
X } else {
X--- 363,369 ----
X register struct monst *mtmp;
X
X for(i = -bd; i <= bd; i++) for(j = -bd; j <= bd; j++)
X! if(MON_AT(u.ux+i, u.uy+j) && (mtmp = m_at(u.ux+i, u.uy+j))) {
X if(sobj->cursed) {
X if(!mtmp->mtame) mtmp->mpeaceful = 0;
X } else {
X*** src/Old/restore.c Wed Sep 27 12:14:35 1989
X--- src/restore.c Tue Sep 26 16:08:35 1989
X***************
X*** 39,44 ****
X--- 39,72 ----
X }
X }
X
X+ /* Recalculate level.objects[x][y], since this info was not saved. */
X+ static void
X+ find_lev_obj()
X+ {
X+ register struct obj *fobjtmp = (struct obj *)0;
X+ register struct obj *otmp;
X+ int x,y;
X+
X+ for(x=0; xnobj;
X+ otmp->nobj = fobjtmp;
X+ fobjtmp = otmp;
X+ }
X+ /* Set level.objects (as well as reversing the chain back again) */
X+ while(otmp = fobjtmp) {
X+ place_object(otmp, otmp->ox, otmp->oy);
X+ fobjtmp = otmp->nobj;
X+ otmp->nobj = fobj;
X+ fobj = otmp;
X+ }
X+ }
X+
X static struct obj *
X restobjchn(fd, ghostly)
X register int fd;
X***************
X*** 74,80 ****
X * new player's clock. Assumption: new player arrived immediately
X * after old player died.
X */
X! if (ghostly) otmp->age = moves-omoves+otmp->age;
X otmp2 = otmp;
X }
X if(first && otmp2->nobj){
X--- 102,108 ----
X * new player's clock. Assumption: new player arrived immediately
X * after old player died.
X */
X! if (ghostly) otmp->age = monstermoves-omoves+otmp->age;
X otmp2 = otmp;
X }
X if(first && otmp2->nobj){
X***************
X*** 211,216 ****
X--- 239,245 ----
X mread(fd, (genericptr_t) &dlevel, sizeof dlevel);
X mread(fd, (genericptr_t) &maxdlevel, sizeof maxdlevel);
X mread(fd, (genericptr_t) &moves, sizeof moves);
X+ mread(fd, (genericptr_t) &monstermoves, sizeof monstermoves);
X mread(fd, (genericptr_t) &wiz_level, sizeof wiz_level);
X mread(fd, (genericptr_t) &medusa_level, sizeof medusa_level);
X mread(fd, (genericptr_t) &bigroom_level, sizeof bigroom_level);
X***************
X*** 328,335 ****
X #endif
X getlev(fd, 0, (xchar)0, FALSE);
X (void) close(fd);
X! #ifdef EXPLORE_MODE
X! if(!discover)
X #endif
X (void) unlink(SAVEF);
X #ifdef REINCARNATION
X--- 357,374 ----
X #endif
X getlev(fd, 0, (xchar)0, FALSE);
X (void) close(fd);
X! #if defined(WIZARD) || defined(EXPLORE_MODE)
X! if(
X! # ifdef WIZARD
X! !wizard
X! # ifdef EXPLORE_MODE
X! &&
X! # endif
X! # endif
X! # ifdef EXPLORE_MODE
X! !discover
X! # endif
X! )
X #endif
X (void) unlink(SAVEF);
X #ifdef REINCARNATION
X***************
X*** 372,377 ****
X--- 411,417 ----
X {
X register struct gold *gold;
X register struct trap *trap;
X+ register struct monst *mtmp;
X #ifdef WORM
X register struct wseg *wtmp;
X register int tmp;
X***************
X*** 666,671 ****
X--- 706,712 ----
X }
X free((genericptr_t) trap);
X fobj = restobjchn(fd, ghostly);
X+ find_lev_obj();
X billobjs = restobjchn(fd, ghostly);
X rest_engravings(fd);
X mread(fd, (genericptr_t)rooms, sizeof(rooms));
X***************
X*** 683,688 ****
X--- 724,737 ----
X }
X mread(fd, (genericptr_t)wgrowtime, sizeof(wgrowtime));
X #endif
X+
X+ /* reset level.monsters for new level */
X+ for (x = 0; x < COLNO; x++)
X+ for (y = 0; y < ROWNO; y++)
X+ level.monsters[x][y] = (struct monst *) 0;
X+ for (mtmp = level.monlist; mtmp; mtmp = mtmp->nmon)
X+ place_monster(mtmp, mtmp->mx, mtmp->my);
X+
X #ifdef TUTTI_FRUTTI
X /* Now get rid of all the temp fruits... */
X if (ghostly) {
X*** src/Old/rnd.c Wed Sep 27 12:15:19 1989
X--- src/rnd.c Thu Sep 14 13:21:51 1989
X***************
X*** 28,33 ****
X--- 28,39 ----
X rn2(x) /* 0 <= rn2(x) < x */
X register int x;
X {
X+ #ifdef DEBUG
X+ if (x == 0) {
X+ impossible("rn2(0) attempted");
X+ return(0);
X+ }
X+ #endif
X return(RND(x));
X }
X
X***************
X*** 50,55 ****
X--- 56,67 ----
X rnd(x) /* 1 <= rnd(x) <= x */
X register int x;
X {
X+ #ifdef DEBUG
X+ if (x == 0) {
X+ impossible("rnd(0) attempted");
X+ return(1);
X+ }
X+ #endif
X return(RND(x)+1);
X }
X
X*** src/Old/rumors.c Wed Sep 27 12:15:31 1989
X--- src/rumors.c Mon Sep 25 21:29:05 1989
X***************
X*** 223,229 ****
X You("have no money.");
X return(0);
X }
X! pline("\"Wilt thou settle for a minor consultation?\" (50 Zorkmids) ");
X ans = ynq();
X if(ans == 'y') {
X if(u.ugold < 50) {
X--- 223,229 ----
X You("have no money.");
X return(0);
X }
X! pline("\"Wilt thou settle for a minor consultation?\" (50 zorkmids) ");
X ans = ynq();
X if(ans == 'y') {
X if(u.ugold < 50) {
X***************
X*** 237,243 ****
X return(1);
X } else if(ans == 'q') return(0);
X else {
X! pline("\"Then dost thou desire a major one?\" (1000 Zorkmids) ");
X if (yn() != 'y') return(0);
X }
X if(u.ugold < 1000) {
X--- 237,243 ----
X return(1);
X } else if(ans == 'q') return(0);
X else {
X! pline("\"Then dost thou desire a major one?\" (1000 zorkmids) ");
X if (yn() != 'y') return(0);
X }
X if(u.ugold < 1000) {
X*** src/Old/save.c Wed Sep 27 12:15:46 1989
X--- src/save.c Tue Sep 26 16:08:38 1989
X***************
X*** 14,20 ****
X #ifndef NO_SIGNAL
X #include
X #endif /* !NO_SIGNAL */
X! #ifdef EXPLORE_MODE
X #include
X #endif /* EXPLORE_MODE */
X
X--- 14,20 ----
X #ifndef NO_SIGNAL
X #include
X #endif /* !NO_SIGNAL */
X! #if defined(EXPLORE_MODE) && !defined(O_RDONLY)
X #include
X #endif /* EXPLORE_MODE */
X
X***************
X*** 75,83 ****
X #ifndef NOSAVEONHANGUP
X int
X hangup(){
X! hu = TRUE;
X! (void) dosave0();
X! exit(1);
X return 0;
X }
X #endif
X--- 75,88 ----
X #ifndef NOSAVEONHANGUP
X int
X hangup(){
X! if (!hu)
X! {
X! hu = TRUE;
X! (void) dosave0();
X! # ifndef VMS
X! exit(1);
X! # endif
X! }
X return 0;
X }
X #endif
X***************
X*** 95,101 ****
X #ifdef COMPRESS
X char cmd[80];
X #endif
X! #ifdef UNIX
X (void) signal(SIGHUP, SIG_IGN);
X #endif
X #if !defined(__TURBOC__) && !defined(OLD_TOS)
X--- 100,110 ----
X #ifdef COMPRESS
X char cmd[80];
X #endif
X!
X! if (!SAVEF[0])
X! return 0;
X!
X! #if defined(UNIX) || defined(VMS)
X (void) signal(SIGHUP, SIG_IGN);
X #endif
X #if !defined(__TURBOC__) && !defined(OLD_TOS)
X***************
X*** 164,169 ****
X--- 173,179 ----
X bwrite(fd, (genericptr_t) &dlevel, sizeof dlevel);
X bwrite(fd, (genericptr_t) &maxdlevel, sizeof maxdlevel);
X bwrite(fd, (genericptr_t) &moves, sizeof moves);
X+ bwrite(fd, (genericptr_t) &monstermoves, sizeof monstermoves);
X bwrite(fd, (genericptr_t) &wiz_level, sizeof wiz_level);
X bwrite(fd, (genericptr_t) &medusa_level, sizeof medusa_level);
X bwrite(fd, (genericptr_t) &bigroom_level, sizeof bigroom_level);
X***************
X*** 355,361 ****
X else
X #endif
X bwrite(fd, (genericptr_t) &showsyms, sizeof(struct symbols));
X! bwrite(fd,(genericptr_t) &moves,sizeof(long));
X bwrite(fd,(genericptr_t) &xupstair,sizeof(xupstair));
X bwrite(fd,(genericptr_t) &yupstair,sizeof(yupstair));
X bwrite(fd,(genericptr_t) &xdnstair,sizeof(xdnstair));
X--- 365,371 ----
X else
X #endif
X bwrite(fd, (genericptr_t) &showsyms, sizeof(struct symbols));
X! bwrite(fd,(genericptr_t) &monstermoves,sizeof(long));
X bwrite(fd,(genericptr_t) &xupstair,sizeof(xupstair));
X bwrite(fd,(genericptr_t) &yupstair,sizeof(yupstair));
X bwrite(fd,(genericptr_t) &xdnstair,sizeof(xdnstair));
X*** src/Old/search.c Wed Sep 27 12:16:28 1989
X--- src/search.c Thu Sep 14 14:12:00 1989
X***************
X*** 36,42 ****
X atl(zx,zy,(char)((ttmp->ttyp==WEB) ? WEB_SYM : TRAP_SYM));
X (*num)++;
X }
X! } else if(levl[zx][zy].mmask) {
X mtmp = m_at(zx,zy);
X if(mtmp->mimic) {
X seemimic(mtmp);
X--- 36,42 ----
X atl(zx,zy,(char)((ttmp->ttyp==WEB) ? WEB_SYM : TRAP_SYM));
X (*num)++;
X }
X! } else if(MON_AT(zx, zy)) {
X mtmp = m_at(zx,zy);
X if(mtmp->mimic) {
X seemimic(mtmp);
X***************
X*** 122,128 ****
X prl(x,y);
X } else {
X /* Be careful not to find anything in an SCORR or SDOOR */
X! if(levl[x][y].mmask) {
X mtmp = m_at(x,y);
X if(!aflag && mtmp->mimic) {
X seemimic(mtmp);
X--- 122,128 ----
X prl(x,y);
X } else {
X /* Be careful not to find anything in an SCORR or SDOOR */
X! if(MON_AT(x, y)) {
X mtmp = m_at(x,y);
X if(!aflag && mtmp->mimic) {
X seemimic(mtmp);
X*** src/Old/shk.c Wed Sep 27 12:17:07 1989
X--- src/shk.c Mon Sep 25 23:01:31 1989
X***************
X*** 9,15 ****
X #include "eshk.h"
X
X #ifdef KOPS
X! static int makekops();
X static void kops_gone();
X #endif /* KOPS */
X
X--- 9,15 ----
X #include "eshk.h"
X
X #ifdef KOPS
X! static int makekops P((coord *));
X static void kops_gone();
X #endif /* KOPS */
X
X***************
X*** 125,132 ****
X You("escaped the shop without paying!");
X addupbill();
X total += ESHK(shopkeeper)->debit;
X! You("stole %ld zorkmids worth of merchandise.",
X! total);
X ESHK(shopkeeper)->robbed += total;
X ESHK(shopkeeper)->credit = 0L;
X ESHK(shopkeeper)->debit = 0L;
X--- 125,132 ----
X You("escaped the shop without paying!");
X addupbill();
X total += ESHK(shopkeeper)->debit;
X! You("stole %ld zorkmid%s worth of merchandise.",
X! total, plur(total));
X ESHK(shopkeeper)->robbed += total;
X ESHK(shopkeeper)->credit = 0L;
X ESHK(shopkeeper)->debit = 0L;
X***************
X*** 404,415 ****
X register struct monst *shkp;
X {
X register xchar x = ESHK(shkp)->shk.x, y = ESHK(shkp)->shk.y;
X! if(levl[x][y].mmask)
X mnearto(m_at(x,y), x, y, FALSE);
X! levl[shkp->mx][shkp->my].mmask = 0;
X! shkp->mx = x;
X! shkp->my = y;
X! levl[shkp->mx][shkp->my].mmask = 1;
X unpmon(shkp);
X }
X
X--- 404,413 ----
X register struct monst *shkp;
X {
X register xchar x = ESHK(shkp)->shk.x, y = ESHK(shkp)->shk.y;
X! if(MON_AT(x, y))
X mnearto(m_at(x,y), x, y, FALSE);
X! remove_monster(shkp->mx, shkp->my);
X! place_monster(shkp, x, y);
X unpmon(shkp);
X }
X
X***************
X*** 468,476 ****
X else {
X long ugold = u.ugold;
X
X! if(ugold > ltmp) {
X! You("give %s the %ld gold pieces %s asked for.",
X! mon_nam(shkp), ltmp,
X ESHK(shkp)->ismale ? "he" : "she");
X pay(ltmp, shkp);
X } else {
X--- 466,474 ----
X else {
X long ugold = u.ugold;
X
X! if(ugold > ltmp) {
X! You("give %s the %ld gold piece%s %s asked for.",
X! mon_nam(shkp), ltmp, plur(ltmp),
X ESHK(shkp)->ismale ? "he" : "she");
X pay(ltmp, shkp);
X } else {
X***************
X*** 538,545 ****
X }
X /* pay debt, if any, first */
X if(ESHK(shopkeeper)->debit) {
X! You("owe %s %ld zorkmids for the use of merchandise.",
X! shkname(shopkeeper), ESHK(shopkeeper)->debit);
X if(u.ugold + ESHK(shopkeeper)->credit <
X ESHK(shopkeeper)->debit) {
X pline("But you don't have enough gold%s.",
X--- 536,544 ----
X }
X /* pay debt, if any, first */
X if(ESHK(shopkeeper)->debit) {
X! You("owe %s %ld zorkmid%s for the use of merchandise.",
X! shkname(shopkeeper), ESHK(shopkeeper)->debit,
X! plur(ESHK(shopkeeper)->debit));
X if(u.ugold + ESHK(shopkeeper)->credit <
X ESHK(shopkeeper)->debit) {
X pline("But you don't have enough gold%s.",
X***************
X*** 722,732 ****
X } else {
X u.ugold -= loss;
X shopkeeper->mgold += loss;
X! pline("%s comes and takes %ld zorkmids %sowed %s.",
X! Monnam(shopkeeper),
X! loss,
X! strncmp(ESHK(shopkeeper)->customer, plname, PL_NSIZ) ? "" : "you ",
X! ESHK(shopkeeper)->ismale ? "him" : "her");
X }
X
X /* in case we create bones */
X--- 721,732 ----
X } else {
X u.ugold -= loss;
X shopkeeper->mgold += loss;
X! pline("%s comes and takes %ld zorkmid%s %sowed %s.",
X! Monnam(shopkeeper),
X! loss,
X! plur(loss),
X! strncmp(ESHK(shopkeeper)->customer, plname, PL_NSIZ) ? "" : "you ",
X! ESHK(shopkeeper)->ismale ? "him" : "her");
X }
X
X /* in case we create bones */
X***************
X*** 847,854 ****
X pline("%s; only %d %s %s.\"", buf, bp->price,
X (bp->bquan > 1) ? "per" : "for this", xname(obj));
X obj->quan = bp->bquan;
X! } else pline("The %s will cost you %d zorkmids%s.",
X! xname(obj), bp->price,
X (bp->bquan > 1) ? " each" : "");
X ESHK(shopkeeper)->billct++;
X obj->unpaid = 1;
X--- 847,854 ----
X pline("%s; only %d %s %s.\"", buf, bp->price,
X (bp->bquan > 1) ? "per" : "for this", xname(obj));
X obj->quan = bp->bquan;
X! } else pline("The %s will cost you %d zorkmid%s%s.",
X! xname(obj), bp->price, plur((long)bp->price),
X (bp->bquan > 1) ? " each" : "");
X ESHK(shopkeeper)->billct++;
X obj->unpaid = 1;
X***************
X*** 886,900 ****
X }
X }
X
X! void
X subfrombill(obj)
X register struct obj *obj;
X {
X- long ltmp;
X register struct bill_x *bp;
X
X- if(!costly_spot(u.ux,u.uy))
X- return;
X if((bp = onbill(obj)) != 0) {
X register struct obj *otmp;
X
X--- 886,897 ----
X }
X }
X
X! static void
X subfrombill(obj)
X register struct obj *obj;
X {
X register struct bill_x *bp;
X
X if((bp = onbill(obj)) != 0) {
X register struct obj *otmp;
X
X***************
X*** 914,927 ****
X ESHK(shopkeeper)->billct--;
X *bp = bill[ESHK(shopkeeper)->billct];
X return;
X! }
X! if(obj->unpaid) {
X! if(inhishop(shopkeeper))
X! pline("%s didn't notice.", Monnam(shopkeeper));
X obj->unpaid = 0;
X- return; /* %% */
X }
X! /* he dropped something of his own - probably wants to sell it */
X if(shopkeeper->msleep || shopkeeper->mfroz || !inhishop(shopkeeper))
X return;
X ltmp = (long) getprice(obj) * (long) obj->quan;
X--- 911,932 ----
X ESHK(shopkeeper)->billct--;
X *bp = bill[ESHK(shopkeeper)->billct];
X return;
X! } else if (obj->unpaid) {
X! impossible("subfrombill: unpaid object not on bill");
X obj->unpaid = 0;
X }
X! }
X!
X! void
X! sellobj(obj)
X! register struct obj *obj;
X! {
X! long ltmp;
X!
X! if(!costly_spot(u.ux,u.uy))
X! return;
X! subfrombill(obj);
X! /* you dropped something of your own - probably want to sell it */
X if(shopkeeper->msleep || shopkeeper->mfroz || !inhishop(shopkeeper))
X return;
X ltmp = (long) getprice(obj) * (long) obj->quan;
X***************
X*** 1007,1018 ****
X for(cnt = 0; buf[cnt]; cnt++);
X while(cnt < 50)
X buf[cnt++] = ' ';
X! Sprintf(&buf[cnt], " %5ld zorkmids", thisused);
X if(page_line(buf))
X goto quit;
X }
X }
X! Sprintf(buf, "Total:%50ld zorkmids", totused);
X if(page_line("") || page_line(buf))
X goto quit;
X set_pager(1);
X--- 1012,1023 ----
X for(cnt = 0; buf[cnt]; cnt++);
X while(cnt < 50)
X buf[cnt++] = ' ';
X! Sprintf(&buf[cnt], " %5ld zorkmid%s", thisused, plur(thisused));
X if(page_line(buf))
X goto quit;
X }
X }
X! Sprintf(buf, "Total:%50ld zorkmid%s", totused, plur(totused));
X if(page_line("") || page_line(buf))
X goto quit;
X set_pager(1);
X***************
X*** 1039,1044 ****
X--- 1044,1050 ----
X case FOOD_SYM:
X /* simpler hunger check, (2-4)*cost */
X if (u.uhs >= HUNGRY) tmp *= u.uhs;
X+ if (OEATEN(obj)) tmp /= 2; /* partly eaten */
X break;
X case WAND_SYM:
X if (obj->spe == -1) tmp = 0;
X***************
X*** 1064,1071 ****
X {
X register struct monst *shkp = shopkeeper;
X
X if(u.uinshop && shkp && !shkp->mfroz && !shkp->msleep &&
X- u.dx && u.dy &&
X inroom(u.ux+u.dx, u.uy+u.dy) + 1 == u.uinshop &&
X shkp->mx == ESHK(shkp)->shk.x && shkp->my == ESHK(shkp)->shk.y &&
X u.ux == ESHK(shkp)->shd.x && u.uy == ESHK(shkp)->shd.y) {
X--- 1070,1077 ----
X {
X register struct monst *shkp = shopkeeper;
X
X+ if(obj->otyp != PICK_AXE) return(0);
X if(u.uinshop && shkp && !shkp->mfroz && !shkp->msleep &&
X inroom(u.ux+u.dx, u.uy+u.dy) + 1 == u.uinshop &&
X shkp->mx == ESHK(shkp)->shk.x && shkp->my == ESHK(shkp)->shk.y &&
X u.ux == ESHK(shkp)->shd.x && u.uy == ESHK(shkp)->shd.y) {
X***************
X*** 1072,1077 ****
X--- 1078,1084 ----
X pline("%s nimbly catches the %s.", Monnam(shkp), xname(obj));
X obj->nobj = shkp->minvent;
X shkp->minvent = obj;
X+ subfrombill(obj);
X return(1);
X }
X return(0);
X***************
X*** 1227,1233 ****
X pline("\"%s, do not damage the floor here!\"",
X flags.female ? "Madam" : "Sir");
X if (pl_character[0] == 'K') adjalign(-sgn(u.ualigntyp));
X! } else if(um_dist(shopkeeper->mx, shopkeeper->my, 2)) {
X register struct obj *obj, *obj2;
X
X if(dist(shopkeeper->mx, shopkeeper->my) > 2) {
X--- 1234,1240 ----
X pline("\"%s, do not damage the floor here!\"",
X flags.female ? "Madam" : "Sir");
X if (pl_character[0] == 'K') adjalign(-sgn(u.ualigntyp));
X! } else if(!um_dist(shopkeeper->mx, shopkeeper->my, 5)) {
X register struct obj *obj, *obj2;
X
X if(dist(shopkeeper->mx, shopkeeper->my) > 2) {
X***************
X*** 1248,1255 ****
X freeinv(obj);
X obj->nobj = shopkeeper->minvent;
X shopkeeper->minvent = obj;
X! if(obj->unpaid)
X! subfrombill(obj);
X }
X }
X }
X--- 1255,1261 ----
X freeinv(obj);
X obj->nobj = shopkeeper->minvent;
X shopkeeper->minvent = obj;
X! subfrombill(obj);
X }
X }
X }
X***************
X*** 1328,1341 ****
X if(!in_shop(shopkeeper->mx ,shopkeeper->my)) return;
X
X /* if a !shopkeeper shows up at the door, move him */
X! if(levl[x][y].mmask && (mtmp = m_at(x, y)) != shopkeeper) {
X if(flags.soundok) {
X You("hear an angry voice: \"Out of my way, scum!\"");
X (void) fflush(stdout);
X! #if defined(SYSV) || defined(ULTRIX)
X (void)
X #endif
X! #ifdef UNIX
X sleep(1);
X #endif
X }
X--- 1334,1347 ----
X if(!in_shop(shopkeeper->mx ,shopkeeper->my)) return;
X
X /* if a !shopkeeper shows up at the door, move him */
X! if(MON_AT(x, y) && (mtmp = m_at(x, y)) != shopkeeper) {
X if(flags.soundok) {
X You("hear an angry voice: \"Out of my way, scum!\"");
X (void) fflush(stdout);
X! #if defined(SYSV) || defined(ULTRIX) || defined(VMS)
X (void)
X #endif
X! #if defined(UNIX) || defined(VMS)
X sleep(1);
X #endif
X }
X***************
X*** 1343,1352 ****
X }
X
X /* make shk show up at the door */
X! levl[shopkeeper->mx][shopkeeper->my].mmask = 0;
X! levl[x][y].mmask = 1;
X! shopkeeper->mx = x;
X! shopkeeper->my = y;
X pmon(shopkeeper);
X
X damage = (ACURR(A_STR) > 18) ? 400 : 20 * ACURR(A_STR);
X--- 1349,1356 ----
X }
X
X /* make shk show up at the door */
X! remove_monster(shopkeeper->mx, shopkeeper->my);
X! place_monster(shopkeeper, x, y);
X pmon(shopkeeper);
X
X damage = (ACURR(A_STR) > 18) ? 400 : 20 * ACURR(A_STR);
X***************
X*** 1374,1380 ****
X NOTANGRY(shopkeeper) = 1;
X }
X else {
X! pline("\"Oh, yes! You'll pay!\"");
X ESHK(shopkeeper)->following = 1;
X NOTANGRY(shopkeeper) = 0;
X adjalign(-sgn(u.ualigntyp));
X--- 1378,1384 ----
X NOTANGRY(shopkeeper) = 1;
X }
X else {
X! verbalize("Oh, yes! You'll pay!");
X ESHK(shopkeeper)->following = 1;
X NOTANGRY(shopkeeper) = 0;
X adjalign(-sgn(u.ualigntyp));
X*** src/Old/shknam.c Wed Sep 27 12:17:56 1989
X--- src/shknam.c Thu Sep 14 14:12:08 1989
X***************
X*** 186,192 ****
X register struct monst *mtmp;
X int atype;
X
X! if (rn2(100) < dlevel && levl[sx][sy].mmask == 0 &&
X (mtmp=makemon(mkclass(S_MIMIC),sx,sy))) {
X mtmp->mimic = 1;
X /* note: makemon will set the mimic symbol to a shop item */
X--- 186,192 ----
X register struct monst *mtmp;
X int atype;
X
X! if (rn2(100) < dlevel && !MON_AT(sx, sy) &&
X (mtmp=makemon(mkclass(S_MIMIC),sx,sy))) {
X mtmp->mimic = 1;
X /* note: makemon will set the mimic symbol to a shop item */
X***************
X*** 258,264 ****
X return(-1);
X }
X
X! if(levl[sx][sy].mmask) rloc(m_at(sx, sy)); /* insurance */
X
X /* now initialize the shopkeeper monster structure */
X if(!(shk = makemon(&mons[PM_SHOPKEEPER], sx, sy))) return(-1);
X--- 258,264 ----
X return(-1);
X }
X
X! if(MON_AT(sx, sy)) rloc(m_at(sx, sy)); /* insurance */
X
X /* now initialize the shopkeeper monster structure */
X if(!(shk = makemon(&mons[PM_SHOPKEEPER], sx, sy))) return(-1);
X*** src/Old/sounds.c Wed Sep 27 12:18:36 1989
X--- src/sounds.c Thu Sep 14 14:12:11 1989
X***************
X*** 381,390 ****
X case MS_HUMANOID:
X /* Generic humanoid behaviour. */
X if (!mtmp->mpeaceful && !mtmp->mtame) break;
X! if (mtmp->mhp < 10)
X! kludge("%s moans.", Monnam(mtmp));
X! else if (mtmp->mflee)
X kludge("%s wants nothing to do with you.", Monnam(mtmp));
X else if (mtmp->mconf || mtmp->mstun)
X verbalize(!rn2(3) ? "Huh?" : rn2(2) ? "What?" : "Eh?");
X else if (mtmp->mblinded)
X--- 381,390 ----
X case MS_HUMANOID:
X /* Generic humanoid behaviour. */
X if (!mtmp->mpeaceful && !mtmp->mtame) break;
X! if (mtmp->mflee)
X kludge("%s wants nothing to do with you.", Monnam(mtmp));
X+ else if (mtmp->mhp < mtmp->mhpmax/4)
X+ kludge("%s moans.", Monnam(mtmp));
X else if (mtmp->mconf || mtmp->mstun)
X verbalize(!rn2(3) ? "Huh?" : rn2(2) ? "What?" : "Eh?");
X else if (mtmp->mblinded)
X***************
X*** 587,593 ****
X }
X
X tx = u.ux+u.dx; ty = u.uy+u.dy;
X! if ((Blind && !Telepat) || !levl[tx][ty].mmask ||
X (mtmp = m_at(tx, ty))->mimic || mtmp->mundetected) {
X pline("I see nobody there.");
X return(0);
X--- 587,593 ----
X }
X
X tx = u.ux+u.dx; ty = u.uy+u.dy;
X! if ((Blind && !Telepat) || !MON_AT(tx, ty) ||
X (mtmp = m_at(tx, ty))->mimic || mtmp->mundetected) {
X pline("I see nobody there.");
X return(0);
X*** src/Old/spell.c Wed Sep 27 12:19:31 1989
X--- src/spell.c Thu Sep 14 14:06:53 1989
X***************
X*** 18,27 ****
X #define spellid(spell) spl_book[spell-1].sp_id
X
X static void
X! cursed_book(level)
X! register int level;
X {
X! switch(rn2(level)) {
X case 0:
X You("feel a wrenching sensation.");
X tele(); /* teleport him */
X--- 18,27 ----
X #define spellid(spell) spl_book[spell-1].sp_id
X
X static void
X! cursed_book(lev)
X! register int lev;
X {
X! switch(rn2(lev)) {
X case 0:
X You("feel a wrenching sensation.");
X tele(); /* teleport him */
X*** src/Old/termcap.c Wed Sep 27 12:20:12 1989
X--- src/termcap.c Wed Sep 27 11:25:44 1989
X***************
X*** 32,50 ****
X # ifdef TERMLIB
X static void init_hilite();
X # endif
X! #define NONE 0
X! #define HIGH_INTENSITY 1
X! #define BLACK 0
X! #define HILITE_ATTRIB HIGH_INTENSITY
X! #endif /* TEXTCOLOR */
X
X static char *HO, *CL, *CE, *UP, *CM, *ND, *XD, *BC, *SO, *SE, *TI, *TE;
X static char *VS, *VE, *US, *UE;
X static char *MR, *ME;
X #if 0
X! static char *MB, *MD, *MH;
X #endif
X #ifdef TERMLIB
X static int SG;
X static char PC = '\0';
X static char tbuf[512];
X--- 32,50 ----
X # ifdef TERMLIB
X static void init_hilite();
X # endif
X! #endif
X
X static char *HO, *CL, *CE, *UP, *CM, *ND, *XD, *BC, *SO, *SE, *TI, *TE;
X static char *VS, *VE, *US, *UE;
X static char *MR, *ME;
X #if 0
X! static char *MB, *MH;
X! static char *MD; /* may already be in use below */
X #endif
X #ifdef TERMLIB
X+ # ifdef TEXTCOLOR
X+ static char *MD;
X+ # endif
X static int SG;
X static char PC = '\0';
X static char tbuf[512];
X***************
X*** 134,140 ****
X SO = "\033p";
X SE = "\033q";
X HI = "\033p";
X! HE = "\033q";
X }
X # else /* TOS */
X {
X--- 134,144 ----
X SO = "\033p";
X SE = "\033q";
X HI = "\033p";
X! HE = "\033q\033b\020";
X! for (i = 0; i < SIZE(hilites); i++) {
X! hilites[i] = (char *) alloc(sizeof("Eb1"));
X! Sprintf(hilites[i], (i%4)?"\033b%c","\033p", i);
X! }
X }
X # else /* TOS */
X {
X***************
X*** 173,182 ****
X # endif
X TE = VS = VE = "";
X # ifdef TEXTCOLOR
X! for (i = 0; i < SIZE(HI_COLOR); i++) {
X! HI_COLOR[i] = (char *) alloc(sizeof("E[0;33;44m"));
X! Sprintf(HI_COLOR[i], "\033[%d;3%dm",
X! i == BLACK ? NONE : HILITE_ATTRIB, i);
X }
X # endif
X return;
X--- 177,187 ----
X # endif
X TE = VS = VE = "";
X # ifdef TEXTCOLOR
X! for (i = 0; i < MAXCOLORS / 2; i++) {
X! hilites[i] = (char *) alloc(sizeof("\033[0;3%dm"));
X! hilites[i+BRIGHT] = (char *) alloc(sizeof("\033[1;3%dm"));
X! Sprintf(hilites[i], "\033[0;3%dm", i);
X! Sprintf(hilites[i+BRIGHT], "\033[1;3%dm", i);
X }
X # endif
X return;
X***************
X*** 282,287 ****
X--- 287,295 ----
X AS = Tgetstr("as");
X AE = Tgetstr("ae");
X CD = Tgetstr("cd");
X+ # ifdef TEXTCOLOR
X+ MD = Tgetstr("md");
X+ # endif
X set_whole_screen(); /* uses LI and CD */
X if(tbufptr-tbuf > sizeof(tbuf)) error("TERMCAP entry too big...\n");
X free((genericptr_t)tptr);
X***************
X*** 514,519 ****
X--- 522,528 ----
X (void) fflush(stdout);
X }
X
X+ #if defined(TERMLIB) || defined(DECRAINBOW)
X void
X graph_on() {
X if (AS) xputs(AS);
X***************
X*** 523,533 ****
X--- 532,550 ----
X graph_off() {
X if (AE) xputs(AE);
X }
X+ #endif
X
X #ifndef MSDOS
X+ # ifdef VMS
X+ static const short tmspc10[] = { /* from termcap */
X+ 0, 2000, 1333, 909, 743, 666, 333, 166, 83, 55, 50, 41, 27, 20, 13, 10,
X+ 5
X+ };
X+ # else
X static const short tmspc10[] = { /* from termcap */
X 0, 2000, 1333, 909, 743, 666, 500, 333, 166, 83, 55, 41, 20, 10, 5
X };
X+ # endif
X #endif
X
X void
X***************
X*** 594,600 ****
X * code found in pri.c). It is assumed that the background color is black.
X */
X /* terminfo indexes for the basic colors it guarantees */
X! #define COLOR_BLACK 0
X #define COLOR_BLUE 1
X #define COLOR_GREEN 2
X #define COLOR_CYAN 3
X--- 611,617 ----
X * code found in pri.c). It is assumed that the background color is black.
X */
X /* terminfo indexes for the basic colors it guarantees */
X! #define COLOR_BLACK 1 /* fake out to avoid black on black */
X #define COLOR_BLUE 1
X #define COLOR_GREEN 2
X #define COLOR_CYAN 3
X***************
X*** 611,633 ****
X static void
X init_hilite()
X {
X- int erret;
X- char *setf, *scratch;
X register int c;
X! extern int setupterm();
X! extern char *tparm(), *tigetstr();
X
X! for (c = 0; c < SIZE(HI_COLOR); c++)
X! HI_COLOR[c] = HI;
X
X! if (tgetnum("Co") < 8 || (setf = tgetstr("Sf", 0)) == (char *)NULL)
X return;
X
X! for (c = 0; c < SIZE(HI_COLOR); c++) {
X! scratch = tparm(setf, ti_map[c]);
X! HI_COLOR[c] = (char *)alloc(strlen(scratch) + 1);
X! Strcpy(HI_COLOR[c], scratch);
X }
X }
X
X # else /* UNIX */
X--- 628,655 ----
X static void
X init_hilite()
X {
X register int c;
X! # ifdef TERMINFO
X! char *setf, *scratch;
X! extern char *tparm();
X! # endif
X
X! for (c = 0; c < MAXCOLORS; c++)
X! hilites[c] = HI;
X
X! # ifdef TERMINFO
X! if (tgetnum("Co") < 8 || (setf = tgetstr("Sf", 0)) == NULL)
X return;
X
X! for (c = 0; c < MAXCOLORS / 2; c++) {
X! scratch = tparm(setf, ti_map[c]);
X! hilites[c] = (char *) alloc(strlen(scratch) + 1);
X! hilites[c+BRIGHT] = (char*) alloc(strlen(scratch)+strlen(MD)+1);
X! Strcpy(hilites[c], scratch);
X! Strcpy(hilites[c+BRIGHT], MD);
X! Strcat(hilites[c+BRIGHT], scratch);
X }
X+ # endif
X }
X
X # else /* UNIX */
X***************
X*** 644,652 ****
X int backg = BLACK, foreg = WHITE, len;
X register int c, color;
X
X! for (c = 0; c < SIZE(HI_COLOR); c++)
X! HI_COLOR[c] = HI;
X
X /* find the background color, HI[len] == 'm' */
X len = strlen(HI) - 1;
X
X--- 666,683 ----
X int backg = BLACK, foreg = WHITE, len;
X register int c, color;
X
X! for (c = 0; c < SIZE(hilites); c++)
X! hilites[c] = HI;
X
X+ # ifdef TOS
X+ hilites[RED] = hilites[BRIGHT+RED] = "\033b1";
X+ hilites[BLUE] = hilites[BRIGHT+BLUE] = "\033b2";
X+ hilites[CYAN] = hilites[BRIGHT+CYAN] = "\033b3\033c2";
X+ hilites[ORANGE_COLORED] = hilites[RED];
X+ hilites[WHITE] = hilites[GRAY] = "\033b3";
X+ hilites[MAGENTA] = hilites[BRIGHT+MAGENTA] = "\033b1\033c2";
X+ HE = "\033q\033b3\033c0"; /* to turn off the color stuff too */
X+ # else /* TOS */
X /* find the background color, HI[len] == 'm' */
X len = strlen(HI) - 1;
X
X***************
X*** 657,662 ****
X--- 688,697 ----
X if ((color = atoi(&HI[c])) == 0) {
X /* this also catches errors */
X foreg = WHITE; backg = BLACK;
X+ /*
X+ } else if (color == 1) {
X+ foreg |= BRIGHT;
X+ */
X } else if (color >= 30 && color <= 37) {
X foreg = color - 30;
X } else if (color >= 40 && color <= 47) {
X***************
X*** 666,679 ****
X c++;
X }
X
X! for (c = 0; c < SIZE(HI_COLOR); c++)
X /* avoid invisibility */
X if (foreg != c && backg != c) {
X! HI_COLOR[c] = (char *) alloc(sizeof("E[0;33;44;54m"));
X! Sprintf(HI_COLOR[c], "\033[%d;3%d;4%dm",
X! c == BLACK ? NONE : HILITE_ATTRIB,
X! c, backg);
X }
X }
X # endif /* UNIX */
X #endif /* TEXTCOLOR */
X--- 701,715 ----
X c++;
X }
X
X! for (c = 0; c < MAXCOLORS / 2; c++)
X /* avoid invisibility */
X if (foreg != c && backg != c) {
X! hilites[c] = (char *) alloc(sizeof("\033[0;3%d;4%dm"));
X! hilites[c+BRIGHT] = (char *) alloc(sizeof("\033[1;3%d;4%dm"));
X! Sprintf(hilites[c], "\033[0;3%d;4%dm", c, backg);
X! Sprintf(hilites[c+BRIGHT], "\033[1;3%d;4%dm", c, backg);
X }
X+ # endif /* TOS */
X }
X # endif /* UNIX */
X #endif /* TEXTCOLOR */
X*** src/Old/timeout.c Wed Sep 27 12:20:47 1989
X--- src/timeout.c Tue Sep 26 12:59:23 1989
X***************
X*** 29,35 ****
X "You find it hard to breathe.",
X "You're gasping for air.",
X "You can no longer breathe.",
X! "You're turning blue.",
X "You suffocate."
X };
X
X--- 29,35 ----
X "You find it hard to breathe.",
X "You're gasping for air.",
X "You can no longer breathe.",
X! "You're turning %s.",
X "You suffocate."
X };
X
X***************
X*** 39,45 ****
X register long i = (Strangled & TIMEOUT);
X
X if(i > 0 && i <= SIZE(choke_texts))
X! pline(choke_texts[SIZE(choke_texts) - i]);
X }
X
X void
X--- 39,46 ----
X register long i = (Strangled & TIMEOUT);
X
X if(i > 0 && i <= SIZE(choke_texts))
X! pline(choke_texts[SIZE(choke_texts) - i], Hallucination ?
X! hcolor() : blue);
X }
X
X void
X***************
X*** 77,83 ****
X if(upp->p_tofn) (*upp->p_tofn)();
X else switch(upp - u.uprops){
X case STONED:
X! killer = "cockatrice";
X done(STONING);
X break;
X case SICK:
X--- 78,84 ----
X if(upp->p_tofn) (*upp->p_tofn)();
X else switch(upp - u.uprops){
X case STONED:
X! if (!killer) killer = "cockatrice";
X done(STONING);
X break;
X case SICK:
X***************
X*** 171,182 ****
X int yours = otmp->spe;
X #endif
X
X! if(moves-otmp->age > 200) /* very old egg - it's dead */
X otmp->corpsenm = -1;
X #ifdef LINT /* long conv. ok */
X else if(rnd(150) > 150) {
X #else
X! else if(rnd((int)(moves-otmp->age)) > 150) {
X #endif
X mtmp = makemon(&mons[big_to_little(otmp->corpsenm)], u.ux, u.uy);
X useup(otmp);
X--- 172,183 ----
X int yours = otmp->spe;
X #endif
X
X! if(monstermoves-otmp->age > 200) /* very old egg - it's dead */
X otmp->corpsenm = -1;
X #ifdef LINT /* long conv. ok */
X else if(rnd(150) > 150) {
X #else
X! else if(rnd((int)(monstermoves-otmp->age)) > 150) {
X #endif
X mtmp = makemon(&mons[big_to_little(otmp->corpsenm)], u.ux, u.uy);
X useup(otmp);
X***************
X*** 202,208 ****
X }
X #endif
X if(mtmp->data->mlet == S_DRAGON) {
X! pline("\"Gleep!\""); /* Mything eggs :-) */
X (void) tamedog(mtmp, (struct obj *)0);
X }
X }
X--- 203,209 ----
X }
X #endif
X if(mtmp->data->mlet == S_DRAGON) {
X! verbalize("Gleep!"); /* Mything eggs :-) */
X (void) tamedog(mtmp, (struct obj *)0);
X }
X }
X
END_OF_FILE
if test 52224 -ne `wc -c <'patches04d'`; then
echo shar: \"'patches04d'\" unpacked with wrong size!
fi
# end of 'patches04d'
fi
echo shar: End of archive 4 \(of 11\).
cp /dev/null ark4isdone
MISSING=""
for I in 1 2 3 4 5 6 7 8 9 10 11 ; do
if test ! -f ark${I}isdone ; then
MISSING="${MISSING} ${I}"
fi
done
if test "${MISSING}" = "" ; then
echo You have unpacked all 11 archives.
rm -f ark[1-9]isdone ark[1-9][0-9]isdone
else
echo You still need to unpack the following archives:
echo " " ${MISSING}
fi
## End of shell archive.
exit 0