hack: changes for SVR2 (3 of 3)
gam
gam at amdahl.UUCP
Sun Jan 6 19:18:11 AEST 1985
: This is a shar archive. Extract with sh, not csh.
echo x - hack.termcap.c
sed -e 's/^X//' > hack.termcap.c << '!Funky!Stuff!'
X/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1984. */
X
X#define SINGLE
X#include <curses.h>
X#include <term.h>
X#include "config.h" /* for ROWNO and COLNO */
X
Xextern char *tparm();
Xextern char *getenv();
X
Xshort ospeed; /* terminal baudrate; used by tputs */
Xchar *HO, *CL, *CE, *UP, *CM, *ND, *XD, *BC, *SO, *SE;
Xchar PC = '\0';
X
Xstartup()
X{
X register char *tmp;
X char *pc;
X int tliberr;
X
X
X if(!(tmp = getenv("TERM")))
X error("Can't get TERM.");
X def_shell_mode();
X setupterm(tmp, 0, &tliberr);
X gettty(); /* sets ospeed */
X
X if(tliberr < 1)
X error("Unknown terminal type: %s.", tmp);
X if(pc = pad_char)
X PC = *pc;
X if(!(BC = cursor_left)){
X BC = "\b";
X }
X HO = cursor_home;
X if(columns < COLNO || lines < ROWNO+2)
X error("Screen must be at least %d by %d!",
X ROWNO+2, COLNO);
X if(!(CL = clear_screen) || !(CE = clr_eol) ||
X !(ND = cursor_right) ||
X !(UP = cursor_up) || over_strike)
X error("Hack needs clear_screen, clr_eol, cursor_up, cursor_right,\nand no over_strike.");
X if(!(CM = cursor_address))
X error("Use of hack on terminals without cursor_motion is unsupported...\n");
X XD = cursor_down;
X SO = enter_standout_mode;
X SE = exit_standout_mode;
X if(!SO || !SE) SO = SE = 0;
X}
X
X/* Cursor movements */
Xextern xchar curx, cury;
X
Xcurs(x,y)
Xregister int x,y; /* not xchar: perhaps xchar is unsigned and
X curx-x would be unsigned as well */
X{
X
X if (y == cury && x == curx) return;
X if(abs(cury-y)<= 3 && abs(curx-x)<= 3) {
X nocmov(x,y);
X } else if((x <= 3 && abs(cury-y)<= 3) || (!CM && x<abs(curx-x))) {
X (void) putchar('\r');
X curx = 1;
X nocmov(x,y);
X } else if(!CM) {
X nocmov(x,y);
X } else
X cmov(x,y);
X}
X
Xcmov(x,y)
Xregister x,y;
X{
X if(!CM) error("Tries to cmov from %d %d to %d %d\n",curx,cury,x,y);
X xputs(tparm(CM,y-1,x-1));
X cury = y;
X curx = x;
X}
X
X
Xnocmov(x,y)
X{
X if (curx < x) { /* Go to the right. */
X while (curx < x) {
X xputs(ND);
X curx++;
X }
X } else if (curx > x) {
X while (curx > x) { /* Go to the left. */
X xputs(BC);
X curx--;
X }
X }
X if (cury > y) {
X if(UP) {
X while (cury > y) { /* Go up. */
X xputs(UP);
X cury--;
X }
X } else cmov(x,y);
X } else if (cury < y) {
X if(XD) {
X while(cury<y) {
X xputs(XD);
X cury++;
X }
X } else cmov(x,y);
X }
X}
X
Xxputs(s) char *s; {
X putp(s);
X}
X
Xcl_end() {
X xputs(CE);
X}
X
Xclearscreen() {
X xputs(CL);
X curx = cury = 1;
X}
X
Xhome()
X{
X if(HO) xputs(HO);
X else xputs(tparm(CM,0,0));
X curx = cury = 1;
X}
X
Xstandoutbeg()
X{
X if(SO) xputs(SO);
X}
X
Xstandoutend()
X{
X if(SE) xputs(SE);
X}
X
Xbacksp()
X{
X xputs(BC);
X curx--;
X}
X
Xbeep()
X{
X xputs(bell);
X}
X
Xdelay() {
X /* delay 40 ms - could also use a 'nap'-system call */
X delay_output(40);
X}
!Funky!Stuff!
echo x - hack.tty.c
sed -e 's/^X//' > hack.tty.c << '!Funky!Stuff!'
X/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1984. */
X
X#define SINGLE
X#include <curses.h>
X#include <term.h>
X#undef move
X#include "hack.h"
X
Xextern short ospeed;
X
X
Xgettty(){
X def_prog_mode();
X ospeed = cur_term->Nttyb.c_cflag & CBAUD;
X/*
X if(ospeed <= B300) flags.oneline = 1;
X*/
X}
X
X/* reset terminal to original state */
Xsettty(s) char *s; {
X clearscreen();
X if(s) printf(s);
X (void) fflush(stdout);
X reset_shell_mode();
X}
X
Xsetctty()
X{
X reset_prog_mode();
X}
X
Xsetftty(){
Xregister int ef = (flags.echo == ON) ? ECHO : 0;
Xregister int cf = (flags.cbreak == ON) ? 0 : ICANON;
Xregister int change = 0;
X if((cur_term->Nttyb.c_lflag & ECHO) != ef){
X cur_term->Nttyb.c_lflag &= ~ECHO;
X cur_term->Nttyb.c_lflag |= ef;
X change++;
X }
X if((cur_term->Nttyb.c_lflag & ICANON) != cf){
X cur_term->Nttyb.c_lflag &= ~ICANON;
X cur_term->Nttyb.c_lflag |= cf;
X if (cur_term->Nttyb.c_lflag & ICANON) {
X cur_term->Nttyb.c_cc[VEOF] = cur_term->Ottyb.c_cc[VEOF];
X cur_term->Nttyb.c_cc[VEOL] = cur_term->Ottyb.c_cc[VEOL];
X } else {
X cur_term->Nttyb.c_cc[VTIME] = 1;
X cur_term->Nttyb.c_cc[VMIN] = 1;
X }
X change++;
X }
X if(change){
X setctty();
X }
X}
X
Xecho(n)
Xregister n;
X{
X
X if(n == ON)
X doecho();
X else
X donoecho();
X}
X
Xdoecho()
X{
X cur_term->Nttyb.c_lflag |= ECHO;
X setctty();
X}
X
Xdonoecho()
X{
X cur_term->Nttyb.c_lflag &= ~ECHO;
X setctty();
X}
X
Xgetlin(bufp)
Xregister char *bufp;
X{
X register char *obufp = bufp;
X register int c;
X
X flags.topl = 2; /* nonempty, no --More-- required */
X for(;;) {
X (void) fflush(stdout);
X if((c = getchar()) == EOF) {
X *bufp = 0;
X return;
X }
X if(c == '\b') {
X if(bufp != obufp) {
X bufp--;
X putstr("\b \b"); /* putsym converts \b */
X } else beep();
X } else if(c == '\n') {
X *bufp = 0;
X return;
X } else {
X *bufp = c;
X bufp[1] = 0;
X putstr(bufp);
X if(bufp-obufp < BUFSZ-1 && bufp-obufp < COLNO)
X bufp++;
X }
X }
X}
X
Xgetret() {
X xgetret(TRUE);
X}
X
Xcgetret() {
X xgetret(FALSE);
X}
X
Xxgetret(spaceflag)
Xboolean spaceflag; /* TRUE if space (return) required */
X{
X printf("\nHit %s to continue: ",
X flags.cbreak ? "space" : "return");
X xwaitforspace(spaceflag);
X}
X
Xchar morc; /* tell the outside world what char he used */
X
Xxwaitforspace(spaceflag)
Xboolean spaceflag;
X{
Xregister int c;
X
X (void) fflush(stdout);
X morc = 0;
X
X while((c = getchar()) != '\n') {
X if(c == EOF) {
X settty("End of input?\n");
X exit(0);
X }
X if(flags.cbreak) {
X if(c == ' ') break;
X if(!spaceflag && letter(c)) {
X morc = c;
X break;
X }
X }
X }
X}
X
Xchar *
Xparse()
X{
X static char inline[COLNO];
X register foo;
X
X flags.move = 1;
X if(!Invis) curs(u.ux,u.uy+2); else home();
X (void) fflush(stdout);
X while((foo = getchar()) >= '0' && foo <= '9')
X multi += 10*multi+foo-'0';
X if(multi) {
X multi--;
X save_cm = inline;
X }
X inline[0] = foo;
X inline[1] = 0;
X if(foo == EOF) {
X settty("End of input?\n");
X exit(0);
X }
X if(foo == 'f' || foo == 'F'){
X inline[1] = getchar();
X#ifdef QUEST
X if(inline[1] == foo) inline[2] = getchar(); else
X#endif QUEST
X inline[2] = 0;
X }
X if(foo == 'm' || foo == 'M'){
X inline[1] = getchar();
X inline[2] = 0;
X }
X clrlin();
X return(inline);
X}
X
Xchar
Xreadchar() {
X register int sym;
X (void) fflush(stdout);
X if((sym = getchar()) == EOF) {
X settty("End of input?\n");
X exit(0);
X }
X if(flags.topl == 1) flags.topl = 2;
X return((char) sym);
X}
!Funky!Stuff!
echo x - mklev.c
sed -e 's/^X//' > mklev.c << '!Funky!Stuff!'
X/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1984. */
X
X#include <stdio.h>
X#include "mklev.h"
X#include "def.trap.h"
X
Xextern void exit(),
X free(),
X qsort();
X
Xextern char *getlogin();
Xextern struct monst *makemon();
X
Xchar *tfile,*tspe,**args;
Xchar nul[40];
X
X#include "savelev.h"
X
X#ifdef WIZARD
Xboolean wizard;
X#endif WIZARD
X
Xlong lrand48();
X
X#define somex() (int)((lrand48()%(croom->hx-croom->lx+1))+croom->lx)
X#define somey() (int)((lrand48()%(croom->hy-croom->ly+1))+croom->ly)
X
Xstruct rm levl[COLNO][ROWNO];
Xstruct monst *fmon;
Xstruct obj *fobj;
Xstruct gen *fgold, *ftrap;
X
Xchar *fut_geno; /* monsters that should not be created anymore */
X
Xstruct mkroom rooms[MAXNROFROOMS+1], *croom, *troom;
Xcoord doors[DOORMAX];
Xint doorindex = 0;
Xint comp();
X
Xxchar dlevel;
Xschar nxcor,xx,yy,dx,dy,tx,ty; /* for corridors and other things... */
Xboolean goldseen;
Xint nroom;
X
Xxchar xdnstair,xupstair,ydnstair,yupstair;
X
X
Xmain(argc,argv)
Xchar *argv[];
X{
X register unsigned tryct;
X
X if(argc < 6) panic("Too few arguments!!");
X args = argv;
X tfile = argv[1];
X tspe = argv[2];
X dlevel = atoi(argv[3]);
X if(dlevel < 1) panic("Bad level");
X fut_geno = argv[4];
X#ifdef WIZARD
X wizard = (argv[5][0] == 'w');
X#endif WIZARD
X (void) setrand(0L);
X init_objects();
X rooms[0].hx = -1; /* in case we are in a maze */
X
X /* a: normal; b: maze */
X if(*tspe == 'b') {
X makemaz();
X savelev();
X exit(0);
X }
X
X /* construct the rooms */
X while(nroom < (MAXNROFROOMS/3)) {
X croom = rooms;
X nroom = 0;
X (void) makerooms(0); /* not secret */
X }
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)) (void)
X makemon((struct permonst *) 0, somex(), somey());
X
X /* put traps and mimics inside */
X goldseen = FALSE;
X while(!rn2(8-(dlevel/6))) mktrap(0,0);
X if(!goldseen && !rn2(3)) mkgold(0,somex(),somey());
X if(!rn2(3)) {
X mkobj_at(0, somex(), somey());
X tryct = 0;
X while(!rn2(5)) {
X if(++tryct > 100){
X printf("tryct overflow4\n");
X break;
X }
X mkobj_at(0, somex(), somey());
X }
X }
X }
X tryct = 0;
X do {
X if(++tryct > 1000) panic("Cannot make dnstairs\n");
X croom = &rooms[rn2(nroom)];
X xdnstair = somex();
X ydnstair = somey();
X } while((*tspe =='n' && (!(xdnstair%2) || !(ydnstair%2))) ||
X g_at(xdnstair,ydnstair,ftrap));
X levl[xdnstair][ydnstair].scrsym ='>';
X levl[xdnstair][ydnstair].typ = STAIRS;
X troom = croom;
X do {
X if(++tryct > 2000) 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 g_at(xupstair,yupstair,ftrap));
X levl[xupstair][yupstair].scrsym ='<';
X levl[xupstair][yupstair].typ = STAIRS;
X
X qsort((char *) rooms, (unsigned) nroom,
X sizeof(struct mkroom), comp);
X
X croom = rooms;
X troom = croom+1;
X nxcor = 0;
X mkpos();
X do makecor();
X while (croom->hx > 0 && troom->hx > 0);
X
X /* make a secret treasure vault, not connected to the rest */
X if(nroom < (2*MAXNROFROOMS/3)) if(!rn2(3)) {
X register int x,y;
X troom = croom = &rooms[nroom];
X if(makerooms(1)) { /* make secret room */
X troom->rtype = 6; /* treasure vault */
X for(x = troom->lx; x <= troom->hx; x++)
X for(y = troom->ly; y <= troom->hy; y++)
X mkgold(rnd(dlevel*100) + 50, x, y);
X }
X }
X
X#ifdef WIZARD
X if(wizard){
X if(rn2(3)) mkshop(); else mkzoo();
X } else
X#endif WIZARD
X if(dlevel > 1 && dlevel < 20 && rn2(dlevel) < 2) mkshop();
X else
X if(dlevel > 6 && (!rn2(7) || !strcmp("david", getlogin())))
X mkzoo();
X savelev();
X exit(0);
X}
X
Xmakerooms(secret) int secret; {
Xregister int lowx, lowy;
Xregister int tryct = 0;
X while(nroom < (MAXNROFROOMS/2) || secret)
X for(lowy = rn1(3,3); lowy < ROWNO-7; lowy += rn1(2,4)) {
X for(lowx = rn1(3,4); lowx < COLNO-10; lowx += rn1(2,7)) {
X if(tryct++ > 10000) return(0);
X if((lowy += (rn2(5)-2)) < 3) lowy = 3;
X else if(lowy > ROWNO-6) lowy = ROWNO-6;
X if(levl[lowx][lowy].typ) continue;
X if((secret && maker(lowx, 1, lowy, 1)) ||
X (!secret && maker(lowx,rn1(9,2),lowy,rn1(4,2))
X && nroom+2 > MAXNROFROOMS)) return(1);
X }
X }
X return(1);
X}
X
Xcomp(x,y)
Xregister struct mkroom *x,*y;
X{
X if(x->lx < y->lx) return(-1);
X return(x->lx > y->lx);
X}
X
Xcoord
Xfinddpos(xl,yl,xh,yh) {
Xcoord ff;
Xregister x,y;
X ff.x = (xl == xh) ? xl : (xl + rn2(xh-xl+1));
X ff.y = (yl == yh) ? yl : (yl + rn2(yh-yl+1));
X if(okdoor(ff.x, ff.y)) return(ff);
X if(xl < xh) for(x = xl; x <= xh; x++)
X if(okdoor(x, ff.y)){
X ff.x = x;
X return(ff);
X }
X if(yl < yh) for(y = yl; y <= yh; y++)
X if(okdoor(ff.x, y)){
X ff.y = y;
X return(ff);
X }
X return(ff);
X}
X
X/* when croom and troom exist, find position for a door in croom
X and direction for a corridor towards position [tx,ty] in the wall
X of troom */
Xmkpos()
X{
Xcoord cc,tt;
X if(troom->hx < 0 || croom->hx < 0 || doorindex >= DOORMAX) return;
X if(troom->lx > croom->hx) {
X dx = 1;
X dy = 0;
X xx = croom->hx+1;
X tx = troom->lx-1;
X cc = finddpos(xx,croom->ly,xx,croom->hy);
X tt = finddpos(tx,troom->ly,tx,troom->hy);
X } else if(troom->hy < croom->ly) {
X dy = -1;
X dx = 0;
X yy = croom->ly-1;
X cc = finddpos(croom->lx,yy,croom->hx,yy);
X ty = troom->hy+1;
X tt = finddpos(troom->lx,ty,troom->hx,ty);
X } else if(troom->hx < croom->lx) {
X dx = -1;
X dy = 0;
X xx = croom->lx-1;
X tx = troom->hx+1;
X cc = finddpos(xx,croom->ly,xx,croom->hy);
X tt = finddpos(tx,troom->ly,tx,troom->hy);
X } else {
X dy = 1;
X dx = 0;
X yy = croom->hy+1;
X ty = troom->ly-1;
X cc = finddpos(croom->lx,yy,croom->hx,yy);
X tt = finddpos(troom->lx,ty,troom->hx,ty);
X }
X xx = cc.x;
X yy = cc.y;
X tx = tt.x;
X ty = tt.y;
X if(levl[xx+dx][yy+dy].typ) {
X if(nxcor) newloc();
X else {
X dodoor(xx,yy,croom);
X xx += dx;
X yy += dy;
X }
X return;
X }
X dodoor(xx,yy,croom);
X}
X
X/* if allowable, create a door at [x,y] */
Xokdoor(x,y)
Xregister x,y;
X{
X if(levl[x-1][y].typ == DOOR || levl[x+1][y].typ == DOOR ||
X levl[x][y+1].typ == DOOR || levl[x][y-1].typ == DOOR ||
X levl[x-1][y].typ == SDOOR || levl[x+1][y].typ == SDOOR ||
X levl[x][y-1].typ == SDOOR || levl[x][y+1].typ == SDOOR ||
X (levl[x][y].typ != HWALL && levl[x][y].typ != VWALL) ||
X doorindex >= DOORMAX)
X return(0);
X return(1);
X}
X
Xdodoor(x,y,aroom)
Xregister x,y;
Xregister struct mkroom *aroom;
X{
X register struct mkroom *broom;
X register tmp;
X if(doorindex >= DOORMAX) panic("DOORMAX exceeded?");
X if(!okdoor(x,y) && nxcor) return;
X if(!rn2(8)) levl[x][y].typ = SDOOR;
X else {
X levl[x][y].scrsym ='+';
X levl[x][y].typ = DOOR;
X }
X aroom->doorct++;
X broom = aroom+1;
X if(broom->hx < 0) tmp = doorindex; else
X for(tmp = doorindex; tmp > broom->fdoor; tmp--)
X doors[tmp] = doors[tmp-1];
X doorindex++;
X doors[tmp].x = x;
X doors[tmp].y = y;
X for( ; broom->hx >= 0; broom++) broom->fdoor++;
X}
X
Xnewloc()
X{
X register a,b;
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 a = rn2(nroom);
X b = rn2(nroom);
X croom = &rooms[a];
X troom = &rooms[b];
X } while(croom == troom || (troom == croom+1 && !rn2(3)));
X }
X mkpos();
X}
X
X/* make a trap somewhere (in croom if mazeflag = 0) */
Xmktrap(num,mazeflag)
Xregister num,mazeflag;
X{
X register struct gen *gtmp;
X register int kind,nopierc,nomimic,fakedoor,fakegold,tryct = 0;
X register xchar mx,my;
X
X if(!num || num >= TRAPNUM) {
X nopierc = (dlevel < 4) ? 1 : 0;
X nomimic = (dlevel < 9 || goldseen ) ? 1 : 0;
X if(index(fut_geno, 'M')) nomimic = 1;
X kind = rn2(TRAPNUM - nopierc - nomimic);
X /* note: PIERC = 7, MIMIC = 8, TRAPNUM = 9 */
X } else kind = num;
X
X if(kind == MIMIC) {
X register struct monst *mtmp;
X
X fakedoor = (!rn2(3) && !mazeflag);
X fakegold = (!fakedoor && !rn2(2));
X if(fakegold) goldseen = TRUE;
X do {
X if(++tryct > 200) return;
X if(fakedoor) {
X /* note: fakedoor maybe on actual door */
X if(rn2(2)){
X if(rn2(2))
X mx = croom->hx+1;
X else mx = croom->lx-1;
X my = somey();
X } else {
X if(rn2(2))
X my = croom->hy+1;
X else my = croom->ly-1;
X mx = somex();
X }
X } else if(mazeflag) {
X extern coord mazexy();
X coord mm;
X mm = mazexy();
X mx = mm.x;
X my = mm.y;
X } else {
X mx = somex();
X my = somey();
X }
X } while(m_at(mx,my));
X if(mtmp = makemon(PM_MIMIC,mx,my))
X mtmp->mimic =
X fakegold ? '$' : fakedoor ? '+' :
X (mazeflag && rn2(2)) ? AMULET_SYM :
X "=/)%?![<>" [ rn2(9) ];
X return;
X }
X gtmp = newgen();
X gtmp->gflag = kind;
X do {
X if(++tryct > 200){
X printf("tryct overflow7\n");
X free((char *) gtmp);
X return;
X }
X if(mazeflag){
X extern coord mazexy();
X coord mm;
X mm = mazexy();
X gtmp->gx = mm.x;
X gtmp->gy = mm.y;
X } else {
X gtmp->gx = somex();
X gtmp->gy = somey();
X }
X } while(g_at(gtmp->gx, gtmp->gy, ftrap));
X gtmp->ngen = ftrap;
X ftrap = gtmp;
X if(mazeflag && !rn2(10) && gtmp->gflag < PIERC) gtmp->gflag |= SEEN;
X}
X
X/*VARARGS1*/
Xpanic(str,arg1,arg2,arg3)
Xchar *str,*arg1,*arg2,*arg3;
X{
X char bufr[BUFSZ];
X extern int sprintf();
X (void) sprintf(bufr,str,arg1,arg2,arg3);
X (void) write(1,"\nMKLEV ERROR: ",15);
X puts(bufr);
X (void) fflush(stdout);
X exit(1);
X}
X
Xmaker(lowx,ddx,lowy,ddy)
Xschar lowx,ddx,lowy,ddy;
X{
X register x, y, hix = lowx+ddx, hiy = lowy+ddy;
X
X if(nroom >= MAXNROFROOMS) return(0);
X if(hix > COLNO-5) hix = COLNO-5;
X if(hiy > ROWNO-4) hiy = ROWNO-4;
Xchk:
X if(hix <= lowx || hiy <= lowy) return(0);
X
X /* check area around room (and make room smaller if necessary) */
X for(x = lowx-4; x <= hix+4; x++)
X for(y = lowy-3; y <= hiy+3; y++)
X if(levl[x][y].typ) {
X if(rn2(3)) return(0);
X lowx = x+5;
X lowy = y+4;
X goto chk;
X }
X
X /* on low levels the room is lit (usually) */
X /* secret vaults are always lit */
X if((rnd(dlevel) < 10 && rn2(77)) || (ddx == 1 && ddy == 1))
X for(x = lowx-1; x <= hix+1; x++)
X for(y = lowy-1; y <= hiy+1; y++)
X levl[x][y].lit = 1;
X croom->lx = lowx;
X croom->hx = hix;
X croom->ly = lowy;
X croom->hy = hiy;
X croom->rtype = croom->doorct = croom->fdoor = 0;
X for(x = lowx-1; x <= hix+1; x++)
X for(y = lowy-1; y <= hiy+1; y += (hiy-lowy+2)) {
X levl[x][y].scrsym = '-';
X levl[x][y].typ = HWALL;
X }
X for(x = lowx-1; x <= hix+1; x += (hix-lowx+2))
X for(y = lowy; y <= hiy; y++) {
X levl[x][y].scrsym = '|';
X levl[x][y].typ = VWALL;
X }
X for(x = lowx; x <= hix; x++)
X for(y = lowy; y <= hiy; y++) {
X levl[x][y].scrsym = '.';
X levl[x][y].typ = ROOM;
X }
X croom++;
X croom->hx = -1;
X nroom++;
X return(1);
X}
X
Xmakecor() {
X register nx, ny;
X register struct rm *crm;
X register dix, diy, secondtry = 0;
X
Xtryagain:
X nx = xx + dx;
X ny = yy + dy;
X
X if(nxcor && !rn2(35)) {
X newloc();
X return;
X }
X if(nx == COLNO-1 || nx == 0 || ny == 0 || ny == ROWNO-1) {
X if(nxcor) {
X newloc();
X return;
X } else {
X printf("something went wrong. we try again...\n");
X execl("./mklev",args[0],tfile,tspe,args[3],args[4],args[5],0);
X panic("cannot execute ./mklev\n");
X }
X }
X
X dix = abs(nx-tx);
X diy = abs(ny-ty);
X if(dy && dix > diy) {
X dy = 0;
X dx = (nx > tx) ? -1 : 1;
X } else if(dx && diy > dix) {
X dx = 0;
X dy = (ny > ty) ? -1 : 1;
X }
X
X crm = &levl[nx][ny];
X if(!(crm->typ)) {
X if(rn2(100)) {
X crm->typ = CORR;
X crm->scrsym = CORR_SYM;
X } else {
X crm->typ = SCORR;
X crm->scrsym = ' ';
X }
X xx = nx;
X yy = ny;
X if(nxcor && !rn2(50)) {
X mkobj_at(ROCK_SYM, nx, ny);
X }
X return;
X }
X if(crm->typ == CORR || crm->typ == SCORR) {
X xx = nx;
X yy = ny;
X return;
X }
X if(nx == tx && ny == ty) {
X dodoor(nx,ny,troom);
X newloc();
X return;
X }
X if(!secondtry++ && (nx != xx+dx || ny != yy+dy))
X goto tryagain;
X if(dx) {
X if(ty < ny) dy = -1;
X else dy = levl[nx+dx][ny-1].typ == ROOM?1:-1;
X dx = 0;
X } else {
X if(tx < nx) dx = -1;
X else dx = levl[nx-1][ny+dy].typ == ROOM?1:-1;
X dy = 0;
X }
X}
X
Xstruct monst *
Xm_at(x,y)
Xregister x,y;
X{
X register struct monst *mtmp;
X
X for(mtmp = fmon; mtmp; mtmp = mtmp->nmon)
X if(mtmp->mx == x && mtmp->my == y) return(mtmp);
X return(0);
X}
X
Xstruct gen *
Xg_at(x,y,ptr)
Xregister x,y;
Xregister struct gen *ptr;
X{
X while(ptr) {
X if(ptr->gx == x && ptr->gy == y) return(ptr);
X ptr = ptr->ngen;
X }
X return(0);
X}
!Funky!Stuff!
echo x - mklev.h
sed -e 's/^X//' > mklev.h << '!Funky!Stuff!'
X/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1984. */
X
X#include "config.h"
X
X#ifdef BSD
X#include <strings.h> /* declarations for strcat etc. */
X#else
X#include <string.h> /* idem on System V */
X#define index strchr
X#define rindex strrchr
X#endif BSD
X
X#include "def.objclass.h"
X
Xtypedef struct {
X xchar x,y;
X} coord;
X
X#include "def.monst.h" /* uses coord */
X#include "def.gen.h"
X#include "def.obj.h"
X
Xextern int sprintf();
X
X#define BUFSZ 256 /* for getlin buffers */
X#define PL_NSIZ 32 /* name of player, ghost, shopkeeper */
X
X#define HWALL 1 /* Level location types */
X#define VWALL 2
X#define SDOOR 3
X#define SCORR 4
X#define LDOOR 5
X#define DOOR 6 /* smallest accessible type */
X#define CORR 7
X#define ROOM 8
X#define STAIRS 9
X#ifdef QUEST
X#define CORR_SYM ':'
X#else
X#define CORR_SYM '#'
X#endif QUEST
X
X#define ERRCHAR '{'
X
X#define TRAPNUM 9
X
Xstruct rm {
X char scrsym;
X unsigned typ:5;
X unsigned new:1;
X unsigned seen:1;
X unsigned lit:1;
X};
Xextern struct rm levl[COLNO][ROWNO];
X
X#ifndef QUEST
Xstruct mkroom {
X xchar lx,hx,ly,hy;
X schar rtype,rlit,doorct,fdoor;
X};
X#define MAXNROFROOMS 15
Xextern struct mkroom rooms[MAXNROFROOMS+1];
X#define DOORMAX 100
Xextern coord doors[DOORMAX];
X#endif QUEST
X
X
X#include "def.permonst.h"
Xextern struct permonst mons[];
X#define PM_ACIDBLOB &mons[7]
X#define PM_PIERC &mons[17]
X#define PM_MIMIC &mons[37]
X#define PM_CHAM &mons[47]
X#define PM_DEMON &mons[54]
X#define PM_MINOTAUR &mons[55] /* last in mons array */
X#define PM_SHK &mons[56] /* very last */
X#define CMNUM 55 /* number of common monsters */
X
Xextern long *alloc();
X
Xextern xchar xdnstair, ydnstair, xupstair, yupstair; /* stairs up and down. */
X
Xextern xchar dlevel;
X#ifdef WIZARD
Xextern boolean wizard;
X#endif WIZARD
X#define newstring(x) (char *) alloc((unsigned)(x))
!Funky!Stuff!
echo x - rnd.c
sed -e 's/^X//' > rnd.c << '!Funky!Stuff!'
X#include <sys/types.h>
X#define RND(x) ((lrand48()>>3) % x)
Xlong lrand48();
X
Xsetrand(arg)
Xlong arg;
X{
X time_t time();
X void srand48();
X
X if (arg) {
X srand48(arg);
X } else {
X srand48(time(0));
X }
X}
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--) tmp += RND(x);
X return(tmp);
X}
!Funky!Stuff!
echo x - savelev.h
sed -e 's/^X//' > savelev.h << '!Funky!Stuff!'
X/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1984. */
X
X#ifdef MKLEV
X
Xsavelev(){
X int fd;
X
X#else
Xextern struct obj *billobjs;
X
Xsavelev(fd){
X#ifndef NOWORM
X register struct wseg *wtmp, *wtmp2;
X register tmp;
X#endif NOWORM
X
X#endif MKLEV
X
X#ifdef MKLEV
X if((fd = creat(tfile,FMASK)) < 0) panic("Cannot create %s\n", tfile);
X#else
X if(fd < 0) panic("Save on bad file!");
X#endif MKLEV
X bwrite(fd,(char *) levl,sizeof(levl));
X#ifdef MKLEV
X bwrite(fd,(char *) nul,sizeof(long));
X#else
X bwrite(fd,(char *) &moves,sizeof(long));
X#endif MKLEV
X bwrite(fd,(char *) &xupstair,sizeof(xupstair));
X bwrite(fd,(char *) &yupstair,sizeof(yupstair));
X bwrite(fd,(char *) &xdnstair,sizeof(xdnstair));
X bwrite(fd,(char *) &ydnstair,sizeof(ydnstair));
X savemonchn(fd, fmon);
X savegenchn(fd, fgold);
X savegenchn(fd, ftrap);
X saveobjchn(fd, fobj);
X#ifdef MKLEV
X saveobjchn(fd, (struct obj *) 0);
X bwrite(fd,(char *) nul, sizeof(unsigned));
X#else
X saveobjchn(fd, billobjs);
X billobjs = 0;
X save_engravings(fd);
X#endif MKLEV
X#ifndef QUEST
X bwrite(fd,(char *) rooms,sizeof(rooms));
X bwrite(fd,(char *) doors,sizeof(doors));
X#endif QUEST
X fgold = ftrap = 0;
X fmon = 0;
X fobj = 0;
X#ifndef MKLEV
X/*--------------------------------------------------------------------*/
X#ifndef NOWORM
X bwrite(fd,(char *) wsegs,sizeof(wsegs));
X for(tmp=1; tmp<32; tmp++){
X for(wtmp = wsegs[tmp]; wtmp; wtmp = wtmp2){
X wtmp2 = wtmp->nseg;
X bwrite(fd,(char *) wtmp,sizeof(struct wseg));
X }
X wsegs[tmp] = 0;
X }
X bwrite(fd,(char *) wgrowtime,sizeof(wgrowtime));
X#endif NOWORM
X/*--------------------------------------------------------------------*/
X#endif MKLEV
X}
X
Xbwrite(fd,loc,num)
Xregister fd;
Xregister char *loc;
Xregister unsigned num;
X{
X if(write(fd, loc, num) != num)
X panic("cannot write %d bytes to file #%d",num,fd);
X}
X
Xsaveobjchn(fd,otmp)
Xregister fd;
Xregister struct obj *otmp;
X{
X register struct obj *otmp2;
X unsigned xl;
X int minusone = -1;
X
X while(otmp) {
X otmp2 = otmp->nobj;
X xl = otmp->onamelth;
X bwrite(fd, (char *) &xl, sizeof(int));
X bwrite(fd, (char *) otmp, xl + sizeof(struct obj));
X free((char *) otmp);
X otmp = otmp2;
X }
X bwrite(fd, (char *) &minusone, sizeof(int));
X}
X
Xsavemonchn(fd,mtmp)
Xregister fd;
Xregister struct monst *mtmp;
X{
X register struct monst *mtmp2;
X unsigned xl;
X int minusone = -1;
X struct permonst *monbegin = &mons[0];
X
X bwrite(fd, (char *) &monbegin, sizeof(monbegin));
X
X while(mtmp) {
X mtmp2 = mtmp->nmon;
X xl = mtmp->mxlth + mtmp->mnamelth;
X bwrite(fd, (char *) &xl, sizeof(int));
X bwrite(fd, (char *) mtmp, xl + sizeof(struct monst));
X if(mtmp->minvent) saveobjchn(fd,mtmp->minvent);
X free((char *) mtmp);
X mtmp = mtmp2;
X }
X bwrite(fd, (char *) &minusone, sizeof(int));
X}
X
Xsavegenchn(fd,gtmp)
Xregister fd;
Xregister struct gen *gtmp;
X{
X register struct gen *gtmp2;
X while(gtmp) {
X gtmp2 = gtmp->ngen;
X bwrite(fd, (char *) gtmp, sizeof(struct gen));
X free((char *) gtmp);
X gtmp = gtmp2;
X }
X bwrite(fd, nul, sizeof(struct gen));
X}
!Funky!Stuff!
exit
--
Gordon A. Moffett ...!{ihnp4,hplabs,sun}!amdahl!gam
"Her name was McGill, and she called herself Lil, but everyone knew
her as Nancy...."
More information about the Comp.sources.unix
mailing list