|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T m
Length: 26141 (0x661d) Types: TextFile Names: »main.c.orig«
└─⟦b20c6495f⟧ Bits:30007238 EUUGD18: Wien-båndet, efterår 1987 └─⟦this⟧ »EUUGD18/General/Ularn/main.c.orig«
/* main.c */ /* This game is bad for you. It is evil. It will rot your brain. */ #include "header.h" static char copyright[]= "\nUlarn was created by Phil Cordier and is based on Larn 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 */ int stayflag=0; 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[] = "\ Cmd line format: Ularn [-slicnh] [-o<optsfile>] [-##] [++]\n\ -s show the scoreboard\n\ -i show scoreboard with inventories\n\ -c create new scoreboard (wizard only)\n\ -n suppress welcome message on starting game\n\ -h print this help text\n\ -o<optsfile> specify .Ularnopts file to be used instead of \"~/.Ularnopts\"\n\ -## specify level of difficulty (example: Ularn -5)\n\ -++ restore game checkpoint file\n"; /* ************ MAIN PROGRAM ************ */ main(argc,argv) int argc; char **argv; { register int i; int hard; char *ptr=0; struct passwd *pwe,*getpwuid(); init_term(); /*setup the terminal (find out what type) for termcap */ /* * first task is to identify the player */ if ((ptr = getlogin()) == NULL) if (pwe=getpwuid(geteuid())) ptr = pwe->pw_name; else if ((ptr = getenv("USER")) == NULL) { noone: fprintf(stderr, "Can't find your logname. Who Are You?\n"); fflush(stderr); exit(1); } if (ptr==NULL) 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) if ((ptr = pwe->pw_dir) == NULL) ptr = "."; /* save file name in home directory */ strcpy(savefilename, ptr); strcat(savefilename, "/Ularn.sav"); sprintf(optsfile, "%s/.Ularnopts",ptr); /* the .Ularnopts filename */ strcat(scorefile, SCORENAME); /* the Ularn scoreboard filename */ strcat(logfile, LOGFNAME); /* Ularn activity logging filename */ strcat(helpfile, HELPNAME); /* the Ularn on-line help file */ strcat(larnlevels, LEVELSNAME); /* the pre-made cave level data file */ strcat(fortfile, FORTSNAME); /* the fortune data file name */ /* * now malloc the memory for the dungeon */ cell = (struct cel *)malloc(sizeof(struct cel)*(MAXLEVEL+MAXVLEVEL)*MAXX*MAXY); if (cell == (struct cel *)NULL) died(-285); /* malloc failure */ if ( ( lpbuf = malloc ((5* BUFBIG)>>2) ) == (char *)NULL) died(-285); if ( ( inbuffer = malloc( (5*MAXIBUF) >>2) ) == (char *)NULL) died(-285); lcreat((char*)0); newgame(); /* set the initial clock */ hard= -1; /* * 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++) { if (argv[i][0] == '-') switch(argv[i][1]) { case 's': showscores(); exit(0); /* show scoreboard */ case 'i': showallscores(); exit(0); /* show all scoreboard */ case 'c': /*anyone with password can create scoreboard*/ setupvt100(); lprcat("Preparing to initialize the scoreboard.\n"); if (getpassword() != 0) { makeboard(); showscores(); } exit(0); case 'n': 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); if (hard > 100) hard = 100; break; case 'h': /* print out command line arguments */ fprintf(stderr, "%s", cmdhelp); fflush(stderr); exit(0); case 'o': /* specify a .Ularnopts filename */ strncpy(optsfile,argv[i]+2,127); break; default: fprintf(stderr,"Unknown option <%s>\n",argv[i]); fprintf(stderr,"%s", cmdhelp); fflush(stderr); exit(1); }; if (argv[i][0] == '+') { clear(); restorflag = 1; if (argv[i][1] == '+') { hitflag=1; restoregame(ckpfile); /* restore checkpointed game */ } i = argc; } } userid = geteuid(); /* obtain the user's effective id number */ sigsetup(); /* trap all needed signals */ sethard(hard); /* set up the desired difficulty */ setupvt100(); /* setup the terminal special mode */ readopts(); /* read the options file if there is one */ /* restore game if need to */ if (access(savefilename,0)==0) { clear(); restorflag = 1; hitflag=1; restoregame(savefilename); } /* create new game */ if (c[HP]==0) { 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 */ /* tell the trap functions that they must do a showplayer() from here on */ predostuff = 2; yrepcount = hit2flag = 0; /* * M A I N L O O P */ 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)/* get commands and make moves */ { if (hit3flag) flushall(); nomove=0; parse(); } regen(); /* regenerate hp and spells*/ if (c[TIMESTOP]==0) if (--rmst <= 0) { rmst = 120-(level<<2); fillmonst(makemonst(level)); } } /* end main loop */ } /* end main */ /* showstr() show character's inventory */ 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); } qshowstr() { register int 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=0; k<=26; k++) if (iven[k]) show3(k); lprintf("\nElapsed time is %d. You have %d mobuls left", (long)((gtime+99)/100+1),(long)((TIMELIMIT-gtime)/100)); more(); nosignal=sigsav; } /* * subroutine to clear screen depending on # lines to display */ t_setup(count) register int count; { if (count<20) { cl_up(79,count); cursor(1,1); } else { resetscroll(); clear(); } } /* * subroutine to restore normal display screen depending on t_setup() */ 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(); } } /* function to show the things player is wearing only */ showwear() { register int i,j,sigsav,count; sigsav=nosignal; nosignal=1; /* don't allow ^c etc */ srcount=0; /* count number of items we will display */ for (count=2,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: case OELVENCHAIN: count++; }; t_setup(count); for (i=22; i<93; 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: case OELVENCHAIN: show3(j); }; more(); nosignal=sigsav; t_endup(count); } /* function to show the things player can wield only */ 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 OORB: case OHANDofFEAR: case OBRASSLAMP: case OURN: case OWWAND: case OSPHTALISMAN: case OSCROLL: break; default: count++; }; t_setup(count); for (i=22; i<93; 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 OHANDofFEAR: case OBRASSLAMP: case OURN: case OSPHTALISMAN: case OWWAND: case OORB: case OSCROLL: break; default: show3(j); }; more(); nosignal=sigsav; t_endup(count); } /* * function to show the things player can read only */ showread() { 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++) 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); }; more(); nosignal=sigsav; t_endup(count); } /* * function to show the things player can eat only */ showeat() { 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++) 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); }; more(); nosignal=sigsav; t_endup(count); } /* function to show the things player can quaff only */ showquaff() { 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++) 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); }; more(); nosignal=sigsav; t_endup(count); } show1(idx,str2) register int idx; register char *str2[]; { if (str2==0) lprintf("\n%c) %s",idx+'a',objectname[iven[idx]]); else if (*str2[ivenarg[idx]]==0) lprintf("\n%c) %s",idx+'a',objectname[iven[idx]]); else lprintf("\n%c) %s of%s", idx+'a',objectname[iven[idx]],str2[ivenarg[idx]]); } 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 OORB: case OHANDofFEAR: case OBRASSLAMP: case OURN: case OWWAND: case OSPHTALISMAN: 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 */ randmonst() { /* don't make monsters if time is stopped */ if (c[TIMESTOP]) return; if (--rmst <= 0) { rmst = 120 - (level<<2); fillmonst(makemonst(level)); } } /* parse() get and execute a command */ parse() { register int i,j,k,flag; while (1) { k = yylex(); /* get the token from the input and switch on it */ switch(k) { case 'A': if (wizard) diag(); yrepcount=0; return; 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 (wizard) { int t; cursors(); lprcat("\nWhich level do you wish to teleport to? "); t = readnum(20); if (t > 20 || t < 0) { lprcat(" sorry!"); return; } playerx = rnd(MAXX-2); playery = rnd(MAXY-2); newcavelevel(t); positionplayer(); draws(0,MAXX,0,MAXY); bot_linex(); return; } if (c[LEVEL]>9) { oteleport(1); return; } cursors(); lprcat("\nYou don't know how to teleport yet"); 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: case OELEVATORUP: case OELEVATORDOWN: lprcat("\nIt's "); lprcat(objectname[item[i][j]]); flag++; }; } } if (flag==0) lprcat("\nNo traps are visible"); return; case '#': yrepcount=0; cursors(); nomove=1; if (getpassword()==0) { scbr(); return; } scbr(); raiseexperience(370 * 1000000); bottomline(); drawscreen(); return; #if WIZID case '_': /*this is the fudge player password for wizard mode*/ yrepcount=0; cursors(); nomove=1; if (getpassword()==0) { scbr(); return; } wizard=1; scbr(); for (i=0; i<6; i++) c[i]=70; iven[0]=iven[1]=0; take(OPROTRING,50); take(OLANCE,25); for (i=0; i<26; i++) if (iven[i]==OLANCE && ivenarg[i]==25) { c[WIELD]=i; break; } c[LANCEDEATH]=1; c[WEAR] = c[SHIELD] = -1; raiseexperience(370*1000000); 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][0]=' '; for (i=0; i<MAXPOTION; i++) potionname[i][0]=' '; } for (i=0; i<MAXSCROLL; i++) if (strlen(scrollname[i])>2) { 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]+=250000; bottomline(); drawscreen(); return; #endif /* WIZID */ 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 'v': yrepcount=0; cursors(); lprintf( "\nThe Addiction of Ularn, by Satyr. Difficulty : %d", (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 'L'-64: yrepcount=0; drawscreen(); nomove=1; return; /* look */ 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; }; } } parse2() { if (c[HASTEMONST]) movemonst(); movemonst(); /* move the monsters */ randmonst(); regen(); } 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); } } /* 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; } } } } /* common routine to say you don't have an item */ ydhi(x) int x; { cursors(); lprintf("\nYou don't have item %c!",x); } ycwi(x) int x; { cursors(); lprintf("\nYou can't wield item %c!",x); } /* function to wear armor */ 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 OELVENCHAIN: 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 */ dropobj() { register int i; register char *p; long amt; p = &item[playerx][playery]; while (1) { if ((i = whatitem("drop"))=='\33') return; if (i=='*') showstr(); else { /* drop some gold */ if (i=='.') { if (*p) { lprcat("\nThere's something here already!"); return; } lprcat("\n\n"); 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; } drop_object(i-'a'); return; } } } /* * readscr() Subroutine to read a scroll one is carrying */ 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; } } } } /* * subroutine to eat a cookie one is carrying */ 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(fortfile)) { lprcat(" Inside you find a scrap of paper that says:\n"); lprcat(p); } } return; } if (iven[i-'a']==0) { ydhi(i); return; } lprcat("\nYou can't eat that!"); return; } } } /* * subroutine to quaff a potion one is carrying */ quaff() { register int i; while (1) { if ((i = qwhatitem())=='\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; } } } } qwhatitem() { int j, i=0; char gack[26]; cursors(); for (j=0; j<=26; j++) switch(iven[j]) { case OPOTION: gack[i++] = j; }; lprintf("\nWhat do you want to quaff ["); if (i) for (j=0;j<i;j++) lprintf("%c",gack[j] + 'a'); lprintf(" * for all] ?"); i=0; while (i>'z' || (i<'a' && i!='*' && i!='\33' && i!='.')) i=getcharacter(); if (i=='\33') lprcat(" aborted"); return(i); } /* function to ask what player wants to do */ whatitem(str) char *str; { register int j=0, flag=0, i=0; int wld=0, q=0, r=0, w=0, e=0, d=0; char gack[26]; cursors(); if (!strcmp(str, "wield")) wld = 1; else if (!strcmp(str, "quaff")) q = 1; else if (!strcmp(str, "read")) r = 1; else if (!strcmp(str, "wear")) w = 1; else if (!strcmp(str, "eat")) e = 1; else if (!strcmp(str, "drop")) d = 1; for (j=0; j<=26; j++) { switch(iven[j]) { case OSWORDofSLASHING : case OHAMMER: case OSWORD: case O2SWORD: case OSPEAR : case ODAGGER: case OBATTLEAXE: case OLONGSWORD: case OFLAIL: case OSLAYER : case OLANCE : flag = 1; break; /* wield */ case OPOTION: flag = 2; break; /* quaff */ case OSCROLL: flag = 3; break; /* read */ case OPLATE : case OCHAIN: case OLEATHER : case ORING : case OSTUDLEATHER : case OSPLINT : case OPLATEARMOR : case OSSPLATE : case OSHIELD : case OELVENCHAIN : flag = 4; break; /* wear */ case OCOOKIE: flag = 5; break; /* eat */ default : flag = 0; break; } if (!d) switch (flag) { case 0 : break; case 1 : if (wld) gack[i++] = j; break; case 2 : if (q) gack[i++] = j; break; case 3 : if (r) gack[i++] = j; break; case 4 : if (w) gack[i++] = j; break; case 5 : if (e) gack[i++] = j; default : break; } else if (iven[j]) gack[i++] = j; } lprintf("\nWhat do you want to %s [", str); if (i) { for (j=0;j<i;j++) lprintf("%c",gack[j] + 'a'); lprintf(" "); } lprintf("* for all] ?"); i=0; while (i>'z' || (i<'a' && i!='*' && i!='\33' && i!='.')) i=getcharacter(); 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 */ long readnum(mx) long mx; { register int i; long amt=0; sncbr(); if ((i=getcharacter()) == '*') 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<999999999)) amt = amt*10+i-'0'; i = getcharacter(); } scbr(); return(amt); }