summaryrefslogtreecommitdiff
path: root/games
diff options
context:
space:
mode:
Diffstat (limited to 'games')
-rw-r--r--games/larn/Makefile14
-rw-r--r--games/larn/bill.c54
-rw-r--r--games/larn/config.c45
-rw-r--r--games/larn/create.c873
-rw-r--r--games/larn/data.c1099
-rw-r--r--games/larn/diag.c496
-rw-r--r--games/larn/display.c870
-rw-r--r--games/larn/extern.h313
-rw-r--r--games/larn/fortune.c17
-rw-r--r--games/larn/global.c1298
-rw-r--r--games/larn/header.h338
-rw-r--r--games/larn/help.c136
-rw-r--r--games/larn/io.c1419
-rw-r--r--games/larn/main.c1774
-rw-r--r--games/larn/monster.c2735
-rw-r--r--games/larn/moreobj.c737
-rw-r--r--games/larn/movem.c645
-rw-r--r--games/larn/nap.c26
-rw-r--r--games/larn/object.c1934
-rw-r--r--games/larn/pathnames.h5
-rw-r--r--games/larn/regen.c245
-rw-r--r--games/larn/savelev.c74
-rw-r--r--games/larn/scores.c1180
-rw-r--r--games/larn/signal.c163
-rw-r--r--games/larn/store.c1286
-rw-r--r--games/larn/tok.c385
26 files changed, 10993 insertions, 7168 deletions
diff --git a/games/larn/Makefile b/games/larn/Makefile
index 542b5c89623..e8a181ad8e7 100644
--- a/games/larn/Makefile
+++ b/games/larn/Makefile
@@ -1,9 +1,11 @@
-# $OpenBSD: Makefile,v 1.6 1998/07/24 00:10:33 millert Exp $
+# $OpenBSD: Makefile,v 1.7 1998/09/15 05:12:30 pjanzen Exp $
# EXTRA
# Incorporates code to gather additional performance statistics
-# SYSV
-# Use system III/V (instead of V7) type ioctl calls
+# TERMIO
+# Use sysv termio
+# TERMIOS
+# Use posix termios
# BSD
# Use BSD specific features (mostly timer and signal stuff)
# BSD4.1
@@ -53,12 +55,12 @@
PROG= larn
MAN= larn.6
-CFLAGS+=-DBSD -DVER=12 -DSUBVER=0 -DNONAP -DUIDSCORE
+CFLAGS=-DBSD -DVER=12 -DSUBVER=0 -DNONAP -DUIDSCORE -DTERMIOS
SRCS= main.c object.c create.c tok.c display.c global.c data.c io.c \
monster.c store.c diag.c help.c config.c nap.c bill.c scores.c \
signal.c moreobj.c movem.c regen.c fortune.c savelev.c
-DPADD= ${LIBCURSES} ${LIBCOMPAT}
-LDADD= -lcurses -lcompat
+DPADD= ${LIBCURSES}
+LDADD= -lcurses
HIDEGAME=hidegame
beforeinstall:
diff --git a/games/larn/bill.c b/games/larn/bill.c
index 324de485da6..63960d50b49 100644
--- a/games/larn/bill.c
+++ b/games/larn/bill.c
@@ -1,4 +1,5 @@
-/* $NetBSD: bill.c,v 1.3.6.1 1996/05/27 15:54:11 mrg Exp $ */
+/* $OpenBSD: bill.c,v 1.3 1998/09/15 05:12:31 pjanzen Exp $ */
+/* $NetBSD: bill.c,v 1.5 1997/10/18 20:03:06 christos Exp $ */
/*-
* Copyright (c) 1991 The Regents of the University of California.
@@ -37,7 +38,7 @@
#if 0
static char sccsid[] = "@(#)bill.c 5.2 (Berkeley) 5/28/91";
#else
-static char rcsid[] = "$NetBSD: bill.c,v 1.3.6.1 1996/05/27 15:54:11 mrg Exp $";
+static char rcsid[] = "$OpenBSD: bill.c,v 1.3 1998/09/15 05:12:31 pjanzen Exp $";
#endif
#endif /* not lint */
@@ -48,29 +49,30 @@ static char rcsid[] = "$NetBSD: bill.c,v 1.3.6.1 1996/05/27 15:54:11 mrg Exp $";
#include <stdio.h>
#include <unistd.h>
#include "header.h"
+#include "extern.h"
/* bill.c Larn is copyrighted 1986 by Noah Morgan. */
char *mail[] = {
- "From: the LRS (Larn Revenue Service)\n",
- "~s undeclared income\n",
- "\n We have heard you survived the caverns of Larn. Let me be the",
+ "From: The LRS (Larn Revenue Service)\n",
+ "~s Undeclared Income\n",
+ "\n We have heard you survived the caverns of Larn. Let us be the",
"\nfirst to congratulate you on your success. It was quite a feat.",
"\nIt was also very profitable for you...",
"\n\n The Dungeon Master has informed us that you brought",
"1",
- "\ncounty of Larn is in dire need of funds, we have spared no time",
+ "\ncounty of Larn is in dire need of funds, we have wasted no time",
"2",
- "\nof this notice, and is due within 5 days. Failure to pay will",
- "\nmean penalties. Once again, congratulations, We look forward",
+ "\nof this notice, due within 5 days. Failure to pay will",
+ "\nmean penalties. Once again, congratulations. We look forward",
"\nto your future successful expeditions.\n",
NULL,
"From: His Majesty King Wilfred of Larndom\n",
- "~s a noble deed\n",
+ "~s A Noble Deed\n",
"\n I have heard of your magnificent feat, and I, King Wilfred,",
"\nforthwith declare today to be a national holiday. Furthermore,",
- "\nhence three days, ye be invited to the castle to receive the",
- "\nhonour of Knight of the realm. Upon thy name shall it be written...",
+ "\nthree days hence be ye invited to the castle to receive the",
+ "\nhonour of Knight of the Realm. Upon thy name shall it be written...",
"\n\nBravery and courage be yours.",
"\n\nMay you live in happiness forevermore...\n",
NULL,
@@ -78,22 +80,22 @@ char *mail[] = {
"~s You Bastard!\n",
"\n I have heard (from sources) of your journey. Congratulations!",
"\nYou Bastard! With several attempts I have yet to endure the",
- " caves,\nand you, a nobody, makes the journey! From this time",
- " onward, bewarned\nupon our meeting you shall pay the price!\n",
+ " caves,\nand you, a nobody, make the journey! From this time",
+ " onward, bewarned -- \nupon our meeting you shall pay the price!\n",
NULL,
"From: Mainair, Duke of Larnty\n",
"~s High Praise\n",
"\n With certainty, a hero I declare to be amongst us! A nod of",
"\nfavour I send to thee. Me thinks Count Endelford this day of",
"\nright breath'eth fire as of dragon of whom ye are slayer. I",
- "\nyearn to behold his anger and jealously. Should ye choose to",
+ "\nyearn to behold his anger and jealousy. Should ye choose to",
"\nunleash some of thy wealth upon those who be unfortunate, I,",
"\nDuke Mainair, shall equal thy gift also.\n",
NULL,
"From: St. Mary's Children's Home\n",
"~s these poor children\n",
"\n News of your great conquests has spread to all of Larndom.",
- "\nMight I have a moment of a great adventurers's time? We here at",
+ "\nMight I have a moment of a great adventurer's time? We here at",
"\nSt. Mary's Children's Home are very poor, and many children are",
"\nstarving. Disease is widespread and very often fatal without",
"\ngood food. Could you possibly find it in your heart to help us",
@@ -116,17 +118,17 @@ char *mail[] = {
};
/*
- * function to mail the letters to the player if a winner
+ * function to mail the letters to the player if a winner
*/
void
mailbill()
{
- register int i;
- char fname[32];
- char buf[128];
- char **cp;
- int fd;
+ int i;
+ char fname[32];
+ char buf[128];
+ char **cp;
+ int fd;
wait(0);
if (fork() == 0) {
@@ -135,15 +137,15 @@ mailbill()
sprintf(fname, "/tmp/#%dlarnmail", getpid());
for (i = 0; i < 6; i++) {
if ((fd = open(fname, O_WRONLY | O_TRUNC | O_CREAT,
- 0666)) == -1)
+ 0666)) == -1)
exit(0);
while (*cp != NULL) {
if (*cp[0] == '1') {
- sprintf(buf, "\n%d gold pieces back with you from your journey. As the",
- (long)c[GOLD]);
+ sprintf(buf, "\n%ld gold pieces back with you from your journey. As the",
+ (long) c[GOLD]);
write(fd, buf, strlen(buf));
} else if (*cp[0] == '2') {
- sprintf(buf, "\nin preparing your tax bill. You owe %d gold pieces as", (long)c[GOLD]*TAXRATE);
+ sprintf(buf, "\nin preparing your tax bill. You owe %ld gold pieces as", (long) c[GOLD] * TAXRATE);
write(fd, buf, strlen(buf));
} else
write(fd, *cp, strlen(*cp));
@@ -153,7 +155,7 @@ mailbill()
close(fd);
sprintf(buf, "mail -I %s < %s > /dev/null",
- loginname, fname);
+ loginname, fname);
system(buf);
unlink(fname);
}
diff --git a/games/larn/config.c b/games/larn/config.c
index 54f3f4d4ca7..77c680cff51 100644
--- a/games/larn/config.c
+++ b/games/larn/config.c
@@ -1,48 +1,51 @@
-#ifndef lint
-static char rcsid[] = "$NetBSD: config.c,v 1.4 1995/04/22 07:34:04 cgd Exp $";
-#endif /* not lint */
+/* $OpenBSD: config.c,v 1.3 1998/09/15 05:12:31 pjanzen Exp $ */
+/* $NetBSD: config.c,v 1.5 1997/10/18 20:03:08 christos Exp $ */
/*
- * config.c -- This defines the installation dependent variables.
- * Some strings are modified later. ANSI C would
- * allow compile time string concatenation, we must
- * do runtime concatenation, in main.
+ * config.c -- This defines the installation dependent variables.
+ * Some strings are modified later. ANSI C would
+ * allow compile time string concatenation; we must
+ * do runtime concatenation, in main.
*
* Larn is copyrighted 1986 by Noah Morgan.
*/
+#include <sys/cdefs.h>
+#ifndef lint
+static char rcsid[] = "$OpenBSD: config.c,v 1.3 1998/09/15 05:12:31 pjanzen Exp $";
+#endif /* not lint */
+
#include "header.h"
#include "pathnames.h"
/*
- * All these strings will be appended to in main() to be complete filenames
+ * All these strings will be appended to in main() to be complete filenames
*/
/* the game save filename */
-char savefilename[1024];
+char savefilename[1024];
/* the logging file */
-char logfile[] = _PATH_LOG;
+char logfile[] = _PATH_LOG;
/* the help text file */
-char helpfile[] = _PATH_HELP;
+char helpfile[] = _PATH_HELP;
/* the score file */
-char scorefile[] = _PATH_SCORE;
+char scorefile[] = _PATH_SCORE;
/* the maze data file */
-char larnlevels[] = _PATH_LEVELS;
+char larnlevels[] = _PATH_LEVELS;
/* the .larnopts filename */
-char optsfile[1024] ="/.larnopts";
+char optsfile[1024] = "/.larnopts";
/* the player id datafile name */
-char playerids[] = _PATH_PLAYERIDS;
+char playerids[] = _PATH_PLAYERIDS;
-char diagfile[] ="Diagfile"; /* the diagnostic filename */
-char ckpfile[] ="Larn12.0.ckp"; /* the checkpoint filename */
-char *password ="pvnert(x)"; /* the wizards password <=32 */
-char psname[PSNAMESIZE]="larn"; /* the process name */
+char diagfile[] = "Diagfile"; /* the diagnostic filename */
+char ckpfile[] = "Larn12.0.ckp"; /* the checkpoint filename */
+char *password = "pvnert(x)"; /* the wizards password <=32 */
+char psname[PSNAMESIZE] = "larn"; /* the process name */
#define WIZID 1
-int wisid=0; /* the user id of the only person who can be wizard */
-
+int wisid = 0; /* the user id of the only person who can be wizard */
diff --git a/games/larn/create.c b/games/larn/create.c
index 9b926bf1a04..2ec0c2e94dc 100644
--- a/games/larn/create.c
+++ b/games/larn/create.c
@@ -1,468 +1,615 @@
+/* $OpenBSD: create.c,v 1.4 1998/09/15 05:12:31 pjanzen Exp $ */
+/* $NetBSD: create.c,v 1.6 1997/10/18 20:03:09 christos Exp $ */
+
+/* create.c Larn is copyrighted 1986 by Noah Morgan. */
+
#ifndef lint
-static char rcsid[] = "$NetBSD: create.c,v 1.3 1995/03/23 08:33:14 cgd Exp $";
-#endif /* not lint */
+static char rcsid[] = "$OpenBSD: create.c,v 1.4 1998/09/15 05:12:31 pjanzen Exp $";
+#endif /* not lint */
-/* create.c Larn is copyrighted 1986 by Noah Morgan. */
#include "header.h"
-extern char spelknow[],larnlevels[];
-extern char beenhere[],wizard;
-extern short level;
-extern short oldx,oldy;
-/*
- makeplayer()
+#include "extern.h"
+#include <unistd.h>
+static void fillroom __P((int, int));
- subroutine to create the player and the players attributes
- this is called at the beginning of a game and at no other time
+/*
+ * makeplayer()
+ *
+ * subroutine to create the player and the players attributes
+ * this is called at the beginning of a game and at no other time
*/
+void
makeplayer()
- {
- register int i;
- scbr(); clear();
- c[HPMAX]=c[HP]=10; /* start player off with 15 hit points */
- c[LEVEL]=1; /* player starts at level one */
- c[SPELLMAX]=c[SPELLS]=1; /* total # spells starts off as 3 */
- c[REGENCOUNTER]=16; c[ECOUNTER]=96; /*start regeneration correctly*/
+{
+ int i;
+
+ scbr();
+ clear();
+ c[HPMAX] = c[HP] = 10; /* start player off with 15 hit points */
+ c[LEVEL] = 1; /* player starts at level one */
+ c[SPELLMAX] = c[SPELLS] = 1; /* total # spells starts off as 3 */
+ c[REGENCOUNTER] = 16;
+ c[ECOUNTER] = 96; /* start regeneration correctly */
c[SHIELD] = c[WEAR] = c[WIELD] = -1;
- for (i=0; i<26; i++) iven[i]=0;
- spelknow[0]=spelknow[1]=1; /*he knows protection, magic missile*/
- if (c[HARDGAME]<=0)
- {
- iven[0]=OLEATHER; iven[1]=ODAGGER;
- ivenarg[1]=ivenarg[0]=c[WEAR]=0; c[WIELD]=1;
- }
- playerx=rnd(MAXX-2); playery=rnd(MAXY-2);
- oldx=0; oldy=25;
- gltime=0; /* time clock starts at zero */
+ for (i = 0; i < 26; i++)
+ iven[i] = 0;
+ spelknow[0] = spelknow[1] = 1; /* he knows protection, magic missile */
+ if (c[HARDGAME] <= 0) {
+ iven[0] = OLEATHER;
+ iven[1] = ODAGGER;
+ ivenarg[1] = ivenarg[0] = c[WEAR] = 0;
+ c[WIELD] = 1;
+ }
+ playerx = rnd(MAXX - 2);
+ playery = rnd(MAXY - 2);
+ oldx = 0;
+ oldy = 25;
+ gltime = 0; /* time clock starts at zero */
cbak[SPELLS] = -50;
- for (i=0; i<6; i++) c[i]=12; /* make the attributes, ie str, int, etc. */
+ for (i = 0; i < 6; i++)
+ c[i] = 12; /* make the attributes, ie str, int, etc. */
recalc();
- }
-
+}
+
+
/*
- newcavelevel(level)
- int level;
-
- function to enter a new level. This routine must be called anytime the
- player changes levels. If that level is unknown it will be created.
- A new set of monsters will be created for a new level, and existing
- levels will get a few more monsters.
- Note that it is here we remove genocided monsters from the present level.
+ * newcavelevel(level)
+ * int level;
+ *
+ * function to enter a new level. This routine must be called anytime the
+ * player changes levels. If that level is unknown it will be created.
+ * A new set of monsters will be created for a new level, and existing
+ * levels will get a few more monsters.
+ * Note that it is here we remove genocided monsters from the present level.
*/
+void
newcavelevel(x)
- register int x;
- {
- register int i,j;
- if (beenhere[level]) savelevel(); /* put the level back into storage */
- level = x; /* get the new level and put in working storage */
- if (beenhere[x]==0) for (i=0; i<MAXY; i++) for (j=0; j<MAXX; j++) know[j][i]=mitem[j][i]=0;
- else { getlevel(); sethp(0); goto chgn; }
- makemaze(x); makeobject(x); beenhere[x]=1; sethp(1);
+ int x;
+{
+ int i, j;
+
+ if (beenhere[level])
+ savelevel(); /* put the level back into storage */
+ level = x; /* get the new level and put in working
+ * storage */
+ if (beenhere[x] == 0)
+ for (i = 0; i < MAXY; i++)
+ for (j = 0; j < MAXX; j++)
+ know[j][i] = mitem[j][i] = 0;
+ else {
+ getlevel();
+ sethp(0);
+ goto chgn;
+ }
+ makemaze(x);
+ makeobject(x);
+ beenhere[x] = 1;
+ sethp(1);
#if WIZID
- if (wizard || x==0)
+ if (wizard || x == 0)
#else
- if (x==0)
+ if (x == 0)
#endif
- for (j=0; j<MAXY; j++)
- for (i=0; i<MAXX; i++)
- know[i][j]=1;
-chgn: checkgen(); /* wipe out any genocided monsters */
- }
+ for (j = 0; j < MAXY; j++)
+ for (i = 0; i < MAXX; i++)
+ know[i][j] = 1;
+chgn: checkgen(); /* wipe out any genocided monsters */
+}
/*
- makemaze(level)
- int level;
-
- subroutine to make the caverns for a given level. only walls are made.
+ * makemaze(level)
+ * int level;
+ *
+ * subroutine to make the caverns for a given level. only walls are made.
*/
-static int mx,mxl,mxh,my,myl,myh,tmp2;
- makemaze(k)
- int k;
- {
- register int i,j,tmp;
- int z;
- if (k > 1 && (rnd(17)<=4 || k==MAXLEVEL-1 || k==MAXLEVEL+MAXVLEVEL-1))
- {
- if (cannedlevel(k)); return; /* read maze from data file */
- }
- if (k==0) tmp=0; else tmp=OWALL;
- for (i=0; i<MAXY; i++) for (j=0; j<MAXX; j++) item[j][i]=tmp;
- if (k==0) return; eat(1,1);
- if (k==1) item[33][MAXY-1]=0; /* exit from dungeon */
-
-/* now for open spaces -- not on level 10 */
- if (k != MAXLEVEL-1)
- {
- tmp2 = rnd(3)+3;
- for (tmp=0; tmp<tmp2; tmp++)
- {
- my = rnd(11)+2; myl = my - rnd(2); myh = my + rnd(2);
- if (k < MAXLEVEL)
- {
- mx = rnd(44)+5; mxl = mx - rnd(4); mxh = mx + rnd(12)+3;
- z=0;
- }
- else
- {
- mx = rnd(60)+3; mxl = mx - rnd(2); mxh = mx + rnd(2);
+static int mx, mxl, mxh, my, myl, myh, tmp2;
+void
+makemaze(k)
+ int k;
+{
+ int i, j, tmp;
+ int z;
+
+ if (k > 1 && (rnd(17) <= 4 || k == MAXLEVEL - 1 || k == MAXLEVEL + MAXVLEVEL - 1)) {
+ if (cannedlevel(k));
+ return; /* read maze from data file */
+ }
+ if (k == 0)
+ tmp = 0;
+ else
+ tmp = OWALL;
+ for (i = 0; i < MAXY; i++)
+ for (j = 0; j < MAXX; j++)
+ item[j][i] = tmp;
+ if (k == 0)
+ return;
+ eat(1, 1);
+ if (k == 1)
+ item[33][MAXY - 1] = 0; /* exit from dungeon */
+
+ /* now for open spaces -- not on level 10 */
+ if (k != MAXLEVEL - 1) {
+ tmp2 = rnd(3) + 3;
+ for (tmp = 0; tmp < tmp2; tmp++) {
+ my = rnd(11) + 2;
+ myl = my - rnd(2);
+ myh = my + rnd(2);
+ if (k < MAXLEVEL) {
+ mx = rnd(44) + 5;
+ mxl = mx - rnd(4);
+ mxh = mx + rnd(12) + 3;
+ z = 0;
+ } else {
+ mx = rnd(60) + 3;
+ mxl = mx - rnd(2);
+ mxh = mx + rnd(2);
z = makemonst(k);
- }
- for (i=mxl; i<mxh; i++) for (j=myl; j<myh; j++)
- { item[i][j]=0;
- if ((mitem[i][j]=z)) hitp[i][j]=monster[z].hitpoints;
- }
}
+ for (i = mxl; i < mxh; i++)
+ for (j = myl; j < myh; j++) {
+ item[i][j] = 0;
+ if ((mitem[i][j] = z))
+ hitp[i][j] = monster[z].hitpoints;
+ }
}
- if (k!=MAXLEVEL-1) { my=rnd(MAXY-2); for (i=1; i<MAXX-1; i++) item[i][my] = 0; }
- if (k>1) treasureroom(k);
}
+ if (k != MAXLEVEL - 1) {
+ my = rnd(MAXY - 2);
+ for (i = 1; i < MAXX - 1; i++)
+ item[i][my] = 0;
+ }
+ if (k > 1)
+ treasureroom(k);
+}
/*
- function to eat away a filled in maze
+ * function to eat away a filled in maze
*/
-eat(xx,yy)
- register int xx,yy;
- {
- register int dir,try;
- dir = rnd(4); try=2;
- while (try)
- {
- switch(dir)
- {
- case 1: if (xx <= 2) break; /* west */
- if ((item[xx-1][yy]!=OWALL) || (item[xx-2][yy]!=OWALL)) break;
- item[xx-1][yy] = item[xx-2][yy] = 0;
- eat(xx-2,yy); break;
-
- case 2: if (xx >= MAXX-3) break; /* east */
- if ((item[xx+1][yy]!=OWALL) || (item[xx+2][yy]!=OWALL)) break;
- item[xx+1][yy] = item[xx+2][yy] = 0;
- eat(xx+2,yy); break;
-
- case 3: if (yy <= 2) break; /* south */
- if ((item[xx][yy-1]!=OWALL) || (item[xx][yy-2]!=OWALL)) break;
- item[xx][yy-1] = item[xx][yy-2] = 0;
- eat(xx,yy-2); break;
-
- case 4: if (yy >= MAXY-3 ) break; /* north */
- if ((item[xx][yy+1]!=OWALL) || (item[xx][yy+2]!=OWALL)) break;
- item[xx][yy+1] = item[xx][yy+2] = 0;
- eat(xx,yy+2); break;
- };
- if (++dir > 4) { dir=1; --try; }
+void
+eat(xx, yy)
+ int xx, yy;
+{
+ int dir, try;
+
+ dir = rnd(4);
+ try = 2;
+ while (try) {
+ switch (dir) {
+ case 1:
+ if (xx <= 2)
+ break; /* west */
+ if ((item[xx - 1][yy] != OWALL) || (item[xx - 2][yy] != OWALL))
+ break;
+ item[xx - 1][yy] = item[xx - 2][yy] = 0;
+ eat(xx - 2, yy);
+ break;
+
+ case 2:
+ if (xx >= MAXX - 3)
+ break; /* east */
+ if ((item[xx + 1][yy] != OWALL) || (item[xx + 2][yy] != OWALL))
+ break;
+ item[xx + 1][yy] = item[xx + 2][yy] = 0;
+ eat(xx + 2, yy);
+ break;
+
+ case 3:
+ if (yy <= 2)
+ break; /* south */
+ if ((item[xx][yy - 1] != OWALL) || (item[xx][yy - 2] != OWALL))
+ break;
+ item[xx][yy - 1] = item[xx][yy - 2] = 0;
+ eat(xx, yy - 2);
+ break;
+
+ case 4:
+ if (yy >= MAXY - 3)
+ break; /* north */
+ if ((item[xx][yy + 1] != OWALL) || (item[xx][yy + 2] != OWALL))
+ break;
+ item[xx][yy + 1] = item[xx][yy + 2] = 0;
+ eat(xx, yy + 2);
+ break;
+ };
+ if (++dir > 4) {
+ dir = 1;
+ --try;
}
}
+}
/*
* function to read in a maze from a data file
*
* Format of maze data file: 1st character = # of mazes in file (ascii digit)
- * For each maze: 18 lines (1st 17 used) 67 characters per line
+ * For each maze: 18 lines (1st 17 used) 67 characters per line
*
* Special characters in maze data file:
*
- * # wall D door . random monster
- * ~ eye of larn ! cure dianthroritis
+ * # wall
+ * D door
+ * . random monster
+ * ~ eye of larn
+ * ! cure dianthroritis
* - random object
*/
+int
cannedlevel(k)
- int k;
- {
- char *row,*lgetl();
- register int i,j;
- int it,arg,mit,marg;
- if (lopen(larnlevels)<0)
- {
- write(1,"Can't open the maze data file\n",30); died(-282); return(0);
- }
- i=lgetc(); if (i<='0') { died(-282); return(0); }
- for (i=18*rund(i-'0'); i>0; i--) lgetl(); /* advance to desired maze */
- for (i=0; i<MAXY; i++)
- {
+ int k;
+{
+ char *row;
+ int i, j;
+ int it, arg, mit, marg;
+
+ if (lopen(larnlevels) < 0) {
+ write(1, "Can't open the maze data file\n", 30);
+ died(-282);
+ return (0);
+ }
+ i = lgetc();
+ if (i <= '0') {
+ died(-282);
+ return (0);
+ }
+ for (i = 18 * rund(i - '0'); i > 0; i--)
+ lgetl(); /* advance to desired maze */
+ for (i = 0; i < MAXY; i++) {
row = lgetl();
- for (j=0; j<MAXX; j++)
- {
+ for (j = 0; j < MAXX; j++) {
it = mit = arg = marg = 0;
- switch(*row++)
- {
- case '#': it = OWALL; break;
- case 'D': it = OCLOSEDDOOR; arg = rnd(30); break;
- case '~': if (k!=MAXLEVEL-1) break;
- it = OLARNEYE;
- mit = rund(8)+DEMONLORD;
- marg = monster[mit].hitpoints; break;
- case '!': if (k!=MAXLEVEL+MAXVLEVEL-1) break;
- it = OPOTION; arg = 21;
- mit = DEMONLORD+7;
- marg = monster[mit].hitpoints; break;
- case '.': if (k<MAXLEVEL) break;
- mit = makemonst(k+1);
- marg = monster[mit].hitpoints; break;
- case '-': it = newobject(k+1,&arg); break;
- };
- item[j][i] = it; iarg[j][i] = arg;
- mitem[j][i] = mit; hitp[j][i] = marg;
+ switch (*row++) {
+ case '#':
+ it = OWALL;
+ break;
+ case 'D':
+ it = OCLOSEDDOOR;
+ arg = rnd(30);
+ break;
+ case '~':
+ if (k != MAXLEVEL - 1)
+ break;
+ it = OLARNEYE;
+ mit = rund(8) + DEMONLORD;
+ marg = monster[mit].hitpoints;
+ break;
+ case '!':
+ if (k != MAXLEVEL + MAXVLEVEL - 1)
+ break;
+ it = OPOTION;
+ arg = 21;
+ mit = DEMONLORD + 7;
+ marg = monster[mit].hitpoints;
+ break;
+ case '.':
+ if (k < MAXLEVEL)
+ break;
+ mit = makemonst(k + 1);
+ marg = monster[mit].hitpoints;
+ break;
+ case '-':
+ it = newobject(k + 1, &arg);
+ break;
+ };
+ item[j][i] = it;
+ iarg[j][i] = arg;
+ mitem[j][i] = mit;
+ hitp[j][i] = marg;
#if WIZID
know[j][i] = (wizard) ? 1 : 0;
#else
know[j][i] = 0;
#endif
- }
}
- lrclose();
- return(1);
}
+ lrclose();
+ return (1);
+}
/*
- function to make a treasure room on a level
- level 10's treasure room has the eye in it and demon lords
- level V3 has potion of cure dianthroritis and demon prince
+ * function to make a treasure room on a level
+ * level 10's treasure room has the eye in it and demon lords
+ * level V3 has potion of cure dianthroritis and demon prince
*/
+void
treasureroom(lv)
- register int lv;
- {
- register int tx,ty,xsize,ysize;
-
- for (tx=1+rnd(10); tx<MAXX-10; tx+=10)
- if ( (lv==MAXLEVEL-1) || (lv==MAXLEVEL+MAXVLEVEL-1) || rnd(13)==2)
- {
- xsize = rnd(6)+3; ysize = rnd(3)+3;
- ty = rnd(MAXY-9)+1; /* upper left corner of room */
- if (lv==MAXLEVEL-1 || lv==MAXLEVEL+MAXVLEVEL-1)
- troom(lv,xsize,ysize,tx=tx+rnd(MAXX-24),ty,rnd(3)+6);
- else troom(lv,xsize,ysize,tx,ty,rnd(9));
+ int lv;
+{
+ int tx, ty, xsize, ysize;
+
+ for (tx = 1 + rnd(10); tx < MAXX - 10; tx += 10)
+ if ((lv == MAXLEVEL - 1) || (lv == MAXLEVEL + MAXVLEVEL - 1) || rnd(13) == 2) {
+ xsize = rnd(6) + 3;
+ ysize = rnd(3) + 3;
+ ty = rnd(MAXY - 9) + 1; /* upper left corner of room */
+ if (lv == MAXLEVEL - 1 || lv == MAXLEVEL + MAXVLEVEL - 1)
+ troom(lv, xsize, ysize, tx = tx + rnd(MAXX - 24), ty, rnd(3) + 6);
+ else
+ troom(lv, xsize, ysize, tx, ty, rnd(9));
}
- }
+}
/*
- * subroutine to create a treasure room of any size at a given location
- * room is filled with objects and monsters
+ * subroutine to create a treasure room of any size at a given location
+ * room is filled with objects and monsters
* the coordinate given is that of the upper left corner of the room
*/
-troom(lv,xsize,ysize,tx,ty,glyph)
- int lv,xsize,ysize,tx,ty,glyph;
- {
- register int i,j;
- int tp1,tp2;
- for (j=ty-1; j<=ty+ysize; j++)
- for (i=tx-1; i<=tx+xsize; i++) /* clear out space for room */
- item[i][j]=0;
- for (j=ty; j<ty+ysize; j++)
- for (i=tx; i<tx+xsize; i++) /* now put in the walls */
- {
- item[i][j]=OWALL; mitem[i][j]=0;
+void
+troom(lv, xsize, ysize, tx, ty, glyph)
+ int lv, xsize, ysize, tx, ty, glyph;
+{
+ int i, j;
+ int tp1, tp2;
+
+ for (j = ty - 1; j <= ty + ysize; j++)
+ for (i = tx - 1; i <= tx + xsize; i++) /* clear out space for
+ * room */
+ item[i][j] = 0;
+ for (j = ty; j < ty + ysize; j++)
+ for (i = tx; i < tx + xsize; i++) { /* now put in the walls */
+ item[i][j] = OWALL;
+ mitem[i][j] = 0;
+ }
+ for (j = ty + 1; j < ty + ysize - 1; j++)
+ for (i = tx + 1; i < tx + xsize - 1; i++) /* now clear out
+ * interior */
+ item[i][j] = 0;
+
+ switch (rnd(2)) { /* locate the door on the treasure room */
+ case 1:
+ item[i = tx + rund(xsize)][j = ty + (ysize - 1) * rund(2)] = OCLOSEDDOOR;
+ iarg[i][j] = glyph; /* on horizontal walls */
+ break;
+ case 2:
+ item[i = tx + (xsize - 1) * rund(2)][j = ty + rund(ysize)] = OCLOSEDDOOR;
+ iarg[i][j] = glyph; /* on vertical walls */
+ break;
+ };
+
+ tp1 = playerx;
+ tp2 = playery;
+ playery = ty + (ysize >> 1);
+ if (c[HARDGAME] < 2)
+ for (playerx = tx + 1; playerx <= tx + xsize - 2; playerx += 2)
+ for (i = 0, j = rnd(6); i <= j; i++) {
+ something(lv + 2);
+ createmonster(makemonst(lv + 1));
}
- for (j=ty+1; j<ty+ysize-1; j++)
- for (i=tx+1; i<tx+xsize-1; i++) /* now clear out interior */
- item[i][j]=0;
-
- switch(rnd(2)) /* locate the door on the treasure room */
- {
- case 1: item[i=tx+rund(xsize)][j=ty+(ysize-1)*rund(2)]=OCLOSEDDOOR;
- iarg[i][j] = glyph; /* on horizontal walls */
- break;
- case 2: item[i=tx+(xsize-1)*rund(2)][j=ty+rund(ysize)]=OCLOSEDDOOR;
- iarg[i][j] = glyph; /* on vertical walls */
- break;
- };
-
- tp1=playerx; tp2=playery; playery=ty+(ysize>>1);
- if (c[HARDGAME]<2)
- for (playerx=tx+1; playerx<=tx+xsize-2; playerx+=2)
- for (i=0, j=rnd(6); i<=j; i++)
- { something(lv+2); createmonster(makemonst(lv+1)); }
else
- for (playerx=tx+1; playerx<=tx+xsize-2; playerx+=2)
- for (i=0, j=rnd(4); i<=j; i++)
- { something(lv+2); createmonster(makemonst(lv+3)); }
+ for (playerx = tx + 1; playerx <= tx + xsize - 2; playerx += 2)
+ for (i = 0, j = rnd(4); i <= j; i++) {
+ something(lv + 2);
+ createmonster(makemonst(lv + 3));
+ }
+
+ playerx = tp1;
+ playery = tp2;
+}
- playerx=tp1; playery=tp2;
- }
-
-static void fillroom();
/*
- ***********
- MAKE_OBJECT
- ***********
- subroutine to create the objects in the maze for the given level
+ * ***********
+ * MAKE_OBJECT
+ * ***********
+ * subroutine to create the objects in the maze for the given level
*/
+void
makeobject(j)
- register int j;
- {
- register int i;
- if (j==0)
- {
- fillroom(OENTRANCE,0); /* entrance to dungeon */
- fillroom(ODNDSTORE,0); /* the DND STORE */
- fillroom(OSCHOOL,0); /* college of Larn */
- fillroom(OBANK,0); /* 1st national bank of larn */
- fillroom(OVOLDOWN,0); /* volcano shaft to temple */
- fillroom(OHOME,0); /* the players home & family */
- fillroom(OTRADEPOST,0); /* the trading post */
- fillroom(OLRS,0); /* the larn revenue service */
+ int j;
+{
+ int i;
+
+ if (j == 0) {
+ fillroom(OENTRANCE, 0); /* entrance to dungeon */
+ fillroom(ODNDSTORE, 0); /* the DND STORE */
+ fillroom(OSCHOOL, 0); /* college of Larn */
+ fillroom(OBANK, 0); /* 1st national bank of larn */
+ fillroom(OVOLDOWN, 0); /* volcano shaft to temple */
+ fillroom(OHOME, 0); /* the players home & family */
+ fillroom(OTRADEPOST, 0); /* the trading post */
+ fillroom(OLRS, 0); /* the larn revenue service */
return;
- }
-
- if (j==MAXLEVEL) fillroom(OVOLUP,0); /* volcano shaft up from the temple */
-
-/* make the fixed objects in the maze STAIRS */
- if ((j>0) && (j != MAXLEVEL-1) && (j != MAXLEVEL+MAXVLEVEL-1))
- fillroom(OSTAIRSDOWN,0);
- if ((j > 1) && (j != MAXLEVEL)) fillroom(OSTAIRSUP,0);
-
-/* make the random objects in the maze */
-
- fillmroom(rund(3),OBOOK,j); fillmroom(rund(3),OALTAR,0);
- fillmroom(rund(3),OSTATUE,0); fillmroom(rund(3),OPIT,0);
- fillmroom(rund(3),OFOUNTAIN,0); fillmroom( rnd(3)-2,OIVTELETRAP,0);
- fillmroom(rund(2),OTHRONE,0); fillmroom(rund(2),OMIRROR,0);
- fillmroom(rund(2),OTRAPARROWIV,0); fillmroom( rnd(3)-2,OIVDARTRAP,0);
- fillmroom(rund(3),OCOOKIE,0);
- if (j==1) fillmroom(1,OCHEST,j);
- else fillmroom(rund(2),OCHEST,j);
- if ((j != MAXLEVEL-1) && (j != MAXLEVEL+MAXVLEVEL-1))
- fillmroom(rund(2),OIVTRAPDOOR,0);
- if (j<=10)
- {
- fillmroom((rund(2)),ODIAMOND,rnd(10*j+1)+10);
- fillmroom(rund(2),ORUBY,rnd(6*j+1)+6);
- fillmroom(rund(2),OEMERALD,rnd(4*j+1)+4);
- fillmroom(rund(2),OSAPPHIRE,rnd(3*j+1)+2);
- }
- for (i=0; i<rnd(4)+3; i++)
- fillroom(OPOTION,newpotion()); /* make a POTION */
- for (i=0; i<rnd(5)+3; i++)
- fillroom(OSCROLL,newscroll()); /* make a SCROLL */
- for (i=0; i<rnd(12)+11; i++)
- fillroom(OGOLDPILE,12*rnd(j+1)+(j<<3)+10); /* make GOLD */
- if (j==5) fillroom(OBANK2,0); /* branch office of the bank */
- froom(2,ORING,0); /* a ring mail */
- froom(1,OSTUDLEATHER,0); /* a studded leather */
- froom(3,OSPLINT,0); /* a splint mail */
- froom(5,OSHIELD,rund(3)); /* a shield */
- froom(2,OBATTLEAXE,rund(3)); /* a battle axe */
- froom(5,OLONGSWORD,rund(3)); /* a long sword */
- froom(5,OFLAIL,rund(3)); /* a flail */
- froom(4,OREGENRING,rund(3)); /* ring of regeneration */
- froom(1,OPROTRING,rund(3)); /* ring of protection */
- froom(2,OSTRRING,4); /* ring of strength + 4 */
- froom(7,OSPEAR,rnd(5)); /* a spear */
- froom(3,OORBOFDRAGON,0); /* orb of dragon slaying*/
- froom(4,OSPIRITSCARAB,0); /*scarab of negate spirit*/
- froom(4,OCUBEofUNDEAD,0); /* cube of undead control */
- froom(2,ORINGOFEXTRA,0); /* ring of extra regen */
- froom(3,ONOTHEFT,0); /* device of antitheft */
- froom(2,OSWORDofSLASHING,0); /* sword of slashing */
- if (c[BESSMANN]==0)
- {
- froom(4,OHAMMER,0);/*Bessman's flailing hammer*/ c[BESSMANN]=1;
- }
- if (c[HARDGAME]<3 || (rnd(4)==3))
- {
- if (j>3)
- {
- froom(3,OSWORD,3); /* sunsword + 3 */
- froom(5,O2SWORD,rnd(4)); /* a two handed sword */
- froom(3,OBELT,4); /* belt of striking */
- froom(3,OENERGYRING,3); /* energy ring */
- froom(4,OPLATE,5); /* platemail + 5 */
- }
+ }
+ if (j == MAXLEVEL)
+ fillroom(OVOLUP, 0); /* volcano shaft up from the temple */
+
+ /* make the fixed objects in the maze STAIRS */
+ if ((j > 0) && (j != MAXLEVEL - 1) && (j != MAXLEVEL + MAXVLEVEL - 1))
+ fillroom(OSTAIRSDOWN, 0);
+ if ((j > 1) && (j != MAXLEVEL))
+ fillroom(OSTAIRSUP, 0);
+
+ /* make the random objects in the maze */
+
+ fillmroom(rund(3), OBOOK, j);
+ fillmroom(rund(3), OALTAR, 0);
+ fillmroom(rund(3), OSTATUE, 0);
+ fillmroom(rund(3), OPIT, 0);
+ fillmroom(rund(3), OFOUNTAIN, 0);
+ fillmroom(rnd(3) - 2, OIVTELETRAP, 0);
+ fillmroom(rund(2), OTHRONE, 0);
+ fillmroom(rund(2), OMIRROR, 0);
+ fillmroom(rund(2), OTRAPARROWIV, 0);
+ fillmroom(rnd(3) - 2, OIVDARTRAP, 0);
+ fillmroom(rund(3), OCOOKIE, 0);
+ if (j == 1)
+ fillmroom(1, OCHEST, j);
+ else
+ fillmroom(rund(2), OCHEST, j);
+ if ((j != MAXLEVEL - 1) && (j != MAXLEVEL + MAXVLEVEL - 1))
+ fillmroom(rund(2), OIVTRAPDOOR, 0);
+ if (j <= 10) {
+ fillmroom((rund(2)), ODIAMOND, rnd(10 * j + 1) + 10);
+ fillmroom(rund(2), ORUBY, rnd(6 * j + 1) + 6);
+ fillmroom(rund(2), OEMERALD, rnd(4 * j + 1) + 4);
+ fillmroom(rund(2), OSAPPHIRE, rnd(3 * j + 1) + 2);
+ }
+ for (i = 0; i < rnd(4) + 3; i++)
+ fillroom(OPOTION, newpotion()); /* make a POTION */
+ for (i = 0; i < rnd(5) + 3; i++)
+ fillroom(OSCROLL, newscroll()); /* make a SCROLL */
+ for (i = 0; i < rnd(12) + 11; i++)
+ fillroom(OGOLDPILE, 12 * rnd(j + 1) + (j << 3) + 10); /* make GOLD */
+ if (j == 5)
+ fillroom(OBANK2, 0); /* branch office of the bank */
+ froom(2, ORING, 0); /* a ring mail */
+ froom(1, OSTUDLEATHER, 0); /* a studded leather */
+ froom(3, OSPLINT, 0); /* a splint mail */
+ froom(5, OSHIELD, rund(3)); /* a shield */
+ froom(2, OBATTLEAXE, rund(3)); /* a battle axe */
+ froom(5, OLONGSWORD, rund(3)); /* a long sword */
+ froom(5, OFLAIL, rund(3)); /* a flail */
+ froom(4, OREGENRING, rund(3)); /* ring of regeneration */
+ froom(1, OPROTRING, rund(3)); /* ring of protection */
+ froom(2, OSTRRING, 4); /* ring of strength + 4 */
+ froom(7, OSPEAR, rnd(5)); /* a spear */
+ froom(3, OORBOFDRAGON, 0); /* orb of dragon slaying */
+ froom(4, OSPIRITSCARAB, 0); /* scarab of negate spirit */
+ froom(4, OCUBEofUNDEAD, 0); /* cube of undead control */
+ froom(2, ORINGOFEXTRA, 0); /* ring of extra regen */
+ froom(3, ONOTHEFT, 0); /* device of antitheft */
+ froom(2, OSWORDofSLASHING, 0); /* sword of slashing */
+ if (c[BESSMANN] == 0) {
+ froom(4, OHAMMER, 0); /* Bessman's flailing hammer */
+ c[BESSMANN] = 1;
+ }
+ if (c[HARDGAME] < 3 || (rnd(4) == 3)) {
+ if (j > 3) {
+ froom(3, OSWORD, 3); /* sunsword + 3 */
+ froom(5, O2SWORD, rnd(4)); /* a two handed sword */
+ froom(3, OBELT, 4); /* belt of striking */
+ froom(3, OENERGYRING, 3); /* energy ring */
+ froom(4, OPLATE, 5); /* platemail + 5 */
}
}
+}
/*
- subroutine to fill in a number of objects of the same kind
+ * subroutine to fill in a number of objects of the same kind
*/
-fillmroom(n,what,arg)
- int n,arg;
- char what;
- {
- register int i;
- for (i=0; i<n; i++) fillroom(what,arg);
- }
-froom(n,itm,arg)
- int n,arg;
- char itm;
- { if (rnd(151) < n) fillroom(itm,arg); }
+void
+fillmroom(n, what, arg)
+ int n, arg;
+ char what;
+{
+ int i;
+
+ for (i = 0; i < n; i++)
+ fillroom(what, arg);
+}
+
+void
+froom(n, itm, arg)
+ int n, arg;
+ char itm;
+{
+ if (rnd(151) < n)
+ fillroom(itm, arg);
+}
/*
- subroutine to put an object into an empty room
+ * subroutine to put an object into an empty room
* uses a random walk
*/
static void
-fillroom(what,arg)
- int arg;
- char what;
- {
- register int x,y;
+fillroom(what, arg)
+ int arg;
+ char what;
+{
+ int x, y;
#ifdef EXTRA
c[FILLROOM]++;
#endif
- x=rnd(MAXX-2); y=rnd(MAXY-2);
- while (item[x][y])
- {
+ x = rnd(MAXX - 2);
+ y = rnd(MAXY - 2);
+ while (item[x][y]) {
#ifdef EXTRA
- c[RANDOMWALK]++; /* count up these random walks */
+ c[RANDOMWALK]++;/* count up these random walks */
#endif
- x += rnd(3)-2; y += rnd(3)-2;
- if (x > MAXX-2) x=1; if (x < 1) x=MAXX-2;
- if (y > MAXY-2) y=1; if (y < 1) y=MAXY-2;
- }
- item[x][y]=what; iarg[x][y]=arg;
+ x += rnd(3) - 2;
+ y += rnd(3) - 2;
+ if (x > MAXX - 2)
+ x = 1;
+ if (x < 1)
+ x = MAXX - 2;
+ if (y > MAXY - 2)
+ y = 1;
+ if (y < 1)
+ y = MAXY - 2;
}
+ item[x][y] = what;
+ iarg[x][y] = arg;
+}
/*
- subroutine to put monsters into an empty room without walls or other
- monsters
+ * subroutine to put monsters into an empty room without walls or other
+ * monsters
*/
+int
fillmonst(what)
- char what;
- {
- register int x,y,trys;
- for (trys=5; trys>0; --trys) /* max # of creation attempts */
- {
- x=rnd(MAXX-2); y=rnd(MAXY-2);
- if ((item[x][y]==0) && (mitem[x][y]==0) && ((playerx!=x) || (playery!=y)))
- {
- mitem[x][y] = what; know[x][y]=0;
- hitp[x][y] = monster[what].hitpoints; return(0);
+ int what;
+{
+ int x, y, trys;
+
+ for (trys = 5; trys > 0; --trys) { /* max # of creation attempts */
+ x = rnd(MAXX - 2);
+ y = rnd(MAXY - 2);
+ if ((item[x][y] == 0) && (mitem[x][y] == 0) && ((playerx != x) || (playery != y))) {
+ mitem[x][y] = what;
+ know[x][y] = 0;
+ hitp[x][y] = monster[what].hitpoints;
+ return (0);
}
- }
- return(-1); /* creation failure */
}
+ return (-1); /* creation failure */
+}
/*
- creates an entire set of monsters for a level
- must be done when entering a new level
- if sethp(1) then wipe out old monsters else leave them there
+ * creates an entire set of monsters for a level
+ * must be done when entering a new level
+ * if sethp(1) then wipe out old monsters else leave them there
*/
+void
sethp(flg)
- int flg;
- {
- register int i,j;
- if (flg) for (i=0; i<MAXY; i++) for (j=0; j<MAXX; j++) stealth[j][i]=0;
- if (level==0) { c[TELEFLAG]=0; return; } /* if teleported and found level 1 then know level we are on */
- if (flg) j = rnd(12) + 2 + (level>>1); else j = (level>>1) + 1;
- for (i=0; i<j; i++) fillmonst(makemonst(level));
+ int flg;
+{
+ int i, j;
+
+ if (flg)
+ for (i = 0; i < MAXY; i++)
+ for (j = 0; j < MAXX; j++)
+ stealth[j][i] = 0;
+ if (level == 0) {
+ c[TELEFLAG] = 0;
+ return;
+ } /* if teleported and found level 1 then know
+ * level we are on */
+ if (flg)
+ j = rnd(12) + 2 + (level >> 1);
+ else
+ j = (level >> 1) + 1;
+ for (i = 0; i < j; i++)
+ fillmonst(makemonst(level));
positionplayer();
- }
+}
/*
* Function to destroy all genocided monsters on the present level
*/
+void
checkgen()
- {
- register int x,y;
- for (y=0; y<MAXY; y++)
- for (x=0; x<MAXX; x++)
+{
+ int x, y;
+
+ for (y = 0; y < MAXY; y++)
+ for (x = 0; x < MAXX; x++)
if (monster[mitem[x][y]].genocided)
- mitem[x][y]=0; /* no more monster */
- }
+ mitem[x][y] = 0; /* no more monster */
+}
diff --git a/games/larn/data.c b/games/larn/data.c
index e840085d987..d3362fd8aa7 100644
--- a/games/larn/data.c
+++ b/games/larn/data.c
@@ -1,4 +1,5 @@
-/* $NetBSD: data.c,v 1.5 1995/03/23 08:33:17 cgd Exp $ */
+/* $OpenBSD: data.c,v 1.5 1998/09/15 05:12:31 pjanzen Exp $ */
+/* $NetBSD: data.c,v 1.9 1997/10/25 01:40:47 thorpej Exp $ */
/*-
* Copyright (c) 1988 The Regents of the University of California.
@@ -35,63 +36,65 @@
#ifndef lint
#if 0
-static char sccsid[] = "@(#)data.c 5.3 (Berkeley) 5/13/91";
+static char sccsid[] = "@(#)data.c 5.3 (Berkeley) 5/13/91";
#else
-static char rcsid[] = "$NetBSD: data.c,v 1.5 1995/03/23 08:33:17 cgd Exp $";
+static char rcsid[] = "$OpenBSD: data.c,v 1.5 1998/09/15 05:12:31 pjanzen Exp $";
#endif
#endif /* not lint */
-/* data.c Larn is copyrighted 1986 by Noah Morgan. */
-#define NODEFS
+/* data.c Larn is copyrighted 1986 by Noah Morgan. */
+/* #define NODEFS */
#include "header.h"
+#include "extern.h"
/*
class[c[LEVEL]-1] gives the correct name of the players experience level
*/
-static char aa1[] = " mighty evil master";
-static char aa2[] = "apprentice demi-god";
-static char aa3[] = " minor demi-god ";
-static char aa4[] = " major demi-god ";
-static char aa5[] = " minor deity ";
-static char aa6[] = " major deity ";
-static char aa7[] = " novice guardian ";
-static char aa8[] = "apprentice guardian";
-static char aa9[] = " The Creator ";
-char *class[]=
-{ " novice explorer ", "apprentice explorer", " practiced explorer",/* -3*/
- " expert explorer ", " novice adventurer", " adventurer ",/* -6*/
- "apprentice conjurer", " conjurer ", " master conjurer ",/* -9*/
- " apprentice mage ", " mage ", " experienced mage ",/* -12*/
- " master mage ", " apprentice warlord", " novice warlord ",/* -15*/
- " expert warlord ", " master warlord ", " apprentice gorgon ",/* -18*/
- " gorgon ", " practiced gorgon ", " master gorgon ",/* -21*/
- " demi-gorgon ", " evil master ", " great evil master ",/* -24*/
- aa1 , aa1 , aa1 ,/* -27*/
- aa1 , aa1 , aa1 ,/* -30*/
- aa1 , aa1 , aa1 ,/* -33*/
- aa1 , aa1 , aa1 ,/* -36*/
- aa1 , aa1 , aa1 ,/* -39*/
- aa2 , aa2 , aa2 ,/* -42*/
- aa2 , aa2 , aa2 ,/* -45*/
- aa2 , aa2 , aa2 ,/* -48*/
- aa3 , aa3 , aa3 ,/* -51*/
- aa3 , aa3 , aa3 ,/* -54*/
- aa3 , aa3 , aa3 ,/* -57*/
- aa4 , aa4 , aa4 ,/* -60*/
- aa4 , aa4 , aa4 ,/* -63*/
- aa4 , aa4 , aa4 ,/* -66*/
- aa5 , aa5 , aa5 ,/* -69*/
- aa5 , aa5 , aa5 ,/* -72*/
- aa5 , aa5 , aa5 ,/* -75*/
- aa6 , aa6 , aa6 ,/* -78*/
- aa6 , aa6 , aa6 ,/* -81*/
- aa6 , aa6 , aa6 ,/* -84*/
- aa7 , aa7 , aa7 ,/* -87*/
- aa8 , aa8 , aa8 ,/* -90*/
- aa8 , aa8 , aa8 ,/* -93*/
- " earth guardian ", " air guardian ", " fire guardian ",/* -96*/
- " water guardian ", " time guardian ", " ethereal guardian ",/* -99*/
- aa9 , aa9 , aa9 ,/* -102*/
+static char aa1[] = " mighty evil master";
+static char aa2[] = "apprentice demi-god";
+static char aa3[] = " minor demi-god ";
+static char aa4[] = " major demi-god ";
+static char aa5[] = " minor deity ";
+static char aa6[] = " major deity ";
+static char aa7[] = " novice guardian ";
+static char aa8[] = "apprentice guardian";
+static char aa9[] = " The Creator ";
+u_char *class[] =
+{
+ " novice explorer ", "apprentice explorer", " practiced explorer", /* -3 */
+ " expert explorer ", " novice adventurer", " adventurer ", /* -6 */
+ "apprentice conjurer", " conjurer ", " master conjurer ", /* -9 */
+ " apprentice mage ", " mage ", " experienced mage ", /* -12 */
+ " master mage ", " apprentice warlord", " novice warlord ", /* -15 */
+ " expert warlord ", " master warlord ", " apprentice gorgon ", /* -18 */
+ " gorgon ", " practiced gorgon ", " master gorgon ", /* -21 */
+ " demi-gorgon ", " evil master ", " great evil master ", /* -24 */
+ aa1, aa1, aa1, /* -27 */
+ aa1, aa1, aa1, /* -30 */
+ aa1, aa1, aa1, /* -33 */
+ aa1, aa1, aa1, /* -36 */
+ aa1, aa1, aa1, /* -39 */
+ aa2, aa2, aa2, /* -42 */
+ aa2, aa2, aa2, /* -45 */
+ aa2, aa2, aa2, /* -48 */
+ aa3, aa3, aa3, /* -51 */
+ aa3, aa3, aa3, /* -54 */
+ aa3, aa3, aa3, /* -57 */
+ aa4, aa4, aa4, /* -60 */
+ aa4, aa4, aa4, /* -63 */
+ aa4, aa4, aa4, /* -66 */
+ aa5, aa5, aa5, /* -69 */
+ aa5, aa5, aa5, /* -72 */
+ aa5, aa5, aa5, /* -75 */
+ aa6, aa6, aa6, /* -78 */
+ aa6, aa6, aa6, /* -81 */
+ aa6, aa6, aa6, /* -84 */
+ aa7, aa7, aa7, /* -87 */
+ aa8, aa8, aa8, /* -90 */
+ aa8, aa8, aa8, /* -93 */
+ " earth guardian ", " air guardian ", " fire guardian ", /* -96 */
+ " water guardian ", " time guardian ", " ethereal guardian ", /* -99 */
+ aa9, aa9, aa9, /* -102 */
};
/*
@@ -99,333 +102,361 @@ char *class[]=
skill[c[LEVEL]] is the experience required to attain the next level
*/
#define MEG 1000000
-long skill[] = {
-0, 10, 20, 40, 80, 160, 320, 640, 1280, 2560, 5120, /* 1-11 */
-10240, 20480, 40960, 100000, 200000, 400000, 700000, 1*MEG, /* 12-19 */
-2*MEG,3*MEG,4*MEG,5*MEG,6*MEG,8*MEG,10*MEG, /* 20-26 */
-12*MEG,14*MEG,16*MEG,18*MEG,20*MEG,22*MEG,24*MEG,26*MEG,28*MEG, /* 27-35 */
-30*MEG,32*MEG,34*MEG,36*MEG,38*MEG,40*MEG,42*MEG,44*MEG,46*MEG, /* 36-44 */
-48*MEG,50*MEG,52*MEG,54*MEG,56*MEG,58*MEG,60*MEG,62*MEG,64*MEG, /* 45-53 */
-66*MEG,68*MEG,70*MEG,72*MEG,74*MEG,76*MEG,78*MEG,80*MEG,82*MEG, /* 54-62 */
-84*MEG,86*MEG,88*MEG,90*MEG,92*MEG,94*MEG,96*MEG,98*MEG,100*MEG, /* 63-71 */
-105*MEG,110*MEG,115*MEG,120*MEG, 125*MEG, 130*MEG, 135*MEG, 140*MEG, /* 72-79 */
-145*MEG,150*MEG,155*MEG,160*MEG, 165*MEG, 170*MEG, 175*MEG, 180*MEG, /* 80-87 */
-185*MEG,190*MEG,195*MEG,200*MEG, 210*MEG, 220*MEG, 230*MEG, 240*MEG, /* 88-95 */
-250*MEG,260*MEG,270*MEG,280*MEG, 290*MEG, 300*MEG /* 96-101*/
+long skill[] = {
+ 0, 10, 20, 40, 80, 160, 320, 640, 1280, 2560, 5120, /* 1-11 */
+ 10240, 20480, 40960, 100000, 200000, 400000, 700000, 1 * MEG, /* 12-19 */
+ 2 * MEG, 3 * MEG, 4 * MEG, 5 * MEG, 6 * MEG, 8 * MEG, 10 * MEG, /* 20-26 */
+ 12 * MEG, 14 * MEG, 16 * MEG, 18 * MEG, 20 * MEG, 22 * MEG, 24 * MEG, 26 * MEG, 28 * MEG, /* 27-35 */
+ 30 * MEG, 32 * MEG, 34 * MEG, 36 * MEG, 38 * MEG, 40 * MEG, 42 * MEG, 44 * MEG, 46 * MEG, /* 36-44 */
+ 48 * MEG, 50 * MEG, 52 * MEG, 54 * MEG, 56 * MEG, 58 * MEG, 60 * MEG, 62 * MEG, 64 * MEG, /* 45-53 */
+ 66 * MEG, 68 * MEG, 70 * MEG, 72 * MEG, 74 * MEG, 76 * MEG, 78 * MEG, 80 * MEG, 82 * MEG, /* 54-62 */
+ 84 * MEG, 86 * MEG, 88 * MEG, 90 * MEG, 92 * MEG, 94 * MEG, 96 * MEG, 98 * MEG, 100 * MEG, /* 63-71 */
+ 105 * MEG, 110 * MEG, 115 * MEG, 120 * MEG, 125 * MEG, 130 * MEG, 135 * MEG, 140 * MEG, /* 72-79 */
+ 145 * MEG, 150 * MEG, 155 * MEG, 160 * MEG, 165 * MEG, 170 * MEG, 175 * MEG, 180 * MEG, /* 80-87 */
+ 185 * MEG, 190 * MEG, 195 * MEG, 200 * MEG, 210 * MEG, 220 * MEG, 230 * MEG, 240 * MEG, /* 88-95 */
+ 250 * MEG, 260 * MEG, 270 * MEG, 280 * MEG, 290 * MEG, 300 * MEG /* 96-101 */
};
#undef MEG
-char *lpbuf,*lpnt,*inbuffer,*lpend; /* input/output pointers to the buffers */
-struct cel *cell; /* pointer to the dungeon storage */
-short hitp[MAXX][MAXY]; /* monster hp on level */
-short iarg[MAXX][MAXY]; /* arg for the item array */
-char item[MAXX][MAXY]; /* objects in maze if any */
-char know[MAXX][MAXY]; /* 1 or 0 if here before */
-char mitem[MAXX][MAXY]; /* monster item array */
-char moved[MAXX][MAXY]; /* monster movement flags */
-char stealth[MAXX][MAXY]; /* 0=sleeping 1=awake monst*/
-char iven[26]; /* inventory for player */
-short ivenarg[26]; /* inventory for player */
-char lastmonst[40]; /* this has the name of the current monster */
-char beenhere[MAXLEVEL+MAXVLEVEL]={0}; /* 1 if have been on this level */
-char VERSION=VER; /* this is the present version # of the program */
-char SUBVERSION=SUBVER;
-char nosignal=0; /* set to 1 to disable the signals from doing anything */
-char predostuff=0; /* 2 means that the trap handling routines must do a
- showplayer() after a trap. 0 means don't showplayer()
- 0 - we are in create player screen
- 1 - we are in welcome screen
- 2 - we are in the normal game */
-char loginname[20]; /* players login name */
-char logname[LOGNAMESIZE]; /* players name storage for scoring */
-char sex=1; /* default is a man 0=woman */
-char boldon=1; /* 1=bold objects 0=inverse objects */
-char ckpflag=0; /* 1 if want checkpointing of game, 0 otherwise */
-char cheat=0; /* 1 if the player has fudged save file */
-short level=0; /* cavelevel player is on = c[CAVELEVEL] */
-char wizard=0; /* the wizard mode flag */
-short lastnum=0; /* the number of the monster last hitting player */
-short hitflag=0; /* flag for if player has been hit when running */
-short hit2flag=0; /* flag for if player has been hit when running */
-short hit3flag=0; /* flag for if player has been hit flush input */
-short playerx,playery; /* the room on the present level of the player */
-short lastpx,lastpy; /* 0 --- MAXX-1 or 0 --- MAXY-1 */
-short oldx,oldy;
-short lasthx=0,lasthy=0; /* location of monster last hit by player */
-short nobeep=0; /* true if program is not to beep */
-unsigned long randx=33601; /* the random number seed */
-long initialtime=0; /* time playing began */
-long gltime=0; /* the clock for the game */
-long outstanding_taxes=0; /* present tax bill from score file */
-long c[100],cbak[100]; /* the character description arrays */
-int enable_scroll=0; /* constant for enabled/disabled scrolling regn */
-char aborted[] = " aborted";
-struct sphere *spheres=0; /*pointer to linked list for spheres of annihilation*/
-char *levelname[]=
-{ " H"," 1"," 2"," 3"," 4"," 5"," 6"," 7"," 8"," 9","10","V1","V2","V3" };
-
-char objnamelist[]=" ATOP%^F&^+M=%^$$f*OD#~][[)))(((||||||||{?!BC}o:@.<<<<EVV))([[]]](^ [H*** ^^ S tsTLc............................................";
-char monstnamelist[]=" BGHJKOScjtAELNQRZabhiCTYdegmvzFWflorXV pqsyUkMwDDPxnDDuD ...............................................................";
-char *objectname[]=
-{ 0,"a holy altar","a handsome jewel encrusted throne","the orb","a pit",
- "a staircase leading upwards","an elevator going up","a bubbling fountain",
- "a great marble statue","a teleport trap","the college of Larn",
- "a mirror","the DND store","a staircase going down","an elevator going down",
- "the bank of Larn","the 5th branch of the Bank of Larn",
- "a dead fountain","gold","an open door","a closed door",
- "a wall","The Eye of Larn","plate mail","chain mail","leather armor",
- "a sword of slashing","Bessman's flailing hammer","a sunsword",
- "a two handed sword","a spear","a dagger",
- "ring of extra regeneration","a ring of regeneration","a ring of protection",
- "an energy ring","a ring of dexterity","a ring of strength",
- "a ring of cleverness","a ring of increase damage","a belt of striking",
- "a magic scroll","a magic potion","a book","a chest",
- "an amulet of invisibility","an orb of dragon slaying",
- "a scarab of negate spirit","a cube of undead control",
- "device of theft prevention","a brilliant diamond","a ruby",
- "an enchanting emerald","a sparkling sapphire","the dungeon entrance",
- "a volcanic shaft leaning downward","the base of a volcanic shaft",
- "a battle axe","a longsword","a flail","ring mail","studded leather armor",
- "splint mail","plate armor","stainless plate armor","a lance of death",
- "an arrow trap","an arrow trap","a shield","your home",
- "gold","gold","gold","a dart trap",
- "a dart trap","a trapdoor","a trapdoor","the local trading post",
- "a teleport trap", "a massive throne",
- "a sphere of annihilation","a handsome jewel encrusted throne",
- "the Larn Revenue Service","a fortune cookie","","","","","","",
- "","","","","","","","","","","","","","","","","","","",""
- };
-
-
+u_char *lpbuf, *lpnt, *inbuffer, *lpend; /* input/output pointers
+ * to the buffers */
+struct cel *cell; /* pointer to the dungeon storage */
+short hitp[MAXX][MAXY]; /* monster hp on level */
+short iarg[MAXX][MAXY]; /* arg for the item array */
+u_char item[MAXX][MAXY]; /* objects in maze if any */
+u_char know[MAXX][MAXY]; /* 1 or 0 if here before */
+u_char mitem[MAXX][MAXY]; /* monster item array */
+u_char moved[MAXX][MAXY]; /* monster movement flags */
+u_char stealth[MAXX][MAXY]; /* 0=sleeping 1=awake monst */
+u_char iven[26]; /* inventory for player */
+short ivenarg[26]; /* inventory for player */
+char lastmonst[40]; /* this has the name of the current monster */
+u_char beenhere[MAXLEVEL + MAXVLEVEL] = {0}; /* 1 if have been on
+ * this level */
+char VERSION = VER; /* this is the present version # of the
+ * program */
+char SUBVERSION = SUBVER;
+u_char nosignal = 0; /* set to 1 to disable the signals from doing
+ * anything */
+u_char predostuff = 0; /* 2 means that the trap handling routines
+ * must do a showplayer() after a trap. 0
+ * means don't showplayer() 0 - we are in
+ * create player screen 1 - we are in welcome
+ * screen 2 - we are in the normal game */
+char loginname[20]; /* players login name */
+char logname[LOGNAMESIZE]; /* players name storage for scoring */
+u_char sex = 1; /* default is a man 0=woman */
+u_char boldon = 1; /* 1=bold objects 0=inverse objects */
+u_char ckpflag = 0; /* 1 if checkpointing of game, 0 otherwise */
+u_char cheat = 0; /* 1 if the player has fudged save file */
+short level = 0; /* cavelevel player is on = c[CAVELEVEL]*/
+u_char wizard = 0; /* the wizard mode flag */
+short lastnum = 0; /* the monster last hitting player */
+short hitflag = 0; /* flag if player has been hit when running */
+short hit2flag = 0; /* flag if player has been hit when running */
+short hit3flag = 0; /* flag for if player has been hit flush input*/
+short playerx, playery; /* the room on the present level of
+ * the player */
+short lastpx, lastpy; /* 0 --- MAXX-1 or 0 --- MAXY-1 */
+short oldx, oldy;
+short lasthx = 0, lasthy = 0; /* location of monster last hit by
+ * player */
+short nobeep = 0; /* true if program is not to beep */
+unsigned long randx = 33601; /* the random number seed */
+time_t initialtime = 0;/* time playing began */
+long gltime = 0; /* the clock for the game */
+long outstanding_taxes = 0; /* present tax bill from score file */
+long c[100], cbak[100]; /* the character description arrays */
+int enable_scroll = 0; /* constant for enabled/disabled
+ * scrolling regn */
+char aborted[] = " aborted";
+struct sphere *spheres = 0; /* pointer to linked list for spheres of
+ * annihilation */
+char *levelname[] =
+{" H", " 1", " 2", " 3", " 4", " 5", " 6", " 7", " 8", " 9", "10", "V1", "V2", "V3"};
+
+char objnamelist[] = " ATOP%^F&^+M=%^$$f*OD#~][[)))(((||||||||{?!BC}o:@.<<<<EVV))([[]]](^ [H*** ^^ S tsTLc............................................";
+char monstnamelist[] = " BGHJKOScjtAELNQRZabhiCTYdegmvzFWflorXV pqsyUkMwDDPxnDDuD ...............................................................";
+char *objectname[] =
+{0, "a holy altar", "a handsome jewel encrusted throne", "the orb", "a pit",
+ "a staircase leading upwards", "an elevator going up", "a bubbling fountain",
+ "a great marble statue", "a teleport trap", "the college of Larn",
+ "a mirror", "the DND store", "a staircase going down", "an elevator going down",
+ "the bank of Larn", "the 5th branch of the Bank of Larn",
+ "a dead fountain", "gold", "an open door", "a closed door",
+ "a wall", "The Eye of Larn", "plate mail", "chain mail", "leather armor",
+ "a sword of slashing", "Bessman's flailing hammer", "a sunsword",
+ "a two handed sword", "a spear", "a dagger",
+ "ring of extra regeneration", "a ring of regeneration", "a ring of protection",
+ "an energy ring", "a ring of dexterity", "a ring of strength",
+ "a ring of cleverness", "a ring of increase damage", "a belt of striking",
+ "a magic scroll", "a magic potion", "a book", "a chest",
+ "an amulet of invisibility", "an orb of dragon slaying",
+ "a scarab of negate spirit", "a cube of undead control",
+ "device of theft prevention", "a brilliant diamond", "a ruby",
+ "an enchanting emerald", "a sparkling sapphire", "the dungeon entrance",
+ "a volcanic shaft leaning downward", "the base of a volcanic shaft",
+ "a battle axe", "a longsword", "a flail", "ring mail", "studded leather armor",
+ "splint mail", "plate armor", "stainless plate armor", "a lance of death",
+ "an arrow trap", "an arrow trap", "a shield", "your home",
+ "gold", "gold", "gold", "a dart trap",
+ "a dart trap", "a trapdoor", "a trapdoor", "the local trading post",
+ "a teleport trap", "a massive throne",
+ "a sphere of annihilation", "a handsome jewel encrusted throne",
+ "the Larn Revenue Service", "a fortune cookie", "", "", "", "", "", "",
+ "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", ""
+};
+
+
+
/*
* for the monster data
*
* array to do rnd() to create monsters <= a given level
*/
-char monstlevel[] = { 5, 11, 17, 22, 27, 33, 39, 42, 46, 50, 53, 56, 59 };
-
-struct monst monster[] = {
-/* NAME LV AC DAM ATT DEF GEN INT GOLD HP EXP
------------------------------------------------------------------ */
-{ "", 0, 0, 0, 0, 0, 0, 3, 0, 0, 0 },
-{ "bat", 1, 0, 1, 0, 0, 0, 3, 0, 1, 1 },
-{ "gnome", 1, 10, 1, 0, 0, 0, 8, 30, 2, 2 },
-{ "hobgoblin", 1, 14, 2, 0, 0, 0, 5, 25, 3, 2 },
-{ "jackal", 1, 17, 1, 0, 0, 0, 4, 0, 1, 1 },
-{ "kobold", 1, 20, 1, 0, 0, 0, 7, 10, 1, 1 },
-
-{ "orc", 2, 12, 1, 0, 0, 0, 9, 40, 4, 2 },
-{ "snake", 2, 15, 1, 0, 0, 0, 3, 0, 3, 1 },
-{ "giant centipede",2, 14, 0, 4, 0, 0, 3, 0, 1, 2 },
-{ "jaculi", 2, 20, 1, 0, 0, 0, 3, 0, 2, 1 },
-{ "troglodyte", 2, 10, 2, 0, 0, 0, 5, 80, 4, 3 },
-{ "giant ant", 2, 8, 1, 4, 0, 0, 4, 0, 5, 5 },
-
-/* NAME LV AC DAM ATT DEF GEN INT GOLD HP EXP
------------------------------------------------------------------ */
-
-{ "floating eye", 3, 8, 1, 0, 0, 0, 3, 0, 5, 2 },
-{ "leprechaun", 3, 3, 0, 8, 0, 0, 3,1500, 13, 45 },
-{ "nymph", 3, 3, 0, 14, 0, 0, 9, 0, 18, 45 },
-{ "quasit", 3, 5, 3, 0, 0, 0, 3, 0, 10, 15 },
-{ "rust monster", 3, 4, 0, 1, 0, 0, 3, 0, 18, 25 },
-{ "zombie", 3, 12, 2, 0, 0, 0, 3, 0, 6, 7 },
-
-{ "assassin bug", 4, 9, 3, 0, 0, 0, 3, 0, 20, 15 },
-{ "bugbear", 4, 5, 4, 15, 0, 0, 5, 40, 20, 35 },
-{ "hell hound", 4, 5, 2, 2, 0, 0, 6, 0, 16, 35 },
-{ "ice lizard", 4, 11, 2, 10, 0, 0, 6, 50, 16, 25 },
-{ "centaur", 4, 6, 4, 0, 0, 0, 10, 40, 24, 45 },
-
-/* NAME LV AC DAM ATT DEF GEN INT GOLD HP EXP
------------------------------------------------------------------ */
-
-{ "troll", 5, 4, 5, 0, 0, 0, 9, 80, 50, 300 },
-{ "yeti", 5, 6, 4, 0, 0, 0, 5, 50, 35, 100 },
-{ "white dragon", 5, 2, 4, 5, 0, 0, 16, 500, 55, 1000},
-{ "elf", 5, 8, 1, 0, 0, 0, 15, 50, 22, 35 },
-{ "gelatinous cube",5, 9, 1, 0, 0, 0, 3, 0, 22, 45 },
-
-{ "metamorph", 6, 7, 3, 0, 0, 0, 3, 0, 30, 40 },
-{ "vortex", 6, 4, 3, 0, 0, 0, 3, 0, 30, 55 },
-{ "ziller", 6, 15, 3, 0, 0, 0, 3, 0, 30, 35 },
-{ "violet fungi", 6, 12, 3, 0, 0, 0, 3, 0, 38, 100 },
-{ "wraith", 6, 3, 1, 6, 0, 0, 3, 0, 30, 325 },
-{ "forvalaka", 6, 2, 5, 0, 0, 0, 7, 0, 50, 280 },
-
-/* NAME LV AC DAM ATT DEF GEN INT GOLD HP EXP
------------------------------------------------------------------ */
-
-{ "lama nobe", 7, 7, 3, 0, 0, 0, 6, 0, 35, 80 },
-{ "osequip", 7, 4, 3, 16, 0, 0, 4, 0, 35, 100 },
-{ "rothe", 7, 15, 5, 0, 0, 0, 3, 100, 50, 250 },
-{ "xorn", 7, 0, 6, 0, 0, 0, 13, 0, 60, 300 },
-{ "vampire", 7, 3, 4, 6, 0, 0, 17, 0, 50, 1000},
-{ "invisible stalker",7,3, 6, 0, 0, 0, 5, 0, 50, 350 },
-
-{ "poltergeist", 8, 1, 4, 0, 0, 0, 3, 0, 50, 450 },
-{ "disenchantress", 8, 3, 0, 9, 0, 0, 3, 0, 50, 500 },
-{ "shambling mound",8, 2, 5, 0, 0, 0, 6, 0, 45, 400 },
-{ "yellow mold", 8, 12, 4, 0, 0, 0, 3, 0, 35, 250 },
-{ "umber hulk", 8, 3, 7, 11, 0, 0, 14, 0, 65, 600 },
-
-/* NAME LV AC DAM ATT DEF GEN INT GOLD HP EXP
------------------------------------------------------------------ */
-
-{ "gnome king", 9, -1, 10, 0, 0, 0, 18, 2000, 100,3000 },
-{ "mimic", 9, 5, 6, 0, 0, 0, 8, 0, 55, 99 },
-{ "water lord", 9, -10, 15, 7, 0, 0, 20, 0, 150,15000 },
-{ "bronze dragon", 9, 2, 9, 3, 0, 0, 16, 300, 80, 4000 },
-{ "green dragon", 9, 3, 8, 10, 0, 0, 15, 200, 70, 2500 },
-{ "purple worm", 9, -1, 11, 0, 0, 0, 3, 100, 120,15000 },
-{ "xvart", 9, -2, 12, 0, 0, 0, 13, 0, 90, 1000 },
-
-{ "spirit naga", 10, -20,12, 12, 0, 0, 23, 0, 95, 20000 },
-{ "silver dragon", 10, -1, 12, 3, 0, 0, 20, 700, 100,10000 },
-{ "platinum dragon",10, -5, 15, 13, 0, 0, 22, 1000, 130,24000 },
-{ "green urchin", 10, -3, 12, 0, 0, 0, 3, 0, 85, 5000 },
-{ "red dragon", 10, -2, 13, 3, 0, 0, 19, 800, 110,14000 },
-
-{ "type I demon lord", 12,-30, 18, 0, 0, 0, 20, 0, 140,50000 },
-{ "type II demon lord", 13,-30, 18, 0, 0, 0, 21, 0, 160,75000 },
-{ "type III demon lord",14,-30, 18, 0, 0, 0, 22, 0, 180,100000 },
-{ "type IV demon lord", 15,-35, 20, 0, 0, 0, 23, 0, 200,125000 },
-{ "type V demon lord", 16,-40, 22, 0, 0, 0, 24, 0, 220,150000 },
-{ "type VI demon lord", 17,-45, 24, 0, 0, 0, 25, 0, 240,175000 },
-{ "type VII demon lord",18,-70, 27, 6, 0, 0, 26, 0, 260,200000 },
-{ "demon prince", 25,-127,30, 6, 0, 0, 28, 0, 345,300000 }
-
-/* NAME LV AC DAM ATT DEF GEN INT GOLD HP EXP
---------------------------------------------------------------------- */
- };
-
-/* name array for scrolls */
-
-char *scrollname[] = {"","","","","","","","","","","","","","",
- "","","","","","","","","","","","","",""};
-
-char *scrollhide[] = {
-" enchant armor",
-" enchant weapon",
-" enlightenment",
-" blank paper",
-" create monster",
-" create artifact",
-" aggravate monsters",
-" time warp",
-" teleportation",
-" expanded awareness",
-" haste monsters",
-" monster healing",
-" spirit protection",
-" undead protection",
-" stealth",
-" magic mapping",
-" hold monsters",
-" gem perfection",
-" spell extension",
-" identify",
-" remove curse",
-" annihilation",
-" pulverization",
-" life protection",
-" ",
-" ",
-" ",
-" "
- };
-
-char *potionname[] = {"","","","","","","","","","","","","","",
- "","","","","","","","","","","","","","",
- "","","","","","",""};
-
-/* name array for magic potions */
-char *potionhide[] = {
-" sleep",
-" healing",
-" raise level",
-" increase ability",
-" wisdom",
-" strength",
-" raise charisma",
-" dizziness",
-" learning",
-" gold detection",
-" monster detection",
-" forgetfulness",
-" water",
-" blindness",
-" confusion",
-" heroism",
-" sturdiness",
-" giant strength",
-" fire resistance",
-" treasure finding",
-" instant healing",
-" cure dianthroritis",
-" poison",
-" see invisible",
-" ",
-" ",
-" ",
-" ",
-" ",
-" ",
-" ",
-" ",
-" ",
-" ",
-" "
- };
-
-
+u_char monstlevel[] = {5, 11, 17, 22, 27, 33, 39, 42, 46, 50, 53, 56, 59};
+
+struct monst monster[] = {
+ /*
+ * NAME LV AC DAM ATT DEF GEN
+ * INT GOLD HP EXP
+ * -----------------------------------------------------------------
+ */
+ {"", 0, 0, 0, 0, 0, 0, 3, 0, 0, 0},
+ {"bat", 1, 0, 1, 0, 0, 0, 3, 0, 1, 1},
+ {"gnome", 1, 10, 1, 0, 0, 0, 8, 30, 2, 2},
+ {"hobgoblin", 1, 14, 2, 0, 0, 0, 5, 25, 3, 2},
+ {"jackal", 1, 17, 1, 0, 0, 0, 4, 0, 1, 1},
+ {"kobold", 1, 20, 1, 0, 0, 0, 7, 10, 1, 1},
+
+ {"orc", 2, 12, 1, 0, 0, 0, 9, 40, 4, 2},
+ {"snake", 2, 15, 1, 0, 0, 0, 3, 0, 3, 1},
+ {"giant centipede", 2, 14, 0, 4, 0, 0, 3, 0, 1, 2},
+ {"jaculi", 2, 20, 1, 0, 0, 0, 3, 0, 2, 1},
+ {"troglodyte", 2, 10, 2, 0, 0, 0, 5, 80, 4, 3},
+ {"giant ant", 2, 8, 1, 4, 0, 0, 4, 0, 5, 5},
+
+ /*
+ * NAME LV AC DAM ATT DEF GEN
+ * INT GOLD HP EXP
+ * -----------------------------------------------------------------
+ */
+
+ {"floating eye", 3, 8, 1, 0, 0, 0, 3, 0, 5, 2},
+ {"leprechaun", 3, 3, 0, 8, 0, 0, 3, 1500, 13, 45},
+ {"nymph", 3, 3, 0, 14, 0, 0, 9, 0, 18, 45},
+ {"quasit", 3, 5, 3, 0, 0, 0, 3, 0, 10, 15},
+ {"rust monster", 3, 4, 0, 1, 0, 0, 3, 0, 18, 25},
+ {"zombie", 3, 12, 2, 0, 0, 0, 3, 0, 6, 7},
+
+ {"assassin bug", 4, 9, 3, 0, 0, 0, 3, 0, 20, 15},
+ {"bugbear", 4, 5, 4, 15, 0, 0, 5, 40, 20, 35},
+ {"hell hound", 4, 5, 2, 2, 0, 0, 6, 0, 16, 35},
+ {"ice lizard", 4, 11, 2, 10, 0, 0, 6, 50, 16, 25},
+ {"centaur", 4, 6, 4, 0, 0, 0, 10, 40, 24, 45},
+
+ /*
+ * NAME LV AC DAM ATT DEF GEN
+ * INT GOLD HP EXP
+ * -----------------------------------------------------------------
+ */
+
+ {"troll", 5, 4, 5, 0, 0, 0, 9, 80, 50, 300},
+ {"yeti", 5, 6, 4, 0, 0, 0, 5, 50, 35, 100},
+ {"white dragon", 5, 2, 4, 5, 0, 0, 16, 500, 55, 1000},
+ {"elf", 5, 8, 1, 0, 0, 0, 15, 50, 22, 35},
+ {"gelatinous cube", 5, 9, 1, 0, 0, 0, 3, 0, 22, 45},
+
+ {"metamorph", 6, 7, 3, 0, 0, 0, 3, 0, 30, 40},
+ {"vortex", 6, 4, 3, 0, 0, 0, 3, 0, 30, 55},
+ {"ziller", 6, 15, 3, 0, 0, 0, 3, 0, 30, 35},
+ {"violet fungi", 6, 12, 3, 0, 0, 0, 3, 0, 38, 100},
+ {"wraith", 6, 3, 1, 6, 0, 0, 3, 0, 30, 325},
+ {"forvalaka", 6, 2, 5, 0, 0, 0, 7, 0, 50, 280},
+
+ /*
+ * NAME LV AC DAM ATT DEF GEN
+ * INT GOLD HP EXP
+ * -----------------------------------------------------------------
+ */
+
+ {"lama nobe", 7, 7, 3, 0, 0, 0, 6, 0, 35, 80},
+ {"osequip", 7, 4, 3, 16, 0, 0, 4, 0, 35, 100},
+ {"rothe", 7, 15, 5, 0, 0, 0, 3, 100, 50, 250},
+ {"xorn", 7, 0, 6, 0, 0, 0, 13, 0, 60, 300},
+ {"vampire", 7, 3, 4, 6, 0, 0, 17, 0, 50, 1000},
+ {"invisible stalker", 7, 3, 6, 0, 0, 0, 5, 0, 50, 350},
+
+ {"poltergeist", 8, 1, 4, 0, 0, 0, 3, 0, 50, 450},
+ {"disenchantress", 8, 3, 0, 9, 0, 0, 3, 0, 50, 500},
+ {"shambling mound", 8, 2, 5, 0, 0, 0, 6, 0, 45, 400},
+ {"yellow mold", 8, 12, 4, 0, 0, 0, 3, 0, 35, 250},
+ {"umber hulk", 8, 3, 7, 11, 0, 0, 14, 0, 65, 600},
+
+ /*
+ * NAME LV AC DAM ATT DEF GEN
+ * INT GOLD HP EXP
+ * -----------------------------------------------------------------
+ */
+
+ {"gnome king", 9, -1, 10, 0, 0, 0, 18, 2000, 100, 3000},
+ {"mimic", 9, 5, 6, 0, 0, 0, 8, 0, 55, 99},
+ {"water lord", 9, -10, 15, 7, 0, 0, 20, 0, 150, 15000},
+ {"bronze dragon", 9, 2, 9, 3, 0, 0, 16, 300, 80, 4000},
+ {"green dragon", 9, 3, 8, 10, 0, 0, 15, 200, 70, 2500},
+ {"purple worm", 9, -1, 11, 0, 0, 0, 3, 100, 120, 15000},
+ {"xvart", 9, -2, 12, 0, 0, 0, 13, 0, 90, 1000},
+
+ {"spirit naga", 10, -20, 12, 12, 0, 0, 23, 0, 95, 20000},
+ {"silver dragon", 10, -1, 12, 3, 0, 0, 20, 700, 100, 10000},
+ {"platinum dragon", 10, -5, 15, 13, 0, 0, 22, 1000, 130, 24000},
+ {"green urchin", 10, -3, 12, 0, 0, 0, 3, 0, 85, 5000},
+ {"red dragon", 10, -2, 13, 3, 0, 0, 19, 800, 110, 14000},
+
+ {"type I demon lord", 12, -30, 18, 0, 0, 0, 20, 0, 140, 50000},
+ {"type II demon lord", 13, -30, 18, 0, 0, 0, 21, 0, 160, 75000},
+ {"type III demon lord", 14, -30, 18, 0, 0, 0, 22, 0, 180, 100000},
+ {"type IV demon lord", 15, -35, 20, 0, 0, 0, 23, 0, 200, 125000},
+ {"type V demon lord", 16, -40, 22, 0, 0, 0, 24, 0, 220, 150000},
+ {"type VI demon lord", 17, -45, 24, 0, 0, 0, 25, 0, 240, 175000},
+ {"type VII demon lord", 18, -70, 27, 6, 0, 0, 26, 0, 260, 200000},
+ {"demon prince", 25, -127, 30, 6, 0, 0, 28, 0, 345, 300000}
+
+ /*
+ * NAME LV AC DAM ATT DEF GEN
+ * INT GOLD HP EXP
+ * -------------------------------------------------------------------
+ */
+};
+
+/* name array for scrolls */
+
+char *scrollname[] = {"", "", "", "", "", "", "", "", "", "", "", "", "", "",
+"", "", "", "", "", "", "", "", "", "", "", "", "", ""};
+
+char *scrollhide[] = {
+ " enchant armor",
+ " enchant weapon",
+ " enlightenment",
+ " blank paper",
+ " create monster",
+ " create artifact",
+ " aggravate monsters",
+ " time warp",
+ " teleportation",
+ " expanded awareness",
+ " haste monsters",
+ " monster healing",
+ " spirit protection",
+ " undead protection",
+ " stealth",
+ " magic mapping",
+ " hold monsters",
+ " gem perfection",
+ " spell extension",
+ " identify",
+ " remove curse",
+ " annihilation",
+ " pulverization",
+ " life protection",
+ " ",
+ " ",
+ " ",
+ " "
+};
+
+char *potionname[] = {"", "", "", "", "", "", "", "", "", "", "", "", "", "",
+ "", "", "", "", "", "", "", "", "", "", "", "", "", "",
+"", "", "", "", "", "", ""};
+
+/* name array for magic potions */
+char *potionhide[] = {
+ " sleep",
+ " healing",
+ " raise level",
+ " increase ability",
+ " wisdom",
+ " strength",
+ " raise charisma",
+ " dizziness",
+ " learning",
+ " gold detection",
+ " monster detection",
+ " forgetfulness",
+ " water",
+ " blindness",
+ " confusion",
+ " heroism",
+ " sturdiness",
+ " giant strength",
+ " fire resistance",
+ " treasure finding",
+ " instant healing",
+ " cure dianthroritis",
+ " poison",
+ " see invisible",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " "
+};
+
+
+
/*
- spell data
+ * spell data
*/
-char spelknow[SPNUM]={0};
-char splev[] = { 1, 4, 9, 14, 18, 22, 26, 29, 32, 35, 37, 37, 37, 37, 37 };
-
-char *spelcode[]={
- "pro", "mle", "dex", "sle", "chm", "ssp",
- "web", "str", "enl", "hel", "cbl", "cre", "pha", "inv",
- "bal", "cld", "ply", "can", "has", "ckl", "vpr",
- "dry", "lit", "drl", "glo", "flo", "fgr",
- "sca", "hld", "stp", "tel", "mfi", /* 31 */
- "sph", "gen", "sum", "wtw", "alt", "per"
- };
-
-char *spelname[]={
- "protection", "magic missile", "dexterity",
- "sleep", "charm monster", "sonic spear",
-
- "web", "strength", "enlightenment",
- "healing", "cure blindness", "create monster",
- "phantasmal forces", "invisibility",
-
- "fireball", "cold", "polymorph",
- "cancellation", "haste self", "cloud kill",
+u_char spelknow[SPNUM] = {0};
+u_char splev[] = {1, 4, 9, 14, 18, 22, 26, 29, 32, 35, 37, 37, 37, 37, 37};
+
+char *spelcode[] = {
+ "pro", "mle", "dex", "sle", "chm", "ssp",
+ "web", "str", "enl", "hel", "cbl", "cre", "pha", "inv",
+ "bal", "cld", "ply", "can", "has", "ckl", "vpr",
+ "dry", "lit", "drl", "glo", "flo", "fgr",
+ "sca", "hld", "stp", "tel", "mfi", /* 31 */
+ "sph", "gen", "sum", "wtw", "alt", "per"
+};
+
+char *spelname[] = {
+ "protection", "magic missile", "dexterity",
+ "sleep", "charm monster", "sonic spear",
+
+ "web", "strength", "enlightenment",
+ "healing", "cure blindness", "create monster",
+ "phantasmal forces", "invisibility",
+
+ "fireball", "cold", "polymorph",
+ "cancellation", "haste self", "cloud kill",
"vaporize rock",
- "dehydration", "lightning", "drain life",
- "invulnerability", "flood", "finger of death",
+ "dehydration", "lightning", "drain life",
+ "invulnerability", "flood", "finger of death",
- "scare monster", "hold monster", "time stop",
- "teleport away", "magic fire",
+ "scare monster", "hold monster", "time stop",
+ "teleport away", "magic fire",
- "sphere of annihilation", "genocide", "summon demon",
- "walk through walls", "alter reality", "permanence",
+ "sphere of annihilation", "genocide", "summon demon",
+ "walk through walls", "alter reality", "permanence",
""
- };
+};
-char *speldescript[]={
-/* 1 */
+char *speldescript[] = {
+ /* 1 */
"generates a +2 protection field",
"creates and hurls a magic missile equivalent to a + 1 magic arrow",
"adds +2 to the casters dexterity",
"causes some monsters to go to sleep",
"some monsters may be awed at your magnificence",
"causes your hands to emit a screeching sound toward what they point",
-/* 7 */
+ /* 7 */
"causes strands of sticky thread to entangle an enemy",
"adds +2 to the casters strength for a short term",
"the caster becomes aware of things around him",
@@ -434,7 +465,7 @@ char *speldescript[]={
"creates a monster near the caster appropriate for the location",
"creates illusions, and if believed, monsters die",
"the caster becomes invisible",
-/* 15 */
+ /* 15 */
"makes a ball of fire that burns on what it hits",
"sends forth a cone of cold which freezes what it touches",
"you can find out what this does for yourself",
@@ -442,20 +473,20 @@ char *speldescript[]={
"speeds up the casters movements",
"creates a fog of poisonous gas which kills all that is within it",
"this changes rock to air",
-/* 22 */
+ /* 22 */
"dries up water in the immediate vicinity",
"you finger will emit a lightning bolt when this spell is cast",
"subtracts hit points from both you and a monster",
"this globe helps to protect the player from physical attack",
"this creates an avalanche of H2O to flood the immediate chamber",
"this is a holy spell and calls upon your god to back you up",
-/* 28 */
+ /* 28 */
"terrifies the monster so that hopefully he wont hit the magic user",
"the monster is frozen in his tracks if this is successful",
"all movement in the caverns ceases for a limited duration",
"moves a particular monster around in the dungeon (hopefully away from you)",
"this causes a curtain of fire to appear all around you",
-/* 33 */
+ /* 33 */
"anything caught in this sphere is instantly killed. Warning -- dangerous",
"eliminates a species of monster from the game -- use sparingly",
"summons a demon who hopefully helps you out",
@@ -463,165 +494,185 @@ char *speldescript[]={
"god only knows what this will do",
"makes a character spell permanent, i. e. protection, strength, etc.",
""
- };
-
-char spelweird[MAXMONST+8][SPNUM] = {
-/* p m d s c s w s e h c c p i b c p c h c v d l d g f f s h s t m s g s w a p */
-/* r l e l h s e t n e b r h n a l l a a k p r i r l l g c l t e f p e u t l e */
-/* o e x e m p b r l l l e a v l d y n s l r y t l o o r a d p l i h n m w t r */
-
-
-/* bat */ { 0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,0 },
-/* gnome */ { 0,0,0,0,0,0, 0,0,0,0,0,0,0,5, 0,0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,0 },
-/* hobgoblin */ { 0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,0 },
-/* jackal */ { 0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,0 },
-/* kobold */ { 0,0,0,0,0,0, 0,0,0,0,0,0,0,5, 0,0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,0 },
-
-/* orc */ { 0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0, 4,0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,0 },
-/* snake */ { 0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,0 },
-/*giant centipede */ { 0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,0 },
-/* jaculi */ { 0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,0 },
-/* troglodyte */ { 0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,0 },
-
-/* giant ant */ { 0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,0 },
-/* floating eye */ { 0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,0 },
-/* leprechaun */ { 0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,0 },
-/* nymph */ { 0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,0 },
-/* quasit */ { 0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,0 },
-
-/* rust monster */ { 0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0, 4,0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,0 },
-/* zombie */ { 0,0,0,8,0,4, 0,0,0,0,0,0,0,0, 0,0,0,0,0,4,0, 4,0,0,0,0,4, 0,0,0,0,0, 0,0,0,0,0,0 },
-/* assassin bug */ { 0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,0 },
-/* bugbear */ { 0,0,0,0,0,0, 0,0,0,0,0,0,0,5, 0,0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,0 },
-/* hell hound */ { 0,6,0,0,0,0, 12,0,0,0,0,0,0,0, 0,0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,0 },
-
-/* ice lizard */ { 0,0,0,0,0,0, 11,0,0,0,0,0,0,0, 0,15,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,0 },
-/* centaur */ { 0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,0 },
-/* troll */ { 0,7,0,0,0,0, 0,0,0,0,0,0,0,5, 0,0,0,0,0,0,0, 4,0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,0 },
-/* yeti */ { 0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,15,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,0 },
-/* white dragon */ { 0,0,0,0,0,0, 0,0,0,0,0,0,14,0, 0,15,0,0,0,0,0, 4,0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,0 },
-
-/* elf */ { 0,0,0,0,0,0, 0,0,0,0,0,0,14,5, 0,0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,0 },
-/*gelatinous cube */ { 0,0,0,0,0,0, 2,0,0,0,0,0,0,0, 0,0,0,0,0,4,0, 0,0,0,0,0,4, 0,0,0,0,0, 0,0,0,0,0,0 },
-/* metamorph */ { 0,13,0,0,0,0, 2,0,0,0,0,0,0,0, 0,0,0,0,0,4,0, 4,0,0,0,0,4, 0,0,0,0,0, 0,0,0,0,0,0 },
-/* vortex */ { 0,13,0,0,0,10, 1,0,0,0,0,0,0,0, 0,0,0,0,0,4,0, 4,0,0,0,4,4, 0,0,0,0,0, 0,0,0,0,0,0 },
-/* ziller */ { 0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,0 },
-
-/* violet fungi */ { 0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,0 },
-/* wraith */ { 0,0,0,8,0,4, 0,0,0,0,0,0,0,0, 0,0,0,0,0,4,0, 4,0,0,0,0,4, 0,0,0,0,0, 0,0,0,0,0,0 },
-/* forvalaka */ { 0,0,0,0,0,0, 0,0,0,0,0,0,0,5, 0,0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,0 },
-/* lama nobe */ { 0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,0 },
-/* osequip */ { 0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,0 },
-
-/* rothe */ { 0,7,0,0,0,0, 0,0,0,0,0,0,0,5, 0,0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,0 },
-/* xorn */ { 0,7,0,0,0,0, 0,0,0,0,0,0,0,5, 0,0,0,0,0,0,0, 4,0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,0 },
-/* vampire */ { 0,0,0,8,0,4, 0,0,0,0,0,0,0,0, 0,0,0,0,0,4,0, 0,0,0,0,0,4, 0,0,0,0,0, 0,0,0,0,0,0 },
-/*invisible staker*/ { 0,0,0,0,0,0, 1,0,0,0,0,0,0,0, 0,0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,0 },
-/* poltergeist */ { 0,13,0,8,0,4, 1,0,0,0,0,0,0,0, 0,4,0,0,0,4,0, 4,0,0,0,4,4, 0,0,0,0,0, 0,0,0,0,0,0 },
-
-/* disenchantress */ { 0,0,0,8,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,0 },
-/*shambling mound */ { 0,0,0,0,0,10, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,0 },
-/* yellow mold */ { 0,0,0,8,0,0, 1,0,0,0,0,0,4,0, 0,0,0,0,0,4,0, 0,0,0,0,0,4, 0,0,0,0,0, 0,0,0,0,0,0 },
-/* umber hulk */ { 0,7,0,0,0,0, 0,0,0,0,0,0,0,5, 0,0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,0 },
-/* gnome king */ { 0,7,0,0,3,0, 0,0,0,0,0,0,0,5, 0,0,9,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,0 },
-
-/* mimic */ { 0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,0 },
-/* water lord */ { 0,13,0,8,3,4, 1,0,0,0,0,0,0,0, 0,0,9,0,0,4,0, 0,0,0,0,16,4, 0,0,0,0,0, 0,0,0,0,0,0 },
-/* bronze dragon */ { 0,7,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,0 },
-/* green dragon */ { 0,7,0,0,0,0, 11,0,0,0,0,0,0,0, 0,0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,0 },
-/* purple worm */ { 0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,0 },
-
-/* xvart */ { 0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,0 },
-/* spirit naga */ { 0,13,0,8,3,4, 1,0,0,0,0,0,0,5, 0,4,9,0,0,4,0, 4,0,0,0,4,4, 0,0,0,0,0, 0,0,0,0,0,0 },
-/* silver dragon */ { 0,6,0,9,0,0, 12,0,0,0,0,0,0,0, 0,0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,0 },
-/*platinum dragon */ { 0,7,0,9,0,0, 11,0,0,0,0,0,14,0, 0,0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,0 },
-/* green urchin */ { 0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,0 },
-/* red dragon */ { 0,6,0,0,0,0, 12,0,0,0,0,0,0,0, 0,0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,0 },
-
-/* p m d s c s w s e h c c p i b c p c h c v d l d g f f s h s t m s g s w a p */
-/* r l e l h s e t n e b r h n a l l a a k p r i r l l g c l t e f p e u t l e */
-/* o e x e m p b r l l l e a v l d y n s l r y t l o o r a d p l i h n m w t r */
-
-/* demon lord */ { 0,7,0,4,3,0, 1,0,0,0,0,0,14,5, 0,0,4,0,0,4,0, 4,0,0,0,4,4, 0,0,0,0,0, 9,0,0,0,0,0 },
-/* demon lord */ { 0,7,0,4,3,0, 1,0,0,0,0,0,14,5, 0,0,4,0,0,4,0, 4,0,0,0,4,4, 0,0,0,0,0, 9,0,0,0,0,0 },
-/* demon lord */ { 0,7,0,4,3,0, 1,0,0,0,0,0,14,5, 0,0,4,0,0,4,0, 4,0,0,0,4,4, 0,0,0,0,0, 9,0,0,0,0,0 },
-/* demon lord */ { 0,7,0,4,3,0, 1,0,0,0,0,0,14,5, 0,0,4,0,0,4,0, 4,0,0,0,4,4, 0,0,0,0,0, 9,0,0,0,0,0 },
-/* demon lord */ { 0,7,0,4,3,0, 1,0,0,0,0,0,14,5, 0,0,4,0,0,4,0, 4,0,0,0,4,4, 0,0,0,0,0, 9,0,0,0,0,0 },
-/* demon lord */ { 0,7,0,4,3,0, 1,0,0,0,0,0,14,5, 0,0,4,0,0,4,0, 4,0,0,0,4,4, 0,0,0,0,0, 9,0,0,0,0,0 },
-/* demon lord */ { 0,7,0,4,3,0, 1,0,0,0,0,0,14,5, 0,0,4,0,0,4,0, 4,0,0,0,4,4, 0,0,0,0,0, 9,0,0,0,0,0 },
-/* demon prince */ { 0,7,0,4,3,9, 1,0,0,0,0,0,14,5, 0,0,4,0,0,4,0, 4,0,0,0,4,4, 4,0,0,0,4, 9,0,0,0,0,0 }
-
- };
-
-char *spelmes[] = { "",
-/* 1 */ "the web had no effect on the %s",
-/* 2 */ "the %s changed shape to avoid the web",
-/* 3 */ "the %s isn't afraid of you",
-/* 4 */ "the %s isn't affected",
-/* 5 */ "the %s can see you with his infravision",
-/* 6 */ "the %s vaporizes your missile",
-/* 7 */ "your missile bounces off the %s",
-/* 8 */ "the %s doesn't sleep",
-/* 9 */ "the %s resists",
-/* 10 */ "the %s can't hear the noise",
-/* 11 */ "the %s's tail cuts it free of the web",
-/* 12 */ "the %s burns through the web",
-/* 13 */ "your missiles pass right through the %s",
-/* 14 */ "the %s sees through your illusions",
-/* 15 */ "the %s loves the cold!",
-/* 16 */ "the %s loves the water!"
- };
-
-char to_lower[]= /* tolower[character] = lower case converted character */
- {
- 0000,0001,0002,0003,0004,0005,0006,0007,0010,0011,0012,0013,0014,0015,0016,0017, /* NUL-SI*/
- 0020,0021,0022,0023,0024,0025,0026,0027,0030,0031,0032,0033,0034,0035,0036,0037, /* DLE-US*/
- 0040,0041,0042,0043,0044,0045,0046,0047,0050,0051,0052,0053,0054,0055,0056,0057, /* SP-/ */
- 0060,0061,0062,0063,0064,0065,0066,0067,0070,0071,0072,0073,0074,0075,0076,0077, /* 0-? */
- 0100,0141,0142,0143,0144,0145,0146,0147,0150,0151,0152,0153,0154,0155,0156,0157, /* @-O */
- 0160,0161,0162,0163,0164,0165,0166,0167,0170,0171,0172,0133,0134,0135,0136,0137, /* P-_ */
- 0140,0141,0142,0143,0144,0145,0146,0147,0150,0151,0152,0153,0154,0155,0156,0157, /* `-o */
- 0160,0161,0162,0163,0164,0165,0166,0167,0170,0171,0172,0173,0174,0175,0176,0177, /* p-DEL */
- };
-
-char to_upper[]= /* toupper[character] = upper case converted character */
- {
- 0000,0001,0002,0003,0004,0005,0006,0007,0010,0011,0012,0013,0014,0015,0016,0017, /* NUL-SI*/
- 0020,0021,0022,0023,0024,0025,0026,0027,0030,0031,0032,0033,0034,0035,0036,0037, /* DLE-US*/
- 0040,0041,0042,0043,0044,0045,0046,0047,0050,0051,0052,0053,0054,0055,0056,0057, /* SP-/ */
- 0060,0061,0062,0063,0064,0065,0066,0067,0070,0071,0072,0073,0074,0075,0076,0077, /* 0-? */
- 0100,0101,0102,0103,0104,0105,0106,0107,0110,0111,0112,0113,0114,0115,0116,0117, /* @-O */
- 0120,0121,0122,0123,0124,0125,0126,0127,0130,0131,0132,0133,0134,0135,0136,0137, /* P-_ */
- 0140,0101,0102,0103,0104,0105,0106,0107,0110,0111,0112,0113,0114,0115,0116,0117, /* `-o */
- 0120,0121,0122,0123,0124,0125,0126,0127,0130,0131,0132,0173,0174,0175,0176,0177, /* p-DEL */
- };
-
-char is_digit[]= /* isdigit[character] = TRUE || FALSE */
- {
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* NUL-SI*/
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* DLE-US*/
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* SP-/ */
- 1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0, /* 0-? */
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* @-O */
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* P-_ */
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* `-o */
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* p-DEL */
- };
-
-char is_alpha[]= /* isalpha[character] = TRUE || FALSE */
- {
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* NUL-SI*/
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* DLE-US*/
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* SP-/ */
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0-? */
- 0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* @-O */
- 1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0, /* P-_ */
- 0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* `-o */
- 1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0, /* p-DEL */
- };
+};
+
+char spelweird[MAXMONST + 8][SPNUM] = {
+ /*
+ * p m d s c s w s e h c c p i b c p c h c v d l d g f f
+ * s h s t m s g s w a p
+ */
+ /*
+ * r l e l h s e t n e b r h n a l l a a k p r i r l l g
+ * c l t e f p e u t l e
+ */
+ /*
+ * o e x e m p b r l l l e a v l d y n s l r y t l o o r
+ * a d p l i h n m w t r
+ */
+
+
+ /* bat */ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ /* gnome */ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ /* hobgoblin */ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ /* jackal */ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ /* kobold */ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+
+ /* orc */ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ /* snake */ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ /* giant centipede */ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ /* jaculi */ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ /* troglodyte */ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+
+ /* giant ant */ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ /* floating eye */ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ /* leprechaun */ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ /* nymph */ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ /* quasit */ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+
+ /* rust monster */ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ /* zombie */ {0, 0, 0, 8, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 4, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ /* assassin bug */ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ /* bugbear */ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ /* hell hound */ {0, 6, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+
+ /* ice lizard */ {0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ /* centaur */ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ /* troll */ {0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ /* yeti */ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ /* white dragon */ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 15, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+
+ /* elf */ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ /* gelatinous cube */ {0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ /* metamorph */ {0, 13, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 4, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ /* vortex */ {0, 13, 0, 0, 0, 10, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 4, 0, 0, 0, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ /* ziller */ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+
+ /* violet fungi */ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ /* wraith */ {0, 0, 0, 8, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 4, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ /* forvalaka */ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ /* lama nobe */ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ /* osequip */ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+
+ /* rothe */ {0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ /* xorn */ {0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ /* vampire */ {0, 0, 0, 8, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ /* invisible staker */ {0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ /* poltergeist */ {0, 13, 0, 8, 0, 4, 1, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 4, 0, 0, 0, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+
+ /* disenchantress */ {0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ /* shambling mound */ {0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ /* yellow mold */ {0, 0, 0, 8, 0, 0, 1, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ /* umber hulk */ {0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ /* gnome king */ {0, 7, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+
+ /* mimic */ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ /* water lord */ {0, 13, 0, 8, 3, 4, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 4, 0, 0, 0, 0, 0, 16, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ /* bronze dragon */ {0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ /* green dragon */ {0, 7, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ /* purple worm */ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+
+ /* xvart */ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ /* spirit naga */ {0, 13, 0, 8, 3, 4, 1, 0, 0, 0, 0, 0, 0, 5, 0, 4, 9, 0, 0, 4, 0, 4, 0, 0, 0, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ /* silver dragon */ {0, 6, 0, 9, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ /* platinum dragon */ {0, 7, 0, 9, 0, 0, 11, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ /* green urchin */ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+ /* red dragon */ {0, 6, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
+
+ /*
+ * p m d s c s w s e h c c p i b c p c h c v d l d g f f
+ * s h s t m s g s w a p
+ */
+ /*
+ * r l e l h s e t n e b r h n a l l a a k p r i r l l g
+ * c l t e f p e u t l e
+ */
+ /*
+ * o e x e m p b r l l l e a v l d y n s l r y t l o o r
+ * a d p l i h n m w t r
+ */
+
+ /* demon lord */ {0, 7, 0, 4, 3, 0, 1, 0, 0, 0, 0, 0, 14, 5, 0, 0, 4, 0, 0, 4, 0, 4, 0, 0, 0, 4, 4, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0},
+ /* demon lord */ {0, 7, 0, 4, 3, 0, 1, 0, 0, 0, 0, 0, 14, 5, 0, 0, 4, 0, 0, 4, 0, 4, 0, 0, 0, 4, 4, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0},
+ /* demon lord */ {0, 7, 0, 4, 3, 0, 1, 0, 0, 0, 0, 0, 14, 5, 0, 0, 4, 0, 0, 4, 0, 4, 0, 0, 0, 4, 4, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0},
+ /* demon lord */ {0, 7, 0, 4, 3, 0, 1, 0, 0, 0, 0, 0, 14, 5, 0, 0, 4, 0, 0, 4, 0, 4, 0, 0, 0, 4, 4, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0},
+ /* demon lord */ {0, 7, 0, 4, 3, 0, 1, 0, 0, 0, 0, 0, 14, 5, 0, 0, 4, 0, 0, 4, 0, 4, 0, 0, 0, 4, 4, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0},
+ /* demon lord */ {0, 7, 0, 4, 3, 0, 1, 0, 0, 0, 0, 0, 14, 5, 0, 0, 4, 0, 0, 4, 0, 4, 0, 0, 0, 4, 4, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0},
+ /* demon lord */ {0, 7, 0, 4, 3, 0, 1, 0, 0, 0, 0, 0, 14, 5, 0, 0, 4, 0, 0, 4, 0, 4, 0, 0, 0, 4, 4, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0},
+ /* demon prince */ {0, 7, 0, 4, 3, 9, 1, 0, 0, 0, 0, 0, 14, 5, 0, 0, 4, 0, 0, 4, 0, 4, 0, 0, 0, 4, 4, 4, 0, 0, 0, 4, 9, 0, 0, 0, 0, 0}
+
+};
+
+char *spelmes[] = {"",
+ /* 1 */ "the web had no effect on the %s",
+ /* 2 */ "the %s changed shape to avoid the web",
+ /* 3 */ "the %s isn't afraid of you",
+ /* 4 */ "the %s isn't affected",
+ /* 5 */ "the %s can see you with his infravision",
+ /* 6 */ "the %s vaporizes your missile",
+ /* 7 */ "your missile bounces off the %s",
+ /* 8 */ "the %s doesn't sleep",
+ /* 9 */ "the %s resists",
+ /* 10 */ "the %s can't hear the noise",
+ /* 11 */ "the %s's tail cuts it free of the web",
+ /* 12 */ "the %s burns through the web",
+ /* 13 */ "your missiles pass right through the %s",
+ /* 14 */ "the %s sees through your illusions",
+ /* 15 */ "the %s loves the cold!",
+ /* 16 */ "the %s loves the water!"
+};
+
+u_char to_lower[] = /* tolower[character] = lower case converted
+ * character */
+{
+ 0000, 0001, 0002, 0003, 0004, 0005, 0006, 0007, 0010, 0011, 0012, 0013, 0014, 0015, 0016, 0017, /* NUL-SI */
+ 0020, 0021, 0022, 0023, 0024, 0025, 0026, 0027, 0030, 0031, 0032, 0033, 0034, 0035, 0036, 0037, /* DLE-US */
+ 0040, 0041, 0042, 0043, 0044, 0045, 0046, 0047, 0050, 0051, 0052, 0053, 0054, 0055, 0056, 0057, /* SP-/ */
+ 0060, 0061, 0062, 0063, 0064, 0065, 0066, 0067, 0070, 0071, 0072, 0073, 0074, 0075, 0076, 0077, /* 0-? */
+ 0100, 0141, 0142, 0143, 0144, 0145, 0146, 0147, 0150, 0151, 0152, 0153, 0154, 0155, 0156, 0157, /* @-O */
+ 0160, 0161, 0162, 0163, 0164, 0165, 0166, 0167, 0170, 0171, 0172, 0133, 0134, 0135, 0136, 0137, /* P-_ */
+ 0140, 0141, 0142, 0143, 0144, 0145, 0146, 0147, 0150, 0151, 0152, 0153, 0154, 0155, 0156, 0157, /* `-o */
+ 0160, 0161, 0162, 0163, 0164, 0165, 0166, 0167, 0170, 0171, 0172, 0173, 0174, 0175, 0176, 0177, /* p-DEL */
+};
+
+u_char to_upper[] = /* toupper[character] = upper case converted
+ * character */
+{
+ 0000, 0001, 0002, 0003, 0004, 0005, 0006, 0007, 0010, 0011, 0012, 0013, 0014, 0015, 0016, 0017, /* NUL-SI */
+ 0020, 0021, 0022, 0023, 0024, 0025, 0026, 0027, 0030, 0031, 0032, 0033, 0034, 0035, 0036, 0037, /* DLE-US */
+ 0040, 0041, 0042, 0043, 0044, 0045, 0046, 0047, 0050, 0051, 0052, 0053, 0054, 0055, 0056, 0057, /* SP-/ */
+ 0060, 0061, 0062, 0063, 0064, 0065, 0066, 0067, 0070, 0071, 0072, 0073, 0074, 0075, 0076, 0077, /* 0-? */
+ 0100, 0101, 0102, 0103, 0104, 0105, 0106, 0107, 0110, 0111, 0112, 0113, 0114, 0115, 0116, 0117, /* @-O */
+ 0120, 0121, 0122, 0123, 0124, 0125, 0126, 0127, 0130, 0131, 0132, 0133, 0134, 0135, 0136, 0137, /* P-_ */
+ 0140, 0101, 0102, 0103, 0104, 0105, 0106, 0107, 0110, 0111, 0112, 0113, 0114, 0115, 0116, 0117, /* `-o */
+ 0120, 0121, 0122, 0123, 0124, 0125, 0126, 0127, 0130, 0131, 0132, 0173, 0174, 0175, 0176, 0177, /* p-DEL */
+};
+
+u_char is_digit[] = /* isdigit[character] = TRUE || FALSE */
+{
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* NUL-SI */
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* DLE-US */
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* SP-/ */
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, /* 0-? */
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* @-O */
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* P-_ */
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* `-o */
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* p-DEL */
+};
+
+u_char is_alpha[] = /* isalpha[character] = TRUE || FALSE */
+{
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* NUL-SI */
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* DLE-US */
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* SP-/ */
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0-? */
+ 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* @-O */
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, /* P-_ */
+ 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* `-o */
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, /* p-DEL */
+};
/*
- * function to create scroll numbers with appropriate probability of
+ * function to create scroll numbers with appropriate probability of
* occurrence
*
* 0 - armor 1 - weapon 2 - enlightenment 3 - paper
@@ -631,13 +682,13 @@ char is_alpha[]= /* isalpha[character] = TRUE || FALSE */
* 14 - stealth 15 - magic mapping 16 - hold monster
* 17 - gem perfection 18 - spell extension 19 - identify
* 20 - remove curse 21 - annihilation 22 - pulverization
- * 23 - life protection
+ * 23 - life protection
*/
-char scprob[]= { 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3,
+u_char scprob[] = {0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3,
3, 3, 3, 4, 4, 4, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 9, 9,
9, 9, 10, 10, 10, 10, 11, 11, 11, 12, 12, 12, 13, 13, 13, 13, 14, 14,
15, 15, 16, 16, 16, 17, 17, 18, 18, 19, 19, 19, 20, 20, 20, 20, 21, 22,
- 22, 22, 23 };
+22, 22, 23};
/*
* function to return a potion number created with appropriate probability
@@ -652,10 +703,10 @@ char scprob[]= { 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3,
* 18 - fire resistance 19 - treasure finding 20 - instant healing
* 21 - cure dianthroritis 22 - poison 23 - see invisible
*/
-char potprob[] = { 0, 0, 1, 1, 1, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 9, 9, 9, 10, 10, 10, 11, 11, 12, 12, 13, 14, 15, 16, 17, 18, 19, 19, 20, 20, 22, 22, 23, 23 };
+u_char potprob[] = {0, 0, 1, 1, 1, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 9, 9, 9, 10, 10, 10, 11, 11, 12, 12, 13, 14, 15, 16, 17, 18, 19, 19, 20, 20, 22, 22, 23, 23};
-char nlpts[] = { 0, 0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 5, 6, 7 };
-char nch[] = { 0, 0, 0, 1, 1, 1, 2, 2, 3, 4 };
-char nplt[] = { 0, 0, 0, 0, 1, 1, 2, 2, 3, 4 };
-char ndgg[] = { 0, 0, 0, 1, 1, 1, 1, 2, 2, 3, 3, 4, 5 };
-char nsw[] = { 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 3 };
+u_char nlpts[] = {0, 0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 5, 6, 7};
+u_char nch[] = {0, 0, 0, 1, 1, 1, 2, 2, 3, 4};
+u_char nplt[] = {0, 0, 0, 0, 1, 1, 2, 2, 3, 4};
+u_char ndgg[] = {0, 0, 0, 1, 1, 1, 1, 2, 2, 3, 3, 4, 5};
+u_char nsw[] = {0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 3};
diff --git a/games/larn/diag.c b/games/larn/diag.c
index 51dee60cbd3..b51c07a1512 100644
--- a/games/larn/diag.c
+++ b/games/larn/diag.c
@@ -1,65 +1,71 @@
+/* $OpenBSD: diag.c,v 1.3 1998/09/15 05:12:31 pjanzen Exp $ */
+/* $NetBSD: diag.c,v 1.8 1997/10/18 20:03:12 christos Exp $ */
+
+/* diag.c Larn is copyrighted 1986 by Noah Morgan. */
#ifndef lint
-static char rcsid[] = "$NetBSD: diag.c,v 1.6 1995/04/24 12:23:49 cgd Exp $";
-#endif /* not lint */
+static char rcsid[] = "$OpenBSD: diag.c,v 1.3 1998/09/15 05:12:31 pjanzen Exp $";
+#endif /* not lint */
-/* diag.c Larn is copyrighted 1986 by Noah Morgan. */
#include <sys/types.h>
#include <sys/times.h>
#include <sys/stat.h>
+#include <stdlib.h>
+#include <unistd.h>
#include "header.h"
-extern long int initialtime;
-extern int rmst,maxitm,lasttime;
-extern char nosignal;
+#include "extern.h"
+
static struct tms cputime;
-/*
- ***************************
- DIAG -- dungeon diagnostics
- ***************************
- subroutine to print out data for debugging
+/*
+ * ***************************
+ * DIAG -- dungeon diagnostics
+ * ***************************
+ *
+ * subroutine to print out data for debugging
*/
#ifdef EXTRA
-static int rndcount[16];
+static int rndcount[16];
+void
diag()
- {
- register int i,j;
- int hit,dam;
- cursors(); lwclose();
- if (lcreat(diagfile) < 0) /* open the diagnostic file */
- {
- lcreat((char*)0); lprcat("\ndiagnostic failure\n"); return(-1);
- }
+{
+ int i, j;
+ int hit, dam;
- write(1,"\nDiagnosing . . .\n",18);
+ cursors();
+ lwclose();
+ if (lcreat(diagfile) < 0) { /* open the diagnostic file */
+ lcreat((char *) 0);
+ lprcat("\ndiagnostic failure\n");
+ return (-1);
+ }
+ write(1, "\nDiagnosing . . .\n", 18);
lprcat("\n\nBeginning of DIAG diagnostics ----------\n");
-/* for the character attributes */
+ /* for the character attributes */
- lprintf("\n\nPlayer attributes:\n\nHit points: %2d(%2d)",(long)c[HP],(long)c[HPMAX]);
+ lprintf("\n\nPlayer attributes:\n\nHit points: %2d(%2d)", (long) c[HP], (long) c[HPMAX]);
lprintf("\ngold: %d Experience: %d Character level: %d Level in caverns: %d",
- (long)c[GOLD],(long)c[EXPERIENCE],(long)c[LEVEL],(long)level);
- lprintf("\nTotal types of monsters: %d",(long)MAXMONST+8);
+ (long) c[GOLD], (long) c[EXPERIENCE], (long) c[LEVEL], (long) level);
+ lprintf("\nTotal types of monsters: %d", (long) MAXMONST + 8);
lprcat("\f\nHere's the dungeon:\n\n");
- i=level;
- for (j=0; j<MAXLEVEL+MAXVLEVEL; j++)
- {
+ i = level;
+ for (j = 0; j < MAXLEVEL + MAXVLEVEL; j++) {
newcavelevel(j);
- lprintf("\nMaze for level %s:\n",levelname[level]);
+ lprintf("\nMaze for level %s:\n", levelname[level]);
diagdrawscreen();
- }
+ }
newcavelevel(i);
lprcat("\f\nNow for the monster data:\n\n");
lprcat(" Monster Name LEV AC DAM ATT DEF GOLD HP EXP \n");
lprcat("--------------------------------------------------------------------------\n");
- for (i=0; i<=MAXMONST+8; i++)
- {
- lprintf("%19s %2d %3d ",monster[i].name,(long)monster[i].level,(long)monster[i].armorclass);
- lprintf(" %3d %3d %3d ",(long)monster[i].damage,(long)monster[i].attack,(long)monster[i].defense);
- lprintf("%6d %3d %6d\n",(long)monster[i].gold,(long)monster[i].hitpoints,(long)monster[i].experience);
- }
+ for (i = 0; i <= MAXMONST + 8; i++) {
+ lprintf("%19s %2d %3d ", monster[i].name, (long) monster[i].level, (long) monster[i].armorclass);
+ lprintf(" %3d %3d %3d ", (long) monster[i].damage, (long) monster[i].attack, (long) monster[i].defense);
+ lprintf("%6d %3d %6d\n", (long) monster[i].gold, (long) monster[i].hitpoints, (long) monster[i].experience);
+ }
lprcat("\n\nHere's a Table for the to hit percentages\n");
lprcat("\n We will be assuming that players level = 2 * monster level");
@@ -70,249 +76,335 @@ diag()
lprcat("\n Each entry is as follows: to hit / damage / number hits to kill\n");
lprcat("\n monster WC = 4 WC = 20 WC = 40");
lprcat("\n---------------------------------------------------------------");
- for (i=0; i<=MAXMONST+8; i++)
- {
- hit = 2*monster[i].armorclass+2*monster[i].level+16;
+ for (i = 0; i <= MAXMONST + 8; i++) {
+ hit = 2 * monster[i].armorclass + 2 * monster[i].level + 16;
dam = 16 - c[HARDGAME];
lprintf("\n%20s %2d/%2d/%2d %2d/%2d/%2d %2d/%2d/%2d",
- monster[i].name,
- (long)(hit/2),(long)max(0,dam+2),(long)(monster[i].hitpoints/(dam+2)+1),
- (long)((hit+2)/2),(long)max(0,dam+10),(long)(monster[i].hitpoints/(dam+10)+1),
- (long)((hit+5)/2),(long)max(0,dam+20),(long)(monster[i].hitpoints/(dam+20)+1));
- }
+ monster[i].name,
+ (long) (hit / 2), (long) max(0, dam + 2), (long) (monster[i].hitpoints / (dam + 2) + 1),
+ (long) ((hit + 2) / 2), (long) max(0, dam + 10), (long) (monster[i].hitpoints / (dam + 10) + 1),
+ (long) ((hit + 5) / 2), (long) max(0, dam + 20), (long) (monster[i].hitpoints / (dam + 20) + 1));
+ }
lprcat("\n\nHere's the list of available potions:\n\n");
- for (i=0; i<MAXPOTION; i++) lprintf("%20s\n",&potionhide[i][1]);
+ for (i = 0; i < MAXPOTION; i++)
+ lprintf("%20s\n", &potionhide[i][1]);
lprcat("\n\nHere's the list of available scrolls:\n\n");
- for (i=0; i<MAXSCROLL; i++) lprintf("%20s\n",&scrollhide[i][1]);
+ for (i = 0; i < MAXSCROLL; i++)
+ lprintf("%20s\n", &scrollhide[i][1]);
lprcat("\n\nHere's the spell list:\n\n");
lprcat("spell name description\n");
lprcat("-------------------------------------------------------------------------------------------\n\n");
- for (j=0; j<SPNUM; j++)
- {
- lprc(' '); lprcat(spelcode[j]);
- lprintf(" %21s %s\n",spelname[j],speldescript[j]);
- }
+ for (j = 0; j < SPNUM; j++) {
+ lprc(' ');
+ lprcat(spelcode[j]);
+ lprintf(" %21s %s\n", spelname[j], speldescript[j]);
+ }
lprcat("\n\nFor the c[] array:\n");
- for (j=0; j<100; j+=10)
- {
- lprintf("\nc[%2d] = ",(long)j); for (i=0; i<9; i++) lprintf("%5d ",(long)c[i+j]);
- }
+ for (j = 0; j < 100; j += 10) {
+ lprintf("\nc[%2d] = ", (long) j);
+ for (i = 0; i < 9; i++)
+ lprintf("%5d ", (long) c[i + j]);
+ }
lprcat("\n\nTest of random number generator ----------------");
lprcat("\n for 25,000 calls divided into 16 slots\n\n");
- for (i=0; i<16; i++) rndcount[i]=0;
- for (i=0; i<25000; i++) rndcount[rund(16)]++;
- for (i=0; i<16; i++) { lprintf(" %5d",(long)rndcount[i]); if (i==7) lprc('\n'); }
-
- lprcat("\n\n"); lwclose();
- lcreat((char*)0); lprcat("Done Diagnosing . . .");
- return(0);
+ for (i = 0; i < 16; i++)
+ rndcount[i] = 0;
+ for (i = 0; i < 25000; i++)
+ rndcount[rund(16)]++;
+ for (i = 0; i < 16; i++) {
+ lprintf(" %5d", (long) rndcount[i]);
+ if (i == 7)
+ lprc('\n');
}
+
+ lprcat("\n\n");
+ lwclose();
+ lcreat((char *) 0);
+ lprcat("Done Diagnosing . . .");
+ return (0);
+}
/*
- subroutine to count the number of occurrences of an object
+ * subroutine to count the number of occurrences of an object
*/
+int
dcount(l)
- int l;
- {
- register int i,j,p;
- int k;
- k=0;
- for (i=0; i<MAXX; i++)
- for (j=0; j<MAXY; j++)
- for (p=0; p<MAXLEVEL; p++)
- if (cell[p*MAXX*MAXY+i*MAXY+j].item == l) k++;
- return(k);
- }
+ int l;
+{
+ int i, j, p;
+ int k;
+
+ k = 0;
+ for (i = 0; i < MAXX; i++)
+ for (j = 0; j < MAXY; j++)
+ for (p = 0; p < MAXLEVEL; p++)
+ if (cell[p * MAXX * MAXY + i * MAXY + j].item == l)
+ k++;
+ return (k);
+}
/*
- subroutine to draw the whole screen as the player knows it
+ * subroutine to draw the whole screen as the player knows it
*/
+void
diagdrawscreen()
- {
- register int i,j,k;
+{
+ int i, j, k;
- for (i=0; i<MAXY; i++)
-
-/* for the east west walls of this line */
- {
- for (j=0; j<MAXX; j++) if (k=mitem[j][i]) lprc(monstnamelist[k]); else
- lprc(objnamelist[item[j][i]]);
+ for (i = 0; i < MAXY; i++)
+ /* for the east west walls of this line */
+ {
+ for (j = 0; j < MAXX; j++)
+ if (k = mitem[j][i])
+ lprc(monstnamelist[k]);
+ else
+ lprc(objnamelist[item[j][i]]);
lprc('\n');
- }
}
+}
#endif
-
+
+
/*
- to save the game in a file
+ * to save the game in a file
*/
-static time_t zzz=0;
+static time_t zzz = 0;
+int
savegame(fname)
char *fname;
- {
- register int i,k;
- register struct sphere *sp;
- struct stat statbuf;
- nosignal=1; lflush(); savelevel();
- ointerest();
- if (lcreat(fname) < 0)
- {
- lcreat((char*)0); lprintf("\nCan't open file <%s> to save game\n",fname);
- nosignal=0; return(-1);
- }
+{
+ int i, k;
+ struct sphere *sp;
+ struct stat statbuf;
+ nosignal = 1;
+ lflush();
+ savelevel();
+ ointerest();
+ if (lcreat(fname) < 0) {
+ lcreat((char *) 0);
+ lprintf("\nCan't open file <%s> to save game\n", fname);
+ nosignal = 0;
+ return (-1);
+ }
set_score_output();
- lwrite((char*)beenhere,MAXLEVEL+MAXVLEVEL);
- for (k=0; k<MAXLEVEL+MAXVLEVEL; k++)
+ lwrite((char *) beenhere, MAXLEVEL + MAXVLEVEL);
+ for (k = 0; k < MAXLEVEL + MAXVLEVEL; k++)
if (beenhere[k])
- lwrite((char*)&cell[k*MAXX*MAXY],sizeof(struct cel)*MAXY*MAXX);
+ lwrite((char *) &cell[k * MAXX * MAXY], sizeof(struct cel) * MAXY * MAXX);
times(&cputime); /* get cpu time */
- c[CPUTIME] += (cputime.tms_utime+cputime.tms_stime)/60;
- lwrite((char*)&c[0],100*sizeof(long));
- lprint((long)gltime); lprc(level);
- lprc(playerx); lprc(playery);
- lwrite((char*)iven,26); lwrite((char*)ivenarg,26*sizeof(short));
- for (k=0; k<MAXSCROLL; k++) lprc(scrollname[k][0]);
- for (k=0; k<MAXPOTION; k++) lprc(potionname[k][0]);
- lwrite((char*)spelknow,SPNUM); lprc(wizard);
- lprc(rmst); /* random monster generation counter */
- for (i=0; i<90; i++) lprc(itm[i].qty);
- lwrite((char*)course,25); lprc(cheat); lprc(VERSION);
- for (i=0; i<MAXMONST; i++) lprc(monster[i].genocided); /* genocide info */
- for (sp=spheres; sp; sp=sp->p)
- lwrite((char*)sp,sizeof(struct sphere)); /* save spheres of annihilation */
- time(&zzz); lprint((long)(zzz-initialtime));
- lwrite((char*)&zzz,sizeof(long));
- if (fstat(lfd,&statbuf)< 0) lprint(0L);
- else lprint((long)statbuf.st_ino); /* inode # */
- lwclose(); lastmonst[0] = 0;
+ c[CPUTIME] += (cputime.tms_utime + cputime.tms_stime) / 60;
+ lwrite((char *) &c[0], 100 * sizeof(long));
+ lprint((long) gltime);
+ lprc(level);
+ lprc(playerx);
+ lprc(playery);
+ lwrite((char *) iven, 26);
+ lwrite((char *) ivenarg, 26 * sizeof(short));
+ for (k = 0; k < MAXSCROLL; k++)
+ lprc(scrollname[k][0]);
+ for (k = 0; k < MAXPOTION; k++)
+ lprc(potionname[k][0]);
+ lwrite((char *) spelknow, SPNUM);
+ lprc(wizard);
+ lprc(rmst); /* random monster generation counter */
+ for (i = 0; i < 90; i++)
+ lprc(itm[i].qty);
+ lwrite((char *) course, 25);
+ lprc(cheat);
+ lprc(VERSION);
+ for (i = 0; i < MAXMONST; i++)
+ lprc(monster[i].genocided); /* genocide info */
+ for (sp = spheres; sp; sp = sp->p)
+ lwrite((char *) sp, sizeof(struct sphere)); /* save spheres of
+ * annihilation */
+ time(&zzz);
+ lprint((long) (zzz - initialtime));
+ lwrite((char *) &zzz, sizeof(long));
+ if (fstat(lfd, &statbuf) < 0)
+ lprint(0L);
+ else
+ lprint((long) statbuf.st_ino); /* inode # */
+ lwclose();
+ lastmonst[0] = 0;
#ifndef VT100
setscroll();
-#endif VT100
- lcreat((char*)0); nosignal=0;
- return(0);
- }
+#endif /* VT100 */
+ lcreat((char *) 0);
+ nosignal = 0;
+ return (0);
+}
+void
restoregame(fname)
- char *fname;
- {
- register int i,k;
- register struct sphere *sp,*sp2;
- struct stat filetimes;
- cursors(); lprcat("\nRestoring . . ."); lflush();
- if (lopen(fname) <= 0)
- {
- lcreat((char*)0); lprintf("\nCan't open file <%s>to restore game\n",fname);
- nap(2000); c[GOLD]=c[BANKACCOUNT]=0; died(-265); return;
- }
+ char *fname;
+{
+ int i, k;
+ struct sphere *sp, *sp2;
+ struct stat filetimes;
- lrfill((char*)beenhere,MAXLEVEL+MAXVLEVEL);
- for (k=0; k<MAXLEVEL+MAXVLEVEL; k++)
+ cursors();
+ lprcat("\nRestoring . . .");
+ lflush();
+ if (lopen(fname) <= 0) {
+ lcreat((char *) 0);
+ lprintf("\nCan't open file <%s>to restore game\n", fname);
+ nap(2000);
+ c[GOLD] = c[BANKACCOUNT] = 0;
+ died(-265);
+ return;
+ }
+ lrfill((char *) beenhere, MAXLEVEL + MAXVLEVEL);
+ for (k = 0; k < MAXLEVEL + MAXVLEVEL; k++)
if (beenhere[k])
- lrfill((char*)&cell[k*MAXX*MAXY],sizeof(struct cel)*MAXY*MAXX);
+ lrfill((char *) &cell[k * MAXX * MAXY], sizeof(struct cel) * MAXY * MAXX);
- lrfill((char*)&c[0],100*sizeof(long)); gltime = lrint();
+ lrfill((char *) &c[0], 100 * sizeof(long));
+ gltime = lrint();
level = c[CAVELEVEL] = lgetc();
- playerx = lgetc(); playery = lgetc();
- lrfill((char*)iven,26); lrfill((char*)ivenarg,26*sizeof(short));
- for (k=0; k<MAXSCROLL; k++) scrollname[k] = lgetc() ? scrollhide[k] : "";
- for (k=0; k<MAXPOTION; k++) potionname[k] = lgetc() ? potionhide[k] : "";
- lrfill((char*)spelknow,SPNUM); wizard = lgetc();
- rmst = lgetc(); /* random monster creation flag */
-
- for (i=0; i<90; i++) itm[i].qty = lgetc();
- lrfill((char*)course,25); cheat = lgetc();
- if (VERSION != lgetc()) /* version number */
- {
- cheat=1;
- lprcat("Sorry, But your save file is for an older version of larn\n");
- nap(2000); c[GOLD]=c[BANKACCOUNT]=0; died(-266); return;
- }
+ playerx = lgetc();
+ playery = lgetc();
+ lrfill((char *) iven, 26);
+ lrfill((char *) ivenarg, 26 * sizeof(short));
+ for (k = 0; k < MAXSCROLL; k++)
+ scrollname[k] = lgetc() ? scrollhide[k] : "";
+ for (k = 0; k < MAXPOTION; k++)
+ potionname[k] = lgetc() ? potionhide[k] : "";
+ lrfill((char *) spelknow, SPNUM);
+ wizard = lgetc();
+ rmst = lgetc(); /* random monster creation flag */
- for (i=0; i<MAXMONST; i++) monster[i].genocided=lgetc(); /* genocide info */
- for (sp=0,i=0; i<c[SPHCAST]; i++)
- {
+ for (i = 0; i < 90; i++)
+ itm[i].qty = lgetc();
+ lrfill((char *) course, 25);
+ cheat = lgetc();
+ if (VERSION != lgetc()) { /* version number */
+ cheat = 1;
+ lprcat("Sorry, But your save file is for an older version of larn\n");
+ nap(2000);
+ c[GOLD] = c[BANKACCOUNT] = 0;
+ died(-266);
+ return;
+ }
+ for (i = 0; i < MAXMONST; i++)
+ monster[i].genocided = lgetc(); /* genocide info */
+ for (sp = 0, i = 0; i < c[SPHCAST]; i++) {
sp2 = sp;
- sp = (struct sphere *)malloc(sizeof(struct sphere));
- if (sp==0) { write(2,"Can't malloc() for sphere space\n",32); break; }
- lrfill((char*)sp,sizeof(struct sphere)); /* get spheres of annihilation */
- sp->p=0; /* null out pointer */
- if (i==0) spheres=sp; /* beginning of list */
- else sp2->p = sp;
+ sp = (struct sphere *) malloc(sizeof(struct sphere));
+ if (sp == 0) {
+ write(2, "Can't malloc() for sphere space\n", 32);
+ break;
}
+ lrfill((char *) sp, sizeof(struct sphere)); /* get spheres of
+ * annihilation */
+ sp->p = 0; /* null out pointer */
+ if (i == 0)
+ spheres = sp; /* beginning of list */
+ else
+ sp2->p = sp;
+ }
time(&zzz);
- initialtime = zzz-lrint();
- fstat(fd,&filetimes); /* get the creation and modification time of file */
- lrfill((char*)&zzz,sizeof(long)); zzz += 6;
- if (filetimes.st_ctime > zzz) fsorry(); /* file create time */
- else if (filetimes.st_mtime > zzz) fsorry(); /* file modify time */
- if (c[HP]<0) { died(284); return; } /* died a post mortem death */
-
+ initialtime = zzz - lrint();
+ fstat(fd, &filetimes); /* get the creation and modification time of
+ * file */
+ lrfill((char *) &zzz, sizeof(long));
+ zzz += 6;
+ if (filetimes.st_ctime > zzz)
+ fsorry(); /* file create time */
+ else if (filetimes.st_mtime > zzz)
+ fsorry(); /* file modify time */
+ if (c[HP] < 0) {
+ died(284);
+ return;
+ } /* died a post mortem death */
oldx = oldy = 0;
- i = lrint(); /* inode # */
- if (i && (filetimes.st_ino!=i)) fsorry();
+ i = lrint(); /* inode # */
+ if (i && (filetimes.st_ino != i))
+ fsorry();
lrclose();
- if (strcmp(fname,ckpfile) == 0)
- {
- if (lappend(fname) < 0) fcheat(); else { lprc(' '); lwclose(); }
- lcreat((char*)0);
+ if (strcmp(fname, ckpfile) == 0) {
+ if (lappend(fname) < 0)
+ fcheat();
+ else {
+ lprc(' ');
+ lwclose();
}
- else if (unlink(fname) < 0) fcheat(); /* can't unlink save file */
-/* for the greedy cheater checker */
- for (k=0; k<6; k++) if (c[k]>99) greedy();
- if (c[HPMAX]>999 || c[SPELLMAX]>125) greedy();
- if (c[LEVEL]==25 && c[EXPERIENCE]>skill[24]) /* if patch up lev 25 player */
- {
- long tmp;
- tmp = c[EXPERIENCE]-skill[24]; /* amount to go up */
+ lcreat((char *) 0);
+ } else if (unlink(fname) < 0)
+ fcheat(); /* can't unlink save file */
+ /* for the greedy cheater checker */
+ for (k = 0; k < 6; k++)
+ if (c[k] > 99)
+ greedy();
+ if (c[HPMAX] > 999 || c[SPELLMAX] > 125)
+ greedy();
+ if (c[LEVEL] == 25 && c[EXPERIENCE] > skill[24]) { /* if patch up lev 25
+ * player */
+ long tmp;
+ tmp = c[EXPERIENCE] - skill[24]; /* amount to go up */
c[EXPERIENCE] = skill[24];
- raiseexperience((long)tmp);
- }
- getlevel(); lasttime=gltime;
+ raiseexperience((long) tmp);
}
+ getlevel();
+ lasttime = gltime;
+}
/*
- subroutine to not allow greedy cheaters
+ * subroutine to not allow greedy cheaters
*/
+void
greedy()
- {
+{
#if WIZID
- if (wizard) return;
+ if (wizard)
+ return;
#endif
lprcat("\n\nI am so sorry, but your character is a little TOO good! Since this\n");
lprcat("cannot normally happen from an honest game, I must assume that you cheated.\n");
lprcat("In that you are GREEDY as well as a CHEATER, I cannot allow this game\n");
- lprcat("to continue.\n"); nap(5000); c[GOLD]=c[BANKACCOUNT]=0; died(-267); return;
- }
+ lprcat("to continue.\n");
+ nap(5000);
+ c[GOLD] = c[BANKACCOUNT] = 0;
+ died(-267);
+ return;
+}
/*
- subroutine to not allow altered save files and terminate the attempted
- restart
+ * subroutine to not allow altered save files and terminate the attempted
+ * restart
*/
+void
fsorry()
- {
+{
lprcat("\nSorry, but your savefile has been altered.\n");
lprcat("However, seeing as I am a good sport, I will let you play.\n");
lprcat("Be advised though, you won't be placed on the normal scoreboard.");
- cheat = 1; nap(4000);
- }
+ cheat = 1;
+ nap(4000);
+}
/*
- subroutine to not allow game if save file can't be deleted
+ * subroutine to not allow game if save file can't be deleted
*/
+void
fcheat()
- {
+{
#if WIZID
- if (wizard) return;
+ if (wizard)
+ return;
#endif
lprcat("\nSorry, but your savefile can't be deleted. This can only mean\n");
lprcat("that you tried to CHEAT by protecting the directory the savefile\n");
lprcat("is in. Since this is unfair to the rest of the larn community, I\n");
lprcat("cannot let you play this game.\n");
- nap(5000); c[GOLD]=c[BANKACCOUNT]=0; died(-268); return;
- }
+ nap(5000);
+ c[GOLD] = c[BANKACCOUNT] = 0;
+ died(-268);
+ return;
+}
diff --git a/games/larn/display.c b/games/larn/display.c
index adfcefe3b3f..cd2da384683 100644
--- a/games/larn/display.c
+++ b/games/larn/display.c
@@ -1,438 +1,636 @@
+/* $OpenBSD: display.c,v 1.2 1998/09/15 05:12:31 pjanzen Exp $ */
+/* $NetBSD: display.c,v 1.4 1997/10/18 20:03:15 christos Exp $ */
+
+/* display.c Larn is copyrighted 1986 by Noah Morgan. */
#ifndef lint
-static char rcsid[] = "$NetBSD: display.c,v 1.3 1995/03/23 08:33:21 cgd Exp $";
+static char rcsid[] = "$OpenBSD: display.c,v 1.2 1998/09/15 05:12:31 pjanzen Exp $";
#endif /* not lint */
-/* display.c Larn is copyrighted 1986 by Noah Morgan. */
#include "header.h"
+#include "extern.h"
#define makecode(_a,_b,_c) (((_a)<<16) + ((_b)<<8) + (_c))
-static int minx,maxx,miny,maxy,k,m;
-static char bot1f=0,bot2f=0,bot3f=0;
-char always=0;
-/*
- bottomline()
+static void botsub __P((int, char *));
- now for the bottom line of the display
+static int minx, maxx, miny, maxy, k, m;
+static char bot1f = 0, bot2f = 0, bot3f = 0;
+char always = 0;
+/*
+ * bottomline()
+ *
+ * now for the bottom line of the display
*/
+void
bottomline()
- { recalc(); bot1f=1; }
+{
+ recalc();
+ bot1f = 1;
+}
+
+void
bottomhp()
- { bot2f=1; }
+{
+ bot2f = 1;
+}
+
+void
bottomspell()
- { bot3f=1; }
+{
+ bot3f = 1;
+}
+
+void
bottomdo()
- {
- if (bot1f) { bot3f=bot1f=bot2f=0; bot_linex(); return; }
- if (bot2f) { bot2f=0; bot_hpx(); }
- if (bot3f) { bot3f=0; bot_spellx(); }
+{
+ if (bot1f) {
+ bot3f = bot1f = bot2f = 0;
+ bot_linex();
+ return;
}
+ if (bot2f) {
+ bot2f = 0;
+ bot_hpx();
+ }
+ if (bot3f) {
+ bot3f = 0;
+ bot_spellx();
+ }
+}
-static void botsub();
-
+void
bot_linex()
- {
- register int i;
- if (cbak[SPELLS] <= -50 || (always))
- {
- cursor( 1,18);
- if (c[SPELLMAX]>99) lprintf("Spells:%3d(%3d)",(long)c[SPELLS],(long)c[SPELLMAX]);
- else lprintf("Spells:%3d(%2d) ",(long)c[SPELLS],(long)c[SPELLMAX]);
- lprintf(" AC: %-3d WC: %-3d Level",(long)c[AC],(long)c[WCLASS]);
- if (c[LEVEL]>99) lprintf("%3d",(long)c[LEVEL]);
- else lprintf(" %-2d",(long)c[LEVEL]);
- lprintf(" Exp: %-9d %s\n",(long)c[EXPERIENCE],class[c[LEVEL]-1]);
+{
+ int i;
+
+ if (cbak[SPELLS] <= -50 || (always)) {
+ cursor(1, 18);
+ if (c[SPELLMAX] > 99)
+ lprintf("Spells:%3d(%3d)", (long) c[SPELLS], (long) c[SPELLMAX]);
+ else
+ lprintf("Spells:%3d(%2d) ", (long) c[SPELLS], (long) c[SPELLMAX]);
+ lprintf(" AC: %-3d WC: %-3d Level", (long) c[AC], (long) c[WCLASS]);
+ if (c[LEVEL] > 99)
+ lprintf("%3d", (long) c[LEVEL]);
+ else
+ lprintf(" %-2d", (long) c[LEVEL]);
+ lprintf(" Exp: %-9d %s\n", (long) c[EXPERIENCE], class[c[LEVEL] - 1]);
lprintf("HP: %3d(%3d) STR=%-2d INT=%-2d ",
- (long)c[HP],(long)c[HPMAX],(long)(c[STRENGTH]+c[STREXTRA]),(long)c[INTELLIGENCE]);
+ (long) c[HP], (long) c[HPMAX], (long) (c[STRENGTH] + c[STREXTRA]), (long) c[INTELLIGENCE]);
lprintf("WIS=%-2d CON=%-2d DEX=%-2d CHA=%-2d LV:",
- (long)c[WISDOM],(long)c[CONSTITUTION],(long)c[DEXTERITY],(long)c[CHARISMA]);
-
- if ((level==0) || (wizard)) c[TELEFLAG]=0;
- if (c[TELEFLAG]) lprcat(" ?"); else lprcat(levelname[level]);
- lprintf(" Gold: %-6d",(long)c[GOLD]);
- always=1; botside();
- c[TMP] = c[STRENGTH]+c[STREXTRA];
- for (i=0; i<100; i++) cbak[i]=c[i];
- return;
- }
+ (long) c[WISDOM], (long) c[CONSTITUTION], (long) c[DEXTERITY], (long) c[CHARISMA]);
- botsub(makecode(SPELLS,8,18),"%3d");
- if (c[SPELLMAX]>99) botsub(makecode(SPELLMAX,12,18),"%3d)");
- else botsub(makecode(SPELLMAX,12,18),"%2d) ");
- botsub(makecode(HP,5,19),"%3d");
- botsub(makecode(HPMAX,9,19),"%3d");
- botsub(makecode(AC,21,18),"%-3d");
- botsub(makecode(WCLASS,30,18),"%-3d");
- botsub(makecode(EXPERIENCE,49,18),"%-9d");
- if (c[LEVEL] != cbak[LEVEL])
- { cursor(59,18); lprcat(class[c[LEVEL]-1]); }
- if (c[LEVEL]>99) botsub(makecode(LEVEL,40,18),"%3d");
- else botsub(makecode(LEVEL,40,18)," %-2d");
- c[TMP] = c[STRENGTH]+c[STREXTRA]; botsub(makecode(TMP,18,19),"%-2d");
- botsub(makecode(INTELLIGENCE,25,19),"%-2d");
- botsub(makecode(WISDOM,32,19),"%-2d");
- botsub(makecode(CONSTITUTION,39,19),"%-2d");
- botsub(makecode(DEXTERITY,46,19),"%-2d");
- botsub(makecode(CHARISMA,53,19),"%-2d");
- if ((level != cbak[CAVELEVEL]) || (c[TELEFLAG] != cbak[TELEFLAG]))
- {
- if ((level==0) || (wizard)) c[TELEFLAG]=0;
+ if ((level == 0) || (wizard))
+ c[TELEFLAG] = 0;
+ if (c[TELEFLAG])
+ lprcat(" ?");
+ else
+ lprcat(levelname[level]);
+ lprintf(" Gold: %-6d", (long) c[GOLD]);
+ always = 1;
+ botside();
+ c[TMP] = c[STRENGTH] + c[STREXTRA];
+ for (i = 0; i < 100; i++)
+ cbak[i] = c[i];
+ return;
+ }
+ botsub(makecode(SPELLS, 8, 18), "%3d");
+ if (c[SPELLMAX] > 99)
+ botsub(makecode(SPELLMAX, 12, 18), "%3d)");
+ else
+ botsub(makecode(SPELLMAX, 12, 18), "%2d) ");
+ botsub(makecode(HP, 5, 19), "%3d");
+ botsub(makecode(HPMAX, 9, 19), "%3d");
+ botsub(makecode(AC, 21, 18), "%-3d");
+ botsub(makecode(WCLASS, 30, 18), "%-3d");
+ botsub(makecode(EXPERIENCE, 49, 18), "%-9d");
+ if (c[LEVEL] != cbak[LEVEL]) {
+ cursor(59, 18);
+ lprcat(class[c[LEVEL] - 1]);
+ }
+ if (c[LEVEL] > 99)
+ botsub(makecode(LEVEL, 40, 18), "%3d");
+ else
+ botsub(makecode(LEVEL, 40, 18), " %-2d");
+ c[TMP] = c[STRENGTH] + c[STREXTRA];
+ botsub(makecode(TMP, 18, 19), "%-2d");
+ botsub(makecode(INTELLIGENCE, 25, 19), "%-2d");
+ botsub(makecode(WISDOM, 32, 19), "%-2d");
+ botsub(makecode(CONSTITUTION, 39, 19), "%-2d");
+ botsub(makecode(DEXTERITY, 46, 19), "%-2d");
+ botsub(makecode(CHARISMA, 53, 19), "%-2d");
+ if ((level != cbak[CAVELEVEL]) || (c[TELEFLAG] != cbak[TELEFLAG])) {
+ if ((level == 0) || (wizard))
+ c[TELEFLAG] = 0;
cbak[TELEFLAG] = c[TELEFLAG];
- cbak[CAVELEVEL] = level; cursor(59,19);
- if (c[TELEFLAG]) lprcat(" ?"); else lprcat(levelname[level]);
- }
- botsub(makecode(GOLD,69,19),"%-6d");
- botside();
+ cbak[CAVELEVEL] = level;
+ cursor(59, 19);
+ if (c[TELEFLAG])
+ lprcat(" ?");
+ else
+ lprcat(levelname[level]);
}
+ botsub(makecode(GOLD, 69, 19), "%-6d");
+ botside();
+}
/*
- special subroutine to update only the gold number on the bottomlines
- called from ogold()
+ * special subroutine to update only the gold number on the bottomlines
+ * called from ogold()
*/
+void
bottomgold()
- {
- botsub(makecode(GOLD,69,19),"%-6d");
-/* botsub(GOLD,"%-6d",69,19); */
- }
+{
+ botsub(makecode(GOLD, 69, 19), "%-6d");
+ /* botsub(GOLD,"%-6d",69,19); */
+}
/*
- special routine to update hp and level fields on bottom lines
- called in monster.c hitplayer() and spattack()
+ * special routine to update hp and level fields on bottom lines
+ * called in monster.c hitplayer() and spattack()
*/
+void
bot_hpx()
- {
- if (c[EXPERIENCE] != cbak[EXPERIENCE])
- {
- recalc(); bot_linex();
- }
- else botsub(makecode(HP,5,19),"%3d");
- }
+{
+ if (c[EXPERIENCE] != cbak[EXPERIENCE]) {
+ recalc();
+ bot_linex();
+ } else
+ botsub(makecode(HP, 5, 19), "%3d");
+}
/*
- special routine to update number of spells called from regen()
+ * special routine to update number of spells called from regen()
*/
+void
bot_spellx()
- {
- botsub(makecode(SPELLS,9,18),"%2d");
- }
+{
+ botsub(makecode(SPELLS, 9, 18), "%2d");
+}
/*
- common subroutine for a more economical bottomline()
+ * common subroutine for a more economical bottomline()
*/
-static struct bot_side_def
- {
- int typ;
- char *string;
- }
+static struct bot_side_def {
+ int typ;
+ char *string;
+}
bot_data[] =
- {
- STEALTH,"stealth", UNDEADPRO,"undead pro", SPIRITPRO,"spirit pro",
- CHARMCOUNT,"Charm", TIMESTOP,"Time Stop", HOLDMONST,"Hold Monst",
- GIANTSTR,"Giant Str", FIRERESISTANCE,"Fire Resit", DEXCOUNT,"Dexterity",
- STRCOUNT,"Strength", SCAREMONST,"Scare", HASTESELF,"Haste Self",
- CANCELLATION,"Cancel", INVISIBILITY,"Invisible", ALTPRO,"Protect 3",
- PROTECTIONTIME,"Protect 2", WTW,"Wall-Walk"
- };
-
+{
+ { STEALTH, "stealth"},
+ { UNDEADPRO, "undead pro" },
+ { SPIRITPRO, "spirit pro" },
+ { CHARMCOUNT, "Charm"},
+ { TIMESTOP, "Time Stop" },
+ { HOLDMONST, "Hold Monst" },
+ { GIANTSTR, "Giant Str"},
+ { FIRERESISTANCE, "Fire Resit" },
+ { DEXCOUNT, "Dexterity" },
+ { STRCNT, "Strength"},
+ { SCAREMONST, "Scare" },
+ { HASTESELF, "Haste Self" },
+ { CANCELLATION, "Cancel"},
+ { INVISIBILITY, "Invisible" },
+ { ALTPRO, "Protect 3" },
+ { PROTECTIONTIME, "Protect 2"},
+ { WTW, "Wall-Walk" }
+};
+
+void
botside()
- {
- register int i,idx;
- for (i=0; i<17; i++)
- {
+{
+ int i, idx;
+
+ for (i = 0; i < 17; i++) {
idx = bot_data[i].typ;
- if ((always) || (c[idx] != cbak[idx]))
- {
- if ((always) || (cbak[idx] == 0))
- { if (c[idx]) { cursor(70,i+1); lprcat(bot_data[i].string); } } else
- if (c[idx]==0) { cursor(70,i+1); lprcat(" "); }
- cbak[idx]=c[idx];
- }
+ if ((always) || (c[idx] != cbak[idx])) {
+ if ((always) || (cbak[idx] == 0)) {
+ if (c[idx]) {
+ cursor(70, i + 1);
+ lprcat(bot_data[i].string);
+ }
+ } else if (c[idx] == 0) {
+ cursor(70, i + 1);
+ lprcat(" ");
+ }
+ cbak[idx] = c[idx];
}
- always=0;
}
+ always = 0;
+}
static void
-botsub(idx,str)
- register int idx;
- char *str;
- {
- register int x,y;
- y = idx & 0xff; x = (idx>>8) & 0xff; idx >>= 16;
- if (c[idx] != cbak[idx])
- { cbak[idx]=c[idx]; cursor(x,y); lprintf(str,(long)c[idx]); }
+botsub(idx, str)
+ int idx;
+ char *str;
+{
+ int x, y;
+
+ y = idx & 0xff;
+ x = (idx >> 8) & 0xff;
+ idx >>= 16;
+ if (c[idx] != cbak[idx]) {
+ cbak[idx] = c[idx];
+ cursor(x, y);
+ lprintf(str, (long) c[idx]);
}
+}
/*
* subroutine to draw only a section of the screen
- * only the top section of the screen is updated. If entire lines are being
- * drawn, then they will be cleared first.
+ * only the top section of the screen is updated.
+ * If entire lines are being drawn, then they will be cleared first.
*/
-int d_xmin=0,d_xmax=MAXX,d_ymin=0,d_ymax=MAXY; /* for limited screen drawing */
-draws(xmin,xmax,ymin,ymax)
- int xmin,xmax,ymin,ymax;
- {
- register int i,idx;
- if (xmin==0 && xmax==MAXX) /* clear section of screen as needed */
- {
- if (ymin==0) cl_up(79,ymax);
- else for (i=ymin; i<ymin; i++) cl_line(1,i+1);
+/* for limited screen drawing */
+int d_xmin = 0, d_xmax = MAXX, d_ymin = 0, d_ymax = MAXY;
+
+void
+draws(xmin, xmax, ymin, ymax)
+ int xmin, xmax, ymin, ymax;
+{
+ int i, idx;
+ if (xmin == 0 && xmax == MAXX) { /* clear section of screen as
+ * needed */
+ if (ymin == 0)
+ cl_up(79, ymax);
+ else
+ for (i = ymin; i < ymin; i++)
+ cl_line(1, i + 1);
xmin = -1;
- }
- d_xmin=xmin; d_xmax=xmax; d_ymin=ymin; d_ymax=ymax; /* for limited screen drawing */
+ }
+ d_xmin = xmin;
+ d_xmax = xmax;
+ d_ymin = ymin;
+ d_ymax = ymax; /* for limited screen drawing */
drawscreen();
- if (xmin<=0 && xmax==MAXX) /* draw stuff on right side of screen as needed*/
- {
- for (i=ymin; i<ymax; i++)
- {
+ if (xmin <= 0 && xmax == MAXX) { /* draw stuff on right side
+ * of screen as needed */
+ for (i = ymin; i < ymax; i++) {
idx = bot_data[i].typ;
- if (c[idx])
- {
- cursor(70,i+1); lprcat(bot_data[i].string);
- }
- cbak[idx]=c[idx];
+ if (c[idx]) {
+ cursor(70, i + 1);
+ lprcat(bot_data[i].string);
}
+ cbak[idx] = c[idx];
}
}
+}
/*
- drawscreen()
-
- subroutine to redraw the whole screen as the player knows it
+ * drawscreen()
+ *
+ * subroutine to redraw the whole screen as the player knows it
*/
-char screen[MAXX][MAXY],d_flag; /* template for the screen */
+u_char screen[MAXX][MAXY], d_flag; /* template for the screen */
+void
drawscreen()
- {
- register int i,j,k;
- int lastx,lasty; /* variables used to optimize the object printing */
- if (d_xmin==0 && d_xmax==MAXX && d_ymin==0 && d_ymax==MAXY)
- {
- d_flag=1; clear(); /* clear the screen */
- }
- else
- {
- d_flag=0; cursor(1,1);
- }
- if (d_xmin<0)
- d_xmin=0; /* d_xmin=-1 means display all without bottomline */
-
- for (i=d_ymin; i<d_ymax; i++)
- for (j=d_xmin; j<d_xmax; j++)
- if (know[j][i]==0) screen[j][i] = ' '; else
- if (k=mitem[j][i]) screen[j][i] = monstnamelist[k]; else
- if ((k=item[j][i])==OWALL) screen[j][i] = '#';
- else screen[j][i] = ' ';
-
- for (i=d_ymin; i<d_ymax; i++)
- {
- j=d_xmin; while ((screen[j][i]==' ') && (j<d_xmax)) j++;
+{
+ int i, j, k;
+ int lastx, lasty; /* variables used to optimize the
+ * object printing */
+
+ if (d_xmin == 0 && d_xmax == MAXX && d_ymin == 0 && d_ymax == MAXY) {
+ d_flag = 1;
+ clear(); /* clear the screen */
+ } else {
+ d_flag = 0;
+ cursor(1, 1);
+ }
+ if (d_xmin < 0)
+ d_xmin = 0; /* d_xmin=-1 means display all without
+ * bottomline */
+
+ for (i = d_ymin; i < d_ymax; i++)
+ for (j = d_xmin; j < d_xmax; j++)
+ if (know[j][i] == 0)
+ screen[j][i] = ' ';
+ else if ((k = mitem[j][i]) != 0)
+ screen[j][i] = monstnamelist[k];
+ else if ((k = item[j][i]) == OWALL)
+ screen[j][i] = '#';
+ else
+ screen[j][i] = ' ';
+
+ for (i = d_ymin; i < d_ymax; i++) {
+ j = d_xmin;
+ while ((screen[j][i] == ' ') && (j < d_xmax))
+ j++;
/* was m=0 */
- if (j >= d_xmax) m=d_xmin; /* don't search backwards if blank line */
- else
- { /* search backwards for end of line */
- m=d_xmax-1; while ((screen[m][i]==' ') && (m>d_xmin)) --m;
- if (j<=m) cursor(j+1,i+1); else continue;
- }
- while (j <= m)
- {
- if (j <= m-3)
- {
- for (k=j; k<=j+3; k++) if (screen[k][i] != ' ') k=1000;
- if (k < 1000)
- { while(screen[j][i]==' ' && j<=m) j++; cursor(j+1,i+1); }
+ if (j >= d_xmax)
+ m = d_xmin; /* don't search backwards if blank
+ * line */
+ else { /* search backwards for end of line */
+ m = d_xmax - 1;
+ while ((screen[m][i] == ' ') && (m > d_xmin))
+ --m;
+ if (j <= m)
+ cursor(j + 1, i + 1);
+ else
+ continue;
+ }
+ while (j <= m) {
+ if (j <= m - 3) {
+ for (k = j; k <= j + 3; k++)
+ if (screen[k][i] != ' ')
+ k = 1000;
+ if (k < 1000) {
+ while (screen[j][i] == ' ' && j <= m)
+ j++;
+ cursor(j + 1, i + 1);
}
- lprc(screen[j++][i]);
}
+ lprc(screen[j++][i]);
}
+ }
setbold(); /* print out only bold objects now */
- for (lastx=lasty=127, i=d_ymin; i<d_ymax; i++)
- for (j=d_xmin; j<d_xmax; j++)
- {
- if (k=item[j][i])
+ for (lastx = lasty = 127, i = d_ymin; i < d_ymax; i++)
+ for (j = d_xmin; j < d_xmax; j++) {
+ if ((k = item[j][i]) != 0)
if (k != OWALL)
- if ((know[j][i]) && (mitem[j][i]==0))
- if (objnamelist[k]!=' ')
- {
- if (lasty!=i+1 || lastx!=j)
- cursor(lastx=j+1,lasty=i+1); else lastx++;
+ if ((know[j][i]) && (mitem[j][i] == 0))
+ if (objnamelist[k] != ' ') {
+ if (lasty != i + 1 || lastx != j)
+ cursor(lastx = j + 1, lasty = i + 1);
+ else
+ lastx++;
lprc(objnamelist[k]);
- }
- }
+ }
+ }
- resetbold(); if (d_flag) { always=1; botside(); always=1; bot_linex(); }
- oldx=99;
- d_xmin = 0 , d_xmax = MAXX , d_ymin = 0 , d_ymax = MAXY; /* for limited screen drawing */
+ resetbold();
+ if (d_flag) {
+ always = 1;
+ botside();
+ always = 1;
+ bot_linex();
}
-
-/*
- showcell(x,y)
+ oldx = 99;
+ d_xmin = 0, d_xmax = MAXX, d_ymin = 0, d_ymax = MAXY; /* for limited screen
+ * drawing */
+}
+
- subroutine to display a cell location on the screen
+/*
+ * showcell(x,y)
+ *
+ * subroutine to display a cell location on the screen
*/
-showcell(x,y)
- int x,y;
- {
- register int i,j,k,m;
- if (c[BLINDCOUNT]) return; /* see nothing if blind */
- if (c[AWARENESS]) { minx = x-3; maxx = x+3; miny = y-3; maxy = y+3; }
- else { minx = x-1; maxx = x+1; miny = y-1; maxy = y+1; }
-
- if (minx < 0) minx=0; if (maxx > MAXX-1) maxx = MAXX-1;
- if (miny < 0) miny=0; if (maxy > MAXY-1) maxy = MAXY-1;
-
- for (j=miny; j<=maxy; j++)
- for (m=minx; m<=maxx; m++)
- if (know[m][j]==0)
- {
- cursor(m+1,j+1);
- x=maxx; while (know[x][j]) --x;
- for (i=m; i<=x; i++)
- {
- if ((k=mitem[i][j]) != 0) lprc(monstnamelist[k]);
- else switch(k=item[i][j])
- {
- case OWALL: case 0: case OIVTELETRAP: case OTRAPARROWIV:
- case OIVDARTRAP: case OIVTRAPDOOR:
- lprc(objnamelist[k]); break;
-
- default: setbold(); lprc(objnamelist[k]); resetbold();
- };
- know[i][j]=1;
+void
+showcell(x, y)
+ int x, y;
+{
+ int i, j, k, m;
+ if (c[BLINDCOUNT])
+ return; /* see nothing if blind */
+ if (c[AWARENESS]) {
+ minx = x - 3;
+ maxx = x + 3;
+ miny = y - 3;
+ maxy = y + 3;
+ } else {
+ minx = x - 1;
+ maxx = x + 1;
+ miny = y - 1;
+ maxy = y + 1;
+ }
+
+ if (minx < 0)
+ minx = 0;
+ if (maxx > MAXX - 1)
+ maxx = MAXX - 1;
+ if (miny < 0)
+ miny = 0;
+ if (maxy > MAXY - 1)
+ maxy = MAXY - 1;
+
+ for (j = miny; j <= maxy; j++)
+ for (m = minx; m <= maxx; m++)
+ if (know[m][j] == 0) {
+ cursor(m + 1, j + 1);
+ x = maxx;
+ while (know[x][j])
+ --x;
+ for (i = m; i <= x; i++) {
+ if ((k = mitem[i][j]) != 0)
+ lprc(monstnamelist[k]);
+ else
+ switch (k = item[i][j]) {
+ case OWALL:
+ case 0:
+ case OIVTELETRAP:
+ case OTRAPARROWIV:
+ case OIVDARTRAP:
+ case OIVTRAPDOOR:
+ lprc(objnamelist[k]);
+ break;
+
+ default:
+ setbold();
+ lprc(objnamelist[k]);
+ resetbold();
+ };
+ know[i][j] = 1;
}
- m = maxx;
+ m = maxx;
}
- }
+}
/*
- this routine shows only the spot that is given it. the spaces around
- these coordinated are not shown
- used in godirect() in monster.c for missile weapons display
+ * this routine shows only the spot that is given it. the spaces around
+ * these coordinated are not shown
+ * used in godirect() in monster.c for missile weapons display
*/
-show1cell(x,y)
- int x,y;
- {
- if (c[BLINDCOUNT]) return; /* see nothing if blind */
- cursor(x+1,y+1);
- if ((k=mitem[x][y]) != 0) lprc(monstnamelist[k]);
- else switch(k=item[x][y])
- {
- case OWALL: case 0: case OIVTELETRAP: case OTRAPARROWIV:
- case OIVDARTRAP: case OIVTRAPDOOR:
- lprc(objnamelist[k]); break;
-
- default: setbold(); lprc(objnamelist[k]); resetbold();
- };
- know[x][y]|=1; /* we end up knowing about it */
- }
+void
+show1cell(x, y)
+ int x, y;
+{
+ if (c[BLINDCOUNT])
+ return; /* see nothing if blind */
+ cursor(x + 1, y + 1);
+ if ((k = mitem[x][y]) != 0)
+ lprc(monstnamelist[k]);
+ else
+ switch (k = item[x][y]) {
+ case OWALL:
+ case 0:
+ case OIVTELETRAP:
+ case OTRAPARROWIV:
+ case OIVDARTRAP:
+ case OIVTRAPDOOR:
+ lprc(objnamelist[k]);
+ break;
+
+ default:
+ setbold();
+ lprc(objnamelist[k]);
+ resetbold();
+ };
+ know[x][y] |= 1; /* we end up knowing about it */
+}
/*
- showplayer()
-
- subroutine to show where the player is on the screen
- cursor values start from 1 up
+ * showplayer()
+ *
+ * subroutine to show where the player is on the screen
+ * cursor values start from 1 up
*/
+void
showplayer()
- {
- cursor(playerx+1,playery+1);
- oldx=playerx; oldy=playery;
- }
+{
+ cursor(playerx + 1, playery + 1);
+ oldx = playerx;
+ oldy = playery;
+}
/*
- moveplayer(dir)
-
- subroutine to move the player from one room to another
- returns 0 if can't move in that direction or hit a monster or on an object
- else returns 1
- nomove is set to 1 to stop the next move (inadvertent monsters hitting
- players when walking into walls) if player walks off screen or into wall
+ * moveplayer(dir)
+ *
+ * subroutine to move the player from one room to another
+ * returns 0 if can't move in that direction or hit a monster or on an object
+ * else returns 1
+ * nomove is set to 1 to stop the next move (inadvertent monsters hitting
+ * players when walking into walls) if player walks off screen or into wall
*/
-short diroffx[] = { 0, 0, 1, 0, -1, 1, -1, 1, -1 };
-short diroffy[] = { 0, 1, 0, -1, 0, -1, -1, 1, 1 };
+short diroffx[] = {0, 0, 1, 0, -1, 1, -1, 1, -1};
+short diroffy[] = {0, 1, 0, -1, 0, -1, -1, 1, 1};
+int
moveplayer(dir)
- int dir; /* from = present room # direction = [1-north]
- [2-east] [3-south] [4-west] [5-northeast]
- [6-northwest] [7-southeast] [8-southwest]
- if direction=0, don't move--just show where he is */
- {
- register int k,m,i,j;
- if (c[CONFUSE]) if (c[LEVEL]<rnd(30)) dir=rund(9); /*if confused any dir*/
- k = playerx + diroffx[dir]; m = playery + diroffy[dir];
- if (k<0 || k>=MAXX || m<0 || m>=MAXY) { nomove=1; return(yrepcount = 0); }
- i = item[k][m]; j = mitem[k][m];
- if (i==OWALL && c[WTW]==0) { nomove=1; return(yrepcount = 0); } /* hit a wall */
- if (k==33 && m==MAXY-1 && level==1)
- {
- newcavelevel(0); for (k=0; k<MAXX; k++) for (m=0; m<MAXY; m++)
- if (item[k][m]==OENTRANCE)
- { playerx=k; playery=m; positionplayer(); drawscreen(); return(0); }
- }
- if (j>0) { hitmonster(k,m); return(yrepcount = 0); } /* hit a monster*/
- lastpx = playerx; lastpy = playery;
- playerx = k; playery = m;
- if (i && i!=OTRAPARROWIV && i!=OIVTELETRAP && i!=OIVDARTRAP && i!=OIVTRAPDOOR) return(yrepcount = 0); else return(1);
+ int dir; /* from = present room # direction =
+ * [1-north] [2-east] [3-south] [4-west]
+ * [5-northeast] [6-northwest] [7-southeast]
+ * [8-southwest] if direction=0, don't
+ * move--just show where he is */
+{
+ int k, m, i, j;
+
+ if (c[CONFUSE])
+ if (c[LEVEL] < rnd(30))
+ dir = rund(9); /* if confused any dir */
+ k = playerx + diroffx[dir];
+ m = playery + diroffy[dir];
+ if (k < 0 || k >= MAXX || m < 0 || m >= MAXY) {
+ nomove = 1;
+ return (yrepcount = 0);
}
-
+ i = item[k][m];
+ j = mitem[k][m];
+ if (i == OWALL && c[WTW] == 0) {
+ nomove = 1;
+ return (yrepcount = 0);
+ } /* hit a wall */
+ if (k == 33 && m == MAXY - 1 && level == 1) {
+ newcavelevel(0);
+ for (k = 0; k < MAXX; k++)
+ for (m = 0; m < MAXY; m++)
+ if (item[k][m] == OENTRANCE) {
+ playerx = k;
+ playery = m;
+ positionplayer();
+ drawscreen();
+ return (0);
+ }
+ }
+ if (j > 0) {
+ hitmonster(k, m);
+ return (yrepcount = 0);
+ } /* hit a monster */
+ lastpx = playerx;
+ lastpy = playery;
+ playerx = k;
+ playery = m;
+ if (i && i != OTRAPARROWIV && i != OIVTELETRAP && i != OIVDARTRAP && i != OIVTRAPDOOR)
+ return (yrepcount = 0);
+ else
+ return (1);
+}
+
+
/*
* function to show what magic items have been discovered thus far
* enter with -1 for just spells, anything else will give scrolls & potions
*/
-static int lincount,count;
+static int lincount, count;
+void
seemagic(arg)
- int arg;
- {
- register int i,number;
- count = lincount = 0; nosignal=1;
-
- if (arg== -1) /* if display spells while casting one */
- {
- for (number=i=0; i<SPNUM; i++) if (spelknow[i]) number++;
- number = (number+2)/3 + 4; /* # lines needed to display */
- cl_up(79,number); cursor(1,1);
- }
- else
- {
- resetscroll(); clear();
- }
+ int arg;
+{
+ int i, number = 0;
+
+ count = lincount = 0;
+ nosignal = 1;
+
+ if (arg == -1) { /* if display spells while casting one */
+ for (number = i = 0; i < SPNUM; i++)
+ if (spelknow[i])
+ number++;
+ number = (number + 2) / 3 + 4; /* # lines needed to display */
+ cl_up(79, number);
+ cursor(1, 1);
+ } else {
+ resetscroll();
+ clear();
+ }
lprcat("The magic spells you have discovered thus far:\n\n");
- for (i=0; i<SPNUM; i++)
- if (spelknow[i])
- { lprintf("%s %-20s ",spelcode[i],spelname[i]); seepage(); }
-
- if (arg== -1)
- {
- seepage(); more(); nosignal=0;
- draws(0,MAXX,0,number); return;
+ for (i = 0; i < SPNUM; i++)
+ if (spelknow[i]) {
+ lprintf("%s %-20s ", spelcode[i], spelname[i]);
+ seepage();
}
-
- lincount += 3; if (count!=0) { count=2; seepage(); }
-
+ if (arg == -1) {
+ seepage();
+ more();
+ nosignal = 0;
+ draws(0, MAXX, 0, number);
+ return;
+ }
+ lincount += 3;
+ if (count != 0) {
+ count = 2;
+ seepage();
+ }
lprcat("\nThe magic scrolls you have found to date are:\n\n");
- count=0;
- for (i=0; i<MAXSCROLL; i++)
+ count = 0;
+ for (i = 0; i < MAXSCROLL; i++)
if (scrollname[i][0])
- if (scrollname[i][1]!=' ')
- { lprintf("%-26s",&scrollname[i][1]); seepage(); }
-
- lincount += 3; if (count!=0) { count=2; seepage(); }
-
+ if (scrollname[i][1] != ' ') {
+ lprintf("%-26s", &scrollname[i][1]);
+ seepage();
+ }
+ lincount += 3;
+ if (count != 0) {
+ count = 2;
+ seepage();
+ }
lprcat("\nThe magic potions you have found to date are:\n\n");
- count=0;
- for (i=0; i<MAXPOTION; i++)
+ count = 0;
+ for (i = 0; i < MAXPOTION; i++)
if (potionname[i][0])
- if (potionname[i][1]!=' ')
- { lprintf("%-26s",&potionname[i][1]); seepage(); }
-
- if (lincount!=0) more(); nosignal=0; setscroll(); drawscreen();
- }
+ if (potionname[i][1] != ' ') {
+ lprintf("%-26s", &potionname[i][1]);
+ seepage();
+ }
+ if (lincount != 0)
+ more();
+ nosignal = 0;
+ setscroll();
+ drawscreen();
+}
/*
* subroutine to paginate the seemagic function
*/
+void
seepage()
- {
- if (++count==3)
- {
- lincount++; count=0; lprc('\n');
- if (lincount>17) { lincount=0; more(); clear(); }
+{
+ if (++count == 3) {
+ lincount++;
+ count = 0;
+ lprc('\n');
+ if (lincount > 17) {
+ lincount = 0;
+ more();
+ clear();
}
}
+}
diff --git a/games/larn/extern.h b/games/larn/extern.h
new file mode 100644
index 00000000000..f34aba76774
--- /dev/null
+++ b/games/larn/extern.h
@@ -0,0 +1,313 @@
+/* $OpenBSD: extern.h,v 1.1 1998/09/15 05:12:31 pjanzen Exp $ */
+/* $NetBSD: extern.h,v 1.1 1997/10/18 20:03:17 christos Exp $ */
+
+/*
+ * Copyright (c) 1997 Christos Zoulas. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by Christos Zoulas.
+ * 4. The name of the author may not be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/* bill.c */
+void mailbill __P((void));
+
+/* config.c */
+
+/* create.c */
+void makeplayer __P((void));
+void newcavelevel __P((int));
+void makemaze __P((int));
+void eat __P((int, int));
+int cannedlevel __P((int));
+void treasureroom __P((int));
+void troom __P((int, int, int, int, int, int));
+void makeobject __P((int));
+void fillmroom __P((int, int, int));
+void froom __P((int, int, int));
+int fillmonst __P((int));
+void sethp __P((int));
+void checkgen __P((void));
+
+/* data.c */
+
+/* diag.c */
+void diag __P((void));
+int dcount __P((int));
+void diagdrawscreen __P((void));
+int savegame __P((char *));
+void restoregame __P((char *));
+void greedy __P((void));
+void fsorry __P((void));
+void fcheat __P((void));
+
+/* display.c */
+void bottomline __P((void));
+void bottomhp __P((void));
+void bottomspell __P((void));
+void bottomdo __P((void));
+void bot_linex __P((void));
+void bottomgold __P((void));
+void bot_hpx __P((void));
+void bot_spellx __P((void));
+void botside __P((void));
+void draws __P((int, int, int, int));
+void drawscreen __P((void));
+void showcell __P((int, int));
+void show1cell __P((int, int));
+void showplayer __P((void));
+int moveplayer __P((int));
+void seemagic __P((int));
+void seepage __P((void));
+
+/* fortune.c */
+char *fortune __P((void));
+
+/* global.c */
+void raiselevel __P((void));
+void loselevel __P((void));
+void raiseexperience __P((long));
+void loseexperience __P((long));
+void losehp __P((int));
+void losemhp __P((int));
+void raisehp __P((int));
+void raisemhp __P((int));
+void raisespells __P((int));
+void raisemspells __P((int));
+void losespells __P((int));
+void losemspells __P((int));
+int makemonst __P((int));
+void positionplayer __P((void));
+void recalc __P((void));
+void quit __P((void));
+void more __P((void));
+int take __P((int, int));
+int drop_object __P((int));
+void enchantarmor __P((void));
+void enchweapon __P((void));
+int pocketfull __P((void));
+int nearbymonst __P((void));
+int stealsomething __P((void));
+int emptyhanded __P((void));
+void creategem __P((void));
+void adjustcvalues __P((int, int));
+void gettokstr __P((char *));
+int getpassword __P((void));
+int getyn __P((void));
+int packweight __P((void));
+int rnd __P((int));
+int rund __P((int));
+
+/* help.c */
+void help __P((void));
+void welcome __P((void));
+void retcont __P((void));
+int openhelp __P((void));
+
+/* io.c */
+void setupvt100 __P((void));
+void clearvt100 __P((void));
+int lgetchar __P((void));
+void scbr __P((void));
+void sncbr __P((void));
+void newgame __P((void));
+void lprintf __P((const char *, ...));
+void lprint __P((long));
+void lwrite __P((char *, int));
+long lgetc __P((void));
+long lrint __P((void));
+void lrfill __P((char *, int));
+char *lgetw __P((void));
+char *lgetl __P((void));
+int lcreat __P((char *));
+int lopen __P((char *));
+int lappend __P((char *));
+void lrclose __P((void));
+void lwclose __P((void));
+void lprcat __P((char *));
+void cursor __P((int, int));
+void cursors __P((void));
+void init_term __P((void));
+void cl_line __P((int, int));
+void cl_up __P((int, int));
+void cl_dn __P((int, int));
+void lstandout __P((char *));
+void set_score_output __P((void));
+void lflush __P((void));
+int xputchar __P((int));
+void flush_buf __P((void));
+char *tmcapcnv __P((char *, char *));
+void lbeep __P((void));
+
+/* main.c */
+int main __P((int, char **));
+void showstr __P((void));
+void qshowstr __P((void));
+void t_setup __P((int));
+void t_endup __P((int));
+void showwear __P((void));
+void showwield __P((void));
+void showread __P((void));
+void showeat __P((void));
+void showquaff __P((void));
+void show1 __P((int, char *[]));
+void show3 __P((int));
+void randmonst __P((void));
+void parse __P((void));
+void parse2 __P((void));
+void run __P((int));
+void wield __P((void));
+void ydhi __P((int));
+void ycwi __P((int));
+void wear __P((void));
+void dropobj __P((void));
+void readscr __P((void));
+void eatcookie __P((void));
+void quaff __P((void));
+int whatitem __P((char *));
+unsigned long readnum __P((long));
+void szero __P((char *));
+
+/* monster.c */
+void createmonster __P((int));
+int cgood __P((int, int, int, int));
+void createitem __P((int, int));
+void cast __P((void));
+void speldamage __P((int));
+void loseint __P((void));
+int isconfuse __P((void));
+int nospell __P((int, int));
+int fullhit __P((int));
+void direct __P((int, int, char *, int));
+void godirect __P((int, int, char *, int, int));
+void ifblind __P((int, int));
+void tdirect __P((int));
+void omnidirect __P((int, int, char *));
+int vxy __P((int *, int *));
+void dirpoly __P((int));
+void hitmonster __P((int, int));
+int hitm __P((int, int, int));
+void hitplayer __P((int, int));
+void dropsomething __P((int));
+void dropgold __P((int));
+void something __P((int));
+int newobject __P((int, int *));
+int spattack __P((int, int, int));
+void checkloss __P((int));
+int annihilate __P((void));
+int newsphere __P((int, int, int, int));
+int rmsphere __P((int, int));
+void sphboom __P((int, int));
+void genmonst __P((void));
+
+/* moreobj.c */
+void oaltar __P((void));
+void othrone __P((int));
+void odeadthrone __P((void));
+void ochest __P((void));
+void ofountain __P((void));
+void fntchange __P((int));
+
+/* movem.c */
+void movemonst __P((void));
+void movemt __P((int, int));
+void mmove __P((int, int, int, int));
+void movsphere __P((void));
+
+/* nap.c */
+void nap __P((int));
+
+/* object.c */
+void lookforobject __P((void));
+void finditem __P((int));
+void ostairs __P((int));
+void oteleport __P((int));
+void opotion __P((int));
+void quaffpotion __P((int));
+void oscroll __P((int));
+void adjusttime __P((long));
+void read_scroll __P((int));
+void oorb __P((void));
+void opit __P((void));
+void obottomless __P((void));
+void oelevator __P((int));
+void ostatue __P((void));
+void omirror __P((void));
+void obook __P((void));
+void readbook __P((int));
+void ocookie __P((void));
+void ogold __P((int));
+void ohome __P((void));
+void iopts __P((void));
+void ignore __P((void));
+
+/* regen.c */
+void regen __P((void));
+
+/* savelev.c */
+void savelevel __P((void));
+void getlevel __P((void));
+
+/* scores.c */
+int readboard __P((void));
+int writeboard __P((void));
+int makeboard __P((void));
+int hashewon __P((void));
+long paytaxes __P((long));
+int winshou __P((void));
+int shou __P((int));
+void showscores __P((void));
+void showallscores __P((void));
+int sortboard __P((void));
+void newscore __P((long, char *, int, int));
+void new1sub __P((long, int, char *, long));
+void new2sub __P((long, int, char *, int));
+void died __P((int));
+void diedsub __P((int));
+void diedlog __P((void));
+int getplid __P((char *));
+
+/* signal.c */
+void sigsetup __P((void));
+
+/* store.c */
+void dnd_2hed __P((void));
+void dnd_hed __P((void));
+void dndstore __P((void));
+void sch_hed __P((void));
+void oschool __P((void));
+void obank __P((void));
+void obank2 __P((void));
+void ointerest __P((void));
+void obanksub __P((void));
+void appraise __P((int));
+void otradepost __P((void));
+void cnsitm __P((void));
+void olrs __P((void));
+
+/* tok.c */
+int yylex __P((void));
+void flushall __P((void));
+void sethard __P((int));
+void readopts __P((void));
diff --git a/games/larn/fortune.c b/games/larn/fortune.c
index 54a7a955086..cbc88caf884 100644
--- a/games/larn/fortune.c
+++ b/games/larn/fortune.c
@@ -1,3 +1,6 @@
+/* $OpenBSD: fortune.c,v 1.2 1998/09/15 05:12:31 pjanzen Exp $ */
+/* $NetBSD: fortune.c,v 1.4 1997/10/18 20:03:18 christos Exp $ */
+
/*-
* Copyright (c) 1991 The Regents of the University of California.
* All rights reserved.
@@ -33,19 +36,23 @@
#ifndef lint
#if 0
-static char sccsid[] = "@(#)fortune.c 5.5 (Berkeley) 6/10/91";
+static char sccsid[] = "@(#)fortune.c 5.5 (Berkeley) 6/10/91";
#else
-static char rcsid[] = "$NetBSD: fortune.c,v 1.3 1995/03/23 08:33:23 cgd Exp $";
+static char rcsid[] = "$OpenBSD: fortune.c,v 1.2 1998/09/15 05:12:31 pjanzen Exp $";
#endif
-#endif /* not lint */
+#endif /* not lint */
+
+#include <stdlib.h>
+#include "header.h"
+#include "extern.h"
/* fortune.c Larn is copyrighted 1986 by Noah Morgan. */
/*
* function to return a random fortune from the fortune file
*/
-char *flines[] = {
+char *flines[] = {
"gem value = gem * 2 ^ perfection",
"sitting down can have unexpected results",
"don't pry into the affairs of others",
@@ -61,7 +68,7 @@ char *flines[] = {
"be sure to pay your taxes",
"are Vampires afraid of something?",
"some dragons can fly",
- "dos thou strive for perfection?",
+ "dost thou strive for perfection?",
"patience is a virtue, unless your daughter dies",
"what does the Eye of Larn see in its guardian?",
"a level 25 player casts like crazy!",
diff --git a/games/larn/global.c b/games/larn/global.c
index 09981c18d3e..f926125fffb 100644
--- a/games/larn/global.c
+++ b/games/larn/global.c
@@ -1,626 +1,970 @@
-#ifndef lint
-static char rcsid[] = "$NetBSD: global.c,v 1.4 1995/04/24 12:23:52 cgd Exp $";
-#endif /* not lint */
+/* $OpenBSD: global.c,v 1.3 1998/09/15 05:12:31 pjanzen Exp $ */
+/* $NetBSD: global.c,v 1.6 1997/10/18 20:03:20 christos Exp $ */
-/* global.c Larn is copyrighted 1986 by Noah Morgan.
- *
- * raiselevel() subroutine to raise the player one level
- * loselevel() subroutine to lower the player by one level
- * raiseexperience(x) subroutine to increase experience points
- * loseexperience(x) subroutine to lose experience points
- * losehp(x) subroutine to remove hit points from the player
- * losemhp(x) subroutine to remove max # hit points from the player
- * raisehp(x) subroutine to gain hit points
- * raisemhp(x) subroutine to gain maximum hit points
- * losespells(x) subroutine to lose spells
- * losemspells(x) subroutine to lose maximum spells
- * raisespells(x) subroutine to gain spells
- * raisemspells(x) subroutine to gain maximum spells
- * recalc() function to recalculate the armor class of the player
- * makemonst(lev) function to return monster number for a randomly selected monster
- * positionplayer() function to be sure player is not in a wall
- * quit() subroutine to ask if the player really wants to quit
+/*
+ * global.c Larn is copyrighted 1986 by Noah Morgan.
+ *
+ * raiselevel() subroutine to raise the player one level
+ * loselevel() subroutine to lower the player by one level
+ * raiseexperience(x) subroutine to increase experience points
+ * loseexperience(x) subroutine to lose experience points
+ * losehp(x) subroutine to remove hit points from the player
+ * losemhp(x) subroutine to remove max # hit points from the player
+ * raisehp(x) subroutine to gain hit points
+ * raisemhp(x) subroutine to gain maximum hit points
+ * losespells(x) subroutine to lose spells
+ * losemspells(x) subroutine to lose maximum spells
+ * raisespells(x) subroutine to gain spells
+ * raisemspells(x) subroutine to gain maximum spells
+ * recalc() function to recalculate the armor class of the player
+ * makemonst(lev) function to return monster number for a randomly
+ * selected monster
+ * positionplayer() function to be sure player is not in a wall
+ * quit() subroutine to ask if the player really wants to quit
*/
+#ifndef lint
+static char rcsid[] = "$OpenBSD: global.c,v 1.3 1998/09/15 05:12:31 pjanzen Exp $";
+#endif /* not lint */
-#include "header.h"
#include <string.h>
-extern int score[],srcount,dropflag;
-extern int random;/* the random number seed */
-extern short playerx,playery,lastnum,level;
-extern char cheat,monstnamelist[];
-extern char lastmonst[],*what[],*who[];
-extern char winner[];
-extern char logname[],monstlevel[];
-extern char sciv[SCORESIZE+1][26][2],*potionname[],*scrollname[];
+#include <unistd.h>
+#include "header.h"
+#include "extern.h"
+
+extern int score[], srcount, dropflag;
+extern int random; /* the random number seed */
+extern short playerx, playery, lastnum, level;
+extern u_char cheat;
+extern char monstnamelist[], logname[];
+extern char lastmonst[], *what[], *who[];
+extern char winner[];
+extern u_char monstlevel[];
+extern char sciv[SCORESIZE + 1][26][2], *potionname[], *scrollname[];
+
/*
- ***********
- RAISE LEVEL
- ***********
- raiselevel()
-
- subroutine to raise the player one level
- uses the skill[] array to find level boundarys
- uses c[EXPERIENCE] c[LEVEL]
+ * ***********
+ * RAISE LEVEL
+ * ***********
+ * raiselevel()
+ *
+ * subroutine to raise the player one level
+ * uses the skill[] array to find level boundarys
+ * uses c[EXPERIENCE] c[LEVEL]
*/
+void
raiselevel()
- {
- if (c[LEVEL] < MAXPLEVEL) raiseexperience((long)(skill[c[LEVEL]]-c[EXPERIENCE]));
- }
+{
+ if (c[LEVEL] < MAXPLEVEL)
+ raiseexperience((long) (skill[c[LEVEL]] - c[EXPERIENCE]));
+}
/*
- ***********
- LOOSE LEVEL
- ***********
- loselevel()
-
- subroutine to lower the players character level by one
+ * ***********
+ * LOOSE LEVEL
+ * ***********
+ * loselevel()
+ *
+ * subroutine to lower the players character level by one
*/
+void
loselevel()
- {
- if (c[LEVEL] > 1) loseexperience((long)(c[EXPERIENCE] - skill[c[LEVEL]-1] + 1));
- }
+{
+ if (c[LEVEL] > 1)
+ loseexperience((long) (c[EXPERIENCE] - skill[c[LEVEL] - 1] + 1));
+}
/*
- ****************
- RAISE EXPERIENCE
- ****************
- raiseexperience(x)
-
- subroutine to increase experience points
+ * ****************
+ * RAISE EXPERIENCE
+ * ****************
+ * raiseexperience(x)
+ *
+ * subroutine to increase experience points
*/
+void
raiseexperience(x)
- register long x;
- {
- register int i,tmp;
- i=c[LEVEL]; c[EXPERIENCE]+=x;
- while (c[EXPERIENCE] >= skill[c[LEVEL]] && (c[LEVEL] < MAXPLEVEL))
- {
- tmp = (c[CONSTITUTION]-c[HARDGAME])>>1;
- c[LEVEL]++; raisemhp((int)(rnd(3)+rnd((tmp>0)?tmp:1)));
- raisemspells((int)rund(3));
- if (c[LEVEL] < 7-c[HARDGAME]) raisemhp((int)(c[CONSTITUTION]>>2));
- }
- if (c[LEVEL] != i)
- {
+ long x;
+{
+ int i, tmp;
+
+ i = c[LEVEL];
+ c[EXPERIENCE] += x;
+ while (c[EXPERIENCE] >= skill[c[LEVEL]] && (c[LEVEL] < MAXPLEVEL)) {
+ tmp = (c[CONSTITUTION] - c[HARDGAME]) >> 1;
+ c[LEVEL]++;
+ raisemhp((int) (rnd(3) + rnd((tmp > 0) ? tmp : 1)));
+ raisemspells((int) rund(3));
+ if (c[LEVEL] < 7 - c[HARDGAME])
+ raisemhp((int) (c[CONSTITUTION] >> 2));
+ }
+ if (c[LEVEL] != i) {
cursors();
- beep(); lprintf("\nWelcome to level %d",(long)c[LEVEL]); /* if we changed levels */
- }
- bottomline();
+ lbeep();
+ lprintf("\nWelcome to level %d", (long) c[LEVEL]); /* if we changed levels */
}
+ bottomline();
+}
/*
- ****************
- LOOSE EXPERIENCE
- ****************
- loseexperience(x)
-
- subroutine to lose experience points
+ * ***************
+ * LOSE EXPERIENCE
+ * ***************
+ * loseexperience(x)
+ *
+ * subroutine to lose experience points
*/
+void
loseexperience(x)
- register long x;
- {
- register int i,tmp;
- i=c[LEVEL]; c[EXPERIENCE]-=x;
- if (c[EXPERIENCE] < 0) c[EXPERIENCE]=0;
- while (c[EXPERIENCE] < skill[c[LEVEL]-1])
- {
- if (--c[LEVEL] <= 1) c[LEVEL]=1; /* down one level */
- tmp = (c[CONSTITUTION]-c[HARDGAME])>>1; /* lose hpoints */
- losemhp((int)rnd((tmp>0)?tmp:1)); /* lose hpoints */
- if (c[LEVEL] < 7-c[HARDGAME]) losemhp((int)(c[CONSTITUTION]>>2));
- losemspells((int)rund(3)); /* lose spells */
- }
- if (i!=c[LEVEL])
- {
+ long x;
+{
+ int i, tmp;
+
+ i = c[LEVEL];
+ c[EXPERIENCE] -= x;
+ if (c[EXPERIENCE] < 0)
+ c[EXPERIENCE] = 0;
+ while (c[EXPERIENCE] < skill[c[LEVEL] - 1]) {
+ if (--c[LEVEL] <= 1)
+ c[LEVEL] = 1; /* down one level */
+ tmp = (c[CONSTITUTION] - c[HARDGAME]) >> 1; /* lose hpoints */
+ losemhp((int) rnd((tmp > 0) ? tmp : 1)); /* lose hpoints */
+ if (c[LEVEL] < 7 - c[HARDGAME])
+ losemhp((int) (c[CONSTITUTION] >> 2));
+ losemspells((int) rund(3)); /* lose spells */
+ }
+ if (i != c[LEVEL]) {
cursors();
- beep(); lprintf("\nYou went down to level %d!",(long)c[LEVEL]);
- }
- bottomline();
+ lbeep();
+ lprintf("\nYou went down to level %d!", (long) c[LEVEL]);
}
+ bottomline();
+}
/*
- ********
- LOOSE HP
- ********
- losehp(x)
- losemhp(x)
-
- subroutine to remove hit points from the player
- warning -- will kill player if hp goes to zero
+ * *******
+ * LOSE HP
+ * *******
+ * losehp(x)
+ * losemhp(x)
+ *
+ * subroutine to remove hit points from the player
+ * warning -- will kill player if hp goes to zero
*/
+void
losehp(x)
- register int x;
- {
- if ((c[HP] -= x) <= 0)
- {
- beep(); lprcat("\n"); nap(3000); died(lastnum);
- }
+ int x;
+{
+ if ((c[HP] -= x) <= 0) {
+ lbeep();
+ lprcat("\n");
+ nap(3000);
+ died(lastnum);
}
+}
+void
losemhp(x)
- register int x;
- {
- c[HP] -= x; if (c[HP] < 1) c[HP]=1;
- c[HPMAX] -= x; if (c[HPMAX] < 1) c[HPMAX]=1;
- }
+ int x;
+{
+ c[HP] -= x;
+ if (c[HP] < 1)
+ c[HP] = 1;
+ c[HPMAX] -= x;
+ if (c[HPMAX] < 1)
+ c[HPMAX] = 1;
+}
/*
- ********
- RAISE HP
- ********
- raisehp(x)
- raisemhp(x)
-
- subroutine to gain maximum hit points
+ * ********
+ * RAISE HP
+ * ********
+ * raisehp(x)
+ * raisemhp(x)
+ *
+ * subroutine to gain maximum hit points
*/
+void
raisehp(x)
- register int x;
- {
- if ((c[HP] += x) > c[HPMAX]) c[HP] = c[HPMAX];
- }
+ int x;
+{
+ if ((c[HP] += x) > c[HPMAX])
+ c[HP] = c[HPMAX];
+}
+void
raisemhp(x)
- register int x;
- {
- c[HPMAX] += x; c[HP] += x;
- }
+ int x;
+{
+ c[HPMAX] += x;
+ c[HP] += x;
+}
/*
- ************
- RAISE SPELLS
- ************
- raisespells(x)
- raisemspells(x)
-
- subroutine to gain maximum spells
+ * ************
+ * RAISE SPELLS
+ * ************
+ * raisespells(x)
+ * raisemspells(x)
+ *
+ * subroutine to gain maximum spells
*/
+void
raisespells(x)
- register int x;
- {
- if ((c[SPELLS] += x) > c[SPELLMAX]) c[SPELLS] = c[SPELLMAX];
- }
+ int x;
+{
+ if ((c[SPELLS] += x) > c[SPELLMAX])
+ c[SPELLS] = c[SPELLMAX];
+}
+void
raisemspells(x)
- register int x;
- {
- c[SPELLMAX]+=x; c[SPELLS]+=x;
- }
+ int x;
+{
+ c[SPELLMAX] += x;
+ c[SPELLS] += x;
+}
/*
- ************
- LOOSE SPELLS
- ************
- losespells(x)
- losemspells(x)
-
- subroutine to lose maximum spells
+ * ***********
+ * LOSE SPELLS
+ * ***********
+ * losespells(x)
+ * losemspells(x)
+ *
+ * subroutine to lose maximum spells
*/
+void
losespells(x)
- register int x;
- {
- if ((c[SPELLS] -= x) < 0) c[SPELLS]=0;
- }
+ int x;
+{
+ if ((c[SPELLS] -= x) < 0)
+ c[SPELLS] = 0;
+}
+void
losemspells(x)
- register int x;
- {
- if ((c[SPELLMAX] -= x) < 0) c[SPELLMAX]=0;
- if ((c[SPELLS] -= x) < 0) c[SPELLS]=0;
- }
+ int x;
+{
+ if ((c[SPELLMAX] -= x) < 0)
+ c[SPELLMAX] = 0;
+ if ((c[SPELLS] -= x) < 0)
+ c[SPELLS] = 0;
+}
/*
- makemonst(lev)
- int lev;
-
- function to return monster number for a randomly selected monster
- for the given cave level
+ * makemonst(lev)
+ * int lev;
+ *
+ * function to return monster number for a randomly selected monster
+ * for the given cave level
*/
+int
makemonst(lev)
- register int lev;
- {
- register int tmp,x;
- if (lev < 1) lev = 1; if (lev > 12) lev = 12;
- tmp=WATERLORD;
+ int lev;
+{
+ int tmp, x;
+
+ if (lev < 1)
+ lev = 1;
+ if (lev > 12)
+ lev = 12;
+ tmp = WATERLORD;
if (lev < 5)
- while (tmp==WATERLORD) tmp=rnd((x=monstlevel[lev-1])?x:1);
- else while (tmp==WATERLORD)
- tmp=rnd((x=monstlevel[lev-1]-monstlevel[lev-4])?x:1)+monstlevel[lev-4];
+ while (tmp == WATERLORD)
+ tmp = rnd((x = monstlevel[lev - 1]) ? x : 1);
+ else
+ while (tmp == WATERLORD)
+ tmp = rnd((x = monstlevel[lev - 1] - monstlevel[lev - 4]) ? x : 1) + monstlevel[lev - 4];
- while (monster[tmp].genocided && tmp<MAXMONST) tmp++; /* genocided? */
- return(tmp);
- }
+ while (monster[tmp].genocided && tmp < MAXMONST)
+ tmp++; /* genocided? */
+ return (tmp);
+}
/*
- positionplayer()
-
- function to be sure player is not in a wall
+ * positionplayer()
+ *
+ * function to be sure player is not in a wall
*/
+void
positionplayer()
- {
- int try;
+{
+ int try;
+
try = 2;
while ((item[playerx][playery] || mitem[playerx][playery]) && (try))
- if (++playerx >= MAXX-1)
- {
+ if (++playerx >= MAXX - 1) {
playerx = 1;
- if (++playery >= MAXY-1)
- { playery = 1; --try; }
+ if (++playery >= MAXY - 1) {
+ playery = 1;
+ --try;
}
- if (try==0) lprcat("Failure in positionplayer\n");
- }
+ }
+ if (try == 0)
+ lprcat("Failure in positionplayer\n");
+}
/*
- recalc() function to recalculate the armor class of the player
+ * recalc() function to recalculate the armor class of the player
*/
+void
recalc()
- {
- register int i,j,k;
+{
+ int i, j, k;
+
c[AC] = c[MOREDEFENSES];
- if (c[WEAR] >= 0)
- switch(iven[c[WEAR]])
- {
- case OSHIELD: c[AC] += 2 + ivenarg[c[WEAR]]; break;
- case OLEATHER: c[AC] += 2 + ivenarg[c[WEAR]]; break;
- case OSTUDLEATHER: c[AC] += 3 + ivenarg[c[WEAR]]; break;
- case ORING: c[AC] += 5 + ivenarg[c[WEAR]]; break;
- case OCHAIN: c[AC] += 6 + ivenarg[c[WEAR]]; break;
- case OSPLINT: c[AC] += 7 + ivenarg[c[WEAR]]; break;
- case OPLATE: c[AC] += 9 + ivenarg[c[WEAR]]; break;
- case OPLATEARMOR: c[AC] += 10 + ivenarg[c[WEAR]]; break;
- case OSSPLATE: c[AC] += 12 + ivenarg[c[WEAR]]; break;
- }
+ if (c[WEAR] >= 0)
+ switch (iven[c[WEAR]]) {
+ case OSHIELD:
+ c[AC] += 2 + ivenarg[c[WEAR]];
+ break;
+ case OLEATHER:
+ c[AC] += 2 + ivenarg[c[WEAR]];
+ break;
+ case OSTUDLEATHER:
+ c[AC] += 3 + ivenarg[c[WEAR]];
+ break;
+ case ORING:
+ c[AC] += 5 + ivenarg[c[WEAR]];
+ break;
+ case OCHAIN:
+ c[AC] += 6 + ivenarg[c[WEAR]];
+ break;
+ case OSPLINT:
+ c[AC] += 7 + ivenarg[c[WEAR]];
+ break;
+ case OPLATE:
+ c[AC] += 9 + ivenarg[c[WEAR]];
+ break;
+ case OPLATEARMOR:
+ c[AC] += 10 + ivenarg[c[WEAR]];
+ break;
+ case OSSPLATE:
+ c[AC] += 12 + ivenarg[c[WEAR]];
+ break;
+ }
- if (c[SHIELD] >= 0) if (iven[c[SHIELD]] == OSHIELD) c[AC] += 2 + ivenarg[c[SHIELD]];
- if (c[WIELD] < 0) c[WCLASS] = 0; else
- {
+ if (c[SHIELD] >= 0)
+ if (iven[c[SHIELD]] == OSHIELD)
+ c[AC] += 2 + ivenarg[c[SHIELD]];
+ if (c[WIELD] < 0)
+ c[WCLASS] = 0;
+ else {
i = ivenarg[c[WIELD]];
- switch(iven[c[WIELD]])
- {
- case ODAGGER: c[WCLASS] = 3 + i; break;
- case OBELT: c[WCLASS] = 7 + i; break;
- case OSHIELD: c[WCLASS] = 8 + i; break;
- case OSPEAR: c[WCLASS] = 10 + i; break;
- case OFLAIL: c[WCLASS] = 14 + i; break;
- case OBATTLEAXE: c[WCLASS] = 17 + i; break;
- case OLANCE: c[WCLASS] = 19 + i; break;
- case OLONGSWORD: c[WCLASS] = 22 + i; break;
- case O2SWORD: c[WCLASS] = 26 + i; break;
- case OSWORD: c[WCLASS] = 32 + i; break;
- case OSWORDofSLASHING: c[WCLASS] = 30 + i; break;
- case OHAMMER: c[WCLASS] = 35 + i; break;
- default: c[WCLASS] = 0;
- }
+ switch (iven[c[WIELD]]) {
+ case ODAGGER:
+ c[WCLASS] = 3 + i;
+ break;
+ case OBELT:
+ c[WCLASS] = 7 + i;
+ break;
+ case OSHIELD:
+ c[WCLASS] = 8 + i;
+ break;
+ case OSPEAR:
+ c[WCLASS] = 10 + i;
+ break;
+ case OFLAIL:
+ c[WCLASS] = 14 + i;
+ break;
+ case OBATTLEAXE:
+ c[WCLASS] = 17 + i;
+ break;
+ case OLANCE:
+ c[WCLASS] = 19 + i;
+ break;
+ case OLONGSWORD:
+ c[WCLASS] = 22 + i;
+ break;
+ case O2SWORD:
+ c[WCLASS] = 26 + i;
+ break;
+ case OSWORD:
+ c[WCLASS] = 32 + i;
+ break;
+ case OSWORDofSLASHING:
+ c[WCLASS] = 30 + i;
+ break;
+ case OHAMMER:
+ c[WCLASS] = 35 + i;
+ break;
+ default:
+ c[WCLASS] = 0;
}
+ }
c[WCLASS] += c[MOREDAM];
-/* now for regeneration abilities based on rings */
- c[REGEN]=1; c[ENERGY]=0;
- j=0; for (k=25; k>0; k--) if (iven[k]) {j=k; k=0; }
- for (i=0; i<=j; i++)
- {
- switch(iven[i])
- {
- case OPROTRING: c[AC] += ivenarg[i] + 1; break;
- case ODAMRING: c[WCLASS] += ivenarg[i] + 1; break;
- case OBELT: c[WCLASS] += ((ivenarg[i]<<1)) + 2; break;
-
- case OREGENRING: c[REGEN] += ivenarg[i] + 1; break;
- case ORINGOFEXTRA: c[REGEN] += 5 * (ivenarg[i]+1); break;
- case OENERGYRING: c[ENERGY] += ivenarg[i] + 1; break;
- }
+ /* now for regeneration abilities based on rings */
+ c[REGEN] = 1;
+ c[ENERGY] = 0;
+ j = 0;
+ for (k = 25; k > 0; k--)
+ if (iven[k]) {
+ j = k;
+ k = 0;
+ }
+ for (i = 0; i <= j; i++) {
+ switch (iven[i]) {
+ case OPROTRING:
+ c[AC] += ivenarg[i] + 1;
+ break;
+ case ODAMRING:
+ c[WCLASS] += ivenarg[i] + 1;
+ break;
+ case OBELT:
+ c[WCLASS] += ((ivenarg[i] << 1)) + 2;
+ break;
+
+ case OREGENRING:
+ c[REGEN] += ivenarg[i] + 1;
+ break;
+ case ORINGOFEXTRA:
+ c[REGEN] += 5 * (ivenarg[i] + 1);
+ break;
+ case OENERGYRING:
+ c[ENERGY] += ivenarg[i] + 1;
+ break;
}
}
+}
/*
- quit()
-
- subroutine to ask if the player really wants to quit
+ * quit()
+ *
+ * subroutine to ask if the player really wants to quit
*/
+void
quit()
- {
- register int i;
- cursors(); strcpy(lastmonst,"");
+{
+ int i;
+
+ cursors();
+ strcpy(lastmonst, "");
lprcat("\n\nDo you really want to quit?");
- while (1)
- {
- i=getchar();
- if (i == 'y') { died(300); return; }
- if ((i == 'n') || (i == '\33')) { lprcat(" no"); lflush(); return; }
- lprcat("\n"); setbold(); lprcat("Yes"); resetbold(); lprcat(" or ");
- setbold(); lprcat("No"); resetbold(); lprcat(" please? Do you want to quit? ");
- }
- }
+ while (1) {
+ i = lgetchar();
+ if (i == 'y') {
+ died(300);
+ return;
+ }
+ if ((i == 'n') || (i == '\33')) {
+ lprcat(" no");
+ lflush();
+ return;
+ }
+ lprcat("\n");
+ setbold();
+ lprcat("Yes");
+ resetbold();
+ lprcat(" or ");
+ setbold();
+ lprcat("No");
+ resetbold();
+ lprcat(" please? Do you want to quit? ");
+ }
+}
/*
- function to ask --more-- then the user must enter a space
+ * function to ask --more-- then the user must enter a space
*/
+void
more()
- {
- lprcat("\n --- press "); standout("space"); lprcat(" to continue --- ");
- while (getchar() != ' ');
- }
+{
+ lprcat("\n --- press ");
+ lstandout("space");
+ lprcat(" to continue --- ");
+ while (lgetchar() != ' ');
+}
/*
- function to put something in the players inventory
- returns 0 if success, 1 if a failure
+ * function to put something in the players inventory
+ * returns 0 if success, 1 if a failure
*/
-take(itm,arg)
- int itm,arg;
- {
- register int i,limit;
-/* cursors(); */
- if ((limit = 15+(c[LEVEL]>>1)) > 26) limit=26;
- for (i=0; i<limit; i++)
- if (iven[i]==0)
- {
- iven[i] = itm; ivenarg[i] = arg; limit=0;
- switch(itm)
- {
- case OPROTRING: case ODAMRING: case OBELT: limit=1; break;
- case ODEXRING: c[DEXTERITY] += ivenarg[i]+1; limit=1; break;
- case OSTRRING: c[STREXTRA] += ivenarg[i]+1; limit=1; break;
- case OCLEVERRING: c[INTELLIGENCE] += ivenarg[i]+1; limit=1; break;
- case OHAMMER: c[DEXTERITY] += 10; c[STREXTRA]+=10;
- c[INTELLIGENCE]-=10; limit=1; break;
-
- case OORBOFDRAGON: c[SLAYING]++; break;
- case OSPIRITSCARAB: c[NEGATESPIRIT]++; break;
- case OCUBEofUNDEAD: c[CUBEofUNDEAD]++; break;
- case ONOTHEFT: c[NOTHEFT]++; break;
- case OSWORDofSLASHING: c[DEXTERITY] +=5; limit=1; break;
- };
- lprcat("\nYou pick up:"); srcount=0; show3(i);
- if (limit) bottomline(); return(0);
- }
- lprcat("\nYou can't carry anything else"); return(1);
- }
+int
+take(itm, arg)
+ int itm, arg;
+{
+ int i, limit;
+
+ /* cursors(); */
+ if ((limit = 15 + (c[LEVEL] >> 1)) > 26)
+ limit = 26;
+ for (i = 0; i < limit; i++)
+ if (iven[i] == 0) {
+ iven[i] = itm;
+ ivenarg[i] = arg;
+ limit = 0;
+ switch (itm) {
+ case OPROTRING:
+ case ODAMRING:
+ case OBELT:
+ limit = 1;
+ break;
+ case ODEXRING:
+ c[DEXTERITY] += ivenarg[i] + 1;
+ limit = 1;
+ break;
+ case OSTRRING:
+ c[STREXTRA] += ivenarg[i] + 1;
+ limit = 1;
+ break;
+ case OCLEVERRING:
+ c[INTELLIGENCE] += ivenarg[i] + 1;
+ limit = 1;
+ break;
+ case OHAMMER:
+ c[DEXTERITY] += 10;
+ c[STREXTRA] += 10;
+ c[INTELLIGENCE] -= 10;
+ limit = 1;
+ break;
+
+ case OORBOFDRAGON:
+ c[SLAYING]++;
+ break;
+ case OSPIRITSCARAB:
+ c[NEGATESPIRIT]++;
+ break;
+ case OCUBEofUNDEAD:
+ c[CUBEofUNDEAD]++;
+ break;
+ case ONOTHEFT:
+ c[NOTHEFT]++;
+ break;
+ case OSWORDofSLASHING:
+ c[DEXTERITY] += 5;
+ limit = 1;
+ break;
+ };
+ lprcat("\nYou pick up:");
+ srcount = 0;
+ show3(i);
+ if (limit)
+ bottomline();
+ return (0);
+ }
+ lprcat("\nYou can't carry anything else");
+ return (1);
+}
/*
- subroutine to drop an object returns 1 if something there already else 0
+ * subroutine to drop an object
+ * returns 1 if something there already else 0
*/
+int
drop_object(k)
- int k;
- {
- int itm;
- if ((k<0) || (k>25)) return(0);
- itm = iven[k]; cursors();
- if (itm==0) { lprintf("\nYou don't have item %c! ",k+'a'); return(1); }
- if (item[playerx][playery])
- { beep(); lprcat("\nThere's something here already"); return(1); }
- if (playery==MAXY-1 && playerx==33) return(1); /* not in entrance */
+ int k;
+{
+ int itm;
+
+ if ((k < 0) || (k > 25))
+ return (0);
+ itm = iven[k];
+ cursors();
+ if (itm == 0) {
+ lprintf("\nYou don't have item %c! ", k + 'a');
+ return (1);
+ }
+ if (item[playerx][playery]) {
+ lbeep();
+ lprcat("\nThere's something here already");
+ return (1);
+ }
+ if (playery == MAXY - 1 && playerx == 33)
+ return (1); /* not in entrance */
item[playerx][playery] = itm;
iarg[playerx][playery] = ivenarg[k];
- srcount=0; lprcat("\n You drop:"); show3(k); /* show what item you dropped*/
- know[playerx][playery] = 0; iven[k]=0;
- if (c[WIELD]==k) c[WIELD]= -1; if (c[WEAR]==k) c[WEAR] = -1;
- if (c[SHIELD]==k) c[SHIELD]= -1;
- adjustcvalues(itm,ivenarg[k]);
- dropflag=1; /* say dropped an item so wont ask to pick it up right away */
- return(0);
- }
+ srcount = 0;
+ lprcat("\n You drop:");
+ show3(k); /* show what item you dropped */
+ know[playerx][playery] = 0;
+ iven[k] = 0;
+ if (c[WIELD] == k)
+ c[WIELD] = -1;
+ if (c[WEAR] == k)
+ c[WEAR] = -1;
+ if (c[SHIELD] == k)
+ c[SHIELD] = -1;
+ adjustcvalues(itm, ivenarg[k]);
+ dropflag = 1; /* say dropped an item so wont ask to pick it
+ * up right away */
+ return (0);
+}
/*
- function to enchant armor player is currently wearing
+ * function to enchant armor player is currently wearing
*/
+void
enchantarmor()
- {
- register int tmp;
- if (c[WEAR]<0) { if (c[SHIELD] < 0)
- { cursors(); beep(); lprcat("\nYou feel a sense of loss"); return; }
- else { tmp=iven[c[SHIELD]]; if (tmp != OSCROLL) if (tmp != OPOTION) { ivenarg[c[SHIELD]]++; bottomline(); } } }
- tmp = iven[c[WEAR]];
- if (tmp!=OSCROLL) if (tmp!=OPOTION) { ivenarg[c[WEAR]]++; bottomline(); }
+{
+ int tmp;
+
+ if (c[WEAR] < 0) {
+ if (c[SHIELD] < 0) {
+ cursors();
+ lbeep();
+ lprcat("\nYou feel a sense of loss");
+ return;
+ } else {
+ tmp = iven[c[SHIELD]];
+ if (tmp != OSCROLL)
+ if (tmp != OPOTION) {
+ ivenarg[c[SHIELD]]++;
+ bottomline();
+ }
+ }
}
+ tmp = iven[c[WEAR]];
+ if (tmp != OSCROLL)
+ if (tmp != OPOTION) {
+ ivenarg[c[WEAR]]++;
+ bottomline();
+ }
+}
/*
- function to enchant a weapon presently being wielded
+ * function to enchant a weapon presently being wielded
*/
+void
enchweapon()
- {
- register int tmp;
- if (c[WIELD]<0)
- { cursors(); beep(); lprcat("\nYou feel a sense of loss"); return; }
- tmp = iven[c[WIELD]];
- if (tmp!=OSCROLL) if (tmp!=OPOTION)
- { ivenarg[c[WIELD]]++;
- if (tmp==OCLEVERRING) c[INTELLIGENCE]++; else
- if (tmp==OSTRRING) c[STREXTRA]++; else
- if (tmp==ODEXRING) c[DEXTERITY]++; bottomline(); }
+{
+ int tmp;
+
+ if (c[WIELD] < 0) {
+ cursors();
+ lbeep();
+ lprcat("\nYou feel a sense of loss");
+ return;
}
+ tmp = iven[c[WIELD]];
+ if (tmp != OSCROLL)
+ if (tmp != OPOTION) {
+ ivenarg[c[WIELD]]++;
+ if (tmp == OCLEVERRING)
+ c[INTELLIGENCE]++;
+ else if (tmp == OSTRRING)
+ c[STREXTRA]++;
+ else if (tmp == ODEXRING)
+ c[DEXTERITY]++;
+ bottomline();
+ }
+}
/*
- routine to tell if player can carry one more thing
- returns 1 if pockets are full, else 0
+ * routine to tell if player can carry one more thing
+ * returns 1 if pockets are full, else 0
*/
+int
pocketfull()
- {
- register int i,limit;
- if ((limit = 15+(c[LEVEL]>>1)) > 26) limit=26;
- for (i=0; i<limit; i++) if (iven[i]==0) return(0);
- return(1);
- }
+{
+ int i, limit;
+
+ if ((limit = 15 + (c[LEVEL] >> 1)) > 26)
+ limit = 26;
+ for (i = 0; i < limit; i++)
+ if (iven[i] == 0)
+ return (0);
+ return (1);
+}
/*
- function to return 1 if a monster is next to the player else returns 0
+ * function to return 1 if a monster is next to the player else returns 0
*/
+int
nearbymonst()
- {
- register int tmp,tmp2;
- for (tmp=playerx-1; tmp<playerx+2; tmp++)
- for (tmp2=playery-1; tmp2<playery+2; tmp2++)
- if (mitem[tmp][tmp2]) return(1); /* if monster nearby */
- return(0);
- }
+{
+ int tmp, tmp2;
+
+ for (tmp = playerx - 1; tmp < playerx + 2; tmp++)
+ for (tmp2 = playery - 1; tmp2 < playery + 2; tmp2++)
+ if (mitem[tmp][tmp2])
+ return (1); /* if monster nearby */
+ return (0);
+}
/*
- function to steal an item from the players pockets
- returns 1 if steals something else returns 0
+ * function to steal an item from the players pockets
+ * returns 1 if steals something else returns 0
*/
+int
stealsomething()
- {
- register int i,j;
- j=100;
- while (1)
- {
- i=rund(26);
- if (iven[i]) if (c[WEAR]!=i) if (c[WIELD]!=i) if (c[SHIELD]!=i)
- {
- srcount=0; show3(i);
- adjustcvalues(iven[i],ivenarg[i]); iven[i]=0; return(1);
- }
- if (--j <= 0) return(0);
- }
- }
+{
+ int i, j;
+
+ j = 100;
+ while (1) {
+ i = rund(26);
+ if (iven[i])
+ if (c[WEAR] != i)
+ if (c[WIELD] != i)
+ if (c[SHIELD] != i) {
+ srcount = 0;
+ show3(i);
+ adjustcvalues(iven[i], ivenarg[i]);
+ iven[i] = 0;
+ return (1);
+ }
+ if (--j <= 0)
+ return (0);
+ }
+}
/*
- function to return 1 is player carrys nothing else return 0
+ * function to return 1 is player carrys nothing else return 0
*/
+int
emptyhanded()
- {
- register int i;
- for (i=0; i<26; i++)
- if (iven[i]) if (i!=c[WIELD]) if (i!=c[WEAR]) if (i!=c[SHIELD]) return(0);
- return(1);
- }
+{
+ int i;
+
+ for (i = 0; i < 26; i++)
+ if (iven[i])
+ if (i != c[WIELD])
+ if (i != c[WEAR])
+ if (i != c[SHIELD])
+ return (0);
+ return (1);
+}
/*
- function to create a gem on a square near the player
+ * function to create a gem on a square near the player
*/
+void
creategem()
- {
- register int i,j;
- switch(rnd(4))
- {
- case 1: i=ODIAMOND; j=50; break;
- case 2: i=ORUBY; j=40; break;
- case 3: i=OEMERALD; j=30; break;
- default: i=OSAPPHIRE; j=20; break;
- };
- createitem(i,rnd(j)+j/10);
- }
+{
+ int i, j;
+
+ switch (rnd(4)) {
+ case 1:
+ i = ODIAMOND;
+ j = 50;
+ break;
+ case 2:
+ i = ORUBY;
+ j = 40;
+ break;
+ case 3:
+ i = OEMERALD;
+ j = 30;
+ break;
+ default:
+ i = OSAPPHIRE;
+ j = 20;
+ break;
+ };
+ createitem(i, rnd(j) + j / 10);
+}
/*
- function to change character levels as needed when dropping an object
- that affects these characteristics
+ * function to change character levels as needed when dropping an object
+ * that affects these characteristics
*/
-adjustcvalues(itm,arg)
- int itm,arg;
- {
- register int flag;
- flag=0;
- switch(itm)
- {
- case ODEXRING: c[DEXTERITY] -= arg+1; flag=1; break;
- case OSTRRING: c[STREXTRA] -= arg+1; flag=1; break;
- case OCLEVERRING: c[INTELLIGENCE] -= arg+1; flag=1; break;
- case OHAMMER: c[DEXTERITY] -= 10; c[STREXTRA] -= 10;
- c[INTELLIGENCE] += 10; flag=1; break;
- case OSWORDofSLASHING: c[DEXTERITY] -= 5; flag=1; break;
- case OORBOFDRAGON: --c[SLAYING]; return;
- case OSPIRITSCARAB: --c[NEGATESPIRIT]; return;
- case OCUBEofUNDEAD: --c[CUBEofUNDEAD]; return;
- case ONOTHEFT: --c[NOTHEFT]; return;
- case OLANCE: c[LANCEDEATH]=0; return;
- case OPOTION: case OSCROLL: return;
-
- default: flag=1;
- };
- if (flag) bottomline();
- }
+void
+adjustcvalues(itm, arg)
+ int itm, arg;
+{
+ int flag;
+
+ flag = 0;
+ switch (itm) {
+ case ODEXRING:
+ c[DEXTERITY] -= arg + 1;
+ flag = 1;
+ break;
+ case OSTRRING:
+ c[STREXTRA] -= arg + 1;
+ flag = 1;
+ break;
+ case OCLEVERRING:
+ c[INTELLIGENCE] -= arg + 1;
+ flag = 1;
+ break;
+ case OHAMMER:
+ c[DEXTERITY] -= 10;
+ c[STREXTRA] -= 10;
+ c[INTELLIGENCE] += 10;
+ flag = 1;
+ break;
+ case OSWORDofSLASHING:
+ c[DEXTERITY] -= 5;
+ flag = 1;
+ break;
+ case OORBOFDRAGON:
+ --c[SLAYING];
+ return;
+ case OSPIRITSCARAB:
+ --c[NEGATESPIRIT];
+ return;
+ case OCUBEofUNDEAD:
+ --c[CUBEofUNDEAD];
+ return;
+ case ONOTHEFT:
+ --c[NOTHEFT];
+ return;
+ case OLANCE:
+ c[LANCEDEATH] = 0;
+ return;
+ case OPOTION:
+ case OSCROLL:
+ return;
+
+ default:
+ flag = 1;
+ };
+ if (flag)
+ bottomline();
+}
/*
- function to read a string from token input "string"
- returns a pointer to the string
+ * function to read a string from token input "string"
+ * returns a pointer to the string
*/
+void
gettokstr(str)
- register char *str;
- {
- register int i,j;
- i=50;
- while ((getchar() != '"') && (--i > 0));
- i=36;
- while (--i > 0)
- {
- if ((j=getchar()) != '"') *str++ = j; else i=0;
- }
- *str = 0;
- i=50;
- if (j != '"') while ((getchar() != '"') && (--i > 0)); /* if end due to too long, then find closing quote */
+ char *str;
+{
+ int i, j;
+
+ i = 50;
+ while ((lgetchar() != '"') && (--i > 0));
+ i = 36;
+ while (--i > 0) {
+ if ((j = lgetchar()) != '"')
+ *str++ = j;
+ else
+ i = 0;
}
+ *str = 0;
+ i = 50;
+ if (j != '"')
+ /* if end due to too long, then find closing quote */
+ while ((lgetchar() != '"') && (--i > 0));
+}
/*
- function to ask user for a password (no echo)
- returns 1 if entered correctly, 0 if not
+ * function to ask user for a password (no echo)
+ * returns 1 if entered correctly, 0 if not
*/
-static char gpwbuf[33];
+static char gpwbuf[33];
+int
getpassword()
- {
- register int i,j;
- register char *gpwp;
- extern char *password;
- scbr(); /* system("stty -echo cbreak"); */
- gpwp = gpwbuf; lprcat("\nEnter Password: "); lflush();
+{
+ int i, j;
+ char *gpwp;
+ extern char *password;
+
+ scbr(); /* system("stty -echo cbreak"); */
+ gpwp = gpwbuf;
+ lprcat("\nEnter Password: ");
+ lflush();
i = strlen(password);
- for (j=0; j<i; j++) read(0,gpwp++,1); gpwbuf[i]=0;
- sncbr(); /* system("stty echo -cbreak"); */
- if (strcmp(gpwbuf,password) != 0)
- { lprcat("\nSorry\n"); lflush(); return(0); }
- else return(1);
- }
+ for (j = 0; j < i; j++)
+ read(0, gpwp++, 1);
+ gpwbuf[i] = 0;
+ sncbr(); /* system("stty echo -cbreak"); */
+ if (strcmp(gpwbuf, password) != 0) {
+ lprcat("\nSorry\n");
+ lflush();
+ return (0);
+ } else
+ return (1);
+}
/*
- subroutine to get a yes or no response from the user
- returns y or n
+ * subroutine to get a yes or no response from the user
+ * returns y or n
*/
+int
getyn()
- {
- register int i;
- i=0; while (i!='y' && i!='n' && i!='\33') i=getchar();
- return(i);
- }
+{
+ int i;
+
+ i = 0;
+ while (i != 'y' && i != 'n' && i != '\33')
+ i = lgetchar();
+ return (i);
+}
/*
- function to calculate the pack weight of the player
- returns the number of pounds the player is carrying
+ * function to calculate the pack weight of the player
+ * returns the number of pounds the player is carrying
*/
+int
packweight()
- {
- register int i,j,k;
- k=c[GOLD]/1000; j=25; while ((iven[j]==0) && (j>0)) --j;
- for (i=0; i<=j; i++)
- switch(iven[i])
- {
- case 0: break;
- case OSSPLATE: case OPLATEARMOR: k += 40; break;
- case OPLATE: k += 35; break;
- case OHAMMER: k += 30; break;
- case OSPLINT: k += 26; break;
- case OSWORDofSLASHING: case OCHAIN:
- case OBATTLEAXE: case O2SWORD: k += 23; break;
- case OLONGSWORD: case OSWORD:
- case ORING: case OFLAIL: k += 20; break;
- case OLANCE: case OSTUDLEATHER: k += 15; break;
- case OLEATHER: case OSPEAR: k += 8; break;
- case OORBOFDRAGON: case OBELT: k += 4; break;
- case OSHIELD: k += 7; break;
- case OCHEST: k += 30 + ivenarg[i]; break;
- default: k++;
- };
- return(k);
- }
+{
+ int i, j, k;
+
+ k = c[GOLD] / 1000;
+ j = 25;
+ while ((iven[j] == 0) && (j > 0))
+ --j;
+ for (i = 0; i <= j; i++)
+ switch (iven[i]) {
+ case 0:
+ break;
+ case OSSPLATE:
+ case OPLATEARMOR:
+ k += 40;
+ break;
+ case OPLATE:
+ k += 35;
+ break;
+ case OHAMMER:
+ k += 30;
+ break;
+ case OSPLINT:
+ k += 26;
+ break;
+ case OSWORDofSLASHING:
+ case OCHAIN:
+ case OBATTLEAXE:
+ case O2SWORD:
+ k += 23;
+ break;
+ case OLONGSWORD:
+ case OSWORD:
+ case ORING:
+ case OFLAIL:
+ k += 20;
+ break;
+ case OLANCE:
+ case OSTUDLEATHER:
+ k += 15;
+ break;
+ case OLEATHER:
+ case OSPEAR:
+ k += 8;
+ break;
+ case OORBOFDRAGON:
+ case OBELT:
+ k += 4;
+ break;
+ case OSHIELD:
+ k += 7;
+ break;
+ case OCHEST:
+ k += 30 + ivenarg[i];
+ break;
+ default:
+ k++;
+ };
+ return (k);
+}
#ifndef MACRORND
- /* macros to generate random numbers 1<=rnd(N)<=N 0<=rund(N)<=N-1 */
+/* macros to generate random numbers 1<=rnd(N)<=N 0<=rund(N)<=N-1 */
+int
rnd(x)
- int x;
- {
- return((((randx=randx*1103515245+12345)>>7)%(x))+1);
- }
+ int x;
+{
+ return ((((randx = randx * 1103515245 + 12345) >> 7) % (x)) + 1);
+}
+int
rund(x)
- int x;
- {
- return((((randx=randx*1103515245+12345)>>7)%(x)) );
- }
-#endif MACRORND
+ int x;
+{
+ return ((((randx = randx * 1103515245 + 12345) >> 7) % (x)));
+}
+#endif /* MACRORND */
diff --git a/games/larn/header.h b/games/larn/header.h
index 907a4e95f65..87946ef7b16 100644
--- a/games/larn/header.h
+++ b/games/larn/header.h
@@ -1,81 +1,80 @@
-/* $NetBSD: header.h,v 1.7.6.1 1996/05/27 15:54:20 mrg Exp $ */
+/* $OpenBSD: header.h,v 1.7 1998/09/15 05:12:32 pjanzen Exp $ */
+/* $NetBSD: header.h,v 1.12 1997/10/25 01:40:48 thorpej Exp $ */
-/* header.h Larn is copyrighted 1986 by Noah Morgan. */
+/* header.h Larn is copyrighted 1986 by Noah Morgan. */
#include <sys/types.h>
#define MAXLEVEL 11
- /* max # levels in the dungeon */
+/* max # levels in the dungeon */
#define MAXVLEVEL 3
- /* max # of levels in the temple of the luran */
+/* max # of levels in the temple of the luran */
#define MAXX 67
#define MAXY 17
#define SCORESIZE 10
- /* this is the number of people on a scoreboard max */
+/* this is the number of people on a scoreboard max */
#define MAXPLEVEL 100
- /* maximum player level allowed */
+/* maximum player level allowed */
#define MAXMONST 56
- /* maximum # monsters in the dungeon */
+/* maximum # monsters in the dungeon */
#define SPNUM 38
- /* maximum number of spells in existance */
+/* maximum number of spells in existance */
#define MAXSCROLL 28
- /* maximum number of scrolls that are possible */
+/* maximum number of scrolls that are possible */
#define MAXPOTION 35
- /* maximum number of potions that are possible */
+/* maximum number of potions that are possible */
#define TIMELIMIT 30000
- /* the maximum number of moves before the game is called */
+/* the maximum number of moves before the game is called */
#define TAXRATE 1/20
- /* the tax rate for the LRS */
+/* the tax rate for the LRS */
#define MAXOBJ 93
- /* the maximum number of objects n < MAXOBJ */
+/* the maximum number of objects n < MAXOBJ */
-/* this is the structure definition of the monster data */
-struct monst
- {
- char *name;
- char level;
- short armorclass;
- char damage;
- char attack;
- char defense;
- char genocided;
- char intelligence; /* monsters intelligence -- used to choose movement */
- short gold;
- short hitpoints;
- unsigned long experience;
- };
+/* this is the structure definition of the monster data */
+struct monst {
+ char *name;
+ char level;
+ short armorclass;
+ char damage;
+ char attack;
+ char defense;
+ char genocided;
+ char intelligence; /* monsters intelligence -- used to
+ * choose movement */
+ short gold;
+ short hitpoints;
+ unsigned long experience;
+};
-/* this is the structure definition for the items in the dnd store */
-struct _itm
- {
- short price;
- char obj;
- char arg;
- char qty;
- };
+/* this is the structure definition for the items in the dnd store */
+struct _itm {
+ short price;
+ u_char obj;
+ u_char arg;
+ char qty;
+};
-/* this is the structure that holds the entire dungeon specifications */
-struct cel
- {
- short hitp; /* monster's hit points */
- char mitem; /* the monster ID */
- char item; /* the object's ID */
- short iarg; /* the object's argument */
- char know; /* have we been here before*/
- };
+/* this is the structure that holds the entire dungeon specifications */
+struct cel {
+ short hitp; /* monster's hit points */
+ char mitem; /* the monster ID */
+ char item; /* the object's ID */
+ short iarg; /* the object's argument */
+ char know; /* have we been here before */
+};
/* this is the structure for maintaining & moving the spheres of annihilation */
-struct sphere
- {
- struct sphere *p; /* pointer to next structure */
- char x,y,lev; /* location of the sphere */
- char dir; /* direction sphere is going in */
- short lifetime; /* duration of the sphere */
- };
+struct sphere {
+ struct sphere *p; /* pointer to next structure */
+ char x, y, lev; /* location of the sphere */
+ char dir; /* direction sphere is going in */
+ short lifetime; /* duration of the sphere */
+};
-/* defines for the character attribute array c[] */
-#define STRENGTH 0 /* characters physical strength not due to objects */
+/* defines for the character attribute array c[] */
+#define STRENGTH 0 /* characters physical strength not due to
+ * objects */
#define INTELLIGENCE 1
#define WISDOM 2
#define CONSTITUTION 3
@@ -102,7 +101,7 @@ struct sphere
#define REGENCOUNTER 24
#define MOREDAM 25
#define DEXCOUNT 26
-#define STRCOUNT 27
+#define STRCNT 27
#define BLINDCOUNT 28
#define CAVELEVEL 29
#define CONFUSE 30
@@ -149,13 +148,14 @@ struct sphere
#define SEEINVISIBLE 71
#define FILLROOM 72
#define RANDOMWALK 73
-#define SPHCAST 74 /* nz if an active sphere of annihilation */
-#define WTW 75 /* walk through walls */
-#define STREXTRA 76 /* character strength due to objects or enchantments */
-#define TMP 77 /* misc scratch space */
-#define LIFEPROT 78 /* life protection counter */
+#define SPHCAST 74 /* nz if an active sphere of annihilation */
+#define WTW 75 /* walk through walls */
+#define STREXTRA 76 /* character strength due to objects or
+ * enchantments */
+#define TMP 77 /* misc scratch space */
+#define LIFEPROT 78 /* life protection counter */
-/* defines for the objects in the game */
+/* defines for the objects in the game */
#define OALTAR 1
#define OTHRONE 2
@@ -249,62 +249,62 @@ struct sphere
#define OTRADEPOST 77
#define OIVTELETRAP 78
#define ODEADTHRONE 79
-#define OANNIHILATION 80 /* sphere of annihilation */
+#define OANNIHILATION 80 /* sphere of annihilation */
#define OTHRONE2 81
-#define OLRS 82 /* Larn Revenue Service */
+#define OLRS 82 /* Larn Revenue Service */
#define OCOOKIE 83
#define OURN 84
#define OBRASSLAMP 85
#define OHANDofFEAR 86 /* hand of fear */
#define OSPHTAILSMAN 87 /* tailsman of the sphere */
-#define OWWAND 88 /* wand of wonder */
-#define OPSTAFF 89 /* staff of power */
+#define OWWAND 88 /* wand of wonder */
+#define OPSTAFF 89 /* staff of power */
/* used up to 92 */
-/* defines for the monsters as objects */
+/* defines for the monsters as objects */
-#define BAT 1
-#define GNOME 2
-#define HOBGOBLIN 3
-#define JACKAL 4
-#define KOBOLD 5
-#define ORC 6
+#define BAT 1
+#define GNOME 2
+#define HOBGOBLIN 3
+#define JACKAL 4
+#define KOBOLD 5
+#define ORC 6
#define SNAKE 7
#define CENTIPEDE 8
-#define JACULI 9
-#define TROGLODYTE 10
-#define ANT 11
-#define EYE 12
+#define JACULI 9
+#define TROGLODYTE 10
+#define ANT 11
+#define EYE 12
#define LEPRECHAUN 13
-#define NYMPH 14
-#define QUASIT 15
-#define RUSTMONSTER 16
-#define ZOMBIE 17
-#define ASSASSINBUG 18
-#define BUGBEAR 19
-#define HELLHOUND 20
-#define ICELIZARD 21
-#define CENTAUR 22
-#define TROLL 23
-#define YETI 24
-#define WHITEDRAGON 25
-#define ELF 26
-#define CUBE 27
-#define METAMORPH 28
-#define VORTEX 29
-#define ZILLER 30
-#define VIOLETFUNGI 31
-#define WRAITH 32
-#define FORVALAKA 33
-#define LAMANOBE 34
-#define OSEQUIP 35
-#define ROTHE 36
-#define XORN 37
-#define VAMPIRE 38
-#define INVISIBLESTALKER 39
-#define POLTERGEIST 40
-#define DISENCHANTRESS 41
-#define SHAMBLINGMOUND 42
+#define NYMPH 14
+#define QUASIT 15
+#define RUSTMONSTER 16
+#define ZOMBIE 17
+#define ASSASSINBUG 18
+#define BUGBEAR 19
+#define HELLHOUND 20
+#define ICELIZARD 21
+#define CENTAUR 22
+#define TROLL 23
+#define YETI 24
+#define WHITEDRAGON 25
+#define ELF 26
+#define CUBE 27
+#define METAMORPH 28
+#define VORTEX 29
+#define ZILLER 30
+#define VIOLETFUNGI 31
+#define WRAITH 32
+#define FORVALAKA 33
+#define LAMANOBE 34
+#define OSEQUIP 35
+#define ROTHE 36
+#define XORN 37
+#define VAMPIRE 38
+#define INVISIBLESTALKER 39
+#define POLTERGEIST 40
+#define DISENCHANTRESS 41
+#define SHAMBLINGMOUND 42
#define YELLOWMOLD 43
#define UMBERHULK 44
#define GNOMEKING 45
@@ -323,78 +323,85 @@ struct sphere
#define DEMONPRINCE 64
#define NULL 0
-#define BUFBIG 4096 /* size of the output buffer */
-#define MAXIBUF 4096 /* size of the input buffer */
-#define LOGNAMESIZE 40 /* max size of the players name */
-#define PSNAMESIZE 40 /* max size of the process name */
+#define BUFBIG 4096 /* size of the output buffer */
+#define MAXIBUF 4096 /* size of the input buffer */
+#define LOGNAMESIZE 40 /* max size of the players name */
+#define PSNAMESIZE 40 /* max size of the process name */
#ifndef NODEFS
-extern char VERSION,SUBVERSION;
-extern char aborted[],alpha[],beenhere[],boldon,cheat,ckpfile[],ckpflag;
-extern char *class[],course[],diagfile[],helpfile[];
-extern char *inbuffer,is_alpha[],is_digit[];
-extern char item[MAXX][MAXY],iven[],know[MAXX][MAXY],larnlevels[],lastmonst[];
-extern char *levelname[],logfile[],loginname[],logname[],*lpbuf,*lpend;
-extern char *lpnt,moved[MAXX][MAXY],mitem[MAXX][MAXY],monstlevel[];
-extern char monstnamelist[],nch[],ndgg[],nlpts[],nomove,nosignal,nowelcome;
-extern char nplt[],nsw[],*objectname[],objnamelist[],optsfile[1024];
-extern char *potionhide[],*potionname[],playerids[],potprob[];
-extern char predostuff,psname[],restorflag,savefilename[1024],scorefile[];
-extern char scprob[],screen[MAXX][MAXY],*scrollhide[],*scrollname[],sex;
-extern char *spelcode[],*speldescript[];
-extern char spelknow[],*spelname[],*spelmes[],spelweird[MAXMONST+8][SPNUM];
-extern char splev[],stealth[MAXX][MAXY],to_lower[],to_upper[],wizard;
-extern short diroffx[],diroffy[],hitflag,hit2flag,hit3flag,hitp[MAXX][MAXY];
-extern short iarg[MAXX][MAXY],ivenarg[],lasthx,lasthy,lastnum,lastpx,lastpy;
-extern short nobeep,oldx,oldy,playerx,playery,level;
-extern int dayplay,enable_scroll,srcount,yrepcount,userid,wisid,lfd,fd;
-extern uid_t uid, euid;
-extern long initialtime,outstanding_taxes,skill[],gltime,c[],cbak[];
+extern char VERSION, SUBVERSION;
+extern u_char alpha[], beenhere[], boldon, cheat, ckpflag;
+extern u_char *class[], course[];
+extern char diagfile[], helpfile[], ckpfile[], larnlevels[],
+ playerids[], optsfile[], psname[], savefilename[1024],
+ scorefile[];
+extern u_char *inbuffer, is_alpha[], is_digit[];
+extern u_char item[MAXX][MAXY], iven[], know[MAXX][MAXY];
+extern char *levelname[], logfile[], loginname[], logname[],
+ lastmonst[];
+extern u_char *lpbuf, *lpend;
+extern u_char *lpnt, moved[MAXX][MAXY], mitem[MAXX][MAXY], monstlevel[];
+extern char monstnamelist[], objnamelist[];
+extern u_char nch[], ndgg[], nlpts[], nomove, nosignal, nowelcome;
+extern u_char nplt[], nsw[];
+extern char *objectname[], *potionhide[], *potionname[],
+ *spelcode[], *spelname[], *spelmes[], aborted[],
+ spelweird[MAXMONST + 8][SPNUM];
+extern u_char potprob[];
+extern u_char predostuff, restorflag, scprob[];
+extern u_char screen[MAXX][MAXY], sex;
+extern char *speldescript[], *scrollhide[], *scrollname[];
+extern u_char spelknow[];
+extern u_char splev[], stealth[MAXX][MAXY], to_lower[], to_upper[], wizard;
+extern short diroffx[], diroffy[], hitflag, hit2flag, hit3flag, hitp[MAXX][MAXY];
+extern short iarg[MAXX][MAXY], ivenarg[], lasthx, lasthy, lastnum, lastpx,
+ lastpy;
+extern short nobeep, oldx, oldy, playerx, playery, level;
+extern int dayplay, enable_scroll, srcount, yrepcount, userid, wisid,
+ lfd, fd;
+extern gid_t gid, egid;
+extern long outstanding_taxes, skill[], gltime, c[], cbak[];
+extern time_t initialtime;
extern unsigned long randx;
extern struct cel *cell;
extern struct monst monster[];
extern struct sphere *spheres;
extern struct _itm itm[];
+extern int rmst, maxitm, lasttime;
-char *fortune(),*getenv(),*getlogin(),*lgetw(),*lgetl(),*ctime();
-char *tmcapcnv(),*tgetstr(),*tgoto();
-long paytaxes(),lgetc(),lrint();
-unsigned long readnum();
-void *malloc();
-
- /* macro to create scroll #'s with probability of occurrence */
+/* macro to create scroll #'s with probability of occurrence */
#define newscroll() (scprob[rund(81)])
- /* macro to return a potion # created with probability of occurrence */
+/* macro to return a potion # created with probability of occurrence */
#define newpotion() (potprob[rund(41)])
- /* macro to return the + points on created leather armor */
+/* macro to return the + points on created leather armor */
#define newleather() (nlpts[rund(c[HARDGAME]?13:15)])
- /* macro to return the + points on chain armor */
+/* macro to return the + points on chain armor */
#define newchain() (nch[rund(10)])
- /* macro to return + points on plate armor */
+/* macro to return + points on plate armor */
#define newplate() (nplt[rund(c[HARDGAME]?4:12)])
- /* macro to return + points on new daggers */
+/* macro to return + points on new daggers */
#define newdagger() (ndgg[rund(13)])
- /* macro to return + points on new swords */
+/* macro to return + points on new swords */
#define newsword() (nsw[rund(c[HARDGAME]?6:13)])
- /* macro to destroy object at present location */
+/* macro to destroy object at present location */
#define forget() (item[playerx][playery]=know[playerx][playery]=0)
- /* macro to wipe out a monster at a location */
+/* macro to wipe out a monster at a location */
#define disappear(x,y) (mitem[x][y]=know[x][y]=0)
#ifdef VT100
- /* macro to turn on bold display for the terminal */
+/* macro to turn on bold display for the terminal */
#define setbold() (lprcat(boldon?"\33[1m":"\33[7m"))
- /* macro to turn off bold display for the terminal */
+/* macro to turn off bold display for the terminal */
#define resetbold() (lprcat("\33[m"))
- /* macro to setup the scrolling region for the terminal */
+/* macro to setup the scrolling region for the terminal */
#define setscroll() (lprcat("\33[20;24r"))
- /* macro to clear the scrolling region for the terminal */
+/* macro to clear the scrolling region for the terminal */
#define resetscroll() (lprcat("\33[;24r"))
- /* macro to clear the screen and home the cursor */
+/* macro to clear the screen and home the cursor */
#define clear() (lprcat("\33[2J\33[f"), cbak[SPELLS]= -50)
#define cltoeoln() lprcat("\33[K")
-#else VT100
- /* defines below are for use in the termcap mode only */
+#else /* VT100 */
+/* defines below are for use in the termcap mode only */
#define ST_START 1
#define ST_END 2
#define BOLD 3
@@ -403,31 +410,31 @@ void *malloc();
#define CL_LINE 6
#define CL_DOWN 14
#define CURSOR 15
- /* macro to turn on bold display for the terminal */
+/* macro to turn on bold display for the terminal */
#define setbold() (*lpnt++ = ST_START)
- /* macro to turn off bold display for the terminal */
+/* macro to turn off bold display for the terminal */
#define resetbold() (*lpnt++ = ST_END)
- /* macro to setup the scrolling region for the terminal */
+/* macro to setup the scrolling region for the terminal */
#define setscroll() enable_scroll=1
- /* macro to clear the scrolling region for the terminal */
+/* macro to clear the scrolling region for the terminal */
#define resetscroll() enable_scroll=0
- /* macro to clear the screen and home the cursor */
+/* macro to clear the screen and home the cursor */
#define clear() (*lpnt++ =CLEAR, cbak[SPELLS]= -50)
- /* macro to clear to end of line */
+/* macro to clear to end of line */
#define cltoeoln() (*lpnt++ = CL_LINE)
-#endif VT100
+#endif /* VT100 */
- /* macro to output one byte to the output buffer */
+/* macro to output one byte to the output buffer */
#define lprc(ch) ((lpnt>=lpend)?(*lpnt++ =(ch), lflush()):(*lpnt++ =(ch)))
- /* macro to seed the random number generator */
+/* macro to seed the random number generator */
#define srand(x) (randx=x)
#ifdef MACRORND
- /* macros to generate random numbers 1<=rnd(N)<=N 0<=rund(N)<=N-1 */
+/* macros to generate random numbers 1<=rnd(N)<=N 0<=rund(N)<=N-1 */
#define rnd(x) ((((randx=randx*1103515245+12345)>>7)%(x))+1)
#define rund(x) ((((randx=randx*1103515245+12345)>>7)%(x)) )
-#endif MACRORND
- /* macros for miscellaneous data conversion */
+#endif /* MACRORND */
+/* macros for miscellaneous data conversion */
#define min(x,y) (((x)>(y))?(y):(x))
#define max(x,y) (((x)>(y))?(x):(y))
#define isalpha(x) (is_alpha[x])
@@ -436,5 +443,4 @@ void *malloc();
#define toupper(x) (to_upper[x])
#define lcc(x) (to_lower[x])
#define ucc(x) (to_upper[x])
-#endif NODEFS
-
+#endif /* NODEFS */
diff --git a/games/larn/help.c b/games/larn/help.c
index 8cbae3a119b..4ddcb65c4e5 100644
--- a/games/larn/help.c
+++ b/games/larn/help.c
@@ -1,11 +1,17 @@
+/* $OpenBSD: help.c,v 1.2 1998/09/15 05:12:32 pjanzen Exp $ */
+/* $NetBSD: help.c,v 1.4 1997/10/18 20:03:24 christos Exp $ */
+
+/* help.c Larn is copyrighted 1986 by Noah Morgan. */
#ifndef lint
-static char rcsid[] = "$NetBSD: help.c,v 1.3 1995/03/23 08:33:33 cgd Exp $";
+static char rcsid[] = "$OpenBSD: help.c,v 1.2 1998/09/15 05:12:32 pjanzen Exp $";
#endif /* not lint */
-/* help.c Larn is copyrighted 1986 by Noah Morgan. */
+#include <unistd.h>
+
#include "header.h"
+#include "extern.h"
/*
- * help function to display the help info
+ * help function to display the help info
*
* format of the .larn.help file
*
@@ -13,79 +19,107 @@ static char rcsid[] = "$NetBSD: help.c,v 1.3 1995/03/23 08:33:33 cgd Exp $";
* page (23 lines) for the introductory message (not counted in above)
* pages of help text (23 lines per page)
*/
-extern char helpfile[];
+void
help()
- {
- register int i,j;
+{
+ int i, j;
#ifndef VT100
- char tmbuf[128]; /* intermediate translation buffer when not a VT100 */
-#endif VT100
- if ((j=openhelp()) < 0) return; /* open the help file and get # pages */
- for (i=0; i<23; i++) lgetl(); /* skip over intro message */
- for (; j>0; j--)
- {
+ char tmbuf[128]; /* intermediate translation buffer
+ * when not a VT100 */
+#endif /* VT100 */
+ if ((j = openhelp()) < 0)
+ return; /* open the help file and get # pages */
+ for (i = 0; i < 23; i++)
+ lgetl(); /* skip over intro message */
+ for (; j > 0; j--) {
clear();
- for (i=0; i<23; i++)
+ for (i = 0; i < 23; i++)
#ifdef VT100
- lprcat(lgetl()); /* print out each line that we read in */
-#else VT100
- { tmcapcnv(tmbuf,lgetl()); lprcat(tmbuf); } /* intercept \33's */
-#endif VT100
- if (j>1)
- {
- lprcat(" ---- Press "); standout("return");
- lprcat(" to exit, "); standout("space");
+ lprcat(lgetl()); /* print out each line that
+ * we read in */
+#else /* VT100 */
+ {
+ tmcapcnv(tmbuf, lgetl());
+ lprcat(tmbuf);
+ } /* intercept \33's */
+#endif /* VT100 */
+ if (j > 1) {
+ lprcat(" ---- Press ");
+ lstandout("return");
+ lprcat(" to exit, ");
+ lstandout("space");
lprcat(" for more help ---- ");
- i=0; while ((i!=' ') && (i!='\n') && (i!='\33')) i=getchar();
- if ((i=='\n') || (i=='\33'))
- {
- lrclose(); setscroll(); drawscreen(); return;
- }
+ i = 0;
+ while ((i != ' ') && (i != '\n') && (i != '\33'))
+ i = lgetchar();
+ if ((i == '\n') || (i == '\33')) {
+ lrclose();
+ setscroll();
+ drawscreen();
+ return;
}
}
- lrclose(); retcont(); drawscreen();
}
+ lrclose();
+ retcont();
+ drawscreen();
+}
/*
* function to display the welcome message and background
*/
+void
welcome()
- {
- register int i;
+{
+ int i;
#ifndef VT100
- char tmbuf[128]; /* intermediate translation buffer when not a VT100 */
-#endif VT100
- if (openhelp() < 0) return; /* open the help file */
+ char tmbuf[128]; /* intermediate translation buffer
+ * when not a VT100 */
+#endif /* VT100 */
+ if (openhelp() < 0)
+ return; /* open the help file */
clear();
- for(i=0; i<23; i++)
+ for (i = 0; i < 23; i++)
#ifdef VT100
- lprcat(lgetl()); /* print out each line that we read in */
-#else VT100
- { tmcapcnv(tmbuf,lgetl()); lprcat(tmbuf); } /* intercept \33's */
-#endif VT100
- lrclose(); retcont(); /* press return to continue */
- }
+ lprcat(lgetl());/* print out each line that we read in */
+#else /* VT100 */
+ {
+ tmcapcnv(tmbuf, lgetl());
+ lprcat(tmbuf);
+ } /* intercept \33's */
+#endif /* VT100 */
+ lrclose();
+ retcont(); /* press return to continue */
+}
/*
* function to say press return to continue and reset scroll when done
*/
+void
retcont()
- {
- cursor(1,24); lprcat("Press "); standout("return");
- lprcat(" to continue: "); while (getchar() != '\n');
+{
+ cursor(1, 24);
+ lprcat("Press ");
+ lstandout("return");
+ lprcat(" to continue: ");
+ while (lgetchar() != '\n');
setscroll();
- }
+}
/*
* routine to open the help file and return the first character - '0'
*/
+int
openhelp()
- {
- if (lopen(helpfile)<0)
- {
- lprintf("Can't open help file \"%s\" ",helpfile);
- lflush(); sleep(4); drawscreen(); setscroll(); return(-1);
- }
- resetscroll(); return(lgetc() - '0');
+{
+ if (lopen(helpfile) < 0) {
+ lprintf("Can't open help file \"%s\" ", helpfile);
+ lflush();
+ sleep(4);
+ drawscreen();
+ setscroll();
+ return (-1);
}
-
+ resetscroll();
+ return (lgetc() - '0');
+}
diff --git a/games/larn/io.c b/games/larn/io.c
index 167c7fbc4e7..069dd0bad16 100644
--- a/games/larn/io.c
+++ b/games/larn/io.c
@@ -1,79 +1,109 @@
-#ifndef lint
-static char rcsid[] = "$NetBSD: io.c,v 1.4 1995/04/24 12:23:57 cgd Exp $";
-#endif /* not lint */
+/* $OpenBSD: io.c,v 1.4 1998/09/15 05:12:32 pjanzen Exp $ */
+/* $NetBSD: io.c,v 1.7 1997/10/18 20:03:26 christos Exp $ */
-/* io.c Larn is copyrighted 1986 by Noah Morgan.
- *
- * Below are the functions in this file:
- *
- * setupvt100() Subroutine to set up terminal in correct mode for game
- * clearvt100() Subroutine to clean up terminal when the game is over
- * getchar() Routine to read in one character from the terminal
- * scbr() Function to set cbreak -echo for the terminal
- * sncbr() Function to set -cbreak echo for the terminal
- * newgame() Subroutine to save the initial time and seed rnd()
- *
- * FILE OUTPUT ROUTINES
- *
- * lprintf(format,args . . .) printf to the output buffer
- * lprint(integer) send binary integer to output buffer
- * lwrite(buf,len) write a buffer to the output buffer
- * lprcat(str) sent string to output buffer
- *
- * FILE OUTPUT MACROS (in header.h)
- *
- * lprc(character) put the character into the output buffer
- *
- * FILE INPUT ROUTINES
- *
- * long lgetc() read one character from input buffer
- * long lrint() read one integer from input buffer
- * lrfill(address,number) put input bytes into a buffer
- * char *lgetw() get a whitespace ended word from input
- * char *lgetl() get a \n or EOF ended line from input
- *
- * FILE OPEN / CLOSE ROUTINES
- *
- * lcreat(filename) create a new file for write
- * lopen(filename) open a file for read
- * lappend(filename) open for append to an existing file
- * lrclose() close the input file
- * lwclose() close output file
- * lflush() flush the output buffer
- *
- * Other Routines
- *
- * cursor(x,y) position cursor at [x,y]
- * cursors() position cursor at [1,24] (saves memory)
- * cl_line(x,y) Clear line at [1,y] and leave cursor at [x,y]
- * cl_up(x,y) Clear screen from [x,1] to current line.
- * cl_dn(x,y) Clear screen from [1,y] to end of display.
- * standout(str) Print the string in standout mode.
- * set_score_output() Called when output should be literally printed.
- ** putchar(ch) Print one character in decoded output buffer.
- ** flush_buf() Flush buffer with decoded output.
- ** init_term() Terminal initialization -- setup termcap info
- ** char *tmcapcnv(sd,ss) Routine to convert VT100 \33's to termcap format
- * beep() Routine to emit a beep if enabled (see no-beep in .larnopts)
- *
+/*
+ * io.c Larn is copyrighted 1986 by Noah Morgan.
+ *
+ * Below are the functions in this file:
+ *
+ * setupvt100() Subroutine to set up terminal in correct mode for game
+ * clearvt100() Subroutine to clean up terminal when the game is over
+ * lgetchar() Routine to read in one character from the terminal
+ * scbr() Function to set cbreak -echo for the terminal
+ * sncbr() Function to set -cbreak echo for the terminal
+ * newgame() Subroutine to save the initial time and seed rnd()
+ *
+ * FILE OUTPUT ROUTINES
+ *
+ * lprintf(format,args . . .) printf to the output buffer
+ * lprint(integer) end binary integer to output buffer
+ * lwrite(buf,len) write a buffer to the output buffer
+ * lprcat(str) sent string to output buffer
+ *
+ * FILE OUTPUT MACROS (in header.h)
+ *
+ * lprc(character) put the character into the output buffer
+ *
+ * FILE INPUT ROUTINES
+ *
+ * long lgetc() read one character from input buffer
+ * long lrint() read one integer from input buffer
+ * lrfill(address,number) put input bytes into a buffer char
+ * *lgetw() get a whitespace ended word from
+ * input char *lgetl() get a \n or EOF ended line
+ * from input
+ *
+ * FILE OPEN / CLOSE ROUTINES
+ *
+ * lcreat(filename) create a new file for write
+ * lopen(filename) open a file for read
+ * lappend(filename) open for append to an existing file
+ * lrclose() close the input file
+ * lwclose() close output file
+ * lflush() flush the output buffer
+ *
+ * Other Routines
+ *
+ * cursor(x,y) position cursor at [x,y]
+ * cursors() position cursor at [1,24] (saves memory)
+ * cl_line(x,y) Clear line at [1,y] and leave cursor at [x,y]
+ * cl_up(x,y) Clear screen from [x,1] to current line
+ * cl_dn(x,y) clear screen from [1,y] to end of display
+ * lstandout(str) print the string in standout mode
+ * set_score_output() called when output should be literally printed
+ * xputchar(ch) print one character in decoded output buffer
+ * flush_buf() flush buffer with decoded output
+ * init_term() terminal initialization -- setup termcap info
+ * char *tmcapcnv(sd,ss) iroutine to convert VT100 \33's to termcap format
+ * lbeep() Routine to emit a beep if enabled (see no-beep in .larnopts)
+ *
* Note: ** entries are available only in termcap mode.
*/
+#ifndef lint
+static char rcsid[] = "$OpenBSD: io.c,v 1.4 1998/09/15 05:12:32 pjanzen Exp $";
+#endif /* not lint */
+
#include "header.h"
+#include "extern.h"
#include <string.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <term.h>
+#include <fcntl.h>
+#include <errno.h>
-#ifdef SYSV /* system III or system V */
+#ifdef TERMIO
#include <termio.h>
#define sgttyb termio
#define stty(_a,_b) ioctl(_a,TCSETA,_b)
#define gtty(_a,_b) ioctl(_a,TCGETA,_b)
-static int rawflg = 0;
-static char saveeof,saveeol;
-#define doraw(_a) if(!rawflg){++rawflg;saveeof=_a.c_cc[VMIN];saveeol=_a.c_cc[VTIME];}\
- _a.c_cc[VMIN]=1;_a.c_cc[VTIME]=1;_a.c_lflag &= ~(ICANON|ECHO|ECHOE|ECHOK|ECHONL)
-#define unraw(_a) _a.c_cc[VMIN]=saveeof;_a.c_cc[VTIME]=saveeol;_a.c_lflag |= ICANON|ECHO|ECHOE|ECHOK|ECHONL
+#endif
+#ifdef TERMIOS
+#include <termios.h>
+#define sgttyb termios
+#define stty(_a,_b) tcsetattr(_a,TCSADRAIN,_b)
+#define gtty(_a,_b) tcgetattr(_a,_b)
+#endif
-#else not SYSV
+#if defined(TERMIO) || defined(TERMIOS)
+static int rawflg = 0;
+static char saveeof, saveeol;
+#define doraw(_a) \
+ if(!rawflg) { \
+ ++rawflg; \
+ saveeof = _a.c_cc[VMIN]; \
+ saveeol = _a.c_cc[VTIME]; \
+ } \
+ _a.c_cc[VMIN] = 1; \
+ _a.c_cc[VTIME] = 1; \
+ _a.c_lflag &= ~(ICANON|ECHO|ECHOE|ECHOK|ECHONL)
+#define unraw(_a) \
+ _a.c_cc[VMIN] = saveeof; \
+ _a.c_cc[VTIME] = saveeol; \
+ _a.c_lflag |= ICANON|ECHO|ECHOE|ECHOK|ECHONL
+
+#else /* not TERMIO or TERMIOS */
#ifndef BSD
#define CBREAK RAW /* V7 has no CBREAK */
@@ -82,89 +112,110 @@ static char saveeof,saveeol;
#define doraw(_a) (_a.sg_flags |= CBREAK,_a.sg_flags &= ~ECHO)
#define unraw(_a) (_a.sg_flags &= ~CBREAK,_a.sg_flags |= ECHO)
#include <sgtty.h>
-#endif not SYSV
+#endif /* not TERMIO or TERMIOS */
#ifndef NOVARARGS /* if we have varargs */
+#ifdef __STDC__
+#include <stdarg.h>
+#else
#include <varargs.h>
-#else NOVARARGS /* if we don't have varargs */
-typedef char *va_list;
+#endif
+#else /* NOVARARGS */ /* if we don't have varargs */
+typedef char *va_list;
#define va_dcl int va_alist;
#define va_start(plist) plist = (char *) &va_alist
#define va_end(plist)
#define va_arg(plist,mode) ((mode *)(plist += sizeof(mode)))[-1]
-#endif NOVARARGS
+#endif /* NOVARARGS */
-#define LINBUFSIZE 128 /* size of the lgetw() and lgetl() buffer */
-int lfd; /* output file numbers */
-int fd; /* input file numbers */
-static struct sgttyb ttx; /* storage for the tty modes */
-static int ipoint=MAXIBUF,iepoint=MAXIBUF; /* input buffering pointers */
-static char lgetwbuf[LINBUFSIZE]; /* get line (word) buffer */
+#define LINBUFSIZE 128 /* size of the lgetw() and lgetl() buffer */
+int lfd; /* output file numbers */
+int fd; /* input file numbers */
+static struct sgttyb ttx;/* storage for the tty modes */
+static int ipoint = MAXIBUF, iepoint = MAXIBUF; /* input buffering
+ * pointers */
+static char lgetwbuf[LINBUFSIZE]; /* get line (word) buffer */
/*
- * setupvt100() Subroutine to set up terminal in correct mode for game
+ * setupvt100() Subroutine to set up terminal in correct mode for game
*
- * Attributes off, clear screen, set scrolling region, set tty mode
+ * Attributes off, clear screen, set scrolling region, set tty mode
*/
+void
setupvt100()
- {
- clear(); setscroll(); scbr(); /* system("stty cbreak -echo"); */
- }
+{
+ clear();
+ setscroll();
+ scbr(); /* system("stty cbreak -echo"); */
+}
/*
- * clearvt100() Subroutine to clean up terminal when the game is over
+ * clearvt100() Subroutine to clean up terminal when the game is over
*
- * Attributes off, clear screen, unset scrolling region, restore tty mode
+ * Attributes off, clear screen, unset scrolling region, restore tty mode
*/
+void
clearvt100()
- {
- resetscroll(); clear(); sncbr(); /* system("stty -cbreak echo"); */
- }
+{
+ resetscroll();
+ clear();
+ sncbr(); /* system("stty -cbreak echo"); */
+}
/*
- * getchar() Routine to read in one character from the terminal
+ * lgetchar() Routine to read in one character from the terminal
*/
-getchar()
- {
- char byt;
+int
+lgetchar()
+{
+ char byt;
#ifdef EXTRA
c[BYTESIN]++;
#endif
lflush(); /* be sure output buffer is flushed */
- read(0,&byt,1); /* get byte from terminal */
- return(byt);
- }
+ read(0, &byt, 1); /* get byte from terminal */
+ return (byt);
+}
/*
* scbr() Function to set cbreak -echo for the terminal
*
* like: system("stty cbreak -echo")
*/
+void
scbr()
- {
- gtty(0,&ttx); doraw(ttx); stty(0,&ttx);
- }
+{
+ gtty(0, &ttx);
+ doraw(ttx);
+ stty(0, &ttx);
+}
/*
* sncbr() Function to set -cbreak echo for the terminal
*
* like: system("stty -cbreak echo")
*/
+void
sncbr()
- {
- gtty(0,&ttx); unraw(ttx); stty(0,&ttx);
- }
+{
+ gtty(0, &ttx);
+ unraw(ttx);
+ stty(0, &ttx);
+}
/*
- * newgame() Subroutine to save the initial time and seed rnd()
+ * newgame() Subroutine to save the initial time and seed rnd()
*/
+void
newgame()
- {
- register long *p,*pe;
- for (p=c,pe=c+100; p<pe; *p++ =0);
- time(&initialtime); srand(initialtime);
- lcreat((char*)0); /* open buffering for output to terminal */
- }
+{
+ long *p, *pe;
+
+ for (p = c, pe = c + 100; p < pe; *p++ = 0);
+ time(&initialtime);
+ srand(initialtime);
+ lcreat((char *) 0); /* open buffering for output to terminal */
+}
/*
* lprintf(format,args . . .) printf to the output buffer
@@ -175,76 +226,119 @@ newgame()
* and any needed arguments following it
* Note: lprintf() only supports %s, %c and %d, with width modifier and left
* or right justification.
- * No correct checking for output buffer overflow is done, but flushes
+ * No correct checking for output buffer overflow is done, but flushes
* are done beforehand if needed.
* Returns nothing of value.
*/
#ifdef lint
-/*VARARGS*/
+/* VARARGS */
lprintf(str)
- char *str;
- {
- char *str2;
+ char *str;
+{
+ char *str2;
str2 = str;
- str = str2; /* to make lint happy */
- }
-/*VARARGS*/
+ str = str2; /* to make lint happy */
+}
+/* VARARGS */
sprintf(str)
- char *str;
- {
- char *str2;
+ char *str;
+{
+ char *str2;
str2 = str;
- str = str2; /* to make lint happy */
- }
-#else lint
-/*VARARGS*/
+ str = str2; /* to make lint happy */
+}
+#else /* lint */
+/* VARARGS */
+#ifdef __STDC__
+void lprintf(const char *fmt, ...)
+#else
+void
lprintf(va_alist)
va_dcl
- {
- va_list ap; /* pointer for variable argument list */
- register char *fmt;
- register char *outb,*tmpb;
- register long wide,left,cont,n; /* data for lprintf */
- char db[12]; /* %d buffer in lprintf */
-
- va_start(ap); /* initialize the var args pointer */
+#endif
+{
+ va_list ap; /* pointer for variable argument list */
+ char *outb, *tmpb;
+ long wide, left, cont, n; /* data for lprintf */
+ char db[12]; /* %d buffer in lprintf */
+#ifndef __STDC__
+ char *fmt;
+
+ va_start(ap); /* initialize the var args pointer */
fmt = va_arg(ap, char *); /* pointer to format string */
- if (lpnt >= lpend) lflush();
+#else
+ va_start(ap, fmt);
+#endif
+ if (lpnt >= lpend)
+ lflush();
outb = lpnt;
- for ( ; ; )
- {
+ for (;;) {
while (*fmt != '%')
- if (*fmt) *outb++ = *fmt++; else { lpnt=outb; return; }
- wide = 0; left = 1; cont=1;
+ if (*fmt)
+ *outb++ = *fmt++;
+ else {
+ lpnt = outb;
+ return;
+ }
+ wide = 0;
+ left = 1;
+ cont = 1;
while (cont)
- switch(*(++fmt))
- {
- case 'd': n = va_arg(ap, long);
- if (n<0) { n = -n; *outb++ = '-'; if (wide) --wide; }
- tmpb = db+11; *tmpb = (char)(n % 10 + '0');
- while (n>9) *(--tmpb) = (char)((n /= 10) % 10 + '0');
- if (wide==0) while (tmpb < db+12) *outb++ = *tmpb++;
- else
- {
- wide -= db-tmpb+12;
- if (left) while (wide-- > 0) *outb++ = ' ';
- while (tmpb < db+12) *outb++ = *tmpb++;
- if (left==0) while (wide-- > 0) *outb++ = ' ';
- }
- cont=0; break;
-
- case 's': tmpb = va_arg(ap, char *);
- if (wide==0) { while (*outb++ = *tmpb++); --outb; }
- else
- {
- n = wide - strlen(tmpb);
- if (left) while (n-- > 0) *outb++ = ' ';
- while (*outb++ = *tmpb++); --outb;
- if (left==0) while (n-- > 0) *outb++ = ' ';
- }
- cont=0; break;
-
- case 'c': *outb++ = va_arg(ap, int); cont=0; break;
+ switch (*(++fmt)) {
+ case 'd':
+ n = va_arg(ap, long);
+ if (n < 0) {
+ n = -n;
+ *outb++ = '-';
+ if (wide)
+ --wide;
+ }
+ tmpb = db + 11;
+ *tmpb = (char) (n % 10 + '0');
+ while (n > 9)
+ *(--tmpb) = (char) ((n /= 10) % 10 + '0');
+ if (wide == 0)
+ while (tmpb < db + 12)
+ *outb++ = *tmpb++;
+ else {
+ wide -= db - tmpb + 12;
+ if (left)
+ while (wide-- > 0)
+ *outb++ = ' ';
+ while (tmpb < db + 12)
+ *outb++ = *tmpb++;
+ if (left == 0)
+ while (wide-- > 0)
+ *outb++ = ' ';
+ }
+ cont = 0;
+ break;
+
+ case 's':
+ tmpb = va_arg(ap, char *);
+ if (wide == 0) {
+ while ((*outb++ = *tmpb++) != '\0')
+ continue;
+ --outb;
+ } else {
+ n = wide - strlen(tmpb);
+ if (left)
+ while (n-- > 0)
+ *outb++ = ' ';
+ while ((*outb++ = *tmpb++) != '\0')
+ continue;
+ --outb;
+ if (left == 0)
+ while (n-- > 0)
+ *outb++ = ' ';
+ }
+ cont = 0;
+ break;
+
+ case 'c':
+ *outb++ = va_arg(ap, int);
+ cont = 0;
+ break;
case '0':
case '1':
@@ -255,194 +349,237 @@ va_dcl
case '6':
case '7':
case '8':
- case '9': wide = 10*wide + *fmt - '0'; break;
-
- case '-': left = 0; break;
-
- default: *outb++ = *fmt; cont=0; break;
+ case '9':
+ wide = 10 * wide + *fmt - '0';
+ break;
+
+ case '-':
+ left = 0;
+ break;
+
+ default:
+ *outb++ = *fmt;
+ cont = 0;
+ break;
};
fmt++;
- }
- va_end(ap);
}
-#endif lint
+ va_end(ap);
+}
+#endif /* lint */
/*
- * lprint(long-integer) send binary integer to output buffer
+ * lprint(long-integer) send binary integer to output buffer
* long integer;
*
* +---------+---------+---------+---------+
- * | high | | | low |
- * | order | | | order |
- * | byte | | | byte |
+ * | high | | | low |
+ * | order | | | order |
+ * | byte | | | byte |
* +---------+---------+---------+---------+
- * 31 --- 24 23 --- 16 15 --- 8 7 --- 0
+ * 31 --- 24 23 --- 16 15 --- 8 7 --- 0
*
* The save order is low order first, to high order (4 bytes total)
- * and is written to be system independent.
+ * and is written to be system independent.
* No checking for output buffer overflow is done, but flushes if needed!
* Returns nothing of value.
*/
+void
lprint(x)
- register long x;
- {
- if (lpnt >= lpend) lflush();
- *lpnt++ = 255 & x; *lpnt++ = 255 & (x>>8);
- *lpnt++ = 255 & (x>>16); *lpnt++ = 255 & (x>>24);
- }
+ long x;
+{
+ if (lpnt >= lpend)
+ lflush();
+ *lpnt++ = 255 & x;
+ *lpnt++ = 255 & (x >> 8);
+ *lpnt++ = 255 & (x >> 16);
+ *lpnt++ = 255 & (x >> 24);
+}
/*
- * lwrite(buf,len) write a buffer to the output buffer
+ * lwrite(buf,len) write a buffer to the output buffer
* char *buf;
* int len;
- *
+ *
* Enter with the address and number of bytes to write out
* Returns nothing of value
*/
-lwrite(buf,len)
- register char *buf;
- int len;
- {
- register char *str;
- register int num2;
- if (len > 399) /* don't copy data if can just write it */
- {
+void
+lwrite(buf, len)
+ char *buf;
+ int len;
+{
+ char *str;
+ int num2;
+ if (len > 399) { /* don't copy data if can just write it */
#ifdef EXTRA
c[BYTESOUT] += len;
#endif
#ifndef VT100
- for (str=buf; len>0; --len)
+ for (str = buf; len > 0; --len)
lprc(*str++);
-#else VT100
+#else /* VT100 */
lflush();
- write(lfd,buf,len);
-#endif VT100
- }
- else while (len)
- {
- if (lpnt >= lpend) lflush(); /* if buffer is full flush it */
- num2 = lpbuf+BUFBIG-lpnt; /* # bytes left in output buffer */
- if (num2 > len) num2=len;
- str = lpnt; len -= num2;
- while (num2--) *str++ = *buf++; /* copy in the bytes */
- lpnt = str;
+ write(lfd, buf, len);
+#endif /* VT100 */
+ } else
+ while (len) {
+ if (lpnt >= lpend)
+ lflush(); /* if buffer is full flush it */
+ num2 = lpbuf + BUFBIG - lpnt; /* # bytes left in
+ * output buffer */
+ if (num2 > len)
+ num2 = len;
+ str = lpnt;
+ len -= num2;
+ while (num2--)
+ *str++ = *buf++; /* copy in the bytes */
+ lpnt = str;
}
- }
+}
/*
- * long lgetc() Read one character from input buffer
+ * long lgetc() Read one character from input buffer
*
- * Returns 0 if EOF, otherwise the character
- */
-long lgetc()
- {
- register int i;
- if (ipoint != iepoint) return(inbuffer[ipoint++]);
- if (iepoint!=MAXIBUF) return(0);
- if ((i=read(fd,inbuffer,MAXIBUF))<=0)
- {
- if (i!=0) write(1,"error reading from input file\n",30);
- iepoint = ipoint = 0; return(0);
+ * Returns 0 if EOF, otherwise the character
+ */
+long
+lgetc()
+{
+ int i;
+
+ if (ipoint != iepoint)
+ return (inbuffer[ipoint++]);
+ if (iepoint != MAXIBUF)
+ return (0);
+ if ((i = read(fd, inbuffer, MAXIBUF)) <= 0) {
+ if (i != 0)
+ write(1, "error reading from input file\n", 30);
+ iepoint = ipoint = 0;
+ return (0);
}
- ipoint=1; iepoint=i; return(*inbuffer);
- }
+ ipoint = 1;
+ iepoint = i;
+ return (*inbuffer);
+}
/*
- * long lrint() Read one integer from input buffer
+ * long lrint() Read one integer from input buffer
*
* +---------+---------+---------+---------+
- * | high | | | low |
- * | order | | | order |
- * | byte | | | byte |
+ * | high | | | low |
+ * | order | | | order |
+ * | byte | | | byte |
* +---------+---------+---------+---------+
- * 31 --- 24 23 --- 16 15 --- 8 7 --- 0
+ * 31 --- 24 23 --- 16 15 --- 8 7 --- 0
*
* The save order is low order first, to high order (4 bytes total)
* Returns the int read
*/
-long lrint()
- {
- register unsigned long i;
- i = 255 & lgetc(); i |= (255 & lgetc()) << 8;
- i |= (255 & lgetc()) << 16; i |= (255 & lgetc()) << 24;
- return(i);
- }
+long
+lrint()
+{
+ unsigned long i;
+
+ i = 255 & lgetc();
+ i |= (255 & lgetc()) << 8;
+ i |= (255 & lgetc()) << 16;
+ i |= (255 & lgetc()) << 24;
+ return (i);
+}
/*
- * lrfill(address,number) put input bytes into a buffer
+ * lrfill(address,number) put input bytes into a buffer
* char *address;
* int number;
*
* Reads "number" bytes into the buffer pointed to by "address".
* Returns nothing of value
*/
-lrfill(adr,num)
- register char *adr;
- int num;
- {
- register char *pnt;
- register int num2;
- while (num)
- {
- if (iepoint == ipoint)
- {
- if (num>5) /* fast way */
- {
- if (read(fd,adr,num) != num)
- write(2,"error reading from input file\n",30);
- num=0;
- }
- else { *adr++ = lgetc(); --num; }
- }
- else
- {
- num2 = iepoint-ipoint; /* # of bytes left in the buffer */
- if (num2 > num) num2=num;
- pnt = inbuffer+ipoint; num -= num2; ipoint += num2;
- while (num2--) *adr++ = *pnt++;
+void
+lrfill(adr, num)
+ char *adr;
+ int num;
+{
+ char *pnt;
+ int num2;
+
+ while (num) {
+ if (iepoint == ipoint) {
+ if (num > 5) { /* fast way */
+ if (read(fd, adr, num) != num)
+ write(2, "error reading from input file\n", 30);
+ num = 0;
+ } else {
+ *adr++ = lgetc();
+ --num;
}
+ } else {
+ num2 = iepoint - ipoint; /* # of bytes left in
+ * the buffer */
+ if (num2 > num)
+ num2 = num;
+ pnt = inbuffer + ipoint;
+ num -= num2;
+ ipoint += num2;
+ while (num2--)
+ *adr++ = *pnt++;
}
}
+}
/*
* char *lgetw() Get a whitespace ended word from input
*
* Returns pointer to a buffer that contains word. If EOF, returns a NULL
*/
-char *lgetw()
- {
- register char *lgp,cc;
- register int n=LINBUFSIZE,quote=0;
+char *
+lgetw()
+{
+ char *lgp, cc;
+ int n = LINBUFSIZE, quote = 0;
+
lgp = lgetwbuf;
- do cc=lgetc(); while ((cc <= 32) && (cc > NULL)); /* eat whitespace */
- for ( ; ; --n,cc=lgetc())
- {
- if ((cc==NULL) && (lgp==lgetwbuf)) return(NULL); /* EOF */
- if ((n<=1) || ((cc<=32) && (quote==0))) { *lgp=NULL; return(lgetwbuf); }
- if (cc != '"') *lgp++ = cc; else quote ^= 1;
+ do
+ cc = lgetc();
+ while ((cc <= 32) && (cc > '\0')); /* eat whitespace */
+ for (;; --n, cc = lgetc()) {
+ if ((cc == '\0') && (lgp == lgetwbuf))
+ return (NULL); /* EOF */
+ if ((n <= 1) || ((cc <= 32) && (quote == 0))) {
+ *lgp = '\0';
+ return (lgetwbuf);
}
+ if (cc != '"')
+ *lgp++ = cc;
+ else
+ quote ^= 1;
}
+}
/*
- * char *lgetl() Function to read in a line ended by newline or EOF
+ * char *lgetl() Function to read in a line ended by newline or EOF
*
- * Returns pointer to a buffer that contains the line. If EOF, returns NULL
- */
-char *lgetl()
- {
- register int i=LINBUFSIZE,ch;
- register char *str=lgetwbuf;
- for ( ; ; --i)
- {
- if ((*str++ = ch = lgetc()) == NULL)
- {
- if (str == lgetwbuf+1) return(NULL); /* EOF */
- ot: *str = NULL; return(lgetwbuf); /* line ended by EOF */
- }
- if ((ch=='\n') || (i<=1)) goto ot; /* line ended by \n */
+ * Returns pointer to a buffer that contains the line. If EOF, returns NULL
+ */
+char *
+lgetl()
+{
+ int i = LINBUFSIZE, ch;
+ char *str = lgetwbuf;
+
+ for (;; --i) {
+ if ((*str++ = ch = lgetc()) == '\0') {
+ if (str == lgetwbuf + 1)
+ return (NULL); /* EOF */
+ ot: *str = '\0';
+ return (lgetwbuf); /* line ended by EOF */
}
+ if ((ch == '\n') || (i <= 1))
+ goto ot;/* line ended by \n */
}
+}
/*
* lcreat(filename) Create a new file for write
@@ -451,19 +588,23 @@ char *lgetl()
* lcreat((char*)0); means to the terminal
* Returns -1 if error, otherwise the file descriptor opened.
*/
+int
lcreat(str)
char *str;
- {
- extern int errno;
- lpnt = lpbuf; lpend = lpbuf+BUFBIG;
- if (str==NULL) return(lfd=1);
- if ((lfd=creat(str,0644)) < 0)
- {
- lfd=1; lprintf("error (%s) creating file <%s>\n",
- strerror(errno), str); lflush(); return(-1);
- }
- return(lfd);
+{
+ lpnt = lpbuf;
+ lpend = lpbuf + BUFBIG;
+ if (str == NULL)
+ return (lfd = 1);
+ if ((lfd = creat(str, 0644)) < 0) {
+ lfd = 1;
+ lprintf("error creating file <%s>: %s\n", str,
+ strerror(errno));
+ lflush();
+ return (-1);
}
+ return (lfd);
+}
/*
* lopen(filename) Open a file for read
@@ -472,17 +613,21 @@ lcreat(str)
* lopen(0) means from the terminal
* Returns -1 if error, otherwise the file descriptor opened.
*/
+int
lopen(str)
- char *str;
- {
+ char *str;
+{
ipoint = iepoint = MAXIBUF;
- if (str==NULL) return(fd=0);
- if ((fd=open(str,0)) < 0)
- {
- lwclose(); lfd=1; lpnt=lpbuf; return(-1);
- }
- return(fd);
+ if (str == NULL)
+ return (fd = 0);
+ if ((fd = open(str, 0)) < 0) {
+ lwclose();
+ lfd = 1;
+ lpnt = lpbuf;
+ return (-1);
}
+ return (fd);
+}
/*
* lappend(filename) Open for append to an existing file
@@ -491,107 +636,131 @@ lopen(str)
* lappend(0) means to the terminal
* Returns -1 if error, otherwise the file descriptor opened.
*/
+int
lappend(str)
- char *str;
- {
- lpnt = lpbuf; lpend = lpbuf+BUFBIG;
- if (str==NULL) return(lfd=1);
- if ((lfd=open(str,2)) < 0)
- {
- lfd=1; return(-1);
- }
- lseek(lfd,0,2); /* seek to end of file */
- return(lfd);
+ char *str;
+{
+ lpnt = lpbuf;
+ lpend = lpbuf + BUFBIG;
+ if (str == NULL)
+ return (lfd = 1);
+ if ((lfd = open(str, 2)) < 0) {
+ lfd = 1;
+ return (-1);
}
+ lseek(lfd, 0, 2); /* seek to end of file */
+ return (lfd);
+}
/*
- * lrclose() close the input file
+ * lrclose() close the input file
*
* Returns nothing of value.
*/
+void
lrclose()
- {
- if (fd > 0) close(fd);
- }
+{
+ if (fd > 0)
+ close(fd);
+}
/*
- * lwclose() close output file flushing if needed
+ * lwclose() close output file flushing if needed
*
* Returns nothing of value.
*/
+void
lwclose()
- {
- lflush(); if (lfd > 2) close(lfd);
- }
+{
+ lflush();
+ if (lfd > 2)
+ close(lfd);
+}
/*
- * lprcat(string) append a string to the output buffer
- * avoids calls to lprintf (time consuming)
+ * lprcat(string) append a string to the output buffer
+ * avoids calls to lprintf (time consuming)
*/
+void
lprcat(str)
- register char *str;
- {
- register char *str2;
- if (lpnt >= lpend) lflush();
+ char *str;
+{
+ char *str2;
+
+ if (lpnt >= lpend)
+ lflush();
str2 = lpnt;
- while (*str2++ = *str++);
+ while ((*str2++ = *str++) != '\0')
+ continue;
lpnt = str2 - 1;
- }
+}
#ifdef VT100
/*
- * cursor(x,y) Subroutine to set the cursor position
+ * cursor(x,y) Subroutine to set the cursor position
*
* x and y are the cursor coordinates, and lpbuff is the output buffer where
- * escape sequence will be placed.
- */
-static char *y_num[]= { "\33[","\33[","\33[2","\33[3","\33[4","\33[5","\33[6",
- "\33[7","\33[8","\33[9","\33[10","\33[11","\33[12","\33[13","\33[14",
- "\33[15","\33[16","\33[17","\33[18","\33[19","\33[20","\33[21","\33[22",
- "\33[23","\33[24" };
-
-static char *x_num[]= { "H","H",";2H",";3H",";4H",";5H",";6H",";7H",";8H",";9H",
- ";10H",";11H",";12H",";13H",";14H",";15H",";16H",";17H",";18H",";19H",
- ";20H",";21H",";22H",";23H",";24H",";25H",";26H",";27H",";28H",";29H",
- ";30H",";31H",";32H",";33H",";34H",";35H",";36H",";37H",";38H",";39H",
- ";40H",";41H",";42H",";43H",";44H",";45H",";46H",";47H",";48H",";49H",
- ";50H",";51H",";52H",";53H",";54H",";55H",";56H",";57H",";58H",";59H",
- ";60H",";61H",";62H",";63H",";64H",";65H",";66H",";67H",";68H",";69H",
- ";70H",";71H",";72H",";73H",";74H",";75H",";76H",";77H",";78H",";79H",
- ";80H" };
-
-cursor(x,y)
- int x,y;
- {
- register char *p;
- if (lpnt >= lpend) lflush();
-
- p = y_num[y]; /* get the string to print */
- while (*p) *lpnt++ = *p++; /* print the string */
-
- p = x_num[x]; /* get the string to print */
- while (*p) *lpnt++ = *p++; /* print the string */
- }
-#else VT100
+ * escape sequence will be placed.
+ */
+static char *y_num[] = {
+"\33[", "\33[", "\33[2", "\33[3", "\33[4", "\33[5", "\33[6",
+"\33[7", "\33[8", "\33[9", "\33[10", "\33[11", "\33[12", "\33[13", "\33[14",
+"\33[15", "\33[16", "\33[17", "\33[18", "\33[19", "\33[20", "\33[21", "\33[22",
+"\33[23", "\33[24"};
+
+static char *x_num[] = {
+"H", "H", ";2H", ";3H", ";4H", ";5H", ";6H", ";7H", ";8H", ";9H",
+";10H", ";11H", ";12H", ";13H", ";14H", ";15H", ";16H", ";17H", ";18H", ";19H",
+";20H", ";21H", ";22H", ";23H", ";24H", ";25H", ";26H", ";27H", ";28H", ";29H",
+";30H", ";31H", ";32H", ";33H", ";34H", ";35H", ";36H", ";37H", ";38H", ";39H",
+";40H", ";41H", ";42H", ";43H", ";44H", ";45H", ";46H", ";47H", ";48H", ";49H",
+";50H", ";51H", ";52H", ";53H", ";54H", ";55H", ";56H", ";57H", ";58H", ";59H",
+";60H", ";61H", ";62H", ";63H", ";64H", ";65H", ";66H", ";67H", ";68H", ";69H",
+";70H", ";71H", ";72H", ";73H", ";74H", ";75H", ";76H", ";77H", ";78H", ";79H",
+";80H"};
+
+void
+cursor(x, y)
+ int x, y;
+{
+ char *p;
+
+ if (lpnt >= lpend)
+ lflush();
+
+ p = y_num[y]; /* get the string to print */
+ while (*p)
+ *lpnt++ = *p++; /* print the string */
+
+ p = x_num[x]; /* get the string to print */
+ while (*p)
+ *lpnt++ = *p++; /* print the string */
+}
+#else /* VT100 */
/*
* cursor(x,y) Put cursor at specified coordinates staring at [1,1] (termcap)
*/
-cursor (x,y)
- int x,y;
- {
- if (lpnt >= lpend) lflush ();
+void
+cursor(x, y)
+ int x, y;
+{
+ if (lpnt >= lpend)
+ lflush();
- *lpnt++ = CURSOR; *lpnt++ = x; *lpnt++ = y;
- }
-#endif VT100
+ *lpnt++ = CURSOR;
+ *lpnt++ = x;
+ *lpnt++ = y;
+}
+#endif /* VT100 */
/*
* Routine to position cursor at beginning of 24th line
*/
+void
cursors()
- {
- cursor(1,24);
- }
+{
+ cursor(1, 24);
+}
#ifndef VT100
/*
@@ -601,322 +770,374 @@ cursors()
* obvious meanings.
*/
-static char cap[256];
-char *CM, *CE, *CD, *CL, *SO, *SE, *AL, *DL;/* Termcap capabilities */
-static char *outbuf=0; /* translated output buffer */
-
-int putchar ();
+static char cap[256];
+char *CM, *CE, *CD, *CL, *SO, *SE, *AL, *DL; /* Termcap capabilities */
+static char *outbuf = 0; /* translated output buffer */
/*
* init_term() Terminal initialization -- setup termcap info
*/
+void
init_term()
- {
- char termbuf[1024];
- char *capptr = cap+10;
- char *term;
-
- switch (tgetent(termbuf, term = getenv("TERM")))
- {
- case -1:
- write(2, "Cannot open termcap file.\n", 26); exit();
- case 0:
- write(2, "Cannot find entry of ", 21);
- write(2, term, strlen (term));
- write(2, " in termcap\n", 12);
- exit();
- };
-
- CM = tgetstr("cm", &capptr); /* Cursor motion */
- CE = tgetstr("ce", &capptr); /* Clear to eoln */
- CL = tgetstr("cl", &capptr); /* Clear screen */
-
-/* OPTIONAL */
- AL = tgetstr("al", &capptr); /* Insert line */
- DL = tgetstr("dl", &capptr); /* Delete line */
- SO = tgetstr("so", &capptr); /* Begin standout mode */
- SE = tgetstr("se", &capptr); /* End standout mode */
- CD = tgetstr("cd", &capptr); /* Clear to end of display */
-
- if (!CM) /* can't find cursor motion entry */
- {
- write(2, "Sorry, for a ",13); write(2, term, strlen(term));
- write(2, ", I can't find the cursor motion entry in termcap\n",50);
- exit();
- }
- if (!CE) /* can't find clear to end of line entry */
- {
- write(2, "Sorry, for a ",13); write(2, term, strlen(term));
- write(2,", I can't find the clear to end of line entry in termcap\n",57);
- exit();
- }
- if (!CL) /* can't find clear entire screen entry */
- {
- write(2, "Sorry, for a ",13); write(2, term, strlen(term));
- write(2, ", I can't find the clear entire screen entry in termcap\n",56);
- exit();
- }
- if ((outbuf=malloc(BUFBIG+16))==0) /* get memory for decoded output buffer*/
- {
- write(2,"Error malloc'ing memory for decoded output buffer\n",50);
+{
+ char termbuf[1024];
+ char *capptr = cap + 10;
+ char *term;
+
+ switch (tgetent(termbuf, term = getenv("TERM"))) {
+ case -1:
+ write(2, "Cannot open termcap file.\n", 26);
+ exit(1);
+ case 0:
+ write(2, "Cannot find entry of ", 21);
+ write(2, term, strlen(term));
+ write(2, " in termcap\n", 12);
+ exit(1);
+ };
+
+ CM = tgetstr("cm", &capptr); /* Cursor motion */
+ CE = tgetstr("ce", &capptr); /* Clear to eoln */
+ CL = tgetstr("cl", &capptr); /* Clear screen */
+
+ /* OPTIONAL */
+ AL = tgetstr("al", &capptr); /* Insert line */
+ DL = tgetstr("dl", &capptr); /* Delete line */
+ SO = tgetstr("so", &capptr); /* Begin standout mode */
+ SE = tgetstr("se", &capptr); /* End standout mode */
+ CD = tgetstr("cd", &capptr); /* Clear to end of display */
+
+ if (!CM) { /* can't find cursor motion entry */
+ write(2, "Sorry, for a ", 13);
+ write(2, term, strlen(term));
+ write(2, ", I can't find the cursor motion entry in termcap\n", 50);
+ exit(1);
+ }
+ if (!CE) { /* can't find clear to end of line entry */
+ write(2, "Sorry, for a ", 13);
+ write(2, term, strlen(term));
+ write(2, ", I can't find the clear to end of line entry in termcap\n", 57);
+ exit(1);
+ }
+ if (!CL) { /* can't find clear entire screen entry */
+ write(2, "Sorry, for a ", 13);
+ write(2, term, strlen(term));
+ write(2, ", I can't find the clear entire screen entry in termcap\n", 56);
+ exit(1);
+ }
+ if ((outbuf = malloc(BUFBIG + 16)) == 0) { /* get memory for
+ * decoded output buffer */
+ write(2, "Error malloc'ing memory for decoded output buffer\n", 50);
died(-285); /* malloc() failure */
- }
}
-#endif VT100
+}
+#endif /* VT100 */
/*
* cl_line(x,y) Clear the whole line indicated by 'y' and leave cursor at [x,y]
*/
-cl_line(x,y)
- int x,y;
- {
+void
+cl_line(x, y)
+ int x, y;
+{
#ifdef VT100
- cursor(x,y); lprcat("\33[2K");
-#else VT100
- cursor(1,y); *lpnt++ = CL_LINE; cursor(x,y);
-#endif VT100
- }
+ cursor(x, y);
+ lprcat("\33[2K");
+#else /* VT100 */
+ cursor(1, y);
+ *lpnt++ = CL_LINE;
+ cursor(x, y);
+#endif /* VT100 */
+}
/*
* cl_up(x,y) Clear screen from [x,1] to current position. Leave cursor at [x,y]
*/
-cl_up(x,y)
- register int x,y;
- {
+void
+cl_up(x, y)
+ int x, y;
+{
#ifdef VT100
- cursor(x,y); lprcat("\33[1J\33[2K");
-#else VT100
- register int i;
- cursor(1,1);
- for (i=1; i<=y; i++) { *lpnt++ = CL_LINE; *lpnt++ = '\n'; }
- cursor(x,y);
-#endif VT100
+ cursor(x, y);
+ lprcat("\33[1J\33[2K");
+#else /* VT100 */
+ int i;
+ cursor(1, 1);
+ for (i = 1; i <= y; i++) {
+ *lpnt++ = CL_LINE;
+ *lpnt++ = '\n';
}
+ cursor(x, y);
+#endif /* VT100 */
+}
/*
- * cl_dn(x,y) Clear screen from [1,y] to end of display. Leave cursor at [x,y]
+ * cl_dn(x,y) Clear screen from [1,y] to end of display. Leave cursor at [x,y]
*/
-cl_dn(x,y)
- register int x,y;
- {
+void
+cl_dn(x, y)
+ int x, y;
+{
#ifdef VT100
- cursor(x,y); lprcat("\33[J\33[2K");
-#else VT100
- register int i;
- cursor(1,y);
- if (!CD)
- {
+ cursor(x, y);
+ lprcat("\33[J\33[2K");
+#else /* VT100 */
+ int i;
+ cursor(1, y);
+ if (!CD) {
*lpnt++ = CL_LINE;
- for (i=y; i<=24; i++) { *lpnt++ = CL_LINE; if (i!=24) *lpnt++ = '\n'; }
- cursor(x,y);
+ for (i = y; i <= 24; i++) {
+ *lpnt++ = CL_LINE;
+ if (i != 24)
+ *lpnt++ = '\n';
}
- else
+ cursor(x, y);
+ } else
*lpnt++ = CL_DOWN;
- cursor(x,y);
-#endif VT100
- }
+ cursor(x, y);
+#endif /* VT100 */
+}
/*
- * standout(str) Print the argument string in inverse video (standout mode).
+ * lstandout(str) Print the argument string in inverse video (standout mode).
*/
-standout(str)
- register char *str;
- {
+void
+lstandout(str)
+ char *str;
+{
#ifdef VT100
setbold();
while (*str)
*lpnt++ = *str++;
resetbold();
-#else VT100
+#else /* VT100 */
*lpnt++ = ST_START;
while (*str)
*lpnt++ = *str++;
*lpnt++ = ST_END;
-#endif VT100
- }
+#endif /* VT100 */
+}
/*
- * set_score_output() Called when output should be literally printed.
+ * set_score_output() Called when output should be literally printed.
*/
+void
set_score_output()
- {
+{
enable_scroll = -1;
- }
+}
/*
- * lflush() Flush the output buffer
+ * lflush() Flush the output buffer
*
* Returns nothing of value.
* for termcap version: Flush output in output buffer according to output
- * status as indicated by `enable_scroll'
+ * status as indicated by `enable_scroll'
*/
#ifndef VT100
-static int scrline=18; /* line # for wraparound instead of scrolling if no DL */
-lflush ()
- {
- register int lpoint;
- register char *str;
- static int curx = 0;
- static int cury = 0;
-
- if ((lpoint = lpnt - lpbuf) > 0)
- {
+static int scrline = 18; /* line # for wraparound instead of scrolling
+ * if no DL */
+void
+lflush()
+{
+ int lpoint;
+ u_char *str;
+ static int curx = 0;
+ static int cury = 0;
+
+ if ((lpoint = lpnt - lpbuf) > 0) {
#ifdef EXTRA
c[BYTESOUT] += lpoint;
#endif
- if (enable_scroll <= -1)
- {
+ if (enable_scroll <= -1) {
flush_buf();
- if (write(lfd,lpbuf,lpoint) != lpoint)
- write(2,"error writing to output file\n",29);
+ if (write(lfd, lpbuf, lpoint) != lpoint)
+ write(2, "error writing to output file\n", 29);
lpnt = lpbuf; /* point back to beginning of buffer */
return;
- }
- for (str = lpbuf; str < lpnt; str++)
- {
- if (*str>=32) { putchar (*str); curx++; }
- else switch (*str)
- {
- case CLEAR: tputs (CL, 0, putchar); curx = cury = 0;
- break;
-
- case CL_LINE: tputs (CE, 0, putchar);
- break;
-
- case CL_DOWN: tputs (CD, 0, putchar);
- break;
-
- case ST_START: tputs (SO, 0, putchar);
- break;
-
- case ST_END: tputs (SE, 0, putchar);
- break;
-
- case CURSOR: curx = *++str - 1; cury = *++str - 1;
- tputs (tgoto (CM, curx, cury), 0, putchar);
- break;
-
- case '\n': if ((cury == 23) && enable_scroll)
- {
- if (!DL || !AL) /* wraparound or scroll? */
- {
- if (++scrline > 23) scrline=19;
-
- if (++scrline > 23) scrline=19;
- tputs (tgoto (CM, 0, scrline), 0, putchar);
- tputs (CE, 0, putchar);
-
- if (--scrline < 19) scrline=23;
- tputs (tgoto (CM, 0, scrline), 0, putchar);
- tputs (CE, 0, putchar);
- }
- else
- {
- tputs (tgoto (CM, 0, 19), 0, putchar);
- tputs (DL, 0, putchar);
- tputs (tgoto (CM, 0, 23), 0, putchar);
- /* tputs (AL, 0, putchar); */
- }
- }
- else
- {
- putchar ('\n'); cury++;
- }
- curx = 0;
- break;
-
- default: putchar (*str); curx++;
+ }
+ for (str = lpbuf; str < lpnt; str++) {
+ if (*str >= 32) {
+ xputchar(*str);
+ curx++;
+ } else
+ switch (*str) {
+ case CLEAR:
+ tputs(CL, 0, xputchar);
+ curx = cury = 0;
+ break;
+
+ case CL_LINE:
+ tputs(CE, 0, xputchar);
+ break;
+
+ case CL_DOWN:
+ tputs(CD, 0, xputchar);
+ break;
+
+ case ST_START:
+ tputs(SO, 0, xputchar);
+ break;
+
+ case ST_END:
+ tputs(SE, 0, xputchar);
+ break;
+
+ case CURSOR:
+ curx = *++str - 1;
+ cury = *++str - 1;
+ tputs(tgoto(CM, curx, cury), 0, xputchar);
+ break;
+
+ case '\n':
+ if ((cury == 23) && enable_scroll) {
+ if (!DL || !AL) { /* wraparound or scroll? */
+ if (++scrline > 23)
+ scrline = 19;
+
+ if (++scrline > 23)
+ scrline = 19;
+ tputs(tgoto(CM, 0, scrline), 0, xputchar);
+ tputs(CE, 0, xputchar);
+
+ if (--scrline < 19)
+ scrline = 23;
+ tputs(tgoto(CM, 0, scrline), 0, xputchar);
+ tputs(CE, 0, xputchar);
+ } else {
+ tputs(tgoto(CM, 0, 19), 0, xputchar);
+ tputs(DL, 0, xputchar);
+ tputs(tgoto(CM, 0, 23), 0, xputchar);
+ /*
+ * tputs (AL, 0,
+ * xputchar);
+ */
+ }
+ } else {
+ xputchar('\n');
+ cury++;
+ }
+ curx = 0;
+ break;
+
+ default:
+ xputchar(*str);
+ curx++;
};
- }
}
- lpnt = lpbuf;
- flush_buf(); /* flush real output buffer now */
}
-#else VT100
+ lpnt = lpbuf;
+ flush_buf(); /* flush real output buffer now */
+}
+#else /* VT100 */
/*
- * lflush() flush the output buffer
+ * lflush() flush the output buffer
*
* Returns nothing of value.
*/
+void
lflush()
- {
- register int lpoint;
- if ((lpoint = lpnt - lpbuf) > 0)
- {
+{
+ int lpoint;
+
+ if ((lpoint = lpnt - lpbuf) > 0) {
#ifdef EXTRA
c[BYTESOUT] += lpoint;
#endif
- if (write(lfd,lpbuf,lpoint) != lpoint)
- write(2,"error writing to output file\n",29);
+ if (write(lfd, lpbuf, lpoint) != lpoint)
+ write(2, "error writing to output file\n", 29);
}
- lpnt = lpbuf; /* point back to beginning of buffer */
- }
-#endif VT100
+ lpnt = lpbuf; /* point back to beginning of buffer */
+}
+#endif /* VT100 */
#ifndef VT100
-static int vindex=0;
+static int vindex = 0;
/*
- * putchar(ch) Print one character in decoded output buffer.
+ * xputchar(ch) Print one character in decoded output buffer.
*/
-int putchar(c)
-int c;
- {
+int
+xputchar(c)
+ int c;
+{
outbuf[vindex++] = c;
- if (vindex >= BUFBIG) flush_buf();
- }
+ if (vindex >= BUFBIG)
+ flush_buf();
+ return 0;
+}
/*
* flush_buf() Flush buffer with decoded output.
*/
+void
flush_buf()
- {
- if (vindex) write(lfd, outbuf, vindex);
+{
+ if (vindex)
+ write(lfd, outbuf, vindex);
vindex = 0;
- }
+}
/*
- * char *tmcapcnv(sd,ss) Routine to convert VT100 escapes to termcap format
- *
- * Processes only the \33[#m sequence (converts . files for termcap use
- */
-char *tmcapcnv(sd,ss)
- register char *sd,*ss;
- {
- register int tmstate=0; /* 0=normal, 1=\33 2=[ 3=# */
- char tmdigit=0; /* the # in \33[#m */
- while (*ss)
- {
- switch(tmstate)
- {
- case 0: if (*ss=='\33') { tmstate++; break; }
- ign: *sd++ = *ss;
- ign2: tmstate = 0;
- break;
- case 1: if (*ss!='[') goto ign;
- tmstate++;
- break;
- case 2: if (isdigit(*ss)) { tmdigit= *ss-'0'; tmstate++; break; }
- if (*ss == 'm') { *sd++ = ST_END; goto ign2; }
- goto ign;
- case 3: if (*ss == 'm')
- {
- if (tmdigit) *sd++ = ST_START;
- else *sd++ = ST_END;
- goto ign2;
- }
- default: goto ign;
- };
+ * char *tmcapcnv(sd,ss) Routine to convert VT100 escapes to termcap
+ * format
+ * Processes only the \33[#m sequence (converts . files for termcap use
+ */
+char *
+tmcapcnv(sd, ss)
+ char *sd, *ss;
+{
+ int tmstate = 0; /* 0=normal, 1=\33 2=[ 3=# */
+ char tmdigit = 0; /* the # in \33[#m */
+
+ while (*ss) {
+ switch (tmstate) {
+ case 0:
+ if (*ss == '\33') {
+ tmstate++;
+ break;
+ }
+ ign: *sd++ = *ss;
+ ign2: tmstate = 0;
+ break;
+ case 1:
+ if (*ss != '[')
+ goto ign;
+ tmstate++;
+ break;
+ case 2:
+ if (isdigit((u_char)*ss)) {
+ tmdigit = *ss - '0';
+ tmstate++;
+ break;
+ }
+ if (*ss == 'm') {
+ *sd++ = ST_END;
+ goto ign2;
+ }
+ goto ign;
+ case 3:
+ if (*ss == 'm') {
+ if (tmdigit)
+ *sd++ = ST_START;
+ else
+ *sd++ = ST_END;
+ goto ign2;
+ }
+ default:
+ goto ign;
+ };
ss++;
- }
- *sd=0; /* NULL terminator */
- return(sd);
}
-#endif VT100
+ *sd = 0; /* NULL terminator */
+ return (sd);
+}
+#endif /* VT100 */
/*
- * beep() Routine to emit a beep if enabled (see no-beep in .larnopts)
+ * lbeep() Routine to emit a beep if enabled (see no-beep in .larnopts)
*/
-beep()
- {
- if (!nobeep) *lpnt++ = '\7';
- }
+void
+lbeep()
+{
+ if (!nobeep)
+ *lpnt++ = '\7';
+}
diff --git a/games/larn/main.c b/games/larn/main.c
index be045307eae..53cd18e0156 100644
--- a/games/larn/main.c
+++ b/games/larn/main.c
@@ -1,26 +1,37 @@
+/* $OpenBSD: main.c,v 1.8 1998/09/15 05:12:32 pjanzen Exp $ */
+/* $NetBSD: main.c,v 1.12 1998/02/12 08:07:49 mikel Exp $ */
+
+/* main.c */
#ifndef lint
-static char rcsid[] = "$NetBSD: main.c,v 1.7.6.1 1996/05/27 15:54:26 mrg Exp $";
-#endif /* not lint */
+static char rcsid[] = "$OpenBSD: main.c,v 1.8 1998/09/15 05:12:32 pjanzen Exp $";
+#endif /* not lint */
-/* main.c */
#include <sys/types.h>
-#include "header.h"
#include <errno.h>
-#include <pwd.h>
#include <stdio.h>
+#include <pwd.h>
+#include <unistd.h>
+#include <stdlib.h>
#include <string.h>
-
-static char copyright[]="\nLarn is copyrighted 1986 by Noah Morgan.\n";
-int srcount=0; /* line counter for showstr() */
-int dropflag=0; /* if 1 then don't lookforobject() next round */
-int rmst=80; /* random monster creation counter */
-int userid; /* the players login user id number */
-uid_t uid, euid; /* used for security */
-char nowelcome=0,nomove=0; /* if (nomove) then don't count next iteration as a move */
-static char viewflag=0;
- /* if viewflag then we have done a 99 stay here and don't showcell in the main loop */
-char restorflag=0; /* 1 means restore has been done */
-static char cmdhelp[] = "\
+#include "header.h"
+#include "extern.h"
+
+static char copyright[] = "\nLarn is copyrighted 1986 by Noah Morgan.\n";
+int srcount = 0; /* line counter for showstr() */
+int dropflag = 0; /* if 1 then don't lookforobject() next round */
+int rmst = 80; /* random monster creation counter */
+int userid; /* the players login user id number */
+gid_t gid, egid; /* used for security */
+u_char nowelcome = 0, nomove = 0; /* if (nomove) then don't
+ * count next iteration as a
+ * move */
+static char viewflag = 0;
+/*
+ * if viewflag then we have done a 99 stay here and don't showcell in the
+ * main loop
+ */
+u_char restorflag = 0; /* 1 means restore has been done */
+static char cmdhelp[] = "\
Cmd line format: larn [-slicnh] [-o<optsfile>] [-##] [++]\n\
-s show the scoreboard\n\
-l show the logfile (wizard id only)\n\
@@ -33,870 +44,1307 @@ Cmd line format: larn [-slicnh] [-o<optsfile>] [-##] [++]\n\
-o<optsfile> specify .larnopts filename to be used instead of \"~/.larnopts\"\n\
";
#ifdef VT100
-static char *termtypes[] = { "vt100", "vt101", "vt102", "vt103", "vt125",
+static char *termtypes[] = {"vt100", "vt101", "vt102", "vt103", "vt125",
"vt131", "vt140", "vt180", "vt220", "vt240", "vt241", "vt320", "vt340",
- "vt341" };
-#endif VT100
-/*
- ************
- MAIN PROGRAM
- ************
- */
-main(argc,argv)
- int argc;
- char **argv;
- {
- register int i,j;
- int hard;
- char *ptr=0,*ttype;
- struct passwd *pwe;
-
- euid = geteuid();
- uid = getuid();
- seteuid(uid); /* give up "games" if we have it */
+"vt341"};
+#endif /* VT100 */
+
/*
- * first task is to identify the player
+ * ************
+ * MAIN PROGRAM
+ * ************
*/
+int
+main(argc, argv)
+ int argc;
+ char **argv;
+{
+ int i;
+ int hard;
+ const char *ptr = 0;
+ struct passwd *pwe;
+
+ egid = getegid();
+ gid = getgid();
+ setegid(gid); /* give up "games" if we have it */
+ /*
+ * first task is to identify the player
+ */
#ifndef VT100
- init_term(); /* setup the terminal (find out what type) for termcap */
-#endif VT100
- if (((ptr = getlogin()) == 0) || (*ptr==0)) /* try to get login name */
- if (pwe=getpwuid(getuid())) /* can we get it from /etc/passwd? */
- ptr = pwe->pw_name;
- else
- if ((ptr = getenv("LOGNAME")) == 0)
- if ((ptr = getenv("USER")) == 0)
- {
- noone: write(2, "Can't find your logname. Who Are You?\n",39);
- exit();
- }
- if (ptr==0) goto noone;
- if (strlen(ptr)==0) goto noone;
-/*
- * second task is to prepare the pathnames the player will need
- */
- strcpy(loginname,ptr); /* save loginname of the user for logging purposes */
- strcpy(logname,ptr); /* this will be overwritten with the players name */
- if ((ptr = getenv("HOME")) == 0) ptr = ".";
+ init_term(); /* setup the terminal (find out what type)
+ * for termcap */
+#endif /* VT100 */
+ /* try to get login name */
+ if (((ptr = getlogin()) == 0) || (*ptr == 0)) {
+ /* can we get it from /etc/passwd? */
+ if ((pwe = getpwuid(getuid())) != NULL)
+ ptr = pwe->pw_name;
+ else if ((ptr = getenv("LOGNAME")) == 0)
+ if ((ptr = getenv("USER")) == 0) {
+ noone: write(2, "Can't find your logname. Who Are You?\n", 39);
+ exit(1);
+ }
+ }
+ if (ptr == 0)
+ goto noone;
+ if (strlen(ptr) == 0)
+ goto noone;
+ /*
+ * second task is to prepare the pathnames the player will need
+ */
+ strcpy(loginname, ptr); /* save loginname of the user for logging
+ * purposes */
+ strcpy(logname, ptr); /* this will be overwritten with the players
+ * name */
+ if ((ptr = getenv("HOME")) == NULL)
+ ptr = ".";
if (strlen(ptr) + 9 < sizeof(savefilename)) {
strcpy(savefilename, ptr);
- strcat(savefilename, "/Larn.sav"); /* save file name in home directory */
+ strcat(savefilename, "/Larn.sav"); /* save file name in
+ * home directory */
} else {
fprintf(stderr, "%s/Larn.sav: %s\n", ptr, strerror(ENAMETOOLONG));
- exit();
+ exit(1);
}
if (strlen(ptr) + 10 < sizeof(savefilename)) {
strcpy(optsfile, ptr);
- strcat(optsfile, "/.larnopts"); /* the .larnopts filename */
+ strcat(optsfile, "/.larnopts"); /* the .larnopts filename */
} else {
fprintf(stderr, "%s/.larnopts: %s\n", ptr, strerror(ENAMETOOLONG));
- exit();
+ exit(1);
}
-/*
- * now malloc the memory for the dungeon
- */
- cell = (struct cel *)malloc(sizeof(struct cel)*(MAXLEVEL+MAXVLEVEL)*MAXX*MAXY);
- if (cell == 0) died(-285); /* malloc failure */
- lpbuf = malloc((5* BUFBIG)>>2); /* output buffer */
- inbuffer = malloc((5*MAXIBUF)>>2); /* output buffer */
- if ((lpbuf==0) || (inbuffer==0)) died(-285); /* malloc() failure */
-
- lcreat((char*)0); newgame(); /* set the initial clock */ hard= -1;
+ /*
+ * now malloc the memory for the dungeon
+ */
+ cell = (struct cel *) malloc(sizeof(struct cel) * (MAXLEVEL + MAXVLEVEL) * MAXX * MAXY);
+ if (cell == 0)
+ died(-285); /* malloc failure */
+ lpbuf = malloc((5 * BUFBIG) >> 2); /* output buffer */
+ inbuffer = malloc((5 * MAXIBUF) >> 2); /* output buffer */
+ if ((lpbuf == 0) || (inbuffer == 0))
+ died(-285); /* malloc() failure */
+
+ lcreat((char *) 0);
+ newgame(); /* set the initial clock */
+ hard = -1;
#ifdef VT100
-/*
- * check terminal type to avoid users who have not vt100 type terminals
- */
+ /*
+ * check terminal type to avoid users who have not vt100 type terminals
+ */
ttype = getenv("TERM");
- for (j=1, i=0; i<sizeof(termtypes)/sizeof(char *); i++)
- if (strcmp(ttype,termtypes[i]) == 0) { j=0; break; }
- if (j)
- {
- lprcat("Sorry, Larn needs a VT100 family terminal for all it's features.\n"); lflush();
- exit();
+ for (j = 1, i = 0; i < sizeof(termtypes) / sizeof(char *); i++)
+ if (strcmp(ttype, termtypes[i]) == 0) {
+ j = 0;
+ break;
}
-#endif VT100
+ if (j) {
+ lprcat("Sorry, Larn needs a VT100 family terminal for all it's features.\n");
+ lflush();
+ exit(1);
+ }
+#endif /* VT100 */
-/*
- * now make scoreboard if it is not there (don't clear)
- */
- if (access(scorefile,0) == -1) /* not there */
+ /*
+ * now make scoreboard if it is not there (don't clear)
+ */
+ if (access(scorefile, 0) == -1) /* not there */
makeboard();
-/*
- * now process the command line arguments
- */
- for (i=1; i<argc; i++)
- {
+ /*
+ * now process the command line arguments
+ */
+ for (i = 1; i < argc; i++) {
if (argv[i][0] == '-')
- switch(argv[i][1])
- {
- case 's': showscores(); exit(); /* show scoreboard */
-
- case 'l': /* show log file */
- diedlog(); exit();
-
- case 'i': showallscores(); exit(); /* show all scoreboard */
-
- case 'c': /* anyone with password can create scoreboard */
- lprcat("Preparing to initialize the scoreboard.\n");
- if (getpassword() != 0) /*make new scoreboard*/
- {
- makeboard(); lprc('\n'); showscores();
- }
- exit();
-
- case 'n': /* no welcome msg */ nowelcome=1; argv[i][0]=0; break;
-
- case '0': case '1': case '2': case '3': case '4': case '5':
- case '6': case '7': case '8': case '9': /* for hardness */
- sscanf(&argv[i][1],"%d",&hard);
- break;
+ switch (argv[i][1]) {
+ case 's':
+ showscores();
+ exit(0); /* show scoreboard */
+
+ case 'l': /* show log file */
+ diedlog();
+ exit(0);
+
+ case 'i':
+ showallscores();
+ exit(0); /* show all scoreboard */
+
+ case 'c': /* anyone with password can create
+ * scoreboard */
+ lprcat("Preparing to initialize the scoreboard.\n");
+ if (getpassword() != 0) { /* make new scoreboard */
+ makeboard();
+ lprc('\n');
+ showscores();
+ }
+ exit(0);
+
+ case 'n': /* no welcome msg */
+ nowelcome = 1;
+ argv[i][0] = 0;
+ break;
+
+ case '0':
+ case '1':
+ case '2':
+ case '3':
+ case '4':
+ case '5':
+ case '6':
+ case '7':
+ case '8':
+ case '9': /* for hardness */
+ sscanf(&argv[i][1], "%d", &hard);
+ break;
case 'h': /* print out command line arguments */
- write(1,cmdhelp,sizeof(cmdhelp)); exit();
+ write(1, cmdhelp, sizeof(cmdhelp));
+ exit(0);
case 'o': /* specify a .larnopts filename */
- strncpy(optsfile,argv[i]+2,127);
- optsfile[127] = '\0';
- break;
+ strncpy(optsfile, argv[i] + 2, 127);
+ optsfile[127] = '\0';
+ break;
- default: printf("Unknown option <%s>\n",argv[i]); exit();
+ default:
+ printf("Unknown option <%s>\n", argv[i]);
+ exit(1);
};
- if (argv[i][0] == '+')
- {
- clear(); restorflag = 1;
- if (argv[i][1] == '+')
- {
- hitflag=1; restoregame(ckpfile); /* restore checkpointed game */
- }
- i = argc;
+ if (argv[i][0] == '+') {
+ clear();
+ restorflag = 1;
+ if (argv[i][1] == '+') {
+ hitflag = 1;
+ restoregame(ckpfile); /* restore checkpointed
+ * game */
}
+ i = argc;
}
+ }
readopts(); /* read the options file if there is one */
#ifdef UIDSCORE
userid = geteuid(); /* obtain the user's effective id number */
-#else UIDSCORE
+#else /* UIDSCORE */
userid = getplid(logname); /* obtain the players id number */
-#endif UIDSCORE
- if (userid < 0) { write(2,"Can't obtain playerid\n",22); exit(); }
-
+#endif /* UIDSCORE */
+ if (userid < 0) {
+ write(2, "Can't obtain playerid\n", 22);
+ exit(1);
+ }
#ifdef HIDEBYLINK
-/*
- * this section of code causes the program to look like something else to ps
- */
- if (strcmp(psname,argv[0])) /* if a different process name only */
- {
- if ((i=access(psname,1)) < 0)
- { /* link not there */
- if (link(argv[0],psname)>=0)
- {
- argv[0] = psname; execv(psname,argv);
- }
+ /*
+ * this section of code causes the program to look like something else to ps
+ */
+ if (strcmp(psname, argv[0])) { /* if a different process name only */
+ if ((i = access(psname, 1)) < 0) { /* link not there */
+ if (link(argv[0], psname) >= 0) {
+ argv[0] = psname;
+ execv(psname, argv);
}
- else
+ } else
unlink(psname);
- }
-
- for (i=1; i<argc; i++)
- {
+ }
+ for (i = 1; i < argc; i++) {
szero(argv[i]); /* zero the argument to avoid ps snooping */
- }
-#endif HIDEBYLINK
+ }
+#endif /* HIDEBYLINK */
- if (access(savefilename,0)==0) /* restore game if need to */
- {
- clear(); restorflag = 1;
- hitflag=1; restoregame(savefilename); /* restore last game */
- }
- sigsetup(); /* trap all needed signals */
- sethard(hard); /* set up the desired difficulty */
- setupvt100(); /* setup the terminal special mode */
- if (c[HP]==0) /* create new game */
- {
- makeplayer(); /* make the character that will play */
- newcavelevel(0);/* make the dungeon */
- predostuff = 1; /* tell signals that we are in the welcome screen */
- if (nowelcome==0) welcome(); /* welcome the player to the game */
- }
- drawscreen(); /* show the initial dungeon */
- predostuff = 2; /* tell the trap functions that they must do a showplayer()
- from here on */
- /* nice(1); */ /* games should be run niced */
+ if (access(savefilename, 0) == 0) { /* restore game if need to */
+ clear();
+ restorflag = 1;
+ hitflag = 1;
+ restoregame(savefilename); /* restore last game */
+ }
+ sigsetup(); /* trap all needed signals */
+ sethard(hard); /* set up the desired difficulty */
+ setupvt100(); /* setup the terminal special mode */
+ if (c[HP] == 0) { /* create new game */
+ makeplayer(); /* make the character that will play */
+ newcavelevel(0);/* make the dungeon */
+ predostuff = 1; /* tell signals that we are in the welcome
+ * screen */
+ if (nowelcome == 0)
+ welcome(); /* welcome the player to the game */
+ }
+ drawscreen(); /* show the initial dungeon */
+ predostuff = 2; /* tell the trap functions that they must do
+ * a showplayer() from here on */
+#if 0
+ nice(1); /* games should be run niced */
+#endif
yrepcount = hit2flag = 0;
- while (1)
- {
- if (dropflag==0) lookforobject(); /* see if there is an object here */
- else dropflag=0; /* don't show it just dropped an item */
- if (hitflag==0) { if (c[HASTEMONST]) movemonst(); movemonst(); } /* move the monsters */
- if (viewflag==0) showcell(playerx,playery); else viewflag=0; /* show stuff around player */
- if (hit3flag) flushall();
- hitflag=hit3flag=0; nomove=1;
+ while (1) {
+ if (dropflag == 0)
+ lookforobject(); /* see if there is an object
+ * here */
+ else
+ dropflag = 0; /* don't show it just dropped an item */
+ if (hitflag == 0) {
+ if (c[HASTEMONST])
+ movemonst();
+ movemonst();
+ } /* move the monsters */
+ if (viewflag == 0)
+ showcell(playerx, playery);
+ else
+ viewflag = 0; /* show stuff around player */
+ if (hit3flag)
+ flushall();
+ hitflag = hit3flag = 0;
+ nomove = 1;
bot_linex(); /* update bottom line */
- while (nomove)
- {
- if (hit3flag) flushall();
- nomove=0; parse();
- } /* get commands and make moves */
- regen(); /* regenerate hp and spells */
- if (c[TIMESTOP]==0)
- if (--rmst <= 0)
- { rmst = 120-(level<<2); fillmonst(makemonst(level)); }
- }
+ while (nomove) {
+ if (hit3flag)
+ flushall();
+ nomove = 0;
+ parse();
+ } /* get commands and make moves */
+ regen(); /* regenerate hp and spells */
+ if (c[TIMESTOP] == 0)
+ if (--rmst <= 0) {
+ rmst = 120 - (level << 2);
+ fillmonst(makemonst(level));
+ }
}
-
-/*
- showstr()
+}
+
- show character's inventory
+/*
+ * showstr()
+ *
+ * show character's inventory
*/
+void
showstr()
- {
- register int i,number;
- for (number=3, i=0; i<26; i++)
- if (iven[i]) number++; /* count items in inventory */
- t_setup(number); qshowstr(); t_endup(number);
- }
+{
+ int i, number;
+
+ for (number = 3, i = 0; i < 26; i++)
+ if (iven[i])
+ number++; /* count items in inventory */
+ t_setup(number);
+ qshowstr();
+ t_endup(number);
+}
+void
qshowstr()
- {
- register int i,j,k,sigsav;
- srcount=0; sigsav=nosignal; nosignal=1; /* don't allow ^c etc */
- if (c[GOLD]) { lprintf(".) %d gold pieces",(long)c[GOLD]); srcount++; }
- for (k=26; k>=0; k--)
- if (iven[k])
- { for (i=22; i<84; i++)
- for (j=0; j<=k; j++) if (i==iven[j]) show3(j); k=0; }
-
- lprintf("\nElapsed time is %d. You have %d mobuls left",(long)((gltime+99)/100+1),(long)((TIMELIMIT-gltime)/100));
- more(); nosignal=sigsav;
+{
+ int i, j, k, sigsav;
+
+ srcount = 0;
+ sigsav = nosignal;
+ nosignal = 1; /* don't allow ^c etc */
+ if (c[GOLD]) {
+ lprintf(".) %d gold pieces", (long) c[GOLD]);
+ srcount++;
}
+ for (k = 26; k >= 0; k--)
+ if (iven[k]) {
+ for (i = 22; i < 84; i++)
+ for (j = 0; j <= k; j++)
+ if (i == iven[j])
+ show3(j);
+ k = 0;
+ }
+ lprintf("\nElapsed time is %d. You have %d mobuls left", (long) ((gltime + 99) / 100 + 1), (long) ((TIMELIMIT - gltime) / 100));
+ more();
+ nosignal = sigsav;
+}
/*
* subroutine to clear screen depending on # lines to display
*/
+void
t_setup(count)
- register int count;
- {
- if (count<20) /* how do we clear the screen? */
- {
- cl_up(79,count); cursor(1,1);
- }
- else
- {
- resetscroll(); clear();
- }
+ int count;
+{
+ if (count < 20) { /* how do we clear the screen? */
+ cl_up(79, count);
+ cursor(1, 1);
+ } else {
+ resetscroll();
+ clear();
}
+}
/*
* subroutine to restore normal display screen depending on t_setup()
*/
+void
t_endup(count)
- register int count;
- {
- if (count<18) /* how did we clear the screen? */
- draws(0,MAXX,0,(count>MAXY) ? MAXY : count);
- else
- {
- drawscreen(); setscroll();
- }
+ int count;
+{
+ if (count < 18) /* how did we clear the screen? */
+ draws(0, MAXX, 0, (count > MAXY) ? MAXY : count);
+ else {
+ drawscreen();
+ setscroll();
}
+}
/*
- function to show the things player is wearing only
+ * function to show the things player is wearing only
*/
+void
showwear()
- {
- register int i,j,sigsav,count;
- sigsav=nosignal; nosignal=1; /* don't allow ^c etc */
- srcount=0;
-
- for (count=2,j=0; j<=26; j++) /* count number of items we will display */
- if (i=iven[j])
- switch(i)
- {
- case OLEATHER: case OPLATE: case OCHAIN:
- case ORING: case OSTUDLEATHER: case OSPLINT:
- case OPLATEARMOR: case OSSPLATE: case OSHIELD:
- count++;
+{
+ int i, j, sigsav, count;
+
+ sigsav = nosignal;
+ nosignal = 1; /* don't allow ^c etc */
+ srcount = 0;
+
+ for (count = 2, j = 0; j <= 26; j++) /* count number of items we
+ * will display */
+ if ((i = iven[j]) != 0)
+ switch (i) {
+ case OLEATHER:
+ case OPLATE:
+ case OCHAIN:
+ case ORING:
+ case OSTUDLEATHER:
+ case OSPLINT:
+ case OPLATEARMOR:
+ case OSSPLATE:
+ case OSHIELD:
+ count++;
};
t_setup(count);
- for (i=22; i<84; i++)
- for (j=0; j<=26; j++)
- if (i==iven[j])
- switch(i)
- {
- case OLEATHER: case OPLATE: case OCHAIN:
- case ORING: case OSTUDLEATHER: case OSPLINT:
- case OPLATEARMOR: case OSSPLATE: case OSHIELD:
- show3(j);
+ for (i = 22; i < 84; i++)
+ for (j = 0; j <= 26; j++)
+ if (i == iven[j])
+ switch (i) {
+ case OLEATHER:
+ case OPLATE:
+ case OCHAIN:
+ case ORING:
+ case OSTUDLEATHER:
+ case OSPLINT:
+ case OPLATEARMOR:
+ case OSSPLATE:
+ case OSHIELD:
+ show3(j);
};
- more(); nosignal=sigsav; t_endup(count);
- }
+ more();
+ nosignal = sigsav;
+ t_endup(count);
+}
/*
- function to show the things player can wield only
+ * function to show the things player can wield only
*/
+void
showwield()
- {
- register int i,j,sigsav,count;
- sigsav=nosignal; nosignal=1; /* don't allow ^c etc */
- srcount=0;
-
- for (count=2,j=0; j<=26; j++) /* count how many items */
- if (i=iven[j])
- switch(i)
- {
- case ODIAMOND: case ORUBY: case OEMERALD: case OSAPPHIRE:
- case OBOOK: case OCHEST: case OLARNEYE: case ONOTHEFT:
- case OSPIRITSCARAB: case OCUBEofUNDEAD:
- case OPOTION: case OSCROLL: break;
- default: count++;
+{
+ int i, j, sigsav, count;
+
+ sigsav = nosignal;
+ nosignal = 1; /* don't allow ^c etc */
+ srcount = 0;
+
+ for (count = 2, j = 0; j <= 26; j++) /* count how many items */
+ if ((i = iven[j]) != 0)
+ switch (i) {
+ case ODIAMOND:
+ case ORUBY:
+ case OEMERALD:
+ case OSAPPHIRE:
+ case OBOOK:
+ case OCHEST:
+ case OLARNEYE:
+ case ONOTHEFT:
+ case OSPIRITSCARAB:
+ case OCUBEofUNDEAD:
+ case OPOTION:
+ case OSCROLL:
+ break;
+ default:
+ count++;
};
t_setup(count);
- for (i=22; i<84; i++)
- for (j=0; j<=26; j++)
- if (i==iven[j])
- switch(i)
- {
- case ODIAMOND: case ORUBY: case OEMERALD: case OSAPPHIRE:
- case OBOOK: case OCHEST: case OLARNEYE: case ONOTHEFT:
- case OSPIRITSCARAB: case OCUBEofUNDEAD:
- case OPOTION: case OSCROLL: break;
- default: show3(j);
+ for (i = 22; i < 84; i++)
+ for (j = 0; j <= 26; j++)
+ if (i == iven[j])
+ switch (i) {
+ case ODIAMOND:
+ case ORUBY:
+ case OEMERALD:
+ case OSAPPHIRE:
+ case OBOOK:
+ case OCHEST:
+ case OLARNEYE:
+ case ONOTHEFT:
+ case OSPIRITSCARAB:
+ case OCUBEofUNDEAD:
+ case OPOTION:
+ case OSCROLL:
+ break;
+ default:
+ show3(j);
};
- more(); nosignal=sigsav; t_endup(count);
- }
+ more();
+ nosignal = sigsav;
+ t_endup(count);
+}
/*
* function to show the things player can read only
*/
+void
showread()
- {
- register int i,j,sigsav,count;
- sigsav=nosignal; nosignal=1; /* don't allow ^c etc */
- srcount=0;
+{
+ int i, j, sigsav, count;
- for (count=2,j=0; j<=26; j++)
- switch(iven[j])
- {
- case OBOOK: case OSCROLL: count++;
- };
+ sigsav = nosignal;
+ nosignal = 1; /* don't allow ^c etc */
+ srcount = 0;
+
+ for (count = 2, j = 0; j <= 26; j++)
+ switch (iven[j]) {
+ case OBOOK:
+ case OSCROLL:
+ count++;
+ };
t_setup(count);
- for (i=22; i<84; i++)
- for (j=0; j<=26; j++)
- if (i==iven[j])
- switch(i)
- {
- case OBOOK: case OSCROLL: show3(j);
+ for (i = 22; i < 84; i++)
+ for (j = 0; j <= 26; j++)
+ if (i == iven[j])
+ switch (i) {
+ case OBOOK:
+ case OSCROLL:
+ show3(j);
};
- more(); nosignal=sigsav; t_endup(count);
- }
+ more();
+ nosignal = sigsav;
+ t_endup(count);
+}
/*
* function to show the things player can eat only
*/
+void
showeat()
- {
- register int i,j,sigsav,count;
- sigsav=nosignal; nosignal=1; /* don't allow ^c etc */
- srcount=0;
+{
+ int i, j, sigsav, count;
- for (count=2,j=0; j<=26; j++)
- switch(iven[j])
- {
- case OCOOKIE: count++;
- };
+ sigsav = nosignal;
+ nosignal = 1; /* don't allow ^c etc */
+ srcount = 0;
+
+ for (count = 2, j = 0; j <= 26; j++)
+ switch (iven[j]) {
+ case OCOOKIE:
+ count++;
+ };
t_setup(count);
- for (i=22; i<84; i++)
- for (j=0; j<=26; j++)
- if (i==iven[j])
- switch(i)
- {
- case OCOOKIE: show3(j);
+ for (i = 22; i < 84; i++)
+ for (j = 0; j <= 26; j++)
+ if (i == iven[j])
+ switch (i) {
+ case OCOOKIE:
+ show3(j);
};
- more(); nosignal=sigsav; t_endup(count);
- }
+ more();
+ nosignal = sigsav;
+ t_endup(count);
+}
/*
- function to show the things player can quaff only
+ * function to show the things player can quaff only
*/
+void
showquaff()
- {
- register int i,j,sigsav,count;
- sigsav=nosignal; nosignal=1; /* don't allow ^c etc */
- srcount=0;
+{
+ int i, j, sigsav, count;
- for (count=2,j=0; j<=26; j++)
- switch(iven[j])
- {
- case OPOTION: count++;
- };
+ sigsav = nosignal;
+ nosignal = 1; /* don't allow ^c etc */
+ srcount = 0;
+
+ for (count = 2, j = 0; j <= 26; j++)
+ switch (iven[j]) {
+ case OPOTION:
+ count++;
+ };
t_setup(count);
- for (i=22; i<84; i++)
- for (j=0; j<=26; j++)
- if (i==iven[j])
- switch(i)
- {
- case OPOTION: show3(j);
+ for (i = 22; i < 84; i++)
+ for (j = 0; j <= 26; j++)
+ if (i == iven[j])
+ switch (i) {
+ case OPOTION:
+ show3(j);
};
- more(); nosignal=sigsav; t_endup(count);
- }
+ more();
+ nosignal = sigsav;
+ t_endup(count);
+}
-show1(idx,str2)
- register int idx;
- register char *str2[];
- {
- lprintf("\n%c) %s",idx+'a',objectname[iven[idx]]);
- if (str2!=0 && str2[ivenarg[idx]][0]!=0) lprintf(" of%s",str2[ivenarg[idx]]);
- }
+void
+show1(idx, str2)
+ int idx;
+ char *str2[];
+{
+ lprintf("\n%c) %s", idx + 'a', objectname[iven[idx]]);
+ if (str2 != 0 && str2[ivenarg[idx]][0] != 0)
+ lprintf(" of%s", str2[ivenarg[idx]]);
+}
+void
show3(index)
- register int index;
- {
- switch(iven[index])
- {
- case OPOTION: show1(index,potionname); break;
- case OSCROLL: show1(index,scrollname); break;
-
- case OLARNEYE: case OBOOK: case OSPIRITSCARAB:
- case ODIAMOND: case ORUBY: case OCUBEofUNDEAD:
- case OEMERALD: case OCHEST: case OCOOKIE:
- case OSAPPHIRE: case ONOTHEFT: show1(index,(char **)0); break;
-
- default: lprintf("\n%c) %s",index+'a',objectname[iven[index]]);
- if (ivenarg[index]>0) lprintf(" + %d",(long)ivenarg[index]);
- else if (ivenarg[index]<0) lprintf(" %d",(long)ivenarg[index]);
- break;
- }
- if (c[WIELD]==index) lprcat(" (weapon in hand)");
- if ((c[WEAR]==index) || (c[SHIELD]==index)) lprcat(" (being worn)");
- if (++srcount>=22) { srcount=0; more(); clear(); }
+ int index;
+{
+ switch (iven[index]) {
+ case OPOTION:
+ show1(index, potionname);
+ break;
+ case OSCROLL:
+ show1(index, scrollname);
+ break;
+
+ case OLARNEYE:
+ case OBOOK:
+ case OSPIRITSCARAB:
+ case ODIAMOND:
+ case ORUBY:
+ case OCUBEofUNDEAD:
+ case OEMERALD:
+ case OCHEST:
+ case OCOOKIE:
+ case OSAPPHIRE:
+ case ONOTHEFT:
+ show1(index, (char **) 0);
+ break;
+
+ default:
+ lprintf("\n%c) %s", index + 'a', objectname[iven[index]]);
+ if (ivenarg[index] > 0)
+ lprintf(" + %d", (long) ivenarg[index]);
+ else if (ivenarg[index] < 0)
+ lprintf(" %d", (long) ivenarg[index]);
+ break;
+ }
+ if (c[WIELD] == index)
+ lprcat(" (weapon in hand)");
+ if ((c[WEAR] == index) || (c[SHIELD] == index))
+ lprcat(" (being worn)");
+ if (++srcount >= 22) {
+ srcount = 0;
+ more();
+ clear();
}
+}
/*
- subroutine to randomly create monsters if needed
+ * subroutine to randomly create monsters if needed
*/
+void
randmonst()
- {
- if (c[TIMESTOP]) return; /* don't make monsters if time is stopped */
- if (--rmst <= 0)
- {
- rmst = 120 - (level<<2); fillmonst(makemonst(level));
- }
+{
+ if (c[TIMESTOP])
+ return; /* don't make monsters if time is stopped */
+ if (--rmst <= 0) {
+ rmst = 120 - (level << 2);
+ fillmonst(makemonst(level));
}
+}
-
-/*
- parse()
- get and execute a command
+
+/*
+ * parse()
+ *
+ * get and execute a command
*/
+void
parse()
- {
- register int i,j,k,flag;
- while (1)
- {
+{
+ int i, j, k, flag;
+
+ while (1) {
k = yylex();
- switch(k) /* get the token from the input and switch on it */
- {
- case 'h': moveplayer(4); return; /* west */
- case 'H': run(4); return; /* west */
- case 'l': moveplayer(2); return; /* east */
- case 'L': run(2); return; /* east */
- case 'j': moveplayer(1); return; /* south */
- case 'J': run(1); return; /* south */
- case 'k': moveplayer(3); return; /* north */
- case 'K': run(3); return; /* north */
- case 'u': moveplayer(5); return; /* northeast */
- case 'U': run(5); return; /* northeast */
- case 'y': moveplayer(6); return; /* northwest */
- case 'Y': run(6); return; /* northwest */
- case 'n': moveplayer(7); return; /* southeast */
- case 'N': run(7); return; /* southeast */
- case 'b': moveplayer(8); return; /* southwest */
- case 'B': run(8); return; /* southwest */
-
- case '.': if (yrepcount) viewflag=1; return; /* stay here */
-
- case 'w': yrepcount=0; wield(); return; /* wield a weapon */
-
- case 'W': yrepcount=0; wear(); return; /* wear armor */
-
- case 'r': yrepcount=0;
- if (c[BLINDCOUNT]) { cursors(); lprcat("\nYou can't read anything when you're blind!"); } else
- if (c[TIMESTOP]==0) readscr(); return; /* to read a scroll */
-
- case 'q': yrepcount=0; if (c[TIMESTOP]==0) quaff(); return; /* quaff a potion */
-
- case 'd': yrepcount=0; if (c[TIMESTOP]==0) dropobj(); return; /* to drop an object */
-
- case 'c': yrepcount=0; cast(); return; /* cast a spell */
-
- case 'i': yrepcount=0; nomove=1; showstr(); return; /* status */
-
- case 'e': yrepcount=0;
- if (c[TIMESTOP]==0) eatcookie(); return; /* to eat a fortune cookie */
-
- case 'D': yrepcount=0; seemagic(0); nomove=1; return; /* list spells and scrolls */
-
- case '?': yrepcount=0; help(); nomove=1; return; /* give the help screen*/
-
- case 'S': clear(); lprcat("Saving . . ."); lflush();
- savegame(savefilename); wizard=1; died(-257); /* save the game - doesn't return */
-
- case 'Z': yrepcount=0; if (c[LEVEL]>9) { oteleport(1); return; }
- cursors(); lprcat("\nAs yet, you don't have enough experience to use teleportation");
- return; /* teleport yourself */
-
- case '^': /* identify traps */ flag=yrepcount=0; cursors();
- lprc('\n'); for (j=playery-1; j<playery+2; j++)
- {
- if (j < 0) j=0; if (j >= MAXY) break;
- for (i=playerx-1; i<playerx+2; i++)
- {
- if (i < 0) i=0; if (i >= MAXX) break;
- switch(item[i][j])
- {
- case OTRAPDOOR: case ODARTRAP:
- case OTRAPARROW: case OTELEPORTER:
- lprcat("\nIts "); lprcat(objectname[item[i][j]]); flag++;
- };
- }
- }
- if (flag==0) lprcat("\nNo traps are visible");
- return;
+ switch (k) { /* get the token from the input */
+ case 'h':
+ moveplayer(4);
+ return; /* west */
+ case 'H':
+ run(4);
+ return; /* west */
+ case 'l':
+ moveplayer(2);
+ return; /* east */
+ case 'L':
+ run(2);
+ return; /* east */
+ case 'j':
+ moveplayer(1);
+ return; /* south */
+ case 'J':
+ run(1);
+ return; /* south */
+ case 'k':
+ moveplayer(3);
+ return; /* north */
+ case 'K':
+ run(3);
+ return; /* north */
+ case 'u':
+ moveplayer(5);
+ return; /* northeast */
+ case 'U':
+ run(5);
+ return; /* northeast */
+ case 'y':
+ moveplayer(6);
+ return; /* northwest */
+ case 'Y':
+ run(6);
+ return; /* northwest */
+ case 'n':
+ moveplayer(7);
+ return; /* southeast */
+ case 'N':
+ run(7);
+ return; /* southeast */
+ case 'b':
+ moveplayer(8);
+ return; /* southwest */
+ case 'B':
+ run(8);
+ return; /* southwest */
+
+ case '.':
+ if (yrepcount)
+ viewflag = 1;
+ return; /* stay here */
+
+ case 'w':
+ yrepcount = 0;
+ wield();
+ return; /* wield a weapon */
+
+ case 'W':
+ yrepcount = 0;
+ wear();
+ return; /* wear armor */
+
+ case 'r':
+ yrepcount = 0;
+ if (c[BLINDCOUNT]) {
+ cursors();
+ lprcat("\nYou can't read anything when you're blind!");
+ } else if (c[TIMESTOP] == 0)
+ readscr();
+ return; /* to read a scroll */
+
+ case 'q':
+ yrepcount = 0;
+ if (c[TIMESTOP] == 0)
+ quaff();
+ return; /* quaff a potion */
+
+ case 'd':
+ yrepcount = 0;
+ if (c[TIMESTOP] == 0)
+ dropobj();
+ return; /* to drop an object */
+
+ case 'c':
+ yrepcount = 0;
+ cast();
+ return; /* cast a spell */
+
+ case 'i':
+ yrepcount = 0;
+ nomove = 1;
+ showstr();
+ return; /* status */
+
+ case 'e':
+ yrepcount = 0;
+ if (c[TIMESTOP] == 0)
+ eatcookie();
+ return; /* to eat a fortune cookie */
+
+ case 'D':
+ yrepcount = 0;
+ seemagic(0);
+ nomove = 1;
+ return; /* list spells and scrolls */
+
+ case '?':
+ yrepcount = 0;
+ help();
+ nomove = 1;
+ return; /* give the help screen */
+
+ case 'S':
+ clear();
+ lprcat("Saving . . .");
+ lflush();
+ savegame(savefilename);
+ wizard = 1;
+ died(-257); /* save the game - doesn't return */
+
+ case 'Z':
+ yrepcount = 0;
+ if (c[LEVEL] > 9) {
+ oteleport(1);
+ return;
+ }
+ cursors();
+ lprcat("\nAs yet, you don't have enough experience to use teleportation");
+ return; /* teleport yourself */
+
+ case '^': /* identify traps */
+ flag = yrepcount = 0;
+ cursors();
+ lprc('\n');
+ for (j = playery - 1; j < playery + 2; j++) {
+ if (j < 0)
+ j = 0;
+ if (j >= MAXY)
+ break;
+ for (i = playerx - 1; i < playerx + 2; i++) {
+ if (i < 0)
+ i = 0;
+ if (i >= MAXX)
+ break;
+ switch (item[i][j]) {
+ case OTRAPDOOR:
+ case ODARTRAP:
+ case OTRAPARROW:
+ case OTELEPORTER:
+ lprcat("\nIts ");
+ lprcat(objectname[item[i][j]]);
+ flag++;
+ };
+ }
+ }
+ if (flag == 0)
+ lprcat("\nNo traps are visible");
+ return;
#if WIZID
- case '_': /* this is the fudge player password for wizard mode*/
- yrepcount=0; cursors(); nomove=1;
- if (userid!=wisid)
- {
- lprcat("Sorry, you are not empowered to be a wizard.\n");
- scbr(); /* system("stty -echo cbreak"); */
- lflush(); return;
- }
- if (getpassword()==0)
- {
- scbr(); /* system("stty -echo cbreak"); */ return;
- }
- wizard=1; scbr(); /* system("stty -echo cbreak"); */
- for (i=0; i<6; i++) c[i]=70; iven[0]=iven[1]=0;
- take(OPROTRING,50); take(OLANCE,25); c[WIELD]=1;
- c[LANCEDEATH]=1; c[WEAR] = c[SHIELD] = -1;
- raiseexperience(6000000L); c[AWARENESS] += 25000;
- {
- register int i,j;
- for (i=0; i<MAXY; i++)
- for (j=0; j<MAXX; j++) know[j][i]=1;
- for (i=0; i<SPNUM; i++) spelknow[i]=1;
- for (i=0; i<MAXSCROLL; i++) scrollname[i]=scrollhide[i];
- for (i=0; i<MAXPOTION; i++) potionname[i]=potionhide[i];
- }
- for (i=0; i<MAXSCROLL; i++)
- if (strlen(scrollname[i])>2) /* no null items */
- { item[i][0]=OSCROLL; iarg[i][0]=i; }
- for (i=MAXX-1; i>MAXX-1-MAXPOTION; i--)
- if (strlen(potionname[i-MAXX+MAXPOTION])>2) /* no null items */
- { item[i][0]=OPOTION; iarg[i][0]=i-MAXX+MAXPOTION; }
- for (i=1; i<MAXY; i++)
- { item[0][i]=i; iarg[0][i]=0; }
- for (i=MAXY; i<MAXY+MAXX; i++)
- { item[i-MAXY][MAXY-1]=i; iarg[i-MAXY][MAXY-1]=0; }
- for (i=MAXX+MAXY; i<MAXX+MAXY+MAXY; i++)
- { item[MAXX-1][i-MAXX-MAXY]=i; iarg[MAXX-1][i-MAXX-MAXY]=0; }
- c[GOLD]+=25000; drawscreen(); return;
+ case '_': /* this is the fudge player password for
+ * wizard mode */
+ yrepcount = 0;
+ cursors();
+ nomove = 1;
+ if (userid != wisid) {
+ lprcat("Sorry, you are not empowered to be a wizard.\n");
+ scbr(); /* system("stty -echo cbreak"); */
+ lflush();
+ return;
+ }
+ if (getpassword() == 0) {
+ scbr(); /* system("stty -echo cbreak"); */
+ return;
+ }
+ wizard = 1;
+ scbr(); /* system("stty -echo cbreak"); */
+ for (i = 0; i < 6; i++)
+ c[i] = 70;
+ iven[0] = iven[1] = 0;
+ take(OPROTRING, 50);
+ take(OLANCE, 25);
+ c[WIELD] = 1;
+ c[LANCEDEATH] = 1;
+ c[WEAR] = c[SHIELD] = -1;
+ raiseexperience(6000000L);
+ c[AWARENESS] += 25000;
+ {
+ int i, j;
+ for (i = 0; i < MAXY; i++)
+ for (j = 0; j < MAXX; j++)
+ know[j][i] = 1;
+ for (i = 0; i < SPNUM; i++)
+ spelknow[i] = 1;
+ for (i = 0; i < MAXSCROLL; i++)
+ scrollname[i] = scrollhide[i];
+ for (i = 0; i < MAXPOTION; i++)
+ potionname[i] = potionhide[i];
+ }
+ for (i = 0; i < MAXSCROLL; i++)
+ if (strlen(scrollname[i]) > 2) { /* no null items */
+ item[i][0] = OSCROLL;
+ iarg[i][0] = i;
+ }
+ for (i = MAXX - 1; i > MAXX - 1 - MAXPOTION; i--)
+ if (strlen(potionname[i - MAXX + MAXPOTION]) > 2) { /* no null items */
+ item[i][0] = OPOTION;
+ iarg[i][0] = i - MAXX + MAXPOTION;
+ }
+ for (i = 1; i < MAXY; i++) {
+ item[0][i] = i;
+ iarg[0][i] = 0;
+ }
+ for (i = MAXY; i < MAXY + MAXX; i++) {
+ item[i - MAXY][MAXY - 1] = i;
+ iarg[i - MAXY][MAXY - 1] = 0;
+ }
+ for (i = MAXX + MAXY; i < MAXX + MAXY + MAXY; i++) {
+ item[MAXX - 1][i - MAXX - MAXY] = i;
+ iarg[MAXX - 1][i - MAXX - MAXY] = 0;
+ }
+ c[GOLD] += 25000;
+ drawscreen();
+ return;
#endif
- case 'T': yrepcount=0; cursors(); if (c[SHIELD] != -1) { c[SHIELD] = -1; lprcat("\nYour shield is off"); bottomline(); } else
- if (c[WEAR] != -1) { c[WEAR] = -1; lprcat("\nYour armor is off"); bottomline(); }
- else lprcat("\nYou aren't wearing anything");
- return;
+ case 'T':
+ yrepcount = 0;
+ cursors();
+ if (c[SHIELD] != -1) {
+ c[SHIELD] = -1;
+ lprcat("\nYour shield is off");
+ bottomline();
+ } else if (c[WEAR] != -1) {
+ c[WEAR] = -1;
+ lprcat("\nYour armor is off");
+ bottomline();
+ } else
+ lprcat("\nYou aren't wearing anything");
+ return;
- case 'g': cursors();
- lprintf("\nThe stuff you are carrying presently weighs %d pounds",(long)packweight());
- case ' ': yrepcount=0; nomove=1; return;
+ case 'g':
+ cursors();
+ lprintf("\nThe stuff you are carrying presently weighs %d pounds", (long) packweight());
+ case ' ':
+ yrepcount = 0;
+ nomove = 1;
+ return;
- case 'v': yrepcount=0; cursors();
- lprintf("\nCaverns of Larn, Version %d.%d, Diff=%d",(long)VERSION,(long)SUBVERSION,(long)c[HARDGAME]);
- if (wizard) lprcat(" Wizard"); nomove=1;
- if (cheat) lprcat(" Cheater");
- lprcat(copyright);
- return;
+ case 'v':
+ yrepcount = 0;
+ cursors();
+ lprintf("\nCaverns of Larn, Version %d.%d, Diff=%d", (long) VERSION, (long) SUBVERSION, (long) c[HARDGAME]);
+ if (wizard)
+ lprcat(" Wizard");
+ nomove = 1;
+ if (cheat)
+ lprcat(" Cheater");
+ lprcat(copyright);
+ return;
- case 'Q': yrepcount=0; quit(); nomove=1; return; /* quit */
+ case 'Q':
+ yrepcount = 0;
+ quit();
+ nomove = 1;
+ return; /* quit */
- case 'L'-64: yrepcount=0; drawscreen(); nomove=1; return; /* look */
+ case 'L' - 64:
+ yrepcount = 0;
+ drawscreen();
+ nomove = 1;
+ return; /* look */
#if WIZID
#ifdef EXTRA
- case 'A': yrepcount=0; nomove=1; if (wizard) { diag(); return; } /* create diagnostic file */
- return;
+ case 'A':
+ yrepcount = 0;
+ nomove = 1;
+ if (wizard) {
+ diag();
+ return;
+ } /* create diagnostic file */
+ return;
#endif
#endif
- case 'P': cursors();
- if (outstanding_taxes>0)
- lprintf("\nYou presently owe %d gp in taxes.",(long)outstanding_taxes);
- else
- lprcat("\nYou do not owe any taxes.");
- return;
- };
- }
+ case 'P':
+ cursors();
+ if (outstanding_taxes > 0)
+ lprintf("\nYou presently owe %d gp in taxes.", (long) outstanding_taxes);
+ else
+ lprcat("\nYou do not owe any taxes.");
+ return;
+ };
}
+}
+void
parse2()
- {
- if (c[HASTEMONST]) movemonst(); movemonst(); /* move the monsters */
- randmonst(); regen();
- }
+{
+ if (c[HASTEMONST])
+ movemonst();
+ movemonst(); /* move the monsters */
+ randmonst();
+ regen();
+}
+void
run(dir)
- int dir;
- {
- register int i;
- i=1; while (i)
- {
- i=moveplayer(dir);
- if (i>0) { if (c[HASTEMONST]) movemonst(); movemonst(); randmonst(); regen(); }
- if (hitflag) i=0;
- if (i!=0) showcell(playerx,playery);
+ int dir;
+{
+ int i;
+
+ i = 1;
+ while (i) {
+ i = moveplayer(dir);
+ if (i > 0) {
+ if (c[HASTEMONST])
+ movemonst();
+ movemonst();
+ randmonst();
+ regen();
}
+ if (hitflag)
+ i = 0;
+ if (i != 0)
+ showcell(playerx, playery);
}
+}
/*
function to wield a weapon
*/
-wield()
- {
- register int i;
- while (1)
- {
- if ((i = whatitem("wield"))=='\33') return;
- if (i != '.')
- {
- if (i=='*') showwield();
- else if (iven[i-'a']==0) { ydhi(i); return; }
- else if (iven[i-'a']==OPOTION) { ycwi(i); return; }
- else if (iven[i-'a']==OSCROLL) { ycwi(i); return; }
- else if ((c[SHIELD]!= -1) && (iven[i-'a']==O2SWORD)) { lprcat("\nBut one arm is busy with your shield!"); return; }
- else { c[WIELD]=i-'a'; if (iven[i-'a'] == OLANCE) c[LANCEDEATH]=1; else c[LANCEDEATH]=0; bottomline(); return; }
+void
+wield()
+{
+ int i;
+
+ while (1) {
+ if ((i = whatitem("wield")) == '\33')
+ return;
+ if (i != '.') {
+ if (i == '*')
+ showwield();
+ else if (iven[i - 'a'] == 0) {
+ ydhi(i);
+ return;
+ } else if (iven[i - 'a'] == OPOTION) {
+ ycwi(i);
+ return;
+ } else if (iven[i - 'a'] == OSCROLL) {
+ ycwi(i);
+ return;
+ } else if ((c[SHIELD] != -1) && (iven[i - 'a'] == O2SWORD)) {
+ lprcat("\nBut one arm is busy with your shield!");
+ return;
+ } else {
+ c[WIELD] = i - 'a';
+ if (iven[i - 'a'] == OLANCE)
+ c[LANCEDEATH] = 1;
+ else
+ c[LANCEDEATH] = 0;
+ bottomline();
+ return;
}
}
}
+}
/*
- common routine to say you don't have an item
+ * common routine to say you don't have an item
*/
+void
ydhi(x)
- int x;
- { cursors(); lprintf("\nYou don't have item %c!",x); }
+ int x;
+{
+ cursors();
+ lprintf("\nYou don't have item %c!", x);
+}
+
+void
ycwi(x)
- int x;
- { cursors(); lprintf("\nYou can't wield item %c!",x); }
+ int x;
+{
+ cursors();
+ lprintf("\nYou can't wield item %c!", x);
+}
/*
- function to wear armor
+ * function to wear armor
*/
+void
wear()
- {
- register int i;
- while (1)
- {
- if ((i = whatitem("wear"))=='\33') return;
- if (i != '.')
- {
- if (i=='*') showwear(); else
- switch(iven[i-'a'])
- {
- case 0: ydhi(i); return;
- case OLEATHER: case OCHAIN: case OPLATE: case OSTUDLEATHER:
- case ORING: case OSPLINT: case OPLATEARMOR: case OSSPLATE:
- if (c[WEAR] != -1) { lprcat("\nYou're already wearing some armor"); return; }
- c[WEAR]=i-'a'; bottomline(); return;
- case OSHIELD: if (c[SHIELD] != -1) { lprcat("\nYou are already wearing a shield"); return; }
- if (iven[c[WIELD]]==O2SWORD) { lprcat("\nYour hands are busy with the two handed sword!"); return; }
- c[SHIELD] = i-'a'; bottomline(); return;
- default: lprcat("\nYou can't wear that!");
+{
+ int i;
+
+ while (1) {
+ if ((i = whatitem("wear")) == '\33')
+ return;
+ if (i != '.') {
+ if (i == '*')
+ showwear();
+ else
+ switch (iven[i - 'a']) {
+ case 0:
+ ydhi(i);
+ return;
+ case OLEATHER:
+ case OCHAIN:
+ case OPLATE:
+ case OSTUDLEATHER:
+ case ORING:
+ case OSPLINT:
+ case OPLATEARMOR:
+ case OSSPLATE:
+ if (c[WEAR] != -1) {
+ lprcat("\nYou're already wearing some armor");
+ return;
+ }
+ c[WEAR] = i - 'a';
+ bottomline();
+ return;
+ case OSHIELD:
+ if (c[SHIELD] != -1) {
+ lprcat("\nYou are already wearing a shield");
+ return;
+ }
+ if (iven[c[WIELD]] == O2SWORD) {
+ lprcat("\nYour hands are busy with the two handed sword!");
+ return;
+ }
+ c[SHIELD] = i - 'a';
+ bottomline();
+ return;
+ default:
+ lprcat("\nYou can't wear that!");
};
- }
}
}
+}
/*
- function to drop an object
+ * function to drop an object
*/
+void
dropobj()
- {
- register int i;
- register char *p;
- long amt;
+{
+ int i;
+ char *p;
+ long amt;
+
p = &item[playerx][playery];
- while (1)
- {
- if ((i = whatitem("drop"))=='\33') return;
- if (i=='*') showstr(); else
- {
- if (i=='.') /* drop some gold */
- {
- if (*p) { lprcat("\nThere's something here already!"); return; }
+ while (1) {
+ if ((i = whatitem("drop")) == '\33')
+ return;
+ if (i == '*')
+ showstr();
+ else {
+ if (i == '.') { /* drop some gold */
+ if (*p) {
+ lprcat("\nThere's something here already!");
+ return;
+ }
lprcat("\n\n");
- cl_dn(1,23);
+ cl_dn(1, 23);
lprcat("How much gold do you drop? ");
- if ((amt=readnum((long)c[GOLD])) == 0) return;
- if (amt>c[GOLD])
- { lprcat("\nYou don't have that much!"); return; }
- if (amt<=32767)
- { *p=OGOLDPILE; i=amt; }
- else if (amt<=327670L)
- { *p=ODGOLD; i=amt/10; amt = 10*i; }
- else if (amt<=3276700L)
- { *p=OMAXGOLD; i=amt/100; amt = 100*i; }
- else if (amt<=32767000L)
- { *p=OKGOLD; i=amt/1000; amt = 1000*i; }
- else
- { *p=OKGOLD; i=32767; amt = 32767000L; }
- c[GOLD] -= amt;
- lprintf("You drop %d gold pieces",(long)amt);
- iarg[playerx][playery]=i; bottomgold();
- know[playerx][playery]=0; dropflag=1; return;
+ if ((amt = readnum((long) c[GOLD])) == 0)
+ return;
+ if (amt > c[GOLD]) {
+ lprcat("\nYou don't have that much!");
+ return;
}
- drop_object(i-'a');
- return;
+ if (amt <= 32767) {
+ *p = OGOLDPILE;
+ i = amt;
+ } else if (amt <= 327670L) {
+ *p = ODGOLD;
+ i = amt / 10;
+ amt = 10 * i;
+ } else if (amt <= 3276700L) {
+ *p = OMAXGOLD;
+ i = amt / 100;
+ amt = 100 * i;
+ } else if (amt <= 32767000L) {
+ *p = OKGOLD;
+ i = amt / 1000;
+ amt = 1000 * i;
+ } else {
+ *p = OKGOLD;
+ i = 32767;
+ amt = 32767000L;
+ }
+ c[GOLD] -= amt;
+ lprintf("You drop %d gold pieces", (long) amt);
+ iarg[playerx][playery] = i;
+ bottomgold();
+ know[playerx][playery] = 0;
+ dropflag = 1;
+ return;
}
+ drop_object(i - 'a');
+ return;
}
}
+}
/*
* readscr() Subroutine to read a scroll one is carrying
*/
+void
readscr()
- {
- register int i;
- while (1)
- {
- if ((i = whatitem("read"))=='\33') return;
- if (i != '.')
- {
- if (i=='*') showread(); else
- {
- if (iven[i-'a']==OSCROLL) { read_scroll(ivenarg[i-'a']); iven[i-'a']=0; return; }
- if (iven[i-'a']==OBOOK) { readbook(ivenarg[i-'a']); iven[i-'a']=0; return; }
- if (iven[i-'a']==0) { ydhi(i); return; }
- lprcat("\nThere's nothing on it to read"); return;
+{
+ int i;
+
+ while (1) {
+ if ((i = whatitem("read")) == '\33')
+ return;
+ if (i != '.') {
+ if (i == '*')
+ showread();
+ else {
+ if (iven[i - 'a'] == OSCROLL) {
+ read_scroll(ivenarg[i - 'a']);
+ iven[i - 'a'] = 0;
+ return;
+ }
+ if (iven[i - 'a'] == OBOOK) {
+ readbook(ivenarg[i - 'a']);
+ iven[i - 'a'] = 0;
+ return;
}
+ if (iven[i - 'a'] == 0) {
+ ydhi(i);
+ return;
+ }
+ lprcat("\nThere's nothing on it to read");
+ return;
}
}
}
+}
/*
* subroutine to eat a cookie one is carrying
*/
+void
eatcookie()
{
-register int i;
-char *p;
-while (1)
- {
- if ((i = whatitem("eat"))=='\33') return;
- if (i != '.')
- if (i=='*') showeat(); else
- {
- if (iven[i-'a']==OCOOKIE)
- {
- lprcat("\nThe cookie was delicious.");
- iven[i-'a']=0;
- if (!c[BLINDCOUNT])
- {
- if (p=fortune())
- {
- lprcat(" Inside you find a scrap of paper that says:\n");
- lprcat(p);
+ int i;
+ char *p;
+
+ while (1) {
+ if ((i = whatitem("eat")) == '\33')
+ return;
+ if (i != '.') {
+ if (i == '*')
+ showeat();
+ else {
+ if (iven[i - 'a'] == OCOOKIE) {
+ lprcat("\nThe cookie was delicious.");
+ iven[i - 'a'] = 0;
+ if (!c[BLINDCOUNT]) {
+ if ((p = fortune()) != NULL) {
+ lprcat(" Inside you find a scrap of paper that says:\n");
+ lprcat(p);
}
}
- return;
+ return;
+ }
+ if (iven[i - 'a'] == 0) {
+ ydhi(i);
+ return;
}
- if (iven[i-'a']==0) { ydhi(i); return; }
- lprcat("\nYou can't eat that!"); return;
+ lprcat("\nYou can't eat that!");
+ return;
}
+ }
}
}
/*
* subroutine to quaff a potion one is carrying
*/
+void
quaff()
- {
- register int i;
- while (1)
- {
- if ((i = whatitem("quaff"))=='\33') return;
- if (i != '.')
- {
- if (i=='*') showquaff(); else
- {
- if (iven[i-'a']==OPOTION) { quaffpotion(ivenarg[i-'a']); iven[i-'a']=0; return; }
- if (iven[i-'a']==0) { ydhi(i); return; }
- lprcat("\nYou wouldn't want to quaff that, would you? "); return;
+{
+ int i;
+
+ while (1) {
+ if ((i = whatitem("quaff")) == '\33')
+ return;
+ if (i != '.') {
+ if (i == '*')
+ showquaff();
+ else {
+ if (iven[i - 'a'] == OPOTION) {
+ quaffpotion(ivenarg[i - 'a']);
+ iven[i - 'a'] = 0;
+ return;
+ }
+ if (iven[i - 'a'] == 0) {
+ ydhi(i);
+ return;
}
+ lprcat("\nYou wouldn't want to quaff that, would you? ");
+ return;
}
}
}
+}
/*
- function to ask what player wants to do
+ * function to ask what player wants to do
*/
+int
whatitem(str)
- char *str;
- {
- int i;
- cursors(); lprintf("\nWhat do you want to %s [* for all] ? ",str);
- i=0; while (i>'z' || (i<'a' && i!='*' && i!='\33' && i!='.')) i=getchar();
- if (i=='\33') lprcat(" aborted");
- return(i);
- }
+ char *str;
+{
+ int i;
+
+ cursors();
+ lprintf("\nWhat do you want to %s [* for all] ? ", str);
+ i = 0;
+ while (i > 'z' || (i < 'a' && i != '*' && i != '\33' && i != '.'))
+ i = lgetchar();
+ if (i == '\33')
+ lprcat(" aborted");
+ return (i);
+}
/*
- subroutine to get a number from the player
- and allow * to mean return amt, else return the number entered
+ * subroutine to get a number from the player
+ * and allow * to mean return amt, else return the number entered
*/
-unsigned long readnum(mx)
- long mx;
- {
- register int i;
- register unsigned long amt=0;
+unsigned long
+readnum(mx)
+ long mx;
+{
+ int i;
+
+ unsigned long amt = 0;
sncbr();
- if ((i=getchar()) == '*') amt = mx; /* allow him to say * for all gold */
+ if ((i = lgetchar()) == '*')
+ amt = mx; /* allow him to say * for all gold */
else
- while (i != '\n')
- {
- if (i=='\033') { scbr(); lprcat(" aborted"); return(0); }
- if ((i <= '9') && (i >= '0') && (amt<99999999))
- amt = amt*10+i-'0';
- i = getchar();
+ while (i != '\n') {
+ if (i == '\033') {
+ scbr();
+ lprcat(" aborted");
+ return (0);
}
- scbr(); return(amt);
- }
+ if ((i <= '9') && (i >= '0') && (amt < 99999999))
+ amt = amt * 10 + i - '0';
+ i = lgetchar();
+ }
+ scbr();
+ return (amt);
+}
#ifdef HIDEBYLINK
/*
* routine to zero every byte in a string
*/
+void
szero(str)
- register char *str;
- {
+ char *str;
+{
while (*str)
*str++ = 0;
- }
-#endif HIDEBYLINK
+}
+#endif /* HIDEBYLINK */
diff --git a/games/larn/monster.c b/games/larn/monster.c
index 9eb76a57889..fd4d2871d53 100644
--- a/games/larn/monster.c
+++ b/games/larn/monster.c
@@ -1,1392 +1,1935 @@
-#ifndef lint
-static char rcsid[] = "$NetBSD: monster.c,v 1.4 1995/04/24 12:24:05 cgd Exp $";
-#endif /* not lint */
+/* $OpenBSD: monster.c,v 1.3 1998/09/15 05:12:32 pjanzen Exp $ */
+/* $NetBSD: monster.c,v 1.5 1997/10/18 20:03:29 christos Exp $ */
/*
- * monster.c Larn is copyrighted 1986 by Noah Morgan.
+ * monster.c Larn is copyrighted 1986 by Noah Morgan.
*
- * This file contains the following functions:
- * ----------------------------------------------------------------------------
+ * This file contains the following functions:
+ * ----------------------------------------------------------------------------
*
- * createmonster(monstno) Function to create a monster next to the player
- * int monstno;
+ * createmonster(monstno) Function to create a monster next to the player
+ * int monstno;
*
- * int cgood(x,y,itm,monst) Function to check location for emptiness
- * int x,y,itm,monst;
+ * int cgood(x,y,itm,monst)Function to check location for emptiness
+ * int x,y,itm,monst;
*
- * createitem(it,arg) Routine to place an item next to the player
- * int it,arg;
+ * createitem(it,arg) Routine to place an item next to the player
+ * int it,arg;
*
- * cast() Subroutine called by parse to cast a spell for the user
+ * cast() Subroutine called by parse to cast a spell for the user
*
- * speldamage(x) Function to perform spell functions cast by the player
- * int x;
+ * speldamage(x) Function to perform spell functions cast by the player
+ * int x;
*
- * loseint() Routine to decrement your int (intelligence) if > 3
+ * loseint() Routine to decrement your int (intelligence) if > 3
*
- * isconfuse() Routine to check to see if player is confused
+ * isconfuse() Routine to check to see if player is confused
*
- * nospell(x,monst) Routine to return 1 if a spell doesn't affect a monster
- * int x,monst;
+ * nospell(x,monst) Routine to return 1 if a spell doesn't affect a monster
+ * int x,monst;
*
- * fullhit(xx) Function to return full damage against a monst (aka web)
- * int xx;
+ * fullhit(xx) Function to return full damage against a monst (aka web)
+ * int xx;
*
- * direct(spnum,dam,str,arg) Routine to direct spell damage 1 square in 1 dir
- * int spnum,dam,arg;
- * char *str;
+ * direct(spnum,dam,str,arg)Routine to direct spell damage 1 square in 1 dir
+ * int spnum,dam,arg;
+ * char *str;
*
- * godirect(spnum,dam,str,delay,cshow) Function to perform missile attacks
- * int spnum,dam,delay;
- * char *str,cshow;
+ * godirect(spnum,dam,str,delay,cshow) Function to perform missile attacks
+ * int spnum,dam,delay;
+ * char *str,cshow;
*
- * ifblind(x,y) Routine to put "monster" or the monster name into lastmosnt
- * int x,y;
+ * ifblind(x,y) Routine to put "monster" or the monster name into lastmosnt
+ * int x,y;
*
- * tdirect(spnum) Routine to teleport away a monster
- * int spnum;
+ * tdirect(spnum) Routine to teleport away a monster
+ * int spnum;
*
- * omnidirect(sp,dam,str) Routine to damage all monsters 1 square from player
- * int sp,dam;
- * char *str;
+ * omnidirect(sp,dam,str) Routine to damage all monsters 1 square from player
+ * int sp,dam;
+ * char *str;
*
- * dirsub(x,y) Routine to ask for direction, then modify x,y for it
- * int *x,*y;
+ * dirsub(x,y) Routine to ask for direction, then modify x,y for it
+ * int *x,*y;
*
- * vxy(x,y) Routine to verify/fix (*x,*y) for being within bounds
- * int *x,*y;
+ * vxy(x,y) Routine to verify/fix (*x,*y) for being within bounds
+ * int *x,*y;
*
- * dirpoly(spnum) Routine to ask for a direction and polymorph a monst
- * int spnum;
+ * dirpoly(spnum) Routine to ask for a direction and polymorph a monst
+ * int spnum;
*
- * hitmonster(x,y) Function to hit a monster at the designated coordinates
- * int x,y;
+ * hitmonster(x,y) Function to hit a monster at the designated coordinates
+ * int x,y;
*
- * hitm(x,y,amt) Function to just hit a monster at a given coordinates
- * int x,y,amt;
+ * hitm(x,y,amt) Function to just hit a monster at a given coordinates
+ * int x,y,amt;
*
- * hitplayer(x,y) Function for the monster to hit the player from (x,y)
- * int x,y;
+ * hitplayer(x,y) Function for the monster to hit the player from (x,y)
+ * int x,y;
*
- * dropsomething(monst) Function to create an object when a monster dies
- * int monst;
+ * dropsomething(monst) Function to create an object when a monster dies
+ * int monst;
*
- * dropgold(amount) Function to drop some gold around player
- * int amount;
+ * dropgold(amount) Function to drop some gold around player
+ * int amount;
*
- * something(level) Function to create a random item around player
- * int level;
+ * something(level) Function to create a random item around player
+ * int level;
*
- * newobject(lev,i) Routine to return a randomly selected new object
- * int lev,*i;
+ * newobject(lev,i) Routine to return a randomly selected new object
+ * int lev,*i;
*
- * spattack(atckno,xx,yy) Function to process special attacks from monsters
- * int atckno,xx,yy;
+ * spattack(atckno,xx,yy) Function to process special attacks from monsters
+ * int atckno,xx,yy;
*
- * checkloss(x) Routine to subtract hp from user and flag bottomline display
- * int x;
+ * checkloss(x) Routine to subtract hp from user and flag bottomline display
+ * int x;
*
- * annihilate() Routine to annihilate monsters around player, playerx,playery
+ * annihilate() Routine to annihilate monsters around player, playerx,playery
*
- * newsphere(x,y,dir,lifetime) Function to create a new sphere of annihilation
- * int x,y,dir,lifetime;
+ * newsphere(x,y,dir,lifetime) Function to create a new sphere of annihilation
+ * int x,y,dir,lifetime;
*
- * rmsphere(x,y) Function to delete a sphere of annihilation from list
- * int x,y;
+ * rmsphere(x,y) Function to delete a sphere of annihilation from list
+ * int x,y;
*
- * sphboom(x,y) Function to perform the effects of a sphere detonation
- * int x,y;
+ * sphboom(x,y) Function to perform the effects of a sphere detonation
+ * int x,y;
*
- * genmonst() Function to ask for monster and genocide from game
+ * genmonst() Function to ask for monster and genocide from game
*
*/
-#include "header.h"
+#ifndef lint
+static char rcsid[] = "$OpenBSD: monster.c,v 1.3 1998/09/15 05:12:32 pjanzen Exp $";
+#endif /* not lint */
+
#include <string.h>
+#include <stdlib.h>
+#include "header.h"
+#include "extern.h"
-struct isave /* used for altar reality */
- {
- char type; /* 0=item, 1=monster */
- char id; /* item number or monster number */
- short arg; /* the type of item or hitpoints of monster */
- };
+struct isave { /* used for altar reality */
+ char type; /* 0=item, 1=monster */
+ char id; /* item number or monster number */
+ short arg; /* the type of item or hitpoints of monster */
+};
+static int dirsub __P((int *, int *));
/*
- * createmonster(monstno) Function to create a monster next to the player
- * int monstno;
+ * createmonster(monstno) Function to create a monster next to the player
+ * int monstno;
*
- * Enter with the monster number (1 to MAXMONST+8)
- * Returns no value.
+ * Enter with the monster number (1 to MAXMONST+8)
+ * Returns no value.
*/
+void
createmonster(mon)
- int mon;
- {
- register int x,y,k,i;
- if (mon<1 || mon>MAXMONST+8) /* check for monster number out of bounds */
- {
- beep(); lprintf("\ncan't createmonst(%d)\n",(long)mon); nap(3000); return;
- }
- while (monster[mon].genocided && mon<MAXMONST) mon++; /* genocided? */
- for (k=rnd(8), i= -8; i<0; i++,k++) /* choose direction, then try all */
- {
- if (k>8) k=1; /* wraparound the diroff arrays */
- x = playerx + diroffx[k]; y = playery + diroffy[k];
- if (cgood(x,y,0,1)) /* if we can create here */
- {
+ int mon;
+{
+ int x, y, k, i;
+
+ if (mon < 1 || mon > MAXMONST + 8) { /* check for monster number
+ * out of bounds */
+ lbeep();
+ lprintf("\ncan't createmonst(%d)\n", (long) mon);
+ nap(3000);
+ return;
+ }
+ while (monster[mon].genocided && mon < MAXMONST)
+ mon++; /* genocided? */
+ for (k = rnd(8), i = -8; i < 0; i++, k++) { /* choose direction,
+ * then try all */
+ if (k > 8)
+ k = 1; /* wraparound the diroff arrays */
+ x = playerx + diroffx[k];
+ y = playery + diroffy[k];
+ if (cgood(x, y, 0, 1)) { /* if we can create here */
mitem[x][y] = mon;
hitp[x][y] = monster[mon].hitpoints;
- stealth[x][y]=know[x][y]=0;
- switch(mon)
- {
- case ROTHE: case POLTERGEIST: case VAMPIRE: stealth[x][y]=1;
- };
+ stealth[x][y] = know[x][y] = 0;
+ switch (mon) {
+ case ROTHE:
+ case POLTERGEIST:
+ case VAMPIRE:
+ stealth[x][y] = 1;
+ };
return;
- }
}
}
+}
/*
- * int cgood(x,y,itm,monst) Function to check location for emptiness
- * int x,y,itm,monst;
- *
- * Routine to return TRUE if a location does not have itm or monst there
- * returns FALSE (0) otherwise
- * Enter with itm or monst TRUE or FALSE if checking it
- * Example: if itm==TRUE check for no item at this location
- * if monst==TRUE check for no monster at this location
- * This routine will return FALSE if at a wall or the dungeon exit on level 1
+ * int cgood(x,y,itm,monst) Function to check location for emptiness
+ * int x,y,itm,monst;
+ *
+ * Routine to return TRUE if a location does not have itm or monst there
+ * returns FALSE (0) otherwise
+ * Enter with itm or monst TRUE or FALSE if checking it
+ * Example: if itm==TRUE check for no item at this location
+ * if monst==TRUE check for no monster at this location
+ * This routine will return FALSE if at a wall or the dungeon exit on level 1
*/
-int cgood(x,y,itm,monst)
- register int x,y;
- int itm,monst;
- {
- if ((y>=0) && (y<=MAXY-1) && (x>=0) && (x<=MAXX-1)) /* within bounds? */
- if (item[x][y]!=OWALL) /* can't make anything on walls */
- if (itm==0 || (item[x][y]==0)) /* is it free of items? */
- if (monst==0 || (mitem[x][y]==0)) /* is it free of monsters? */
- if ((level!=1) || (x!=33) || (y!=MAXY-1)) /* not exit to level 1 */
- return(1);
- return(0);
- }
+int
+cgood(x, y, itm, monst)
+ int x, y;
+ int itm, monst;
+{
+ if ((y >= 0) && (y <= MAXY - 1) && (x >= 0) && (x <= MAXX - 1))
+ /* within bounds? */
+ if (item[x][y] != OWALL) /* can't make anything on walls */
+ /* is it free of items? */
+ if (itm == 0 || (item[x][y] == 0))
+ /* is it free of monsters? */
+ if (monst == 0 || (mitem[x][y] == 0))
+ if ((level != 1) || (x != 33) ||
+ (y != MAXY - 1))
+ /* not exit to level 1 */
+ return (1);
+ return (0);
+}
/*
- * createitem(it,arg) Routine to place an item next to the player
- * int it,arg;
+ * createitem(it,arg) Routine to place an item next to the player
+ * int it,arg;
*
- * Enter with the item number and its argument (iven[], ivenarg[])
- * Returns no value, thus we don't know about createitem() failures.
+ * Enter with the item number and its argument (iven[], ivenarg[])
+ * Returns no value, thus we don't know about createitem() failures.
*/
-createitem(it,arg)
- int it,arg;
- {
- register int x,y,k,i;
- if (it >= MAXOBJ) return; /* no such object */
- for (k=rnd(8), i= -8; i<0; i++,k++) /* choose direction, then try all */
- {
- if (k>8) k=1; /* wraparound the diroff arrays */
- x = playerx + diroffx[k]; y = playery + diroffy[k];
- if (cgood(x,y,1,0)) /* if we can create here */
- {
- item[x][y] = it; know[x][y]=0; iarg[x][y]=arg; return;
- }
+void
+createitem(it, arg)
+ int it, arg;
+{
+ int x, y, k, i;
+
+ if (it >= MAXOBJ)
+ return; /* no such object */
+ for (k = rnd(8), i = -8; i < 0; i++, k++) { /* choose direction,
+ * then try all */
+ if (k > 8)
+ k = 1; /* wraparound the diroff arrays */
+ x = playerx + diroffx[k];
+ y = playery + diroffy[k];
+ if (cgood(x, y, 1, 0)) { /* if we can create here */
+ item[x][y] = it;
+ know[x][y] = 0;
+ iarg[x][y] = arg;
+ return;
}
}
+}
/*
- * cast() Subroutine called by parse to cast a spell for the user
+ * cast() Subroutine called by parse to cast a spell for the user
*
- * No arguments and no return value.
+ * No arguments and no return value.
*/
-static char eys[] = "\nEnter your spell: ";
+static char eys[] = "\nEnter your spell: ";
+void
cast()
- {
- register int i,j,a,b,d;
+{
+ int i, j, a, b, d;
+
cursors();
- if (c[SPELLS]<=0) { lprcat("\nYou don't have any spells!"); return; }
- lprcat(eys); --c[SPELLS];
- while ((a=getchar())=='D')
- { seemagic(-1); cursors(); lprcat(eys); }
- if (a=='\33') goto over; /* to escape casting a spell */
- if ((b=getchar())=='\33') goto over; /* to escape casting a spell */
- if ((d=getchar())=='\33')
- { over: lprcat(aborted); c[SPELLS]++; return; } /* to escape casting a spell */
+ if (c[SPELLS] <= 0) {
+ lprcat("\nYou don't have any spells!");
+ return;
+ }
+ lprcat(eys);
+ --c[SPELLS];
+ while ((a = lgetchar()) == 'D') {
+ seemagic(-1);
+ cursors();
+ lprcat(eys);
+ }
+ if (a == '\33')
+ goto over; /* to escape casting a spell */
+ if ((b = lgetchar()) == '\33')
+ goto over; /* to escape casting a spell */
+ if ((d = lgetchar()) == '\33') {
+over: lprcat(aborted);
+ c[SPELLS]++;
+ return;
+ } /* to escape casting a spell */
#ifdef EXTRA
c[SPELLSCAST]++;
#endif
- for (lprc('\n'),j= -1,i=0; i<SPNUM; i++) /*seq search for his spell, hash?*/
- if ((spelcode[i][0]==a) && (spelcode[i][1]==b) && (spelcode[i][2]==d))
- if (spelknow[i])
- { speldamage(i); j = 1; i=SPNUM; }
-
- if (j == -1) lprcat(" Nothing Happened ");
+ for (lprc('\n'), j = -1, i = 0; i < SPNUM; i++) /* seq search for his
+ * spell, hash? */
+ if ((spelcode[i][0] == a) && (spelcode[i][1] == b) && (spelcode[i][2] == d))
+ if (spelknow[i]) {
+ speldamage(i);
+ j = 1;
+ i = SPNUM;
+ }
+ if (j == -1)
+ lprcat(" Nothing Happened ");
bottomline();
- }
-
-static int dirsub();
+}
/*
- * speldamage(x) Function to perform spell functions cast by the player
- * int x;
+ * speldamage(x) Function to perform spell functions cast by the player
+ * int x;
*
- * Enter with the spell number, returns no value.
- * Please insure that there are 2 spaces before all messages here
+ * Enter with the spell number, returns no value.
+ * Please insure that there are 2 spaces before all messages here
*/
+void
speldamage(x)
- int x;
- {
- register int i,j,clev;
- int xl,xh,yl,yh;
- register char *p,*kn,*pm;
- if (x>=SPNUM) return; /* no such spell */
- if (c[TIMESTOP]) { lprcat(" It didn't seem to work"); return; } /* not if time stopped */
+ int x;
+{
+ int i, j, clev;
+ int xl, xh, yl, yh;
+ char *p, *kn, *pm;
+
+ if (x >= SPNUM)
+ return; /* no such spell */
+ if (c[TIMESTOP]) {
+ lprcat(" It didn't seem to work");
+ return;
+ } /* not if time stopped */
clev = c[LEVEL];
- if ((rnd(23)==7) || (rnd(18) > c[INTELLIGENCE]))
- { lprcat(" It didn't work!"); return; }
- if (clev*3+2 < x) { lprcat(" Nothing happens. You seem inexperienced at this"); return; }
+ if ((rnd(23) == 7) || (rnd(18) > c[INTELLIGENCE])) {
+ lprcat(" It didn't work!");
+ return;
+ }
+ if (clev * 3 + 2 < x) {
+ lprcat(" Nothing happens. You seem inexperienced at this");
+ return;
+ }
+ switch (x) {
+ /* ----- LEVEL 1 SPELLS ----- */
- switch(x)
- {
-/* ----- LEVEL 1 SPELLS ----- */
+ case 0:
+ if (c[PROTECTIONTIME] == 0)
+ c[MOREDEFENSES] += 2; /* protection field +2 */
+ c[PROTECTIONTIME] += 250;
+ return;
- case 0: if (c[PROTECTIONTIME]==0) c[MOREDEFENSES]+=2; /* protection field +2 */
- c[PROTECTIONTIME] += 250; return;
+ case 1:
+ i = rnd(((clev + 1) << 1)) + clev + 3;
+ godirect(x, i, (clev >= 2) ? " Your missiles hit the %s" : " Your missile hit the %s", 100, '+'); /* magic missile */
- case 1: i = rnd(((clev+1)<<1)) + clev + 3;
- godirect(x,i,(clev>=2)?" Your missiles hit the %s":" Your missile hit the %s",100,'+'); /* magic missile */
+ return;
- return;
+ case 2:
+ if (c[DEXCOUNT] == 0)
+ c[DEXTERITY] += 3; /* dexterity */
+ c[DEXCOUNT] += 400;
+ return;
- case 2: if (c[DEXCOUNT]==0) c[DEXTERITY]+=3; /* dexterity */
- c[DEXCOUNT] += 400; return;
+ case 3:
+ i = rnd(3) + 1;
+ p = " While the %s slept, you smashed it %d times";
+ws: direct(x, fullhit(i), p, i); /* sleep */
+ return;
- case 3: i=rnd(3)+1;
- p=" While the %s slept, you smashed it %d times";
- ws: direct(x,fullhit(i),p,i); /* sleep */ return;
+ case 4: /* charm monster */
+ c[CHARMCOUNT] += c[CHARISMA] << 1;
+ return;
- case 4: /* charm monster */ c[CHARMCOUNT] += c[CHARISMA]<<1; return;
+ case 5:
+ godirect(x, rnd(10) + 15 + clev, " The sound damages the %s", 70, '@'); /* sonic spear */
+ return;
- case 5: godirect(x,rnd(10)+15+clev," The sound damages the %s",70,'@'); /* sonic spear */
- return;
+ /* ----- LEVEL 2 SPELLS ----- */
-/* ----- LEVEL 2 SPELLS ----- */
+ case 6:
+ i = rnd(3) + 2;
+ p = " While the %s is entangled, you hit %d times";
+ goto ws; /* web */
- case 6: i=rnd(3)+2; p=" While the %s is entangled, you hit %d times";
- goto ws; /* web */
+ case 7:
+ if (c[STRCNT] == 0)
+ c[STREXTRA] += 3; /* strength */
+ c[STRCNT] += 150 + rnd(100);
+ return;
- case 7: if (c[STRCOUNT]==0) c[STREXTRA]+=3; /* strength */
- c[STRCOUNT] += 150+rnd(100); return;
+ case 8:
+ yl = playery - 5; /* enlightenment */
+ yh = playery + 6;
+ xl = playerx - 15;
+ xh = playerx + 16;
+ vxy(&xl, &yl);
+ vxy(&xh, &yh); /* check bounds */
+ for (i = yl; i <= yh; i++) /* enlightenment */
+ for (j = xl; j <= xh; j++)
+ know[j][i] = 1;
+ draws(xl, xh + 1, yl, yh + 1);
+ return;
+
+ case 9:
+ raisehp(20 + (clev << 1));
+ return; /* healing */
+
+ case 10:
+ c[BLINDCOUNT] = 0;
+ return; /* cure blindness */
+
+ case 11:
+ createmonster(makemonst(level + 1) + 8);
+ return;
+
+ case 12:
+ if (rnd(11) + 7 <= c[WISDOM])
+ direct(x, rnd(20) + 20 + clev, " The %s believed!", 0);
+ else
+ lprcat(" It didn't believe the illusions!");
+ return;
- case 8: yl = playery-5; /* enlightenment */
- yh = playery+6; xl = playerx-15; xh = playerx+16;
- vxy(&xl,&yl); vxy(&xh,&yh); /* check bounds */
- for (i=yl; i<=yh; i++) /* enlightenment */
- for (j=xl; j<=xh; j++) know[j][i]=1;
- draws(xl,xh+1,yl,yh+1); return;
+ case 13: /* if he has the amulet of invisibility then
+ * add more time */
+ for (j = i = 0; i < 26; i++)
+ if (iven[i] == OAMULET)
+ j += 1 + ivenarg[i];
+ c[INVISIBILITY] += (j << 7) + 12;
+ return;
- case 9: raisehp(20+(clev<<1)); return; /* healing */
+ /* ----- LEVEL 3 SPELLS ----- */
- case 10: c[BLINDCOUNT]=0; return; /* cure blindness */
+ case 14:
+ godirect(x, rnd(25 + clev) + 25 + clev, " The fireball hits the %s", 40, '*');
+ return; /* fireball */
- case 11: createmonster(makemonst(level+1)+8); return;
+ case 15:
+ godirect(x, rnd(25) + 20 + clev, " Your cone of cold strikes the %s", 60, 'O'); /* cold */
+ return;
- case 12: if (rnd(11)+7 <= c[WISDOM]) direct(x,rnd(20)+20+clev," The %s believed!",0);
- else lprcat(" It didn't believe the illusions!");
- return;
+ case 16:
+ dirpoly(x);
+ return; /* polymorph */
- case 13: /* if he has the amulet of invisibility then add more time */
- for (j=i=0; i<26; i++)
- if (iven[i]==OAMULET) j+= 1+ivenarg[i];
- c[INVISIBILITY] += (j<<7)+12; return;
+ case 17:
+ c[CANCELLATION] += 5 + clev;
+ return; /* cancellation */
-/* ----- LEVEL 3 SPELLS ----- */
+ case 18:
+ c[HASTESELF] += 7 + clev;
+ return; /* haste self */
- case 14: godirect(x,rnd(25+clev)+25+clev," The fireball hits the %s",40,'*'); return; /* fireball */
+ case 19:
+ omnidirect(x, 30 + rnd(10), " The %s gasps for air"); /* cloud kill */
+ return;
- case 15: godirect(x,rnd(25)+20+clev," Your cone of cold strikes the %s",60,'O'); /* cold */
- return;
+ case 20:
+ xh = min(playerx + 1, MAXX - 2);
+ yh = min(playery + 1, MAXY - 2);
+ for (i = max(playerx - 1, 1); i <= xh; i++) /* vaporize rock */
+ for (j = max(playery - 1, 1); j <= yh; j++) {
+ kn = &know[i][j];
+ pm = &mitem[i][j];
+ switch (*(p = &item[i][j])) {
+ case OWALL:
+ if (level < MAXLEVEL + MAXVLEVEL - 1)
+ *p = *kn = 0;
+ break;
- case 16: dirpoly(x); return; /* polymorph */
+ case OSTATUE:
+ if (c[HARDGAME] < 3) {
+ *p = OBOOK;
+ iarg[i][j] = level;
+ *kn = 0;
+ }
+ break;
- case 17: c[CANCELLATION]+= 5+clev; return; /* cancellation */
+ case OTHRONE:
+ *pm = GNOMEKING;
+ *kn = 0;
+ *p = OTHRONE2;
+ hitp[i][j] = monster[GNOMEKING].hitpoints;
+ break;
- case 18: c[HASTESELF]+= 7+clev; return; /* haste self */
+ case OALTAR:
+ *pm = DEMONPRINCE;
+ *kn = 0;
+ hitp[i][j] = monster[DEMONPRINCE].hitpoints;
+ break;
+ };
+ switch (*pm) {
+ case XORN:
+ ifblind(i, j);
+ hitm(i, j, 200);
+ break; /* Xorn takes damage from vpr */
+ }
+ }
+ return;
- case 19: omnidirect(x,30+rnd(10)," The %s gasps for air"); /* cloud kill */
- return;
+ /* ----- LEVEL 4 SPELLS ----- */
- case 20: xh = min(playerx+1,MAXX-2); yh = min(playery+1,MAXY-2);
- for (i=max(playerx-1,1); i<=xh; i++) /* vaporize rock */
- for (j=max(playery-1,1); j<=yh; j++)
- {
- kn = &know[i][j]; pm = &mitem[i][j];
- switch(*(p= &item[i][j]))
- {
- case OWALL: if (level < MAXLEVEL+MAXVLEVEL-1)
- *p = *kn = 0;
- break;
+ case 21:
+ direct(x, 100 + clev, " The %s shrivels up", 0); /* dehydration */
+ return;
- case OSTATUE: if (c[HARDGAME]<3)
- {
- *p=OBOOK; iarg[i][j]=level; *kn=0;
- }
- break;
-
- case OTHRONE: *pm=GNOMEKING; *kn=0; *p= OTHRONE2;
- hitp[i][j]=monster[GNOMEKING].hitpoints; break;
+ case 22:
+ godirect(x, rnd(25) + 20 + (clev << 1), " A lightning bolt hits the %s", 1, '~'); /* lightning */
+ return;
- case OALTAR: *pm=DEMONPRINCE; *kn=0;
- hitp[i][j]=monster[DEMONPRINCE].hitpoints; break;
- };
- switch(*pm)
- {
- case XORN: ifblind(i,j); hitm(i,j,200); break; /* Xorn takes damage from vpr */
- }
- }
- return;
+ case 23:
+ i = min(c[HP] - 1, c[HPMAX] / 2); /* drain life */
+ direct(x, i + i, "", 0);
+ c[HP] -= i;
+ return;
-/* ----- LEVEL 4 SPELLS ----- */
+ case 24:
+ if (c[GLOBE] == 0)
+ c[MOREDEFENSES] += 10;
+ c[GLOBE] += 200;
+ loseint(); /* globe of invulnerability */
+ return;
- case 21: direct(x,100+clev," The %s shrivels up",0); /* dehydration */
- return;
+ case 25:
+ omnidirect(x, 32 + clev, " The %s struggles for air in your flood!"); /* flood */
+ return;
- case 22: godirect(x,rnd(25)+20+(clev<<1)," A lightning bolt hits the %s",1,'~'); /* lightning */
- return;
+ case 26:
+ if (rnd(151) == 63) {
+ lbeep();
+ lprcat("\nYour heart stopped!\n");
+ nap(4000);
+ died(270);
+ return;
+ }
+ if (c[WISDOM] > rnd(10) + 10)
+ direct(x, 2000, " The %s's heart stopped", 0); /* finger of death */
+ else
+ lprcat(" It didn't work");
+ return;
- case 23: i=min(c[HP]-1,c[HPMAX]/2); /* drain life */
- direct(x,i+i,"",0); c[HP] -= i; return;
+ /* ----- LEVEL 5 SPELLS ----- */
- case 24: if (c[GLOBE]==0) c[MOREDEFENSES] += 10;
- c[GLOBE] += 200; loseint(); /* globe of invulnerability */
- return;
+ case 27:
+ c[SCAREMONST] += rnd(10) + clev;
+ return; /* scare monster */
- case 25: omnidirect(x,32+clev," The %s struggles for air in your flood!"); /* flood */
- return;
+ case 28:
+ c[HOLDMONST] += rnd(10) + clev;
+ return; /* hold monster */
- case 26: if (rnd(151)==63) { beep(); lprcat("\nYour heart stopped!\n"); nap(4000); died(270); return; }
- if (c[WISDOM]>rnd(10)+10) direct(x,2000," The %s's heart stopped",0); /* finger of death */
- else lprcat(" It didn't work"); return;
+ case 29:
+ c[TIMESTOP] += rnd(20) + (clev << 1);
+ return; /* time stop */
-/* ----- LEVEL 5 SPELLS ----- */
+ case 30:
+ tdirect(x);
+ return; /* teleport away */
- case 27: c[SCAREMONST] += rnd(10)+clev; return; /* scare monster */
+ case 31:
+ omnidirect(x, 35 + rnd(10) + clev, " The %s cringes from the flame"); /* magic fire */
+ return;
- case 28: c[HOLDMONST] += rnd(10)+clev; return; /* hold monster */
+ /* ----- LEVEL 6 SPELLS ----- */
- case 29: c[TIMESTOP] += rnd(20)+(clev<<1); return; /* time stop */
+ case 32:
+ if ((rnd(23) == 5) && (wizard == 0)) { /* sphere of
+ * annihilation */
+ lbeep();
+ lprcat("\nYou have been enveloped by the zone of nothingness!\n");
+ nap(4000);
+ died(258);
+ return;
+ }
+ xl = playerx;
+ yl = playery;
+ loseint();
+ i = dirsub(&xl, &yl); /* get direction of sphere */
+ newsphere(xl, yl, i, rnd(20) + 11); /* make a sphere */
+ return;
- case 30: tdirect(x); return; /* teleport away */
+ case 33:
+ genmonst();
+ spelknow[33] = 0; /* genocide */
+ loseint();
+ return;
- case 31: omnidirect(x,35+rnd(10)+clev," The %s cringes from the flame"); /* magic fire */
- return;
+ case 34: /* summon demon */
+ if (rnd(100) > 30) {
+ direct(x, 150, " The demon strikes at the %s", 0);
+ return;
+ }
+ if (rnd(100) > 15) {
+ lprcat(" Nothing seems to have happened");
+ return;
+ }
+ lprcat(" The demon turned on you and vanished!");
+ lbeep();
+ i = rnd(40) + 30;
+ lastnum = 277;
+ losehp(i); /* must say killed by a demon */
+ return;
-/* ----- LEVEL 6 SPELLS ----- */
+ case 35: /* walk through walls */
+ c[WTW] += rnd(10) + 5;
+ return;
- case 32: if ((rnd(23)==5) && (wizard==0)) /* sphere of annihilation */
- {
- beep(); lprcat("\nYou have been enveloped by the zone of nothingness!\n");
- nap(4000); died(258); return;
- }
- xl=playerx; yl=playery;
- loseint();
- i=dirsub(&xl,&yl); /* get direction of sphere */
- newsphere(xl,yl,i,rnd(20)+11); /* make a sphere */
- return;
-
- case 33: genmonst(); spelknow[33]=0; /* genocide */
- loseint();
- return;
-
- case 34: /* summon demon */
- if (rnd(100) > 30) { direct(x,150," The demon strikes at the %s",0); return; }
- if (rnd(100) > 15) { lprcat(" Nothing seems to have happened"); return; }
- lprcat(" The demon turned on you and vanished!"); beep();
- i=rnd(40)+30; lastnum=277;
- losehp(i); /* must say killed by a demon */ return;
-
- case 35: /* walk through walls */
- c[WTW] += rnd(10)+5; return;
-
- case 36: /* alter reality */
- {
- struct isave *save; /* pointer to item save structure */
- int sc; sc=0; /* # items saved */
- save = (struct isave *)malloc(sizeof(struct isave)*MAXX*MAXY*2);
- for (j=0; j<MAXY; j++)
- for (i=0; i<MAXX; i++) /* save all items and monsters */
- {
- xl = item[i][j];
- if (xl && xl!=OWALL && xl!=OANNIHILATION)
- {
- save[sc].type=0; save[sc].id=item[i][j];
- save[sc++].arg=iarg[i][j];
- }
- if (mitem[i][j])
- {
- save[sc].type=1; save[sc].id=mitem[i][j];
- save[sc++].arg=hitp[i][j];
- }
- item[i][j]=OWALL; mitem[i][j]=0;
- if (wizard) know[i][j]=1; else know[i][j]=0;
- }
- eat(1,1); if (level==1) item[33][MAXY-1]=0;
- for (j=rnd(MAXY-2), i=1; i<MAXX-1; i++) item[i][j]=0;
- while (sc>0) /* put objects back in level */
- {
- --sc;
- if (save[sc].type == 0)
- {
- int trys;
- for (trys=100, i=j=1; --trys>0 && item[i][j]; i=rnd(MAXX-1), j=rnd(MAXY-1));
- if (trys) { item[i][j]=save[sc].id; iarg[i][j]=save[sc].arg; }
- }
- else
- { /* put monsters back in */
- int trys;
- for (trys=100, i=j=1; --trys>0 && (item[i][j]==OWALL || mitem[i][j]); i=rnd(MAXX-1), j=rnd(MAXY-1));
- if (trys) { mitem[i][j]=save[sc].id; hitp[i][j]=save[sc].arg; }
- }
- }
- loseint();
- draws(0,MAXX,0,MAXY); if (wizard==0) spelknow[36]=0;
- free((char*)save); positionplayer(); return;
+ case 36: /* alter reality */
+ {
+ struct isave *save; /* pointer to item save
+ * structure */
+ int sc;
+ sc = 0; /* # items saved */
+ save = (struct isave *) malloc(sizeof(struct isave) * MAXX * MAXY * 2);
+ for (j = 0; j < MAXY; j++)
+ for (i = 0; i < MAXX; i++) { /* save all items and
+ * monsters */
+ xl = item[i][j];
+ if (xl && xl != OWALL && xl != OANNIHILATION) {
+ save[sc].type = 0;
+ save[sc].id = item[i][j];
+ save[sc++].arg = iarg[i][j];
+ }
+ if (mitem[i][j]) {
+ save[sc].type = 1;
+ save[sc].id = mitem[i][j];
+ save[sc++].arg = hitp[i][j];
+ }
+ item[i][j] = OWALL;
+ mitem[i][j] = 0;
+ if (wizard)
+ know[i][j] = 1;
+ else
+ know[i][j] = 0;
+ }
+ eat(1, 1);
+ if (level == 1)
+ item[33][MAXY - 1] = 0;
+ for (j = rnd(MAXY - 2), i = 1; i < MAXX - 1; i++)
+ item[i][j] = 0;
+ while (sc > 0) { /* put objects back in level */
+ --sc;
+ if (save[sc].type == 0) {
+ int trys;
+ for (trys = 100, i = j = 1; --trys > 0 && item[i][j]; i = rnd(MAXX - 1), j = rnd(MAXY - 1));
+ if (trys) {
+ item[i][j] = save[sc].id;
+ iarg[i][j] = save[sc].arg;
+ }
+ } else { /* put monsters back in */
+ int trys;
+ for (trys = 100, i = j = 1; --trys > 0 && (item[i][j] == OWALL || mitem[i][j]); i = rnd(MAXX - 1), j = rnd(MAXY - 1));
+ if (trys) {
+ mitem[i][j] = save[sc].id;
+ hitp[i][j] = save[sc].arg;
}
+ }
+ }
+ loseint();
+ draws(0, MAXX, 0, MAXY);
+ if (wizard == 0)
+ spelknow[36] = 0;
+ free((char *) save);
+ positionplayer();
+ return;
+ }
- case 37: /* permanence */ adjtime(-99999L); spelknow[37]=0; /* forget */
- loseint();
- return;
+ case 37: /* permanence */
+ adjusttime(-99999L);
+ spelknow[37] = 0; /* forget */
+ loseint();
+ return;
- default: lprintf(" spell %d not available!",(long)x); beep(); return;
- };
- }
+ default:
+ lprintf(" spell %d not available!", (long) x);
+ lbeep();
+ return;
+ };
+}
/*
- * loseint() Routine to subtract 1 from your int (intelligence) if > 3
+ * loseint() Routine to subtract 1 from your int (intelligence) if > 3
*
- * No arguments and no return value
+ * No arguments and no return value
*/
+void
loseint()
- {
- if (--c[INTELLIGENCE]<3) c[INTELLIGENCE]=3;
- }
+{
+ if (--c[INTELLIGENCE] < 3)
+ c[INTELLIGENCE] = 3;
+}
/*
- * isconfuse() Routine to check to see if player is confused
+ * isconfuse() Routine to check to see if player is confused
*
- * This routine prints out a message saying "You can't aim your magic!"
- * returns 0 if not confused, non-zero (time remaining confused) if confused
+ * This routine prints out a message saying "You can't aim your magic!"
+ * returns 0 if not confused, non-zero (time remaining confused) if confused
*/
+int
isconfuse()
- {
- if (c[CONFUSE]) { lprcat(" You can't aim your magic!"); beep(); }
- return(c[CONFUSE]);
+{
+ if (c[CONFUSE]) {
+ lprcat(" You can't aim your magic!");
+ lbeep();
}
+ return (c[CONFUSE]);
+}
/*
- * nospell(x,monst) Routine to return 1 if a spell doesn't affect a monster
- * int x,monst;
+ * nospell(x,monst) Routine to return 1 if a spell doesn't affect a monster
+ * int x,monst;
*
- * Subroutine to return 1 if the spell can't affect the monster
- * otherwise returns 0
- * Enter with the spell number in x, and the monster number in monst.
+ * Subroutine to return 1 if the spell can't affect the monster
+ * otherwise returns 0
+ * Enter with the spell number in x, and the monster number in monst.
*/
-nospell(x,monst)
- int x,monst;
- {
- register int tmp;
- if (x>=SPNUM || monst>=MAXMONST+8 || monst<0 || x<0) return(0); /* bad spell or monst */
- if ((tmp=spelweird[monst-1][x])==0) return(0);
- cursors(); lprc('\n'); lprintf(spelmes[tmp],monster[monst].name); return(1);
- }
+int
+nospell(x, monst)
+ int x, monst;
+{
+ int tmp;
+
+ if (x >= SPNUM || monst >= MAXMONST + 8 || monst < 0 || x < 0)
+ return (0); /* bad spell or monst */
+ if ((tmp = spelweird[monst - 1][x]) == 0)
+ return (0);
+ cursors();
+ lprc('\n');
+ lprintf(spelmes[tmp], monster[monst].name);
+ return (1);
+}
/*
- * fullhit(xx) Function to return full damage against a monster (aka web)
- * int xx;
+ * fullhit(xx) Function to return full damage against a monster (aka web)
+ * int xx;
*
- * Function to return hp damage to monster due to a number of full hits
- * Enter with the number of full hits being done
+ * Function to return hp damage to monster due to a number of full hits
+ * Enter with the number of full hits being done
*/
+int
fullhit(xx)
- int xx;
- {
- register int i;
- if (xx<0 || xx>20) return(0); /* fullhits are out of range */
- if (c[LANCEDEATH]) return(10000); /* lance of death */
- i = xx * ((c[WCLASS]>>1)+c[STRENGTH]+c[STREXTRA]-c[HARDGAME]-12+c[MOREDAM]);
- return( (i>=1) ? i : xx );
- }
+ int xx;
+{
+ int i;
+
+ if (xx < 0 || xx > 20)
+ return (0); /* fullhits are out of range */
+ if (c[LANCEDEATH])
+ return (10000); /* lance of death */
+ i = xx * ((c[WCLASS] >> 1) + c[STRENGTH] + c[STREXTRA] - c[HARDGAME] - 12 + c[MOREDAM]);
+ return ((i >= 1) ? i : xx);
+}
/*
- * direct(spnum,dam,str,arg) Routine to direct spell damage 1 square in 1 dir
- * int spnum,dam,arg;
- * char *str;
- *
- * Routine to ask for a direction to a spell and then hit the monster
- * Enter with the spell number in spnum, the damage to be done in dam,
- * lprintf format string in str, and lprintf's argument in arg.
- * Returns no value.
+ * direct(spnum,dam,str,arg) Routine to direct spell damage 1 square in 1 dir
+ * int spnum,dam,arg;
+ * char *str;
+ *
+ * Routine to ask for a direction to a spell and then hit the monster
+ * Enter with the spell number in spnum, the damage to be done in dam,
+ * lprintf format string in str, and lprintf's argument in arg.
+ * Returns no value.
*/
-direct(spnum,dam,str,arg)
- int spnum,dam,arg;
- char *str;
- {
- int x,y;
- register int m;
- if (spnum<0 || spnum>=SPNUM || str==0) return; /* bad arguments */
- if (isconfuse()) return;
- dirsub(&x,&y);
+void
+direct(spnum, dam, str, arg)
+ int spnum, dam, arg;
+ char *str;
+{
+ int x, y;
+ int m;
+
+ if (spnum < 0 || spnum >= SPNUM || str == 0)
+ return; /* bad arguments */
+ if (isconfuse())
+ return;
+ dirsub(&x, &y);
m = mitem[x][y];
- if (item[x][y]==OMIRROR)
- {
- if (spnum==3) /* sleep */
- {
- lprcat("You fall asleep! "); beep();
- fool:
+ if (item[x][y] == OMIRROR) {
+ if (spnum == 3) { /* sleep */
+ lprcat("You fall asleep! ");
+ lbeep();
+ fool:
arg += 2;
- while (arg-- > 0) { parse2(); nap(1000); }
- return;
+ while (arg-- > 0) {
+ parse2();
+ nap(1000);
}
- else if (spnum==6) /* web */
- {
- lprcat("You get stuck in your own web! "); beep();
+ return;
+ } else if (spnum == 6) { /* web */
+ lprcat("You get stuck in your own web! ");
+ lbeep();
goto fool;
- }
- else
- {
- lastnum=278;
- lprintf(str,"spell caster (thats you)",(long)arg);
- beep(); losehp(dam); return;
- }
+ } else {
+ lastnum = 278;
+ lprintf(str, "spell caster (thats you)", (long) arg);
+ lbeep();
+ losehp(dam);
+ return;
}
- if (m==0)
- { lprcat(" There wasn't anything there!"); return; }
- ifblind(x,y);
- if (nospell(spnum,m)) { lasthx=x; lasthy=y; return; }
- lprintf(str,lastmonst,(long)arg); hitm(x,y,dam);
}
+ if (m == 0) {
+ lprcat(" There wasn't anything there!");
+ return;
+ }
+ ifblind(x, y);
+ if (nospell(spnum, m)) {
+ lasthx = x;
+ lasthy = y;
+ return;
+ }
+ lprintf(str, lastmonst, (long) arg);
+ hitm(x, y, dam);
+}
/*
- * godirect(spnum,dam,str,delay,cshow) Function to perform missile attacks
- * int spnum,dam,delay;
- * char *str,cshow;
- *
- * Function to hit in a direction from a missile weapon and have it keep
- * on going in that direction until its power is exhausted
- * Enter with the spell number in spnum, the power of the weapon in hp,
- * lprintf format string in str, the # of milliseconds to delay between
- * locations in delay, and the character to represent the weapon in cshow.
- * Returns no value.
+ * godirect(spnum,dam,str,delay,cshow) Function to perform missile attacks
+ * int spnum,dam,delay;
+ * char *str,cshow;
+ *
+ * Function to hit in a direction from a missile weapon and have it keep
+ * on going in that direction until its power is exhausted
+ * Enter with the spell number in spnum, the power of the weapon in hp,
+ * lprintf format string in str, the # of milliseconds to delay between
+ * locations in delay, and the character to represent the weapon in cshow.
+ * Returns no value.
*/
-godirect(spnum,dam,str,delay,cshow)
- int spnum,dam,delay;
- char *str,cshow;
- {
- register char *p;
- register int x,y,m;
- int dx,dy;
- if (spnum<0 || spnum>=SPNUM || str==0 || delay<0) return; /* bad args */
- if (isconfuse()) return;
- dirsub(&dx,&dy); x=dx; y=dy;
- dx = x-playerx; dy = y-playery; x = playerx; y = playery;
- while (dam>0)
- {
- x += dx; y += dy;
- if ((x > MAXX-1) || (y > MAXY-1) || (x < 0) || (y < 0))
- {
- dam=0; break; /* out of bounds */
- }
- if ((x==playerx) && (y==playery)) /* if energy hits player */
- {
- cursors(); lprcat("\nYou are hit my your own magic!"); beep();
- lastnum=278; losehp(dam); return;
- }
- if (c[BLINDCOUNT]==0) /* if not blind show effect */
- {
- cursor(x+1,y+1); lprc(cshow); nap(delay); show1cell(x,y);
- }
- if ((m=mitem[x][y])) /* is there a monster there? */
- {
- ifblind(x,y);
- if (nospell(spnum,m)) { lasthx=x; lasthy=y; return; }
- cursors(); lprc('\n');
- lprintf(str,lastmonst); dam -= hitm(x,y,dam);
- show1cell(x,y); nap(1000); x -= dx; y -= dy;
+void
+godirect(spnum, dam, str, delay, cshow)
+ int spnum, dam, delay;
+ char *str, cshow;
+{
+ char *p;
+ int x, y, m;
+ int dx, dy;
+
+ if (spnum < 0 || spnum >= SPNUM || str == 0 || delay < 0)
+ return; /* bad args */
+ if (isconfuse())
+ return;
+ dirsub(&dx, &dy);
+ x = dx;
+ y = dy;
+ dx = x - playerx;
+ dy = y - playery;
+ x = playerx;
+ y = playery;
+ while (dam > 0) {
+ x += dx;
+ y += dy;
+ if ((x > MAXX - 1) || (y > MAXY - 1) || (x < 0) || (y < 0)) {
+ dam = 0;
+ break; /* out of bounds */
+ }
+ if ((x == playerx) && (y == playery)) { /* if energy hits player */
+ cursors();
+ lprcat("\nYou are hit my your own magic!");
+ lbeep();
+ lastnum = 278;
+ losehp(dam);
+ return;
+ }
+ if (c[BLINDCOUNT] == 0) { /* if not blind show effect */
+ cursor(x + 1, y + 1);
+ lprc(cshow);
+ nap(delay);
+ show1cell(x, y);
+ }
+ if ((m = mitem[x][y])) { /* is there a monster there? */
+ ifblind(x, y);
+ if (nospell(spnum, m)) {
+ lasthx = x;
+ lasthy = y;
+ return;
}
- else switch (*(p= &item[x][y]))
- {
- case OWALL: cursors(); lprc('\n'); lprintf(str,"wall");
- if (dam>=50+c[HARDGAME]) /* enough damage? */
- if (level<MAXLEVEL+MAXVLEVEL-1) /* not on V3 */
- if ((x<MAXX-1) && (y<MAXY-1) && (x) && (y))
- {
+ cursors();
+ lprc('\n');
+ lprintf(str, lastmonst);
+ dam -= hitm(x, y, dam);
+ show1cell(x, y);
+ nap(1000);
+ x -= dx;
+ y -= dy;
+ } else
+ switch (*(p = &item[x][y])) {
+ case OWALL:
+ cursors();
+ lprc('\n');
+ lprintf(str, "wall");
+ if (dam >= 50 + c[HARDGAME]) /* enough damage? */
+ if (level < MAXLEVEL + MAXVLEVEL - 1) /* not on V3 */
+ if ((x < MAXX - 1) && (y < MAXY - 1) && (x) && (y)) {
lprcat(" The wall crumbles");
- god3: *p=0;
- god: know[x][y]=0;
- show1cell(x,y);
- }
- god2: dam = 0; break;
-
- case OCLOSEDDOOR: cursors(); lprc('\n'); lprintf(str,"door");
- if (dam>=40)
- {
- lprcat(" The door is blasted apart");
- goto god3;
- }
- goto god2;
-
- case OSTATUE: cursors(); lprc('\n'); lprintf(str,"statue");
- if (c[HARDGAME]<3)
- if (dam>44)
- {
- lprcat(" The statue crumbles");
- *p=OBOOK; iarg[x][y]=level;
- goto god;
- }
- goto god2;
-
- case OTHRONE: cursors(); lprc('\n'); lprintf(str,"throne");
- if (dam>39)
- {
- mitem[x][y]=GNOMEKING; hitp[x][y]=monster[GNOMEKING].hitpoints;
- *p = OTHRONE2;
- goto god;
+ god3: *p = 0;
+ god: know[x][y] = 0;
+ show1cell(x, y);
}
- goto god2;
+ god2: dam = 0;
+ break;
- case OMIRROR: dx *= -1; dy *= -1; break;
+ case OCLOSEDDOOR:
+ cursors();
+ lprc('\n');
+ lprintf(str, "door");
+ if (dam >= 40) {
+ lprcat(" The door is blasted apart");
+ goto god3;
+ }
+ goto god2;
+
+ case OSTATUE:
+ cursors();
+ lprc('\n');
+ lprintf(str, "statue");
+ if (c[HARDGAME] < 3)
+ if (dam > 44) {
+ lprcat(" The statue crumbles");
+ *p = OBOOK;
+ iarg[x][y] = level;
+ goto god;
+ }
+ goto god2;
+
+ case OTHRONE:
+ cursors();
+ lprc('\n');
+ lprintf(str, "throne");
+ if (dam > 39) {
+ mitem[x][y] = GNOMEKING;
+ hitp[x][y] = monster[GNOMEKING].hitpoints;
+ *p = OTHRONE2;
+ goto god;
+ }
+ goto god2;
+
+ case OMIRROR:
+ dx *= -1;
+ dy *= -1;
+ break;
};
- dam -= 3 + (c[HARDGAME]>>1);
- }
+ dam -= 3 + (c[HARDGAME] >> 1);
}
+}
/*
- * ifblind(x,y) Routine to put "monster" or the monster name into lastmosnt
- * int x,y;
+ * ifblind(x,y) Routine to put "monster" or the monster name into lastmosnt
+ * int x,y;
*
- * Subroutine to copy the word "monster" into lastmonst if the player is blind
- * Enter with the coordinates (x,y) of the monster
- * Returns no value.
+ * Subroutine to copy the word "monster" into lastmonst if the player is blind
+ * Enter with the coordinates (x,y) of the monster
+ * Returns no value.
*/
-ifblind(x,y)
- int x,y;
- {
- char *p;
- vxy(&x,&y); /* verify correct x,y coordinates */
- if (c[BLINDCOUNT]) { lastnum=279; p="monster"; }
- else { lastnum=mitem[x][y]; p=monster[lastnum].name; }
- strcpy(lastmonst,p);
+void
+ifblind(x, y)
+ int x, y;
+{
+ char *p;
+
+ vxy(&x, &y); /* verify correct x,y coordinates */
+ if (c[BLINDCOUNT]) {
+ lastnum = 279;
+ p = "monster";
+ } else {
+ lastnum = mitem[x][y];
+ p = monster[lastnum].name;
}
+ strcpy(lastmonst, p);
+}
/*
- * tdirect(spnum) Routine to teleport away a monster
- * int spnum;
+ * tdirect(spnum) Routine to teleport away a monster
+ * int spnum;
*
- * Routine to ask for a direction to a spell and then teleport away monster
- * Enter with the spell number that wants to teleport away
- * Returns no value.
+ * Routine to ask for a direction to a spell and then teleport away monster
+ * Enter with the spell number that wants to teleport away
+ * Returns no value.
*/
+void
tdirect(spnum)
- int spnum;
- {
- int x,y;
- register int m;
- if (spnum<0 || spnum>=SPNUM) return; /* bad args */
- if (isconfuse()) return;
- dirsub(&x,&y);
- if ((m=mitem[x][y])==0)
- { lprcat(" There wasn't anything there!"); return; }
- ifblind(x,y);
- if (nospell(spnum,m)) { lasthx=x; lasthy=y; return; }
- fillmonst(m); mitem[x][y]=know[x][y]=0;
+ int spnum;
+{
+ int x, y;
+ int m;
+
+ if (spnum < 0 || spnum >= SPNUM)
+ return; /* bad args */
+ if (isconfuse())
+ return;
+ dirsub(&x, &y);
+ if ((m = mitem[x][y]) == 0) {
+ lprcat(" There wasn't anything there!");
+ return;
}
+ ifblind(x, y);
+ if (nospell(spnum, m)) {
+ lasthx = x;
+ lasthy = y;
+ return;
+ }
+ fillmonst(m);
+ mitem[x][y] = know[x][y] = 0;
+}
/*
- * omnidirect(sp,dam,str) Routine to damage all monsters 1 square from player
- * int sp,dam;
- * char *str;
- *
- * Routine to cast a spell and then hit the monster in all directions
- * Enter with the spell number in sp, the damage done to wach square in dam,
- * and the lprintf string to identify the spell in str.
- * Returns no value.
+ * omnidirect(sp,dam,str) Routine to damage all monsters 1 square from player
+ * int sp,dam;
+ * char *str;
+ *
+ * Routine to cast a spell and then hit the monster in all directions
+ * Enter with the spell number in sp, the damage done to wach square in dam,
+ * and the lprintf string to identify the spell in str.
+ * Returns no value.
*/
-omnidirect(spnum,dam,str)
- int spnum,dam;
- char *str;
- {
- register int x,y,m;
- if (spnum<0 || spnum>=SPNUM || str==0) return; /* bad args */
- for (x=playerx-1; x<playerx+2; x++)
- for (y=playery-1; y<playery+2; y++)
- {
- if (m=mitem[x][y])
- if (nospell(spnum,m) == 0)
- {
- ifblind(x,y);
- cursors(); lprc('\n'); lprintf(str,lastmonst);
- hitm(x,y,dam); nap(800);
- }
- else { lasthx=x; lasthy=y; }
+void
+omnidirect(spnum, dam, str)
+ int spnum, dam;
+ char *str;
+{
+ int x, y, m;
+
+ if (spnum < 0 || spnum >= SPNUM || str == 0)
+ return; /* bad args */
+ for (x = playerx - 1; x < playerx + 2; x++)
+ for (y = playery - 1; y < playery + 2; y++) {
+ if ((m = mitem[x][y]) != 0) {
+ if (nospell(spnum, m) == 0) {
+ ifblind(x, y);
+ cursors();
+ lprc('\n');
+ lprintf(str, lastmonst);
+ hitm(x, y, dam);
+ nap(800);
+ } else {
+ lasthx = x;
+ lasthy = y;
+ }
}
- }
+ }
+}
/*
- * static dirsub(x,y) Routine to ask for direction, then modify x,y for it
- * int *x,*y;
+ * static dirsub(x,y) Routine to ask for direction, then modify x,y for it
+ * int *x,*y;
*
- * Function to ask for a direction and modify an x,y for that direction
- * Enter with the origination coordinates in (x,y).
- * Returns index into diroffx[] (0-8).
+ * Function to ask for a direction and modify an x,y for that direction
+ * Enter with the origination coordinates in (x,y).
+ * Returns index into diroffx[] (0-8).
*/
static int
-dirsub(x,y)
- int *x,*y;
- {
- register int i;
+dirsub(x, y)
+ int *x, *y;
+{
+ int i;
+
lprcat("\nIn What Direction? ");
- for (i=0; ; )
- switch(getchar())
- {
- case 'b': i++;
- case 'n': i++;
- case 'y': i++;
- case 'u': i++;
- case 'h': i++;
- case 'k': i++;
- case 'l': i++;
- case 'j': i++; goto out;
- };
+ for (i = 0;;)
+ switch (lgetchar()) {
+ case 'b':
+ i++;
+ case 'n':
+ i++;
+ case 'y':
+ i++;
+ case 'u':
+ i++;
+ case 'h':
+ i++;
+ case 'k':
+ i++;
+ case 'l':
+ i++;
+ case 'j':
+ i++;
+ goto out;
+ };
out:
- *x = playerx+diroffx[i]; *y = playery+diroffy[i];
- vxy(x,y); return(i);
- }
+ *x = playerx + diroffx[i];
+ *y = playery + diroffy[i];
+ vxy(x, y);
+ return (i);
+}
/*
- * vxy(x,y) Routine to verify/fix coordinates for being within bounds
- * int *x,*y;
- *
- * Function to verify x & y are within the bounds for a level
- * If *x or *y is not within the absolute bounds for a level, fix them so that
- * they are on the level.
- * Returns TRUE if it was out of bounds, and the *x & *y in the calling
- * routine are affected.
+ * vxy(x,y) Routine to verify/fix coordinates for being within bounds
+ * int *x,*y;
+ *
+ * Function to verify x & y are within the bounds for a level
+ * If *x or *y is not within the absolute bounds for a level, fix them so that
+ * they are on the level.
+ * Returns TRUE if it was out of bounds, and the *x & *y in the calling
+ * routine are affected.
*/
-vxy(x,y)
- int *x,*y;
- {
- int flag=0;
- if (*x<0) { *x=0; flag++; }
- if (*y<0) { *y=0; flag++; }
- if (*x>=MAXX) { *x=MAXX-1; flag++; }
- if (*y>=MAXY) { *y=MAXY-1; flag++; }
- return(flag);
+int
+vxy(x, y)
+ int *x, *y;
+{
+ int flag = 0;
+
+ if (*x < 0) {
+ *x = 0;
+ flag++;
}
+ if (*y < 0) {
+ *y = 0;
+ flag++;
+ }
+ if (*x >= MAXX) {
+ *x = MAXX - 1;
+ flag++;
+ }
+ if (*y >= MAXY) {
+ *y = MAXY - 1;
+ flag++;
+ }
+ return (flag);
+}
/*
- * dirpoly(spnum) Routine to ask for a direction and polymorph a monst
- * int spnum;
+ * dirpoly(spnum) Routine to ask for a direction and polymorph a monst
+ * int spnum;
*
- * Subroutine to polymorph a monster and ask for the direction its in
- * Enter with the spell number in spmun.
- * Returns no value.
+ * Subroutine to polymorph a monster and ask for the direction its in
+ * Enter with the spell number in spmun.
+ * Returns no value.
*/
+void
dirpoly(spnum)
- int spnum;
- {
- int x,y,m;
- if (spnum<0 || spnum>=SPNUM) return; /* bad args */
- if (isconfuse()) return; /* if he is confused, he can't aim his magic */
- dirsub(&x,&y);
- if (mitem[x][y]==0)
- { lprcat(" There wasn't anything there!"); return; }
- ifblind(x,y);
- if (nospell(spnum,mitem[x][y])) { lasthx=x; lasthy=y; return; }
- while ( monster[m = mitem[x][y] = rnd(MAXMONST+7)].genocided );
- hitp[x][y] = monster[m].hitpoints;
- show1cell(x,y); /* show the new monster */
+ int spnum;
+{
+ int x, y, m;
+
+ if (spnum < 0 || spnum >= SPNUM)
+ return; /* bad args */
+ if (isconfuse())
+ return; /* if he is confused, he can't aim his magic */
+ dirsub(&x, &y);
+ if (mitem[x][y] == 0) {
+ lprcat(" There wasn't anything there!");
+ return;
+ }
+ ifblind(x, y);
+ if (nospell(spnum, mitem[x][y])) {
+ lasthx = x;
+ lasthy = y;
+ return;
}
+ while (monster[m = mitem[x][y] = rnd(MAXMONST + 7)].genocided);
+ hitp[x][y] = monster[m].hitpoints;
+ show1cell(x, y); /* show the new monster */
+}
/*
- * hitmonster(x,y) Function to hit a monster at the designated coordinates
- * int x,y;
+ * hitmonster(x,y) Function to hit a monster at the designated coordinates
+ * int x,y;
*
- * This routine is used for a bash & slash type attack on a monster
- * Enter with the coordinates of the monster in (x,y).
- * Returns no value.
+ * This routine is used for a bash & slash type attack on a monster
+ * Enter with the coordinates of the monster in (x,y).
+ * Returns no value.
*/
-hitmonster(x,y)
- int x,y;
- {
- register int tmp,monst,damag,flag;
- if (c[TIMESTOP]) return; /* not if time stopped */
- vxy(&x,&y); /* verify coordinates are within range */
- if ((monst = mitem[x][y]) == 0) return;
- hit3flag=1; ifblind(x,y);
- tmp = monster[monst].armorclass + c[LEVEL] + c[DEXTERITY] + c[WCLASS]/4 - 12;
+void
+hitmonster(x, y)
+ int x, y;
+{
+ int tmp, monst, damag = 0, flag;
+
+ if (c[TIMESTOP])
+ return; /* not if time stopped */
+ vxy(&x, &y); /* verify coordinates are within range */
+ if ((monst = mitem[x][y]) == 0)
+ return;
+ hit3flag = 1;
+ ifblind(x, y);
+ tmp = monster[monst].armorclass + c[LEVEL] + c[DEXTERITY] +
+ c[WCLASS] / 4 - 12;
cursors();
- if ((rnd(20) < tmp-c[HARDGAME]) || (rnd(71) < 5)) /* need at least random chance to hit */
- {
- lprcat("\nYou hit"); flag=1;
- damag = fullhit(1);
- if (damag<9999) damag=rnd(damag)+1;
- }
- else
- {
- lprcat("\nYou missed"); flag=0;
- }
- lprcat(" the "); lprcat(lastmonst);
- if (flag) /* if the monster was hit */
- if ((monst==RUSTMONSTER) || (monst==DISENCHANTRESS) || (monst==CUBE))
- if (c[WIELD]>0)
- if (ivenarg[c[WIELD]] > -10)
- {
- lprintf("\nYour weapon is dulled by the %s",lastmonst); beep();
- --ivenarg[c[WIELD]];
- }
- if (flag) hitm(x,y,damag);
- if (monst == VAMPIRE) if (hitp[x][y]<25) { mitem[x][y]=BAT; know[x][y]=0; }
+ /* need at least random chance to hit */
+ if ((rnd(20) < tmp - c[HARDGAME]) || (rnd(71) < 5)) {
+ lprcat("\nYou hit");
+ flag = 1;
+ damag = fullhit(1);
+ if (damag < 9999)
+ damag = rnd(damag) + 1;
+ } else {
+ lprcat("\nYou missed");
+ flag = 0;
}
+ lprcat(" the ");
+ lprcat(lastmonst);
+ if (flag) /* if the monster was hit */
+ if ((monst == RUSTMONSTER) || (monst == DISENCHANTRESS) || (monst == CUBE))
+ if (c[WIELD] > 0)
+ if (ivenarg[c[WIELD]] > -10) {
+ lprintf("\nYour weapon is dulled by the %s", lastmonst);
+ lbeep();
+ --ivenarg[c[WIELD]];
+ }
+ if (flag)
+ hitm(x, y, damag);
+ if (monst == VAMPIRE)
+ if (hitp[x][y] < 25) {
+ mitem[x][y] = BAT;
+ know[x][y] = 0;
+ }
+}
/*
- * hitm(x,y,amt) Function to just hit a monster at a given coordinates
- * int x,y,amt;
+ * hitm(x,y,amt) Function to just hit a monster at a given coordinates
+ * int x,y,amt;
*
- * Returns the number of hitpoints the monster absorbed
- * This routine is used to specifically damage a monster at a location (x,y)
- * Called by hitmonster(x,y)
+ * Returns the number of hitpoints the monster absorbed
+ * This routine is used to specifically damage a monster at a location (x,y)
+ * Called by hitmonster(x,y)
*/
-hitm(x,y,amt)
- int x,y;
- register amt;
- {
- register int monst;
- int hpoints,amt2;
- vxy(&x,&y); /* verify coordinates are within range */
+int
+hitm(x, y, amt)
+ int x, y;
+ int amt;
+{
+ int monst;
+ int hpoints, amt2;
+
+ vxy(&x, &y); /* verify coordinates are within range */
amt2 = amt; /* save initial damage so we can return it */
monst = mitem[x][y];
- if (c[HALFDAM]) amt >>= 1; /* if half damage curse adjust damage points */
- if (amt<=0) amt2 = amt = 1;
- lasthx=x; lasthy=y;
- stealth[x][y]=1; /* make sure hitting monst breaks stealth condition */
- c[HOLDMONST]=0; /* hit a monster breaks hold monster spell */
- switch(monst) /* if a dragon and orb(s) of dragon slaying */
- {
- case WHITEDRAGON: case REDDRAGON: case GREENDRAGON:
- case BRONZEDRAGON: case PLATINUMDRAGON: case SILVERDRAGON:
- amt *= 1+(c[SLAYING]<<1); break;
- }
-/* invincible monster fix is here */
+ if (c[HALFDAM])
+ amt >>= 1; /* if half damage curse adjust damage points */
+ if (amt <= 0)
+ amt2 = amt = 1;
+ lasthx = x;
+ lasthy = y;
+ stealth[x][y] = 1; /* make sure hitting monst breaks stealth
+ * condition */
+ c[HOLDMONST] = 0; /* hit a monster breaks hold monster spell */
+ switch (monst) { /* if a dragon and orb(s) of dragon slaying */
+ case WHITEDRAGON:
+ case REDDRAGON:
+ case GREENDRAGON:
+ case BRONZEDRAGON:
+ case PLATINUMDRAGON:
+ case SILVERDRAGON:
+ amt *= 1 + (c[SLAYING] << 1);
+ break;
+ }
+ /* invincible monster fix is here */
if (hitp[x][y] > monster[monst].hitpoints)
hitp[x][y] = monster[monst].hitpoints;
- if ((hpoints = hitp[x][y]) <= amt)
- {
+ if ((hpoints = hitp[x][y]) <= amt) {
#ifdef EXTRA
c[MONSTKILLED]++;
#endif
- lprintf("\nThe %s died!",lastmonst);
- raiseexperience((long)monster[monst].experience);
- amt = monster[monst].gold; if (amt>0) dropgold(rnd(amt)+amt);
- dropsomething(monst); disappear(x,y); bottomline();
- return(hpoints);
- }
- hitp[x][y] = hpoints-amt; return(amt2);
+ lprintf("\nThe %s died!", lastmonst);
+ raiseexperience((long) monster[monst].experience);
+ amt = monster[monst].gold;
+ if (amt > 0)
+ dropgold(rnd(amt) + amt);
+ dropsomething(monst);
+ disappear(x, y);
+ bottomline();
+ return (hpoints);
}
+ hitp[x][y] = hpoints - amt;
+ return (amt2);
+}
/*
- * hitplayer(x,y) Function for the monster to hit the player from (x,y)
- * int x,y;
+ * hitplayer(x,y) Function for the monster to hit the player from (x,y)
+ * int x,y;
*
- * Function for the monster to hit the player with monster at location x,y
- * Returns nothing of value.
+ * Function for the monster to hit the player with monster at location x,y
+ * Returns nothing of value.
*/
-hitplayer(x,y)
- int x,y;
- {
- register int dam,tmp,mster,bias;
- vxy(&x,&y); /* verify coordinates are within range */
+void
+hitplayer(x, y)
+ int x, y;
+{
+ int dam, tmp, mster, bias;
+
+ vxy(&x, &y); /* verify coordinates are within range */
lastnum = mster = mitem[x][y];
-/* spirit naga's and poltergeist's do nothing if scarab of negate spirit */
- if (c[NEGATESPIRIT] || c[SPIRITPRO]) if ((mster ==POLTERGEIST) || (mster ==SPIRITNAGA)) return;
-/* if undead and cube of undead control */
- if (c[CUBEofUNDEAD] || c[UNDEADPRO]) if ((mster ==VAMPIRE) || (mster ==WRAITH) || (mster ==ZOMBIE)) return;
- if ((know[x][y]&1) == 0)
- {
- know[x][y]=1; show1cell(x,y);
- }
+ /*
+ * spirit naga's and poltergeist's do nothing if scarab of negate
+ * spirit
+ */
+ if (c[NEGATESPIRIT] || c[SPIRITPRO])
+ if ((mster == POLTERGEIST) || (mster == SPIRITNAGA))
+ return;
+ /* if undead and cube of undead control */
+ if (c[CUBEofUNDEAD] || c[UNDEADPRO])
+ if ((mster == VAMPIRE) || (mster == WRAITH) || (mster == ZOMBIE))
+ return;
+ if ((know[x][y] & 1) == 0) {
+ know[x][y] = 1;
+ show1cell(x, y);
+ }
bias = (c[HARDGAME]) + 1;
hitflag = hit2flag = hit3flag = 1;
- yrepcount=0;
- cursors(); ifblind(x,y);
- if (c[INVISIBILITY]) if (rnd(33)<20)
- {
- lprintf("\nThe %s misses wildly",lastmonst); return;
+ yrepcount = 0;
+ cursors();
+ ifblind(x, y);
+ if (c[INVISIBILITY])
+ if (rnd(33) < 20) {
+ lprintf("\nThe %s misses wildly", lastmonst);
+ return;
}
- if (c[CHARMCOUNT]) if (rnd(30)+5*monster[mster].level-c[CHARISMA]<30)
- {
- lprintf("\nThe %s is awestruck at your magnificence!",lastmonst);
- return;
+ if (c[CHARMCOUNT])
+ if (rnd(30) + 5 * monster[mster].level - c[CHARISMA] < 30) {
+ lprintf("\nThe %s is awestruck at your magnificence!", lastmonst);
+ return;
}
- if (mster==BAT) dam=1;
- else
- {
+ if (mster == BAT)
+ dam = 1;
+ else {
dam = monster[mster].damage;
- dam += rnd((int)((dam<1)?1:dam)) + monster[mster].level;
- }
+ dam += rnd((int) ((dam < 1) ? 1 : dam)) + monster[mster].level;
+ }
tmp = 0;
- if (monster[mster].attack>0)
- if (((dam + bias + 8) > c[AC]) || (rnd((int)((c[AC]>0)?c[AC]:1))==1))
- { if (spattack(monster[mster].attack,x,y)) { flushall(); return; }
- tmp = 1; bias -= 2; cursors(); }
- if (((dam + bias) > c[AC]) || (rnd((int)((c[AC]>0)?c[AC]:1))==1))
- {
- lprintf("\n The %s hit you ",lastmonst); tmp = 1;
- if ((dam -= c[AC]) < 0) dam=0;
- if (dam > 0) { losehp(dam); bottomhp(); flushall(); }
+ if (monster[mster].attack > 0)
+ if (((dam + bias + 8) > c[AC]) || (rnd((int) ((c[AC] > 0) ? c[AC] : 1)) == 1)) {
+ if (spattack(monster[mster].attack, x, y)) {
+ flushall();
+ return;
+ }
+ tmp = 1;
+ bias -= 2;
+ cursors();
+ }
+ if (((dam + bias) > c[AC]) || (rnd((int) ((c[AC] > 0) ? c[AC] : 1)) == 1)) {
+ lprintf("\n The %s hit you ", lastmonst);
+ tmp = 1;
+ if ((dam -= c[AC]) < 0)
+ dam = 0;
+ if (dam > 0) {
+ losehp(dam);
+ bottomhp();
+ flushall();
}
- if (tmp == 0) lprintf("\n The %s missed ",lastmonst);
}
+ if (tmp == 0)
+ lprintf("\n The %s missed ", lastmonst);
+}
/*
- * dropsomething(monst) Function to create an object when a monster dies
- * int monst;
+ * dropsomething(monst) Function to create an object when a monster dies
+ * int monst;
*
- * Function to create an object near the player when certain monsters are killed
- * Enter with the monster number
- * Returns nothing of value.
+ * Function to create an object near the player when certain monsters are killed
+ * Enter with the monster number
+ * Returns nothing of value.
*/
+void
dropsomething(monst)
- int monst;
- {
- switch(monst)
- {
- case ORC: case NYMPH: case ELF: case TROGLODYTE:
- case TROLL: case ROTHE: case VIOLETFUNGI:
- case PLATINUMDRAGON: case GNOMEKING: case REDDRAGON:
- something(level); return;
+ int monst;
+{
+ switch (monst) {
+ case ORC:
+ case NYMPH:
+ case ELF:
+ case TROGLODYTE:
+ case TROLL:
+ case ROTHE:
+ case VIOLETFUNGI:
+ case PLATINUMDRAGON:
+ case GNOMEKING:
+ case REDDRAGON:
+ something(level);
+ return;
- case LEPRECHAUN: if (rnd(101)>=75) creategem();
- if (rnd(5)==1) dropsomething(LEPRECHAUN); return;
- }
+ case LEPRECHAUN:
+ if (rnd(101) >= 75)
+ creategem();
+ if (rnd(5) == 1)
+ dropsomething(LEPRECHAUN);
+ return;
}
+}
/*
- * dropgold(amount) Function to drop some gold around player
- * int amount;
+ * dropgold(amount) Function to drop some gold around player
+ * int amount;
*
- * Enter with the number of gold pieces to drop
- * Returns nothing of value.
+ * Enter with the number of gold pieces to drop
+ * Returns nothing of value.
*/
+void
dropgold(amount)
- register int amount;
- {
- if (amount > 250) createitem(OMAXGOLD,amount/100); else createitem(OGOLDPILE,amount);
- }
+ int amount;
+{
+ if (amount > 250)
+ createitem(OMAXGOLD, amount / 100);
+ else
+ createitem(OGOLDPILE, amount);
+}
/*
- * something(level) Function to create a random item around player
- * int level;
+ * something(level) Function to create a random item around player
+ * int level;
*
- * Function to create an item from a designed probability around player
- * Enter with the cave level on which something is to be dropped
- * Returns nothing of value.
+ * Function to create an item from a designed probability around player
+ * Enter with the cave level on which something is to be dropped
+ * Returns nothing of value.
*/
+void
something(level)
- int level;
- {
- register int j;
- int i;
- if (level<0 || level>MAXLEVEL+MAXVLEVEL) return; /* correct level? */
- if (rnd(101)<8) something(level); /* possibly more than one item */
- j = newobject(level,&i); createitem(j,i);
- }
+ int level;
+{
+ int j;
+ int i;
+
+ if (level < 0 || level > MAXLEVEL + MAXVLEVEL)
+ return; /* correct level? */
+ if (rnd(101) < 8)
+ something(level); /* possibly more than one item */
+ j = newobject(level, &i);
+ createitem(j, i);
+}
/*
- * newobject(lev,i) Routine to return a randomly selected new object
- * int lev,*i;
+ * newobject(lev,i) Routine to return a randomly selected new object
+ * int lev,*i;
*
- * Routine to return a randomly selected object to be created
- * Returns the object number created, and sets *i for its argument
- * Enter with the cave level and a pointer to the items arg
+ * Routine to return a randomly selected object to be created
+ * Returns the object number created, and sets *i for its argument
+ * Enter with the cave level and a pointer to the items arg
*/
-static char nobjtab[] = { 0, OSCROLL, OSCROLL, OSCROLL, OSCROLL, OPOTION,
- OPOTION, OPOTION, OPOTION, OGOLDPILE, OGOLDPILE, OGOLDPILE, OGOLDPILE,
- OBOOK, OBOOK, OBOOK, OBOOK, ODAGGER, ODAGGER, ODAGGER, OLEATHER, OLEATHER,
- OLEATHER, OREGENRING, OPROTRING, OENERGYRING, ODEXRING, OSTRRING, OSPEAR,
- OBELT, ORING, OSTUDLEATHER, OSHIELD, OFLAIL, OCHAIN, O2SWORD, OPLATE,
- OLONGSWORD };
-
-newobject(lev,i)
- register int lev,*i;
- {
- register int tmp=32,j;
- if (level<0 || level>MAXLEVEL+MAXVLEVEL) return(0); /* correct level? */
- if (lev>6) tmp=37; else if (lev>4) tmp=35;
- j = nobjtab[tmp=rnd(tmp)]; /* the object type */
- switch(tmp)
- {
- case 1: case 2: case 3: case 4: *i=newscroll(); break;
- case 5: case 6: case 7: case 8: *i=newpotion(); break;
- case 9: case 10: case 11: case 12: *i=rnd((lev+1)*10)+lev*10+10; break;
- case 13: case 14: case 15: case 16: *i=lev; break;
- case 17: case 18: case 19: if (!(*i=newdagger())) return(0); break;
- case 20: case 21: case 22: if (!(*i=newleather())) return(0); break;
- case 23: case 32: case 35: *i=rund(lev/3+1); break;
- case 24: case 26: *i=rnd(lev/4+1); break;
- case 25: *i=rund(lev/4+1); break;
- case 27: *i=rnd(lev/2+1); break;
- case 30: case 33: *i=rund(lev/2+1); break;
- case 28: *i=rund(lev/3+1); if (*i==0) return(0); break;
- case 29: case 31: *i=rund(lev/2+1); if (*i==0) return(0); break;
- case 34: *i=newchain(); break;
- case 36: *i=newplate(); break;
- case 37: *i=newsword(); break;
- }
- return(j);
+static char nobjtab[] = {
+ 0, OSCROLL, OSCROLL, OSCROLL, OSCROLL, OPOTION, OPOTION,
+ OPOTION, OPOTION, OGOLDPILE, OGOLDPILE, OGOLDPILE, OGOLDPILE,
+ OBOOK, OBOOK, OBOOK, OBOOK, ODAGGER, ODAGGER, ODAGGER,
+ OLEATHER, OLEATHER, OLEATHER, OREGENRING, OPROTRING,
+ OENERGYRING, ODEXRING, OSTRRING, OSPEAR, OBELT, ORING,
+ OSTUDLEATHER, OSHIELD, OFLAIL, OCHAIN, O2SWORD, OPLATE,
+ OLONGSWORD};
+
+int
+newobject(lev, i)
+ int lev, *i;
+{
+ int tmp = 32, j;
+
+ if (level < 0 || level > MAXLEVEL + MAXVLEVEL)
+ return (0); /* correct level? */
+ if (lev > 6)
+ tmp = 37;
+ else if (lev > 4)
+ tmp = 35;
+ j = nobjtab[tmp = rnd(tmp)]; /* the object type */
+ switch (tmp) {
+ case 1:
+ case 2:
+ case 3:
+ case 4:
+ *i = newscroll();
+ break;
+ case 5:
+ case 6:
+ case 7:
+ case 8:
+ *i = newpotion();
+ break;
+ case 9:
+ case 10:
+ case 11:
+ case 12:
+ *i = rnd((lev + 1) * 10) + lev * 10 + 10;
+ break;
+ case 13:
+ case 14:
+ case 15:
+ case 16:
+ *i = lev;
+ break;
+ case 17:
+ case 18:
+ case 19:
+ if (!(*i = newdagger()))
+ return (0);
+ break;
+ case 20:
+ case 21:
+ case 22:
+ if (!(*i = newleather()))
+ return (0);
+ break;
+ case 23:
+ case 32:
+ case 35:
+ *i = rund(lev / 3 + 1);
+ break;
+ case 24:
+ case 26:
+ *i = rnd(lev / 4 + 1);
+ break;
+ case 25:
+ *i = rund(lev / 4 + 1);
+ break;
+ case 27:
+ *i = rnd(lev / 2 + 1);
+ break;
+ case 30:
+ case 33:
+ *i = rund(lev / 2 + 1);
+ break;
+ case 28:
+ *i = rund(lev / 3 + 1);
+ if (*i == 0)
+ return (0);
+ break;
+ case 29:
+ case 31:
+ *i = rund(lev / 2 + 1);
+ if (*i == 0)
+ return (0);
+ break;
+ case 34:
+ *i = newchain();
+ break;
+ case 36:
+ *i = newplate();
+ break;
+ case 37:
+ *i = newsword();
+ break;
}
+ return (j);
+}
/*
- * spattack(atckno,xx,yy) Function to process special attacks from monsters
- * int atckno,xx,yy;
+ * spattack(atckno,xx,yy) Function to process special attacks from monsters
+ * int atckno,xx,yy;
*
- * Enter with the special attack number, and the coordinates (xx,yy)
- * of the monster that is special attacking
- * Returns 1 if must do a show1cell(xx,yy) upon return, 0 otherwise
+ * Enter with the special attack number, and the coordinates (xx,yy)
+ * of the monster that is special attacking
+ * Returns 1 if must do a show1cell(xx,yy) upon return, 0 otherwise
*
* atckno monster effect
* ---------------------------------------------------
- * 0 none
- * 1 rust monster eat armor
- * 2 hell hound breathe light fire
- * 3 dragon breathe fire
- * 4 giant centipede weakening sing
- * 5 white dragon cold breath
- * 6 wraith drain level
- * 7 waterlord water gusher
- * 8 leprechaun steal gold
- * 9 disenchantress disenchant weapon or armor
- * 10 ice lizard hits with barbed tail
- * 11 umber hulk confusion
- * 12 spirit naga cast spells taken from special attacks
- * 13 platinum dragon psionics
- * 14 nymph steal objects
- * 15 bugbear bite
- * 16 osequip bite
- *
- * char rustarm[ARMORTYPES][2];
- * special array for maximum rust damage to armor from rustmonster
- * format is: { armor type , minimum attribute
+ * 0 none
+ * 1 rust monster eat armor
+ * 2 hell hound breathe light fire
+ * 3 dragon breathe fire
+ * 4 giant centipede weakening sing
+ * 5 white dragon cold breath
+ * 6 wraith drain level
+ * 7 waterlord water gusher
+ * 8 leprechaun steal gold
+ * 9 disenchantress disenchant weapon or armor
+ * 10 ice lizard hits with barbed tail
+ * 11 umber hulk confusion
+ * 12 spirit naga cast spells taken from special attacks
+ * 13 platinum dragon psionics
+ * 14 nymph steal objects
+ * 15 bugbear bite
+ * 16 osequip bite
+ *
+ * char rustarm[ARMORTYPES][2];
+ * special array for maximum rust damage to armor from rustmonster
+ * format is: { armor type , minimum attribute
*/
#define ARMORTYPES 6
-static char rustarm[ARMORTYPES][2] = { OSTUDLEATHER,-2, ORING,-4, OCHAIN,-5,
- OSPLINT,-6, OPLATE,-8, OPLATEARMOR,-9 };
-static char spsel[] = { 1, 2, 3, 5, 6, 8, 9, 11, 13, 14 };
-spattack(x,xx,yy)
- int x,xx,yy;
- {
- register int i,j=0,k,m;
- register char *p=0;
- if (c[CANCELLATION]) return(0);
- vxy(&xx,&yy); /* verify x & y coordinates */
- switch(x)
- {
- case 1: /* rust your armor, j=1 when rusting has occurred */
- m = k = c[WEAR];
- if ((i=c[SHIELD]) != -1)
- if (--ivenarg[i] < -1) ivenarg[i]= -1; else j=1;
- if ((j==0) && (k != -1))
- {
- m = iven[k];
- for (i=0; i<ARMORTYPES; i++)
- if (m == rustarm[i][0]) /* find his armor in table */
- {
- if (--ivenarg[k]< rustarm[i][1])
- ivenarg[k]= rustarm[i][1]; else j=1;
- break;
- }
- }
- if (j==0) /* if rusting did not occur */
- switch(m)
- {
- case OLEATHER: p = "\nThe %s hit you -- You're lucky you have leather on";
- break;
- case OSSPLATE: p = "\nThe %s hit you -- You're fortunate to have stainless steel armor!";
- break;
- }
- else { beep(); p = "\nThe %s hit you -- your armor feels weaker"; }
- break;
-
- case 2: i = rnd(15)+8-c[AC];
- spout: p="\nThe %s breathes fire at you!";
- if (c[FIRERESISTANCE])
- p="\nThe %s's flame doesn't phase you!";
+static char rustarm[ARMORTYPES][2] = {
+ { OSTUDLEATHER, -2 },
+ { ORING, -4 },
+ { OCHAIN, -5 },
+ { OSPLINT, -6 },
+ { OPLATE, -8 },
+ { OPLATEARMOR, -9}
+};
+static char spsel[] = {1, 2, 3, 5, 6, 8, 9, 11, 13, 14};
+int
+spattack(x, xx, yy)
+ int x, xx, yy;
+{
+ int i, j = 0, k, m;
+ char *p = 0;
+
+ if (c[CANCELLATION])
+ return (0);
+ vxy(&xx, &yy); /* verify x & y coordinates */
+ switch (x) {
+ case 1: /* rust your armor, j=1 when rusting has occurred */
+ m = k = c[WEAR];
+ if ((i = c[SHIELD]) != -1) {
+ if (--ivenarg[i] < -1)
+ ivenarg[i] = -1;
+ else
+ j = 1;
+ }
+ if ((j == 0) && (k != -1)) {
+ m = iven[k];
+ for (i = 0; i < ARMORTYPES; i++)
+ /* find his armor in table */
+ if (m == rustarm[i][0]) {
+ if (--ivenarg[k] < rustarm[i][1])
+ ivenarg[k] = rustarm[i][1];
else
- spout2: if (p) { lprintf(p,lastmonst); beep(); }
- checkloss(i);
- return(0);
-
- case 3: i = rnd(20)+25-c[AC]; goto spout;
-
- case 4: if (c[STRENGTH]>3)
- {
- p="\nThe %s stung you! You feel weaker"; beep();
- --c[STRENGTH];
- }
- else p="\nThe %s stung you!";
- break;
-
- case 5: p="\nThe %s blasts you with his cold breath";
- i = rnd(15)+18-c[AC]; goto spout2;
-
- case 6: lprintf("\nThe %s drains you of your life energy!",lastmonst);
- loselevel(); beep(); return(0);
-
- case 7: p="\nThe %s got you with a gusher!";
- i = rnd(15)+25-c[AC]; goto spout2;
-
- case 8: if (c[NOTHEFT]) return(0); /* he has a device of no theft */
- if (c[GOLD])
- {
- p="\nThe %s hit you -- Your purse feels lighter";
- if (c[GOLD]>32767) c[GOLD]>>=1;
- else c[GOLD] -= rnd((int)(1+(c[GOLD]>>1)));
- if (c[GOLD] < 0) c[GOLD]=0;
- }
- else p="\nThe %s couldn't find any gold to steal";
- lprintf(p,lastmonst); disappear(xx,yy); beep();
- bottomgold(); return(1);
-
- case 9: for(j=50; ; ) /* disenchant */
- {
- i=rund(26); m=iven[i]; /* randomly select item */
- if (m>0 && ivenarg[i]>0 && m!=OSCROLL && m!=OPOTION)
- {
- if ((ivenarg[i] -= 3)<0) ivenarg[i]=0;
- lprintf("\nThe %s hits you -- you feel a sense of loss",lastmonst);
- srcount=0; beep(); show3(i); bottomline(); return(0);
- }
- if (--j<=0)
- {
- p="\nThe %s nearly misses"; break;
- }
+ j = 1;
break;
- }
+ }
+ }
+ if (j == 0) /* if rusting did not occur */
+ switch (m) {
+ case OLEATHER:
+ p = "\nThe %s hit you -- You're lucky you have leather on";
break;
+ case OSSPLATE:
+ p = "\nThe %s hit you -- You're fortunate to have stainless steel armor!";
+ break;
+ }
+ else {
+ lbeep();
+ p = "\nThe %s hit you -- your armor feels weaker";
+ }
+ break;
- case 10: p="\nThe %s hit you with his barbed tail";
- i = rnd(25)-c[AC]; goto spout2;
-
- case 11: p="\nThe %s has confused you"; beep();
- c[CONFUSE]+= 10+rnd(10); break;
-
- case 12: /* performs any number of other special attacks */
- return(spattack(spsel[rund(10)],xx,yy));
-
- case 13: p="\nThe %s flattens you with his psionics!";
- i = rnd(15)+30-c[AC]; goto spout2;
-
- case 14: if (c[NOTHEFT]) return(0); /* he has device of no theft */
- if (emptyhanded()==1)
- {
- p="\nThe %s couldn't find anything to steal";
- break;
- }
- lprintf("\nThe %s picks your pocket and takes:",lastmonst);
- beep();
- if (stealsomething()==0) lprcat(" nothing"); disappear(xx,yy);
- bottomline(); return(1);
-
- case 15: i= rnd(10)+ 5-c[AC];
- spout3: p="\nThe %s bit you!";
- goto spout2;
-
- case 16: i= rnd(15)+10-c[AC]; goto spout3;
- };
- if (p) { lprintf(p,lastmonst); bottomline(); }
- return(0);
+ case 2:
+ i = rnd(15) + 8 - c[AC];
+spout: p = "\nThe %s breathes fire at you!";
+ if (c[FIRERESISTANCE])
+ p = "\nThe %s's flame doesn't phase you!";
+ else
+spout2: if (p) {
+ lprintf(p, lastmonst);
+ lbeep();
+ }
+ checkloss(i);
+ return (0);
+
+ case 3:
+ i = rnd(20) + 25 - c[AC];
+ goto spout;
+
+ case 4:
+ if (c[STRENGTH] > 3) {
+ p = "\nThe %s stung you! You feel weaker";
+ lbeep();
+ --c[STRENGTH];
+ } else
+ p = "\nThe %s stung you!";
+ break;
+
+ case 5:
+ p = "\nThe %s blasts you with his cold breath";
+ i = rnd(15) + 18 - c[AC];
+ goto spout2;
+
+ case 6:
+ lprintf("\nThe %s drains you of your life energy!", lastmonst);
+ loselevel();
+ lbeep();
+ return (0);
+
+ case 7:
+ p = "\nThe %s got you with a gusher!";
+ i = rnd(15) + 25 - c[AC];
+ goto spout2;
+
+ case 8:
+ if (c[NOTHEFT])
+ return (0); /* he has a device of no theft */
+ if (c[GOLD]) {
+ p = "\nThe %s hit you -- Your purse feels lighter";
+ if (c[GOLD] > 32767)
+ c[GOLD] >>= 1;
+ else
+ c[GOLD] -= rnd((int) (1 + (c[GOLD] >> 1)));
+ if (c[GOLD] < 0)
+ c[GOLD] = 0;
+ } else
+ p = "\nThe %s couldn't find any gold to steal";
+ lprintf(p, lastmonst);
+ disappear(xx, yy);
+ lbeep();
+ bottomgold();
+ return (1);
+
+ case 9:
+ for (j = 50;;) {/* disenchant */
+ i = rund(26);
+ m = iven[i]; /* randomly select item */
+ if (m > 0 && ivenarg[i] > 0 && m != OSCROLL && m != OPOTION) {
+ if ((ivenarg[i] -= 3) < 0)
+ ivenarg[i] = 0;
+ lprintf("\nThe %s hits you -- you feel a sense of loss", lastmonst);
+ srcount = 0;
+ lbeep();
+ show3(i);
+ bottomline();
+ return (0);
+ }
+ if (--j <= 0) {
+ p = "\nThe %s nearly misses";
+ break;
+ }
+ break;
+ }
+ break;
+
+ case 10:
+ p = "\nThe %s hit you with his barbed tail";
+ i = rnd(25) - c[AC];
+ goto spout2;
+
+ case 11:
+ p = "\nThe %s has confused you";
+ lbeep();
+ c[CONFUSE] += 10 + rnd(10);
+ break;
+
+ case 12: /* performs any number of other special
+ * attacks */
+ return (spattack(spsel[rund(10)], xx, yy));
+
+ case 13:
+ p = "\nThe %s flattens you with his psionics!";
+ i = rnd(15) + 30 - c[AC];
+ goto spout2;
+
+ case 14:
+ if (c[NOTHEFT])
+ return (0); /* he has device of no theft */
+ if (emptyhanded() == 1) {
+ p = "\nThe %s couldn't find anything to steal";
+ break;
+ }
+ lprintf("\nThe %s picks your pocket and takes:", lastmonst);
+ lbeep();
+ if (stealsomething() == 0)
+ lprcat(" nothing");
+ disappear(xx, yy);
+ bottomline();
+ return (1);
+
+ case 15:
+ i = rnd(10) + 5 - c[AC];
+spout3: p = "\nThe %s bit you!";
+ goto spout2;
+
+ case 16:
+ i = rnd(15) + 10 - c[AC];
+ goto spout3;
+ };
+ if (p) {
+ lprintf(p, lastmonst);
+ bottomline();
}
+ return (0);
+}
/*
- * checkloss(x) Routine to subtract hp from user and flag bottomline display
- * int x;
+ * checkloss(x) Routine to subtract hp from user and flag bottomline display
+ * int x;
*
- * Routine to subtract hitpoints from the user and flag the bottomline display
- * Enter with the number of hit points to lose
- * Note: if x > c[HP] this routine could kill the player!
+ * Routine to subtract hitpoints from the user and flag the bottomline display
+ * Enter with the number of hit points to lose
+ * Note: if x > c[HP] this routine could kill the player!
*/
+void
checkloss(x)
- int x;
- {
- if (x>0) { losehp(x); bottomhp(); }
+ int x;
+{
+ if (x > 0) {
+ losehp(x);
+ bottomhp();
}
+}
/*
- * annihilate() Routine to annihilate all monsters around player (playerx,playery)
+ * annihilate() Routine to annihilate all monsters around player (playerx,playery)
*
- * Gives player experience, but no dropped objects
- * Returns the experience gained from all monsters killed
+ * Gives player experience, but no dropped objects
+ * Returns the experience gained from all monsters killed
*/
+int
annihilate()
- {
- int i,j;
- register long k;
- register char *p;
- for (k=0, i=playerx-1; i<=playerx+1; i++)
- for (j=playery-1; j<=playery+1; j++)
- if (!vxy(&i,&j)) /* if not out of bounds */
- if (*(p= &mitem[i][j])) /* if a monster there */
- if (*p<DEMONLORD+2)
- {
- k += monster[*p].experience; *p=know[i][j]=0;
- }
- else
- {
- lprintf("\nThe %s barely escapes being annihilated!",monster[*p].name);
- hitp[i][j] = (hitp[i][j]>>1) + 1; /* lose half hit points*/
+{
+ int i, j;
+ long k;
+ u_char *p;
+ for (k = 0, i = playerx - 1; i <= playerx + 1; i++)
+ for (j = playery - 1; j <= playery + 1; j++)
+ if (!vxy(&i, &j)) { /* if not out of bounds */
+ if (*(p = &mitem[i][j])) { /* if a monster there */
+ if (*p < DEMONLORD + 2) {
+ k += monster[*p].experience;
+ *p = know[i][j] = 0;
+ } else {
+ lprintf("\nThe %s barely escapes being annihilated!", monster[*p].name);
+ hitp[i][j] = (hitp[i][j] >> 1) + 1; /* lose half hit points */
}
- if (k>0)
- {
- lprcat("\nYou hear loud screams of agony!"); raiseexperience((long)k);
- }
- return(k);
+ }
+ }
+ if (k > 0) {
+ lprcat("\nYou hear loud screams of agony!");
+ raiseexperience((long) k);
}
+ return (k);
+}
/*
- * newsphere(x,y,dir,lifetime) Function to create a new sphere of annihilation
- * int x,y,dir,lifetime;
+ * newsphere(x,y,dir,lifetime) Function to create a new sphere of annihilation
+ * int x,y,dir,lifetime;
*
- * Enter with the coordinates of the sphere in x,y
- * the direction (0-8 diroffx format) in dir, and the lifespan of the
- * sphere in lifetime (in turns)
- * Returns the number of spheres currently in existence
+ * Enter with the coordinates of the sphere in x,y
+ * the direction (0-8 diroffx format) in dir, and the lifespan of the
+ * sphere in lifetime (in turns)
+ * Returns the number of spheres currently in existence
*/
-newsphere(x,y,dir,life)
- int x,y,dir,life;
- {
- int m;
- struct sphere *sp;
- if (((sp=(struct sphere *)malloc(sizeof(struct sphere)))) == 0)
- return(c[SPHCAST]); /* can't malloc, therefore failure */
- if (dir>=9) dir=0; /* no movement if direction not found */
- if (level==0) vxy(&x,&y); /* don't go out of bounds */
- else
- {
- if (x<1) x=1; if (x>=MAXX-1) x=MAXX-2;
- if (y<1) y=1; if (y>=MAXY-1) y=MAXY-2;
- }
- if ((m=mitem[x][y]) >= DEMONLORD+4) /* demons dispel spheres */
- {
- know[x][y]=1; show1cell(x,y); /* show the demon (ha ha) */
- cursors(); lprintf("\nThe %s dispels the sphere!",monster[m].name);
- beep(); rmsphere(x,y); /* remove any spheres that are here */
- return(c[SPHCAST]);
- }
- if (m==DISENCHANTRESS) /* disenchantress cancels spheres */
- {
- cursors(); lprintf("\nThe %s causes cancellation of the sphere!",monster[m].name); beep();
-boom: sphboom(x,y); /* blow up stuff around sphere */
- rmsphere(x,y); /* remove any spheres that are here */
- return(c[SPHCAST]);
- }
- if (c[CANCELLATION]) /* cancellation cancels spheres */
- {
- cursors(); lprcat("\nAs the cancellation takes effect, you hear a great earth shaking blast!"); beep();
+int
+newsphere(x, y, dir, life)
+ int x, y, dir, life;
+{
+ int m;
+ struct sphere *sp;
+
+ if (((sp = (struct sphere *) malloc(sizeof(struct sphere)))) == 0)
+ return (c[SPHCAST]); /* can't malloc, therefore failure */
+ if (dir >= 9)
+ dir = 0; /* no movement if direction not found */
+ if (level == 0)
+ vxy(&x, &y); /* don't go out of bounds */
+ else {
+ if (x < 1)
+ x = 1;
+ if (x >= MAXX - 1)
+ x = MAXX - 2;
+ if (y < 1)
+ y = 1;
+ if (y >= MAXY - 1)
+ y = MAXY - 2;
+ }
+ if ((m = mitem[x][y]) >= DEMONLORD + 4) { /* demons dispel spheres */
+ know[x][y] = 1;
+ show1cell(x, y);/* show the demon (ha ha) */
+ cursors();
+ lprintf("\nThe %s dispels the sphere!", monster[m].name);
+ lbeep();
+ rmsphere(x, y); /* remove any spheres that are here */
+ return (c[SPHCAST]);
+ }
+ if (m == DISENCHANTRESS) { /* disenchantress cancels spheres */
+ cursors();
+ lprintf("\nThe %s causes cancellation of the sphere!", monster[m].name);
+ lbeep();
+boom: sphboom(x, y); /* blow up stuff around sphere */
+ rmsphere(x, y); /* remove any spheres that are here */
+ return (c[SPHCAST]);
+ }
+ if (c[CANCELLATION]) { /* cancellation cancels spheres */
+ cursors();
+ lprcat("\nAs the cancellation takes effect, you hear a great earth shaking blast!");
+ lbeep();
goto boom;
- }
- if (item[x][y]==OANNIHILATION) /* collision of spheres detonates spheres */
- {
- cursors(); lprcat("\nTwo spheres of annihilation collide! You hear a great earth shaking blast!"); beep();
- rmsphere(x,y);
+ }
+ if (item[x][y] == OANNIHILATION) { /* collision of spheres
+ * detonates spheres */
+ cursors();
+ lprcat("\nTwo spheres of annihilation collide! You hear a great earth shaking blast!");
+ lbeep();
+ rmsphere(x, y);
goto boom;
- }
- if (playerx==x && playery==y) /* collision of sphere and player! */
- {
+ }
+ if (playerx == x && playery == y) { /* collision of sphere and
+ * player! */
cursors();
lprcat("\nYou have been enveloped by the zone of nothingness!\n");
- beep(); rmsphere(x,y); /* remove any spheres that are here */
- nap(4000); died(258);
- }
- item[x][y]=OANNIHILATION; mitem[x][y]=0; know[x][y]=1;
- show1cell(x,y); /* show the new sphere */
- sp->x=x; sp->y=y; sp->lev=level; sp->dir=dir; sp->lifetime=life; sp->p=0;
- if (spheres==0) spheres=sp; /* if first node in the sphere list */
- else /* add sphere to beginning of linked list */
- {
- sp->p = spheres; spheres = sp;
- }
- return(++c[SPHCAST]); /* one more sphere in the world */
+ lbeep();
+ rmsphere(x, y); /* remove any spheres that are here */
+ nap(4000);
+ died(258);
+ }
+ item[x][y] = OANNIHILATION;
+ mitem[x][y] = 0;
+ know[x][y] = 1;
+ show1cell(x, y); /* show the new sphere */
+ sp->x = x;
+ sp->y = y;
+ sp->lev = level;
+ sp->dir = dir;
+ sp->lifetime = life;
+ sp->p = 0;
+ if (spheres == 0)
+ spheres = sp; /* if first node in the sphere list */
+ else { /* add sphere to beginning of linked list */
+ sp->p = spheres;
+ spheres = sp;
}
+ return (++c[SPHCAST]); /* one more sphere in the world */
+}
/*
- * rmsphere(x,y) Function to delete a sphere of annihilation from list
- * int x,y;
+ * rmsphere(x,y) Function to delete a sphere of annihilation from list
+ * int x,y;
*
- * Enter with the coordinates of the sphere (on current level)
- * Returns the number of spheres currently in existence
+ * Enter with the coordinates of the sphere (on current level)
+ * Returns the number of spheres currently in existence
*/
-rmsphere(x,y)
- int x,y;
- {
- register struct sphere *sp,*sp2=0;
- for (sp=spheres; sp; sp2=sp,sp=sp->p)
- if (level==sp->lev) /* is sphere on this level? */
- if ((x==sp->x) && (y==sp->y)) /* locate sphere at this location */
- {
- item[x][y]=mitem[x][y]=0; know[x][y]=1;
- show1cell(x,y); /* show the now missing sphere */
- --c[SPHCAST];
- if (sp==spheres) { sp2=sp; spheres=sp->p; free((char*)sp2); }
- else
- { sp2->p = sp->p; free((char*)sp); }
- break;
+int
+rmsphere(x, y)
+ int x, y;
+{
+ struct sphere *sp, *sp2 = 0;
+
+ for (sp = spheres; sp; sp2 = sp, sp = sp->p)
+ if (level == sp->lev) /* is sphere on this level? */
+ if ((x == sp->x) && (y == sp->y)) { /* locate sphere at this
+ * location */
+ item[x][y] = mitem[x][y] = 0;
+ know[x][y] = 1;
+ show1cell(x, y); /* show the now missing
+ * sphere */
+ --c[SPHCAST];
+ if (sp == spheres) {
+ sp2 = sp;
+ spheres = sp->p;
+ free((char *) sp2);
+ } else {
+ sp2->p = sp->p;
+ free((char *) sp);
+ }
+ break;
}
- return(c[SPHCAST]); /* return number of spheres in the world */
- }
+ return (c[SPHCAST]); /* return number of spheres in the world */
+}
/*
- * sphboom(x,y) Function to perform the effects of a sphere detonation
- * int x,y;
+ * sphboom(x,y) Function to perform the effects of a sphere detonation
+ * int x,y;
*
- * Enter with the coordinates of the blast, Returns no value
+ * Enter with the coordinates of the blast, Returns no value
*/
-sphboom(x,y)
- int x,y;
- {
- register int i,j;
- if (c[HOLDMONST]) c[HOLDMONST]=1;
- if (c[CANCELLATION]) c[CANCELLATION]=1;
- for (j=max(1,x-2); j<min(x+3,MAXX-1); j++)
- for (i=max(1,y-2); i<min(y+3,MAXY-1); i++)
- {
- item[j][i]=mitem[j][i]=0;
- show1cell(j,i);
- if (playerx==j && playery==i)
- {
- cursors(); beep();
- lprcat("\nYou were too close to the sphere!");
- nap(3000);
- died(283); /* player killed in explosion */
+void
+sphboom(x, y)
+ int x, y;
+{
+ int i, j;
+
+ if (c[HOLDMONST])
+ c[HOLDMONST] = 1;
+ if (c[CANCELLATION])
+ c[CANCELLATION] = 1;
+ for (j = max(1, x - 2); j < min(x + 3, MAXX - 1); j++)
+ for (i = max(1, y - 2); i < min(y + 3, MAXY - 1); i++) {
+ item[j][i] = mitem[j][i] = 0;
+ show1cell(j, i);
+ if (playerx == j && playery == i) {
+ cursors();
+ lbeep();
+ lprcat("\nYou were too close to the sphere!");
+ nap(3000);
+ died(283); /* player killed in explosion */
}
}
- }
+}
/*
- * genmonst() Function to ask for monster and genocide from game
+ * genmonst() Function to ask for monster and genocide from game
*
- * This is done by setting a flag in the monster[] structure
+ * This is done by setting a flag in the monster[] structure
*/
+void
genmonst()
- {
- register int i,j;
- cursors(); lprcat("\nGenocide what monster? ");
- for (i=0; (!isalpha(i)) && (i!=' '); i=getchar());
+{
+ int i, j;
+
+ cursors();
+ lprcat("\nGenocide what monster? ");
+ for (i = 0; (!isalpha(i)) && (i != ' ');
+ i = lgetchar());
lprc(i);
- for (j=0; j<MAXMONST; j++) /* search for the monster type */
- if (monstnamelist[j]==i) /* have we found it? */
- {
- monster[j].genocided=1; /* genocided from game */
- lprintf(" There will be no more %s's",monster[j].name);
+ for (j = 0; j < MAXMONST; j++) /* search for the monster type */
+ if (monstnamelist[j] == i) { /* have we found it? */
+ monster[j].genocided = 1; /* genocided from game */
+ lprintf(" There will be no more %s's", monster[j].name);
/* now wipe out monsters on this level */
- newcavelevel(level); draws(0,MAXX,0,MAXY); bot_linex();
+ newcavelevel(level);
+ draws(0, MAXX, 0, MAXY);
+ bot_linex();
return;
- }
+ }
lprcat(" You sense failure!");
- }
-
+}
diff --git a/games/larn/moreobj.c b/games/larn/moreobj.c
index 17433e18166..edc283d11a6 100644
--- a/games/larn/moreobj.c
+++ b/games/larn/moreobj.c
@@ -1,19 +1,25 @@
-#ifndef lint
-static char rcsid[] = "$NetBSD: moreobj.c,v 1.3 1995/03/23 08:33:54 cgd Exp $";
-#endif /* not lint */
+/* $OpenBSD: moreobj.c,v 1.3 1998/09/15 05:12:32 pjanzen Exp $ */
+/* $NetBSD: moreobj.c,v 1.4 1997/10/18 20:03:32 christos Exp $ */
-/* moreobj.c Larn is copyrighted 1986 by Noah Morgan.
- *
- * Routines in this file:
- *
- * oaltar()
- * othrone()
- * ochest()
- * ofountain()
+/*
+ * moreobj.c Larn is copyrighted 1986 by Noah Morgan.
+ *
+ * Routines in this file:
+ *
+ * oaltar() othrone() ochest() ofountain()
*/
+#ifndef lint
+static char rcsid[] = "$OpenBSD: moreobj.c,v 1.3 1998/09/15 05:12:32 pjanzen Exp $";
+#endif /* not lint */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
#include "header.h"
+#include "extern.h"
-static void ohear();
+static void ohear __P((int));
+static void fch __P((int, long *));
/*
* ******
@@ -22,359 +28,466 @@ static void ohear();
*
* subroutine to process an altar object
*/
+void
oaltar()
- {
- unsigned long k;
+{
+ unsigned long k;
- lprcat("\nDo you (p) pray (d) desecrate"); iopts();
- while (1)
- {
- while (1) switch(getchar())
- {
- case 'p': lprcat(" pray\nDo you (m) give money or (j) just pray? ");
- while (1) switch(getchar())
- {
- case 'j': if (rnd(100)<75)
- lprcat("\nnothing happens");
- else if (rnd(13)<4) ohear(1);
- else if (rnd(43) == 10)
- {
- if (c[WEAR]) lprcat("\nYou feel your armor vibrate for a moment");
- enchantarmor(); return;
- }
- else if (rnd(43) == 10)
- {
- if (c[WIELD]) lprcat("\nYou feel your weapon vibrate for a moment");
- enchweapon(); return;
- }
- else createmonster(makemonst(level+1));
- return;
-
- case 'm': lprcat("\n\n"); cursor(1,24); cltoeoln();
- cursor(1,23); cltoeoln();
- lprcat("how much do you donate? ");
- k = readnum((long)c[GOLD]);
- if (c[GOLD]<k)
- {
- lprcat("You don't have that much!");
- return;
- }
- c[GOLD] -= k;
- if (k < c[GOLD]/10 || k<rnd(50))
- { createmonster(makemonst(level+1)); c[AGGRAVATE] += 200; }
- else if (rnd(101) > 50) { ohear(0); return; }
- else if (rnd(43) == 5)
- {
- if (c[WEAR]) lprcat("You feel your armor vibrate for a moment");
- enchantarmor(); return;
- }
- else if (rnd(43) == 8)
- {
- if (c[WIELD]) lprcat("You feel your weapon vibrate for a moment");
- enchweapon(); return;
- }
- else lprcat("Thank You.");
- bottomline(); return;
-
- case '\33': return;
- };
-
- case 'd': lprcat(" desecrate");
- if (rnd(100)<60)
- { createmonster(makemonst(level+2)+8); c[AGGRAVATE] += 2500; }
- else
- if (rnd(101)<30)
- {
- lprcat("\nThe altar crumbles into a pile of dust before your eyes");
- forget(); /* remember to destroy the altar */
+ lprcat("\nDo you (p) pray (d) desecrate");
+ iopts();
+ while (1) {
+ while (1)
+ switch (lgetchar()) {
+ case 'p':
+ lprcat(" pray\nDo you (m) give money or (j) just pray? ");
+ while (1)
+ switch (lgetchar()) {
+ case 'j':
+ if (rnd(100) < 75)
+ lprcat("\nnothing happens");
+ else if (rnd(13) < 4)
+ ohear(1);
+ else if (rnd(43) == 10) {
+ if (c[WEAR])
+ lprcat("\nYou feel your armor vibrate for a moment");
+ enchantarmor();
+ return;
+ } else if (rnd(43) == 10) {
+ if (c[WIELD])
+ lprcat("\nYou feel your weapon vibrate for a moment");
+ enchweapon();
+ return;
+ } else
+ createmonster(makemonst(level + 1));
+ return;
+
+ case 'm':
+ lprcat("\n\n");
+ cursor(1, 24);
+ cltoeoln();
+ cursor(1, 23);
+ cltoeoln();
+ lprcat("how much do you donate? ");
+ k = readnum((long) c[GOLD]);
+ if (c[GOLD] < k) {
+ lprcat("You don't have that much!");
+ return;
}
- else
- lprcat("\nnothing happens");
- return;
+ c[GOLD] -= k;
+ if (k < c[GOLD] / 10 || k < rnd(50)) {
+ createmonster(makemonst(level + 1));
+ c[AGGRAVATE] += 200;
+ } else if (rnd(101) > 50) {
+ ohear(0);
+ return;
+ } else if (rnd(43) == 5) {
+ if (c[WEAR])
+ lprcat("You feel your armor vibrate for a moment");
+ enchantarmor();
+ return;
+ } else if (rnd(43) == 8) {
+ if (c[WIELD])
+ lprcat("You feel your weapon vibrate for a moment");
+ enchweapon();
+ return;
+ } else
+ lprcat("Thank You.");
+ bottomline();
+ return;
- case 'i':
- case '\33': ignore();
- if (rnd(100)<30) { createmonster(makemonst(level+1)); c[AGGRAVATE] += rnd(450); }
- else lprcat("\nnothing happens");
- return;
- };
- }
+ case '\33':
+ return;
+ };
+
+ case 'd':
+ lprcat(" desecrate");
+ if (rnd(100) < 60) {
+ createmonster(makemonst(level + 2) + 8);
+ c[AGGRAVATE] += 2500;
+ } else if (rnd(101) < 30) {
+ lprcat("\nThe altar crumbles into a pile of dust before your eyes");
+ forget(); /* remember to destroy
+ * the altar */
+ } else
+ lprcat("\nnothing happens");
+ return;
+
+ case 'i':
+ case '\33':
+ ignore();
+ if (rnd(100) < 30) {
+ createmonster(makemonst(level + 1));
+ c[AGGRAVATE] += rnd(450);
+ } else
+ lprcat("\nnothing happens");
+ return;
+ };
}
+}
/*
- function to cast a +3 protection on the player
+ * function to cast a +3 protection on the player
*/
static void
ohear(do_newline)
- int do_newline;
- {
+ int do_newline;
+{
if (do_newline)
lprcat("\nYou have been heard!");
else
lprcat("You have been heard!");
- if (c[ALTPRO]==0) c[MOREDEFENSES]+=3;
+ if (c[ALTPRO] == 0)
+ c[MOREDEFENSES] += 3;
c[ALTPRO] += 500; /* protection field */
bottomline();
- }
+}
/*
- *******
- OTHRONE
- *******
-
- subroutine to process a throne object
+ * *******
+ * OTHRONE
+ * *******
+ *
+ * subroutine to process a throne object
*/
+void
othrone(arg)
- int arg;
- {
- register int i,k;
+ int arg;
+{
+ int i, k;
- lprcat("\nDo you (p) pry off jewels, (s) sit down"); iopts();
- while (1)
- {
- while (1) switch(getchar())
- {
- case 'p': lprcat(" pry off"); k=rnd(101);
- if (k<25)
- {
- for (i=0; i<rnd(4); i++) creategem(); /* gems pop off the throne */
- item[playerx][playery]=ODEADTHRONE;
- know[playerx][playery]=0;
- }
- else if (k<40 && arg==0)
- {
- createmonster(GNOMEKING);
- item[playerx][playery]=OTHRONE2;
- know[playerx][playery]=0;
- }
- else lprcat("\nnothing happens");
- return;
-
- case 's': lprcat(" sit down"); k=rnd(101);
- if (k<30 && arg==0)
- {
- createmonster(GNOMEKING);
- item[playerx][playery]=OTHRONE2;
- know[playerx][playery]=0;
- }
- else if (k<35) { lprcat("\nZaaaappp! You've been teleported!\n"); beep(); oteleport(0); }
- else lprcat("\nnothing happens");
- return;
+ lprcat("\nDo you (p) pry off jewels, (s) sit down");
+ iopts();
+ while (1) {
+ while (1)
+ switch (lgetchar()) {
+ case 'p':
+ lprcat(" pry off");
+ k = rnd(101);
+ if (k < 25) {
+ for (i = 0; i < rnd(4); i++)
+ creategem(); /* gems pop off the
+ * throne */
+ item[playerx][playery] = ODEADTHRONE;
+ know[playerx][playery] = 0;
+ } else if (k < 40 && arg == 0) {
+ createmonster(GNOMEKING);
+ item[playerx][playery] = OTHRONE2;
+ know[playerx][playery] = 0;
+ } else
+ lprcat("\nnothing happens");
+ return;
- case 'i':
- case '\33': ignore(); return;
- };
- }
+ case 's':
+ lprcat(" sit down");
+ k = rnd(101);
+ if (k < 30 && arg == 0) {
+ createmonster(GNOMEKING);
+ item[playerx][playery] = OTHRONE2;
+ know[playerx][playery] = 0;
+ } else if (k < 35) {
+ lprcat("\nZaaaappp! You've been teleported!\n");
+ lbeep();
+ oteleport(0);
+ } else
+ lprcat("\nnothing happens");
+ return;
+
+ case 'i':
+ case '\33':
+ ignore();
+ return;
+ };
}
+}
+void
odeadthrone()
- {
- register int k;
+{
+ int k;
- lprcat("\nDo you (s) sit down"); iopts();
- while (1)
- {
- while (1) switch(getchar())
- {
- case 's': lprcat(" sit down"); k=rnd(101);
- if (k<35) { lprcat("\nZaaaappp! You've been teleported!\n"); beep(); oteleport(0); }
- else lprcat("\nnothing happens");
- return;
+ lprcat("\nDo you (s) sit down");
+ iopts();
+ while (1) {
+ while (1)
+ switch (lgetchar()) {
+ case 's':
+ lprcat(" sit down");
+ k = rnd(101);
+ if (k < 35) {
+ lprcat("\nZaaaappp! You've been teleported!\n");
+ lbeep();
+ oteleport(0);
+ } else
+ lprcat("\nnothing happens");
+ return;
- case 'i':
- case '\33': ignore(); return;
- };
- }
+ case 'i':
+ case '\33':
+ ignore();
+ return;
+ };
}
+}
/*
- ******
- OCHEST
- ******
-
- subroutine to process a throne object
+ * ******
+ * OCHEST
+ * ******
+ *
+ * subroutine to process a throne object
*/
+void
ochest()
- {
- register int i,k;
- lprcat("\nDo you (t) take it, (o) try to open it"); iopts();
- while (1)
- {
- while (1) switch(getchar())
- {
- case 'o': lprcat(" open it"); k=rnd(101);
- if (k<40)
- {
- lprcat("\nThe chest explodes as you open it"); beep();
- i = rnd(10); lastnum=281; /* in case he dies */
- lprintf("\nYou suffer %d hit points damage!",(long)i);
- checkloss(i);
- switch(rnd(10)) /* see if he gets a curse */
- {
- case 1: c[ITCHING]+= rnd(1000)+100;
- lprcat("\nYou feel an irritation spread over your skin!");
- beep();
- break;
-
- case 2: c[CLUMSINESS]+= rnd(1600)+200;
- lprcat("\nYou begin to lose hand to eye coordination!");
- beep();
- break;
-
- case 3: c[HALFDAM]+= rnd(1600)+200;
- beep();
- lprcat("\nA sickness engulfs you!"); break;
- };
- item[playerx][playery]=know[playerx][playery]=0;
- if (rnd(100)<69) creategem(); /* gems from the chest */
- dropgold(rnd(110*iarg[playerx][playery]+200));
- for (i=0; i<rnd(4); i++) something(iarg[playerx][playery]+2);
- }
- else lprcat("\nnothing happens");
- return;
+{
+ int i, k;
- case 't': lprcat(" take");
- if (take(OCHEST,iarg[playerx][playery])==0)
- item[playerx][playery]=know[playerx][playery]=0;
- return;
+ lprcat("\nDo you (t) take it, (o) try to open it");
+ iopts();
+ while (1) {
+ while (1)
+ switch (lgetchar()) {
+ case 'o':
+ lprcat(" open it");
+ k = rnd(101);
+ if (k < 40) {
+ lprcat("\nThe chest explodes as you open it");
+ lbeep();
+ i = rnd(10);
+ lastnum = 281; /* in case he dies */
+ lprintf("\nYou suffer %d hit points damage!", (long) i);
+ checkloss(i);
+ switch (rnd(10)) { /* see if he gets a
+ * curse */
+ case 1:
+ c[ITCHING] += rnd(1000) + 100;
+ lprcat("\nYou feel an irritation spread over your skin!");
+ lbeep();
+ break;
- case 'i':
- case '\33': ignore(); return;
- };
- }
+ case 2:
+ c[CLUMSINESS] += rnd(1600) + 200;
+ lprcat("\nYou begin to lose hand to eye coordination!");
+ lbeep();
+ break;
+
+ case 3:
+ c[HALFDAM] += rnd(1600) + 200;
+ lbeep();
+ lprcat("\nA sickness engulfs you!");
+ break;
+ };
+ item[playerx][playery] = know[playerx][playery] = 0;
+ if (rnd(100) < 69)
+ creategem(); /* gems from the chest */
+ dropgold(rnd(110 * iarg[playerx][playery] + 200));
+ for (i = 0; i < rnd(4); i++)
+ something(iarg[playerx][playery] + 2);
+ } else
+ lprcat("\nnothing happens");
+ return;
+
+ case 't':
+ lprcat(" take");
+ if (take(OCHEST, iarg[playerx][playery]) == 0)
+ item[playerx][playery] = know[playerx][playery] = 0;
+ return;
+
+ case 'i':
+ case '\33':
+ ignore();
+ return;
+ };
}
+}
/*
- *********
- OFOUNTAIN
- *********
+ * *********
+ * OFOUNTAIN
+ * *********
*/
+void
ofountain()
- {
- register int x;
+{
+ int x;
+
cursors();
- lprcat("\nDo you (d) drink, (w) wash yourself"); iopts();
- while (1) switch(getchar())
- {
- case 'd': lprcat("drink");
- if (rnd(1501)<2)
- {
- lprcat("\nOops! You seem to have caught the dreadful sleep!");
- beep(); lflush(); sleep(3); died(280); return;
- }
- x = rnd(100);
- if (x<7)
- {
- c[HALFDAM] += 200+rnd(200);
- lprcat("\nYou feel a sickness coming on");
- }
- else if (x<13) quaffpotion(23); /* see invisible */
- else if (x < 45)
- lprcat("\nnothing seems to have happened");
- else if (rnd(3) != 2)
- fntchange(1); /* change char levels upward */
- else
- fntchange(-1); /* change char levels downward */
- if (rnd(12)<3)
- {
- lprcat("\nThe fountains bubbling slowly quiets");
- item[playerx][playery]=ODEADFOUNTAIN; /* dead fountain */
- know[playerx][playery]=0;
- }
- return;
+ lprcat("\nDo you (d) drink, (w) wash yourself");
+ iopts();
+ while (1)
+ switch (lgetchar()) {
+ case 'd':
+ lprcat("drink");
+ if (rnd(1501) < 2) {
+ lprcat("\nOops! You seem to have caught the dreadful sleep!");
+ lbeep();
+ lflush();
+ sleep(3);
+ died(280);
+ return;
+ }
+ x = rnd(100);
+ if (x < 7) {
+ c[HALFDAM] += 200 + rnd(200);
+ lprcat("\nYou feel a sickness coming on");
+ } else if (x < 13)
+ quaffpotion(23); /* see invisible */
+ else if (x < 45)
+ lprcat("\nnothing seems to have happened");
+ else if (rnd(3) != 2)
+ fntchange(1); /* change char levels upward */
+ else
+ fntchange(-1); /* change char levels
+ * downward */
+ if (rnd(12) < 3) {
+ lprcat("\nThe fountains bubbling slowly quiets");
+ item[playerx][playery] = ODEADFOUNTAIN; /* dead fountain */
+ know[playerx][playery] = 0;
+ }
+ return;
case '\33':
- case 'i': ignore(); return;
-
- case 'w': lprcat("wash yourself");
- if (rnd(100) < 11)
- {
- x=rnd((level<<2)+2);
- lprintf("\nOh no! The water was foul! You suffer %d hit points!",(long)x);
- lastnum=273; losehp(x); bottomline(); cursors();
- }
- else
- if (rnd(100) < 29)
- lprcat("\nYou got the dirt off!");
- else
- if (rnd(100) < 31)
- lprcat("\nThis water seems to be hard water! The dirt didn't come off!");
- else
- if (rnd(100) < 34)
- createmonster(WATERLORD); /* make water lord */
- else
- lprcat("\nnothing seems to have happened");
- return;
+ case 'i':
+ ignore();
+ return;
+
+ case 'w':
+ lprcat("wash yourself");
+ if (rnd(100) < 11) {
+ x = rnd((level << 2) + 2);
+ lprintf("\nOh no! The water was foul! You suffer %d hit points!", (long) x);
+ lastnum = 273;
+ losehp(x);
+ bottomline();
+ cursors();
+ } else if (rnd(100) < 29)
+ lprcat("\nYou got the dirt off!");
+ else if (rnd(100) < 31)
+ lprcat("\nThis water seems to be hard water! The dirt didn't come off!");
+ else if (rnd(100) < 34)
+ createmonster(WATERLORD); /* make water lord */
+ else
+ lprcat("\nnothing seems to have happened");
+ return;
}
- }
+}
/*
- ***
- FCH
- ***
-
- subroutine to process an up/down of a character attribute for ofountain
+ * ***
+ * FCH
+ * ***
+ *
+ * subroutine to process an up/down of a character attribute for ofountain
*/
static void
-fch(how,x)
- int how;
- long *x;
- {
- if (how < 0) { lprcat(" went down by one!"); --(*x); }
- else { lprcat(" went up by one!"); (*x)++; }
- bottomline();
+fch(how, x)
+ int how;
+ long *x;
+{
+ if (how < 0) {
+ lprcat(" went down by one!");
+ --(*x);
+ } else {
+ lprcat(" went up by one!");
+ (*x)++;
}
+ bottomline();
+}
/*
- a subroutine to raise or lower character levels
- if x > 0 they are raised if x < 0 they are lowered
+ * a subroutine to raise or lower character levels
+ * if x > 0 they are raised if x < 0 they are lowered
*/
+void
fntchange(how)
- int how;
- {
- register long j;
+ int how;
+{
+ long j;
+
lprc('\n');
- switch(rnd(9))
- {
- case 1: lprcat("Your strength"); fch(how,&c[0]); break;
- case 2: lprcat("Your intelligence"); fch(how,&c[1]); break;
- case 3: lprcat("Your wisdom"); fch(how,&c[2]); break;
- case 4: lprcat("Your constitution"); fch(how,&c[3]); break;
- case 5: lprcat("Your dexterity"); fch(how,&c[4]); break;
- case 6: lprcat("Your charm"); fch(how,&c[5]); break;
- case 7: j=rnd(level+1);
- if (how < 0)
- { lprintf("You lose %d hit point",(long)j); if (j>1) lprcat("s!"); else lprc('!'); losemhp((int)j); }
- else
- { lprintf("You gain %d hit point",(long)j); if (j>1) lprcat("s!"); else lprc('!'); raisemhp((int)j); }
- bottomline(); break;
-
- case 8: j=rnd(level+1);
- if (how > 0)
- {
- lprintf("You just gained %d spell",(long)j); raisemspells((int)j);
- if (j>1) lprcat("s!"); else lprc('!');
- }
- else
- {
- lprintf("You just lost %d spell",(long)j); losemspells((int)j);
- if (j>1) lprcat("s!"); else lprc('!');
- }
- bottomline(); break;
-
- case 9: j = 5*rnd((level+1)*(level+1));
- if (how < 0)
- {
- lprintf("You just lost %d experience point",(long)j);
- if (j>1) lprcat("s!"); else lprc('!'); loseexperience((long)j);
- }
- else
- {
- lprintf("You just gained %d experience point",(long)j);
- if (j>1) lprcat("s!"); else lprc('!'); raiseexperience((long)j);
- }
- break;
+ switch (rnd(9)) {
+ case 1:
+ lprcat("Your strength");
+ fch(how, &c[0]);
+ break;
+ case 2:
+ lprcat("Your intelligence");
+ fch(how, &c[1]);
+ break;
+ case 3:
+ lprcat("Your wisdom");
+ fch(how, &c[2]);
+ break;
+ case 4:
+ lprcat("Your constitution");
+ fch(how, &c[3]);
+ break;
+ case 5:
+ lprcat("Your dexterity");
+ fch(how, &c[4]);
+ break;
+ case 6:
+ lprcat("Your charm");
+ fch(how, &c[5]);
+ break;
+ case 7:
+ j = rnd(level + 1);
+ if (how < 0) {
+ lprintf("You lose %d hit point", (long) j);
+ if (j > 1)
+ lprcat("s!");
+ else
+ lprc('!');
+ losemhp((int) j);
+ } else {
+ lprintf("You gain %d hit point", (long) j);
+ if (j > 1)
+ lprcat("s!");
+ else
+ lprc('!');
+ raisemhp((int) j);
}
- cursors();
+ bottomline();
+ break;
+
+ case 8:
+ j = rnd(level + 1);
+ if (how > 0) {
+ lprintf("You just gained %d spell", (long) j);
+ raisemspells((int) j);
+ if (j > 1)
+ lprcat("s!");
+ else
+ lprc('!');
+ } else {
+ lprintf("You just lost %d spell", (long) j);
+ losemspells((int) j);
+ if (j > 1)
+ lprcat("s!");
+ else
+ lprc('!');
+ }
+ bottomline();
+ break;
+
+ case 9:
+ j = 5 * rnd((level + 1) * (level + 1));
+ if (how < 0) {
+ lprintf("You just lost %d experience point", (long) j);
+ if (j > 1)
+ lprcat("s!");
+ else
+ lprc('!');
+ loseexperience((long) j);
+ } else {
+ lprintf("You just gained %d experience point", (long) j);
+ if (j > 1)
+ lprcat("s!");
+ else
+ lprc('!');
+ raiseexperience((long) j);
+ }
+ break;
}
+ cursors();
+}
diff --git a/games/larn/movem.c b/games/larn/movem.c
index f02e1e432b2..4defecc4e06 100644
--- a/games/larn/movem.c
+++ b/games/larn/movem.c
@@ -1,316 +1,449 @@
-#ifndef lint
-static char rcsid[] = "$NetBSD: movem.c,v 1.3 1995/03/23 08:33:58 cgd Exp $";
-#endif /* not lint */
+/* $OpenBSD: movem.c,v 1.3 1998/09/15 05:12:32 pjanzen Exp $ */
+/* $NetBSD: movem.c,v 1.5 1997/10/18 20:03:34 christos Exp $ */
/*
- * movem.c (move monster) Larn is copyrighted 1986 by Noah Morgan.
+ * movem.c (move monster) Larn is copyrighted 1986 by Noah Morgan.
*
- * Here are the functions in this file:
+ * Here are the functions in this file:
*
- * movemonst() Routine to move the monsters toward the player
- * movemt(x,y) Function to move a monster at (x,y) -- must determine where
- * mmove(x,y,xd,yd) Function to actually perform the monster movement
- * movsphere() Function to look for and move spheres of annihilation
+ * movemonst() Routine to move the monsters toward the player
+ * movemt(x,y) Function to move a monster at (x,y) -- must determine where
+ * mmove(x,y,xd,yd) Function to actually perform the monster movement
+ * movsphere() Function to look for and move spheres of annihilation
*/
+#ifndef lint
+static char rcsid[] = "$OpenBSD: movem.c,v 1.3 1998/09/15 05:12:32 pjanzen Exp $";
+#endif /* not lint */
+
#include "header.h"
+#include "extern.h"
/*
- * movemonst() Routine to move the monsters toward the player
+ * movemonst() Routine to move the monsters toward the player
*
- * This routine has the responsibility to determine which monsters are to
- * move, and call movemt() to do the move.
- * Returns no value.
+ * This routine has the responsibility to determine which monsters are to
+ * move, and call movemt() to do the move.
+ * Returns no value.
*/
-static short w1[9],w1x[9],w1y[9];
-static int tmp1,tmp2,tmp3,tmp4,distance;
+static short w1[9], w1x[9], w1y[9];
+static int tmp1, tmp2, tmp3, tmp4, distance;
+
+void
movemonst()
- {
- register int i,j;
- if (c[TIMESTOP]) return; /* no action if time is stopped */
- if (c[HASTESELF]) if ((c[HASTESELF]&1)==0) return;
- if (spheres) movsphere(); /* move the spheres of annihilation if any */
- if (c[HOLDMONST]) return; /* no action if monsters are held */
+{
+ int i, j;
- if (c[AGGRAVATE]) /* determine window of monsters to move */
- {
- tmp1=playery-5; tmp2=playery+6; tmp3=playerx-10; tmp4=playerx+11;
- distance=40; /* depth of intelligent monster movement */
- }
- else
- {
- tmp1=playery-3; tmp2=playery+4; tmp3=playerx-5; tmp4=playerx+6;
- distance=17; /* depth of intelligent monster movement */
- }
+ if (c[TIMESTOP])
+ return; /* no action if time is stopped */
+ if (c[HASTESELF])
+ if ((c[HASTESELF] & 1) == 0)
+ return;
+ if (spheres)
+ movsphere(); /* move the spheres of annihilation if any */
+ if (c[HOLDMONST])
+ return; /* no action if monsters are held */
- if (level == 0) /* if on outside level monsters can move in perimeter */
- {
- if (tmp1 < 0) tmp1=0; if (tmp2 > MAXY) tmp2=MAXY;
- if (tmp3 < 0) tmp3=0; if (tmp4 > MAXX) tmp4=MAXX;
- }
- else /* if in a dungeon monsters can't be on the perimeter (wall there) */
- {
- if (tmp1 < 1) tmp1=1; if (tmp2 > MAXY-1) tmp2=MAXY-1;
- if (tmp3 < 1) tmp3=1; if (tmp4 > MAXX-1) tmp4=MAXX-1;
- }
+ if (c[AGGRAVATE]) { /* determine window of monsters to move */
+ tmp1 = playery - 5;
+ tmp2 = playery + 6;
+ tmp3 = playerx - 10;
+ tmp4 = playerx + 11;
+ distance = 40; /* depth of intelligent monster movement */
+ } else {
+ tmp1 = playery - 3;
+ tmp2 = playery + 4;
+ tmp3 = playerx - 5;
+ tmp4 = playerx + 6;
+ distance = 17; /* depth of intelligent monster movement */
+ }
+
+ if (level == 0) { /* if on outside level monsters can move in
+ * perimeter */
+ if (tmp1 < 0)
+ tmp1 = 0;
+ if (tmp2 > MAXY)
+ tmp2 = MAXY;
+ if (tmp3 < 0)
+ tmp3 = 0;
+ if (tmp4 > MAXX)
+ tmp4 = MAXX;
+ } else { /* if in a dungeon monsters can't be on the
+ * perimeter (wall there) */
+ if (tmp1 < 1)
+ tmp1 = 1;
+ if (tmp2 > MAXY - 1)
+ tmp2 = MAXY - 1;
+ if (tmp3 < 1)
+ tmp3 = 1;
+ if (tmp4 > MAXX - 1)
+ tmp4 = MAXX - 1;
+ }
- for (j=tmp1; j<tmp2; j++) /* now reset monster moved flags */
- for (i=tmp3; i<tmp4; i++)
+ for (j = tmp1; j < tmp2; j++) /* now reset monster moved flags */
+ for (i = tmp3; i < tmp4; i++)
moved[i][j] = 0;
- moved[lasthx][lasthy]=0;
+ moved[lasthx][lasthy] = 0;
- if (c[AGGRAVATE] || !c[STEALTH]) /* who gets moved? split for efficiency */
- {
- for (j=tmp1; j<tmp2; j++) /* look thru all locations in window */
- for (i=tmp3; i<tmp4; i++)
- if (mitem[i][j]) /* if there is a monster to move */
- if (moved[i][j]==0) /* if it has not already been moved */
- movemt(i,j); /* go and move the monster */
- }
- else /* not aggravated and not stealth */
- {
- for (j=tmp1; j<tmp2; j++) /* look thru all locations in window */
- for (i=tmp3; i<tmp4; i++)
- if (mitem[i][j]) /* if there is a monster to move */
- if (moved[i][j]==0) /* if it has not already been moved */
- if (stealth[i][j]) /* if it is asleep due to stealth */
- movemt(i,j); /* go and move the monster */
- }
+ if (c[AGGRAVATE] || !c[STEALTH]) { /* who gets moved? split for
+ * efficiency */
+ for (j = tmp1; j < tmp2; j++) /* look thru all locations in
+ * window */
+ for (i = tmp3; i < tmp4; i++)
+ if (mitem[i][j]) /* if there is a monster
+ * to move */
+ if (moved[i][j] == 0) /* if it has not already
+ * been moved */
+ movemt(i, j); /* go and move the
+ * monster */
+ } else { /* not aggravated and not stealth */
+ for (j = tmp1; j < tmp2; j++) /* look thru all locations in
+ * window */
+ for (i = tmp3; i < tmp4; i++)
+ if (mitem[i][j]) /* if there is a monster
+ * to move */
+ if (moved[i][j] == 0) /* if it has not already
+ * been moved */
+ if (stealth[i][j]) /* if it is asleep due
+ * to stealth */
+ movemt(i, j); /* go and move the
+ * monster */
+ }
- if (mitem[lasthx][lasthy]) /* now move monster last hit by player if not already moved */
- {
- if (moved[lasthx][lasthy]==0) /* if it has not already been moved */
- {
- movemt(lasthx,lasthy);
- lasthx = w1x[0]; lasthy = w1y[0];
- }
+ if (mitem[lasthx][lasthy]) { /* now move monster last hit by
+ * player if not already moved */
+ if (moved[lasthx][lasthy] == 0) { /* if it has not already
+ * been moved */
+ movemt(lasthx, lasthy);
+ lasthx = w1x[0];
+ lasthy = w1y[0];
}
}
+}
/*
- * movemt(x,y) Function to move a monster at (x,y) -- must determine where
- * int x,y;
+ * movemt(x,y) Function to move a monster at (x,y) -- must determine where
+ * int x,y;
*
- * This routine is responsible for determining where one monster at (x,y) will
- * move to. Enter with the monsters coordinates in (x,y).
- * Returns no value.
+ * This routine is responsible for determining where one monster at (x,y) will
+ * move to. Enter with the monsters coordinates in (x,y).
+ * Returns no value.
*/
-static int tmpitem,xl,xh,yl,yh;
-movemt(i,j)
- int i,j;
- {
- register int k,m,z,tmp,xtmp,ytmp,monst;
- switch(monst=mitem[i][j]) /* for half speed monsters */
- {
- case TROGLODYTE: case HOBGOBLIN: case METAMORPH: case XVART:
- case INVISIBLESTALKER: case ICELIZARD: if ((gltime & 1) == 1) return;
- };
-
- if (c[SCAREMONST]) /* choose destination randomly if scared */
- {
- if ((xl = i+rnd(3)-2) < 0) xl=0; if (xl >= MAXX) xl=MAXX-1;
- if ((yl = j+rnd(3)-2) < 0) yl=0; if (yl >= MAXY) yl=MAXY-1;
- if ((tmp=item[xl][yl]) != OWALL)
- if (mitem[xl][yl] == 0)
- if ((mitem[i][j] != VAMPIRE) || (tmpitem != OMIRROR))
- if (tmp != OCLOSEDDOOR) mmove(i,j,xl,yl);
- return;
- }
+static int tmpitem, xl, xh, yl, yh;
+void
+movemt(i, j)
+ int i, j;
+{
+ int k, m, z, tmp, xtmp, ytmp, monst;
- if (monster[monst].intelligence > 10-c[HARDGAME]) /* if smart monster */
-/* intelligent movement here -- first setup screen array */
- {
- xl=tmp3-2; yl=tmp1-2; xh=tmp4+2; yh=tmp2+2;
- vxy(&xl,&yl); vxy(&xh,&yh);
- for (k=yl; k<yh; k++)
- for (m=xl; m<xh; m++)
- {
- switch(item[m][k])
- {
- case OWALL: case OPIT: case OTRAPARROW: case ODARTRAP:
- case OCLOSEDDOOR: case OTRAPDOOR: case OTELEPORTER:
- smm: screen[m][k]=127; break;
- case OMIRROR: if (mitem[m][k]==VAMPIRE) goto smm;
- default: screen[m][k]= 0; break;
- };
- }
- screen[playerx][playery]=1;
+ switch (monst = mitem[i][j]) { /* for half speed monsters */
+ case TROGLODYTE:
+ case HOBGOBLIN:
+ case METAMORPH:
+ case XVART:
+ case INVISIBLESTALKER:
+ case ICELIZARD:
+ if ((gltime & 1) == 1)
+ return;
+ };
-/* now perform proximity ripple from playerx,playery to monster */
- xl=tmp3-1; yl=tmp1-1; xh=tmp4+1; yh=tmp2+1;
- vxy(&xl,&yl); vxy(&xh,&yh);
- for (tmp=1; tmp<distance; tmp++) /* only up to 20 squares away */
- for (k=yl; k<yh; k++)
- for (m=xl; m<xh; m++)
- if (screen[m][k]==tmp) /* if find proximity n advance it */
- for (z=1; z<9; z++) /* go around in a circle */
- {
- if (screen[xtmp=m+diroffx[z]][ytmp=k+diroffy[z]]==0)
- screen[xtmp][ytmp]=tmp+1;
- if (xtmp==i && ytmp==j) goto out;
- }
+ if (c[SCAREMONST]) { /* choose destination randomly if scared */
+ if ((xl = i + rnd(3) - 2) < 0)
+ xl = 0;
+ if (xl >= MAXX)
+ xl = MAXX - 1;
+ if ((yl = j + rnd(3) - 2) < 0)
+ yl = 0;
+ if (yl >= MAXY)
+ yl = MAXY - 1;
+ if ((tmp = item[xl][yl]) != OWALL)
+ if (mitem[xl][yl] == 0)
+ if ((mitem[i][j] != VAMPIRE) || (tmpitem != OMIRROR))
+ if (tmp != OCLOSEDDOOR)
+ mmove(i, j, xl, yl);
+ return;
+ }
+ if (monster[monst].intelligence > 10 - c[HARDGAME]) { /* if smart monster */
+ /* intelligent movement here -- first setup screen array */
+ xl = tmp3 - 2;
+ yl = tmp1 - 2;
+ xh = tmp4 + 2;
+ yh = tmp2 + 2;
+ vxy(&xl, &yl);
+ vxy(&xh, &yh);
+ for (k = yl; k < yh; k++)
+ for (m = xl; m < xh; m++) {
+ switch (item[m][k]) {
+ case OWALL:
+ case OPIT:
+ case OTRAPARROW:
+ case ODARTRAP:
+ case OCLOSEDDOOR:
+ case OTRAPDOOR:
+ case OTELEPORTER:
+ smm: screen[m][k] = 127;
+ break;
+ case OMIRROR:
+ if (mitem[m][k] == VAMPIRE)
+ goto smm;
+ default:
+ screen[m][k] = 0;
+ break;
+ };
+ }
+ screen[playerx][playery] = 1;
-out: if (tmp<distance) /* did find connectivity */
- /* now select lowest value around playerx,playery */
- for (z=1; z<9; z++) /* go around in a circle */
- if (screen[xl=i+diroffx[z]][yl=j+diroffy[z]]==tmp)
- if (!mitem[xl][yl]) { mmove(i,j,w1x[0]=xl,w1y[0]=yl); return; }
- }
+ /*
+ * now perform proximity ripple from playerx,playery to
+ * monster
+ */
+ xl = tmp3 - 1;
+ yl = tmp1 - 1;
+ xh = tmp4 + 1;
+ yh = tmp2 + 1;
+ vxy(&xl, &yl);
+ vxy(&xh, &yh);
+ for (tmp = 1; tmp < distance; tmp++) /* only up to 20 squares
+ * away */
+ for (k = yl; k < yh; k++)
+ for (m = xl; m < xh; m++)
+ if (screen[m][k] == tmp) /* if find proximity n
+ * advance it */
+ for (z = 1; z < 9; z++) { /* go around in a circle */
+ if (screen[xtmp = m + diroffx[z]][ytmp = k + diroffy[z]] == 0)
+ screen[xtmp][ytmp] = tmp + 1;
+ if (xtmp == i && ytmp == j)
+ goto out;
+ }
+out: if (tmp < distance) /* did find connectivity */
+ /* now select lowest value around playerx,playery */
+ for (z = 1; z < 9; z++) /* go around in a circle */
+ if (screen[xl = i + diroffx[z]][yl = j + diroffy[z]] == tmp)
+ if (!mitem[xl][yl]) {
+ mmove(i, j, w1x[0] = xl, w1y[0] = yl);
+ return;
+ }
+ }
/* dumb monsters move here */
- xl=i-1; yl=j-1; xh=i+2; yh=j+2;
- if (i<playerx) xl++; else if (i>playerx) --xh;
- if (j<playery) yl++; else if (j>playery) --yh;
- for (k=0; k<9; k++) w1[k] = 10000;
+ xl = i - 1;
+ yl = j - 1;
+ xh = i + 2;
+ yh = j + 2;
+ if (i < playerx)
+ xl++;
+ else if (i > playerx)
+ --xh;
+ if (j < playery)
+ yl++;
+ else if (j > playery)
+ --yh;
+ for (k = 0; k < 9; k++)
+ w1[k] = 10000;
- for (k=xl; k<xh; k++)
- for (m=yl; m<yh; m++) /* for each square compute distance to player */
- {
- tmp = k-i+4+3*(m-j);
+ for (k = xl; k < xh; k++)
+ for (m = yl; m < yh; m++) { /* for each square compute
+ * distance to player */
+ tmp = k - i + 4 + 3 * (m - j);
tmpitem = item[k][m];
- if (tmpitem!=OWALL || (k==playerx && m==playery))
- if (mitem[k][m]==0)
- if ((mitem[i][j] != VAMPIRE) || (tmpitem != OMIRROR))
- if (tmpitem!=OCLOSEDDOOR)
- {
- w1[tmp] = (playerx-k)*(playerx-k)+(playery-m)*(playery-m);
- w1x[tmp] = k; w1y[tmp] = m;
- }
- }
+ if (tmpitem != OWALL || (k == playerx && m == playery))
+ if (mitem[k][m] == 0)
+ if ((mitem[i][j] != VAMPIRE) || (tmpitem != OMIRROR))
+ if (tmpitem != OCLOSEDDOOR) {
+ w1[tmp] = (playerx - k) * (playerx - k) + (playery - m) * (playery - m);
+ w1x[tmp] = k;
+ w1y[tmp] = m;
+ }
+ }
tmp = 0;
- for (k=1; k<9; k++) if (w1[tmp] > w1[k]) tmp=k;
+ for (k = 1; k < 9; k++)
+ if (w1[tmp] > w1[k])
+ tmp = k;
if (w1[tmp] < 10000)
- if ((i!=w1x[tmp]) || (j!=w1y[tmp]))
- mmove(i,j,w1x[tmp],w1y[tmp]);
- }
+ if ((i != w1x[tmp]) || (j != w1y[tmp]))
+ mmove(i, j, w1x[tmp], w1y[tmp]);
+}
/*
- * mmove(x,y,xd,yd) Function to actually perform the monster movement
- * int x,y,xd,yd;
+ * mmove(x,y,xd,yd) Function to actually perform the monster movement
+ * int x,y,xd,yd;
*
- * Enter with the from coordinates in (x,y) and the destination coordinates
- * in (xd,yd).
+ * Enter with the from coordinates in (x,y) and the destination coordinates
+ * in (xd,yd).
*/
-mmove(aa,bb,cc,dd)
- int aa,bb,cc,dd;
- {
- register int tmp,i,flag;
- char *who,*p;
- flag=0; /* set to 1 if monster hit by arrow trap */
- if ((cc==playerx) && (dd==playery))
- {
- hitplayer(aa,bb); moved[aa][bb] = 1; return;
- }
- i=item[cc][dd];
- if ((i==OPIT) || (i==OTRAPDOOR))
- switch(mitem[aa][bb])
- {
- case SPIRITNAGA: case PLATINUMDRAGON: case WRAITH:
- case VAMPIRE: case SILVERDRAGON: case POLTERGEIST:
- case DEMONLORD: case DEMONLORD+1: case DEMONLORD+2:
- case DEMONLORD+3: case DEMONLORD+4: case DEMONLORD+5:
- case DEMONLORD+6: case DEMONPRINCE: break;
+void
+mmove(aa, bb, cc, dd)
+ int aa, bb, cc, dd;
+{
+ int tmp, i, flag;
+ char *who = NULL, *p;
+ flag = 0; /* set to 1 if monster hit by arrow trap */
+ if ((cc == playerx) && (dd == playery)) {
+ hitplayer(aa, bb);
+ moved[aa][bb] = 1;
+ return;
+ }
+ i = item[cc][dd];
+ if ((i == OPIT) || (i == OTRAPDOOR))
+ switch (mitem[aa][bb]) {
+ case SPIRITNAGA:
+ case PLATINUMDRAGON:
+ case WRAITH:
+ case VAMPIRE:
+ case SILVERDRAGON:
+ case POLTERGEIST:
+ case DEMONLORD:
+ case DEMONLORD + 1:
+ case DEMONLORD + 2:
+ case DEMONLORD + 3:
+ case DEMONLORD + 4:
+ case DEMONLORD + 5:
+ case DEMONLORD + 6:
+ case DEMONPRINCE:
+ break;
- default: mitem[aa][bb]=0; /* fell in a pit or trapdoor */
+ default:
+ mitem[aa][bb] = 0; /* fell in a pit or trapdoor */
};
tmp = mitem[cc][dd] = mitem[aa][bb];
- if (i==OANNIHILATION)
- {
- if (tmp>=DEMONLORD+3) /* demons dispel spheres */
- {
+ if (i == OANNIHILATION) {
+ if (tmp >= DEMONLORD + 3) { /* demons dispel spheres */
cursors();
- lprintf("\nThe %s dispels the sphere!",monster[tmp].name);
- rmsphere(cc,dd); /* delete the sphere */
- }
- else i=tmp=mitem[cc][dd]=0;
- }
- stealth[cc][dd]=1;
- if ((hitp[cc][dd] = hitp[aa][bb]) < 0) hitp[cc][dd]=1;
- mitem[aa][bb] = 0; moved[cc][dd] = 1;
+ lprintf("\nThe %s dispels the sphere!", monster[tmp].name);
+ rmsphere(cc, dd); /* delete the sphere */
+ } else
+ i = tmp = mitem[cc][dd] = 0;
+ }
+ stealth[cc][dd] = 1;
+ if ((hitp[cc][dd] = hitp[aa][bb]) < 0)
+ hitp[cc][dd] = 1;
+ mitem[aa][bb] = 0;
+ moved[cc][dd] = 1;
if (tmp == LEPRECHAUN)
- switch(i)
- {
- case OGOLDPILE: case OMAXGOLD: case OKGOLD: case ODGOLD:
- case ODIAMOND: case ORUBY: case OEMERALD: case OSAPPHIRE:
- item[cc][dd] = 0; /* leprechaun takes gold */
- };
+ switch (i) {
+ case OGOLDPILE:
+ case OMAXGOLD:
+ case OKGOLD:
+ case ODGOLD:
+ case ODIAMOND:
+ case ORUBY:
+ case OEMERALD:
+ case OSAPPHIRE:
+ item[cc][dd] = 0; /* leprechaun takes gold */
+ };
- if (tmp == TROLL) /* if a troll regenerate him */
+ if (tmp == TROLL) /* if a troll regenerate him */
if ((gltime & 1) == 0)
- if (monster[tmp].hitpoints > hitp[cc][dd]) hitp[cc][dd]++;
+ if (monster[tmp].hitpoints > hitp[cc][dd])
+ hitp[cc][dd]++;
- if (i==OTRAPARROW) /* arrow hits monster */
- { who = "An arrow"; if ((hitp[cc][dd] -= rnd(10)+level) <= 0)
- { mitem[cc][dd]=0; flag=2; } else flag=1; }
- if (i==ODARTRAP) /* dart hits monster */
- { who = "A dart"; if ((hitp[cc][dd] -= rnd(6)) <= 0)
- { mitem[cc][dd]=0; flag=2; } else flag=1; }
- if (i==OTELEPORTER) /* monster hits teleport trap */
- { flag=3; fillmonst(mitem[cc][dd]); mitem[cc][dd]=0; }
- if (c[BLINDCOUNT]) return; /* if blind don't show where monsters are */
- if (know[cc][dd] & 1)
- {
- p=0;
- if (flag) cursors();
- switch(flag)
- {
- case 1: p="\n%s hits the %s"; break;
- case 2: p="\n%s hits and kills the %s"; break;
- case 3: p="\nThe %s%s gets teleported"; who=""; break;
- };
- if (p) { lprintf(p,who,monster[tmp].name); beep(); }
+ if (i == OTRAPARROW) { /* arrow hits monster */
+ who = "An arrow";
+ if ((hitp[cc][dd] -= rnd(10) + level) <= 0) {
+ mitem[cc][dd] = 0;
+ flag = 2;
+ } else
+ flag = 1;
+ }
+ if (i == ODARTRAP) { /* dart hits monster */
+ who = "A dart";
+ if ((hitp[cc][dd] -= rnd(6)) <= 0) {
+ mitem[cc][dd] = 0;
+ flag = 2;
+ } else
+ flag = 1;
+ }
+ if (i == OTELEPORTER) { /* monster hits teleport trap */
+ flag = 3;
+ fillmonst(mitem[cc][dd]);
+ mitem[cc][dd] = 0;
+ }
+ if (c[BLINDCOUNT])
+ return; /* if blind don't show where monsters are */
+ if (know[cc][dd] & 1) {
+ p = 0;
+ if (flag)
+ cursors();
+ switch (flag) {
+ case 1:
+ p = "\n%s hits the %s";
+ break;
+ case 2:
+ p = "\n%s hits and kills the %s";
+ break;
+ case 3:
+ p = "\nThe %s%s gets teleported";
+ who = "";
+ break;
+ };
+ if (p) {
+ lprintf(p, who, monster[tmp].name);
+ lbeep();
}
-/* if (yrepcount>1) { know[aa][bb] &= 2; know[cc][dd] &= 2; return; } */
- if (know[aa][bb] & 1) show1cell(aa,bb);
- if (know[cc][dd] & 1) show1cell(cc,dd);
}
+ /*
+ * if (yrepcount>1) { know[aa][bb] &= 2; know[cc][dd] &= 2; return;
+ * }
+ */
+ if (know[aa][bb] & 1)
+ show1cell(aa, bb);
+ if (know[cc][dd] & 1)
+ show1cell(cc, dd);
+}
/*
- * movsphere() Function to look for and move spheres of annihilation
+ * movsphere() Function to look for and move spheres of annihilation
*
- * This function works on the sphere linked list, first duplicating the list
- * (the act of moving changes the list), then processing each sphere in order
- * to move it. They eat anything in their way, including stairs, volcanic
- * shafts, potions, etc, except for upper level demons, who can dispel
- * spheres.
- * No value is returned.
+ * This function works on the sphere linked list, first duplicating the list
+ * (the act of moving changes the list), then processing each sphere in order
+ * to move it. They eat anything in their way, including stairs, volcanic
+ * shafts, potions, etc, except for upper level demons, who can dispel
+ * spheres.
+ * No value is returned.
*/
-#define SPHMAX 20 /* maximum number of spheres movsphere can handle */
+#define SPHMAX 20 /* maximum number of spheres movsphere can
+ * handle */
+void
movsphere()
- {
- register int x,y,dir,len;
- register struct sphere *sp,*sp2;
- struct sphere sph[SPHMAX];
+{
+ int x, y, dir, len;
+ struct sphere *sp, *sp2;
+ struct sphere sph[SPHMAX];
/* first duplicate sphere list */
- for (sp=0,x=0,sp2=spheres; sp2; sp2=sp2->p) /* look through sphere list */
- if (sp2->lev == level) /* only if this level */
- {
- sph[x] = *sp2; sph[x++].p = 0; /* copy the struct */
- if (x>1) sph[x-2].p = &sph[x-1]; /* link pointers */
+ for (sp = 0, x = 0, sp2 = spheres; sp2; sp2 = sp2->p) /* look through sphere
+ * list */
+ if (sp2->lev == level) { /* only if this level */
+ sph[x] = *sp2;
+ sph[x++].p = 0; /* copy the struct */
+ if (x > 1)
+ sph[x - 2].p = &sph[x - 1]; /* link pointers */
}
- if (x) sp= sph; /* if any spheres, point to them */
- else return; /* no spheres */
+ if (x)
+ sp = sph; /* if any spheres, point to them */
+ else
+ return; /* no spheres */
- for (sp=sph; sp; sp=sp->p) /* look through sphere list */
- {
- x = sp->x; y = sp->y;
- if (item[x][y]!=OANNIHILATION) continue; /* not really there */
- if (--(sp->lifetime) < 0) /* has sphere run out of gas? */
- {
- rmsphere(x,y); /* delete sphere */
+ for (sp = sph; sp; sp = sp->p) { /* look through sphere list */
+ x = sp->x;
+ y = sp->y;
+ if (item[x][y] != OANNIHILATION)
+ continue; /* not really there */
+ if (--(sp->lifetime) < 0) { /* has sphere run out of gas? */
+ rmsphere(x, y); /* delete sphere */
continue;
- }
- switch(rnd((int)max(7,c[INTELLIGENCE]>>1))) /* time to move the sphere */
- {
- case 1:
- case 2: /* change direction to a random one */
- sp->dir = rnd(8);
- default: /* move in normal direction */
- dir = sp->dir; len = sp->lifetime;
- rmsphere(x,y);
- newsphere(x+diroffx[dir],y+diroffy[dir],dir,len);
- };
}
+ switch (rnd((int) max(7, c[INTELLIGENCE] >> 1))) { /* time to move the
+ * sphere */
+ case 1:
+ case 2: /* change direction to a random one */
+ sp->dir = rnd(8);
+ default: /* move in normal direction */
+ dir = sp->dir;
+ len = sp->lifetime;
+ rmsphere(x, y);
+ newsphere(x + diroffx[dir], y + diroffy[dir], dir, len);
+ };
}
+}
diff --git a/games/larn/nap.c b/games/larn/nap.c
index 4945299c3a4..4d137cd42b2 100644
--- a/games/larn/nap.c
+++ b/games/larn/nap.c
@@ -1,18 +1,24 @@
-#ifndef lint
-static char rcsid[] = "$NetBSD: nap.c,v 1.4 1995/04/27 22:15:28 mycroft Exp $";
-#endif /* not lint */
+/* $OpenBSD: nap.c,v 1.2 1998/09/15 05:12:32 pjanzen Exp $ */
+/* $NetBSD: nap.c,v 1.5 1997/10/18 20:03:36 christos Exp $ */
/* nap.c Larn is copyrighted 1986 by Noah Morgan. */
-#include <signal.h>
-#include <sys/types.h>
+#ifndef lint
+static char rcsid[] = "$OpenBSD: nap.c,v 1.2 1998/09/15 05:12:32 pjanzen Exp $";
+#endif /* not lint */
+
+#include <unistd.h>
+#include "header.h"
+#include "extern.h"
/*
* routine to take a nap for n milliseconds
*/
+void
nap(x)
- register int x;
- {
- if (x<=0) return; /* eliminate chance for infinite loop */
+ int x;
+{
+ if (x <= 0)
+ return; /* eliminate chance for infinite loop */
lflush();
- usleep(x*1000);
- }
+ usleep(x * 1000);
+}
diff --git a/games/larn/object.c b/games/larn/object.c
index 57af4a98204..754cae70ce7 100644
--- a/games/larn/object.c
+++ b/games/larn/object.c
@@ -1,812 +1,1362 @@
-#ifndef lint
-static char rcsid[] = "$NetBSD: object.c,v 1.6 1995/04/22 07:34:09 cgd Exp $";
-#endif /* not lint */
+/* $OpenBSD: object.c,v 1.3 1998/09/15 05:12:32 pjanzen Exp $ */
+/* $NetBSD: object.c,v 1.8 1997/10/18 20:03:38 christos Exp $ */
+
+/* object.c Larn is copyrighted 1986 by Noah Morgan. */
-/* object.c Larn is copyrighted 1986 by Noah Morgan. */
+#include <sys/cdefs.h>
+#ifndef lint
+static char rcsid[] = "$OpenBSD: object.c,v 1.3 1998/09/15 05:12:32 pjanzen Exp $";
+#endif /* not lint */
#include "header.h"
+#include "extern.h"
/*
- ***************
- LOOK_FOR_OBJECT
- ***************
-
- subroutine to look for an object and give the player his options
- if an object was found.
+ * ***************
+ * LOOK_FOR_OBJECT
+ * ***************
+ *
+ * subroutine to look for an object and give the player his options
+ * if an object was found.
*/
+void
lookforobject()
{
-register int i,j;
-if (c[TIMESTOP]) return; /* can't find objects is time is stopped */
-i=item[playerx][playery]; if (i==0) return;
-showcell(playerx,playery); cursors(); yrepcount=0;
-switch(i)
- {
- case OGOLDPILE: case OMAXGOLD:
- case OKGOLD: case ODGOLD: lprcat("\n\nYou have found some gold!"); ogold(i); break;
-
- case OPOTION: lprcat("\n\nYou have found a magic potion");
- i = iarg[playerx][playery];
- if (potionname[i][0]!=0) lprintf(" of%s", potionname[i]);
- opotion(i); break;
-
- case OSCROLL: lprcat("\n\nYou have found a magic scroll");
- i = iarg[playerx][playery];
- if (scrollname[i][0]!=0) lprintf(" of%s", scrollname[i]);
- oscroll(i); break;
-
- case OALTAR: if (nearbymonst()) return;
- lprcat("\n\nThere is a Holy Altar here!"); oaltar(); break;
-
- case OBOOK: lprcat("\n\nYou have found a book."); obook(); break;
-
- case OCOOKIE: lprcat("\n\nYou have found a fortune cookie."); ocookie(); break;
-
- case OTHRONE: if (nearbymonst()) return;
- lprintf("\n\nThere is %s here!",objectname[i]); othrone(0); break;
-
- case OTHRONE2: if (nearbymonst()) return;
- lprintf("\n\nThere is %s here!",objectname[i]); othrone(1); break;
-
- case ODEADTHRONE: lprintf("\n\nThere is %s here!",objectname[i]); odeadthrone(); break;
-
- case OORB: lprcat("\n\nYou have found the Orb!!!!!"); oorb(); break;
-
- case OPIT: lprcat("\n\nYou're standing at the top of a pit."); opit(); break;
-
- case OSTAIRSUP: lprcat("\n\nThere is a circular staircase here"); ostairs(1); /* up */ break;
-
- case OELEVATORUP: lprcat("\n\nYou feel heavy for a moment, but the feeling disappears");
- oelevator(1); /* up */ break;
-
- case OFOUNTAIN: if (nearbymonst()) return;
- lprcat("\n\nThere is a fountain here"); ofountain(); break;
-
- case OSTATUE: if (nearbymonst()) return;
- lprcat("\n\nYou are standing in front of a statue"); ostatue(); break;
-
- case OCHEST: lprcat("\n\nThere is a chest here"); ochest(); break;
-
- case OIVTELETRAP: if (rnd(11)<6) return;
- item[playerx][playery] = OTELEPORTER;
- know[playerx][playery] = 1;
-
- case OTELEPORTER: lprcat("\nZaaaappp! You've been teleported!\n");
- beep(); nap(3000); oteleport(0);
- break;
-
- case OSCHOOL: if (nearbymonst()) return;
- lprcat("\n\nYou have found the College of Larn.");
- lprcat("\nDo you (g) go inside, or (i) stay here? ");
- i=0; while ((i!='g') && (i!='i') && (i!='\33')) i=getchar();
- if (i == 'g') { oschool(); /* the college of larn */ }
- else lprcat(" stay here");
- break;
-
- case OMIRROR: if (nearbymonst()) return;
- lprcat("\n\nThere is a mirror here"); omirror(); break;
+ int i, j;
+
+ if (c[TIMESTOP])
+ return; /* can't find objects if time is stopped */
+ i = item[playerx][playery];
+ if (i == 0)
+ return;
+ showcell(playerx, playery);
+ cursors();
+ yrepcount = 0;
+ switch (i) {
+ case OGOLDPILE:
+ case OMAXGOLD:
+ case OKGOLD:
+ case ODGOLD:
+ lprcat("\n\nYou have found some gold!");
+ ogold(i);
+ break;
+
+ case OPOTION:
+ lprcat("\n\nYou have found a magic potion");
+ i = iarg[playerx][playery];
+ if (potionname[i][0] != 0)
+ lprintf(" of%s", potionname[i]);
+ opotion(i);
+ break;
+
+ case OSCROLL:
+ lprcat("\n\nYou have found a magic scroll");
+ i = iarg[playerx][playery];
+ if (scrollname[i][0] != 0)
+ lprintf(" of%s", scrollname[i]);
+ oscroll(i);
+ break;
+
+ case OALTAR:
+ if (nearbymonst())
+ return;
+ lprcat("\n\nThere is a Holy Altar here!");
+ oaltar();
+ break;
+
+ case OBOOK:
+ lprcat("\n\nYou have found a book.");
+ obook();
+ break;
+
+ case OCOOKIE:
+ lprcat("\n\nYou have found a fortune cookie.");
+ ocookie();
+ break;
+
+ case OTHRONE:
+ if (nearbymonst())
+ return;
+ lprintf("\n\nThere is %s here!", objectname[i]);
+ othrone(0);
+ break;
+
+ case OTHRONE2:
+ if (nearbymonst())
+ return;
+ lprintf("\n\nThere is %s here!", objectname[i]);
+ othrone(1);
+ break;
+
+ case ODEADTHRONE:
+ lprintf("\n\nThere is %s here!", objectname[i]);
+ odeadthrone();
+ break;
+
+ case OORB:
+ lprcat("\n\nYou have found the Orb!!!!!");
+ oorb();
+ break;
+
+ case OPIT:
+ lprcat("\n\nYou're standing at the top of a pit.");
+ opit();
+ break;
+
+ case OSTAIRSUP:
+ lprcat("\n\nThere is a circular staircase here");
+ ostairs(1); /* up */
+ break;
+
+ case OELEVATORUP:
+ lprcat("\n\nYou feel heavy for a moment, but the feeling disappears");
+ oelevator(1); /* up */
+ break;
+
+ case OFOUNTAIN:
+ if (nearbymonst())
+ return;
+ lprcat("\n\nThere is a fountain here");
+ ofountain();
+ break;
+
+ case OSTATUE:
+ if (nearbymonst())
+ return;
+ lprcat("\n\nYou are standing in front of a statue");
+ ostatue();
+ break;
+
+ case OCHEST:
+ lprcat("\n\nThere is a chest here");
+ ochest();
+ break;
+
+ case OIVTELETRAP:
+ if (rnd(11) < 6)
+ return;
+ item[playerx][playery] = OTELEPORTER;
+ know[playerx][playery] = 1;
+
+ case OTELEPORTER:
+ lprcat("\nZaaaappp! You've been teleported!\n");
+ lbeep();
+ nap(3000);
+ oteleport(0);
+ break;
+
+ case OSCHOOL:
+ if (nearbymonst())
+ return;
+ lprcat("\n\nYou have found the College of Larn.");
+ lprcat("\nDo you (g) go inside, or (i) stay here? ");
+ i = 0;
+ while ((i != 'g') && (i != 'i') && (i != '\33'))
+ i = lgetchar();
+ if (i == 'g') {
+ oschool(); /* the college of larn */
+ } else
+ lprcat(" stay here");
+ break;
+
+ case OMIRROR:
+ if (nearbymonst())
+ return;
+ lprcat("\n\nThere is a mirror here");
+ omirror();
+ break;
case OBANK2:
- case OBANK: if (nearbymonst()) return;
- if (i==OBANK) lprcat("\n\nYou have found the bank of Larn.");
- else lprcat("\n\nYou have found a branch office of the bank of Larn.");
- lprcat("\nDo you (g) go inside, or (i) stay here? ");
- j=0; while ((j!='g') && (j!='i') && (j!='\33')) j=getchar();
- if (j == 'g') { if (i==OBANK) obank(); else obank2(); /* the bank of larn */ }
- else lprcat(" stay here");
- break;
-
- case ODEADFOUNTAIN: if (nearbymonst()) return;
- lprcat("\n\nThere is a dead fountain here"); break;
-
- case ODNDSTORE: if (nearbymonst()) return;
- lprcat("\n\nThere is a DND store here.");
- lprcat("\nDo you (g) go inside, or (i) stay here? ");
- i=0; while ((i!='g') && (i!='i') && (i!='\33')) i=getchar();
- if (i == 'g')
- dndstore(); /* the dnd adventurers store */
- else lprcat(" stay here");
+ case OBANK:
+ if (nearbymonst())
+ return;
+ if (i == OBANK)
+ lprcat("\n\nYou have found the bank of Larn.");
+ else
+ lprcat("\n\nYou have found a branch office of the bank of Larn.");
+ lprcat("\nDo you (g) go inside, or (i) stay here? ");
+ j = 0;
+ while ((j != 'g') && (j != 'i') && (j != '\33'))
+ j = lgetchar();
+ if (j == 'g') {
+ if (i == OBANK)
+ obank();
+ else
+ obank2(); /* the bank of larn */
+ } else
+ lprcat(" stay here");
+ break;
+
+ case ODEADFOUNTAIN:
+ if (nearbymonst())
+ return;
+ lprcat("\n\nThere is a dead fountain here");
+ break;
+
+ case ODNDSTORE:
+ if (nearbymonst())
+ return;
+ lprcat("\n\nThere is a DND store here.");
+ lprcat("\nDo you (g) go inside, or (i) stay here? ");
+ i = 0;
+ while ((i != 'g') && (i != 'i') && (i != '\33'))
+ i = lgetchar();
+ if (i == 'g')
+ dndstore(); /* the dnd adventurers store */
+ else
+ lprcat(" stay here");
+ break;
+
+ case OSTAIRSDOWN:
+ lprcat("\n\nThere is a circular staircase here");
+ ostairs(-1); /* down */
+ break;
+
+ case OELEVATORDOWN:
+ lprcat("\n\nYou feel light for a moment, but the feeling disappears");
+ oelevator(-1); /* down */
+ break;
+
+ case OOPENDOOR:
+ lprintf("\n\nYou have found %s", objectname[i]);
+ lprcat("\nDo you (c) close it");
+ iopts();
+ i = 0;
+ while ((i != 'c') && (i != 'i') && (i != '\33'))
+ i = lgetchar();
+ if ((i == '\33') || (i == 'i')) {
+ ignore();
+ break;
+ }
+ lprcat("close");
+ forget();
+ item[playerx][playery] = OCLOSEDDOOR;
+ iarg[playerx][playery] = 0;
+ playerx = lastpx;
+ playery = lastpy;
+ break;
+
+ case OCLOSEDDOOR:
+ lprintf("\n\nYou have found %s", objectname[i]);
+ lprcat("\nDo you (o) try to open it");
+ iopts();
+ i = 0;
+ while ((i != 'o') && (i != 'i') && (i != '\33'))
+ i = lgetchar();
+ if ((i == '\33') || (i == 'i')) {
+ ignore();
+ playerx = lastpx;
+ playery = lastpy;
+ break;
+ } else {
+ lprcat("open");
+ if (rnd(11) < 7) {
+ switch (iarg[playerx][playery]) {
+ case 6:
+ c[AGGRAVATE] += rnd(400);
break;
- case OSTAIRSDOWN: lprcat("\n\nThere is a circular staircase here"); ostairs(-1); /* down */ break;
-
- case OELEVATORDOWN: lprcat("\n\nYou feel light for a moment, but the feeling disappears");
- oelevator(-1); /* down */
- break;
-
- case OOPENDOOR: lprintf("\n\nYou have found %s",objectname[i]);
- lprcat("\nDo you (c) close it"); iopts();
- i=0; while ((i!='c') && (i!='i') && (i!='\33')) i=getchar();
- if ((i=='\33') || (i=='i')) { ignore(); break; }
- lprcat("close"); forget();
- item[playerx][playery]=OCLOSEDDOOR;
- iarg[playerx][playery]=0;
- playerx = lastpx; playery = lastpy;
- break;
-
- case OCLOSEDDOOR: lprintf("\n\nYou have found %s",objectname[i]);
- lprcat("\nDo you (o) try to open it"); iopts();
- i=0; while ((i!='o') && (i!='i') && (i!='\33')) i=getchar();
- if ((i=='\33') || (i=='i'))
- { ignore(); playerx = lastpx;
- playery = lastpy; break; }
- else
- {
- lprcat("open");
- if (rnd(11)<7)
- {
- switch(iarg[playerx][playery])
- {
- case 6: c[AGGRAVATE] += rnd(400); break;
-
- case 7: lprcat("\nYou are jolted by an electric shock ");
- lastnum=274; losehp(rnd(20)); bottomline(); break;
-
- case 8: loselevel(); break;
-
- case 9: lprcat("\nYou suddenly feel weaker ");
- if (c[STRENGTH]>3) c[STRENGTH]--;
- bottomline(); break;
-
- default: break;
- }
- playerx = lastpx; playery = lastpy;
- }
- else
- {
- forget(); item[playerx][playery]=OOPENDOOR;
- }
- }
- break;
-
- case OENTRANCE: lprcat("\nYou have found "); lprcat(objectname[OENTRANCE]);
- lprcat("\nDo you (g) go inside"); iopts();
- i=0; while ((i!='g') && (i!='i') && (i!='\33')) i=getchar();
- if (i == 'g')
- {
- newcavelevel(1); playerx=33; playery=MAXY-2;
- item[33][MAXY-1]=know[33][MAXY-1]=mitem[33][MAXY-1]=0;
- draws(0,MAXX,0,MAXY); bot_linex(); return;
- }
- else ignore();
+ case 7:
+ lprcat("\nYou are jolted by an electric shock ");
+ lastnum = 274;
+ losehp(rnd(20));
+ bottomline();
break;
- case OVOLDOWN: lprcat("\nYou have found "); lprcat(objectname[OVOLDOWN]);
- lprcat("\nDo you (c) climb down"); iopts();
- i=0; while ((i!='c') && (i!='i') && (i!='\33')) i=getchar();
- if ((i=='\33') || (i=='i')) { ignore(); break; }
- if (level!=0) { lprcat("\nThe shaft only extends 5 feet downward!"); return; }
- if (packweight() > 45+3*(c[STRENGTH]+c[STREXTRA])) { lprcat("\nYou slip and fall down the shaft"); beep();
- lastnum=275; losehp(30+rnd(20)); bottomhp(); }
-
- else lprcat("climb down"); nap(3000); newcavelevel(MAXLEVEL);
- for (i=0; i<MAXY; i++) for (j=0; j<MAXX; j++) /* put player near volcano shaft */
- if (item[j][i]==OVOLUP) { playerx=j; playery=i; j=MAXX; i=MAXY; positionplayer(); }
- draws(0,MAXX,0,MAXY); bot_linex(); return;
-
- case OVOLUP: lprcat("\nYou have found "); lprcat(objectname[OVOLUP]);
- lprcat("\nDo you (c) climb up"); iopts();
- i=0; while ((i!='c') && (i!='i') && (i!='\33')) i=getchar();
- if ((i=='\33') || (i=='i')) { ignore(); break; }
- if (level!=11) { lprcat("\nThe shaft only extends 8 feet upwards before you find a blockage!"); return; }
- if (packweight() > 45+5*(c[STRENGTH]+c[STREXTRA])) { lprcat("\nYou slip and fall down the shaft"); beep();
- lastnum=275; losehp(15+rnd(20)); bottomhp(); return; }
- lprcat("climb up"); lflush(); nap(3000); newcavelevel(0);
- for (i=0; i<MAXY; i++) for (j=0; j<MAXX; j++) /* put player near volcano shaft */
- if (item[j][i]==OVOLDOWN) { playerx=j; playery=i; j=MAXX; i=MAXY; positionplayer(); }
- draws(0,MAXX,0,MAXY); bot_linex(); return;
-
- case OTRAPARROWIV: if (rnd(17)<13) return; /* for an arrow trap */
- item[playerx][playery] = OTRAPARROW;
- know[playerx][playery] = 0;
-
- case OTRAPARROW: lprcat("\nYou are hit by an arrow"); beep(); /* for an arrow trap */
- lastnum=259; losehp(rnd(10)+level);
- bottomhp(); return;
-
- case OIVDARTRAP: if (rnd(17)<13) return; /* for a dart trap */
- item[playerx][playery] = ODARTRAP;
- know[playerx][playery] = 0;
-
- case ODARTRAP: lprcat("\nYou are hit by a dart"); beep(); /* for a dart trap */
- lastnum=260; losehp(rnd(5));
- if ((--c[STRENGTH]) < 3) c[STRENGTH] = 3;
- bottomline(); return;
-
- case OIVTRAPDOOR: if (rnd(17)<13) return; /* for a trap door */
- item[playerx][playery] = OTRAPDOOR;
- know[playerx][playery] = 1;
-
- case OTRAPDOOR: lastnum = 272; /* a trap door */
- if ((level==MAXLEVEL-1) || (level==MAXLEVEL+MAXVLEVEL-1))
- { lprcat("\nYou fell through a bottomless trap door!"); beep(); nap(3000); died(271); }
- lprcat("\nYou fall through a trap door!"); beep(); /* for a trap door */
- losehp(rnd(5+level));
- nap(2000); newcavelevel(level+1); draws(0,MAXX,0,MAXY); bot_linex();
- return;
-
-
- case OTRADEPOST: if (nearbymonst()) return;
- lprcat("\nYou have found the Larn trading Post.");
- lprcat("\nDo you (g) go inside, or (i) stay here? ");
- i=0; while ((i!='g') && (i!='i') && (i!='\33')) i=getchar();
- if (i == 'g') otradepost(); else lprcat("stay here");
- return;
-
- case OHOME: if (nearbymonst()) return;
- lprcat("\nYou have found your way home.");
- lprcat("\nDo you (g) go inside, or (i) stay here? ");
- i=0; while ((i!='g') && (i!='i') && (i!='\33')) i=getchar();
- if (i == 'g') ohome(); else lprcat("stay here");
- return;
-
- case OWALL: break;
+ case 8:
+ loselevel();
+ break;
- case OANNIHILATION: died(283); return; /* annihilated by sphere of annihilation */
+ case 9:
+ lprcat("\nYou suddenly feel weaker ");
+ if (c[STRENGTH] > 3)
+ c[STRENGTH]--;
+ bottomline();
+ break;
- case OLRS: if (nearbymonst()) return;
- lprcat("\n\nThere is an LRS office here.");
- lprcat("\nDo you (g) go inside, or (i) stay here? ");
- i=0; while ((i!='g') && (i!='i') && (i!='\33')) i=getchar();
- if (i == 'g')
- olrs(); /* the larn revenue service */
- else lprcat(" stay here");
- break;
+ default:
+ break;
+ }
+ playerx = lastpx;
+ playery = lastpy;
+ } else {
+ forget();
+ item[playerx][playery] = OOPENDOOR;
+ }
+ }
+ break;
+
+ case OENTRANCE:
+ lprcat("\nYou have found ");
+ lprcat(objectname[OENTRANCE]);
+ lprcat("\nDo you (g) go inside");
+ iopts();
+ i = 0;
+ while ((i != 'g') && (i != 'i') && (i != '\33'))
+ i = lgetchar();
+ if (i == 'g') {
+ newcavelevel(1);
+ playerx = 33;
+ playery = MAXY - 2;
+ item[33][MAXY - 1] = know[33][MAXY - 1] = mitem[33][MAXY - 1] = 0;
+ draws(0, MAXX, 0, MAXY);
+ bot_linex();
+ return;
+ } else
+ ignore();
+ break;
+
+ case OVOLDOWN:
+ lprcat("\nYou have found ");
+ lprcat(objectname[OVOLDOWN]);
+ lprcat("\nDo you (c) climb down");
+ iopts();
+ i = 0;
+ while ((i != 'c') && (i != 'i') && (i != '\33'))
+ i = lgetchar();
+ if ((i == '\33') || (i == 'i')) {
+ ignore();
+ break;
+ }
+ if (level != 0) {
+ lprcat("\nThe shaft only extends 5 feet downward!");
+ return;
+ }
+ if (packweight() > 45 + 3 * (c[STRENGTH] + c[STREXTRA])) {
+ lprcat("\nYou slip and fall down the shaft");
+ lbeep();
+ lastnum = 275;
+ losehp(30 + rnd(20));
+ bottomhp();
+ } else
+ lprcat("climb down");
+ nap(3000);
+ newcavelevel(MAXLEVEL);
+ for (i = 0; i < MAXY; i++)
+ for (j = 0; j < MAXX; j++) /* put player near
+ * volcano shaft */
+ if (item[j][i] == OVOLUP) {
+ playerx = j;
+ playery = i;
+ j = MAXX;
+ i = MAXY;
+ positionplayer();
+ }
+ draws(0, MAXX, 0, MAXY);
+ bot_linex();
+ return;
+
+ case OVOLUP:
+ lprcat("\nYou have found ");
+ lprcat(objectname[OVOLUP]);
+ lprcat("\nDo you (c) climb up");
+ iopts();
+ i = 0;
+ while ((i != 'c') && (i != 'i') && (i != '\33'))
+ i = lgetchar();
+ if ((i == '\33') || (i == 'i')) {
+ ignore();
+ break;
+ }
+ if (level != 11) {
+ lprcat("\nThe shaft only extends 8 feet upwards before you find a blockage!");
+ return;
+ }
+ if (packweight() > 45 + 5 * (c[STRENGTH] + c[STREXTRA])) {
+ lprcat("\nYou slip and fall down the shaft");
+ lbeep();
+ lastnum = 275;
+ losehp(15 + rnd(20));
+ bottomhp();
+ return;
+ }
+ lprcat("climb up");
+ lflush();
+ nap(3000);
+ newcavelevel(0);
+ for (i = 0; i < MAXY; i++)
+ for (j = 0; j < MAXX; j++) /* put player near
+ * volcano shaft */
+ if (item[j][i] == OVOLDOWN) {
+ playerx = j;
+ playery = i;
+ j = MAXX;
+ i = MAXY;
+ positionplayer();
+ }
+ draws(0, MAXX, 0, MAXY);
+ bot_linex();
+ return;
+
+ case OTRAPARROWIV:
+ if (rnd(17) < 13)
+ return; /* for an arrow trap */
+ item[playerx][playery] = OTRAPARROW;
+ know[playerx][playery] = 0;
+
+ case OTRAPARROW:
+ lprcat("\nYou are hit by an arrow");
+ lbeep(); /* for an arrow trap */
+ lastnum = 259;
+ losehp(rnd(10) + level);
+ bottomhp();
+ return;
+
+ case OIVDARTRAP:
+ if (rnd(17) < 13)
+ return; /* for a dart trap */
+ item[playerx][playery] = ODARTRAP;
+ know[playerx][playery] = 0;
+
+ case ODARTRAP:
+ lprcat("\nYou are hit by a dart");
+ lbeep(); /* for a dart trap */
+ lastnum = 260;
+ losehp(rnd(5));
+ if ((--c[STRENGTH]) < 3)
+ c[STRENGTH] = 3;
+ bottomline();
+ return;
+
+ case OIVTRAPDOOR:
+ if (rnd(17) < 13)
+ return; /* for a trap door */
+ item[playerx][playery] = OTRAPDOOR;
+ know[playerx][playery] = 1;
+
+ case OTRAPDOOR:
+ lastnum = 272; /* a trap door */
+ if ((level == MAXLEVEL - 1) || (level == MAXLEVEL + MAXVLEVEL - 1)) {
+ lprcat("\nYou fell through a bottomless trap door!");
+ lbeep();
+ nap(3000);
+ died(271);
+ }
+ lprcat("\nYou fall through a trap door!");
+ lbeep(); /* for a trap door */
+ losehp(rnd(5 + level));
+ nap(2000);
+ newcavelevel(level + 1);
+ draws(0, MAXX, 0, MAXY);
+ bot_linex();
+ return;
+
+
+ case OTRADEPOST:
+ if (nearbymonst())
+ return;
+ lprcat("\nYou have found the Larn trading Post.");
+ lprcat("\nDo you (g) go inside, or (i) stay here? ");
+ i = 0;
+ while ((i != 'g') && (i != 'i') && (i != '\33'))
+ i = lgetchar();
+ if (i == 'g')
+ otradepost();
+ else
+ lprcat("stay here");
+ return;
+
+ case OHOME:
+ if (nearbymonst())
+ return;
+ lprcat("\nYou have found your way home.");
+ lprcat("\nDo you (g) go inside, or (i) stay here? ");
+ i = 0;
+ while ((i != 'g') && (i != 'i') && (i != '\33'))
+ i = lgetchar();
+ if (i == 'g')
+ ohome();
+ else
+ lprcat("stay here");
+ return;
+
+ case OWALL:
+ break;
+
+ case OANNIHILATION:
+ died(283);
+ return; /* annihilated by sphere of annihilation */
+
+ case OLRS:
+ if (nearbymonst())
+ return;
+ lprcat("\n\nThere is an LRS office here.");
+ lprcat("\nDo you (g) go inside, or (i) stay here? ");
+ i = 0;
+ while ((i != 'g') && (i != 'i') && (i != '\33'))
+ i = lgetchar();
+ if (i == 'g')
+ olrs(); /* the larn revenue service */
+ else
+ lprcat(" stay here");
+ break;
- default: finditem(i); break;
+ default:
+ finditem(i);
+ break;
};
}
/*
- function to say what object we found and ask if player wants to take it
+ * function to say what object we found and ask if player wants to take it
*/
+void
finditem(itm)
- int itm;
- {
- int tmp,i;
- lprintf("\n\nYou have found %s ",objectname[itm]);
- tmp=iarg[playerx][playery];
- switch(itm)
- {
- case ODIAMOND: case ORUBY: case OEMERALD:
- case OSAPPHIRE: case OSPIRITSCARAB: case OORBOFDRAGON:
- case OCUBEofUNDEAD: case ONOTHEFT: break;
-
- default:
- if (tmp>0) lprintf("+ %d",(long)tmp); else if (tmp<0) lprintf(" %d",(long)tmp);
- }
- lprcat("\nDo you want to (t) take it"); iopts();
- i=0; while (i!='t' && i!='i' && i!='\33') i=getchar();
- if (i == 't')
- { lprcat("take"); if (take(itm,tmp)==0) forget(); return; }
- ignore();
+ int itm;
+{
+ int tmp, i;
+
+ lprintf("\n\nYou have found %s ", objectname[itm]);
+ tmp = iarg[playerx][playery];
+ switch (itm) {
+ case ODIAMOND:
+ case ORUBY:
+ case OEMERALD:
+ case OSAPPHIRE:
+ case OSPIRITSCARAB:
+ case OORBOFDRAGON:
+ case OCUBEofUNDEAD:
+ case ONOTHEFT:
+ break;
+
+ default:
+ if (tmp > 0)
+ lprintf("+ %d", (long) tmp);
+ else if (tmp < 0)
+ lprintf(" %d", (long) tmp);
+ }
+ lprcat("\nDo you want to (t) take it");
+ iopts();
+ i = 0;
+ while (i != 't' && i != 'i' && i != '\33')
+ i = lgetchar();
+ if (i == 't') {
+ lprcat("take");
+ if (take(itm, tmp) == 0)
+ forget();
+ return;
}
+ ignore();
+}
+
-
-/*
- *******
- OSTAIRS
- *******
- subroutine to process the stair cases
- if dir > 0 the up else down
+/*
+ * *******
+ * OSTAIRS
+ * *******
+ *
+ * subroutine to process the stair cases
+ * if dir > 0 the up else down
*/
+void
ostairs(dir)
- int dir;
- {
- register int k;
+ int dir;
+{
+ int k;
+
lprcat("\nDo you (s) stay here ");
- if (dir > 0) lprcat("(u) go up "); else lprcat("(d) go down ");
+ if (dir > 0)
+ lprcat("(u) go up ");
+ else
+ lprcat("(d) go down ");
lprcat("or (f) kick stairs? ");
- while (1) switch(getchar())
- {
+ while (1)
+ switch (lgetchar()) {
case '\33':
- case 's': case 'i': lprcat("stay here"); return;
-
- case 'f': lprcat("kick stairs");
- if (rnd(2) == 1)
- lprcat("\nI hope you feel better. Showing anger rids you of frustration.");
- else
- {
- k=rnd((level+1)<<1);
- lprintf("\nYou hurt your foot dumb dumb! You suffer %d hit points",(long)k);
- lastnum=276; losehp(k); bottomline();
- }
- return;
-
- case 'u': lprcat("go up");
- if (dir < 0) lprcat("\nThe stairs don't go up!");
- else
- if (level>=2 && level!=11)
- {
- k = level; newcavelevel(level-1);
- draws(0,MAXX,0,MAXY); bot_linex();
- }
- else lprcat("\nThe stairs lead to a dead end!");
- return;
-
- case 'd': lprcat("go down");
- if (dir > 0) lprcat("\nThe stairs don't go down!");
- else
- if (level!=0 && level!=10 && level!=13)
- {
- k = level; newcavelevel(level+1);
- draws(0,MAXX,0,MAXY); bot_linex();
- }
- else lprcat("\nThe stairs lead to a dead end!");
- return;
+ case 's':
+ case 'i':
+ lprcat("stay here");
+ return;
+
+ case 'f':
+ lprcat("kick stairs");
+ if (rnd(2) == 1)
+ lprcat("\nI hope you feel better. Showing anger rids you of frustration.");
+ else {
+ k = rnd((level + 1) << 1);
+ lprintf("\nYou hurt your foot dumb dumb! You suffer %d hit points", (long) k);
+ lastnum = 276;
+ losehp(k);
+ bottomline();
+ }
+ return;
+
+ case 'u':
+ lprcat("go up");
+ if (dir < 0)
+ lprcat("\nThe stairs don't go up!");
+ else if (level >= 2 && level != 11) {
+ k = level;
+ newcavelevel(level - 1);
+ draws(0, MAXX, 0, MAXY);
+ bot_linex();
+ } else
+ lprcat("\nThe stairs lead to a dead end!");
+ return;
+
+ case 'd':
+ lprcat("go down");
+ if (dir > 0)
+ lprcat("\nThe stairs don't go down!");
+ else if (level != 0 && level != 10 && level != 13) {
+ k = level;
+ newcavelevel(level + 1);
+ draws(0, MAXX, 0, MAXY);
+ bot_linex();
+ } else
+ lprcat("\nThe stairs lead to a dead end!");
+ return;
};
- }
+}
-
-/*
- *********
- OTELEPORTER
- *********
- subroutine to handle a teleport trap +/- 1 level maximum
+
+/*
+ * *********
+ * OTELEPORTER
+ * *********
+ *
+ * subroutine to handle a teleport trap +/- 1 level maximum
*/
+void
oteleport(err)
- int err;
- {
- register int tmp;
- if (err) if (rnd(151)<3) died(264); /* stuck in a rock */
- c[TELEFLAG]=1; /* show ?? on bottomline if been teleported */
- if (level==0) tmp=0;
- else if (level < MAXLEVEL)
- { tmp=rnd(5)+level-3; if (tmp>=MAXLEVEL) tmp=MAXLEVEL-1;
- if (tmp<1) tmp=1; }
- else
- { tmp=rnd(3)+level-2; if (tmp>=MAXLEVEL+MAXVLEVEL) tmp=MAXLEVEL+MAXVLEVEL-1;
- if (tmp<MAXLEVEL) tmp=MAXLEVEL; }
- playerx = rnd(MAXX-2); playery = rnd(MAXY-2);
- if (level != tmp) newcavelevel(tmp); positionplayer();
- draws(0,MAXX,0,MAXY); bot_linex();
+ int err;
+{
+ int tmp;
+
+ if (err)
+ if (rnd(151) < 3)
+ died(264); /* stuck in a rock */
+ c[TELEFLAG] = 1; /* show ?? on bottomline if been teleported */
+ if (level == 0)
+ tmp = 0;
+ else if (level < MAXLEVEL) {
+ tmp = rnd(5) + level - 3;
+ if (tmp >= MAXLEVEL)
+ tmp = MAXLEVEL - 1;
+ if (tmp < 1)
+ tmp = 1;
+ } else {
+ tmp = rnd(3) + level - 2;
+ if (tmp >= MAXLEVEL + MAXVLEVEL)
+ tmp = MAXLEVEL + MAXVLEVEL - 1;
+ if (tmp < MAXLEVEL)
+ tmp = MAXLEVEL;
}
-
-/*
- *******
- OPOTION
- *******
+ playerx = rnd(MAXX - 2);
+ playery = rnd(MAXY - 2);
+ if (level != tmp)
+ newcavelevel(tmp);
+ positionplayer();
+ draws(0, MAXX, 0, MAXY);
+ bot_linex();
+}
+
- function to process a potion
+/*
+ * *******
+ * OPOTION
+ * *******
+ *
+ * function to process a potion
*/
+void
opotion(pot)
- int pot;
- {
- lprcat("\nDo you (d) drink it, (t) take it"); iopts();
- while (1) switch(getchar())
- {
+ int pot;
+{
+ lprcat("\nDo you (d) drink it, (t) take it");
+ iopts();
+ while (1)
+ switch (lgetchar()) {
case '\33':
- case 'i': ignore(); return;
-
- case 'd': lprcat("drink\n"); forget(); /* destroy potion */
- quaffpotion(pot); return;
-
- case 't': lprcat("take\n"); if (take(OPOTION,pot)==0) forget();
- return;
+ case 'i':
+ ignore();
+ return;
+
+ case 'd':
+ lprcat("drink\n");
+ forget(); /* destroy potion */
+ quaffpotion(pot);
+ return;
+
+ case 't':
+ lprcat("take\n");
+ if (take(OPOTION, pot) == 0)
+ forget();
+ return;
};
- }
-
+}
+
/*
- function to drink a potion
+ * function to drink a potion
*/
+void
quaffpotion(pot)
- int pot;
- {
- register int i,j,k;
- if (pot<0 || pot>=MAXPOTION) return; /* check for within bounds */
- potionname[pot] = potionhide[pot];
- switch(pot)
- {
- case 9: lprcat("\nYou feel greedy . . ."); nap(2000);
- for (i=0; i<MAXY; i++) for (j=0; j<MAXX; j++)
- if ((item[j][i]==OGOLDPILE) || (item[j][i]==OMAXGOLD))
- {
- know[j][i]=1; show1cell(j,i);
- }
- showplayer(); return;
-
- case 19: lprcat("\nYou feel greedy . . ."); nap(2000);
- for (i=0; i<MAXY; i++) for (j=0; j<MAXX; j++)
- {
- k=item[j][i];
- if ((k==ODIAMOND) || (k==ORUBY) || (k==OEMERALD) || (k==OMAXGOLD)
- || (k==OSAPPHIRE) || (k==OLARNEYE) || (k==OGOLDPILE))
- {
- know[j][i]=1; show1cell(j,i);
- }
- }
- showplayer(); return;
-
- case 20: c[HP] = c[HPMAX]; break; /* instant healing */
-
- case 1: lprcat("\nYou feel better");
- if (c[HP] == c[HPMAX]) raisemhp(1);
- else if ((c[HP] += rnd(20)+20+c[LEVEL]) > c[HPMAX]) c[HP]=c[HPMAX]; break;
-
- case 2: lprcat("\nSuddenly, you feel much more skillful!");
- raiselevel(); raisemhp(1); return;
-
- case 3: lprcat("\nYou feel strange for a moment");
- c[rund(6)]++; break;
-
- case 4: lprcat("\nYou feel more self confident!");
- c[WISDOM] += rnd(2); break;
-
- case 5: lprcat("\nWow! You feel great!");
- if (c[STRENGTH]<12) c[STRENGTH]=12; else c[STRENGTH]++; break;
-
- case 6: lprcat("\nYour charm went up by one!"); c[CHARISMA]++; break;
-
- case 8: lprcat("\nYour intelligence went up by one!");
- c[INTELLIGENCE]++; break;
-
- case 10: for (i=0; i<MAXY; i++) for (j=0; j<MAXX; j++)
- if (mitem[j][i])
- {
- know[j][i]=1; show1cell(j,i);
- }
- /* monster detection */ return;
-
- case 12: lprcat("\nThis potion has no taste to it"); return;
-
- case 15: lprcat("\nWOW!!! You feel Super-fantastic!!!");
- if (c[HERO]==0) for (i=0; i<6; i++) c[i] += 11;
- c[HERO] += 250; break;
-
- case 16: lprcat("\nYou have a greater intestinal constitude!");
- c[CONSTITUTION]++; break;
-
- case 17: lprcat("\nYou now have incredibly bulging muscles!!!");
- if (c[GIANTSTR]==0) c[STREXTRA] += 21;
- c[GIANTSTR] += 700; break;
-
- case 18: lprcat("\nYou feel a chill run up your spine!");
- c[FIRERESISTANCE] += 1000; break;
-
- case 0: lprcat("\nYou fall asleep. . .");
- i=rnd(11)-(c[CONSTITUTION]>>2)+2; while(--i>0) { parse2(); nap(1000); }
- cursors(); lprcat("\nYou woke up!"); return;
-
- case 7: lprcat("\nYou become dizzy!");
- if (--c[STRENGTH] < 3) c[STRENGTH]=3; break;
-
- case 11: lprcat("\nYou stagger for a moment . .");
- for (i=0; i<MAXY; i++) for (j=0; j<MAXX; j++)
- know[j][i]=0;
- nap(2000); draws(0,MAXX,0,MAXY); /* potion of forgetfulness */ return;
-
- case 13: lprcat("\nYou can't see anything!"); /* blindness */
- c[BLINDCOUNT]+=500; return;
-
- case 14: lprcat("\nYou feel confused"); c[CONFUSE]+= 20+rnd(9); return;
+ int pot;
+{
+ int i, j, k;
- case 21: lprcat("\nYou don't seem to be affected"); return; /* cure dianthroritis */
+ if (pot < 0 || pot >= MAXPOTION)
+ return; /* check for within bounds */
+ potionname[pot] = potionhide[pot];
+ switch (pot) {
+ case 9:
+ lprcat("\nYou feel greedy . . .");
+ nap(2000);
+ for (i = 0; i < MAXY; i++)
+ for (j = 0; j < MAXX; j++)
+ if ((item[j][i] == OGOLDPILE) || (item[j][i] == OMAXGOLD)) {
+ know[j][i] = 1;
+ show1cell(j, i);
+ }
+ showplayer();
+ return;
+
+ case 19:
+ lprcat("\nYou feel greedy . . .");
+ nap(2000);
+ for (i = 0; i < MAXY; i++)
+ for (j = 0; j < MAXX; j++) {
+ k = item[j][i];
+ if ((k == ODIAMOND) || (k == ORUBY) || (k == OEMERALD) || (k == OMAXGOLD)
+ || (k == OSAPPHIRE) || (k == OLARNEYE) || (k == OGOLDPILE)) {
+ know[j][i] = 1;
+ show1cell(j, i);
+ }
+ }
+ showplayer();
+ return;
+
+ case 20:
+ c[HP] = c[HPMAX];
+ break; /* instant healing */
+
+ case 1:
+ lprcat("\nYou feel better");
+ if (c[HP] == c[HPMAX])
+ raisemhp(1);
+ else if ((c[HP] += rnd(20) + 20 + c[LEVEL]) > c[HPMAX])
+ c[HP] = c[HPMAX];
+ break;
+
+ case 2:
+ lprcat("\nSuddenly, you feel much more skillful!");
+ raiselevel();
+ raisemhp(1);
+ return;
+
+ case 3:
+ lprcat("\nYou feel strange for a moment");
+ c[rund(6)]++;
+ break;
+
+ case 4:
+ lprcat("\nYou feel more self confident!");
+ c[WISDOM] += rnd(2);
+ break;
+
+ case 5:
+ lprcat("\nWow! You feel great!");
+ if (c[STRENGTH] < 12)
+ c[STRENGTH] = 12;
+ else
+ c[STRENGTH]++;
+ break;
+
+ case 6:
+ lprcat("\nYour charm went up by one!");
+ c[CHARISMA]++;
+ break;
+
+ case 8:
+ lprcat("\nYour intelligence went up by one!");
+ c[INTELLIGENCE]++;
+ break;
+
+ case 10:
+ for (i = 0; i < MAXY; i++)
+ for (j = 0; j < MAXX; j++)
+ if (mitem[j][i]) {
+ know[j][i] = 1;
+ show1cell(j, i);
+ }
+ /* monster detection */ return;
+
+ case 12:
+ lprcat("\nThis potion has no taste to it");
+ return;
+
+ case 15:
+ lprcat("\nWOW!!! You feel Super-fantastic!!!");
+ if (c[HERO] == 0)
+ for (i = 0; i < 6; i++)
+ c[i] += 11;
+ c[HERO] += 250;
+ break;
+
+ case 16:
+ lprcat("\nYou have a greater intestinal constitude!");
+ c[CONSTITUTION]++;
+ break;
+
+ case 17:
+ lprcat("\nYou now have incredibly bulging muscles!!!");
+ if (c[GIANTSTR] == 0)
+ c[STREXTRA] += 21;
+ c[GIANTSTR] += 700;
+ break;
+
+ case 18:
+ lprcat("\nYou feel a chill run up your spine!");
+ c[FIRERESISTANCE] += 1000;
+ break;
+
+ case 0:
+ lprcat("\nYou fall asleep. . .");
+ i = rnd(11) - (c[CONSTITUTION] >> 2) + 2;
+ while (--i > 0) {
+ parse2();
+ nap(1000);
+ }
+ cursors();
+ lprcat("\nYou woke up!");
+ return;
+
+ case 7:
+ lprcat("\nYou become dizzy!");
+ if (--c[STRENGTH] < 3)
+ c[STRENGTH] = 3;
+ break;
+
+ case 11:
+ lprcat("\nYou stagger for a moment . .");
+ for (i = 0; i < MAXY; i++)
+ for (j = 0; j < MAXX; j++)
+ know[j][i] = 0;
+ nap(2000);
+ draws(0, MAXX, 0, MAXY); /* potion of forgetfulness */
+ return;
+
+ case 13:
+ lprcat("\nYou can't see anything!"); /* blindness */
+ c[BLINDCOUNT] += 500;
+ return;
+
+ case 14:
+ lprcat("\nYou feel confused");
+ c[CONFUSE] += 20 + rnd(9);
+ return;
+
+ case 21:
+ lprcat("\nYou don't seem to be affected");
+ return; /* cure dianthroritis */
+
+ case 22:
+ lprcat("\nYou feel a sickness engulf you"); /* poison */
+ c[HALFDAM] += 200 + rnd(200);
+ return;
+
+ case 23:
+ lprcat("\nYou feel your vision sharpen"); /* see invisible */
+ c[SEEINVISIBLE] += rnd(1000) + 400;
+ monstnamelist[INVISIBLESTALKER] = 'I';
+ return;
+ };
+ bottomline(); /* show new stats */
+ return;
+}
- case 22: lprcat("\nYou feel a sickness engulf you"); /* poison */
- c[HALFDAM] += 200 + rnd(200); return;
- case 23: lprcat("\nYou feel your vision sharpen"); /* see invisible */
- c[SEEINVISIBLE] += rnd(1000)+400;
- monstnamelist[INVISIBLESTALKER] = 'I'; return;
- };
- bottomline(); /* show new stats */ return;
- }
-
/*
- *******
- OSCROLL
- *******
-
- function to process a magic scroll
+ * *******
+ * OSCROLL
+ * *******
+ *
+ * function to process a magic scroll
*/
+void
oscroll(typ)
- int typ;
- {
+ int typ;
+{
lprcat("\nDo you ");
- if (c[BLINDCOUNT]==0) lprcat("(r) read it, "); lprcat("(t) take it"); iopts();
- while (1) switch(getchar())
- {
+ if (c[BLINDCOUNT] == 0)
+ lprcat("(r) read it, ");
+ lprcat("(t) take it");
+ iopts();
+ while (1)
+ switch (lgetchar()) {
case '\33':
- case 'i': ignore(); return;
-
- case 'r': if (c[BLINDCOUNT]) break;
- lprcat("read"); forget();
- if (typ==2 || typ==15) { show1cell(playerx,playery); cursors(); }
- /* destroy it */ read_scroll(typ); return;
+ case 'i':
+ ignore();
+ return;
- case 't': lprcat("take"); if (take(OSCROLL,typ)==0) forget(); /* destroy it */
- return;
+ case 'r':
+ if (c[BLINDCOUNT])
+ break;
+ lprcat("read");
+ forget();
+ if (typ == 2 || typ == 15) {
+ show1cell(playerx, playery);
+ cursors();
+ }
+ /* destroy it */ read_scroll(typ);
+ return;
+
+ case 't':
+ lprcat("take");
+ if (take(OSCROLL, typ) == 0)
+ forget(); /* destroy it */
+ return;
};
- }
+}
/*
- data for the function to read a scroll
+ * data for the function to read a scroll
*/
-static int xh,yh,yl,xl;
-static char curse[] = { BLINDCOUNT, CONFUSE, AGGRAVATE, HASTEMONST, ITCHING,
- LAUGHING, DRAINSTRENGTH, CLUMSINESS, INFEEBLEMENT, HALFDAM };
-static char exten[] = { PROTECTIONTIME, DEXCOUNT, STRCOUNT, CHARMCOUNT,
- INVISIBILITY, CANCELLATION, HASTESELF, GLOBE, SCAREMONST, HOLDMONST, TIMESTOP };
-char time_change[] = { HASTESELF,HERO,ALTPRO,PROTECTIONTIME,DEXCOUNT,
- STRCOUNT,GIANTSTR,CHARMCOUNT,INVISIBILITY,CANCELLATION,
- HASTESELF,AGGRAVATE,SCAREMONST,STEALTH,AWARENESS,HOLDMONST,HASTEMONST,
- FIRERESISTANCE,GLOBE,SPIRITPRO,UNDEADPRO,HALFDAM,SEEINVISIBLE,
- ITCHING,CLUMSINESS, WTW };
+static int xh, yh, yl, xl;
+static u_char curse[] = {
+ BLINDCOUNT, CONFUSE, AGGRAVATE, HASTEMONST, ITCHING,
+ LAUGHING, DRAINSTRENGTH, CLUMSINESS, INFEEBLEMENT, HALFDAM
+};
+
+static u_char exten[] = {
+ PROTECTIONTIME, DEXCOUNT, STRCNT, CHARMCOUNT, INVISIBILITY,
+ CANCELLATION, HASTESELF, GLOBE, SCAREMONST, HOLDMONST, TIMESTOP
+};
+
+u_char time_change[] = {
+ HASTESELF, HERO, ALTPRO, PROTECTIONTIME, DEXCOUNT, STRCNT,
+ GIANTSTR, CHARMCOUNT, INVISIBILITY, CANCELLATION, HASTESELF,
+ AGGRAVATE, SCAREMONST, STEALTH, AWARENESS, HOLDMONST,
+ HASTEMONST, FIRERESISTANCE, GLOBE, SPIRITPRO, UNDEADPRO,
+ HALFDAM, SEEINVISIBLE, ITCHING, CLUMSINESS, WTW
+};
+
/*
* function to adjust time when time warping and taking courses in school
*/
-adjtime(tim)
- register long tim;
- {
- register int j;
- for (j=0; j<26; j++) /* adjust time related parameters */
+void
+adjusttime(tim)
+ long tim;
+{
+ int j;
+
+ for (j = 0; j < 26; j++)/* adjust time related parameters */
if (c[time_change[j]])
- if ((c[time_change[j]] -= tim) < 1) c[time_change[j]]=1;
+ if ((c[time_change[j]] -= tim) < 1)
+ c[time_change[j]] = 1;
regen();
- }
+}
/*
- function to read a scroll
+ * function to read a scroll
*/
+void
read_scroll(typ)
- int typ;
- {
- register int i,j;
- if (typ<0 || typ>=MAXSCROLL) return; /* be sure we are within bounds */
- scrollname[typ] = scrollhide[typ];
- switch(typ)
- {
- case 0: lprcat("\nYour armor glows for a moment"); enchantarmor(); return;
-
- case 1: lprcat("\nYour weapon glows for a moment"); enchweapon(); return; /* enchant weapon */
-
- case 2: lprcat("\nYou have been granted enlightenment!");
- yh = min(playery+7,MAXY); xh = min(playerx+25,MAXX);
- yl = max(playery-7,0); xl = max(playerx-25,0);
- for (i=yl; i<yh; i++) for (j=xl; j<xh; j++) know[j][i]=1;
- nap(2000); draws(xl,xh,yl,yh); return;
-
- case 3: lprcat("\nThis scroll seems to be blank"); return;
-
- case 4: createmonster(makemonst(level+1)); return; /* this one creates a monster */
-
- case 5: something(level); /* create artifact */ return;
-
- case 6: c[AGGRAVATE]+=800; return; /* aggravate monsters */
-
- case 7: gltime += (i = rnd(1000) - 850); /* time warp */
- if (i>=0) lprintf("\nYou went forward in time by %d mobuls",(long)((i+99)/100));
- else lprintf("\nYou went backward in time by %d mobuls",(long)(-(i+99)/100));
- adjtime((long)i); /* adjust time for time warping */
- return;
-
- case 8: oteleport(0); return; /* teleportation */
-
- case 9: c[AWARENESS] += 1800; return; /* expanded awareness */
-
- case 10: c[HASTEMONST] += rnd(55)+12; return; /* haste monster */
-
- case 11: for (i=0; i<MAXY; i++) for (j=0; j<MAXX; j++)
- if (mitem[j][i])
- hitp[j][i] = monster[mitem[j][i]].hitpoints;
- return; /* monster healing */
- case 12: c[SPIRITPRO] += 300 + rnd(200); bottomline(); return; /* spirit protection */
-
- case 13: c[UNDEADPRO] += 300 + rnd(200); bottomline(); return; /* undead protection */
-
- case 14: c[STEALTH] += 250 + rnd(250); bottomline(); return; /* stealth */
-
- case 15: lprcat("\nYou have been granted enlightenment!"); /* magic mapping */
- for (i=0; i<MAXY; i++) for (j=0; j<MAXX; j++) know[j][i]=1;
- nap(2000); draws(0,MAXX,0,MAXY); return;
-
- case 16: c[HOLDMONST] += 30; bottomline(); return; /* hold monster */
-
- case 17: for (i=0; i<26; i++) /* gem perfection */
- switch(iven[i])
- {
- case ODIAMOND: case ORUBY:
- case OEMERALD: case OSAPPHIRE:
- j = ivenarg[i]; j &= 255; j <<= 1;
- if (j > 255) j=255; /* double value */
- ivenarg[i] = j; break;
- }
- break;
-
- case 18: for (i=0; i<11; i++) c[exten[i]] <<= 1; /* spell extension */
- break;
-
- case 19: for (i=0; i<26; i++) /* identify */
- {
- if (iven[i]==OPOTION) potionname[ivenarg[i]] = potionhide[ivenarg[i]];
- if (iven[i]==OSCROLL) scrollname[ivenarg[i]] = scrollhide[ivenarg[i]];
- }
- break;
+ int typ;
+{
+ int i, j;
- case 20: for (i=0; i<10; i++) /* remove curse */
- if (c[curse[i]]) c[curse[i]] = 1;
+ if (typ < 0 || typ >= MAXSCROLL)
+ return; /* be sure we are within bounds */
+ scrollname[typ] = scrollhide[typ];
+ switch (typ) {
+ case 0:
+ lprcat("\nYour armor glows for a moment");
+ enchantarmor();
+ return;
+
+ case 1:
+ lprcat("\nYour weapon glows for a moment");
+ enchweapon();
+ return; /* enchant weapon */
+
+ case 2:
+ lprcat("\nYou have been granted enlightenment!");
+ yh = min(playery + 7, MAXY);
+ xh = min(playerx + 25, MAXX);
+ yl = max(playery - 7, 0);
+ xl = max(playerx - 25, 0);
+ for (i = yl; i < yh; i++)
+ for (j = xl; j < xh; j++)
+ know[j][i] = 1;
+ nap(2000);
+ draws(xl, xh, yl, yh);
+ return;
+
+ case 3:
+ lprcat("\nThis scroll seems to be blank");
+ return;
+
+ case 4:
+ createmonster(makemonst(level + 1));
+ return; /* this one creates a monster */
+
+ case 5:
+ something(level); /* create artifact */
+ return;
+
+ case 6:
+ c[AGGRAVATE] += 800;
+ return; /* aggravate monsters */
+
+ case 7:
+ gltime += (i = rnd(1000) - 850); /* time warp */
+ if (i >= 0)
+ lprintf("\nYou went forward in time by %d mobuls", (long) ((i + 99) / 100));
+ else
+ lprintf("\nYou went backward in time by %d mobuls", (long) (-(i + 99) / 100));
+ adjusttime((long) i); /* adjust time for time warping */
+ return;
+
+ case 8:
+ oteleport(0);
+ return; /* teleportation */
+
+ case 9:
+ c[AWARENESS] += 1800;
+ return; /* expanded awareness */
+
+ case 10:
+ c[HASTEMONST] += rnd(55) + 12;
+ return; /* haste monster */
+
+ case 11:
+ for (i = 0; i < MAXY; i++)
+ for (j = 0; j < MAXX; j++)
+ if (mitem[j][i])
+ hitp[j][i] = monster[mitem[j][i]].hitpoints;
+ return; /* monster healing */
+ case 12:
+ c[SPIRITPRO] += 300 + rnd(200);
+ bottomline();
+ return; /* spirit protection */
+
+ case 13:
+ c[UNDEADPRO] += 300 + rnd(200);
+ bottomline();
+ return; /* undead protection */
+
+ case 14:
+ c[STEALTH] += 250 + rnd(250);
+ bottomline();
+ return; /* stealth */
+
+ case 15:
+ lprcat("\nYou have been granted enlightenment!"); /* magic mapping */
+ for (i = 0; i < MAXY; i++)
+ for (j = 0; j < MAXX; j++)
+ know[j][i] = 1;
+ nap(2000);
+ draws(0, MAXX, 0, MAXY);
+ return;
+
+ case 16:
+ c[HOLDMONST] += 30;
+ bottomline();
+ return; /* hold monster */
+
+ case 17:
+ for (i = 0; i < 26; i++) /* gem perfection */
+ switch (iven[i]) {
+ case ODIAMOND:
+ case ORUBY:
+ case OEMERALD:
+ case OSAPPHIRE:
+ j = ivenarg[i];
+ j &= 255;
+ j <<= 1;
+ if (j > 255)
+ j = 255; /* double value */
+ ivenarg[i] = j;
break;
+ }
+ break;
+
+ case 18:
+ for (i = 0; i < 11; i++)
+ c[exten[i]] <<= 1; /* spell extension */
+ break;
+
+ case 19:
+ for (i = 0; i < 26; i++) { /* identify */
+ if (iven[i] == OPOTION)
+ potionname[ivenarg[i]] = potionhide[ivenarg[i]];
+ if (iven[i] == OSCROLL)
+ scrollname[ivenarg[i]] = scrollhide[ivenarg[i]];
+ }
+ break;
+
+ case 20:
+ for (i = 0; i < 10; i++) /* remove curse */
+ if (c[curse[i]])
+ c[curse[i]] = 1;
+ break;
+
+ case 21:
+ annihilate();
+ break; /* scroll of annihilation */
+
+ case 22:
+ godirect(22, 150, "The ray hits the %s", 0, ' '); /* pulverization */
+ break;
+ case 23:
+ c[LIFEPROT]++;
+ break; /* life protection */
+ };
+}
- case 21: annihilate(); break; /* scroll of annihilation */
- case 22: godirect(22,150,"The ray hits the %s",0,' '); /* pulverization */
- break;
- case 23: c[LIFEPROT]++; break; /* life protection */
- };
- }
-
+void
oorb()
- {
- }
+{
+}
+void
opit()
- {
- register int i;
- if (rnd(101)<81)
- if (rnd(70) > 9*c[DEXTERITY]-packweight() || rnd(101)<5)
- if (level==MAXLEVEL-1) obottomless(); else
- if (level==MAXLEVEL+MAXVLEVEL-1) obottomless(); else
- {
- if (rnd(101)<20)
- {
- i=0; lprcat("\nYou fell into a pit! Your fall is cushioned by an unknown force\n");
- }
- else
- {
- i = rnd(level*3+3);
- lprintf("\nYou fell into a pit! You suffer %d hit points damage",(long)i);
- lastnum=261; /* if he dies scoreboard will say so */
+{
+ int i;
+
+ if (rnd(101) < 81) {
+ if (rnd(70) > 9 * c[DEXTERITY] - packweight() || rnd(101) < 5) {
+ if (level == MAXLEVEL - 1)
+ obottomless();
+ else if (level == MAXLEVEL + MAXVLEVEL - 1)
+ obottomless();
+ else {
+ if (rnd(101) < 20) {
+ i = 0;
+ lprcat("\nYou fell into a pit! Your fall is cushioned by an unknown force\n");
+ } else {
+ i = rnd(level * 3 + 3);
+ lprintf("\nYou fell into a pit! You suffer %d hit points damage", (long) i);
+ lastnum = 261; /* if he dies scoreboard
+ * will say so */
}
- losehp(i); nap(2000); newcavelevel(level+1); draws(0,MAXX,0,MAXY);
+ losehp(i);
+ nap(2000);
+ newcavelevel(level + 1);
+ draws(0, MAXX, 0, MAXY);
}
+ }
}
+}
+void
obottomless()
- {
- lprcat("\nYou fell into a bottomless pit!"); beep(); nap(3000); died(262);
- }
+{
+ lprcat("\nYou fell into a bottomless pit!");
+ lbeep();
+ nap(3000);
+ died(262);
+}
+
+void
oelevator(dir)
- int dir;
- {
+ int dir;
+{
#ifdef lint
- int x;
- x=dir;
- dir=x;
-#endif lint
- }
+ int x;
+ x = dir;
+ dir = x;
+#endif /* lint */
+}
+void
ostatue()
- {
- }
+{
+}
+void
omirror()
- {
- }
+{
+}
+void
obook()
- {
+{
lprcat("\nDo you ");
- if (c[BLINDCOUNT]==0) lprcat("(r) read it, "); lprcat("(t) take it"); iopts();
- while (1) switch(getchar())
- {
+ if (c[BLINDCOUNT] == 0)
+ lprcat("(r) read it, ");
+ lprcat("(t) take it");
+ iopts();
+ while (1)
+ switch (lgetchar()) {
case '\33':
- case 'i': ignore(); return;
+ case 'i':
+ ignore();
+ return;
- case 'r': if (c[BLINDCOUNT]) break;
- lprcat("read");
- /* no more book */ readbook(iarg[playerx][playery]); forget(); return;
-
- case 't': lprcat("take"); if (take(OBOOK,iarg[playerx][playery])==0) forget(); /* no more book */
- return;
+ case 'r':
+ if (c[BLINDCOUNT])
+ break;
+ lprcat("read");
+ /* no more book */ readbook(iarg[playerx][playery]);
+ forget();
+ return;
+
+ case 't':
+ lprcat("take");
+ if (take(OBOOK, iarg[playerx][playery]) == 0)
+ forget(); /* no more book */
+ return;
};
- }
+}
/*
- function to read a book
+ * function to read a book
*/
+void
readbook(lev)
- register int lev;
- {
- register int i,tmp;
- if (lev<=3) i = rund((tmp=splev[lev])?tmp:1); else
- i = rnd((tmp=splev[lev]-9)?tmp:1) + 9;
- spelknow[i]=1;
- lprintf("\nSpell \"%s\": %s\n%s",spelcode[i],spelname[i],speldescript[i]);
- if (rnd(10)==4)
- { lprcat("\nYour int went up by one!"); c[INTELLIGENCE]++; bottomline(); }
+ int lev;
+{
+ int i, tmp;
+
+ if (lev <= 3)
+ i = rund((tmp = splev[lev]) ? tmp : 1);
+ else
+ i = rnd((tmp = splev[lev] - 9) ? tmp : 1) + 9;
+ spelknow[i] = 1;
+ lprintf("\nSpell \"%s\": %s\n%s", spelcode[i], spelname[i], speldescript[i]);
+ if (rnd(10) == 4) {
+ lprcat("\nYour int went up by one!");
+ c[INTELLIGENCE]++;
+ bottomline();
}
+}
+void
ocookie()
- {
- char *p;
- lprcat("\nDo you (e) eat it, (t) take it"); iopts();
- while (1) switch(getchar())
- {
- case '\33':
- case 'i': ignore(); return;
-
- case 'e': lprcat("eat\nThe cookie tasted good.");
- forget(); /* no more cookie */
- if (c[BLINDCOUNT]) return;
- if (!(p=fortune())) return;
- lprcat(" A message inside the cookie reads:\n"); lprcat(p);
- return;
+{
+ char *p;
- case 't': lprcat("take"); if (take(OCOOKIE,0)==0) forget(); /* no more book */
- return;
+ lprcat("\nDo you (e) eat it, (t) take it");
+ iopts();
+ while (1)
+ switch (lgetchar()) {
+ case '\33':
+ case 'i':
+ ignore();
+ return;
+
+ case 'e':
+ lprcat("eat\nThe cookie tasted good.");
+ forget(); /* no more cookie */
+ if (c[BLINDCOUNT])
+ return;
+ if (!(p = fortune()))
+ return;
+ lprcat(" A message inside the cookie reads:\n");
+ lprcat(p);
+ return;
+
+ case 't':
+ lprcat("take");
+ if (take(OCOOKIE, 0) == 0)
+ forget(); /* no more book */
+ return;
};
- }
+}
-/* routine to pick up some gold -- if arg==OMAXGOLD then the pile is worth 100* the argument */
+/*
+ * routine to pick up some gold -- if arg==OMAXGOLD then the pile is worth
+ * 100* the argument
+ */
+void
ogold(arg)
- int arg;
- {
- register long i;
+ int arg;
+{
+ long i;
+
i = iarg[playerx][playery];
- if (arg==OMAXGOLD) i *= 100;
- else if (arg==OKGOLD) i *= 1000;
- else if (arg==ODGOLD) i *= 10;
- lprintf("\nIt is worth %d!",(long)i); c[GOLD] += i; bottomgold();
- item[playerx][playery] = know[playerx][playery] = 0; /* destroy gold */
- }
+ if (arg == OMAXGOLD)
+ i *= 100;
+ else if (arg == OKGOLD)
+ i *= 1000;
+ else if (arg == ODGOLD)
+ i *= 10;
+ lprintf("\nIt is worth %d!", (long) i);
+ c[GOLD] += i;
+ bottomgold();
+ item[playerx][playery] = know[playerx][playery] = 0; /* destroy gold */
+}
+void
ohome()
- {
- register int i;
- nosignal = 1; /* disable signals */
- for (i=0; i<26; i++) if (iven[i]==OPOTION) if (ivenarg[i]==21)
- {
- iven[i]=0; /* remove the potion of cure dianthroritis from inventory */
- clear(); lprcat("Congratulations. You found a potion of cure dianthroritis.\n");
- lprcat("\nFrankly, No one thought you could do it. Boy! Did you surprise them!\n");
- if (gltime>TIMELIMIT)
- {
- lprcat("\nThe doctor has the sad duty to inform you that your daughter died!\n");
- lprcat("You didn't make it in time. In your agony, you kill the doctor,\nyour wife, and yourself! Too bad!\n");
- nap(5000); died(269);
- }
- else
- {
- lprcat("\nThe doctor is now administering the potion, and in a few moments\n");
- lprcat("Your daughter should be well on her way to recovery.\n");
- nap(6000);
- lprcat("\nThe potion is"); nap(3000); lprcat(" working! The doctor thinks that\n");
- lprcat("your daughter will recover in a few days. Congratulations!\n");
- beep(); nap(5000); died(263);
+{
+ int i;
+
+ nosignal = 1; /* disable signals */
+ for (i = 0; i < 26; i++)
+ if (iven[i] == OPOTION)
+ if (ivenarg[i] == 21) {
+ iven[i] = 0; /* remove the potion of cure
+ * dianthroritis from
+ * inventory */
+ clear();
+ lprcat("Congratulations. You found a potion of cure dianthroritis.\n");
+ lprcat("\nFrankly, No one thought you could do it. Boy! Did you surprise them!\n");
+ if (gltime > TIMELIMIT) {
+ lprcat("\nThe doctor has the sad duty to inform you that your daughter died!\n");
+ lprcat("You didn't make it in time. In your agony, you kill the doctor,\nyour wife, and yourself! Too bad!\n");
+ nap(5000);
+ died(269);
+ } else {
+ lprcat("\nThe doctor is now administering the potion, and in a few moments\n");
+ lprcat("Your daughter should be well on her way to recovery.\n");
+ nap(6000);
+ lprcat("\nThe potion is");
+ nap(3000);
+ lprcat(" working! The doctor thinks that\n");
+ lprcat("your daughter will recover in a few days. Congratulations!\n");
+ lbeep();
+ nap(5000);
+ died(263);
+ }
}
- }
-
- while (1)
- {
- clear(); lprintf("Welcome home %s. Latest word from the doctor is not good.\n",logname);
+ while (1) {
+ clear();
+ lprintf("Welcome home %s. Latest word from the doctor is not good.\n", logname);
- if (gltime>TIMELIMIT)
- {
+ if (gltime > TIMELIMIT) {
lprcat("\nThe doctor has the sad duty to inform you that your daughter died!\n");
lprcat("You didn't make it in time. In your agony, you kill the doctor,\nyour wife, and yourself! Too bad!\n");
- nap(5000); died(269);
- }
-
+ nap(5000);
+ died(269);
+ }
lprcat("\nThe diagnosis is confirmed as dianthroritis. He guesses that\n");
- lprintf("your daughter has only %d mobuls left in this world. It's up to you,\n",(long)((TIMELIMIT-gltime+99)/100));
- lprintf("%s, to find the only hope for your daughter, the very rare\n",logname);
+ lprintf("your daughter has only %d mobuls left in this world. It's up to you,\n", (long) ((TIMELIMIT - gltime + 99) / 100));
+ lprintf("%s, to find the only hope for your daughter, the very rare\n", logname);
lprcat("potion of cure dianthroritis. It is rumored that only deep in the\n");
lprcat("depths of the caves can this potion be found.\n\n\n");
- lprcat("\n ----- press "); standout("return");
- lprcat(" to continue, "); standout("escape");
+ lprcat("\n ----- press ");
+ lstandout("return");
+ lprcat(" to continue, ");
+ lstandout("escape");
lprcat(" to leave ----- ");
- i=getchar(); while (i!='\33' && i!='\n') i=getchar();
- if (i=='\33') { drawscreen(); nosignal = 0; /* enable signals */ return; }
+ i = lgetchar();
+ while (i != '\33' && i != '\n')
+ i = lgetchar();
+ if (i == '\33') {
+ drawscreen();
+ nosignal = 0; /* enable signals */
+ return;
}
}
+}
-/* routine to save program space */
+/* routine to save program space */
+void
iopts()
- { lprcat(", or (i) ignore it? "); }
-ignore()
- { lprcat("ignore\n"); }
+{
+ lprcat(", or (i) ignore it? ");
+}
+void
+ignore()
+{
+ lprcat("ignore\n");
+}
diff --git a/games/larn/pathnames.h b/games/larn/pathnames.h
index 3671c942411..f61281975d7 100644
--- a/games/larn/pathnames.h
+++ b/games/larn/pathnames.h
@@ -1,4 +1,5 @@
-/* $NetBSD: pathnames.h,v 1.5 1995/04/22 07:34:10 cgd Exp $ */
+/* $OpenBSD: pathnames.h,v 1.2 1998/09/15 05:12:33 pjanzen Exp $ */
+/* $NetBSD: pathnames.h,v 1.7 1997/10/18 20:03:41 christos Exp $ */
/*-
* Copyright (c) 1990 The Regents of the University of California.
@@ -32,7 +33,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * @(#)pathnames.h 5.1 (Berkeley) 5/2/90
+ * @(#)pathnames.h 5.2 (Berkeley) 4/27/95
*/
#define _PATH_LOG "/var/games/larn/llog12.0"
diff --git a/games/larn/regen.c b/games/larn/regen.c
index 81d8ccd08da..900f1b89d36 100644
--- a/games/larn/regen.c
+++ b/games/larn/regen.c
@@ -1,96 +1,189 @@
+/* $OpenBSD: regen.c,v 1.3 1998/09/15 05:12:33 pjanzen Exp $ */
+/* $NetBSD: regen.c,v 1.5 1997/10/18 20:03:43 christos Exp $ */
+
+/* regen.c Larn is copyrighted 1986 by Noah Morgan. */
#ifndef lint
-static char rcsid[] = "$NetBSD: regen.c,v 1.3 1995/03/23 08:34:11 cgd Exp $";
-#endif /* not lint */
+static char rcsid[] = "$OpenBSD: regen.c,v 1.3 1998/09/15 05:12:33 pjanzen Exp $";
+#endif /* not lint */
-/* regen.c Larn is copyrighted 1986 by Noah Morgan. */
#include "header.h"
-/*
- *******
- REGEN()
- *******
- regen()
+#include "extern.h"
- subroutine to regenerate player hp and spells
+/*
+ * *******
+ * REGEN()
+ * *******
+ * regen()
+ *
+ * subroutine to regenerate player hp and spells
*/
+void
regen()
- {
- register int i,flag;
- register long *d;
+{
+ int i, flag;
+ long *d;
+
d = c;
#ifdef EXTRA
d[MOVESMADE]++;
#endif
- if (d[TIMESTOP]) { if(--d[TIMESTOP]<=0) bottomline(); return; } /* for stop time spell */
- flag=0;
+ if (d[TIMESTOP]) {
+ if (--d[TIMESTOP] <= 0)
+ bottomline();
+ return;
+ } /* for stop time spell */
+ flag = 0;
- if (d[STRENGTH]<3) { d[STRENGTH]=3; flag=1; }
- if ((d[HASTESELF]==0) || ((d[HASTESELF] & 1) == 0))
+ if (d[STRENGTH] < 3) {
+ d[STRENGTH] = 3;
+ flag = 1;
+ }
+ if ((d[HASTESELF] == 0) || ((d[HASTESELF] & 1) == 0))
gltime++;
if (d[HP] != d[HPMAX])
- if (d[REGENCOUNTER]-- <= 0) /* regenerate hit points */
- {
- d[REGENCOUNTER] = 22 + (d[HARDGAME]<<1) - d[LEVEL];
- if ((d[HP] += d[REGEN]) > d[HPMAX]) d[HP] = d[HPMAX];
+ if (d[REGENCOUNTER]-- <= 0) { /* regenerate hit points */
+ d[REGENCOUNTER] = 22 + (d[HARDGAME] << 1) - d[LEVEL];
+ if ((d[HP] += d[REGEN]) > d[HPMAX])
+ d[HP] = d[HPMAX];
bottomhp();
- }
-
- if (d[SPELLS] < d[SPELLMAX]) /* regenerate spells */
- if (d[ECOUNTER]-- <= 0)
- {
- d[ECOUNTER] = 100+4*(d[HARDGAME]-d[LEVEL]-d[ENERGY]);
- d[SPELLS]++; bottomspell();
- }
-
- if (d[HERO]) if (--d[HERO]<=0) { for (i=0; i<6; i++) d[i] -= 10; flag=1; }
- if (d[ALTPRO]) if (--d[ALTPRO]<=0) { d[MOREDEFENSES]-=3; flag=1; }
- if (d[PROTECTIONTIME]) if (--d[PROTECTIONTIME]<=0) { d[MOREDEFENSES]-=2; flag=1; }
- if (d[DEXCOUNT]) if (--d[DEXCOUNT]<=0) { d[DEXTERITY]-=3; flag=1; }
- if (d[STRCOUNT]) if (--d[STRCOUNT]<=0) { d[STREXTRA]-=3; flag=1; }
- if (d[BLINDCOUNT]) if (--d[BLINDCOUNT]<=0) { cursors(); lprcat("\nThe blindness lifts "); beep(); }
- if (d[CONFUSE]) if (--d[CONFUSE]<=0) { cursors(); lprcat("\nYou regain your senses"); beep(); }
- if (d[GIANTSTR]) if (--d[GIANTSTR]<=0) { d[STREXTRA] -= 20; flag=1; }
- if (d[CHARMCOUNT]) if ((--d[CHARMCOUNT]) <= 0) flag=1;
- if (d[INVISIBILITY]) if ((--d[INVISIBILITY]) <= 0) flag=1;
- if (d[CANCELLATION]) if ((--d[CANCELLATION]) <= 0) flag=1;
- if (d[WTW]) if ((--d[WTW]) <= 0) flag=1;
- if (d[HASTESELF]) if ((--d[HASTESELF]) <= 0) flag=1;
- if (d[AGGRAVATE]) --d[AGGRAVATE];
- if (d[SCAREMONST]) if ((--d[SCAREMONST]) <= 0) flag=1;
- if (d[STEALTH]) if ((--d[STEALTH]) <= 0) flag=1;
- if (d[AWARENESS]) --d[AWARENESS];
- if (d[HOLDMONST]) if ((--d[HOLDMONST]) <= 0) flag=1;
- if (d[HASTEMONST]) --d[HASTEMONST];
- if (d[FIRERESISTANCE]) if ((--d[FIRERESISTANCE]) <= 0) flag=1;
- if (d[GLOBE]) if (--d[GLOBE]<=0) { d[MOREDEFENSES]-=10; flag=1; }
- if (d[SPIRITPRO]) if (--d[SPIRITPRO] <= 0) flag=1;
- if (d[UNDEADPRO]) if (--d[UNDEADPRO] <= 0) flag=1;
- if (d[HALFDAM]) if (--d[HALFDAM]<=0) { cursors(); lprcat("\nYou now feel better "); beep(); }
+ }
+ if (d[SPELLS] < d[SPELLMAX]) /* regenerate spells */
+ if (d[ECOUNTER]-- <= 0) {
+ d[ECOUNTER] = 100 + 4 * (d[HARDGAME] - d[LEVEL] - d[ENERGY]);
+ d[SPELLS]++;
+ bottomspell();
+ }
+ if (d[HERO])
+ if (--d[HERO] <= 0) {
+ for (i = 0; i < 6; i++)
+ d[i] -= 10;
+ flag = 1;
+ }
+ if (d[ALTPRO])
+ if (--d[ALTPRO] <= 0) {
+ d[MOREDEFENSES] -= 3;
+ flag = 1;
+ }
+ if (d[PROTECTIONTIME])
+ if (--d[PROTECTIONTIME] <= 0) {
+ d[MOREDEFENSES] -= 2;
+ flag = 1;
+ }
+ if (d[DEXCOUNT])
+ if (--d[DEXCOUNT] <= 0) {
+ d[DEXTERITY] -= 3;
+ flag = 1;
+ }
+ if (d[STRCNT])
+ if (--d[STRCNT] <= 0) {
+ d[STREXTRA] -= 3;
+ flag = 1;
+ }
+ if (d[BLINDCOUNT])
+ if (--d[BLINDCOUNT] <= 0) {
+ cursors();
+ lprcat("\nThe blindness lifts ");
+ lbeep();
+ }
+ if (d[CONFUSE])
+ if (--d[CONFUSE] <= 0) {
+ cursors();
+ lprcat("\nYou regain your senses");
+ lbeep();
+ }
+ if (d[GIANTSTR])
+ if (--d[GIANTSTR] <= 0) {
+ d[STREXTRA] -= 20;
+ flag = 1;
+ }
+ if (d[CHARMCOUNT])
+ if ((--d[CHARMCOUNT]) <= 0)
+ flag = 1;
+ if (d[INVISIBILITY])
+ if ((--d[INVISIBILITY]) <= 0)
+ flag = 1;
+ if (d[CANCELLATION])
+ if ((--d[CANCELLATION]) <= 0)
+ flag = 1;
+ if (d[WTW])
+ if ((--d[WTW]) <= 0)
+ flag = 1;
+ if (d[HASTESELF])
+ if ((--d[HASTESELF]) <= 0)
+ flag = 1;
+ if (d[AGGRAVATE])
+ --d[AGGRAVATE];
+ if (d[SCAREMONST])
+ if ((--d[SCAREMONST]) <= 0)
+ flag = 1;
+ if (d[STEALTH])
+ if ((--d[STEALTH]) <= 0)
+ flag = 1;
+ if (d[AWARENESS])
+ --d[AWARENESS];
+ if (d[HOLDMONST])
+ if ((--d[HOLDMONST]) <= 0)
+ flag = 1;
+ if (d[HASTEMONST])
+ --d[HASTEMONST];
+ if (d[FIRERESISTANCE])
+ if ((--d[FIRERESISTANCE]) <= 0)
+ flag = 1;
+ if (d[GLOBE])
+ if (--d[GLOBE] <= 0) {
+ d[MOREDEFENSES] -= 10;
+ flag = 1;
+ }
+ if (d[SPIRITPRO])
+ if (--d[SPIRITPRO] <= 0)
+ flag = 1;
+ if (d[UNDEADPRO])
+ if (--d[UNDEADPRO] <= 0)
+ flag = 1;
+ if (d[HALFDAM])
+ if (--d[HALFDAM] <= 0) {
+ cursors();
+ lprcat("\nYou now feel better ");
+ lbeep();
+ }
if (d[SEEINVISIBLE])
- if (--d[SEEINVISIBLE]<=0)
- { monstnamelist[INVISIBLESTALKER] = ' ';
- cursors(); lprcat("\nYou feel your vision return to normal"); beep(); }
- if (d[ITCHING])
- {
- if (d[ITCHING]>1)
- if ((d[WEAR]!= -1) || (d[SHIELD]!= -1))
- if (rnd(100)<50)
- {
- d[WEAR]=d[SHIELD]= -1; cursors();
- lprcat("\nThe hysteria of itching forces you to remove your armor!");
- beep(); recalc(); bottomline();
- }
- if (--d[ITCHING]<=0) { cursors(); lprcat("\nYou now feel the irritation subside!"); beep(); }
+ if (--d[SEEINVISIBLE] <= 0) {
+ monstnamelist[INVISIBLESTALKER] = ' ';
+ cursors();
+ lprcat("\nYou feel your vision return to normal");
+ lbeep();
+ }
+ if (d[ITCHING]) {
+ if (d[ITCHING] > 1)
+ if ((d[WEAR] != -1) || (d[SHIELD] != -1))
+ if (rnd(100) < 50) {
+ d[WEAR] = d[SHIELD] = -1;
+ cursors();
+ lprcat("\nThe hysteria of itching forces you to remove your armor!");
+ lbeep();
+ recalc();
+ bottomline();
+ }
+ if (--d[ITCHING] <= 0) {
+ cursors();
+ lprcat("\nYou now feel the irritation subside!");
+ lbeep();
}
- if (d[CLUMSINESS])
- {
+ }
+ if (d[CLUMSINESS]) {
if (d[WIELD] != -1)
- if (d[CLUMSINESS]>1)
- if (item[playerx][playery]==0) /* only if nothing there */
- if (rnd(100)<33) /* drop your weapon due to clumsiness */
- drop_object((int)d[WIELD]);
- if (--d[CLUMSINESS]<=0) { cursors(); lprcat("\nYou now feel less awkward!"); beep(); }
+ if (d[CLUMSINESS] > 1)
+ if (item[playerx][playery] == 0) /* only if nothing there */
+ if (rnd(100) < 33) /* drop your weapon due
+ * to clumsiness */
+ drop_object((int) d[WIELD]);
+ if (--d[CLUMSINESS] <= 0) {
+ cursors();
+ lprcat("\nYou now feel less awkward!");
+ lbeep();
}
- if (flag) bottomline();
}
-
+ if (flag)
+ bottomline();
+}
diff --git a/games/larn/savelev.c b/games/larn/savelev.c
index 4761233c52f..a2aa5c44a6f 100644
--- a/games/larn/savelev.c
+++ b/games/larn/savelev.c
@@ -1,51 +1,65 @@
-#ifndef lint
-static char rcsid[] = "$NetBSD: savelev.c,v 1.3 1995/03/23 08:34:13 cgd Exp $";
-#endif /* not lint */
+/* $OpenBSD: savelev.c,v 1.2 1998/09/15 05:12:33 pjanzen Exp $ */
+/* $NetBSD: savelev.c,v 1.4 1997/10/18 20:03:45 christos Exp $ */
/* savelev.c Larn is copyrighted 1986 by Noah Morgan. */
+#ifndef lint
+static char rcsid[] = "$OpenBSD: savelev.c,v 1.2 1998/09/15 05:12:33 pjanzen Exp $";
+#endif /* not lint */
#include "header.h"
-extern struct cel *cell;
+#include "extern.h"
/*
* routine to save the present level into storage
*/
+void
savelevel()
- {
- register struct cel *pcel;
- register char *pitem,*pknow,*pmitem;
- register short *phitp,*piarg;
- register struct cel *pecel;
- pcel = &cell[level*MAXX*MAXY]; /* pointer to this level's cells */
- pecel = pcel + MAXX*MAXY; /* pointer to past end of this level's cells */
- pitem=item[0]; piarg=iarg[0]; pknow=know[0]; pmitem=mitem[0]; phitp=hitp[0];
- while (pcel < pecel)
- {
- pcel->mitem = *pmitem++;
- pcel->hitp = *phitp++;
- pcel->item = *pitem++;
- pcel->know = *pknow++;
+{
+ struct cel *pcel;
+ char *pitem, *pknow, *pmitem;
+ short *phitp, *piarg;
+ struct cel *pecel;
+ pcel = &cell[level * MAXX * MAXY]; /* pointer to this level's
+ * cells */
+ pecel = pcel + MAXX * MAXY; /* pointer to past end of this
+ * level's cells */
+ pitem = item[0];
+ piarg = iarg[0];
+ pknow = know[0];
+ pmitem = mitem[0];
+ phitp = hitp[0];
+ while (pcel < pecel) {
+ pcel->mitem = *pmitem++;
+ pcel->hitp = *phitp++;
+ pcel->item = *pitem++;
+ pcel->know = *pknow++;
pcel++->iarg = *piarg++;
- }
}
+}
/*
* routine to restore a level from storage
*/
+void
getlevel()
- {
- register struct cel *pcel;
- register char *pitem,*pknow,*pmitem;
- register short *phitp,*piarg;
- register struct cel *pecel;
- pcel = &cell[level*MAXX*MAXY]; /* pointer to this level's cells */
- pecel = pcel + MAXX*MAXY; /* pointer to past end of this level's cells */
- pitem=item[0]; piarg=iarg[0]; pknow=know[0]; pmitem=mitem[0]; phitp=hitp[0];
- while (pcel < pecel)
- {
+{
+ struct cel *pcel;
+ char *pitem, *pknow, *pmitem;
+ short *phitp, *piarg;
+ struct cel *pecel;
+ pcel = &cell[level * MAXX * MAXY]; /* pointer to this level's
+ * cells */
+ pecel = pcel + MAXX * MAXY; /* pointer to past end of this
+ * level's cells */
+ pitem = item[0];
+ piarg = iarg[0];
+ pknow = know[0];
+ pmitem = mitem[0];
+ phitp = hitp[0];
+ while (pcel < pecel) {
*pmitem++ = pcel->mitem;
*phitp++ = pcel->hitp;
*pitem++ = pcel->item;
*pknow++ = pcel->know;
*piarg++ = pcel++->iarg;
- }
}
+}
diff --git a/games/larn/scores.c b/games/larn/scores.c
index 8822b9ab2a0..655cdb5b7e3 100644
--- a/games/larn/scores.c
+++ b/games/larn/scores.c
@@ -1,672 +1,844 @@
-#ifndef lint
-static char rcsid[] = "$NetBSD: scores.c,v 1.5.6.1 1996/05/27 15:54:33 mrg Exp $";
-#endif /* not lint */
+/* $OpenBSD: scores.c,v 1.5 1998/09/15 05:12:33 pjanzen Exp $ */
+/* $NetBSD: scores.c,v 1.10 1997/10/18 20:03:48 christos Exp $ */
-/* scores.c Larn is copyrighted 1986 by Noah Morgan.
- *
- * Functions in this file are:
- *
- * readboard() Function to read in the scoreboard into a static buffer
- * writeboard() Function to write the scoreboard from readboard()'s buffer
- * makeboard() Function to create a new scoreboard (wipe out old one)
- * hashewon() Function to return 1 if player has won a game before, else 0
- * long paytaxes(x) Function to pay taxes if any are due
- * winshou() Subroutine to print out the winning scoreboard
- * shou(x) Subroutine to print out the non-winners scoreboard
- * showscores() Function to show the scoreboard on the terminal
- * showallscores() Function to show scores and the iven lists that go with them
- * sortboard() Function to sort the scoreboard
- * newscore(score, whoo, whyded, winner) Function to add entry to scoreboard
- * new1sub(score,i,whoo,taxes) Subroutine to put player into a
- * new2sub(score,i,whoo,whyded) Subroutine to put player into a
- * died(x) Subroutine to record who played larn, and what the score was
- * diedsub(x) Subroutine to print out a line showing player when he is killed
- * diedlog() Subroutine to read a log file and print it out in ascii format
- * getplid(name) Function to get players id # from id file
- *
+/*
+ * scores.c Larn is copyrighted 1986 by Noah Morgan.
+ *
+ * Functions in this file are:
+ *
+ * readboard() Function to read in the scoreboard into a static buffer
+ * writeboard() Function to write the scoreboard from readboard()'s buffer
+ * makeboard() Function to create a new scoreboard (wipe out old one)
+ * hashewon() Function to return 1 if player has won a game before, else 0
+ * long paytaxes(x) Function to pay taxes if any are due
+ * winshou() Suboutine to print out the winning scoreboard
+ * shou(x) Subroutine to print out the non-winners scoreboard
+ * showscores() Function to show the scoreboard on the terminal
+ * showallscores() Function to show scores and the iven lists that go with them
+ * sortboard() Function to sort the scoreboard
+ * newscore(score, whoo, whyded, winner) Function to add entry to scoreboard
+ * new1sub(score,i,whoo,taxes) Subroutine to put player into a
+ * new2sub(score,i,whoo,whyded) Subroutine to put player into a
+ * died(x) Subroutine to record who played larn, and what the score was
+ * diedsub(x) Subroutine to print out a line showing player when he is killed
+ * diedlog() Subroutine to read a log file and print it out in ascii format
+ * getplid(name) Function to get players id # from id file
+ *
*/
+
+#ifndef lint
+static char rcsid[] = "$OpenBSD: scores.c,v 1.5 1998/09/15 05:12:33 pjanzen Exp $";
+#endif /* not lint */
+
#include <sys/types.h>
#include <sys/times.h>
#include <sys/stat.h>
-#include "header.h"
+#include <stdio.h>
#include <string.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include "header.h"
+#include "extern.h"
+
+struct scofmt { /* This is the structure for the scoreboard */
+ long score; /* the score of the player */
+ long suid; /* the user id number of the player */
+ short what; /* the monster that killed player */
+ short level; /* the level player was on when he died */
+ short hardlev;/* the level of difficulty player played at */
+ short order; /* the relative ordering place of this entry */
+ char who[40];/* the name of the character */
+ char sciv[26][2]; /* the inventory list of the character */
+};
+struct wscofmt {/* This is the structure for the winning scoreboard */
+ long score; /* the score of the player */
+ long timeused; /* the time used in mobuls to win the game */
+ long taxes; /* taxes he owes to LRS */
+ long suid; /* the user id number of the player */
+ short hardlev;/* the level of difficulty player played at */
+ short order; /* the relative ordering place of this entry */
+ char who[40];/* the name of the character */
+};
-struct scofmt /* This is the structure for the scoreboard */
- {
- long score; /* the score of the player */
- long suid; /* the user id number of the player */
- short what; /* the number of the monster that killed player */
- short level; /* the level player was on when he died */
- short hardlev; /* the level of difficulty player played at */
- short order; /* the relative ordering place of this entry */
- char who[40]; /* the name of the character */
- char sciv[26][2]; /* this is the inventory list of the character */
- };
-struct wscofmt /* This is the structure for the winning scoreboard */
- {
- long score; /* the score of the player */
- long timeused; /* the time used in mobuls to win the game */
- long taxes; /* taxes he owes to LRS */
- long suid; /* the user id number of the player */
- short hardlev; /* the level of difficulty player played at */
- short order; /* the relative ordering place of this entry */
- char who[40]; /* the name of the character */
- };
-
-struct log_fmt /* 102 bytes struct for the log file */
- {
- long score; /* the players score */
- time_t diedtime; /* time when game was over */
- short cavelev; /* level in caves */
- short diff; /* difficulty player played at */
+struct log_fmt { /* 102 bytes struct for the log file */
+ long score; /* the players score */
+ time_t diedtime; /* time when game was over */
+ short cavelev; /* level in caves */
+ short diff; /* difficulty player played at */
#ifdef EXTRA
- long elapsedtime; /* real time of game in seconds */
- long bytout; /* bytes input and output */
- long bytin;
- long moves; /* number of moves made by player */
- short ac; /* armor class of player */
- short hp,hpmax; /* players hitpoints */
- short cputime; /* cpu time needed in seconds */
- short killed,spused;/* monsters killed and spells cast */
- short usage; /* usage of the cpu in % */
- short lev; /* player level */
+ long elapsedtime; /* real time of game in seconds */
+ long bytout; /* bytes input and output */
+ long bytin;
+ long moves; /* number of moves made by player */
+ short ac; /* armor class of player */
+ short hp, hpmax; /* players hitpoints */
+ short cputime; /* cpu time needed in seconds */
+ short killed, spused; /* monsters killed and spells cast */
+ short usage; /* usage of the cpu in % */
+ short lev; /* player level */
#endif
- char who[12]; /* player name */
- char what[46]; /* what happened to player */
- };
+ char who[12]; /* player name */
+ char what[46]; /* what happened to player */
+};
static struct scofmt sco[SCORESIZE]; /* the structure for the scoreboard */
static struct wscofmt winr[SCORESIZE]; /* struct for the winning scoreboard */
-static struct log_fmt logg; /* structure for the log file */
-static char *whydead[] = {
+static struct log_fmt logg; /* structure for the log file */
+static char *whydead[] = {
"quit", "suspended", "self - annihilated", "shot by an arrow",
"hit by a dart", "fell into a pit", "fell into a bottomless pit",
"a winner", "trapped in solid rock", "killed by a missing save file",
"killed by an old save file", "caught by the greedy cheater checker trap",
- "killed by a protected save file","killed his family and committed suicide",
+ "killed by a protected save file", "killed his family and committed suicide",
"erased by a wayward finger", "fell through a bottomless trap door",
"fell through a trap door", "drank some poisonous water",
"fried by an electric shock", "slipped on a volcano shaft",
"killed by a stupid act of frustration", "attacked by a revolting demon",
"hit by his own magic", "demolished by an unseen attacker",
"fell into the dreadful sleep", "killed by an exploding chest",
-/*26*/ "killed by a missing maze data file", "annihilated in a sphere",
- "died a post mortem death","wasted by a malloc() failure"
- };
+ /* 26 */ "killed by a missing maze data file", "annihilated in a sphere",
+ "died a post mortem death", "wasted by a malloc() failure"
+};
/*
- * readboard() Function to read in the scoreboard into a static buffer
+ * readboard() Function to read in the scoreboard into a static buffer
*
- * returns -1 if unable to read in the scoreboard, returns 0 if all is OK
+ * returns -1 if unable to read in the scoreboard, returns 0 if all is OK
*/
+int
readboard()
- {
- int i;
+{
+ int i;
- seteuid(euid);
+ setegid(egid);
i = lopen(scorefile);
- seteuid(uid);
- if (i<0)
- { lprcat("Can't read scoreboard\n"); lflush(); return(-1); }
- lrfill((char*)sco,sizeof(sco)); lrfill((char*)winr,sizeof(winr));
- lrclose(); lcreat((char*)0); return(0);
+ setegid(gid);
+ if (i < 0) {
+ lprcat("Can't read scoreboard\n");
+ lflush();
+ return (-1);
}
+ lrfill((char *) sco, sizeof(sco));
+ lrfill((char *) winr, sizeof(winr));
+ lrclose();
+ lcreat((char *) 0);
+ return (0);
+}
/*
- * writeboard() Function to write the scoreboard from readboard()'s buffer
+ * writeboard() Function to write the scoreboard from readboard()'s buffer
*
- * returns -1 if unable to write the scoreboard, returns 0 if all is OK
+ * returns -1 if unable to write the scoreboard, returns 0 if all is OK
*/
+int
writeboard()
- {
- int i;
+{
+ int i;
set_score_output();
- seteuid(euid);
+ setegid(egid);
i = lcreat(scorefile);
- seteuid(uid);
- if (i<0)
- { lprcat("Can't write scoreboard\n"); lflush(); return(-1); }
- lwrite((char*)sco,sizeof(sco)); lwrite((char*)winr,sizeof(winr));
- lwclose(); lcreat((char*)0); return(0);
+ setegid(gid);
+ if (i < 0) {
+ lprcat("Can't write scoreboard\n");
+ lflush();
+ return (-1);
}
+ lwrite((char *) sco, sizeof(sco));
+ lwrite((char *) winr, sizeof(winr));
+ lwclose();
+ lcreat((char *) 0);
+ return (0);
+}
/*
- * makeboard() Function to create a new scoreboard (wipe out old one)
+ * makeboard() Function to create a new scoreboard (wipe out old one)
*
- * returns -1 if unable to write the scoreboard, returns 0 if all is OK
+ * returns -1 if unable to write the scoreboard, returns 0 if all is OK
*/
+int
makeboard()
- {
- register int i;
- for (i=0; i<SCORESIZE; i++)
- {
+{
+ int i;
+
+ for (i = 0; i < SCORESIZE; i++) {
winr[i].taxes = winr[i].score = sco[i].score = 0;
winr[i].order = sco[i].order = i;
- }
- if (writeboard()) return(-1);
- seteuid(euid);
- chmod(scorefile,0660);
- seteuid(uid);
- return(0);
}
+ if (writeboard())
+ return (-1);
+ setegid(egid);
+ chmod(scorefile, 0660);
+ setegid(gid);
+ return (0);
+}
/*
- * hashewon() Function to return 1 if player has won a game before, else 0
+ * hashewon() Function to return 1 if player has won a game before, else 0
*
- * This function also sets c[HARDGAME] to appropriate value -- 0 if not a
- * winner, otherwise the next level of difficulty listed in the winners
- * scoreboard. This function also sets outstanding_taxes to the value in
- * the winners scoreboard.
+ * This function also sets c[HARDGAME] to appropriate value -- 0 if not a
+ * winner, otherwise the next level of difficulty listed in the winners
+ * scoreboard. This function also sets outstanding_taxes to the value in
+ * the winners scoreboard.
*/
+int
hashewon()
- {
- register int i;
+{
+ int i;
+
c[HARDGAME] = 0;
- if (readboard() < 0) return(0); /* can't find scoreboard */
- for (i=0; i<SCORESIZE; i++) /* search through winners scoreboard */
- if (winr[i].suid == userid)
- if (winr[i].score > 0)
- {
- c[HARDGAME]=winr[i].hardlev+1; outstanding_taxes=winr[i].taxes;
- return(1);
+ if (readboard() < 0)
+ return (0); /* can't find scoreboard */
+ for (i = 0; i < SCORESIZE; i++) /* search through winners scoreboard */
+ if (winr[i].suid == userid)
+ if (winr[i].score > 0) {
+ c[HARDGAME] = winr[i].hardlev + 1;
+ outstanding_taxes = winr[i].taxes;
+ return (1);
}
- return(0);
- }
+ return (0);
+}
/*
- * long paytaxes(x) Function to pay taxes if any are due
+ * long paytaxes(x) Function to pay taxes if any are due
*
- * Enter with the amount (in gp) to pay on the taxes.
- * Returns amount actually paid.
+ * Enter with the amount (in gp) to pay on the taxes.
+ * Returns amount actually paid.
*/
-long paytaxes(x)
- long x;
- {
- register int i;
- register long amt;
- if (x<0) return(0L);
- if (readboard()<0) return(0L);
- for (i=0; i<SCORESIZE; i++)
- if (winr[i].suid == userid) /* look for players winning entry */
- if (winr[i].score>0) /* search for a winning entry for the player */
- {
+long
+paytaxes(x)
+ long x;
+{
+ int i;
+ long amt;
+
+ if (x < 0)
+ return (0L);
+ if (readboard() < 0)
+ return (0L);
+ for (i = 0; i < SCORESIZE; i++)
+ if (winr[i].suid == userid) /* look for players winning
+ * entry */
+ if (winr[i].score > 0) { /* search for a winning
+ * entry for the player */
amt = winr[i].taxes;
- if (x < amt) amt=x; /* don't overpay taxes (Ughhhhh) */
+ if (x < amt)
+ amt = x; /* don't overpay taxes
+ * (Ughhhhh) */
winr[i].taxes -= amt;
outstanding_taxes -= amt;
- if (writeboard()<0) return(0);
- return(amt);
- }
- return(0L); /* couldn't find user on winning scoreboard */
- }
+ if (writeboard() < 0)
+ return (0);
+ return (amt);
+ }
+ return (0L); /* couldn't find user on winning scoreboard */
+}
/*
- * winshou() Subroutine to print out the winning scoreboard
+ * winshou() Subroutine to print out the winning scoreboard
*
- * Returns the number of players on scoreboard that were shown
+ * Returns the number of players on scoreboard that were shown
*/
+int
winshou()
- {
- register struct wscofmt *p;
- register int i,j,count;
- for (count=j=i=0; i<SCORESIZE; i++) /* is there anyone on the scoreboard? */
- if (winr[i].score != 0)
- { j++; break; }
- if (j)
- {
+{
+ struct wscofmt *p;
+ int i, j, count;
+
+ for (count = j = i = 0; i < SCORESIZE; i++) /* is there anyone on
+ * the scoreboard? */
+ if (winr[i].score != 0) {
+ j++;
+ break;
+ }
+ if (j) {
lprcat("\n Score Difficulty Time Needed Larn Winners List\n");
- for (i=0; i<SCORESIZE; i++) /* this loop is needed to print out the */
- for (j=0; j<SCORESIZE; j++) /* winners in order */
- {
- p = &winr[j]; /* pointer to the scoreboard entry */
- if (p->order == i)
- {
- if (p->score)
- {
- count++;
- lprintf("%10d %2d %5d Mobuls %s \n",
- (long)p->score,(long)p->hardlev,(long)p->timeused,p->who);
+ for (i = 0; i < SCORESIZE; i++) /* this loop is needed to
+ * print out the */
+ for (j = 0; j < SCORESIZE; j++) { /* winners in order */
+ p = &winr[j]; /* pointer to the scoreboard
+ * entry */
+ if (p->order == i) {
+ if (p->score) {
+ count++;
+ lprintf("%10d %2d %5d Mobuls %s \n",
+ (long) p->score, (long) p->hardlev, (long) p->timeused, p->who);
}
- break;
+ break;
}
}
- }
- return(count); /* return number of people on scoreboard */
}
+ return (count); /* return number of people on scoreboard */
+}
/*
- * shou(x) Subroutine to print out the non-winners scoreboard
- * int x;
+ * shou(x) Subroutine to print out the non-winners scoreboard
+ * int x;
*
- * Enter with 0 to list the scores, enter with 1 to list inventories too
- * Returns the number of players on scoreboard that were shown
+ * Enter with 0 to list the scores, enter with 1 to list inventories too
+ * Returns the number of players on scoreboard that were shown
*/
+int
shou(x)
- int x;
- {
- register int i,j,n,k;
- int count;
- for (count=j=i=0; i<SCORESIZE; i++) /* is the scoreboard empty? */
- if (sco[i].score!= 0)
- { j++; break; }
- if (j)
- {
+ int x;
+{
+ int i, j, n, k;
+ int count;
+
+ for (count = j = i = 0; i < SCORESIZE; i++) /* is the scoreboard
+ * empty? */
+ if (sco[i].score != 0) {
+ j++;
+ break;
+ }
+ if (j) {
lprcat("\n Score Difficulty Larn Visitor Log\n");
- for (i=0; i<SCORESIZE; i++) /* be sure to print them out in order */
- for (j=0; j<SCORESIZE; j++)
- if (sco[j].order == i)
- {
- if (sco[j].score)
- {
- count++;
- lprintf("%10d %2d %s ",
- (long)sco[j].score,(long)sco[j].hardlev,sco[j].who);
- if (sco[j].what < 256) lprintf("killed by a %s",monster[sco[j].what].name);
- else lprintf("%s",whydead[sco[j].what - 256]);
- if (x != 263) lprintf(" on %s",levelname[sco[j].level]);
- if (x)
- {
- for (n=0; n<26; n++) { iven[n]=sco[j].sciv[n][0]; ivenarg[n]=sco[j].sciv[n][1]; }
- for (k=1; k<99; k++)
- for (n=0; n<26; n++)
- if (k==iven[n]) { srcount=0; show3(n); }
- lprcat("\n\n");
- }
- else lprc('\n');
+ for (i = 0; i < SCORESIZE; i++) /* be sure to print them out
+ * in order */
+ for (j = 0; j < SCORESIZE; j++)
+ if (sco[j].order == i) {
+ if (sco[j].score) {
+ count++;
+ lprintf("%10d %2d %s ",
+ (long) sco[j].score, (long) sco[j].hardlev, sco[j].who);
+ if (sco[j].what < 256)
+ lprintf("killed by a %s", monster[sco[j].what].name);
+ else
+ lprintf("%s", whydead[sco[j].what - 256]);
+ if (x != 263)
+ lprintf(" on %s", levelname[sco[j].level]);
+ if (x) {
+ for (n = 0; n < 26; n++) {
+ iven[n] = sco[j].sciv[n][0];
+ ivenarg[n] = sco[j].sciv[n][1];
+ }
+ for (k = 1; k < 99; k++)
+ for (n = 0; n < 26; n++)
+ if (k == iven[n]) {
+ srcount = 0;
+ show3(n);
+ }
+ lprcat("\n\n");
+ } else
+ lprc('\n');
}
- j=SCORESIZE;
+ j = SCORESIZE;
}
- }
- return(count); /* return the number of players just shown */
}
+ return (count); /* return the number of players just shown */
+}
/*
- * showscores() Function to show the scoreboard on the terminal
+ * showscores() Function to show the scoreboard on the terminal
*
- * Returns nothing of value
+ * Returns nothing of value
*/
-static char esb[] = "The scoreboard is empty.\n";
+static char esb[] = "The scoreboard is empty.\n";
+void
showscores()
- {
- register int i,j;
- lflush(); lcreat((char*)0); if (readboard()<0) return;
- i=winshou(); j=shou(0);
- if (i+j == 0) lprcat(esb); else lprc('\n');
+{
+ int i, j;
+
lflush();
- }
+ lcreat((char *) 0);
+ if (readboard() < 0)
+ return;
+ i = winshou();
+ j = shou(0);
+ if (i + j == 0)
+ lprcat(esb);
+ else
+ lprc('\n');
+ lflush();
+}
/*
- * showallscores() Function to show scores and the iven lists that go with them
+ * showallscores() Function to show scores and the iven lists that go with them
*
- * Returns nothing of value
+ * Returns nothing of value
*/
+void
showallscores()
- {
- register int i,j;
- lflush(); lcreat((char*)0); if (readboard()<0) return;
- c[WEAR] = c[WIELD] = c[SHIELD] = -1; /* not wielding or wearing anything */
- for (i=0; i<MAXPOTION; i++) potionname[i]=potionhide[i];
- for (i=0; i<MAXSCROLL; i++) scrollname[i]=scrollhide[i];
- i=winshou(); j=shou(1);
- if (i+j==0) lprcat(esb); else lprc('\n');
+{
+ int i, j;
lflush();
- }
+ lcreat((char *) 0);
+ if (readboard() < 0)
+ return;
+ c[WEAR] = c[WIELD] = c[SHIELD] = -1; /* not wielding or wearing
+ * anything */
+ for (i = 0; i < MAXPOTION; i++)
+ potionname[i] = potionhide[i];
+ for (i = 0; i < MAXSCROLL; i++)
+ scrollname[i] = scrollhide[i];
+ i = winshou();
+ j = shou(1);
+ if (i + j == 0)
+ lprcat(esb);
+ else
+ lprc('\n');
+ lflush();
+}
/*
- * sortboard() Function to sort the scoreboard
+ * sortboard() Function to sort the scoreboard
*
- * Returns 0 if no sorting done, else returns 1
+ * Returns 0 if no sorting done, else returns 1
*/
+int
sortboard()
- {
- register int i,j,pos;
- long jdat;
- for (i=0; i<SCORESIZE; i++) sco[i].order = winr[i].order = -1;
- pos=0; while (pos < SCORESIZE)
- {
- jdat=0;
- for (i=0; i<SCORESIZE; i++)
- if ((sco[i].order < 0) && (sco[i].score >= jdat))
- { j=i; jdat=sco[i].score; }
+{
+ int i, j = 0, pos;
+ long jdat;
+
+ for (i = 0; i < SCORESIZE; i++)
+ sco[i].order = winr[i].order = -1;
+ pos = 0;
+ while (pos < SCORESIZE) {
+ jdat = 0;
+ for (i = 0; i < SCORESIZE; i++)
+ if ((sco[i].order < 0) && (sco[i].score >= jdat)) {
+ j = i;
+ jdat = sco[i].score;
+ }
sco[j].order = pos++;
- }
- pos=0; while (pos < SCORESIZE)
- {
- jdat=0;
- for (i=0; i<SCORESIZE; i++)
- if ((winr[i].order < 0) && (winr[i].score >= jdat))
- { j=i; jdat=winr[i].score; }
+ }
+ pos = 0;
+ while (pos < SCORESIZE) {
+ jdat = 0;
+ for (i = 0; i < SCORESIZE; i++)
+ if ((winr[i].order < 0) && (winr[i].score >= jdat)) {
+ j = i;
+ jdat = winr[i].score;
+ }
winr[j].order = pos++;
- }
- return(1);
}
+ return (1);
+}
/*
- * newscore(score, whoo, whyded, winner) Function to add entry to scoreboard
- * int score, winner, whyded;
- * char *whoo;
+ * newscore(score, whoo, whyded, winner) Function to add entry to scoreboard
+ * int score, winner, whyded;
+ * char *whoo;
*
- * Enter with the total score in gp in score, players name in whoo,
- * died() reason # in whyded, and TRUE/FALSE in winner if a winner
- * ex. newscore(1000, "player 1", 32, 0);
+ * Enter with the total score in gp in score, players name in whoo,
+ * died() reason # in whyded, and TRUE/FALSE in winner if a winner
+ * ex. newscore(1000, "player 1", 32, 0);
*/
+void
newscore(score, whoo, whyded, winner)
- long score;
- int winner, whyded;
- char *whoo;
- {
- register int i;
- long taxes;
- if (readboard() < 0) return; /* do the scoreboard */
+ long score;
+ int winner, whyded;
+ char *whoo;
+{
+ int i;
+ long taxes;
+
+ if (readboard() < 0)
+ return; /* do the scoreboard */
/* if a winner then delete all non-winning scores */
- if (cheat) winner=0; /* if he cheated, don't let him win */
- if (winner)
- {
- for (i=0; i<SCORESIZE; i++) if (sco[i].suid == userid) sco[i].score=0;
- taxes = score*TAXRATE;
- score += 100000*c[HARDGAME]; /* bonus for winning */
- /* if he has a slot on the winning scoreboard update it if greater score */
- for (i=0; i<SCORESIZE; i++) if (winr[i].suid == userid)
- { new1sub(score,i,whoo,taxes); return; }
- /* he had no entry. look for last entry and see if he has a greater score */
- for (i=0; i<SCORESIZE; i++) if (winr[i].order == SCORESIZE-1)
- { new1sub(score,i,whoo,taxes); return; }
- }
- else if (!cheat) /* for not winning scoreboard */
- {
- /* if he has a slot on the scoreboard update it if greater score */
- for (i=0; i<SCORESIZE; i++) if (sco[i].suid == userid)
- { new2sub(score,i,whoo,whyded); return; }
- /* he had no entry. look for last entry and see if he has a greater score */
- for (i=0; i<SCORESIZE; i++) if (sco[i].order == SCORESIZE-1)
- { new2sub(score,i,whoo,whyded); return; }
- }
+ if (cheat)
+ winner = 0; /* if he cheated, don't let him win */
+ if (winner) {
+ for (i = 0; i < SCORESIZE; i++)
+ if (sco[i].suid == userid)
+ sco[i].score = 0;
+ taxes = score * TAXRATE;
+ score += 100000 * c[HARDGAME]; /* bonus for winning */
+ /*
+ * if he has a slot on the winning scoreboard update it if
+ * greater score
+ */
+ for (i = 0; i < SCORESIZE; i++)
+ if (winr[i].suid == userid) {
+ new1sub(score, i, whoo, taxes);
+ return;
+ }
+ /*
+ * he had no entry. look for last entry and see if he has a
+ * greater score
+ */
+ for (i = 0; i < SCORESIZE; i++)
+ if (winr[i].order == SCORESIZE - 1) {
+ new1sub(score, i, whoo, taxes);
+ return;
+ }
+ } else if (!cheat) { /* for not winning scoreboard */
+ /*
+ * if he has a slot on the scoreboard update it if greater
+ * score
+ */
+ for (i = 0; i < SCORESIZE; i++)
+ if (sco[i].suid == userid) {
+ new2sub(score, i, whoo, whyded);
+ return;
+ }
+ /*
+ * he had no entry. look for last entry and see if he has a
+ * greater score
+ */
+ for (i = 0; i < SCORESIZE; i++)
+ if (sco[i].order == SCORESIZE - 1) {
+ new2sub(score, i, whoo, whyded);
+ return;
+ }
}
+}
/*
- * new1sub(score,i,whoo,taxes) Subroutine to put player into a
- * int score,i,whyded,taxes; winning scoreboard entry if his score
- * char *whoo; is high enough
+ * new1sub(score,i,whoo,taxes) Subroutine to put player into a
+ * int score,i,whyded,taxes winning scoreboard entry if his score
+ * char *whoo; is high enough
*
- * Enter with the total score in gp in score, players name in whoo,
- * died() reason # in whyded, and TRUE/FALSE in winner if a winner
- * slot in scoreboard in i, and the tax bill in taxes.
- * Returns nothing of value
+ * Enter with the total score in gp in score, players name in whoo,
+ * died() reason # in whyded, and TRUE/FALSE in winner if a winner
+ * slot in scoreboard in i, and the tax bill in taxes.
+ * Returns nothing of value
*/
-new1sub(score,i,whoo,taxes)
- long score,taxes;
- int i;
- char *whoo;
- {
- register struct wscofmt *p;
+void
+new1sub(score, i, whoo, taxes)
+ long score, taxes;
+ int i;
+ char *whoo;
+{
+ struct wscofmt *p;
+
p = &winr[i];
p->taxes += taxes;
- if ((score >= p->score) || (c[HARDGAME] > p->hardlev))
- {
- strcpy(p->who,whoo); p->score=score;
- p->hardlev=c[HARDGAME]; p->suid=userid;
- p->timeused=gltime/100;
- }
+ if ((score >= p->score) || (c[HARDGAME] > p->hardlev)) {
+ strcpy(p->who, whoo);
+ p->score = score;
+ p->hardlev = c[HARDGAME];
+ p->suid = userid;
+ p->timeused = gltime / 100;
}
+}
/*
- * new2sub(score,i,whoo,whyded) Subroutine to put player into a
- * int score,i,whyded,taxes; non-winning scoreboard entry if his
- * char *whoo; score is high enough
+ * new2sub(score,i,whoo,whyded) Subroutine to put player into a
+ * int score,i,whyded,taxes; non-winning scoreboard entry if his
+ * char *whoo; score is high enough
*
- * Enter with the total score in gp in score, players name in whoo,
- * died() reason # in whyded, and slot in scoreboard in i.
- * Returns nothing of value
+ * Enter with the total score in gp in score, players name in whoo,
+ * died() reason # in whyded, and slot in scoreboard in i.
+ * Returns nothing of value
*/
-new2sub(score,i,whoo,whyded)
- long score;
- int i,whyded;
- char *whoo;
- {
- register int j;
- register struct scofmt *p;
+void
+new2sub(score, i, whoo, whyded)
+ long score;
+ int i, whyded;
+ char *whoo;
+{
+ int j;
+ struct scofmt *p;
+
p = &sco[i];
- if ((score >= p->score) || (c[HARDGAME] > p->hardlev))
- {
- strcpy(p->who,whoo); p->score=score;
- p->what=whyded; p->hardlev=c[HARDGAME];
- p->suid=userid; p->level=level;
- for (j=0; j<26; j++)
- { p->sciv[j][0]=iven[j]; p->sciv[j][1]=ivenarg[j]; }
+ if ((score >= p->score) || (c[HARDGAME] > p->hardlev)) {
+ strcpy(p->who, whoo);
+ p->score = score;
+ p->what = whyded;
+ p->hardlev = c[HARDGAME];
+ p->suid = userid;
+ p->level = level;
+ for (j = 0; j < 26; j++) {
+ p->sciv[j][0] = iven[j];
+ p->sciv[j][1] = ivenarg[j];
}
}
+}
/*
- * died(x) Subroutine to record who played larn, and what the score was
- * int x;
+ * died(x) Subroutine to record who played larn, and what the score was
+ * int x;
*
- * if x < 0 then don't show scores
- * died() never returns! (unless c[LIFEPROT] and a reincarnatable death!)
+ * if x < 0 then don't show scores
+ * died() never returns! (unless c[LIFEPROT] and a reincarnatable death!)
*
- * < 256 killed by the monster number
- * 256 quit
- * 257 suspended
- * 258 self - annihilated
- * 259 shot by an arrow
- * 260 hit by a dart
- * 261 fell into a pit
- * 262 fell into a bottomless pit
- * 263 a winner
- * 264 trapped in solid rock
- * 265 killed by a missing save file
- * 266 killed by an old save file
- * 267 caught by the greedy cheater checker trap
- * 268 killed by a protected save file
- * 269 killed his family and killed himself
- * 270 erased by a wayward finger
- * 271 fell through a bottomless trap door
- * 272 fell through a trap door
- * 273 drank some poisonous water
- * 274 fried by an electric shock
- * 275 slipped on a volcano shaft
- * 276 killed by a stupid act of frustration
- * 277 attacked by a revolting demon
- * 278 hit by his own magic
- * 279 demolished by an unseen attacker
- * 280 fell into the dreadful sleep
- * 281 killed by an exploding chest
- * 282 killed by a missing maze data file
- * 283 killed by a sphere of annihilation
- * 284 died a post mortem death
- * 285 malloc() failure
- * 300 quick quit -- don't put on scoreboard
+ * < 256 killed by the monster number
+ * 256 quit
+ * 257 suspended
+ * 258 self - annihilated
+ * 259 shot by an arrow
+ * 260 hit by a dart
+ * 261 fell into a pit
+ * 262 fell into a bottomless pit
+ * 263 a winner
+ * 264 trapped in solid rock
+ * 265 killed by a missing save file
+ * 266 killed by an old save file
+ * 267 caught by the greedy cheater checker trap
+ * 268 killed by a protected save file
+ * 269 killed his family and killed himself
+ * 270 erased by a wayward finger
+ * 271 fell through a bottomless trap door
+ * 272 fell through a trap door
+ * 273 drank some poisonous water
+ * 274 fried by an electric shock
+ * 275 slipped on a volcano shaft
+ * 276 killed by a stupid act of frustration
+ * 277 attacked by a revolting demon
+ * 278 hit by his own magic
+ * 279 demolished by an unseen attacker
+ * 280 fell into the dreadful sleep
+ * 281 killed by an exploding chest
+ * 282 killed by a missing maze data file
+ * 283 killed by a sphere of annihilation
+ * 284 died a post mortem death
+ * 285 malloc() failure
+ * 300 quick quit -- don't put on scoreboard
*/
-static int scorerror;
+static int scorerror;
+void
died(x)
- int x;
- {
- register int f,win;
- char ch,*mod;
- time_t zzz;
- long i;
- struct tms cputime;
- if (c[LIFEPROT]>0) /* if life protection */
- {
- switch((x>0) ? x : -x)
- {
- case 256: case 257: case 262: case 263: case 265: case 266:
- case 267: case 268: case 269: case 271: case 282: case 284:
- case 285: case 300: goto invalid; /* can't be saved */
- };
- --c[LIFEPROT]; c[HP]=1; --c[CONSTITUTION];
- cursors(); lprcat("\nYou feel wiiieeeeerrrrrd all over! "); beep();
- lflush(); sleep(4);
- return; /* only case where died() returns */
- }
+ int x;
+{
+ int f, win;
+ char ch, *mod;
+ time_t zzz;
+
+ if (c[LIFEPROT] > 0) { /* if life protection */
+ switch ((x > 0) ? x : -x) {
+ case 256:
+ case 257:
+ case 262:
+ case 263:
+ case 265:
+ case 266:
+ case 267:
+ case 268:
+ case 269:
+ case 271:
+ case 282:
+ case 284:
+ case 285:
+ case 300:
+ goto invalid; /* can't be saved */
+ };
+ --c[LIFEPROT];
+ c[HP] = 1;
+ --c[CONSTITUTION];
+ cursors();
+ lprcat("\nYou feel wiiieeeeerrrrrd all over! ");
+ lbeep();
+ lflush();
+ sleep(4);
+ return; /* only case where died() returns */
+ }
invalid:
- clearvt100(); lflush(); f=0;
- if (ckpflag) unlink(ckpfile); /* remove checkpoint file if used */
- if (x<0) { f++; x = -x; } /* if we are not to display the scores */
- if ((x == 300) || (x == 257)) exit(); /* for quick exit or saved game */
- if (x == 263) win = 1; else win = 0;
- c[GOLD] += c[BANKACCOUNT]; c[BANKACCOUNT] = 0;
- /* now enter the player at the end of the scoreboard */
+ clearvt100();
+ lflush();
+ f = 0;
+ if (ckpflag)
+ unlink(ckpfile);/* remove checkpoint file if used */
+ if (x < 0) {
+ f++;
+ x = -x;
+ } /* if we are not to display the scores */
+ if ((x == 300) || (x == 257))
+ exit(0); /* for quick exit or saved game */
+ if (x == 263)
+ win = 1;
+ else
+ win = 0;
+ c[GOLD] += c[BANKACCOUNT];
+ c[BANKACCOUNT] = 0;
+ /* now enter the player at the end of the scoreboard */
newscore(c[GOLD], logname, x, win);
- diedsub(x); /* print out the score line */ lflush();
+ diedsub(x); /* print out the score line */
+ lflush();
set_score_output();
- if ((wizard == 0) && (c[GOLD] > 0)) /* wizards can't score */
- {
+ if ((wizard == 0) && (c[GOLD] > 0)) { /* wizards can't score */
#ifndef NOLOG
- if (lappend(logfile)<0) /* append to file */
- {
- seteuid(euid);
- if (lcreat(logfile)<0) /* and can't create new log file */
- {
- lcreat((char*)0);
+ setegid(egid);
+ if (lappend(logfile) < 0) { /* append to file */
+ if (lcreat(logfile) < 0) { /* and can't create new
+ * log file */
+ lcreat((char *) 0);
lprcat("\nCan't open record file: I can't post your score.\n");
- sncbr(); resetscroll(); lflush(); exit();
- }
- chmod(logfile,0660);
- seteuid(uid);
+ sncbr();
+ resetscroll();
+ lflush();
+ exit(0);
}
- strcpy(logg.who,loginname);
- logg.score = c[GOLD]; logg.diff = c[HARDGAME];
- if (x < 256)
- {
+ setegid(egid);
+ chmod(logfile, 0660);
+ setegid(gid);
+ }
+ setegid(gid);
+ strcpy(logg.who, loginname);
+ logg.score = c[GOLD];
+ logg.diff = c[HARDGAME];
+ if (x < 256) {
ch = *monster[x].name;
- if (ch=='a' || ch=='e' || ch=='i' || ch=='o' || ch=='u')
- mod="an"; else mod="a";
- sprintf(logg.what,"killed by %s %s",mod,monster[x].name);
- }
- else sprintf(logg.what,"%s",whydead[x - 256]);
- logg.cavelev=level;
- time(&zzz); /* get cpu time -- write out score info */
- logg.diedtime=zzz;
+ if (ch == 'a' || ch == 'e' || ch == 'i' || ch == 'o' || ch == 'u')
+ mod = "an";
+ else
+ mod = "a";
+ sprintf(logg.what, "killed by %s %s", mod, monster[x].name);
+ } else
+ sprintf(logg.what, "%s", whydead[x - 256]);
+ logg.cavelev = level;
+ time(&zzz); /* get cpu time -- write out score info */
+ logg.diedtime = zzz;
#ifdef EXTRA
- times(&cputime); /* get cpu time -- write out score info */
- logg.cputime = i = (cputime.tms_utime + cputime.tms_stime)/60 + c[CPUTIME];
- logg.lev=c[LEVEL]; logg.ac=c[AC];
- logg.hpmax=c[HPMAX]; logg.hp=c[HP];
- logg.elapsedtime=(zzz-initialtime+59)/60;
- logg.usage=(10000*i)/(zzz-initialtime);
- logg.bytin=c[BYTESIN]; logg.bytout=c[BYTESOUT];
- logg.moves=c[MOVESMADE]; logg.spused=c[SPELLSCAST];
- logg.killed=c[MONSTKILLED];
+ times(&cputime);/* get cpu time -- write out score info */
+ logg.cputime = i = (cputime.tms_utime + cputime.tms_stime) / 60 + c[CPUTIME];
+ logg.lev = c[LEVEL];
+ logg.ac = c[AC];
+ logg.hpmax = c[HPMAX];
+ logg.hp = c[HP];
+ logg.elapsedtime = (zzz - initialtime + 59) / 60;
+ logg.usage = (10000 * i) / (zzz - initialtime);
+ logg.bytin = c[BYTESIN];
+ logg.bytout = c[BYTESOUT];
+ logg.moves = c[MOVESMADE];
+ logg.spused = c[SPELLSCAST];
+ logg.killed = c[MONSTKILLED];
#endif
- lwrite((char*)&logg,sizeof(struct log_fmt)); lwclose();
-#endif NOLOG
+ lwrite((char *) &logg, sizeof(struct log_fmt));
+ lwclose();
+#endif /* NOLOG */
-/* now for the scoreboard maintenance -- not for a suspended game */
- if (x != 257)
- {
- if (sortboard()) scorerror = writeboard();
- }
+ /*
+ * now for the scoreboard maintenance -- not for a suspended
+ * game
+ */
+ if (x != 257) {
+ if (sortboard())
+ scorerror = writeboard();
}
- if ((x==256) || (x==257) || (f != 0)) exit();
- if (scorerror == 0) showscores(); /* if we updated the scoreboard */
- if (x == 263) mailbill(); exit();
}
+ if ((x == 256) || (x == 257) || (f != 0))
+ exit(0);
+ if (scorerror == 0)
+ showscores(); /* if we updated the scoreboard */
+ if (x == 263)
+ mailbill();
+ exit(0);
+}
/*
- * diedsub(x) Subroutine to print out the line showing the player when he is killed
- * int x;
+ * diedsub(x) Subroutine to print out the line showing the player when he is killed
+ * int x;
*/
+void
diedsub(x)
-int x;
- {
- register char ch,*mod;
- lprintf("Score: %d, Diff: %d, %s ",(long)c[GOLD],(long)c[HARDGAME],logname);
- if (x < 256)
- {
+ int x;
+{
+ char ch, *mod;
+
+ lprintf("Score: %d, Diff: %d, %s ", (long) c[GOLD], (long) c[HARDGAME], logname);
+ if (x < 256) {
ch = *monster[x].name;
- if (ch=='a' || ch=='e' || ch=='i' || ch=='o' || ch=='u')
- mod="an"; else mod="a";
- lprintf("killed by %s %s",mod,monster[x].name);
- }
- else lprintf("%s",whydead[x - 256]);
- if (x != 263) lprintf(" on %s\n",levelname[level]); else lprc('\n');
- }
+ if (ch == 'a' || ch == 'e' || ch == 'i' || ch == 'o' || ch == 'u')
+ mod = "an";
+ else
+ mod = "a";
+ lprintf("killed by %s %s", mod, monster[x].name);
+ } else
+ lprintf("%s", whydead[x - 256]);
+ if (x != 263)
+ lprintf(" on %s\n", levelname[level]);
+ else
+ lprc('\n');
+}
/*
- * diedlog() Subroutine to read a log file and print it out in ascii format
+ * diedlog() Subroutine to read a log file and print it out in ascii format
*/
+void
diedlog()
- {
- register int n;
- register char *p;
- struct stat stbuf;
- lcreat((char*)0);
- if (lopen(logfile)<0)
- {
- lprintf("Can't locate log file <%s>\n",logfile);
+{
+ int n;
+ char *p;
+ struct stat stbuf;
+
+ lcreat((char *) 0);
+ if (lopen(logfile) < 0) {
+ lprintf("Can't locate log file <%s>\n", logfile);
return;
- }
- if (fstat(fd,&stbuf) < 0)
- {
- lprintf("Can't stat log file <%s>\n",logfile);
+ }
+ if (fstat(fd, &stbuf) < 0) {
+ lprintf("Can't stat log file <%s>\n", logfile);
return;
- }
- for (n=stbuf.st_size/sizeof(struct log_fmt); n>0; --n)
- {
- lrfill((char*)&logg,sizeof(struct log_fmt));
- p = ctime(&logg.diedtime); p[16]='\n'; p[17]=0;
- lprintf("Score: %d, Diff: %d, %s %s on %d at %s",(long)(logg.score),(long)(logg.diff),logg.who,logg.what,(long)(logg.cavelev),p+4);
+ }
+ for (n = stbuf.st_size / sizeof(struct log_fmt); n > 0; --n) {
+ lrfill((char *) &logg, sizeof(struct log_fmt));
+ p = ctime(&logg.diedtime);
+ p[16] = '\n';
+ p[17] = 0;
+ lprintf("Score: %d, Diff: %d, %s %s on %d at %s", (long) (logg.score), (long) (logg.diff), logg.who, logg.what, (long) (logg.cavelev), p + 4);
#ifdef EXTRA
- if (logg.moves<=0) logg.moves=1;
- lprintf(" Experience Level: %d, AC: %d, HP: %d/%d, Elapsed Time: %d minutes\n",(long)(logg.lev),(long)(logg.ac),(long)(logg.hp),(long)(logg.hpmax),(long)(logg.elapsedtime));
- lprintf(" CPU time used: %d seconds, Machine usage: %d.%02d%%\n",(long)(logg.cputime),(long)(logg.usage/100),(long)(logg.usage%100));
- lprintf(" BYTES in: %d, out: %d, moves: %d, deaths: %d, spells cast: %d\n",(long)(logg.bytin),(long)(logg.bytout),(long)(logg.moves),(long)(logg.killed),(long)(logg.spused));
- lprintf(" out bytes per move: %d, time per move: %d ms\n",(long)(logg.bytout/logg.moves),(long)((logg.cputime*1000)/logg.moves));
+ if (logg.moves <= 0)
+ logg.moves = 1;
+ lprintf(" Experience Level: %d, AC: %d, HP: %d/%d, Elapsed Time: %d minutes\n", (long) (logg.lev), (long) (logg.ac), (long) (logg.hp), (long) (logg.hpmax), (long) (logg.elapsedtime));
+ lprintf(" CPU time used: %d seconds, Machine usage: %d.%02d%%\n", (long) (logg.cputime), (long) (logg.usage / 100), (long) (logg.usage % 100));
+ lprintf(" BYTES in: %d, out: %d, moves: %d, deaths: %d, spells cast: %d\n", (long) (logg.bytin), (long) (logg.bytout), (long) (logg.moves), (long) (logg.killed), (long) (logg.spused));
+ lprintf(" out bytes per move: %d, time per move: %d ms\n", (long) (logg.bytout / logg.moves), (long) ((logg.cputime * 1000) / logg.moves));
#endif
- }
- lflush(); lrclose(); return;
}
+ lflush();
+ lrclose();
+ return;
+}
#ifndef UIDSCORE
/*
- * getplid(name) Function to get players id # from id file
+ * getplid(name) Function to get players id # from id file
*
- * Enter with the name of the players character in name.
- * Returns the id # of the players character, or -1 if failure.
- * This routine will try to find the name in the id file, if its not there,
- * it will try to make a new entry in the file. Only returns -1 if can't
- * find him in the file, and can't make a new entry in the file.
- * Format of playerids file:
- * Id # in ascii \n character name \n
+ * Enter with the name of the players character in name.
+ * Returns the id # of the players character, or -1 if failure.
+ * This routine will try to find the name in the id file, if its not there,
+ * it will try to make a new entry in the file. Only returns -1 if can't
+ * find him in the file, and can't make a new entry in the file.
+ * Format of playerids file:
+ * Id # in ascii \n character name \n
*/
-static int havepid= -1; /* playerid # if previously done */
+static int havepid = -1; /* playerid # if previously done */
+int
getplid(nam)
- char *nam;
- {
- int fd7,high=999,no;
- register char *p,*p2;
- char name[80];
- if (havepid != -1) return(havepid); /* already did it */
- lflush(); /* flush any pending I/O */
- sprintf(name,"%s\n",nam); /* append a \n to name */
- if (lopen(playerids) < 0) /* no file, make it */
- {
- if ((fd7=creat(playerids,0666)) < 0) return(-1); /* can't make it */
- close(fd7); goto addone; /* now append new playerid record to file */
- }
- for (;;) /* now search for the name in the player id file */
- {
- p = lgetl(); if (p==NULL) break; /* EOF? */
+ char *nam;
+{
+ int fd7, high = 999, no;
+ char *p, *p2;
+ char name[80];
+
+ if (havepid != -1)
+ return (havepid); /* already did it */
+ lflush(); /* flush any pending I/O */
+ sprintf(name, "%s\n", nam); /* append a \n to name */
+ if (lopen(playerids) < 0) { /* no file, make it */
+ if ((fd7 = creat(playerids, 0666)) < 0)
+ return (-1); /* can't make it */
+ close(fd7);
+ goto addone; /* now append new playerid record to file */
+ }
+ for (;;) { /* now search for the name in the player id
+ * file */
+ p = lgetl();
+ if (p == NULL)
+ break; /* EOF? */
no = atoi(p); /* the id # */
- p2= lgetl(); if (p2==NULL) break; /* EOF? */
- if (no>high) high=no; /* accumulate highest id # */
- if (strcmp(p2,name)==0) /* we found him */
- {
- return(no); /* his id number */
- }
+ p2 = lgetl();
+ if (p2 == NULL)
+ break; /* EOF? */
+ if (no > high)
+ high = no; /* accumulate highest id # */
+ if (strcmp(p2, name) == 0) { /* we found him */
+ return (no); /* his id number */
}
+ }
lrclose();
/* if we get here, we didn't find him in the file -- put him there */
addone:
- if (lappend(playerids) < 0) return(-1); /* can't open file for append */
- lprintf("%d\n%s",(long)++high,name); /* new id # and name */
+ if (lappend(playerids) < 0)
+ return (-1); /* can't open file for append */
+ lprintf("%d\n%s", (long) ++high, name); /* new id # and name */
lwclose();
- lcreat((char*)0); /* re-open terminal channel */
- return(high);
- }
-#endif UIDSCORE
-
+ lcreat((char *) 0); /* re-open terminal channel */
+ return (high);
+}
+#endif /* UIDSCORE */
diff --git a/games/larn/signal.c b/games/larn/signal.c
index 3b4e2f396dd..65cf477fab4 100644
--- a/games/larn/signal.c
+++ b/games/larn/signal.c
@@ -1,86 +1,141 @@
+/* $OpenBSD: signal.c,v 1.3 1998/09/15 05:12:33 pjanzen Exp $ */
+/* $NetBSD: signal.c,v 1.6 1997/10/18 20:03:50 christos Exp $ */
+
+/* "Larn is copyrighted 1986 by Noah Morgan.\n" */
+
#ifndef lint
-static char rcsid[] = "$NetBSD: signal.c,v 1.5 1995/12/21 11:27:51 mycroft Exp $";
-#endif /* not lint */
+static char rcsid[] = "$OpenBSD: signal.c,v 1.3 1998/09/15 05:12:33 pjanzen Exp $";
+#endif /* not lint */
+#include <stdio.h>
#include <signal.h>
-#include "header.h" /* "Larn is copyrighted 1986 by Noah Morgan.\n" */
#include <string.h>
+#include <unistd.h>
+#include "header.h"
+#include "extern.h"
+
+static void s2choose __P((void));
+static void cntlc __P((int));
+static void sgam __P((int));
+static void tstop __P((int));
+static void sigpanic __P((int));
#define BIT(a) (1<<((a)-1))
-extern char savefilename[],wizard,predostuff,nosignal;
-static s2choose() /* text to be displayed if ^C during intro screen */
- {
- cursor(1,24); lprcat("Press "); setbold(); lprcat("return"); resetbold();
- lprcat(" to continue: "); lflush();
- }
static void
-cntlc() /* what to do for a ^C */
- {
- if (nosignal) return; /* don't do anything if inhibited */
- signal(SIGQUIT,SIG_IGN); signal(SIGINT,SIG_IGN);
- quit(); if (predostuff==1) s2choose(); else showplayer();
+s2choose()
+{ /* text to be displayed if ^C during intro
+ * screen */
+ cursor(1, 24);
+ lprcat("Press ");
+ setbold();
+ lprcat("return");
+ resetbold();
+ lprcat(" to continue: ");
lflush();
- signal(SIGQUIT,cntlc); signal(SIGINT,cntlc);
- }
+}
+
+static void
+cntlc(n)
+ int n;
+{ /* what to do for a ^C */
+ if (nosignal)
+ return; /* don't do anything if inhibited */
+ signal(SIGQUIT, SIG_IGN);
+ signal(SIGINT, SIG_IGN);
+ quit();
+ if (predostuff == 1)
+ s2choose();
+ else
+ showplayer();
+ lflush();
+ signal(SIGQUIT, cntlc);
+ signal(SIGINT, cntlc);
+}
/*
* subroutine to save the game if a hangup signal
*/
static void
-sgam()
- {
- savegame(savefilename); wizard=1; died(-257); /* hangup signal */
- }
+sgam(n)
+ int n;
+{
+ savegame(savefilename);
+ wizard = 1;
+ died(-257); /* hangup signal */
+}
#ifdef SIGTSTP
static void
-tstop() /* control Y */
- {
- if (nosignal) return; /* nothing if inhibited */
- lcreat((char*)0); clearvt100(); lflush(); signal(SIGTSTP,SIG_DFL);
+tstop(n)
+ int n;
+{ /* control Y */
+ if (nosignal)
+ return; /* nothing if inhibited */
+ lcreat((char *) 0);
+ clearvt100();
+ lflush();
+ signal(SIGTSTP, SIG_DFL);
#ifdef SIGVTALRM
- /* looks like BSD4.2 or higher - must clr mask for signal to take effect*/
- sigsetmask(sigblock(0)& ~BIT(SIGTSTP));
+ /*
+ * looks like BSD4.2 or higher - must clr mask for signal to take
+ * effect
+ */
+ sigsetmask(sigblock(0) & ~BIT(SIGTSTP));
#endif
- kill(getpid(),SIGTSTP);
+ kill(getpid(), SIGTSTP);
- setupvt100(); signal(SIGTSTP,tstop);
- if (predostuff==1) s2choose(); else drawscreen();
- showplayer(); lflush();
- }
-#endif SIGTSTP
+ setupvt100();
+ signal(SIGTSTP, tstop);
+ if (predostuff == 1)
+ s2choose();
+ else
+ drawscreen();
+ showplayer();
+ lflush();
+}
+#endif /* SIGTSTP */
/*
- * subroutine to issue the needed signal traps called from main()
+ * subroutine to issue the needed signal traps called from main()
*/
-static void sigpanic();
+void
sigsetup()
- {
- signal(SIGQUIT, cntlc); signal(SIGINT, cntlc);
- signal(SIGKILL, SIG_IGN); signal(SIGHUP, sgam);
- signal(SIGILL, sigpanic); signal(SIGTRAP, sigpanic);
- signal(SIGIOT, sigpanic); signal(SIGEMT, sigpanic);
- signal(SIGFPE, sigpanic); signal(SIGBUS, sigpanic);
- signal(SIGSEGV, sigpanic); signal(SIGSYS, sigpanic);
- signal(SIGPIPE, sigpanic); signal(SIGTERM, sigpanic);
+{
+ signal(SIGQUIT, cntlc);
+ signal(SIGINT, cntlc);
+ signal(SIGKILL, SIG_IGN);
+ signal(SIGHUP, sgam);
+ signal(SIGILL, sigpanic);
+ signal(SIGTRAP, sigpanic);
+ signal(SIGIOT, sigpanic);
+ signal(SIGEMT, sigpanic);
+ signal(SIGFPE, sigpanic);
+ signal(SIGBUS, sigpanic);
+ signal(SIGSEGV, sigpanic);
+ signal(SIGSYS, sigpanic);
+ signal(SIGPIPE, sigpanic);
+ signal(SIGTERM, sigpanic);
#ifdef SIGTSTP
- signal(SIGTSTP,tstop); signal(SIGSTOP,tstop);
-#endif SIGTSTP
- }
+ signal(SIGTSTP, tstop);
+ signal(SIGSTOP, tstop);
+#endif /* SIGTSTP */
+}
/*
* routine to process a fatal error signal
*/
static void
sigpanic(sig)
- int sig;
- {
- char buf[128];
- signal(sig,SIG_DFL);
- sprintf(buf,"\nLarn - Panic! Signal %d received [SIG%s]",sig,sys_signame[sig]);
- write(2,buf,strlen(buf)); sleep(2);
+ int sig;
+{
+ char buf[128];
+
+ signal(sig, SIG_DFL);
+ sprintf(buf, "\nLarn - Panic! Signal %d received [SIG%s]", sig, sys_signame[sig]);
+ write(2, buf, strlen(buf));
+ sleep(2);
sncbr();
- savegame(savefilename);
- kill(getpid(),sig); /* this will terminate us */
- }
+ savegame(savefilename);
+ kill(getpid(), sig); /* this will terminate us */
+}
diff --git a/games/larn/store.c b/games/larn/store.c
index 76a657d35c0..57b36797a6d 100644
--- a/games/larn/store.c
+++ b/games/larn/store.c
@@ -1,4 +1,5 @@
-/* $NetBSD: store.c,v 1.4 1995/03/23 08:34:20 cgd Exp $ */
+/* $OpenBSD: store.c,v 1.4 1998/09/15 05:12:33 pjanzen Exp $ */
+/* $NetBSD: store.c,v 1.6 1997/10/18 20:03:52 christos Exp $ */
/*-
* Copyright (c) 1988 The Regents of the University of California.
@@ -33,155 +34,182 @@
* SUCH DAMAGE.
*/
+#include <sys/cdefs.h>
#ifndef lint
#if 0
-static char sccsid[] = "@(#)store.c 5.4 (Berkeley) 5/13/91";
+static char sccsid[] = "@(#)store.c 5.4 (Berkeley) 5/13/91";
#else
-static char rcsid[] = "$NetBSD: store.c,v 1.4 1995/03/23 08:34:20 cgd Exp $";
+static char rcsid[] = "$OpenBSD: store.c,v 1.4 1998/09/15 05:12:33 pjanzen Exp $";
#endif
-#endif /* not lint */
+#endif /* not lint */
-/* store.c Larn is copyrighted 1986 by Noah Morgan. */
+/* store.c Larn is copyrighted 1986 by Noah Morgan. */
#include "header.h"
-static int dndcount=0,dnditm=0;
-
-/* this is the data for the stuff in the dnd store */
-int maxitm=83; /* number of items in the dnd inventory table */
-struct _itm itm[90] = {
-/*cost iven name iven arg how
- gp iven[] ivenarg[] many */
-
-{ 2, OLEATHER, 0, 3 },
-{ 10, OSTUDLEATHER, 0, 2 },
-{ 40, ORING, 0, 2 },
-{ 85, OCHAIN, 0, 2 },
-{ 220, OSPLINT, 0, 1 },
-{ 400, OPLATE, 0, 1 },
-{ 900, OPLATEARMOR, 0, 1 },
-{ 2600, OSSPLATE, 0, 1 },
-{ 150, OSHIELD, 0, 1 },
-
-/*cost iven name iven arg how
- gp iven[] ivenarg[] many */
-
-{ 2, ODAGGER, 0, 3 },
-{ 20, OSPEAR, 0, 3 },
-{ 80, OFLAIL, 0, 2 },
-{ 150, OBATTLEAXE, 0, 2 },
-{ 450, OLONGSWORD, 0, 2 },
-{ 1000, O2SWORD, 0, 2 },
-{ 5000, OSWORD, 0, 1 },
-{ 16500, OLANCE, 0, 1 },
-{ 6000, OSWORDofSLASHING, 0, 0 },
-{ 10000, OHAMMER, 0, 0 },
-
-/*cost iven name iven arg how
- gp iven[] ivenarg[] many */
-
-{ 150, OPROTRING, 1, 1 },
-{ 85, OSTRRING, 1, 1 },
-{ 120, ODEXRING, 1, 1 },
-{ 120, OCLEVERRING, 1, 1 },
-{ 180, OENERGYRING, 0, 1 },
-{ 125, ODAMRING, 0, 1 },
-{ 220, OREGENRING, 0, 1 },
-{ 1000, ORINGOFEXTRA, 0, 1 },
-
-{ 280, OBELT, 0, 1 },
-
-{ 400, OAMULET, 0, 1 },
-
-{ 6500, OORBOFDRAGON, 0, 0 },
-{ 5500, OSPIRITSCARAB, 0, 0 },
-{ 5000, OCUBEofUNDEAD, 0, 0 },
-{ 6000, ONOTHEFT, 0, 0 },
-
-{ 590, OCHEST, 6, 1 },
-{ 200, OBOOK, 8, 1 },
-{ 10, OCOOKIE, 0, 3 },
-
-/*cost iven name iven arg how
- gp iven[] ivenarg[] many */
-
-{ 20, OPOTION, 0, 6 },
-{ 90, OPOTION, 1, 5 },
-{ 520, OPOTION, 2, 1 },
-{ 100, OPOTION, 3, 2 },
-{ 50, OPOTION, 4, 2 },
-{ 150, OPOTION, 5, 2 },
-{ 70, OPOTION, 6, 1 },
-{ 30, OPOTION, 7, 7 },
-{ 200, OPOTION, 8, 1 },
-{ 50, OPOTION, 9, 1 },
-{ 80, OPOTION, 10, 1 },
-
-/*cost iven name iven arg how
- gp iven[] ivenarg[] many */
-
-{ 30, OPOTION, 11, 3 },
-{ 20, OPOTION, 12, 5 },
-{ 40, OPOTION, 13, 3 },
-{ 35, OPOTION, 14, 2 },
-{ 520, OPOTION, 15, 1 },
-{ 90, OPOTION, 16, 2 },
-{ 200, OPOTION, 17, 2 },
-{ 220, OPOTION, 18, 4 },
-{ 80, OPOTION, 19, 6 },
-{ 370, OPOTION, 20, 3 },
-{ 50, OPOTION, 22, 1 },
-{ 150, OPOTION, 23, 3 },
-
-/*cost iven name iven arg how
- gp iven[] ivenarg[] many */
-
-{ 100, OSCROLL, 0, 2 },
-{ 125, OSCROLL, 1, 2 },
-{ 60, OSCROLL, 2, 4 },
-{ 10, OSCROLL, 3, 4 },
-{ 100, OSCROLL, 4, 3 },
-{ 200, OSCROLL, 5, 2 },
-{ 110, OSCROLL, 6, 1 },
-{ 500, OSCROLL, 7, 2 },
-{ 200, OSCROLL, 8, 2 },
-{ 250, OSCROLL, 9, 4 },
-{ 20, OSCROLL, 10, 5 },
-{ 30, OSCROLL, 11, 3 },
-
-/*cost iven name iven arg how
- gp iven[] ivenarg[] many */
-
-{ 340, OSCROLL, 12, 1 },
-{ 340, OSCROLL, 13, 1 },
-{ 300, OSCROLL, 14, 2 },
-{ 400, OSCROLL, 15, 2 },
-{ 500, OSCROLL, 16, 2 },
-{ 1000, OSCROLL, 17, 1 },
-{ 500, OSCROLL, 18, 1 },
-{ 340, OSCROLL, 19, 2 },
-{ 220, OSCROLL, 20, 3 },
-{ 3900, OSCROLL, 21, 0 },
-{ 610, OSCROLL, 22, 1 },
-{ 3000, OSCROLL, 23, 0 }
- };
+#include "extern.h"
+
+static void handsfull __P((void));
+static void outofstock __P((void));
+static void nogold __P((void));
+static void dnditem __P((int));
+static void banktitle __P((char *));
+static void otradhead __P((void));
+
+static int dndcount = 0, dnditm = 0;
+
+/* this is the data for the stuff in the dnd store */
+int maxitm = 83; /* number of items in the dnd inventory table */
+struct _itm itm[90] = {
+ /*
+ * cost iven name iven arg how gp
+ * iven[] ivenarg[] many
+ */
+
+ {2, OLEATHER, 0, 3},
+ {10, OSTUDLEATHER, 0, 2},
+ {40, ORING, 0, 2},
+ {85, OCHAIN, 0, 2},
+ {220, OSPLINT, 0, 1},
+ {400, OPLATE, 0, 1},
+ {900, OPLATEARMOR, 0, 1},
+ {2600, OSSPLATE, 0, 1},
+ {150, OSHIELD, 0, 1},
+
+ /*
+ * cost iven name iven arg how gp
+ * iven[] ivenarg[] many
+ */
+
+ {2, ODAGGER, 0, 3},
+ {20, OSPEAR, 0, 3},
+ {80, OFLAIL, 0, 2},
+ {150, OBATTLEAXE, 0, 2},
+ {450, OLONGSWORD, 0, 2},
+ {1000, O2SWORD, 0, 2},
+ {5000, OSWORD, 0, 1},
+ {16500, OLANCE, 0, 1},
+ {6000, OSWORDofSLASHING, 0, 0},
+ {10000, OHAMMER, 0, 0},
+
+ /*
+ * cost iven name iven arg how gp
+ * iven[] ivenarg[] many
+ */
+
+ {150, OPROTRING, 1, 1},
+ {85, OSTRRING, 1, 1},
+ {120, ODEXRING, 1, 1},
+ {120, OCLEVERRING, 1, 1},
+ {180, OENERGYRING, 0, 1},
+ {125, ODAMRING, 0, 1},
+ {220, OREGENRING, 0, 1},
+ {1000, ORINGOFEXTRA, 0, 1},
+
+ {280, OBELT, 0, 1},
+
+ {400, OAMULET, 0, 1},
+
+ {6500, OORBOFDRAGON, 0, 0},
+ {5500, OSPIRITSCARAB, 0, 0},
+ {5000, OCUBEofUNDEAD, 0, 0},
+ {6000, ONOTHEFT, 0, 0},
+
+ {590, OCHEST, 6, 1},
+ {200, OBOOK, 8, 1},
+ {10, OCOOKIE, 0, 3},
+
+ /*
+ * cost iven name iven arg how gp
+ * iven[] ivenarg[] many
+ */
+
+ {20, OPOTION, 0, 6},
+ {90, OPOTION, 1, 5},
+ {520, OPOTION, 2, 1},
+ {100, OPOTION, 3, 2},
+ {50, OPOTION, 4, 2},
+ {150, OPOTION, 5, 2},
+ {70, OPOTION, 6, 1},
+ {30, OPOTION, 7, 7},
+ {200, OPOTION, 8, 1},
+ {50, OPOTION, 9, 1},
+ {80, OPOTION, 10, 1},
+
+ /*
+ * cost iven name iven arg how gp
+ * iven[] ivenarg[] many
+ */
+
+ {30, OPOTION, 11, 3},
+ {20, OPOTION, 12, 5},
+ {40, OPOTION, 13, 3},
+ {35, OPOTION, 14, 2},
+ {520, OPOTION, 15, 1},
+ {90, OPOTION, 16, 2},
+ {200, OPOTION, 17, 2},
+ {220, OPOTION, 18, 4},
+ {80, OPOTION, 19, 6},
+ {370, OPOTION, 20, 3},
+ {50, OPOTION, 22, 1},
+ {150, OPOTION, 23, 3},
+
+ /*
+ * cost iven name iven arg how gp
+ * iven[] ivenarg[] many
+ */
+
+ {100, OSCROLL, 0, 2},
+ {125, OSCROLL, 1, 2},
+ {60, OSCROLL, 2, 4},
+ {10, OSCROLL, 3, 4},
+ {100, OSCROLL, 4, 3},
+ {200, OSCROLL, 5, 2},
+ {110, OSCROLL, 6, 1},
+ {500, OSCROLL, 7, 2},
+ {200, OSCROLL, 8, 2},
+ {250, OSCROLL, 9, 4},
+ {20, OSCROLL, 10, 5},
+ {30, OSCROLL, 11, 3},
+
+ /*
+ * cost iven name iven arg how gp
+ * iven[] ivenarg[] many
+ */
+
+ {340, OSCROLL, 12, 1},
+ {340, OSCROLL, 13, 1},
+ {300, OSCROLL, 14, 2},
+ {400, OSCROLL, 15, 2},
+ {500, OSCROLL, 16, 2},
+ {1000, OSCROLL, 17, 1},
+ {500, OSCROLL, 18, 1},
+ {340, OSCROLL, 19, 2},
+ {220, OSCROLL, 20, 3},
+ {3900, OSCROLL, 21, 0},
+ {610, OSCROLL, 22, 1},
+ {3000, OSCROLL, 23, 0}
+};
/*
- function for the dnd store
+ * function for the dnd store
*/
+void
dnd_2hed()
- {
+{
lprcat("Welcome to the Larn Thrift Shoppe. We stock many items explorers find useful\n");
lprcat(" in their adventures. Feel free to browse to your hearts content.\n");
lprcat("Also be advised, if you break 'em, you pay for 'em.");
- }
-
-static void dnditem();
+}
+void
dnd_hed()
- {
- register int i;
- for (i=dnditm; i<26+dnditm; i++) dnditem(i);
- cursor(50,18); lprcat("You have ");
- }
+{
+ int i;
+
+ for (i = dnditm; i < 26 + dnditm; i++)
+ dnditem(i);
+ cursor(50, 18);
+ lprcat("You have ");
+}
static void
handsfull()
@@ -199,502 +227,696 @@ outofstock()
nap(2200);
}
-static void nogold()
+static void
+nogold()
{
lprcat("\nYou don't have enough gold to pay for that!");
lflush();
nap(2200);
}
+void
dndstore()
- {
- register int i;
- dnditm = 0;
- nosignal = 1; /* disable signals */
- clear(); dnd_2hed();
- if (outstanding_taxes>0)
- {
- lprcat("\n\nThe Larn Revenue Service has ordered us to not do business with tax evaders.\n"); beep();
- lprintf("They have also told us that you owe %d gp in back taxes, and as we must\n",(long)outstanding_taxes);
- lprcat("comply with the law, we cannot serve you at this time. Soo Sorry.\n");
- cursors();
- lprcat("\nPress "); standout("escape"); lprcat(" to leave: "); lflush();
- i=0;
- while (i!='\33') i=getchar();
- drawscreen(); nosignal = 0; /* enable signals */ return;
+{
+ int i;
+
+ dnditm = 0;
+ nosignal = 1; /* disable signals */
+ clear();
+ dnd_2hed();
+ if (outstanding_taxes > 0) {
+ lprcat("\n\nThe Larn Revenue Service has ordered us to not do business with tax evaders.\n");
+ lbeep();
+ lprintf("They have also told us that you owe %d gp in back taxes, and as we must\n", (long) outstanding_taxes);
+ lprcat("comply with the law, we cannot serve you at this time. Soo Sorry.\n");
+ cursors();
+ lprcat("\nPress ");
+ lstandout("escape");
+ lprcat(" to leave: ");
+ lflush();
+ i = 0;
+ while (i != '\33')
+ i = lgetchar();
+ drawscreen();
+ nosignal = 0; /* enable signals */
+ return;
}
-
- dnd_hed();
- while (1)
- {
- cursor(59,18); lprintf("%d gold pieces",(long)c[GOLD]);
- cltoeoln(); cl_dn(1,20); /* erase to eod */
- lprcat("\nEnter your transaction ["); standout("space");
- lprcat(" for more, "); standout("escape");
- lprcat(" to leave]? ");
- i=0;
- while ((i<'a' || i>'z') && (i!=' ') && (i!='\33') && (i!=12)) i=getchar();
- if (i==12) { clear(); dnd_2hed(); dnd_hed(); }
- else if (i=='\33')
- { drawscreen(); nosignal = 0; /* enable signals */ return; }
- else if (i==' ')
- {
- cl_dn(1,4);
- if ((dnditm += 26) >= maxitm) dnditm=0; dnd_hed();
- }
- else
- { /* buy something */
- lprc(i); /* echo the byte */
- i += dnditm - 'a';
- if (i>=maxitm) outofstock(); else
- if (itm[i].qty <= 0) outofstock(); else
- if (pocketfull()) handsfull(); else
- if (c[GOLD] < itm[i].price*10) nogold(); else
- {
- if (itm[i].obj == OPOTION)
- { potionname[itm[i].arg] = potionhide[itm[i].arg]; }
- else if (itm[i].obj == OSCROLL)
- { scrollname[itm[i].arg] = scrollhide[itm[i].arg]; }
- c[GOLD] -= itm[i].price*10;
- itm[i].qty--; take(itm[i].obj,itm[i].arg);
- if (itm[i].qty==0) dnditem(i); nap(1001);
+ dnd_hed();
+ while (1) {
+ cursor(59, 18);
+ lprintf("%d gold pieces", (long) c[GOLD]);
+ cltoeoln();
+ cl_dn(1, 20); /* erase to eod */
+ lprcat("\nEnter your transaction [");
+ lstandout("space");
+ lprcat(" for more, ");
+ lstandout("escape");
+ lprcat(" to leave]? ");
+ i = 0;
+ while ((i < 'a' || i > 'z') && (i != ' ') && (i != '\33') && (i != 12))
+ i = lgetchar();
+ if (i == 12) {
+ clear();
+ dnd_2hed();
+ dnd_hed();
+ } else if (i == '\33') {
+ drawscreen();
+ nosignal = 0; /* enable signals */
+ return;
+ } else if (i == ' ') {
+ cl_dn(1, 4);
+ if ((dnditm += 26) >= maxitm)
+ dnditm = 0;
+ dnd_hed();
+ } else { /* buy something */
+ lprc(i);/* echo the byte */
+ i += dnditm - 'a';
+ if (i >= maxitm)
+ outofstock();
+ else if (itm[i].qty <= 0)
+ outofstock();
+ else if (pocketfull())
+ handsfull();
+ else if (c[GOLD] < itm[i].price * 10)
+ nogold();
+ else {
+ if (itm[i].obj == OPOTION) {
+ potionname[itm[i].arg] = potionhide[itm[i].arg];
+ } else if (itm[i].obj == OSCROLL) {
+ scrollname[itm[i].arg] = scrollhide[itm[i].arg];
+ }
+ c[GOLD] -= itm[i].price * 10;
+ itm[i].qty--;
+ take(itm[i].obj, itm[i].arg);
+ if (itm[i].qty == 0)
+ dnditem(i);
+ nap(1001);
}
}
}
- }
+}
/*
- dnditem(index)
-
- to print the item list; used in dndstore() enter with the index into itm
+ * dnditem(index)
+ *
+ * to print the item list; used in dndstore() enter with the index into itm
*/
static void
dnditem(i)
- register int i;
- {
- register int j,k;
- if (i >= maxitm) return;
- cursor( (j=(i&1)*40+1) , (k=((i%26)>>1)+5) );
- if (itm[i].qty == 0) { lprintf("%39s",""); return; }
- lprintf("%c) ",(i%26)+'a');
- if (itm[i].obj == OPOTION)
- { lprintf("potion of%s", potionhide[itm[i].arg]); }
- else if (itm[i].obj == OSCROLL)
- { lprintf("scroll of%s", scrollhide[itm[i].arg]); }
- else lprintf("%s",objectname[itm[i].obj]);
- cursor( j+31,k ); lprintf("%6d",(long)(itm[i].price*10));
+ int i;
+{
+ int j, k;
+
+ if (i >= maxitm)
+ return;
+ cursor((j = (i & 1) * 40 + 1), (k = ((i % 26) >> 1) + 5));
+ if (itm[i].qty == 0) {
+ lprintf("%39s", "");
+ return;
}
+ lprintf("%c) ", (i % 26) + 'a');
+ if (itm[i].obj == OPOTION) {
+ lprintf("potion of%s", potionhide[itm[i].arg]);
+ } else if (itm[i].obj == OSCROLL) {
+ lprintf("scroll of%s", scrollhide[itm[i].arg]);
+ } else
+ lprintf("%s", objectname[itm[i].obj]);
+ cursor(j + 31, k);
+ lprintf("%6d", (long) (itm[i].price * 10));
+}
+
+
-
/*
- for the college of larn
+ * for the college of larn
*/
-char course[26]={0}; /* the list of courses taken */
-char coursetime[] = { 10, 15, 10, 20, 10, 10, 10, 5 };
+u_char course[26] = {0}; /* the list of courses taken */
+char coursetime[] = {10, 15, 10, 20, 10, 10, 10, 5};
/*
function to display the header info for the school
*/
+void
sch_hed()
- {
+{
clear();
lprcat("The College of Larn offers the exciting opportunity of higher education to\n");
lprcat("all inhabitants of the caves. Here is a list of the class schedule:\n\n\n");
lprcat("\t\t Course Name \t Time Needed\n\n");
- if (course[0]==0) lprcat("\t\ta) Fighters Training I 10 mobuls"); /*line 7 of crt*/
+ if (course[0] == 0)
+ lprcat("\t\ta) Fighter's Training I 10 mobuls"); /* line 7 of crt */
lprc('\n');
- if (course[1]==0) lprcat("\t\tb) Fighters Training II 15 mobuls");
+ if (course[1] == 0)
+ lprcat("\t\tb) Fighter's Training II 15 mobuls");
lprc('\n');
- if (course[2]==0) lprcat("\t\tc) Introduction to Wizardry 10 mobuls");
+ if (course[2] == 0)
+ lprcat("\t\tc) Introduction to Wizardry 10 mobuls");
lprc('\n');
- if (course[3]==0) lprcat("\t\td) Applied Wizardry 20 mobuls");
+ if (course[3] == 0)
+ lprcat("\t\td) Applied Wizardry 20 mobuls");
lprc('\n');
- if (course[4]==0) lprcat("\t\te) Behavioral Psychology 10 mobuls");
+ if (course[4] == 0)
+ lprcat("\t\te) Behavioral Psychology 10 mobuls");
lprc('\n');
- if (course[5]==0) lprcat("\t\tf) Faith for Today 10 mobuls");
+ if (course[5] == 0)
+ lprcat("\t\tf) Faith for Today 10 mobuls");
lprc('\n');
- if (course[6]==0) lprcat("\t\tg) Contemporary Dance 10 mobuls");
+ if (course[6] == 0)
+ lprcat("\t\tg) Contemporary Dance 10 mobuls");
lprc('\n');
- if (course[7]==0) lprcat("\t\th) History of Larn 5 mobuls");
+ if (course[7] == 0)
+ lprcat("\t\th) History of Larn 5 mobuls");
lprcat("\n\n\t\tAll courses cost 250 gold pieces.");
- cursor(30,18);
+ cursor(30, 18);
lprcat("You are presently carrying ");
- }
+}
+void
oschool()
- {
- register int i;
- long time_used;
- nosignal = 1; /* disable signals */
+{
+ int i;
+ long time_used;
+
+ nosignal = 1; /* disable signals */
sch_hed();
- while (1)
- {
- cursor(57,18); lprintf("%d gold pieces. ",(long)c[GOLD]); cursors();
- lprcat("\nWhat is your choice ["); standout("escape");
- lprcat(" to leave] ? "); yrepcount=0;
- i=0; while ((i<'a' || i>'h') && (i!='\33') && (i!=12)) i=getchar();
- if (i==12) { sch_hed(); continue; }
- else if (i=='\33')
- { nosignal = 0; drawscreen(); /* enable signals */ return; }
+ while (1) {
+ cursor(57, 18);
+ lprintf("%d gold pieces. ", (long) c[GOLD]);
+ cursors();
+ lprcat("\nWhat is your choice [");
+ lstandout("escape");
+ lprcat(" to leave] ? ");
+ yrepcount = 0;
+ i = 0;
+ while ((i < 'a' || i > 'h') && (i != '\33') && (i != 12))
+ i = lgetchar();
+ if (i == 12) {
+ sch_hed();
+ continue;
+ } else if (i == '\33') {
+ nosignal = 0;
+ drawscreen(); /* enable signals */
+ return;
+ }
lprc(i);
- if (c[GOLD] < 250) nogold(); else
- if (course[i-'a'])
- { lprcat("\nSorry, but that class is filled."); nap(1000); }
- else
- if (i <= 'h')
- {
- c[GOLD] -= 250; time_used=0;
- switch(i)
- {
- case 'a': c[STRENGTH] += 2; c[CONSTITUTION]++;
- lprcat("\nYou feel stronger!");
- cl_line(16,7);
- break;
-
- case 'b': if (course[0]==0)
- {
- lprcat("\nSorry, but this class has a prerequisite of Fighters Training I");
- c[GOLD]+=250; time_used= -10000; break;
- }
- lprcat("\nYou feel much stronger!");
- cl_line(16,8);
- c[STRENGTH] += 2; c[CONSTITUTION] += 2; break;
-
- case 'c': c[INTELLIGENCE] += 2;
- lprcat("\nThe task before you now seems more attainable!");
- cl_line(16,9); break;
-
- case 'd': if (course[2]==0)
- {
- lprcat("\nSorry, but this class has a prerequisite of Introduction to Wizardry");
- c[GOLD]+=250; time_used= -10000; break;
- }
- lprcat("\nThe task before you now seems very attainable!");
- cl_line(16,10);
- c[INTELLIGENCE] += 2; break;
-
- case 'e': c[CHARISMA] += 3;
- lprcat("\nYou now feel like a born leader!");
- cl_line(16,11); break;
-
- case 'f': c[WISDOM] += 2;
- lprcat("\nYou now feel more confident that you can find the potion in time!");
- cl_line(16,12); break;
-
- case 'g': c[DEXTERITY] += 3;
- lprcat("\nYou feel like dancing!");
- cl_line(16,13); break;
-
- case 'h': c[INTELLIGENCE]++;
- lprcat("\nYour instructor told you that the Eye of Larn is rumored to be guarded\n");
- lprcat("by a platinum dragon who possesses psionic abilities. ");
- cl_line(16,14); break;
- }
- time_used += coursetime[i-'a']*100;
- if (time_used > 0)
- {
- gltime += time_used;
- course[i-'a']++; /* remember that he has taken that course */
- c[HP] = c[HPMAX]; c[SPELLS] = c[SPELLMAX]; /* he regenerated */
-
- if (c[BLINDCOUNT]) c[BLINDCOUNT]=1; /* cure blindness too! */
- if (c[CONFUSE]) c[CONFUSE]=1; /* end confusion */
- adjtime((long)time_used); /* adjust parameters for time change */
- }
+ if (c[GOLD] < 250)
+ nogold();
+ else if (course[i - 'a']) {
+ lprcat("\nSorry, but that class is filled.");
nap(1000);
+ } else if (i <= 'h') {
+ c[GOLD] -= 250;
+ time_used = 0;
+ switch (i) {
+ case 'a':
+ c[STRENGTH] += 2;
+ c[CONSTITUTION]++;
+ lprcat("\nYou feel stronger!");
+ cl_line(16, 7);
+ break;
+
+ case 'b':
+ if (course[0] == 0) {
+ lprcat("\nSorry, but this class has a prerequisite of Fighters Training I");
+ c[GOLD] += 250;
+ time_used = -10000;
+ break;
+ }
+ lprcat("\nYou feel much stronger!");
+ cl_line(16, 8);
+ c[STRENGTH] += 2;
+ c[CONSTITUTION] += 2;
+ break;
+
+ case 'c':
+ c[INTELLIGENCE] += 2;
+ lprcat("\nThe task before you now seems more attainable!");
+ cl_line(16, 9);
+ break;
+
+ case 'd':
+ if (course[2] == 0) {
+ lprcat("\nSorry, but this class has a prerequisite of Introduction to Wizardry");
+ c[GOLD] += 250;
+ time_used = -10000;
+ break;
+ }
+ lprcat("\nThe task before you now seems very attainable!");
+ cl_line(16, 10);
+ c[INTELLIGENCE] += 2;
+ break;
+
+ case 'e':
+ c[CHARISMA] += 3;
+ lprcat("\nYou now feel like a born leader!");
+ cl_line(16, 11);
+ break;
+
+ case 'f':
+ c[WISDOM] += 2;
+ lprcat("\nYou now feel more confident that you can find the potion in time!");
+ cl_line(16, 12);
+ break;
+
+ case 'g':
+ c[DEXTERITY] += 3;
+ lprcat("\nYou feel like dancing!");
+ cl_line(16, 13);
+ break;
+
+ case 'h':
+ c[INTELLIGENCE]++;
+ lprcat("\nYour instructor told you that the Eye of Larn is rumored to be guarded\n");
+ lprcat("by a platinum dragon who possesses psionic abilities. ");
+ cl_line(16, 14);
+ break;
+ }
+ time_used += coursetime[i - 'a'] * 100;
+ if (time_used > 0) {
+ gltime += time_used;
+ course[i - 'a']++; /* remember that he has
+ * taken that course */
+ c[HP] = c[HPMAX];
+ c[SPELLS] = c[SPELLMAX]; /* he regenerated */
+
+ if (c[BLINDCOUNT])
+ c[BLINDCOUNT] = 1; /* cure blindness too! */
+ if (c[CONFUSE])
+ c[CONFUSE] = 1; /* end confusion */
+ adjusttime((long) time_used); /* adjust parameters for
+ * time change */
}
+ nap(1000);
}
}
-
+}
+
+
/*
* for the first national bank of Larn
*/
-int lasttime=0; /* last time he was in bank */
-static void banktitle();
+int lasttime = 0; /* last time he was in bank */
+void
obank()
- {
+{
banktitle(" Welcome to the First National Bank of Larn.");
- }
+}
+
+void
obank2()
- {
+{
banktitle("Welcome to the 5th level branch office of the First National Bank of Larn.");
- }
+}
+
static void
banktitle(str)
- char *str;
- {
- nosignal = 1; /* disable signals */
- clear(); lprcat(str);
- if (outstanding_taxes>0)
- {
- register int i;
- lprcat("\n\nThe Larn Revenue Service has ordered that your account be frozen until all\n"); beep();
- lprintf("levied taxes have been paid. They have also told us that you owe %d gp in\n",(long)outstanding_taxes);
+ char *str;
+{
+ nosignal = 1; /* disable signals */
+ clear();
+ lprcat(str);
+ if (outstanding_taxes > 0) {
+ int i;
+ lprcat("\n\nThe Larn Revenue Service has ordered that your account be frozen until all\n");
+ lbeep();
+ lprintf("levied taxes have been paid. They have also told us that you owe %d gp in\n", (long) outstanding_taxes);
lprcat("taxes, and we must comply with them. We cannot serve you at this time. Sorry.\n");
lprcat("We suggest you go to the LRS office and pay your taxes.\n");
- cursors();
- lprcat("\nPress "); standout("escape"); lprcat(" to leave: "); lflush();
- i=0;
- while (i!='\33') i=getchar();
- drawscreen(); nosignal = 0; /* enable signals */ return;
- }
+ cursors();
+ lprcat("\nPress ");
+ lstandout("escape");
+ lprcat(" to leave: ");
+ lflush();
+ i = 0;
+ while (i != '\33')
+ i = lgetchar();
+ drawscreen();
+ nosignal = 0; /* enable signals */
+ return;
+ }
lprcat("\n\n\tGemstone\t Appraisal\t\tGemstone\t Appraisal");
- obanksub(); nosignal = 0; /* enable signals */
+ obanksub();
+ nosignal = 0; /* enable signals */
drawscreen();
- }
+}
/*
* function to put interest on your bank account
*/
+void
ointerest()
- {
- register int i;
- if (c[BANKACCOUNT]<0) c[BANKACCOUNT] = 0;
- else if ((c[BANKACCOUNT]>0) && (c[BANKACCOUNT]<500000))
- {
- i = (gltime-lasttime)/100; /* # mobuls elapsed */
- while ((i-- > 0) && (c[BANKACCOUNT]<500000))
- c[BANKACCOUNT] += c[BANKACCOUNT]/250;
- if (c[BANKACCOUNT]>500000) c[BANKACCOUNT]=500000; /* interest limit */
- }
- lasttime = (gltime/100)*100;
+{
+ int i;
+
+ if (c[BANKACCOUNT] < 0)
+ c[BANKACCOUNT] = 0;
+ else if ((c[BANKACCOUNT] > 0) && (c[BANKACCOUNT] < 500000)) {
+ i = (gltime - lasttime) / 100; /* # mobuls elapsed */
+ while ((i-- > 0) && (c[BANKACCOUNT] < 500000))
+ c[BANKACCOUNT] += c[BANKACCOUNT] / 250;
+ if (c[BANKACCOUNT] > 500000)
+ c[BANKACCOUNT] = 500000; /* interest limit */
}
+ lasttime = (gltime / 100) * 100;
+}
-static short gemorder[26]={0}; /* the reference to screen location for each */
-static long gemvalue[26]={0}; /* the appraisal of the gems */
+static short gemorder[26] = {0}; /* the reference to screen location
+ * for each */
+static long gemvalue[26] = {0}; /* the appraisal of the gems */
+void
obanksub()
- {
- unsigned long amt;
- register int i,k;
- ointerest(); /* credit any needed interest */
-
- for (k=i=0; i<26; i++)
- switch(iven[i])
- {
- case OLARNEYE: case ODIAMOND: case OEMERALD:
- case ORUBY: case OSAPPHIRE:
-
- if (iven[i]==OLARNEYE)
- {
- gemvalue[i]=250000-((gltime*7)/100)*100;
- if (gemvalue[i]<50000) gemvalue[i]=50000;
- }
- else gemvalue[i] = (255&ivenarg[i])*100;
- gemorder[i]=k;
- cursor( (k%2)*40+1 , (k>>1)+4 );
- lprintf("%c) %s",i+'a',objectname[iven[i]]);
- cursor( (k%2)*40+33 , (k>>1)+4 );
- lprintf("%5d",(long)gemvalue[i]); k++;
- };
- cursor(31,17); lprintf("You have %8d gold pieces in the bank.",(long)c[BANKACCOUNT]);
- cursor(40,18); lprintf("You have %8d gold pieces",(long)c[GOLD]);
- if (c[BANKACCOUNT]+c[GOLD] >= 500000)
+{
+ unsigned long amt;
+ int i, k;
+
+ ointerest(); /* credit any needed interest */
+
+ for (k = i = 0; i < 26; i++)
+ switch (iven[i]) {
+ case OLARNEYE:
+ case ODIAMOND:
+ case OEMERALD:
+ case ORUBY:
+ case OSAPPHIRE:
+
+ if (iven[i] == OLARNEYE) {
+ gemvalue[i] = 250000 - ((gltime * 7) / 100) * 100;
+ if (gemvalue[i] < 50000)
+ gemvalue[i] = 50000;
+ } else
+ gemvalue[i] = (255 & ivenarg[i]) * 100;
+ gemorder[i] = k;
+ cursor((k % 2) * 40 + 1, (k >> 1) + 4);
+ lprintf("%c) %s", i + 'a', objectname[iven[i]]);
+ cursor((k % 2) * 40 + 33, (k >> 1) + 4);
+ lprintf("%5d", (long) gemvalue[i]);
+ k++;
+ };
+ cursor(31, 17);
+ lprintf("You have %8d gold pieces in the bank.", (long) c[BANKACCOUNT]);
+ cursor(40, 18);
+ lprintf("You have %8d gold pieces", (long) c[GOLD]);
+ if (c[BANKACCOUNT] + c[GOLD] >= 500000)
lprcat("\nNote: Larndom law states that only deposits under 500,000gp can earn interest.");
- while (1)
- {
- cl_dn(1,20);
- lprcat("\nYour wish? [("); standout("d"); lprcat(") deposit, (");
- standout("w"); lprcat(") withdraw, ("); standout("s");
- lprcat(") sell a stone, or "); standout("escape"); lprcat("] ");
- yrepcount=0;
- i=0; while (i!='d' && i!='w' && i!='s' && i!='\33') i=getchar();
- switch(i)
- {
- case 'd': lprcat("deposit\nHow much? "); amt = readnum((long)c[GOLD]);
- if (amt<0) { lprcat("\nSorry, but we can't take negative gold!"); nap(2000); amt=0; } else
- if (amt>c[GOLD])
- { lprcat(" You don't have that much."); nap(2000); }
- else { c[GOLD] -= amt; c[BANKACCOUNT] += amt; }
- break;
-
- case 'w': lprcat("withdraw\nHow much? "); amt = readnum((long)c[BANKACCOUNT]);
- if (amt<0) { lprcat("\nSorry, but we don't have any negative gold!"); nap(2000); amt=0; }
- else if (amt > c[BANKACCOUNT])
- { lprcat("\nYou don't have that much in the bank!"); nap(2000); }
- else { c[GOLD] += amt; c[BANKACCOUNT] -= amt; }
- break;
-
- case 's': lprcat("\nWhich stone would you like to sell? ");
- i=0; while ((i<'a' || i>'z') && i!='*') i=getchar();
- if (i=='*')
- for (i=0; i<26; i++)
- {
- if (gemvalue[i])
- {
- c[GOLD]+=gemvalue[i]; iven[i]=0;
- gemvalue[i]=0; k = gemorder[i];
- cursor( (k%2)*40+1 , (k>>1)+4 );
- lprintf("%39s","");
- }
- }
- else
- {
- if (gemvalue[i=i-'a']==0)
- {
- lprintf("\nItem %c is not a gemstone!",i+'a');
- nap(2000); break;
- }
- c[GOLD]+=gemvalue[i]; iven[i]=0;
- gemvalue[i]=0; k = gemorder[i];
- cursor( (k%2)*40+1 , (k>>1)+4 ); lprintf("%39s","");
- }
- break;
-
- case '\33': return;
- };
- cursor(40,17); lprintf("%8d",(long)c[BANKACCOUNT]);
- cursor(49,18); lprintf("%8d",(long)c[GOLD]);
- }
+ while (1) {
+ cl_dn(1, 20);
+ lprcat("\nYour wish? [(");
+ lstandout("d");
+ lprcat(") deposit, (");
+ lstandout("w");
+ lprcat(") withdraw, (");
+ lstandout("s");
+ lprcat(") sell a stone, or ");
+ lstandout("escape");
+ lprcat("] ");
+ yrepcount = 0;
+ i = 0;
+ while (i != 'd' && i != 'w' && i != 's' && i != '\33')
+ i = lgetchar();
+ switch (i) {
+ case 'd':
+ lprcat("deposit\nHow much? ");
+ amt = readnum((long) c[GOLD]);
+ if (amt < 0) {
+ lprcat("\nSorry, but we can't take negative gold!");
+ nap(2000);
+ amt = 0;
+ } else if (amt > c[GOLD]) {
+ lprcat(" You don't have that much.");
+ nap(2000);
+ } else {
+ c[GOLD] -= amt;
+ c[BANKACCOUNT] += amt;
+ }
+ break;
+
+ case 'w':
+ lprcat("withdraw\nHow much? ");
+ amt = readnum((long) c[BANKACCOUNT]);
+ if (amt < 0) {
+ lprcat("\nSorry, but we don't have any negative gold!");
+ nap(2000);
+ amt = 0;
+ } else if (amt > c[BANKACCOUNT]) {
+ lprcat("\nYou don't have that much in the bank!");
+ nap(2000);
+ } else {
+ c[GOLD] += amt;
+ c[BANKACCOUNT] -= amt;
+ }
+ break;
+
+ case 's':
+ lprcat("\nWhich stone would you like to sell? ");
+ i = 0;
+ while ((i < 'a' || i > 'z') && i != '*')
+ i = lgetchar();
+ if (i == '*')
+ for (i = 0; i < 26; i++) {
+ if (gemvalue[i]) {
+ c[GOLD] += gemvalue[i];
+ iven[i] = 0;
+ gemvalue[i] = 0;
+ k = gemorder[i];
+ cursor((k % 2) * 40 + 1, (k >> 1) + 4);
+ lprintf("%39s", "");
+ }
+ }
+ else {
+ if (gemvalue[i = i - 'a'] == 0) {
+ lprintf("\nItem %c is not a gemstone!", i + 'a');
+ nap(2000);
+ break;
+ }
+ c[GOLD] += gemvalue[i];
+ iven[i] = 0;
+ gemvalue[i] = 0;
+ k = gemorder[i];
+ cursor((k % 2) * 40 + 1, (k >> 1) + 4);
+ lprintf("%39s", "");
+ }
+ break;
+
+ case '\33':
+ return;
+ };
+ cursor(40, 17);
+ lprintf("%8d", (long) c[BANKACCOUNT]);
+ cursor(49, 18);
+ lprintf("%8d", (long) c[GOLD]);
}
+}
/*
subroutine to appraise any stone for the bank
*/
+void
appraise(gemstone)
- register int gemstone;
- {
- register int j,amt;
- for (j=0; j<26; j++)
- if (iven[j]==gemstone)
- {
- lprintf("\nI see you have %s",objectname[gemstone]);
- if (gemstone==OLARNEYE) lprcat(" I must commend you. I didn't think\nyou could get it.");
- lprcat(" Shall I appraise it for you? "); yrepcount=0;
- if (getyn()=='y')
- {
- lprcat("yes.\n Just one moment please \n"); nap(1000);
- if (gemstone==OLARNEYE)
- {
- amt = 250000-((gltime*7)/100)*100;
- if (amt<50000) amt=50000;
- }
- else amt = (255 & ivenarg[j]) * 100;
- lprintf("\nI can see this is an excellent stone, It is worth %d",(long)amt);
- lprcat("\nWould you like to sell it to us? "); yrepcount=0;
- if (getyn()=='y') { lprcat("yes\n"); c[GOLD]+=amt; iven[j]=0; }
- else lprcat("no thank you.\n");
- if (gemstone==OLARNEYE) lprcat("It is, of course, your privilege to keep the stone\n");
- }
- else lprcat("no\nO. K.\n");
+ int gemstone;
+{
+ int j, amt;
+
+ for (j = 0; j < 26; j++)
+ if (iven[j] == gemstone) {
+ lprintf("\nI see you have %s", objectname[gemstone]);
+ if (gemstone == OLARNEYE)
+ lprcat(" I must commend you. I didn't think\nyou could get it.");
+ lprcat(" Shall I appraise it for you? ");
+ yrepcount = 0;
+ if (getyn() == 'y') {
+ lprcat("yes.\n Just one moment please \n");
+ nap(1000);
+ if (gemstone == OLARNEYE) {
+ amt = 250000 - ((gltime * 7) / 100) * 100;
+ if (amt < 50000)
+ amt = 50000;
+ } else
+ amt = (255 & ivenarg[j]) * 100;
+ lprintf("\nI can see this is an excellent stone, It is worth %d", (long) amt);
+ lprcat("\nWould you like to sell it to us? ");
+ yrepcount = 0;
+ if (getyn() == 'y') {
+ lprcat("yes\n");
+ c[GOLD] += amt;
+ iven[j] = 0;
+ } else
+ lprcat("no thank you.\n");
+ if (gemstone == OLARNEYE)
+ lprcat("It is, of course, your privilege to keep the stone\n");
+ } else
+ lprcat("no\nO. K.\n");
}
- }
+}
+
/*
- function for the trading post
+ * function for the trading post
*/
-static otradhead()
- {
- clear();
+static void
+otradhead()
+{
+ clear();
lprcat("Welcome to the Larn Trading Post. We buy items that explorers no longer find\n");
- lprcat("useful. Since the condition of the items you bring in is not certain,\n");
- lprcat("and we incur great expense in reconditioning the items, we usually pay\n");
- lprcat("only 20% of their value were they to be new. If the items are badly\n");
+ lprcat("useful. Since the condition of the items you bring in is not certain,\n");
+ lprcat("and we incur great expense in reconditioning the items, we usually pay\n");
+ lprcat("only 20% of their value were they to be new. If the items are badly\n");
lprcat("damaged, we will pay only 10% of their new value.\n\n");
- }
+}
+void
otradepost()
- {
- register int i,j,value,isub,izarg;
- dnditm = dndcount = 0;
- nosignal = 1; /* disable signals */
- resetscroll(); otradhead();
- while (1)
- {
- lprcat("\nWhat item do you want to sell to us ["); standout("*");
- lprcat(" for list, or "); standout("escape"); lprcat("] ? ");
- i=0; while (i>'z' || (i<'a' && i!='*' && i!='\33' && i!='.')) i=getchar();
- if (i == '\33')
- { setscroll(); recalc(); drawscreen(); nosignal=0; /* enable signals */ return; }
- isub = i - 'a'; j=0;
- if (iven[isub]==OSCROLL) if (scrollname[ivenarg[isub]][0]==0)
- { j=1; cnsitm(); } /* can't sell unidentified item */
- if (iven[isub]==OPOTION) if (potionname[ivenarg[isub]][0]==0)
- { j=1; cnsitm(); } /* can't sell unidentified item */
- if (!j)
- if (i=='*') { clear(); qshowstr(); otradhead(); }
- else if (iven[isub]==0) lprintf("\nYou don't have item %c!",isub+'a');
- else
- {
- for (j=0; j<maxitm; j++)
- if ((itm[j].obj == iven[isub]) || (iven[isub] == ODIAMOND) || (iven[isub] == ORUBY) || (iven[isub] == OEMERALD) || (iven[isub] == OSAPPHIRE))
- {
- srcount=0; show3(isub); /* show what the item was */
- if ((iven[isub] == ODIAMOND) || (iven[isub] == ORUBY)
- || (iven[isub] == OEMERALD) || (iven[isub] == OSAPPHIRE))
- value = 20*ivenarg[isub];
- else
- if ((itm[j].obj == OSCROLL) || (itm[j].obj == OPOTION)) value = 2*itm[j+ivenarg[isub]].price;
- else
- {
- izarg=ivenarg[isub]; value = itm[j].price; /* appreciate if a +n object */
- if (izarg >= 0) value *= 2;
- while ((izarg-- > 0) && ((value=14*(67+value)/10) < 500000));
- }
- lprintf("\nItem (%c) is worth %d gold pieces to us. Do you want to sell it? ",i,(long)value);
- yrepcount=0;
- if (getyn()=='y')
- {
- lprcat("yes\n"); c[GOLD]+=value;
- if (c[WEAR] == isub) c[WEAR] = -1;
- if (c[WIELD] == isub) c[WIELD] = -1;
- if (c[SHIELD] == isub) c[SHIELD] = -1;
- adjustcvalues(iven[isub],ivenarg[isub]);
- iven[isub]=0;
- }
- else lprcat("no thanks.\n");
- j = maxitm+100; /* get out of the inner loop */
+{
+ int i, j, value, isub, izarg;
+
+ dnditm = dndcount = 0;
+ nosignal = 1; /* disable signals */
+ resetscroll();
+ otradhead();
+ while (1) {
+ lprcat("\nWhat item do you want to sell to us [");
+ lstandout("*");
+ lprcat(" for list, or ");
+ lstandout("escape");
+ lprcat("] ? ");
+ i = 0;
+ while (i > 'z' || (i < 'a' && i != '*' && i != '\33' && i != '.'))
+ i = lgetchar();
+ if (i == '\33') {
+ setscroll();
+ recalc();
+ drawscreen();
+ nosignal = 0; /* enable signals */
+ return;
+ }
+ isub = i - 'a';
+ j = 0;
+ if (iven[isub] == OSCROLL)
+ if (scrollname[ivenarg[isub]][0] == 0) {
+ j = 1;
+ cnsitm();
+ } /* can't sell unidentified item */
+ if (iven[isub] == OPOTION)
+ if (potionname[ivenarg[isub]][0] == 0) {
+ j = 1;
+ cnsitm();
+ } /* can't sell unidentified item */
+ if (!j) {
+ if (i == '*') {
+ clear();
+ qshowstr();
+ otradhead();
+ } else if (iven[isub] == 0)
+ lprintf("\nYou don't have item %c!", isub + 'a');
+ else {
+ for (j = 0; j < maxitm; j++)
+ if ((itm[j].obj == iven[isub]) || (iven[isub] == ODIAMOND) || (iven[isub] == ORUBY) || (iven[isub] == OEMERALD) || (iven[isub] == OSAPPHIRE)) {
+ srcount = 0;
+ show3(isub); /* show what the item
+ * was */
+ if ((iven[isub] == ODIAMOND) || (iven[isub] == ORUBY)
+ || (iven[isub] == OEMERALD) || (iven[isub] == OSAPPHIRE))
+ value = 20 * ivenarg[isub];
+ else if ((itm[j].obj == OSCROLL) || (itm[j].obj == OPOTION))
+ value = 2 * itm[j + ivenarg[isub]].price;
+ else {
+ izarg = ivenarg[isub];
+ value = itm[j].price; /* appreciate if a +n
+ * object */
+ if (izarg >= 0)
+ value *= 2;
+ while ((izarg-- > 0) && ((value = 14 * (67 + value) / 10) < 500000));
+ }
+ lprintf("\nItem (%c) is worth %d gold pieces to us. Do you want to sell it? ", i, (long) value);
+ yrepcount = 0;
+ if (getyn() == 'y') {
+ lprcat("yes\n");
+ c[GOLD] += value;
+ if (c[WEAR] == isub)
+ c[WEAR] = -1;
+ if (c[WIELD] == isub)
+ c[WIELD] = -1;
+ if (c[SHIELD] == isub)
+ c[SHIELD] = -1;
+ adjustcvalues(iven[isub], ivenarg[isub]);
+ iven[isub] = 0;
+ } else
+ lprcat("no thanks.\n");
+ j = maxitm + 100; /* get out of the inner
+ * loop */
+ }
+ if (j <= maxitm + 2)
+ lprcat("\nSo sorry, but we are not authorized to accept that item.");
}
- if (j <= maxitm+2) lprcat("\nSo sorry, but we are not authorized to accept that item.");
}
}
- }
+}
+void
cnsitm()
- { lprcat("\nSorry, we can't accept unidentified objects."); }
+{
+ lprcat("\nSorry, we can't accept unidentified objects.");
+}
/*
* for the Larn Revenue Service
*/
+void
olrs()
- {
- register int i,first;
- unsigned long amt;
- first = nosignal = 1; /* disable signals */
- clear(); resetscroll(); cursor(1,4);
+{
+ int i, first;
+ unsigned long amt;
+
+ first = nosignal = 1; /* disable signals */
+ clear();
+ resetscroll();
+ cursor(1, 4);
lprcat("Welcome to the Larn Revenue Service district office. How can we help you?");
- while (1)
- {
- if (first) { first=0; goto nxt; }
+ while (1) {
+ if (first) {
+ first = 0;
+ goto nxt;
+ }
cursors();
lprcat("\n\nYour wish? [(");
- standout("p");
+ lstandout("p");
lprcat(") pay taxes, or ");
- standout("escape");
- lprcat("] "); yrepcount=0;
- i=0; while (i!='p' && i!='\33') i=getchar();
- switch(i)
- {
- case 'p': lprcat("pay taxes\nHow much? "); amt = readnum((long)c[GOLD]);
- if (amt<0) { lprcat("\nSorry, but we can't take negative gold\n"); amt=0; } else
- if (amt>c[GOLD]) lprcat(" You don't have that much.\n");
- else c[GOLD] -= paytaxes((long)amt);
- break;
-
- case '\33': nosignal = 0; /* enable signals */
- setscroll(); drawscreen(); return;
- };
-
-nxt: cursor(1,6);
- if (outstanding_taxes>0)
- lprintf("You presently owe %d gp in taxes. ",(long)outstanding_taxes);
+ lstandout("escape");
+ lprcat("] ");
+ yrepcount = 0;
+ i = 0;
+ while (i != 'p' && i != '\33')
+ i = lgetchar();
+ switch (i) {
+ case 'p':
+ lprcat("pay taxes\nHow much? ");
+ amt = readnum((long) c[GOLD]);
+ if (amt < 0) {
+ lprcat("\nSorry, but we can't take negative gold\n");
+ amt = 0;
+ } else if (amt > c[GOLD])
+ lprcat(" You don't have that much.\n");
+ else
+ c[GOLD] -= paytaxes((long) amt);
+ break;
+
+ case '\33':
+ nosignal = 0; /* enable signals */
+ setscroll();
+ drawscreen();
+ return;
+ };
+
+nxt: cursor(1, 6);
+ if (outstanding_taxes > 0)
+ lprintf("You presently owe %d gp in taxes. ", (long) outstanding_taxes);
else
- lprcat("You do not owe us any taxes. ");
- cursor(1,8);
- if (c[GOLD]>0)
- lprintf("You have %6d gp. ",(long)c[GOLD]);
+ lprcat("You do not owe us any taxes. ");
+ cursor(1, 8);
+ if (c[GOLD] > 0)
+ lprintf("You have %6d gp. ", (long) c[GOLD]);
else
lprcat("You have no gold pieces. ");
- }
}
+}
diff --git a/games/larn/tok.c b/games/larn/tok.c
index 32aca694aee..f295bab2b76 100644
--- a/games/larn/tok.c
+++ b/games/larn/tok.c
@@ -1,223 +1,278 @@
-#ifndef lint
-static char rcsid[] = "$NetBSD: tok.c,v 1.4 1995/04/24 12:24:14 cgd Exp $";
-#endif /* not lint */
+/* $OpenBSD: tok.c,v 1.2 1998/09/15 05:12:33 pjanzen Exp $ */
+/* $NetBSD: tok.c,v 1.5 1997/10/18 20:03:54 christos Exp $ */
/* tok.c Larn is copyrighted 1986 by Noah Morgan. */
+#ifndef lint
+static char rcsid[] = "$OpenBSD: tok.c,v 1.2 1998/09/15 05:12:33 pjanzen Exp $";
+#endif /* not lint */
+
#include <sys/types.h>
-#ifdef SYSV
-#include <fcntl.h>
-#include <termio.h>
-#else SYSV
+#include <string.h>
#include <sys/ioctl.h>
-#endif SYSV
+#include <stdlib.h>
+#include <unistd.h>
+#include <sys/wait.h>
#include "header.h"
-#include <string.h>
+#include "extern.h"
-static char lastok=0;
-int yrepcount=0,dayplay=0;
+static char lastok = 0;
+int yrepcount = 0, dayplay = 0;
#ifndef FLUSHNO
#define FLUSHNO 5
-#endif FLUSHNO
-static int flushno=FLUSHNO; /* input queue flushing threshold */
-#define MAXUM 52 /* maximum number of user re-named monsters */
-#define MAXMNAME 40 /* max length of a monster re-name */
-static char usermonster[MAXUM][MAXMNAME]; /* the user named monster name goes here */
-static char usermpoint=0; /* the user monster pointer */
+#endif /* FLUSHNO */
+static int flushno = FLUSHNO; /* input queue flushing threshold */
+#define MAXUM 52 /* maximum number of user re-named monsters */
+#define MAXMNAME 40 /* max length of a monster re-name */
+static char usermonster[MAXUM][MAXMNAME]; /* the user named monster
+ * name goes here */
+static u_char usermpoint = 0; /* the user monster pointer */
/*
lexical analyzer for larn
*/
+int
yylex()
- {
- char cc;
- int ic;
- if (hit2flag) { hit2flag=0; yrepcount=0; return(' '); }
- if (yrepcount>0) { --yrepcount; return(lastok); } else yrepcount=0;
- if (yrepcount==0) { bottomdo(); showplayer(); } /* show where the player is */
- lflush();
- while (1)
- {
+{
+ char cc;
+ int ic;
+
+ if (hit2flag) {
+ hit2flag = 0;
+ yrepcount = 0;
+ return (' ');
+ }
+ if (yrepcount > 0) {
+ --yrepcount;
+ return (lastok);
+ } else
+ yrepcount = 0;
+ if (yrepcount == 0) {
+ bottomdo();
+ showplayer();
+ } /* show where the player is */
+ lflush();
+ while (1) {
c[BYTESIN]++;
if (ckpflag)
- if ((c[BYTESIN] % 400) == 0) /* check for periodic checkpointing */
- {
+ if ((c[BYTESIN] % 400) == 0) { /* check for periodic
+ * checkpointing */
#ifndef DOCHECKPOINTS
- savegame(ckpfile);
+ savegame(ckpfile);
#else
- wait(0); /* wait for other forks to finish */
- if (fork() == 0) { savegame(ckpfile); exit(); }
+ wait(0); /* wait for other forks to
+ * finish */
+ if (fork() == 0) {
+ savegame(ckpfile);
+ exit();
+ }
#endif
#ifdef TIMECHECK
- if (dayplay==0)
- if (playable())
- {
- cursor(1,19);
- lprcat("\nSorry, but it is now time for work. Your game has been saved.\n"); beep();
- lflush(); savegame(savefilename); wizard=nomove=1; sleep(4);
- died(-257);
- }
-#endif TIMECHECK
-
- }
+ if (dayplay == 0)
+ if (playable()) {
+ cursor(1, 19);
+ lprcat("\nSorry, but it is now time for work. Your game has been saved.\n");
+ lbeep();
+ lflush();
+ savegame(savefilename);
+ wizard = nomove = 1;
+ sleep(4);
+ died(-257);
+ }
+#endif /* TIMECHECK */
- do /* if keyboard input buffer is too big, flush some of it */
- {
- ioctl(0,FIONREAD,&ic);
- if (ic>flushno) read(0,&cc,1);
}
- while (ic>flushno);
+ do { /* if keyboard input buffer is too big, flush
+ * some of it */
+ ioctl(0, FIONREAD, &ic);
+ if (ic > flushno)
+ read(0, &cc, 1);
+ }
+ while (ic > flushno);
- if (read(0,&cc,1) != 1) return(lastok = -1);
+ if (read(0, &cc, 1) != 1)
+ return (lastok = -1);
- if (cc == 'Y'-64) /* control Y -- shell escape */
- {
- resetscroll(); clear(); /* scrolling region, home, clear, no attributes */
- if ((ic=fork())==0) /* child */
- {
- execl("/bin/csh",0); exit();
- }
+ if (cc == 'Y' - 64) { /* control Y -- shell escape */
+ resetscroll();
+ clear();/* scrolling region, home, clear, no
+ * attributes */
+ if ((ic = fork()) == 0) { /* child */
+ execl("/bin/csh", 0);
+ exit(1);
+ }
wait(0);
- if (ic<0) /* error */
- {
- write(2,"Can't fork off a shell!\n",25); sleep(2);
- }
-
- setscroll();
- return(lastok = 'L'-64); /* redisplay screen */
+ if (ic < 0) { /* error */
+ write(2, "Can't fork off a shell!\n", 25);
+ sleep(2);
}
-
- if ((cc <= '9') && (cc >= '0'))
- { yrepcount = yrepcount*10 + cc - '0'; }
- else { if (yrepcount>0) --yrepcount; return(lastok = cc); }
+ setscroll();
+ return (lastok = 'L' - 64); /* redisplay screen */
+ }
+ if ((cc <= '9') && (cc >= '0')) {
+ yrepcount = yrepcount * 10 + cc - '0';
+ } else {
+ if (yrepcount > 0)
+ --yrepcount;
+ return (lastok = cc);
}
}
+}
/*
- * flushall() Function to flush all type-ahead in the input buffer
+ * flushall() Function to flush all type-ahead in the input buffer
*/
+void
flushall()
- {
- char cc;
- int ic;
- for (;;) /* if keyboard input buffer is too big, flush some of it */
- {
- ioctl(0,FIONREAD,&ic);
- if (ic<=0) return;
- while (ic>0) { read(0,&cc,1); --ic; } /* gobble up the byte */
- }
+{
+ char cc;
+ int ic;
+
+ for (;;) { /* if keyboard input buffer is too big, flush
+ * some of it */
+ ioctl(0, FIONREAD, &ic);
+ if (ic <= 0)
+ return;
+ while (ic > 0) {
+ read(0, &cc, 1);
+ --ic;
+ } /* gobble up the byte */
}
+}
/*
- function to set the desired hardness
- enter with hard= -1 for default hardness, else any desired hardness
+ * function to set the desired hardness
+ * enter with hard= -1 for default hardness, else any desired hardness
*/
+void
sethard(hard)
- int hard;
- {
- register int j,k,i;
- j=c[HARDGAME]; hashewon();
- if (restorflag==0) /* don't set c[HARDGAME] if restoring game */
- {
- if (hard >= 0) c[HARDGAME]= hard;
+ int hard;
+{
+ int j, k, i;
+
+ j = c[HARDGAME];
+ hashewon();
+ if (restorflag == 0) { /* don't set c[HARDGAME] if restoring game */
+ if (hard >= 0)
+ c[HARDGAME] = hard;
+ } else
+ c[HARDGAME] = j;/* set c[HARDGAME] to proper value if
+ * restoring game */
+
+ if ((k = c[HARDGAME]) != 0)
+ for (j = 0; j <= MAXMONST + 8; j++) {
+ i = ((6 + k) * monster[j].hitpoints + 1) / 6;
+ monster[j].hitpoints = (i < 0) ? 32767 : i;
+ i = ((6 + k) * monster[j].damage + 1) / 5;
+ monster[j].damage = (i > 127) ? 127 : i;
+ i = (10 * monster[j].gold) / (10 + k);
+ monster[j].gold = (i > 32767) ? 32767 : i;
+ i = monster[j].armorclass - k;
+ monster[j].armorclass = (i < -127) ? -127 : i;
+ i = (7 * monster[j].experience) / (7 + k) + 1;
+ monster[j].experience = (i <= 0) ? 1 : i;
}
- else c[HARDGAME]=j; /* set c[HARDGAME] to proper value if restoring game */
-
- if (k=c[HARDGAME])
- for (j=0; j<=MAXMONST+8; j++)
- {
- i = ((6+k)*monster[j].hitpoints+1)/6;
- monster[j].hitpoints = (i<0) ? 32767 : i;
- i = ((6+k)*monster[j].damage+1)/5;
- monster[j].damage = (i>127) ? 127 : i;
- i = (10*monster[j].gold)/(10+k);
- monster[j].gold = (i>32767) ? 32767 : i;
- i = monster[j].armorclass - k;
- monster[j].armorclass = (i< -127) ? -127 : i;
- i = (7*monster[j].experience)/(7+k) + 1;
- monster[j].experience = (i<=0) ? 1 : i;
- }
- }
+}
/*
function to read and process the larn options file
*/
+void
readopts()
- {
- register char *i;
- register int j,k;
- int flag;
- flag=1; /* set to 0 if he specifies a name for his character */
- if (lopen(optsfile) < 0)
- {
- strcpy(logname,loginname); return; /* user name if no character name */
- }
+{
+ char *i;
+ int j, k;
+ int flag;
+
+ flag = 1; /* set to 0 if he specifies a name for his
+ * character */
+ if (lopen(optsfile) < 0) {
+ strcpy(logname, loginname);
+ return; /* user name if no character name */
+ }
i = " ";
- while (*i)
- {
- if ((i=(char *)lgetw()) == 0) break; /* check for EOF */
- while ((*i==' ') || (*i=='\t')) i++; /* eat leading whitespace */
- switch(*i)
- {
- case 'b': if (strcmp(i,"bold-objects") == 0) boldon=1;
- break;
+ while (*i) {
+ if ((i = (char *) lgetw()) == 0)
+ break; /* check for EOF */
+ while ((*i == ' ') || (*i == '\t'))
+ i++; /* eat leading whitespace */
+ switch (*i) {
+ case 'b':
+ if (strcmp(i, "bold-objects") == 0)
+ boldon = 1;
+ break;
- case 'e': if (strcmp(i,"enable-checkpointing") == 0) ckpflag=1;
- break;
+ case 'e':
+ if (strcmp(i, "enable-checkpointing") == 0)
+ ckpflag = 1;
+ break;
- case 'i': if (strcmp(i,"inverse-objects") == 0) boldon=0;
- break;
+ case 'i':
+ if (strcmp(i, "inverse-objects") == 0)
+ boldon = 0;
+ break;
- case 'f': if (strcmp(i,"female") == 0) sex=0; /* male or female */
- break;
+ case 'f':
+ if (strcmp(i, "female") == 0)
+ sex = 0; /* male or female */
+ break;
- case 'm': if (strcmp(i,"monster:")== 0) /* name favorite monster */
- {
- if ((i=lgetw())==0) break;
- if (strlen(i)>=MAXMNAME) i[MAXMNAME-1]=0;
- strcpy(usermonster[usermpoint],i);
- if (usermpoint >= MAXUM) break; /* defined all of em */
- if (isalpha(j=usermonster[usermpoint][0]))
- {
- for (k=1; k<MAXMONST+8; k++) /* find monster */
- if (monstnamelist[k] == j)
- {
- monster[k].name = &usermonster[usermpoint++][0];
- break;
- }
- }
- }
- else if (strcmp(i,"male") == 0) sex=1;
+ case 'm':
+ if (strcmp(i, "monster:") == 0) { /* name favorite monster */
+ if ((i = lgetw()) == 0)
break;
-
- case 'n': if (strcmp(i,"name:") == 0) /* defining players name */
- {
- if ((i=lgetw())==0) break;
- if (strlen(i)>=LOGNAMESIZE) i[LOGNAMESIZE-1]=0;
- strcpy(logname,i); flag=0;
+ if (strlen(i) >= MAXMNAME)
+ i[MAXMNAME - 1] = 0;
+ strcpy(usermonster[usermpoint], i);
+ if (usermpoint >= MAXUM)
+ break; /* defined all of em */
+ if (isalpha(j = usermonster[usermpoint][0])) {
+ for (k = 1; k < MAXMONST + 8; k++) /* find monster */
+ if (monstnamelist[k] == j) {
+ monster[k].name = &usermonster[usermpoint++][0];
+ break;
}
- else if (strcmp(i,"no-introduction") == 0) nowelcome=1;
- else if (strcmp(i,"no-beep") == 0) nobeep=1;
+ }
+ } else if (strcmp(i, "male") == 0)
+ sex = 1;
+ break;
+
+ case 'n':
+ if (strcmp(i, "name:") == 0) { /* defining players name */
+ if ((i = lgetw()) == 0)
break;
+ if (strlen(i) >= LOGNAMESIZE)
+ i[LOGNAMESIZE - 1] = 0;
+ strcpy(logname, i);
+ flag = 0;
+ } else if (strcmp(i, "no-introduction") == 0)
+ nowelcome = 1;
+ else if (strcmp(i, "no-beep") == 0)
+ nobeep = 1;
+ break;
- case 'p': if (strcmp(i,"process-name:")== 0)
- {
- if ((i=lgetw())==0) break;
- if (strlen(i)>=PSNAMESIZE) i[PSNAMESIZE-1]=0;
- strcpy(psname,i);
- }
- else if (strcmp(i,"play-day-play") == 0) dayplay=1;
+ case 'p':
+ if (strcmp(i, "process-name:") == 0) {
+ if ((i = lgetw()) == 0)
break;
+ if (strlen(i) >= PSNAMESIZE)
+ i[PSNAMESIZE - 1] = 0;
+ strcpy(psname, i);
+ } else if (strcmp(i, "play-day-play") == 0)
+ dayplay = 1;
+ break;
- case 's': if (strcmp(i,"savefile:") == 0) /* defining savefilename */
- {
- if ((i=lgetw())==0) break;
- strcpy(savefilename,i); flag=0;
- }
+ case 's':
+ if (strcmp(i, "savefile:") == 0) { /* defining savefilename */
+ if ((i = lgetw()) == 0)
break;
+ strcpy(savefilename, i);
+ flag = 0;
+ }
+ break;
};
- }
- if (flag) strcpy(logname,loginname);
}
-
+ if (flag)
+ strcpy(logname, loginname);
+}