|
|
1.1 ! root 1: /* main.c */ ! 2: #include <sys/types.h> ! 3: #include "header.h" ! 4: #include <pwd.h> ! 5: static char copyright[]="\nLarn is copyrighted 1986 by Noah Morgan.\n"; ! 6: int srcount=0; /* line counter for showstr() */ ! 7: int dropflag=0; /* if 1 then don't lookforobject() next round */ ! 8: int rmst=80; /* random monster creation counter */ ! 9: int userid; /* the players login user id number */ ! 10: char nowelcome=0,nomove=0; /* if (nomove) then don't count next iteration as a move */ ! 11: static char viewflag=0; ! 12: /* if viewflag then we have done a 99 stay here and don't showcell in the main loop */ ! 13: char restorflag=0; /* 1 means restore has been done */ ! 14: static char cmdhelp[] = "\ ! 15: Cmd line format: larn [-slicnh] [-o<optsifle>] [-##] [++]\n\ ! 16: -s show the scoreboard\n\ ! 17: -l show the logfile (wizard id only)\n\ ! 18: -i show scoreboard with inventories of dead characters\n\ ! 19: -c create new scoreboard (wizard id only)\n\ ! 20: -n suppress welcome message on starting game\n\ ! 21: -## specify level of difficulty (example: -5)\n\ ! 22: -h print this help text\n\ ! 23: ++ restore game from checkpoint file\n\ ! 24: -o<optsfile> specify .larnopts filename to be used instead of \"~/.larnopts\"\n\ ! 25: "; ! 26: #ifdef VT100 ! 27: static char *termtypes[] = { "vt100", "vt101", "vt102", "vt103", "vt125", ! 28: "vt131", "vt140", "vt180", "vt220", "vt240", "vt241", "vt320", "vt340", ! 29: "vt341" }; ! 30: #endif VT100 ! 31: /* ! 32: ************ ! 33: MAIN PROGRAM ! 34: ************ ! 35: */ ! 36: main(argc,argv) ! 37: int argc; ! 38: char **argv; ! 39: { ! 40: register int i,j; ! 41: int hard; ! 42: char *ptr=0,*ttype; ! 43: struct passwd *pwe,*getpwuid(); ! 44: ! 45: /* ! 46: * first task is to identify the player ! 47: */ ! 48: #ifndef VT100 ! 49: init_term(); /* setup the terminal (find out what type) for termcap */ ! 50: #endif VT100 ! 51: if (((ptr = getlogin()) == 0) || (*ptr==0)) /* try to get login name */ ! 52: if (pwe=getpwuid(getuid())) /* can we get it from /etc/passwd? */ ! 53: ptr = pwe->pw_name; ! 54: else ! 55: if ((ptr = getenv("USER")) == 0) ! 56: if ((ptr = getenv("LOGNAME")) == 0) ! 57: { ! 58: noone: write(2, "Can't find your logname. Who Are You?\n",39); ! 59: exit(); ! 60: } ! 61: if (ptr==0) goto noone; ! 62: if (strlen(ptr)==0) goto noone; ! 63: /* ! 64: * second task is to prepare the pathnames the player will need ! 65: */ ! 66: strcpy(loginname,ptr); /* save loginname of the user for logging purposes */ ! 67: strcpy(logname,ptr); /* this will be overwritten with the players name */ ! 68: if ((ptr = getenv("HOME")) == 0) ptr = "."; ! 69: strcpy(savefilename, ptr); ! 70: strcat(savefilename, "/Larn.sav"); /* save file name in home directory */ ! 71: sprintf(optsfile, "%s/.larnopts",ptr); /* the .larnopts filename */ ! 72: ! 73: /* ! 74: * now malloc the memory for the dungeon ! 75: */ ! 76: cell = (struct cel *)malloc(sizeof(struct cel)*(MAXLEVEL+MAXVLEVEL)*MAXX*MAXY); ! 77: if (cell == 0) died(-285); /* malloc failure */ ! 78: lpbuf = malloc((5* BUFBIG)>>2); /* output buffer */ ! 79: inbuffer = malloc((5*MAXIBUF)>>2); /* output buffer */ ! 80: if ((lpbuf==0) || (inbuffer==0)) died(-285); /* malloc() failure */ ! 81: ! 82: lcreat((char*)0); newgame(); /* set the initial clock */ hard= -1; ! 83: ! 84: #ifdef VT100 ! 85: /* ! 86: * check terminal type to avoid users who have not vt100 type terminals ! 87: */ ! 88: ttype = getenv("TERM"); ! 89: for (j=1, i=0; i<sizeof(termtypes)/sizeof(char *); i++) ! 90: if (strcmp(ttype,termtypes[i]) == 0) { j=0; break; } ! 91: if (j) ! 92: { ! 93: lprcat("Sorry, Larn needs a VT100 family terminal for all it's features.\n"); lflush(); ! 94: exit(); ! 95: } ! 96: #endif VT100 ! 97: ! 98: /* ! 99: * now make scoreboard if it is not there (don't clear) ! 100: */ ! 101: if (access(scorefile,0) == -1) /* not there */ ! 102: makeboard(); ! 103: ! 104: /* ! 105: * now process the command line arguments ! 106: */ ! 107: for (i=1; i<argc; i++) ! 108: { ! 109: if (argv[i][0] == '-') ! 110: switch(argv[i][1]) ! 111: { ! 112: case 's': showscores(); exit(); /* show scoreboard */ ! 113: ! 114: case 'l': /* show log file */ ! 115: diedlog(); exit(); ! 116: ! 117: case 'i': showallscores(); exit(); /* show all scoreboard */ ! 118: ! 119: case 'c': /* anyone with password can create scoreboard */ ! 120: lprcat("Preparing to initialize the scoreboard.\n"); ! 121: if (getpassword() != 0) /*make new scoreboard*/ ! 122: { ! 123: makeboard(); lprc('\n'); showscores(); ! 124: } ! 125: exit(); ! 126: ! 127: case 'n': /* no welcome msg */ nowelcome=1; argv[i][0]=0; break; ! 128: ! 129: case '0': case '1': case '2': case '3': case '4': case '5': ! 130: case '6': case '7': case '8': case '9': /* for hardness */ ! 131: sscanf(&argv[i][1],"%d",&hard); ! 132: break; ! 133: ! 134: case 'h': /* print out command line arguments */ ! 135: write(1,cmdhelp,sizeof(cmdhelp)); exit(); ! 136: ! 137: case 'o': /* specify a .larnopts filename */ ! 138: strncpy(optsfile,argv[i]+2,127); break; ! 139: ! 140: default: printf("Unknown option <%s>\n",argv[i]); exit(); ! 141: }; ! 142: ! 143: if (argv[i][0] == '+') ! 144: { ! 145: clear(); restorflag = 1; ! 146: if (argv[i][1] == '+') ! 147: { ! 148: hitflag=1; restoregame(ckpfile); /* restore checkpointed game */ ! 149: } ! 150: i = argc; ! 151: } ! 152: } ! 153: ! 154: readopts(); /* read the options file if there is one */ ! 155: ! 156: ! 157: #ifdef UIDSCORE ! 158: userid = geteuid(); /* obtain the user's effective id number */ ! 159: #else UIDSCORE ! 160: userid = getplid(logname); /* obtain the players id number */ ! 161: #endif UIDSCORE ! 162: if (userid < 0) { write(2,"Can't obtain playerid\n",22); exit(); } ! 163: ! 164: #ifdef HIDEBYLINK ! 165: /* ! 166: * this section of code causes the program to look like something else to ps ! 167: */ ! 168: if (strcmp(psname,argv[0])) /* if a different process name only */ ! 169: { ! 170: if ((i=access(psname,1)) < 0) ! 171: { /* link not there */ ! 172: if (link(argv[0],psname)>=0) ! 173: { ! 174: argv[0] = psname; execv(psname,argv); ! 175: } ! 176: } ! 177: else ! 178: unlink(psname); ! 179: } ! 180: ! 181: for (i=1; i<argc; i++) ! 182: { ! 183: szero(argv[i]); /* zero the argument to avoid ps snooping */ ! 184: } ! 185: #endif HIDEBYLINK ! 186: ! 187: if (access(savefilename,0)==0) /* restore game if need to */ ! 188: { ! 189: clear(); restorflag = 1; ! 190: hitflag=1; restoregame(savefilename); /* restore last game */ ! 191: } ! 192: sigsetup(); /* trap all needed signals */ ! 193: sethard(hard); /* set up the desired difficulty */ ! 194: setupvt100(); /* setup the terminal special mode */ ! 195: if (c[HP]==0) /* create new game */ ! 196: { ! 197: makeplayer(); /* make the character that will play */ ! 198: newcavelevel(0);/* make the dungeon */ ! 199: predostuff = 1; /* tell signals that we are in the welcome screen */ ! 200: if (nowelcome==0) welcome(); /* welcome the player to the game */ ! 201: } ! 202: drawscreen(); /* show the initial dungeon */ ! 203: predostuff = 2; /* tell the trap functions that they must do a showplayer() ! 204: from here on */ ! 205: /* nice(1); /* games should be run niced */ ! 206: yrepcount = hit2flag = 0; ! 207: while (1) ! 208: { ! 209: if (dropflag==0) lookforobject(); /* see if there is an object here */ ! 210: else dropflag=0; /* don't show it just dropped an item */ ! 211: if (hitflag==0) { if (c[HASTEMONST]) movemonst(); movemonst(); } /* move the monsters */ ! 212: if (viewflag==0) showcell(playerx,playery); else viewflag=0; /* show stuff around player */ ! 213: if (hit3flag) flushall(); ! 214: hitflag=hit3flag=0; nomove=1; ! 215: bot_linex(); /* update bottom line */ ! 216: while (nomove) ! 217: { ! 218: if (hit3flag) flushall(); ! 219: nomove=0; parse(); ! 220: } /* get commands and make moves */ ! 221: regen(); /* regenerate hp and spells */ ! 222: if (c[TIMESTOP]==0) ! 223: if (--rmst <= 0) ! 224: { rmst = 120-(level<<2); fillmonst(makemonst(level)); } ! 225: } ! 226: } ! 227: ! 228: /* ! 229: showstr() ! 230: ! 231: show character's inventory ! 232: */ ! 233: showstr() ! 234: { ! 235: register int i,number; ! 236: for (number=3, i=0; i<26; i++) ! 237: if (iven[i]) number++; /* count items in inventory */ ! 238: t_setup(number); qshowstr(); t_endup(number); ! 239: } ! 240: ! 241: qshowstr() ! 242: { ! 243: register int i,j,k,sigsav; ! 244: srcount=0; sigsav=nosignal; nosignal=1; /* don't allow ^c etc */ ! 245: if (c[GOLD]) { lprintf(".) %d gold pieces",(long)c[GOLD]); srcount++; } ! 246: for (k=26; k>=0; k--) ! 247: if (iven[k]) ! 248: { for (i=22; i<84; i++) ! 249: for (j=0; j<=k; j++) if (i==iven[j]) show3(j); k=0; } ! 250: ! 251: lprintf("\nElapsed time is %d. You have %d mobuls left",(long)((gtime+99)/100+1),(long)((TIMELIMIT-gtime)/100)); ! 252: more(); nosignal=sigsav; ! 253: } ! 254: ! 255: /* ! 256: * subroutine to clear screen depending on # lines to display ! 257: */ ! 258: t_setup(count) ! 259: register int count; ! 260: { ! 261: if (count<20) /* how do we clear the screen? */ ! 262: { ! 263: cl_up(79,count); cursor(1,1); ! 264: } ! 265: else ! 266: { ! 267: resetscroll(); clear(); ! 268: } ! 269: } ! 270: ! 271: /* ! 272: * subroutine to restore normal display screen depending on t_setup() ! 273: */ ! 274: t_endup(count) ! 275: register int count; ! 276: { ! 277: if (count<18) /* how did we clear the screen? */ ! 278: draws(0,MAXX,0,(count>MAXY) ? MAXY : count); ! 279: else ! 280: { ! 281: drawscreen(); setscroll(); ! 282: } ! 283: } ! 284: ! 285: /* ! 286: function to show the things player is wearing only ! 287: */ ! 288: showwear() ! 289: { ! 290: register int i,j,sigsav,count; ! 291: sigsav=nosignal; nosignal=1; /* don't allow ^c etc */ ! 292: srcount=0; ! 293: ! 294: for (count=2,j=0; j<=26; j++) /* count number of items we will display */ ! 295: if (i=iven[j]) ! 296: switch(i) ! 297: { ! 298: case OLEATHER: case OPLATE: case OCHAIN: ! 299: case ORING: case OSTUDLEATHER: case OSPLINT: ! 300: case OPLATEARMOR: case OSSPLATE: case OSHIELD: ! 301: count++; ! 302: }; ! 303: ! 304: t_setup(count); ! 305: ! 306: for (i=22; i<84; i++) ! 307: for (j=0; j<=26; j++) ! 308: if (i==iven[j]) ! 309: switch(i) ! 310: { ! 311: case OLEATHER: case OPLATE: case OCHAIN: ! 312: case ORING: case OSTUDLEATHER: case OSPLINT: ! 313: case OPLATEARMOR: case OSSPLATE: case OSHIELD: ! 314: show3(j); ! 315: }; ! 316: more(); nosignal=sigsav; t_endup(count); ! 317: } ! 318: ! 319: /* ! 320: function to show the things player can wield only ! 321: */ ! 322: showwield() ! 323: { ! 324: register int i,j,sigsav,count; ! 325: sigsav=nosignal; nosignal=1; /* don't allow ^c etc */ ! 326: srcount=0; ! 327: ! 328: for (count=2,j=0; j<=26; j++) /* count how many items */ ! 329: if (i=iven[j]) ! 330: switch(i) ! 331: { ! 332: case ODIAMOND: case ORUBY: case OEMERALD: case OSAPPHIRE: ! 333: case OBOOK: case OCHEST: case OLARNEYE: case ONOTHEFT: ! 334: case OSPIRITSCARAB: case OCUBEofUNDEAD: ! 335: case OPOTION: case OSCROLL: break; ! 336: default: count++; ! 337: }; ! 338: ! 339: t_setup(count); ! 340: ! 341: for (i=22; i<84; i++) ! 342: for (j=0; j<=26; j++) ! 343: if (i==iven[j]) ! 344: switch(i) ! 345: { ! 346: case ODIAMOND: case ORUBY: case OEMERALD: case OSAPPHIRE: ! 347: case OBOOK: case OCHEST: case OLARNEYE: case ONOTHEFT: ! 348: case OSPIRITSCARAB: case OCUBEofUNDEAD: ! 349: case OPOTION: case OSCROLL: break; ! 350: default: show3(j); ! 351: }; ! 352: more(); nosignal=sigsav; t_endup(count); ! 353: } ! 354: ! 355: /* ! 356: * function to show the things player can read only ! 357: */ ! 358: showread() ! 359: { ! 360: register int i,j,sigsav,count; ! 361: sigsav=nosignal; nosignal=1; /* don't allow ^c etc */ ! 362: srcount=0; ! 363: ! 364: for (count=2,j=0; j<=26; j++) ! 365: switch(iven[j]) ! 366: { ! 367: case OBOOK: case OSCROLL: count++; ! 368: }; ! 369: t_setup(count); ! 370: ! 371: for (i=22; i<84; i++) ! 372: for (j=0; j<=26; j++) ! 373: if (i==iven[j]) ! 374: switch(i) ! 375: { ! 376: case OBOOK: case OSCROLL: show3(j); ! 377: }; ! 378: more(); nosignal=sigsav; t_endup(count); ! 379: } ! 380: ! 381: /* ! 382: * function to show the things player can eat only ! 383: */ ! 384: showeat() ! 385: { ! 386: register int i,j,sigsav,count; ! 387: sigsav=nosignal; nosignal=1; /* don't allow ^c etc */ ! 388: srcount=0; ! 389: ! 390: for (count=2,j=0; j<=26; j++) ! 391: switch(iven[j]) ! 392: { ! 393: case OCOOKIE: count++; ! 394: }; ! 395: t_setup(count); ! 396: ! 397: for (i=22; i<84; i++) ! 398: for (j=0; j<=26; j++) ! 399: if (i==iven[j]) ! 400: switch(i) ! 401: { ! 402: case OCOOKIE: show3(j); ! 403: }; ! 404: more(); nosignal=sigsav; t_endup(count); ! 405: } ! 406: ! 407: /* ! 408: function to show the things player can quaff only ! 409: */ ! 410: showquaff() ! 411: { ! 412: register int i,j,sigsav,count; ! 413: sigsav=nosignal; nosignal=1; /* don't allow ^c etc */ ! 414: srcount=0; ! 415: ! 416: for (count=2,j=0; j<=26; j++) ! 417: switch(iven[j]) ! 418: { ! 419: case OPOTION: count++; ! 420: }; ! 421: t_setup(count); ! 422: ! 423: for (i=22; i<84; i++) ! 424: for (j=0; j<=26; j++) ! 425: if (i==iven[j]) ! 426: switch(i) ! 427: { ! 428: case OPOTION: show3(j); ! 429: }; ! 430: more(); nosignal=sigsav; t_endup(count); ! 431: } ! 432: ! 433: show1(idx,str2) ! 434: register int idx; ! 435: register char *str2[]; ! 436: { ! 437: if (str2==0) lprintf("\n%c) %s",idx+'a',objectname[iven[idx]]); ! 438: else if (*str2[ivenarg[idx]]==0) lprintf("\n%c) %s",idx+'a',objectname[iven[idx]]); ! 439: else lprintf("\n%c) %s of%s",idx+'a',objectname[iven[idx]],str2[ivenarg[idx]]); ! 440: } ! 441: ! 442: show3(index) ! 443: register int index; ! 444: { ! 445: switch(iven[index]) ! 446: { ! 447: case OPOTION: show1(index,potionname); break; ! 448: case OSCROLL: show1(index,scrollname); break; ! 449: ! 450: case OLARNEYE: case OBOOK: case OSPIRITSCARAB: ! 451: case ODIAMOND: case ORUBY: case OCUBEofUNDEAD: ! 452: case OEMERALD: case OCHEST: case OCOOKIE: ! 453: case OSAPPHIRE: case ONOTHEFT: show1(index,(char **)0); break; ! 454: ! 455: default: lprintf("\n%c) %s",index+'a',objectname[iven[index]]); ! 456: if (ivenarg[index]>0) lprintf(" + %d",(long)ivenarg[index]); ! 457: else if (ivenarg[index]<0) lprintf(" %d",(long)ivenarg[index]); ! 458: break; ! 459: } ! 460: if (c[WIELD]==index) lprcat(" (weapon in hand)"); ! 461: if ((c[WEAR]==index) || (c[SHIELD]==index)) lprcat(" (being worn)"); ! 462: if (++srcount>=22) { srcount=0; more(); clear(); } ! 463: } ! 464: ! 465: /* ! 466: subroutine to randomly create monsters if needed ! 467: */ ! 468: randmonst() ! 469: { ! 470: if (c[TIMESTOP]) return; /* don't make monsters if time is stopped */ ! 471: if (--rmst <= 0) ! 472: { ! 473: rmst = 120 - (level<<2); fillmonst(makemonst(level)); ! 474: } ! 475: } ! 476: ! 477: ! 478: /* ! 479: parse() ! 480: ! 481: get and execute a command ! 482: */ ! 483: parse() ! 484: { ! 485: register int i,j,k,flag; ! 486: while (1) ! 487: { ! 488: k = yylex(); ! 489: switch(k) /* get the token from the input and switch on it */ ! 490: { ! 491: case 'h': moveplayer(4); return; /* west */ ! 492: case 'H': run(4); return; /* west */ ! 493: case 'l': moveplayer(2); return; /* east */ ! 494: case 'L': run(2); return; /* east */ ! 495: case 'j': moveplayer(1); return; /* south */ ! 496: case 'J': run(1); return; /* south */ ! 497: case 'k': moveplayer(3); return; /* north */ ! 498: case 'K': run(3); return; /* north */ ! 499: case 'u': moveplayer(5); return; /* northeast */ ! 500: case 'U': run(5); return; /* northeast */ ! 501: case 'y': moveplayer(6); return; /* northwest */ ! 502: case 'Y': run(6); return; /* northwest */ ! 503: case 'n': moveplayer(7); return; /* southeast */ ! 504: case 'N': run(7); return; /* southeast */ ! 505: case 'b': moveplayer(8); return; /* southwest */ ! 506: case 'B': run(8); return; /* southwest */ ! 507: ! 508: case '.': if (yrepcount) viewflag=1; return; /* stay here */ ! 509: ! 510: case 'w': yrepcount=0; wield(); return; /* wield a weapon */ ! 511: ! 512: case 'W': yrepcount=0; wear(); return; /* wear armor */ ! 513: ! 514: case 'r': yrepcount=0; ! 515: if (c[BLINDCOUNT]) { cursors(); lprcat("\nYou can't read anything when you're blind!"); } else ! 516: if (c[TIMESTOP]==0) readscr(); return; /* to read a scroll */ ! 517: ! 518: case 'q': yrepcount=0; if (c[TIMESTOP]==0) quaff(); return; /* quaff a potion */ ! 519: ! 520: case 'd': yrepcount=0; if (c[TIMESTOP]==0) dropobj(); return; /* to drop an object */ ! 521: ! 522: case 'c': yrepcount=0; cast(); return; /* cast a spell */ ! 523: ! 524: case 'i': yrepcount=0; nomove=1; showstr(); return; /* status */ ! 525: ! 526: case 'e': yrepcount=0; ! 527: if (c[TIMESTOP]==0) eatcookie(); return; /* to eat a fortune cookie */ ! 528: ! 529: case 'D': yrepcount=0; seemagic(0); nomove=1; return; /* list spells and scrolls */ ! 530: ! 531: case '?': yrepcount=0; help(); nomove=1; return; /* give the help screen*/ ! 532: ! 533: case 'S': clear(); lprcat("Saving . . ."); lflush(); ! 534: savegame(savefilename); wizard=1; died(-257); /* save the game - doesn't return */ ! 535: ! 536: case 'Z': yrepcount=0; if (c[LEVEL]>9) { oteleport(1); return; } ! 537: cursors(); lprcat("\nAs yet, you don't have enough experience to use teleportation"); ! 538: return; /* teleport yourself */ ! 539: ! 540: case '^': /* identify traps */ flag=yrepcount=0; cursors(); ! 541: lprc('\n'); for (j=playery-1; j<playery+2; j++) ! 542: { ! 543: if (j < 0) j=0; if (j >= MAXY) break; ! 544: for (i=playerx-1; i<playerx+2; i++) ! 545: { ! 546: if (i < 0) i=0; if (i >= MAXX) break; ! 547: switch(item[i][j]) ! 548: { ! 549: case OTRAPDOOR: case ODARTRAP: ! 550: case OTRAPARROW: case OTELEPORTER: ! 551: lprcat("\nIts "); lprcat(objectname[item[i][j]]); flag++; ! 552: }; ! 553: } ! 554: } ! 555: if (flag==0) lprcat("\nNo traps are visible"); ! 556: return; ! 557: ! 558: #if WIZID ! 559: case '_': /* this is the fudge player password for wizard mode*/ ! 560: yrepcount=0; cursors(); nomove=1; ! 561: if (userid!=wisid) ! 562: { ! 563: lprcat("Sorry, you are not empowered to be a wizard.\n"); ! 564: scbr(); /* system("stty -echo cbreak"); */ ! 565: lflush(); return; ! 566: } ! 567: if (getpassword()==0) ! 568: { ! 569: scbr(); /* system("stty -echo cbreak"); */ return; ! 570: } ! 571: wizard=1; scbr(); /* system("stty -echo cbreak"); */ ! 572: for (i=0; i<6; i++) c[i]=70; iven[0]=iven[1]=0; ! 573: take(OPROTRING,50); take(OLANCE,25); c[WIELD]=1; ! 574: c[LANCEDEATH]=1; c[WEAR] = c[SHIELD] = -1; ! 575: raiseexperience(6000000L); c[AWARENESS] += 25000; ! 576: { ! 577: register int i,j; ! 578: for (i=0; i<MAXY; i++) ! 579: for (j=0; j<MAXX; j++) know[j][i]=1; ! 580: for (i=0; i<SPNUM; i++) spelknow[i]=1; ! 581: for (i=0; i<MAXSCROLL; i++) scrollname[i][0]=' '; ! 582: for (i=0; i<MAXPOTION; i++) potionname[i][0]=' '; ! 583: } ! 584: for (i=0; i<MAXSCROLL; i++) ! 585: if (strlen(scrollname[i])>2) /* no null items */ ! 586: { item[i][0]=OSCROLL; iarg[i][0]=i; } ! 587: for (i=MAXX-1; i>MAXX-1-MAXPOTION; i--) ! 588: if (strlen(potionname[i-MAXX+MAXPOTION])>2) /* no null items */ ! 589: { item[i][0]=OPOTION; iarg[i][0]=i-MAXX+MAXPOTION; } ! 590: for (i=1; i<MAXY; i++) ! 591: { item[0][i]=i; iarg[0][i]=0; } ! 592: for (i=MAXY; i<MAXY+MAXX; i++) ! 593: { item[i-MAXY][MAXY-1]=i; iarg[i-MAXY][MAXY-1]=0; } ! 594: for (i=MAXX+MAXY; i<MAXX+MAXY+MAXY; i++) ! 595: { item[MAXX-1][i-MAXX-MAXY]=i; iarg[MAXX-1][i-MAXX-MAXY]=0; } ! 596: c[GOLD]+=25000; drawscreen(); return; ! 597: #endif ! 598: ! 599: case 'T': yrepcount=0; cursors(); if (c[SHIELD] != -1) { c[SHIELD] = -1; lprcat("\nYour shield is off"); bottomline(); } else ! 600: if (c[WEAR] != -1) { c[WEAR] = -1; lprcat("\nYour armor is off"); bottomline(); } ! 601: else lprcat("\nYou aren't wearing anything"); ! 602: return; ! 603: ! 604: case 'g': cursors(); ! 605: lprintf("\nThe stuff you are carrying presently weighs %d pounds",(long)packweight()); ! 606: case ' ': yrepcount=0; nomove=1; return; ! 607: ! 608: case 'v': yrepcount=0; cursors(); ! 609: lprintf("\nCaverns of Larn, Version %d.%d, Diff=%d",(long)VERSION,(long)SUBVERSION,(long)c[HARDGAME]); ! 610: if (wizard) lprcat(" Wizard"); nomove=1; ! 611: if (cheat) lprcat(" Cheater"); ! 612: lprcat(copyright); ! 613: return; ! 614: ! 615: case 'Q': yrepcount=0; quit(); nomove=1; return; /* quit */ ! 616: ! 617: case 'L'-64: yrepcount=0; drawscreen(); nomove=1; return; /* look */ ! 618: ! 619: #if WIZID ! 620: #ifdef EXTRA ! 621: case 'A': yrepcount=0; nomove=1; if (wizard) { diag(); return; } /* create diagnostic file */ ! 622: return; ! 623: #endif ! 624: #endif ! 625: case 'P': cursors(); ! 626: if (outstanding_taxes>0) ! 627: lprintf("\nYou presently owe %d gp in taxes.",(long)outstanding_taxes); ! 628: else ! 629: lprcat("\nYou do not owe any taxes."); ! 630: return; ! 631: }; ! 632: } ! 633: } ! 634: ! 635: parse2() ! 636: { ! 637: if (c[HASTEMONST]) movemonst(); movemonst(); /* move the monsters */ ! 638: randmonst(); regen(); ! 639: } ! 640: ! 641: run(dir) ! 642: int dir; ! 643: { ! 644: register int i; ! 645: i=1; while (i) ! 646: { ! 647: i=moveplayer(dir); ! 648: if (i>0) { if (c[HASTEMONST]) movemonst(); movemonst(); randmonst(); regen(); } ! 649: if (hitflag) i=0; ! 650: if (i!=0) showcell(playerx,playery); ! 651: } ! 652: } ! 653: ! 654: /* ! 655: function to wield a weapon ! 656: */ ! 657: wield() ! 658: { ! 659: register int i; ! 660: while (1) ! 661: { ! 662: if ((i = whatitem("wield"))=='\33') return; ! 663: if (i != '.') ! 664: { ! 665: if (i=='*') showwield(); ! 666: else if (iven[i-'a']==0) { ydhi(i); return; } ! 667: else if (iven[i-'a']==OPOTION) { ycwi(i); return; } ! 668: else if (iven[i-'a']==OSCROLL) { ycwi(i); return; } ! 669: else if ((c[SHIELD]!= -1) && (iven[i-'a']==O2SWORD)) { lprcat("\nBut one arm is busy with your shield!"); return; } ! 670: else { c[WIELD]=i-'a'; if (iven[i-'a'] == OLANCE) c[LANCEDEATH]=1; else c[LANCEDEATH]=0; bottomline(); return; } ! 671: } ! 672: } ! 673: } ! 674: ! 675: /* ! 676: common routine to say you don't have an item ! 677: */ ! 678: ydhi(x) ! 679: int x; ! 680: { cursors(); lprintf("\nYou don't have item %c!",x); } ! 681: ycwi(x) ! 682: int x; ! 683: { cursors(); lprintf("\nYou can't wield item %c!",x); } ! 684: ! 685: /* ! 686: function to wear armor ! 687: */ ! 688: wear() ! 689: { ! 690: register int i; ! 691: while (1) ! 692: { ! 693: if ((i = whatitem("wear"))=='\33') return; ! 694: if (i != '.') ! 695: { ! 696: if (i=='*') showwear(); else ! 697: switch(iven[i-'a']) ! 698: { ! 699: case 0: ydhi(i); return; ! 700: case OLEATHER: case OCHAIN: case OPLATE: case OSTUDLEATHER: ! 701: case ORING: case OSPLINT: case OPLATEARMOR: case OSSPLATE: ! 702: if (c[WEAR] != -1) { lprcat("\nYou're already wearing some armor"); return; } ! 703: c[WEAR]=i-'a'; bottomline(); return; ! 704: case OSHIELD: if (c[SHIELD] != -1) { lprcat("\nYou are already wearing a shield"); return; } ! 705: if (iven[c[WIELD]]==O2SWORD) { lprcat("\nYour hands are busy with the two handed sword!"); return; } ! 706: c[SHIELD] = i-'a'; bottomline(); return; ! 707: default: lprcat("\nYou can't wear that!"); ! 708: }; ! 709: } ! 710: } ! 711: } ! 712: ! 713: /* ! 714: function to drop an object ! 715: */ ! 716: dropobj() ! 717: { ! 718: register int i; ! 719: register char *p; ! 720: long amt; ! 721: p = &item[playerx][playery]; ! 722: while (1) ! 723: { ! 724: if ((i = whatitem("drop"))=='\33') return; ! 725: if (i=='*') showstr(); else ! 726: { ! 727: if (i=='.') /* drop some gold */ ! 728: { ! 729: if (*p) { lprcat("\nThere's something here already!"); return; } ! 730: lprcat("\n\n"); ! 731: cl_dn(1,23); ! 732: lprcat("How much gold do you drop? "); ! 733: if ((amt=readnum((long)c[GOLD])) == 0) return; ! 734: if (amt>c[GOLD]) ! 735: { lprcat("\nYou don't have that much!"); return; } ! 736: if (amt<=32767) ! 737: { *p=OGOLDPILE; i=amt; } ! 738: else if (amt<=327670L) ! 739: { *p=ODGOLD; i=amt/10; amt = 10*i; } ! 740: else if (amt<=3276700L) ! 741: { *p=OMAXGOLD; i=amt/100; amt = 100*i; } ! 742: else if (amt<=32767000L) ! 743: { *p=OKGOLD; i=amt/1000; amt = 1000*i; } ! 744: else ! 745: { *p=OKGOLD; i=32767; amt = 32767000L; } ! 746: c[GOLD] -= amt; ! 747: lprintf("You drop %d gold pieces",(long)amt); ! 748: iarg[playerx][playery]=i; bottomgold(); ! 749: know[playerx][playery]=0; dropflag=1; return; ! 750: } ! 751: drop_object(i-'a'); ! 752: return; ! 753: } ! 754: } ! 755: } ! 756: ! 757: /* ! 758: * readscr() Subroutine to read a scroll one is carrying ! 759: */ ! 760: readscr() ! 761: { ! 762: register int i; ! 763: while (1) ! 764: { ! 765: if ((i = whatitem("read"))=='\33') return; ! 766: if (i != '.') ! 767: { ! 768: if (i=='*') showread(); else ! 769: { ! 770: if (iven[i-'a']==OSCROLL) { read_scroll(ivenarg[i-'a']); iven[i-'a']=0; return; } ! 771: if (iven[i-'a']==OBOOK) { readbook(ivenarg[i-'a']); iven[i-'a']=0; return; } ! 772: if (iven[i-'a']==0) { ydhi(i); return; } ! 773: lprcat("\nThere's nothing on it to read"); return; ! 774: } ! 775: } ! 776: } ! 777: } ! 778: ! 779: /* ! 780: * subroutine to eat a cookie one is carrying ! 781: */ ! 782: eatcookie() ! 783: { ! 784: register int i; ! 785: char *p; ! 786: while (1) ! 787: { ! 788: if ((i = whatitem("eat"))=='\33') return; ! 789: if (i != '.') ! 790: if (i=='*') showeat(); else ! 791: { ! 792: if (iven[i-'a']==OCOOKIE) ! 793: { ! 794: lprcat("\nThe cookie was delicious."); ! 795: iven[i-'a']=0; ! 796: if (!c[BLINDCOUNT]) ! 797: { ! 798: if (p=fortune(fortfile)) ! 799: { ! 800: lprcat(" Inside you find a scrap of paper that says:\n"); ! 801: lprcat(p); ! 802: } ! 803: } ! 804: return; ! 805: } ! 806: if (iven[i-'a']==0) { ydhi(i); return; } ! 807: lprcat("\nYou can't eat that!"); return; ! 808: } ! 809: } ! 810: } ! 811: ! 812: /* ! 813: * subroutine to quaff a potion one is carrying ! 814: */ ! 815: quaff() ! 816: { ! 817: register int i; ! 818: while (1) ! 819: { ! 820: if ((i = whatitem("quaff"))=='\33') return; ! 821: if (i != '.') ! 822: { ! 823: if (i=='*') showquaff(); else ! 824: { ! 825: if (iven[i-'a']==OPOTION) { quaffpotion(ivenarg[i-'a']); iven[i-'a']=0; return; } ! 826: if (iven[i-'a']==0) { ydhi(i); return; } ! 827: lprcat("\nYou wouldn't want to quaff that, would you? "); return; ! 828: } ! 829: } ! 830: } ! 831: } ! 832: ! 833: /* ! 834: function to ask what player wants to do ! 835: */ ! 836: whatitem(str) ! 837: char *str; ! 838: { ! 839: int i; ! 840: cursors(); lprintf("\nWhat do you want to %s [* for all] ? ",str); ! 841: i=0; while (i>'z' || (i<'a' && i!='*' && i!='\33' && i!='.')) i=getchar(); ! 842: if (i=='\33') lprcat(" aborted"); ! 843: return(i); ! 844: } ! 845: ! 846: /* ! 847: subroutine to get a number from the player ! 848: and allow * to mean return amt, else return the number entered ! 849: */ ! 850: unsigned long readnum(mx) ! 851: long mx; ! 852: { ! 853: register int i; ! 854: register unsigned long amt=0; ! 855: sncbr(); ! 856: if ((i=getchar()) == '*') amt = mx; /* allow him to say * for all gold */ ! 857: else ! 858: while (i != '\n') ! 859: { ! 860: if (i=='\033') { scbr(); lprcat(" aborted"); return(0); } ! 861: if ((i <= '9') && (i >= '0') && (amt<99999999)) ! 862: amt = amt*10+i-'0'; ! 863: i = getchar(); ! 864: } ! 865: scbr(); return(amt); ! 866: } ! 867: ! 868: #ifdef HIDEBYLINK ! 869: /* ! 870: * routine to zero every byte in a string ! 871: */ ! 872: szero(str) ! 873: register char *str; ! 874: { ! 875: while (*str) ! 876: *str++ = 0; ! 877: } ! 878: #endif HIDEBYLINK
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.