Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

PC/IX Hack (5 of 5)

4 views
Skip to first unread message

pet...@pbear.uucp

unread,
May 28, 1985, 6:07:00 PM5/28/85
to

#!/bin/sh
# This is a shell archive, meaning:
# 1. Remove everything above the #!/bin/sh line.
# 2. Save the resulting text in a file.
# 3. Execute the file with /bin/sh (not csh) to create the files:
# hack.str.c
# hack.vars.h
# hack.weapons.h
# hack.worm.c
# mklev.c
# mklev.make.c
# mklev.mkobj.c
# mklev.svlev.c
# rnd.c
# show.c
# string.s
# This archive created: Tue May 28 17:53:52 1985
export PATH; PATH=/bin:$PATH
echo shar: extracting "'hack.str.c'" '(2444 characters)'
if test -f 'hack.str.c'
then
echo shar: over-writing existing file "'hack.str.c'"
fi
sed 's/^X//' << \SHAR_EOF > 'hack.str.c'
X/*
X * Hack.str.c
X */
X
X/*
X * strprint() : Cheap alternative for sprintf() and printf(), by
X * Fred and Michiel. If you want the normal io just define NORMAL_IO
X */
X
X
X#include "hack.h"
X
X#ifndef NORMAL_IO
X
X#define ARINDEX 512
Xstatic char output_buffer[ARINDEX];
Xstatic arcount = 0;
X
Xchar *litoa();
X
X/*VARARGS10*/
Xstrprint( dest, src, argptr )
Xregister char *dest, *src;
Xregister int *argptr;
X{
X register kar;
X register char *string;
X register field;
X int negated;
X int printflag = 0;
X static char extra[512];
X
X if ( dest == STDOUT ) {
X dest = extra;
X printflag++;
X }
X
X while( *src ) {
X if ( *src == '%' ) {
X field = 0;
X negated = 0;
X if ( *++src == '-' )
X ++negated;
X else
X --src;
X while( *++src & 060 && *src <= '9' )
X field = 10*field + ( *src & 017 );
X if ( (kar = *src) == '%' )
X *dest++ = '%';
X else if ( kar == 'c' )
X *dest++ = (char)*argptr++;
X else {
X switch ( kar ) {
X
X case 'd' :
X case 'u' :
X string = litoa((long)(*argptr++));
X break;
X case 'l' :
X kar = *(++src);
X string = litoa( *(((long*) argptr)++) );
X break;
X case 's' :
X string = (char *)(*argptr++);
X break;
X default :
X strcpy( string, "%'" );
X }
X if ( field )
X field -= strlen( string );
X if ( field > 0 && !negated )
X while( --field >= 0 )
X *dest++ = ' ';
X while( *dest++ = *string++ )
X ;
X dest--; /* Remove '\0' character */
X if ( field > 0 && negated )
X while( --field >= 0 )
X *dest++ = ' ';
X }
X src++;
X }
X else
X *dest++ = *src++;
X }
X *dest = 0;
X if ( printflag ) {
X WRITE( extra, strlen(extra) );
X }
X}
X
Xchar *
Xlitoa( l_arg )
Xlong l_arg;
X{
X static char string[20];
X register int i = 0;
X register char *str2 = string;
X char pipo[20];
X
X if ( !l_arg )
X return( "0" );
X if ( l_arg < 0L ) {
X *str2++ = '-';
X l_arg = -l_arg;
X }
X
X while( l_arg ) {
X pipo[i++] = (int)( l_arg % 10L + '0');
X l_arg /= 10L;
X }
X while( --i >= 0 ) /* Michiel */
X *str2++ = pipo[i];
X *str2 = '\0';
X return( string );
X}
X
XWRITE( string , length )
Xregister char *string;
Xregister length;
X{
X if ( arcount + length >= ARINDEX )
X flush();
X strcat( output_buffer, string );
X arcount += length;
X}
X
Xflush()
X{
X write( 1, output_buffer, arcount );
X arcount = 0;
X output_buffer[0] = 0;
X}
X
Xputchar ( c )
X{
X WRITE( &c, 1 );
X}
X
Xprintf( fmt, args )
X{
X strprint( STDOUT, fmt, &args );
X}
X
Xsprintf( buffer, fmt, args )
X{
X strprint( buffer, fmt, &args );
X}
X#endif NORMAL_IO
SHAR_EOF
if test 2444 -ne "`wc -c 'hack.str.c'`"
then
echo shar: error transmitting "'hack.str.c'" '(should have been 2444 characters)'
fi
echo shar: extracting "'hack.vars.h'" '(2824 characters)'
if test -f 'hack.vars.h'
then
echo shar: over-writing existing file "'hack.vars.h'"
fi
sed 's/^X//' << \SHAR_EOF > 'hack.vars.h'
X/*
X * Hack.vars.h
X */
X
X#define SIZE(x) (sizeof x)/(sizeof x[0])
X
Xchar NOTHIN[] = "Nothing Happens",
X WCLEV[] = "Welcome to level %d.",
X STOPGLOW[] = "Your hands stop glowing blue.",
X UMISS[] = "You miss %s.";
X
X
Xchar *traps[] = {
X " bear trap",
X "n arrow trap",
X " dart trap",
X " trapdoor",
X " teleportation trap",
X " pit",
X " sleeping gas trap",
X " piercer",
X " mimic"
X};
X
X#include "hack.foods.h"
X#include "hack.armors.h"
X#include "hack.weapons.h"
X
Xchar *pottyp[] = {
X "restore strength",
X "confuse monster",
X "invisibility",
X "fruit juice",
X "healing",
X "paralysis",
X "monster detection",
X "object detection",
X "sickness",
X "confusion",
X "gain strength",
X "speed",
X "blindness",
X "gain level",
X "extra healing"
X};
X
X
X
Xchar *potcol[] = {
X "ebony",
X "magenta",
X "clear",
X "brilliant blue",
X "sky blue",
X "emerald",
X "dark green",
X "ruby",
X "purple-red",
X "swirly",
X "white",
X "yellow",
X "purple",
X "puce",
X "pink",
X "smokey",
X "glowing",
X "bubbly",
X "orange"
X};
X
Xchar *potcall[SIZE (pottyp)];
X
X /* SCROLLS */
X
Xchar *scrtyp[] = {
X "enchant armor",
X "losing",
X "curse levels",
X "remove curse",
X "enchant weapon",
X "create monster",
X "damage weapon",
X "genocide",
X "destroy armor",
X "light",
X "transportation",
X "gold detection",
X "identify",
X "magic mapping",
X "fire"
X};
X
X
Xchar *scrnam[] = {
X "VELOX NEB",
X "FOOBIE BLETCH",
X "TEMOV",
X "GARVEN DEH",
X "ZELGO MER",
X "ANDOVA BEGARIN",
X "ELAM EBOW",
X "KERNOD WEL",
X "THARR",
X "VENZAR BORGAVVE",
X /* "ELBIB YLOH", */
X "VERR YED HORRE",
X "JUYED AWK YACC",
X "HACKEM MUCHE",
X "LEP GEX VEN ZEA",
X "DAIYEN FOOELS"
X};
Xchar *scrcall[SIZE (scrtyp)];
X
X
X /* WANDS */
X
Xchar *wantyp[] = {
X "light",
X "secret door + trap detection",
X "create monster",
X "exhaustion",
X "slow monster",
X "speed monster",
X "undead turning",
X "polymorph",
X "cancellation",
X "teleport monster",
X "digging",
X "magic missile",
X "fire",
X "sleep",
X "cold",
X "death",
X "confusion",
X "door closing"
X};
X
X
Xchar *wannam[] = {
X "oak",
X "ebony",
X "runed",
X "long",
X "short",
X "curved",
X "steel",
X "aluminium",
X "iron",
X "marble",
X "pine",
X "maple",
X "brass",
X "silver",
X "copper",
X "balsa",
X "zinc",
X "platinum"
X};
Xchar *wandcall[SIZE (wantyp)];
X
X
X /* RINGS */
X
Xchar *ringtyp[] = {
X "adornment",
X "teleportation",
X "regeneration",
X "searching",
X "see invisible",
X "stealth",
X "floating",
X "poison resistance",
X "aggravate monster",
X "hunger",
X "fire resistance",
X "cold resistance",
X "protection from shape-changers",
X "gain strength",
X "increase damage",
X "protection"
X};
X
X
Xchar *rinnam[] = {
X "blackened",
X /* "ivory", */
X "granite",
X "silver",
X "ruby",
X "jade",
X "diamond",
X "copper",
X "gold",
X "shining",
X "tiger eye",
X "agate",
X "moonstone",
X "sapphire",
X "pearl",
X "topaz",
X /* "black onix", */
X "wired"
X};
X
Xchar *ringcall[SIZE (ringtyp)], oiden[40], oldux, olduy;
SHAR_EOF
if test 2824 -ne "`wc -c 'hack.vars.h'`"
then
echo shar: error transmitting "'hack.vars.h'" '(should have been 2824 characters)'
fi
echo shar: extracting "'hack.weapons.h'" '(537 characters)'
if test -f 'hack.weapons.h'
then
echo shar: over-writing existing file "'hack.weapons.h'"
fi
sed 's/^X//' << \SHAR_EOF > 'hack.weapons.h'
X/*
X * Hack.weapons.h
X */
X
X/*
X * weapons 0-4 come several at a time
X * weapons 0-2 are shot using 11-13
X */
X
Xstruct weapon weapons[] = {
X { "arrow", 7, 6, 6 },
X { "sling bullet", 7, 4, 6 },
X { "crossbow bolt", 7, 4, 6 },
X { "dart", 7, 3, 2 },
X { "mace", 7, 6, 6 },
X { "axe", 7, 6, 4 },
X { "flail", 7, 6, 4 },
X { "long sword", 9, 8,12 },
X { "two handed sword", 7,10, 6 },
X { "dagger", 7, 4, 3 },
X { "spear", 7, 6, 8 },
X { "bow", 7, 4, 6 },
X { "sling", 7, 6, 6 },
X { "crossbow", 7, 4, 6 },
X { "PROG ERROR", 100, 0, 0 }
X };
SHAR_EOF
if test 537 -ne "`wc -c 'hack.weapons.h'`"
then
echo shar: error transmitting "'hack.weapons.h'" '(should have been 537 characters)'
fi
echo shar: extracting "'hack.worm.c'" '(3953 characters)'
if test -f 'hack.worm.c'
then
echo shar: over-writing existing file "'hack.worm.c'"
fi
sed 's/^X//' << \SHAR_EOF > 'hack.worm.c'
X/*
X * Hack.worm.c
X */
X
X#include "hack.h"
X
X/* Linked list, tail first */
XWORMSEGMENT wsegs[32], wheads[32];
X
Xunsigned wgrowtime[32];
X
Xgetwn (mtmp)
XMONSTER mtmp;
X{
X register tmp;
X
X for (tmp = 1; tmp < 32; tmp++)
X if (!wsegs[tmp]) {
X mtmp -> wormno = tmp;
X return 1;
X }
X return 0; /* Level infested with worms */
X}
X
Xinitworm (mtmp)
XMONSTER mtmp;
X{
X register WORMSEGMENT wtmp;
X register tmp = mtmp -> wormno;
X
X if (!tmp)
X return;
X wheads[tmp] = wsegs[tmp] = wtmp = newseg ();
X wgrowtime[tmp] = 0;
X wtmp -> wx = mtmp -> mx;
X wtmp -> wy = mtmp -> my;
X wtmp -> nseg = 0;
X}
X
Xworm_move (mtmp)
XMONSTER mtmp;
X{
X register WORMSEGMENT wtmp, whd;
X register tmp = mtmp -> wormno;
X
X wtmp = newseg ();
X wtmp -> wx = mtmp -> mx;
X wtmp -> wy = mtmp -> my;
X wtmp -> nseg = 0;
X whd = wheads[tmp];
X whd -> nseg = wtmp;
X wheads[tmp] = wtmp;
X seeatl (whd -> wx, whd -> wy, '~');
X if (wgrowtime[tmp] <= moves) {
X if (!wgrowtime[tmp])
X wgrowtime[tmp] = moves + rnd (5);
X else
X wgrowtime[tmp] += 2 + rnd (15);
X mtmp -> orig_hp++;
X mtmp -> mhp++;
X return;
X }
X whd = wsegs[tmp];
X wsegs[tmp] = whd -> nseg;
X remseg (whd);
X}
X
Xworm_nomove (mtmp)
Xregister MONSTER mtmp;
X{
X register tmp;
X register WORMSEGMENT wtmp;
X
X tmp = mtmp -> wormno;
X wtmp = wsegs[tmp];
X if (wtmp == wheads[tmp])
X return;
X wsegs[tmp] = wtmp -> nseg;
X remseg (wtmp);
X mtmp -> mhp--; /* Orig_hp not changed! */
X}
X
Xwormdead (mtmp)
Xregister MONSTER mtmp;
X{
X register tmp = mtmp -> wormno;
X register WORMSEGMENT wtmp, wtmp2;
X
X if (!tmp)
X return;
X for (wtmp = wsegs[tmp]; wtmp; wtmp = wtmp2) {
X wtmp2 = wtmp -> nseg;
X remseg (wtmp);
X }
X wsegs[tmp] = 0;
X}
X
Xwormhit (mtmp)
Xregister MONSTER mtmp;
X{
X register tmp = mtmp -> wormno;
X register MONSTDATA mdat = mtmp -> data;
X register WORMSEGMENT wtmp;
X
X if (!tmp)
X return; /* Worm without tail */
X for (wtmp = wsegs[tmp]; wtmp; wtmp = wtmp -> nseg)
X hitu (mdat -> mhd, 1, mdat -> mname);
X}
X
Xwormsee (tmp)
Xregister tmp;
X{
X register WORMSEGMENT wtmp;
X
X for (wtmp = wsegs[tmp]; wtmp -> nseg; wtmp = wtmp -> nseg)
X if (!cansee (wtmp -> wx, wtmp -> wy))
X levlsym (wtmp -> wx, wtmp -> wy, '~');
X}
X
Xcutworm (mtmp, x, y, weptyp)
Xregister MONSTER mtmp;
Xregister char x, y;
Xregister unsigned weptyp;
X{
X register WORMSEGMENT wtmp, wtmp2;
X register MONSTER mtmp2;
X register tmp, tmp2;
X
X if (mtmp -> mx == x && mtmp -> my == y)
X return; /* Hit headon */
X
X/* Cutting goes best with axe or sword */
X tmp = rnd (20);
X if (weptyp == 7 || weptyp == 8 || weptyp == 5)
X tmp += 5;
X if (tmp < 16)
X return;
X
X/* If tail then worm just loses a tail segment */
X tmp = mtmp -> wormno;
X wtmp = wsegs[tmp];
X if (wtmp -> wx == x && wtmp -> wy == y) {
X wsegs[tmp] = wtmp -> nseg;
X remseg (wtmp);
X return;
X }
X
X/* Cut the worm in two halves */
X mtmp2 = newmonst (0);
X *mtmp2 = *mtmp;
X
X/* Sometimes the tail end dies */
X if (rn2 (8) || !getwn (mtmp2)) {/* Michiel was rn2(3) */
X free (mtmp2);
X tmp2 = 0;
X }
X else {
X tmp2 = mtmp2 -> wormno;
X wsegs[tmp2] = wsegs[tmp];
X wgrowtime[tmp2] = 0;
X }
X do {
X if (wtmp -> nseg -> wx == x && wtmp -> nseg -> wy == y) {
X if (tmp2)
X wheads[tmp2] = wtmp;
X wsegs[tmp] = wtmp -> nseg -> nseg;
X remseg (wtmp -> nseg);
X wtmp -> nseg = 0;
X if (tmp2) {
X pline ("You cut the worm in half.");
X mtmp2 -> orig_hp = mtmp2 -> mhp =
X d (mtmp2 -> data -> mhd, 8);
X mtmp2 -> mx = wtmp -> wx;
X mtmp2 -> my = wtmp -> wy;
X mtmp2 -> nmon = fmon;
X fmon = mtmp2;
X pmon (mtmp2);
X }
X else {
X pline ("You cut off part of the worm's tail.");
X remseg (wtmp);
X }
X mtmp -> mhp >>= 1;
X return;
X }
X wtmp2 = wtmp -> nseg;
X if (!tmp2)
X remseg (wtmp);
X wtmp = wtmp2;
X } while (wtmp -> nseg);
X panic (CORE, "Cannot find worm segment");
X}
X
Xremseg (wtmp)
Xregister WORMSEGMENT wtmp;
X{
X levlsym (wtmp -> wx, wtmp -> wy, '~');
X free (wtmp);
X}
SHAR_EOF
if test 3953 -ne "`wc -c 'hack.worm.c'`"
then
echo shar: error transmitting "'hack.worm.c'" '(should have been 3953 characters)'
fi
echo shar: extracting "'mklev.c'" '(9468 characters)'
if test -f 'mklev.c'
then
echo shar: over-writing existing file "'mklev.c'"
fi
sed 's/^X//' << \SHAR_EOF > 'mklev.c'
X/*
X * Mklev.c
X */
X
X#define NORMAL_IO
X#include "hack.h"
X
Xchar *tfile, *tspe, **args, nul[20];
X
X#include "mklev.svlev.c"
X
Xchar mmon[8][8] = {
X "BGHJKLr",
X "aEhiOyZ",
X "AfNpQqv",
X "bCcgjkS",
X "FoRstWw",
X "dlMmTuY",
X "IUVXxz:",
X "De'n,P&"
X};
X
X#define MAZX ((rnd(37) << 1) + 1)
X#define MAZY ((rnd(8) << 1) + 1)
X
X#define somex() rn1( croom->hx - croom->lx + 1, croom->lx )
X#define somey() rn1( croom->hy - croom->ly + 1, croom->ly )
X
X#define NOT_HERE 0
X
XPART levl[80][22];
X
XMONSTER fmon;
XOBJECT fobj;
XGOLD_TRAP fgold, ftrap;
X
XMKROOM rooms[15], *croom, *troom;
X
XCOORDINATES doors[DOORMAX];
X
Xint doorindex = 0, nroom, comp ();
X
Xchar dlevel, *geno, goldseen,
X xdnstair, xupstair, ydnstair, yupstair,
X wizard, nxcor, x, y,
X dx, dy, tx, ty;
X /* For corridors and other things... */
X
X#define RUIN 5
X#define MAZE 6
X
Xmain (argc, argv)
Xchar *argv[];
X{
X char lowy, lowx;
X register unsigned tryct;
X
X if (argc < 6)
X panic ("Too few arguments!!");
X args = argv;
X tfile = argv[1];
X tspe = argv[2];
X dlevel = atoi (argv[3]);
X if (dlevel >= 30)
X dlevel = 30;
X geno = argv[4];
X wizard = (*argv[5] == 'w');
X srand (getpid ());
X/* for( lowy=2;lowy<19;lowy++) for( lowx=2;lowx<77;lowx++ )
X levl[lowx][lowy].typ = 0; * /
X
X/*
X * a: normal;
X * b: maze;
X * n: next level will be maze
X */
X if (*tspe == 'b') {
X makemaz ();
X savelev ();
X exit (1);
X }
X
X/* Construct the rooms */
X croom = rooms;
X tryct = 0;
X while (nroom < 7) {
X for (lowy = rn1 (3, 3); lowy < 15; lowy += rn1 (2, 4))
X for (lowx = rn1 (3, 4); lowx < 70; lowx +=
X rn1 (2, 7)) {
X if (++tryct > 10000) {
X printf ("tryct overflow\n");
X goto jumpout;
X }
X if ((lowy += rn1 (5, -2)) < 3)
X lowy = 3;
X else if (lowy > 16)
X lowy = 16;
X if (levl[lowx][lowy].typ)
X continue;
X if (maker (lowx, rn1 (9, lowx + 2), lowy,
X rn1 (4, lowy + 2)) && nroom > 13)
X goto jumpout;
X }
X }
Xjumpout:
X croom -> hx = -1;
X
X/* For each room: put things inside */
X for (croom = rooms; croom -> hx > 0; croom++) {
X
X/* Put a sleeping monster inside */
X if (!rn2 (3))
X makemon (1, somex (), somey ());
X
X/* Put traps and mimics inside */
X goldseen = 0;
X while (!rn2 (8 - (dlevel / 6)))
X mktrap (0, 0);
X if (!goldseen && !rn2 (3))
X mkgold (0, somex (), somey ());
X tryct = 0;
X if (!rn2 (3))
X do {
X mkobj (0);
X levl[fobj -> ox = somex ()][fobj -> oy = somey ()].scrsym = fobj -> olet;
X if (tryct++ > 100) {
X printf ("tryct overflow4\n");
X break;
X }
X } while (!rn2 (5));
X }
X tryct = 0;
X do {
X if (++tryct > 1000)
X panic ("Cannot make dnstairs\n");
X croom = &rooms[rn2 (nroom)];
X xdnstair = somex ();
X ydnstair = somey ();
X } while ((*tspe == 'n' &&
X (xdnstair % 2 == 0 || ydnstair % 2 == 0)) ||
X g_at (xdnstair, ydnstair, ftrap));
X levl[xdnstair][ydnstair].scrsym = '>';
X troom = croom;
X do {
X if (++tryct > 2000)
X panic ("Cannot make upstairs\n");
X croom = &rooms[rn2 (nroom)];
X xupstair = somex ();
X yupstair = somey ();
X } while (croom == troom || m_at (xupstair, yupstair) ||
X o_at (xupstair, yupstair) ||
X g_at (xupstair, yupstair, ftrap));
X levl[xupstair][yupstair].scrsym = '<';
X qsort (rooms, nroom, sizeof (MKROOM), comp);
X croom = rooms;
X troom = croom + 1;
X nxcor = 0;
X mkpos ();
X do
X makecor (x + dx, y + dy);
X while (croom -> hx > 0 && troom -> hx > 0);
X if ((dlevel < 10 && rn2 (2)) || (dlevel > 9 && !rn2 (3)) ||
X wizard)
X mkshop ();
X if (dlevel > 7 && !rn2 (6))
X mkzoo ();
X else if (dlevel > 11 && !rn2 (6) || wizard)
X mkyard ();
X else if ((dlevel > 18 && !rn2 (6)))
X mkswamp ();
X else if ((dlevel > 8 && !rn2 (8)) || wizard)
X mk_knox ();
X savelev ();
X}
X
Xcomp (xcoord, ycoord)
Xregister MKROOM * xcoord, *ycoord;
X{
X if (xcoord -> lx < ycoord -> lx)
X return - 1;
X return (xcoord -> lx > ycoord -> lx);
X}
X
Xmkpos () {
X if (troom -> hx < 0 || croom -> hx < 0)
X return;
X if (troom -> lx > croom -> hx) {
X x = croom -> hx + 1;
X dx = 1;
X tx = troom -> lx - 1;
X }
X else if (troom -> hy < croom -> ly) {
X y = croom -> ly - 1;
X dy = -1;
X dx = 0;
X ty = troom -> hy + 1;
X }
X else if (troom -> hx < croom -> lx) {
X x = croom -> lx - 1;
X dx = -1;
X tx = troom -> hx + 1;
X }
X else {
X y = croom -> hy + 1;
X dy = 1;
X dx = 0;
X ty = troom -> ly - 1;
X }
X if (dx) {
X dy = 0;
X y = croom -> ly + rn2 (croom -> hy - croom -> ly + 1);
X ty = troom -> ly + rn2 (troom -> hy - troom -> ly + 1);
X }
X else {
X x = croom -> lx + rn2 (croom -> hx - croom -> lx + 1);
X tx = troom -> lx + rn2 (troom -> hx - troom -> lx + 1);
X }
X if (levl[x + dx][y + dy].typ) {
X if (nxcor)
X newloc ();
X else {
X dodoor (x, y, croom);
X x += dx;
X y += dy;
X }
X return;
X }
X dodoor (x, y, croom);
X}
X
Xdodoor (doorx, doory, aroom)
Xregister int doorx, doory;
Xregister MKROOM * aroom;
X{
X register MKROOM * broom;
X register int tmp;
X
X if ((tmp = levl[doorx - 1][doory].typ) == DOOR || tmp == SDOOR)
X return;
X if ((tmp = levl[doorx + 1][doory].typ) == DOOR || tmp == SDOOR)
X return;
X if ((tmp = levl[doorx][doory - 1].typ) == DOOR || tmp == SDOOR)
X return;
X if ((tmp = levl[doorx][doory + 1].typ) == DOOR || tmp == SDOOR)
X return;
X if (levl[doorx][doory].typ != WALL || doorindex >= DOORMAX)
X return;
X if (!rn2 (8))
X levl[doorx][doory].typ = SDOOR;
X else {
X levl[doorx][doory].scrsym = '+';
X levl[doorx][doory].typ = DOOR;
X }
X aroom -> doorct++;
X broom = aroom + 1;
X if (broom -> hx < 0)
X tmp = doorindex;
X else
X for (tmp = doorindex; tmp > broom -> fdoor; tmp--) {
X doors[tmp].x = doors[tmp - 1].x;
X doors[tmp].y = doors[tmp - 1].y;
X }
X doorindex++;
X doors[tmp].x = doorx;
X doors[tmp].y = doory;
X for (; broom -> hx >= 0; broom++)
X broom -> fdoor++;
X}
X
Xnewloc () {
X register int tryct = 0;
X
X ++croom;
X ++troom;
X if (nxcor || croom -> hx < 0 || troom -> hx < 0) {
X if (nxcor++ > rn1 (nroom, 4)) {
X croom = &rooms[nroom];
X return;
X }
X do {
X if (++tryct > 100) {
X printf ("tryct overflow5\n");
X croom = &rooms[nroom];
X return;
X }
X croom = &rooms[rn2 (nroom)];
X troom = &rooms[rn2 (nroom)];
X }
X while (croom == troom || (troom == croom + 1 &&
X !rn2 (3)));
X }
X mkpos ();
X}
X
Xmove (xdir, ydir, dir)
Xregister int *xdir, *ydir, dir;
X{
X switch (dir) {
X case 0:
X --(*xdir);
X break;
X case 1:
X (*ydir)++;
X break;
X case 2:
X (*xdir)++;
X break;
X case 3:
X --(*ydir);
X break;
X }
X}
X
Xokay (xx, yy, dir)
Xint xx, yy;
Xregister int dir;
X{
X move (&xx, &yy, dir);
X move (&xx, &yy, dir);
X if (xx < 3 || yy < 3 || xx > 17 || yy > 75 || levl[yy][xx].typ != 0)
X return 0;
X return 1;
X}
X
Xmaker (lowx, hix, lowy, hiy)
Xchar lowx, hix, lowy, hiy;
X{
X register PART * ltmp, *lmax;
X register int tmpx;
X
X if (hix > 75)
X hix = 75;
X if (hiy > 18)
X hiy = 18;
X for (tmpx = lowx - 4; tmpx < hix + 5; tmpx++)
X for (ltmp = &levl[tmpx][lowy - 3],
X lmax = &levl[tmpx][hiy + 4];
X ltmp != lmax; ltmp++)
X if (ltmp -> typ)
X return 0;
X if (10 > rnd (dlevel)) {
X for (tmpx = lowx - 1; tmpx < hix + 2; tmpx++)
X for (ltmp = &levl[tmpx][lowy - 1],
X lmax = &levl[tmpx][hiy + 2];
X ltmp != lmax; ltmp++)
X ltmp -> lit = 1;
X }
X croom -> lx = lowx;
X croom -> hx = hix;
X croom -> ly = lowy;
X croom -> hy = hiy;
X croom -> rtype = 0;
X croom -> doorct = 0;
X croom -> fdoor = 0;
X croom++;
X for (tmpx = lowx - 1; tmpx <= hix + 1; tmpx++) {
X ltmp = &levl[tmpx][lowy - 1];
X lmax = &levl[tmpx][hiy + 1];
X ltmp -> scrsym = '-';
X ltmp -> typ = WALL;
X while (++ltmp != lmax) {
X if (tmpx >= lowx && tmpx <= hix) {
X ltmp -> scrsym = '.';
X ltmp -> typ = ROOM;
X }
X else {
X ltmp -> scrsym = '|';
X ltmp -> typ = WALL;
X }
X }
X ltmp -> scrsym = '-';
X ltmp -> typ = WALL;
X }
X /*
X -------
X |.....|
X |.....| (This sort of room is made) (a3)
X |.....|
X -------
X */
X ++nroom;
X return 1;
X}
X
Xmakecor (nx, ny)
Xregister int nx, ny;
X{
X register PART * crm;
X register int dix, diy;
X
X if (nxcor && !rn2 (35)) {
X newloc ();
X return;
X }
X dix = abs (nx - tx);
X diy = abs (ny - ty);
X if (nx == 79 || !nx || !ny || ny == 21) {
X if (nxcor) {
X newloc ();
X return;
X }
X printf ("something went wrong. we try again...\n");
X execl ("./mklev", args[0], tfile, tspe, args[3],
X args[4], 0);
X panic ("cannot execute ./mklev\n");
X }
X if (dy && dix > diy) {
X dy = 0;
X dx = (nx > tx) ? -1 : 1;
X }
X else if (dx && diy > dix) {
X dx = 0;
X dy = (ny > ty) ? -1 : 1;
X }
X crm = &levl[nx][ny];
X if (!crm -> typ) {
X crm -> typ = CORR;
X crm -> scrsym = '#';
X x = nx;
X y = ny;
X return;
X }
X if (crm -> typ == CORR) {
X x = nx;
X y = ny;
X return;
X }
X if (nx == tx && ny == ty) {
X dodoor (nx, ny, troom);
X newloc ();
X return;
X }
X if (x + dx != nx || y + dy != ny)
X return;
X if (dx) {
X dy = 1;
X if (ty < ny || levl[nx + dx][ny - 1].typ != ROOM)
X dy = -1;
X dx = 0;
X }
X else {
X dx = 1;
X if (tx < nx || levl[nx - 1][ny + dy].typ != ROOM)
X dx = -1;
X dy = 0;
X }
X}
X
XMONSTER m_at (monx, mony)
Xregister int monx, mony;
X{
X register MONSTER mtmp;
X
X for (mtmp = fmon; mtmp; mtmp = mtmp -> nmon)
X if (mtmp -> mx == monx && mtmp -> my == mony)
X return (mtmp);
X return (NOT_HERE);
X}
X
XOBJECT o_at (objx, objy)
Xregister int objx, objy;
X{
X register OBJECT obj;
X
X for (obj = fobj; obj; obj = obj -> nobj)
X if (obj -> ox == objx && obj -> oy == objy)
X return (obj);
X return (NOT_HERE);
X}
X
XGOLD_TRAP g_at (gtx, gty, ptr)
Xregister int gtx, gty;
Xregister GOLD_TRAP ptr;
X{
X while (ptr) {
X if (ptr -> gx == gtx && ptr -> gy == gty)
X return (ptr);
X ptr = ptr -> ngen;
X }
X return NOT_HERE;
X}
SHAR_EOF
if test 9468 -ne "`wc -c 'mklev.c'`"
then
echo shar: error transmitting "'mklev.c'" '(should have been 9468 characters)'
fi
echo shar: extracting "'mklev.make.c'" '(11782 characters)'
if test -f 'mklev.make.c'
then
echo shar: over-writing existing file "'mklev.make.c'"
fi
sed 's/^X//' << \SHAR_EOF > 'mklev.make.c'
X/*
X * Mklev.make.c
X */
X
X#define ZOO 1
X#define GRAVEYARD 2
X#define SWAMP 3
X#define FORT_KNOX 4
X#define MAZE 6
X
X#define NORMAL_IO
X#include "hack.h"
X
Xextern char mmon[8][8];
X
X#define MAZX ((rnd(37) << 1) + 1)
X#define MAZY ((rnd(8) << 1) + 1)
X
X#define somex() rn1( croom->hx - croom->lx + 1, croom->lx )
X#define somey() rn1( croom->hy - croom->ly + 1, croom->ly )
X
Xextern PART levl[80][22];
X
Xextern MONSTER fmon;
Xextern OBJECT fobj;
Xextern GOLD_TRAP fgold, ftrap;
X
Xextern MKROOM rooms[15], *croom;
X
Xextern COORDINATES doors[DOORMAX];
X
Xextern int doorindex, nroom, comp ();
X
Xextern char dlevel, *geno, goldseen,
X xdnstair, xupstair, ydnstair, yupstair,
X wizard, nxcor, x, y,
X dx, dy, tx, ty;
X /* For corridors and other things... */
X
Xmakemaz () {
X
X/* This is all Kenny's fault. He seems to have his x and y reversed */
X
X int xx, yy, a, q, sp, dir, dirs[5], stack[200];
X register int zx, zy;
X register OBJECT otmp;
X
X for (xx = 2; xx < 19; xx++)
X for (yy = 2; yy < 77; yy++) {
X if (xx % 2 == 0 || yy % 2 == 0)
X levl[yy][xx].typ++;/* WALL==1 */
X }
X zx = MAZY;
X zy = MAZX;
X sp = 1;
X stack[1] = 100 * zx + zy;
X while (sp) {
X xx = stack[sp] / 100;
X yy = stack[sp] % 100;
X levl[yy][xx].typ = 2;
X q = 0;
X for (a = 0; a < 4; a++)
X if (okay (xx, yy, a))
X dirs[q++] = a;
X if (q) {
X dir = dirs[rn2 (q)];
X move (&xx, &yy, dir);
X levl[yy][xx].typ = 0;
X move (&xx, &yy, dir);
X stack[++sp] = 100 * xx + yy;
X }
X else
X sp--;
X }
X for (xx = 2; xx < 77; xx++)
X for (yy = 2; yy < 19; yy++) {/* This was mine */
X if (levl[xx][yy].typ == WALL)
X levl[xx][yy].scrsym = '-';
X else {
X levl[xx][yy].typ = ROOM;
X levl[xx][yy].scrsym = '.';
X }
X }
X for (xx = rn1 (8, 11); xx; xx--) {
X mkobj (0);
X levl[(fobj -> ox = MAZX)][(fobj -> oy = MAZY)].scrsym = fobj -> olet;
X }
X for (xx = rn1 (5, 7); xx; xx--)
X makemon (1, MAZX, MAZY);
X for (xx = rn1 (6, 7); xx; xx--)
X mkgold (0, MAZX, MAZY);
X for (xx = rn1 (6, 7); xx; xx--)
X mktrap (0, 1);
X levl[(xupstair = MAZX)][(yupstair = MAZY)].scrsym = '<';
X levl[zy][zx].scrsym = '"';
X otmp = newobj ();
X otmp -> nobj = fobj;
X fobj = otmp;
X otmp -> ox = zy;
X otmp -> oy = zx;
X otmp -> olet = '"';
X xdnstair = 0;
X ydnstair = 0;
X}
X
X/* Make a trap somewhere (in croom if mazeflag=0) */
Xmktrap (num, mazeflag)
Xregister int num, mazeflag;
X{
X register GOLD_TRAP gtmp;
X register int nopierc;
X int nomimic, fakedoor, fakegold, tryct = 0;
X
X gtmp = newgen ();
X if (!num || num >= TRAPNUM) {
X nopierc = (dlevel < 4);
X nomimic = (dlevel < 9 || goldseen);
X gtmp -> gflag = rn2 (TRAPNUM - nopierc - nomimic);
X/* Note: PIERC = 7, MIMIC = 8, TRAPNUM = 9 */
X }
X else
X gtmp -> gflag = num;
X fakedoor = (gtmp -> gflag == MIMIC && rn2 (2) && !mazeflag);
X fakegold = (gtmp -> gflag == MIMIC && !fakedoor);
X do {
X if (++tryct > 200) {
X printf ("tryct overflow7\n");
X free (gtmp);
X return;
X }
X if (mazeflag) {
X gtmp -> gx = MAZX;
X gtmp -> gy = MAZY;
X }
X else if (!fakedoor) {
X gtmp -> gx = somex ();
X gtmp -> gy = somey ();
X }
X else {
X if (rn2 (2)) {
X if (rn2 (2))
X gtmp -> gx = croom -> hx + 1;
X else
X gtmp -> gx = croom -> lx - 1;
X gtmp -> gy = somey ();
X }
X else {
X if (rn2 (2))
X gtmp -> gy = croom -> hy + 1;
X else
X gtmp -> gy = croom -> ly - 1;
X gtmp -> gx = somex ();
X }
X }
X } while (g_at (gtmp -> gx, gtmp -> gy, (fakegold) ? fgold : ftrap));
X if (!fakegold) {
X gtmp -> ngen = ftrap;
X ftrap = gtmp;
X }
X else {
X gtmp -> gflag = 0;
X gtmp -> ngen = fgold;
X fgold = gtmp;
X goldseen++;
X }
X if (mazeflag && !rn2 (10) && gtmp -> gflag < PIERC)
X gtmp -> gflag |= SEEN;
X if (fakedoor)
X num = '+';
X else if (fakegold)
X num = '$';
X else
X return;
X levl[gtmp -> gx][gtmp -> gy].scrsym = num;
X}
X
Xmkgold (num, goldx, goldy)
Xregister int num;
X{
X register GOLD_TRAP gtmp;
X
X gtmp = newgen ();
X gtmp -> ngen = fgold;
X levl[gtmp -> gx = goldx][gtmp -> gy = goldy].scrsym = '$';
X gtmp -> gflag = (num) ? num : 1 + rnd (dlevel + 2) * rnd (30);
X fgold = gtmp;
X}
X
X/*VARARGS*/
Xpanic (str, arg1, arg2)
Xregister char *str;
X{
X fprintf (stderr, "\nMKLEV ERROR: ");
X fprintf (stderr, str, arg1, arg2);
X abort ();
X}
X
Xmakemon (sl, monx, mony)
Xregister int sl, monx, mony;
X{
X register MONSTER mtmp;
X register int tryct = 0;
X
X mtmp = newmonst (0);
X mtmp -> mstole = STOLE_NULL;
X mtmp -> msleep = sl;
X mtmp -> mx = monx;
X mtmp -> my = mony;
X mtmp -> mfroz = 0;
X mtmp -> mconf = 0;
X mtmp -> mflee = 0;
X mtmp -> mspeed = 0;
X mtmp -> mtame = 0;
X mtmp -> angry = 0;
X mtmp -> mxlth = 0;
X mtmp -> wormno = 0;
X mtmp -> ale = 0;
X if (levl[monx][mony].typ == POOL) {
X mtmp -> ale = 1;
X mtmp -> invis = 1;
X }
X else {
X do {
X if (++tryct > 100) {
X printf ("tryct overflow8\n");
X free (mtmp);
X return;
X }
X mtmp -> mhp = rn2 (dlevel / 3 + 1) % 8;
X mtmp -> orig_hp = rn2 (7);
X } while (index (geno, mmon[mtmp -> mhp][mtmp -> orig_hp]));
X }
X mtmp -> nmon = fmon;
X fmon = mtmp;
X}
X
X
Xchar shtypes[] = "=/)%?!["; /* 8 shoptypes: 7 specialised, 1 mixed */
Xchar shprobs[] = {
X 3, 3, 5, 5, 10, 10, 14, 50
X}; /* Their probabilities */
X
Xmkshop () {
X register MKROOM * sroom;
X register int sh, sx, sy, i;
X register char let;
X
X for (sroom = &rooms[0];; sroom++) {
X if (sroom -> hx < 0)
X return;
X if (ch_upstairs (sroom) || ch_dnstairs (sroom))
X continue;
X if (sroom -> doorct == 1)
X break;
X }
X for (i = rn2 (100), let = 0; (i -= shprobs[let]) >= 0; let++)
X if (!shtypes[let])
X break; /* Superfluous */
X sroom -> rtype = 8 + let;
X let = shtypes[let];
X sh = sroom -> fdoor;
X for (sx = sroom -> lx; sx <= sroom -> hx; sx++)
X for (sy = sroom -> ly; sy <= sroom -> hy; sy++) {
X if (sx == sroom -> lx && doors[sh].x == sx - 1 ||
X sx == sroom -> hx && doors[sh].x == sx + 1 ||
X sy == sroom -> ly && doors[sh].y == sy - 1 ||
X sy == sroom -> hy && doors[sh].y == sy + 1)
X continue;
X mkobj (let);
X levl[fobj -> ox = sx][fobj -> oy = sy].scrsym =
X fobj -> olet;
X }
X}
X
Xmkzoo () {
X register MKROOM * zroom;
X register int zx, zy;
X
X for (;;) {
X zroom = &rooms[rn2 (nroom)];
X if (zroom -> hx < 0 || zroom -> rtype >= 8 ||
X ch_upstairs (zroom))
X continue;/* Niet in kamer met terugweg */
X break; /* Kamer gevonden */
X }
X zroom -> rtype = ZOO;
X for (zx = zroom -> lx; zx <= zroom -> hx; zx++)
X for (zy = zroom -> ly; zy <= zroom -> hy; zy++) {
X if (!m_at (zx, zy)) {
X mkgold (0, zx, zy);
X makemon (1, zx, zy);
X }
X }
X}
X
X
Xmkyard () {
X register MKROOM * yroom;
X register int yx, yy;
X
X for (;;) {
X yroom = &rooms[rn2 (nroom)];
X if (yroom -> hx < 0 || yroom -> rtype >= 8 ||
X ch_upstairs (yroom))
X continue;/* Niet in kamer met terugweg */
X break; /* Kamer gevonden */
X }
X yroom -> rtype = GRAVEYARD;
X for (yx = yroom -> lx; yx <= yroom -> hx; yx++)
X for (yy = yroom -> ly; yy <= yroom -> hy; yy++) {
X if (!mymakemon (yx, yy)) {
X if (fmon -> mhp == 7)
X mymakemon (yx, yy);
X /* Not so many demons */
X mkgold (0, yx, yy);
X if (fmon -> mhp != 1) {
X mkobj (0);
X if (rn2 (8))
X fobj -> cursed = 1;
X levl[fobj -> ox = yx][fobj -> oy = yy].scrsym = fobj -> olet;
X }
X }
X }
X}
X
X#define NOMON 1
X#define MON 0
X
Xmymakemon (monx, mony) {
X register MONSTER mtmp;
X register int tryct = 0;
X register int tmp = 0;
X
X if (m_at (monx, mony))
X return NOMON;
X mtmp = newmonst (0);
X mtmp -> mstole = STOLE_NULL;
X mtmp -> msleep = 1;
X mtmp -> mx = monx;
X mtmp -> my = mony;
X mtmp -> mfroz = 0;
X mtmp -> mconf = 0;
X mtmp -> mflee = 0;
X mtmp -> mspeed = 0;
X mtmp -> mtame = 0;
X mtmp -> angry = 0;
X mtmp -> mxlth = 0;
X mtmp -> wormno = 0;
X do {
X if (++tryct > 1000) {
X printf ("tryct overflow yard\n");
X free (mtmp);
X return NOMON;
X }
X tmp = putyard (mtmp);
X } while (index (geno, mmon[mtmp -> mhp][mtmp -> orig_hp]) || tmp);
X mtmp -> nmon = fmon;
X fmon = mtmp;
X return 0;
X}
X
Xputyard (mtmp)
XMONSTER mtmp;
X{
X switch (rn2 (5)) {
X case 0:
X mtmp -> mhp = 1;/* level 3 */
X mtmp -> orig_hp = 6;/* ZOMBIE */
X break;
X case 1:
X if (dlevel < 18)
X return NOMON;
X mtmp -> mhp = 6;/* level 18 */
X mtmp -> orig_hp = 2;/* VAMPIRE */
X break;
X case 2:
X mtmp -> mhp = 4;/* level 12 */
X mtmp -> orig_hp = 5;/* Wraith */
X break;
X case 3:
X if (dlevel < 21)
X return NOMON;
X mtmp -> mhp = 7;/* level 21 */
X mtmp -> orig_hp = 6;/* DEMON */
X break;
X case 4:
X mtmp -> mhp = 10;/* altijd */
X mtmp -> orig_hp = 10;/* GHOST */
X break;
X default:
X mtmp -> mhp = rn2 (dlevel / 3 + 1) % 8;
X mtmp -> orig_hp = rn2 (7);
X }
X return MON;
X}
X
Xmkswamp () {
X register MKROOM * zroom;
X register int zx, zy;
X register int first = 0;
X
X for (;;) {
X zroom = &rooms[rn2 (nroom)];
X if (zroom -> hx < 0)
X return;
X if (ch_upstairs (zroom) || ch_dnstairs (zroom))
X continue;
X if (zroom -> hx < 0 || zroom -> rtype >= 8)
X continue;
X /* Niet in kamer met terugweg of weg naar beneden */
X break; /* Kamer gevonden */
X }
X zroom -> rtype = SWAMP;
X for (zx = zroom -> lx; zx <= zroom -> hx; zx++)
X for (zy = zroom -> ly; zy <= zroom -> hy; zy++) {
X if ((zx + zy) % 2 && !o_at (zx, zy) &&
X !g_at (zx, zy, fgold) && !m_at (zx, zy) &&
X ch_doors (zx, zy)) {
X levl[zx][zy].typ = POOL;
X levl[zx][zy].scrsym = '}';
X if (!first) {
X makemon (0, zx, zy);
X ++first;
X }
X else if (!rn2 (4))
X makemon (0, zx, zy);
X }
X }
X}
X
Xch_doors (zx, zy)
Xregister int zx, zy;
X{
X register int xx, yy;
X register int status = 1;
X
X for (xx = zx - 1; xx <= zx + 1; xx++)
X for (yy = zy - 1; yy <= zy + 1; yy++) {
X if (levl[xx][yy].typ == DOOR)
X status = 0;
X else if (levl[xx][yy].typ == SDOOR) {
X levl[xx][yy].typ = DOOR;
X levl[xx][yy].scrsym = '+';
X status = 0;
X }
X }
X return status;
X}
X
Xmk_knox () {
X register MKROOM * kroom;
X register int kx, ky;
X register int tmp = 10000;
X OBJECT otmp;
X MONSTER mtmp;
X GOLD_TRAP gtmp;
X
X for (kroom = &rooms[0];; ++kroom) {
X if (kroom -> hx < 0)
X return;
X if (ch_upstairs (kroom) || ch_dnstairs (kroom))
X continue;
X if ((kroom -> rtype >= 8 || kroom -> rtype <= SWAMP)
X && kroom -> rtype)
X /* Shop or Zoo or Graveyard or Swamp */
X continue;
X if (kroom -> hx - kroom -> lx <= 3 || kroom -> hy - kroom -> ly <= 3)
X continue;
X break;
X }
X kroom -> rtype = FORT_KNOX;
X kx = ((kroom -> hx - kroom -> lx) / 2) + kroom -> lx;
X ky = ((kroom -> hy - kroom -> ly) / 2) + kroom -> ly;
X for (tx = kx - 1; tx <= kx + 1; ++tx)
X for (ty = ky - 1; ty <= ky + 1; ++ty) {
X if (tx == kx && ty == ky)
X continue;
X if ((otmp = o_at (tx, ty))) {
X otmp -> ox = kx;
X otmp -> oy = ky;
X }
X if ((mtmp = m_at (tx, ty)))
X delmon (mtmp);
X if ((gtmp = g_at (tx, ty, fgold))) {
X tmp += gtmp -> gflag;
X delgen (gtmp, fgold);
X }
X if ((gtmp = g_at (tx, ty, ftrap)))
X delgen (gtmp, ftrap);
X levl[tx][ty].typ = VAULT;
X levl[tx][ty].scrsym = (ty == ky) ? '|' : '-';
X }
X mkgold (tmp, kx, ky);
X}
X
Xch_upstairs (mroom)
Xregister MKROOM * mroom;
X{
X return (mroom -> lx <= xupstair && xupstair <= mroom -> hx &&
X mroom -> ly <= yupstair && yupstair <= mroom -> hy);
X}
X
Xch_dnstairs (mroom)
Xregister MKROOM * mroom;
X{
X return (mroom -> lx <= xdnstair && xdnstair <= mroom -> hx &&
X mroom -> ly <= ydnstair && ydnstair <= mroom -> hy);
X}
X
Xdelmon (mtmp)
Xregister MONSTER mtmp;
X{
X register MONSTER mtmp2;
X
X if (mtmp == fmon)
X fmon = fmon -> nmon;
X else {
X for (mtmp2 = fmon; mtmp2 -> nmon != mtmp;
X mtmp2 = mtmp2 -> nmon);
X mtmp2 -> nmon = mtmp -> nmon;
X }
X}
X
Xdelgen (gtmp, key)
Xregister GOLD_TRAP gtmp, key;
X{
X register GOLD_TRAP gtmp2;
X
X if (gtmp == key)
X key = key -> ngen;
X else {
X for (gtmp2 = key; gtmp2 -> ngen != gtmp;
X gtmp2 = gtmp2 -> ngen);
X gtmp2 -> ngen = gtmp -> ngen;
X }
X}
SHAR_EOF
if test 11782 -ne "`wc -c 'mklev.make.c'`"
then
echo shar: error transmitting "'mklev.make.c'" '(should have been 11782 characters)'
fi
echo shar: extracting "'mklev.mkobj.c'" '(2350 characters)'
if test -f 'mklev.mkobj.c'
then
echo shar: over-writing existing file "'mklev.mkobj.c'"
fi
sed 's/^X//' << \SHAR_EOF > 'mklev.mkobj.c'
X/*
X * Mklev.mkobj.c
X */
X
X#define NORMAL_IO
X#include "hack.h"
X#include "hack.vars.h"
X
Xmkfood () {
X register FOOD fp;
X register i = rn2 (100);
X
X fp = &foods[0];
X while ((i -= fp -> prob) >= 0)
X fp++;
X return (fp - foods);
X}
X
Xmkarm () {
X register ARMOR ap;
X register i = rn2 (100);
X
X ap = &armors[0];
X while ((i -= ap -> prob) >= 0)
X ap++;
X return (ap - armors);
X}
X
Xmkwep () {
X register WEAPON wp;
X register i = rn2 (100);
X wp = &weapons[0];
X while ((i -= wp -> prob) >= 0)
X wp++;
X return (wp - weapons);
X}
X
Xchar mkobjstr[] = "))[[!!!!????%%%%//=**";
X
Xmkobj (let)
Xregister let;
X{
X register OBJECT otmp;
X
X otmp = newobj ();
X otmp -> nobj = fobj;
X fobj = otmp;
X otmp -> known = 0;
X otmp -> cursed = 0;
X otmp -> spe = 0;
X otmp -> unpaid = 0;
X otmp -> quan = 1;
X if (!let)
X let = mkobjstr[rn2 (sizeof (mkobjstr) - 1)];
X otmp -> olet = let;
X switch (let) {
X
X case ')':
X otmp -> otyp = mkwep ();
X if (otmp -> otyp <= W_AMMUNITION)
X otmp -> quan = rn1 (6, 6);
X if (!rn2 (11))
X otmp -> spe = rnd (3);
X else if (!rn2 (10)) {
X otmp -> cursed = 1;
X otmp -> spe = -rnd (3);
X }
X break;
X
X case '*':
X otmp -> otyp = rn2 (SIZE (potcol));
X otmp -> quan = rn2 (6) ? 1 : 2;
X break;
X
X case '[':
X otmp -> otyp = mkarm ();
X if (!rn2 (8))
X otmp -> cursed = 1;
X if (!rn2 (10))
X otmp -> spe = rnd (3);
X else if (!rn2 (9)) {
X otmp -> spe = -rnd (3);
X otmp -> cursed = 1;
X }
X otmp -> spe += 10 - armors[otmp -> otyp].a_ac;
X break;
X
X case '!':
X otmp -> otyp = rn2 (SIZE (pottyp));
X break;
X
X case '?':
X otmp -> otyp = rn2 (SIZE (scrtyp));
X break;
X
X case '%':
X otmp -> otyp = mkfood ();
X otmp -> quan = rn2 (6) ? 1 : 2;
X break;
X
X case '/':
X otmp -> otyp = rn2 (SIZE (wantyp));
X if (otmp -> otyp == Z_DEATH)
X otmp -> otyp = rn2 (SIZE (wantyp));
X otmp -> spe = rn1 (5, (otmp -> otyp <= Z_CREATE_MON) ?
X 11 : 4);
X break;
X
X case '=':
X otmp -> otyp = rn2 (SIZE (ringtyp));
X if (otmp -> otyp >= R_GAIN_STR) {
X if (!rn2 (3)) {
X otmp -> spe = -rnd (2);
X otmp -> cursed = 1;
X }
X else
X otmp -> spe = rnd (2);
X }
X else if (otmp -> otyp == R_TELE ||
X otmp -> otyp == R_AGGRAV_MON ||
X otmp -> otyp == R_HUNGER)
X otmp -> cursed = 1;
X break;
X
X default:
X panic ("impossible mkobj");
X }
X}
SHAR_EOF
if test 2350 -ne "`wc -c 'mklev.mkobj.c'`"
then
echo shar: error transmitting "'mklev.mkobj.c'" '(should have been 2350 characters)'
fi
echo shar: extracting "'mklev.svlev.c'" '(1617 characters)'
if test -f 'mklev.svlev.c'
then
echo shar: over-writing existing file "'mklev.svlev.c'"
fi
sed 's/^X//' << \SHAR_EOF > 'mklev.svlev.c'
X/*
X * Mklev.savelev.c
X */
X
Xsavelev () {
X register int fd;
X register MONSTER mtmp, mtmp2;
X register GOLD_TRAP gtmp, gtmp2;
X register OBJECT otmp, otmp2;
X int minusone = -1;
X
X if ((fd = creat (tfile, 0644)) < 0)
X panic ("Cannot create %s\n", tfile);
X bwrite (fd, levl, sizeof (levl));
X bwrite (fd, nul, sizeof (unsigned));
X bwrite (fd, (char *) & xupstair, 1);
X bwrite (fd, (char *) & yupstair, 1);
X bwrite (fd, (char *) & xdnstair, 1);
X bwrite (fd, (char *) & ydnstair, 1);
X for (mtmp = fmon; mtmp; mtmp = mtmp2) {
X mtmp2 = mtmp -> nmon;
X bwrite (fd, &mtmp -> mxlth, sizeof (int));
X bwrite (fd, mtmp, mtmp -> mxlth + sizeof (struct monst));
X
X/* Michiel save stolen objects */
X bwrite (fd, nul, sizeof (struct stole));
X }
X bwrite (fd, &minusone, sizeof (int));
X for (gtmp = fgold; gtmp; gtmp = gtmp2) {
X gtmp2 = gtmp -> ngen;
X bwrite (fd, gtmp, sizeof (struct gen));
X free (gtmp);
X }
X bwrite (fd, nul, sizeof (struct gen));
X for (gtmp = ftrap; gtmp; gtmp = gtmp2) {
X gtmp2 = gtmp -> ngen;
X bwrite (fd, gtmp, sizeof (struct gen));
X free (gtmp);
X }
X bwrite (fd, nul, sizeof (struct gen));
X for (otmp = fobj; otmp; otmp = otmp2) {
X otmp2 = otmp -> nobj;
X bwrite (fd, otmp, sizeof (struct obj));
X free (otmp);
X }
X bwrite (fd, nul, sizeof (struct obj));
X bwrite (fd, rooms, sizeof (rooms));
X bwrite (fd, doors, sizeof (doors));
X fgold = TRAP_NULL;
X ftrap = TRAP_NULL;
X fmon = MON_NULL;
X fobj = OBJ_NULL;
X}
X
X/*NOSTRICT*/
Xbwrite (fd, loc, num)
Xregister int fd, num;
Xregister char *loc;
X{
X if (write (fd, loc, num) != num)
X panic ("Cannot write %d bytes to file #%d", num, fd);
X}
SHAR_EOF
if test 1617 -ne "`wc -c 'mklev.svlev.c'`"
then
echo shar: error transmitting "'mklev.svlev.c'" '(should have been 1617 characters)'
fi
echo shar: extracting "'rnd.c'" '(404 characters)'
if test -f 'rnd.c'
then
echo shar: over-writing existing file "'rnd.c'"
fi
sed 's/^X//' << \SHAR_EOF > 'rnd.c'
X/*
X * Rnd.c
X */
X
X#define RND(x) ((rand() >> 3) % x)
X
Xunsigned int rand(); /* it only returns 0 - 2**15 values, all POSITIVE */
X
Xrn1 (x, y)
Xregister x, y;
X{
X return (RND (x) + y);
X}
X
Xrn2 (x)
Xregister x;
X{
X return (RND (x));
X}
X
Xrnd (x)
Xregister x;
X{
X return (RND (x) + 1);
X}
X
Xd (n, x)
Xregister n, x;
X{
X register tmp = n;
X
X while (n--)
X tmp += RND (x);
X return tmp;
X}
SHAR_EOF
if test 404 -ne "`wc -c 'rnd.c'`"
then
echo shar: error transmitting "'rnd.c'" '(should have been 404 characters)'
fi
echo shar: extracting "'show.c'" '(6304 characters)'
if test -f 'show.c'
then
echo shar: over-writing existing file "'show.c'"
fi
sed 's/^X//' << \SHAR_EOF > 'show.c'
X/*
X * Showlevel.c
X */
X
X#define NORMAL_IO
X#define SHOW
X#include "hack.h"
X
XPART levl[80][22];
X
Xchar mmon[8][8] = {
X "BGHJKLr",
X "aEhiOyZ",
X "AfNpQqv",
X "bCcgjkS",
X "FoRstWw",
X "dlMmTuY",
X "IUVXxz:",
X "De'n,P&"
X};
X
Xchar stairs[4], mbuf[1000], obuf[BUFSIZ];
X
Xunsigned omoves;
Xextern char *setan ();
X
Xmain (argc, argv)
Xint argc;
Xchar **argv;
X{
X register fd;
X register MONSTER mtmp = (MONSTER) mbuf;
X char buffer[100];
X struct stole stmp;
X struct obj otmp;
X char buf[BUFSZ];
X int xl;
X
X setbuf (stdout, obuf);
X if (!strcmp (argv[1], "-r")) {
X showrecord ();
X exit (0);
X }
X if (!strcmp (argv[1], "-d")) {
X delrecord ();
X exit (0);
X }
X while (--argc) {
X printf ("Next file is %s\n", argv[argc]);
X if ((fd = open (argv[argc], 0)) < 0) {
X printf ("Cannot open %s\n", argv[argc]);
X getret ();
X continue;
X }
X if (read (fd, levl, sizeof levl) != sizeof levl) {
X printf ("Error reading level\n");
X getret ();
X continue;
X }
X show ();
X mread (fd, &omoves, sizeof (unsigned));
X mread (fd, stairs, 4);
X mread (fd, &xl, sizeof (int));
X printf ("Show Monsters? (%sSpecified) ", omoves ? "Not " : "");
X fflush (stdout);
X gets (buffer);
X if (strcmp (buffer, "y"))
X continue;
X while (xl != -1) {
X mread (fd, mtmp, xl + sizeof (struct monst));
X mread (fd, &stmp, sizeof (struct stole));
X if (!omoves) {
X if (mtmp -> mhp == 10 && mtmp -> orig_hp == 10)
X printf ("\' \'");
X else if (mtmp -> mhp == 9 && mtmp -> orig_hp == 9)
X printf ("Ale");
X else
X printf ("%c",
X mmon[mtmp -> mhp][mtmp -> orig_hp]);
X printf (" at [%d,%d]", mtmp -> mx, mtmp -> my);
X }
X else {
X printf ("monster at [%d,%d]", mtmp -> mx, mtmp -> my);
X if (stmp.sgold || stmp.sobj) {
X printf (" stole ");
X if (stmp.sgold)
X printf ("%u goldpieces", stmp.sgold);
X for (;;) {
X mread (fd, &otmp,
X sizeof (struct obj));
X if (!otmp.olet)
X break;
X doname (otmp.olet, buf);
X printf (" %s", buf);
X }
X }
X }
X if (mtmp -> msleep)
X printf (" SLEEP");
X if (mtmp -> invis)
X printf (" INVIS");
X if (mtmp -> cham)
X printf (" CHAM");
X if (mtmp -> mspeed)
X printf (" MSPEED");
X if (mtmp -> mconf)
X printf (" MCONF");
X if (mtmp -> mflee)
X printf (" MFLEE");
X if (mtmp -> mcan)
X printf (" MCAN");
X if (mtmp -> mtame)
X printf (" TAME");
X if (mtmp -> angry)
X printf (" MANGRY");
X if (mtmp -> wormno)
X printf (" WORM[%d]", mtmp -> wormno);
X if (mtmp -> mxlth)
X printf (" +%d extra", mtmp -> mxlth);
X if (mtmp -> mfroz)
X printf (" FROZ");
X putchar ('\n');
X mread (fd, &xl, sizeof (int));
X }
X getret ();
X }
X}
X
Xmread (fd, buf, n) {
X register nn;
X
X if ((nn = read (fd, buf, n)) != n) {
X printf ("error: read %d instead of %d bytes\n", nn, n);
X exit (2);
X }
X}
X
Xshow () {
X register i, j;
X
X for (j = 0; j < 22; j++)
X for (i = 0; i < 80; i++)
X pch (levl[i][j].scrsym);
X printf ("*** ");
X}
X
Xpch (ch)
Xchar ch;
X{
X putchar (ch ? ch : '_');
X}
X
Xextern char *malloc ();
X
Xchar *
X alloc (num)
Xregister num;
X{
X register char *val;
X
X if (!(val = malloc (num)))
X error ("Cannot get %d bytes", num);
X return val;
X}
X
Xerror (s) {
X printf (s);
X putchar ('\n');
X fflush (stdout);
X exit (1);
X}
X
Xextern char *itoa ();
X
X#define NAMESIZE 8
X#define DEATHSIZE 40
X
Xstruct recitem {
X long points;
X int level, maxlvl, hp, maxhp;
X char str[NAMESIZE + 1], death[DEATHSIZE + 1];
X} record;
X
Xshowrecord () {
X register killed;
X register place = 0;
X register rfile;
X
X if ((rfile = open (RECORD, 0)) < 0)
X error ("Cannot open %s", RECORD);
X printf ("Number Points Name\n");
X while (read (rfile, &record, sizeof (struct recitem)) > 0) {
X printf ("%2d %6lu %8s ", ++place, record.points,
X record.str);
X killed = 0;
X if (*record.death == 'e')
X printf ("escaped the dungeon [max level %d]",
X record.maxlvl);
X else {
X switch (record.death[1]) {
X case 'u':
X printf ("quit");
X break;
X case 'h':
X printf ("choked in his/her food");
X break;
X case 't':
X printf ("starved");
X break;
X case 'r':
X printf ("drowned");
X break;
X default:
X printf ("was killed");
X killed++;
X }
X
X printf (" on%s level %d", killed ? "" : " dungeon", record.level);
X
X if (record.maxlvl != record.level)
X printf (" [%d]", record.maxlvl);
X }
X if (killed)
X printf (" by %s", record.death);
X putchar ('.');
X if (record.maxhp)
X printf (" Hp: %s [%d]", (record.hp > 0) ?
X itoa (record.hp) : "-", record.maxhp);
X putchar ('\n');
X }
X close (rfile);
X}
X
Xint deleted[45];
X
Xdelrecord () {
X register int fd, fd2;
X int count = 0;
X
X printf ("Delete (Terminate with a zero): ");
X fflush (stdout);
X fd = open (RECORD, 0);
X fd2 = creat (".Temp", 0777);
X if (fd < 0 || fd2 < 0) {
X printf ("Cannot open files!\n");
X exit (2);
X }
X do {
X scanf ("%d", &count);
X ++deleted[count];
X } while (count);
X fprintf (stderr, "Deleted nr");
X count = 1;
X while (read (fd, &record, sizeof (struct recitem)) > 0) {
X if (!deleted[count])
X write (fd2, &record, sizeof (struct recitem));
X else
X fprintf (stderr, " %d", count);
X ++count;
X }
X putc ('\n', stderr);
X close (fd);
X close (fd2);
X execl ("/bin/mv", "mv", ".Temp", RECORD, NULL);
X}
X
Xchar *
X itoa (a)
Xregister int a;
X{
X static char buf[8];
X
X sprintf (buf, "%d", a);
X return (buf);
X}
X
Xdoname (let, buf)
Xregister char let;
Xregister char *buf;
X{
X switch (let) {
X
X case '"':
X strcpy (buf, "The amulet of Frobozz");
X break;
X
X case '%':
X strcpy (buf, "some food");
X break;
X
X case ')':
X strcpy (buf, "a weapon");
X break;
X
X case '[':
X strcpy (buf, "armor");
X break;
X
X case '!':
X strcpy (buf, "a potion");
X break;
X
X case '?':
X strcpy (buf, "a scroll");
X break;
X
X case '/':
X strcpy (buf, "a wand");
X break;
X
X case '=':
X strcpy (buf, "a ring");
X break;
X
X case '*':
X strcpy (buf, "a gem");
X break;
X
X default:
X sprintf (buf, "a glorkum %c(0%o)", let, let);
X }
X}
X
Xgetret () {
X printf ("AHit j<return>k to continue");
X fflush (stdout);
X while (getchar () != '\n');
X}
SHAR_EOF
if test 6304 -ne "`wc -c 'show.c'`"
then
echo shar: error transmitting "'show.c'" '(should have been 6304 characters)'
fi
echo shar: extracting "'string.s'" '(2574 characters)'
if test -f 'string.s'
then
echo shar: over-writing existing file "'string.s'"
fi
sed 's/^X//' << \SHAR_EOF > 'string.s'
X .text
X .globl _strcpy
X_strcpy:
X~~m=.
X| sub ax,ax | tell csv that I don't have any locals
X| call csv | check stack crash, save bp, si & di
X push bp
X mov bp,sp
X push di
X push si
X~dst=4
X~src=6
X~cnt=8
X mov si,*~src(bp) | load si with source pointer
X mov di,*~dst(bp) | load di with destination pointer
X mov bx, di | save address to return
XL25: | start of loop
X movb al, (si) | fetch source char in al
X movb (di), al | place in destination
X inc si | increment source pointer
X inc di | increment destination pointer
X andb al, al | set the flags
X jnz L25 | Loop until zf=1
X mov ax, bx | return destination pointer
X jmp cret | and return to caller.
X
X .globl _strncpy
X_strncpy:
X| sub ax,ax | tell csv I don't have any local variables
X| call csv | save si, di, bp, check for collision
X push bp
X mov bp,sp
X push di
X push si
X mov si,*~src(bp) | load source operand
X mov di,*~dst(bp) | load destination operand
X mov cx,*~cnt(bp) | load count
X mov bx,di | save address of source for return
X cmp cx,0 | see if cx set
X je L27 | loop out if so.
XL26: movb al,(si) | fetch ahcecter to move
X movb (di),al | store it.
X inc di | increment destination
X and al, al | set flags
X jz L28 | if char is null, skip
X inc si | increment of source (this will null pad)
XL28: loop L26 | loop until count is 0
XL27: mov ax, bx | get address of dest in ax
X jmp cret | and return it to caller.
X
X .globl _strchr
X
X_strchr:
X mov bx, sp | usr bx as adr register
X mov ax, *4(bx) | fetch charecter in al
X mov bx, *2(bx) | fetch address in bx
X j L31 | skip to start of while loop
X
XL29:
X cmpb al, ah | see if charecters match
X je L30 | jmp out if true
X inc bx | move to next charecter in string
X
XL31:
X movb ah,(bx) | fetch charecter in ah
X andb ah, ah | set flags on that char
X jnz L29 | if not end of string, loop up
X sub ax, ax | else at end of string,
X ret | return with NULL in ax
X
XL30: mov ax, bx | if found char, exit with
X ret | address in ax
X
X .data
SHAR_EOF
if test 2574 -ne "`wc -c 'string.s'`"
then
echo shar: error transmitting "'string.s'" '(should have been 2574 characters)'
fi
# End of shell archive
exit 0
0 new messages