Relay-Version: version B 2.10 5/3/83; site utzoo.UUCP Path: utzoo!mnetor!seismo!caip!clyde!cbatt!cbosgd!ucbvax!ucdavis!deneb!u566393908ea From: u566393908ea@ucdavis.UUCP (u566393908ea) Newsgroups: net.sources.games Subject: VMS Larn 12.0 is here! (part 6 of 6) Message-ID: <499@ucdavis.UUCP> Date: Sat, 30-Aug-86 18:08:11 EDT Article-I.D.: ucdavis.499 Posted: Sat Aug 30 18:08:11 1986 Date-Received: Sun, 31-Aug-86 10:00:46 EDT Distribution: net Organization: University of California, Davis Lines: 3211 Hello all! This is a port of Larn v12.0 to VAX/VMS. Now everyone can save his/her daughter!! Just unpack using /bin/sh and read readme.txt. - Mark Nagel P.S. Thanks to Lord Kahless for letting me post this! -------------------------------cut here------------------------------------- #! /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: # object.c # scores.c # store.c # This archive created: Sat Aug 30 14:53:02 1986 export PATH; PATH=/bin:$PATH echo shar: extracting "'object.c'" '(28817 characters)' if test -f 'object.c' then echo shar: will not over-write existing file "'object.c'" else cat << \SHAR_EOF > 'object.c' /* object.c Larn is copyrighted 1986 by Noah Morgan. */ #include "header.h" /* *************** LOOK_FOR_OBJECT *************** subroutine to look for an object and give the player his options if an object was found. */ lookforobject () { register int i,j; if (c[TIMESTOP]) return; /* can't find objects is time is stopped */ i = item[playerx][playery]; if (i == 0) return; showcell (playerx, playery); cursors (); yrepcount = 0; switch (i) { case OGOLDPILE: case OMAXGOLD: case OKGOLD: case ODGOLD: lprcat ("\n\nYou have found some gold!"); ogold (i); break; case OPOTION: lprcat ("\n\nYou have found a magic potion"); i = iarg[playerx][playery]; if (potionname[i][0]) lprintf (" of %s", &potionname[i][1]); opotion (i); break; case OSCROLL: lprcat ("\n\nYou have found a magic scroll"); i = iarg[playerx][playery]; if (scrollname[i][0]) lprintf (" of %s", &scrollname[i][1]); oscroll (i); break; case OALTAR: if (nearbymonst ()) return; lprcat ("\n\nThere is a Holy Altar here!"); oaltar (); break; case OBOOK: lprcat ("\n\nYou have found a book."); obook (); break; case OCOOKIE: lprcat ("\n\nYou have found a fortune cookie."); ocookie (); break; case OTHRONE: if (nearbymonst ()) return; lprintf ("\n\nThere is %s here!", objectname[i]); othrone (0); break; case OTHRONE2: if (nearbymonst ()) return; lprintf ("\n\nThere is %s here!", objectname[i]); othrone (1); break; case ODEADTHRONE: lprintf ("\n\nThere is %s here!", objectname[i]); odeadthrone (); break; case OORB: lprcat ("\n\nYou have found the Orb!!!!!"); oorb (); break; case OPIT: lprcat ("\n\nYou're standing at the top of a pit."); opit (); break; case OSTAIRSUP: lprcat ("\n\nThere is a circular staircase here"); ostairs (1); /* up */ break; case OELEVATORUP: lprcat ("\n\nYou feel heavy for a moment, but the feeling disappears"); oelevator (1); /* up */ break; case OFOUNTAIN: if (nearbymonst ()) return; lprcat ("\n\nThere is a fountain here"); ofountain (); break; case OSTATUE: if (nearbymonst ()) return; lprcat ("\n\nYou are standing in front of a statue"); ostatue (); break; case OCHEST: lprcat ("\n\nThere is a chest here"); ochest (); break; case OIVTELETRAP: if (rnd (11) < 6) return; item[playerx][playery] = OTELEPORTER; know[playerx][playery] = 1; case OTELEPORTER: lprcat ("\nZaaaappp! You've been teleported!\n"); beep (); nap (3000); oteleport (0); break; case OSCHOOL: if (nearbymonst ()) return; lprcat ("\n\nYou have found the College of Larn."); lprcat ("\nDo you (g) go inside, or (i) stay here? "); i = 0; while ((i != 'g') && (i != 'i') && (i != '\33')) i = readchar (); if (i == 'g') { oschool (); /* the college of larn */ } else lprcat (" stay here"); break; case OMIRROR: if (nearbymonst ()) return; lprcat ("\n\nThere is a mirror here"); omirror (); break; case OBANK2: case OBANK: if (nearbymonst ()) return; if (i == OBANK) lprcat ("\n\nYou have found the bank of Larn."); else lprcat ("\n\nYou have found a branch office of the bank of Larn."); lprcat ("\nDo you (g) go inside, or (i) stay here? "); j = 0; while ((j != 'g') && (j != 'i') && (j != '\33')) j = readchar (); if (j == 'g') { if (i == OBANK) obank (); else obank2 (); /* the bank of larn */ } else lprcat (" stay here"); break; case ODEADFOUNTAIN: if (nearbymonst ()) return; lprcat ("\n\nThere is a dead fountain here"); break; case ODNDSTORE: if (nearbymonst ()) return; lprcat ("\n\nThere is a DND store here."); lprcat ("\nDo you (g) go inside, or (i) stay here? "); i = 0; while ((i != 'g') && (i != 'i') && (i != '\33')) i = readchar (); if (i == 'g') dndstore (); /* the dnd adventurers store */ else lprcat (" stay here"); break; case OSTAIRSDOWN: lprcat ("\n\nThere is a circular staircase here"); ostairs (-1); /* down */ break; case OELEVATORDOWN: lprcat ("\n\nYou feel light for a moment, but the feeling disappears"); oelevator (-1); /* down */ break; case OOPENDOOR: lprintf ("\n\nYou have found %s", objectname[i]); lprcat ("\nDo you (c) close it"); iopts (); i = 0; while ((i != 'c') && (i != 'i') && (i != '\33')) i = readchar (); if ((i == '\33') || (i == 'i')) { ignore (); break; } lprcat ("close"); forget (); item[playerx][playery] = OCLOSEDDOOR; iarg[playerx][playery] = 0; playerx = lastpx; playery = lastpy; break; case OCLOSEDDOOR: lprintf ("\n\nYou have found %s", objectname[i]); lprcat ("\nDo you (o) try to open it"); iopts (); i = 0; while ((i != 'o') && (i != 'i') && (i != '\33')) i = readchar (); if ((i == '\33') || (i == 'i')) { ignore (); playerx = lastpx; playery = lastpy; break; } else { lprcat ("open"); if (rnd (11) < 7) { switch (iarg[playerx][playery]) { case 6: c[AGGRAVATE] += rnd (400); break; case 7: lprcat ("\nYou are jolted by an electric shock "); lastnum = 274; losehp (rnd (20)); bottomline (); break; case 8: loselevel (); break; case 9: lprcat ("\nYou suddenly feel weaker "); if (c[STRENGTH] > 3) c[STRENGTH]--; bottomline (); break; default: break; } playerx = lastpx; playery = lastpy; } else { forget (); item[playerx][playery] = OOPENDOOR; } } break; case OENTRANCE: lprcat ("\nYou have found "); lprcat (objectname[OENTRANCE]); lprcat ("\nDo you (g) go inside"); iopts (); i = 0; while ((i != 'g') && (i != 'i') && (i != '\33')) i = readchar (); if (i == 'g') { newcavelevel (1); playerx = 33; playery = MAXY - 2; item[33][MAXY - 1] = know[33][MAXY - 1] = mitem[33][MAXY - 1] = 0; draws (0, MAXX, 0, MAXY); bot_linex (); return; } else ignore (); break; case OVOLDOWN: lprcat ("\nYou have found "); lprcat (objectname[OVOLDOWN]); lprcat ("\nDo you (c) climb down"); iopts (); i = 0; while ((i != 'c') && (i != 'i') && (i != '\33')) i = readchar (); if ((i == '\33') || (i == 'i')) { ignore (); break; } if (level != 0) { lprcat ("\nThe shaft only extends 5 feet downward!"); return; } if (packweight () > 45 + 3 * (c[STRENGTH] + c[STREXTRA])) { lprcat ("\nYou slip and fall down the shaft"); beep (); lastnum = 275; losehp (30 + rnd (20)); bottomhp (); } else lprcat ("climb down"); nap (3000); newcavelevel (MAXLEVEL); for (i = 0; i < MAXY; i++) for (j = 0; j < MAXX; j++)/* put player near volcano shaft */ if (item[j][i] == OVOLUP) { playerx = j; playery = i; j = MAXX; i = MAXY; positionplayer (); } draws (0, MAXX, 0, MAXY); bot_linex (); return; case OVOLUP: lprcat ("\nYou have found "); lprcat (objectname[OVOLUP]); lprcat ("\nDo you (c) climb up"); iopts (); i = 0; while ((i != 'c') && (i != 'i') && (i != '\33')) i = readchar (); if ((i == '\33') || (i == 'i')) { ignore (); break; } if (level != 11) { lprcat ("\nThe shaft only extends 8 feet upwards before you find a blockage!"); return; } if (packweight () > 45 + 5 * (c[STRENGTH] + c[STREXTRA])) { lprcat ("\nYou slip and fall down the shaft"); beep (); lastnum = 275; losehp (15 + rnd (20)); bottomhp (); return; } lprcat ("climb up"); lflush (); nap (3000); newcavelevel (0); for (i = 0; i < MAXY; i++) for (j = 0; j < MAXX; j++)/* put player near volcano shaft */ if (item[j][i] == OVOLDOWN) { playerx = j; playery = i; j = MAXX; i = MAXY; positionplayer (); } draws (0, MAXX, 0, MAXY); bot_linex (); return; case OTRAPARROWIV: if (rnd (17) < 13) return; /* for an arrow trap */ item[playerx][playery] = OTRAPARROW; know[playerx][playery] = 0; case OTRAPARROW: lprcat ("\nYou are hit by an arrow"); beep (); /* for an arrow trap */ lastnum = 259; losehp (rnd (10) + level); bottomhp (); return; case OIVDARTRAP: if (rnd (17) < 13) return; /* for a dart trap */ item[playerx][playery] = ODARTRAP; know[playerx][playery] = 0; case ODARTRAP: lprcat ("\nYou are hit by a dart"); beep (); /* for a dart trap */ lastnum = 260; losehp (rnd (5)); if ((--c[STRENGTH]) < 3) c[STRENGTH] = 3; bottomline (); return; case OIVTRAPDOOR: if (rnd (17) < 13) return; /* for a trap door */ item[playerx][playery] = OTRAPDOOR; know[playerx][playery] = 1; case OTRAPDOOR: lastnum = 272; /* a trap door */ if ((level == MAXLEVEL - 1) || (level == MAXLEVEL + MAXVLEVEL - 1)) { lprcat ("\nYou fell through a bottomless trap door!"); beep (); nap (3000); died (271); } lprcat ("\nYou fall through a trap door!"); beep (); /* for a trap door */ losehp (rnd (5 + level)); nap (2000); newcavelevel (level + 1); draws (0, MAXX, 0, MAXY); bot_linex (); return; case OTRADEPOST: if (nearbymonst ()) return; lprcat ("\nYou have found the Larn trading Post."); lprcat ("\nDo you (g) go inside, or (i) stay here? "); i = 0; while ((i != 'g') && (i != 'i') && (i != '\33')) i = readchar (); if (i == 'g') otradepost (); else lprcat ("stay here"); return; case OHOME: if (nearbymonst ()) return; lprcat ("\nYou have found your way home."); lprcat ("\nDo you (g) go inside, or (i) stay here? "); i = 0; while ((i != 'g') && (i != 'i') && (i != '\33')) i = readchar (); if (i == 'g') ohome (); else lprcat ("stay here"); return; case OWALL: break; case OANNIHILATION: died (283); return; /* annihilated by sphere of annihilation */ case OLRS: if (nearbymonst ()) return; lprcat ("\n\nThere is an LRS office here."); lprcat ("\nDo you (g) go inside, or (i) stay here? "); i = 0; while ((i != 'g') && (i != 'i') && (i != '\33')) i = readchar (); if (i == 'g') olrs (); /* the larn revenue service */ else lprcat (" stay here"); break; default: finditem (i); break; }; } /* function to say what object we found and ask if player wants to take it */ finditem (itm) int itm; { int tmp, i; lprintf ("\n\nYou have found %s ", objectname[itm]); tmp = iarg[playerx][playery]; switch (itm) { case ODIAMOND: case ORUBY: case OEMERALD: case OSAPPHIRE: case OSPIRITSCARAB: case OORBOFDRAGON: case OCUBEofUNDEAD: case ONOTHEFT: break; default: if (tmp > 0) lprintf ("+ %d", (long) tmp); else if (tmp < 0) lprintf (" %d", (long) tmp); } lprcat ("\nDo you want to (t) take it"); iopts (); i = 0; while (i != 't' && i != 'i' && i != '\33') i = readchar (); if (i == 't') { lprcat ("take"); if (take (itm, tmp) == 0) forget (); return; } ignore (); } /* ******* OSTAIRS ******* subroutine to process the stair cases if dir > 0 the up else down */ ostairs (dir) int dir; { register int k; lprcat ("\nDo you (s) stay here "); if (dir > 0) lprcat ("(u) go up "); else lprcat ("(d) go down "); lprcat ("or (f) kick stairs? "); while (1) switch (readchar ()) { case '\33': case 's': case 'i': lprcat ("stay here"); return; case 'f': lprcat ("kick stairs"); if (rnd (2) == 1) lprcat ("\nI hope you feel better. Showing anger rids you of frustration."); else { k = rnd ((level + 1) << 1); lprintf ("\nYou hurt your foot dumb dumb! You suffer %d hit points", (long) k); lastnum = 276; losehp (k); bottomline (); } return; case 'u': lprcat ("go up"); if (dir < 0) lprcat ("\nThe stairs don't go up!"); else if (level >= 2 && level != 11) { k = level; newcavelevel (level - 1); draws (0, MAXX, 0, MAXY); bot_linex (); } else lprcat ("\nThe stairs lead to a dead end!"); return; case 'd': lprcat ("go down"); if (dir > 0) lprcat ("\nThe stairs don't go down!"); else if (level != 0 && level != 10 && level != 13) { k = level; newcavelevel (level + 1); draws (0, MAXX, 0, MAXY); bot_linex (); } else lprcat ("\nThe stairs lead to a dead end!"); return; }; } /* ********* OTELEPORTER ********* subroutine to handle a teleport trap +/- 1 level maximum */ oteleport (err) int err; { register int tmp; if (err) if (rnd (151) < 3) died (264); /* stuck in a rock */ c[TELEFLAG] = 1; /* show ?? on bottomline if been teleported */ if (level == 0) tmp = 0; else if (level < MAXLEVEL) { tmp = rnd (5) + level - 3; if (tmp >= MAXLEVEL) tmp = MAXLEVEL - 1; if (tmp < 1) tmp = 1; } else { tmp = rnd (3) + level - 2; if (tmp >= MAXLEVEL + MAXVLEVEL) tmp = MAXLEVEL + MAXVLEVEL - 1; if (tmp < MAXLEVEL) tmp = MAXLEVEL; } playerx = rnd (MAXX - 2); playery = rnd (MAXY - 2); if (level != tmp) newcavelevel (tmp); positionplayer (); draws (0, MAXX, 0, MAXY); bot_linex (); } /* ******* OPOTION ******* function to process a potion */ opotion (pot) int pot; { lprcat ("\nDo you (d) drink it, (t) take it"); iopts (); while (1) switch (readchar ()) { case '\33': case 'i': ignore (); return; case 'd': lprcat ("drink\n"); forget (); /* destroy potion */ quaffpotion (pot); return; case 't': lprcat ("take\n"); if (take (OPOTION, pot) == 0) forget (); return; }; } /* function to drink a potion */ quaffpotion (pot) int pot; { register int i, j, k; if (pot < 0 || pot >= MAXPOTION) return; /* check for within bounds */ potionname[pot][0] = ' '; switch (pot) { case 9: lprcat ("\nYou feel greedy . . ."); nap (2000); for (i = 0; i < MAXY; i++) for (j = 0; j < MAXX; j++) if ((item[j][i] == OGOLDPILE) || (item[j][i] == OMAXGOLD)) { know[j][i] = 1; show1cell (j, i); } showplayer (); return; case 19: lprcat ("\nYou feel greedy . . ."); nap (2000); for (i = 0; i < MAXY; i++) for (j = 0; j < MAXX; j++) { k = item[j][i]; if ((k == ODIAMOND) || (k == ORUBY) || (k == OEMERALD) || (k == OMAXGOLD) || (k == OSAPPHIRE) || (k == OLARNEYE) || (k == OGOLDPILE)) { know[j][i] = 1; show1cell (j, i); } } showplayer (); return; case 20: c[HP] = c[HPMAX]; break; /* instant healing */ case 1: lprcat ("\nYou feel better"); if (c[HP] == c[HPMAX]) raisemhp (1); else if ((c[HP] += rnd (20) + 20 + c[LEVEL]) > c[HPMAX]) c[HP] = c[HPMAX]; break; case 2: lprcat ("\nSuddenly, you feel much more skillful!"); raiselevel (); raisemhp (1); return; case 3: lprcat ("\nYou feel strange for a moment"); c[rund (6)]++; break; case 4: lprcat ("\nYou feel more self confident!"); c[WISDOM] += rnd (2); break; case 5: lprcat ("\nWow! You feel great!"); if (c[STRENGTH] < 12) c[STRENGTH] = 12; else c[STRENGTH]++; break; case 6: lprcat ("\nYour charm went up by one!"); c[CHARISMA]++; break; case 8: lprcat ("\nYour intelligence went up by one!"); c[INTELLIGENCE]++; break; case 10: for (i = 0; i < MAXY; i++) for (j = 0; j < MAXX; j++) if (mitem[j][i]) { know[j][i] = 1; show1cell (j, i); } /* monster detection */ return; case 12: lprcat ("\nThis potion has no taste to it"); return; case 15: lprcat ("\nWOW!!! You feel Super-fantastic!!!"); if (c[HERO] == 0) for (i = 0; i < 6; i++) c[i] += 11; c[HERO] += 250; break; case 16: lprcat ("\nYou have a greater intestinal constitude!"); c[CONSTITUTION]++; break; case 17: lprcat ("\nYou now have incredibly bulging muscles!!!"); if (c[GIANTSTR] == 0) c[STREXTRA] += 21; c[GIANTSTR] += 700; break; case 18: lprcat ("\nYou feel a chill run up your spine!"); c[FIRERESISTANCE] += 1000; break; case 0: lprcat ("\nYou fall asleep. . ."); i = rnd (11) - (c[CONSTITUTION] >> 2) + 2; while (--i > 0) { parse2 (); nap (1000); } cursors (); lprcat ("\nYou woke up!"); return; case 7: lprcat ("\nYou become dizzy!"); if (--c[STRENGTH] < 3) c[STRENGTH] = 3; break; case 11: lprcat ("\nYou stagger for a moment . ."); for (i = 0; i < MAXY; i++) for (j = 0; j < MAXX; j++) know[j][i] = 0; nap (2000); draws (0, MAXX, 0, MAXY);/* potion of forgetfulness */ return; case 13: lprcat ("\nYou can't see anything!");/* blindness */ c[BLINDCOUNT] += 500; return; case 14: lprcat ("\nYou feel confused"); c[CONFUSE] += 20 + rnd (9); return; case 21: lprcat ("\nYou don't seem to be affected"); return; /* cure dianthroritis */ case 22: lprcat ("\nYou feel a sickness engulf you");/* poison */ c[HALFDAM] += 200 + rnd (200); return; case 23: lprcat ("\nYou feel your vision sharpen");/* see invisible */ c[SEEINVISIBLE] += rnd (1000) + 400; monstnamelist[INVISIBLESTALKER] = 'I'; return; }; bottomline (); /* show new stats */ return; } /* ******* OSCROLL ******* function to process a magic scroll */ oscroll (typ) int typ; { lprcat ("\nDo you "); if (c[BLINDCOUNT] == 0) lprcat ("(r) read it, "); lprcat ("(t) take it"); iopts (); while (1) switch (readchar ()) { case '\33': case 'i': ignore (); return; case 'r': if (c[BLINDCOUNT]) break; lprcat ("read"); forget (); if (typ == 2 || typ == 15) { show1cell (playerx, playery); cursors (); } /* destroy it */ read_scroll (typ); return; case 't': lprcat ("take"); if (take (OSCROLL, typ) == 0) forget (); /* destroy it */ return; }; } /* data for the function to read a scroll */ static int xh, yh, yl, xl; static char curse[] = { BLINDCOUNT, CONFUSE, AGGRAVATE, HASTEMONST, ITCHING, LAUGHING, DRAINSTRENGTH, CLUMSINESS, INFEEBLEMENT, HALFDAM }; static char exten[] = { PROTECTIONTIME, DEXCOUNT, STRCOUNT, CHARMCOUNT, INVISIBILITY, CANCELLATION, HASTESELF, GLOBE, SCAREMONST, HOLDMONST, TIMESTOP }; char time_change[] = { HASTESELF, HERO, ALTPRO, PROTECTIONTIME, DEXCOUNT, STRCOUNT, GIANTSTR, CHARMCOUNT, INVISIBILITY, CANCELLATION, HASTESELF, AGGRAVATE, SCAREMONST, STEALTH, AWARENESS, HOLDMONST, HASTEMONST, FIRERESISTANCE, GLOBE, SPIRITPRO, UNDEADPRO, HALFDAM, SEEINVISIBLE, ITCHING, CLUMSINESS, WTW }; /* * function to adjust time when time warping and taking courses in school */ adjtime (tim) register long tim; { register int j; for (j = 0; j < 26; j++) /* adjust time related parameters */ if (c[time_change[j]]) if ((c[time_change[j]] -= tim) < 1) c[time_change[j]] = 1; regen (); } /* function to read a scroll */ read_scroll (typ) int typ; { register int i, j; if (typ < 0 || typ >= MAXSCROLL) return; /* be sure we are within bounds */ scrollname[typ][0] = ' '; switch (typ) { case 0: lprcat ("\nYour armor glows for a moment"); enchantarmor (); return; case 1: lprcat ("\nYour weapon glows for a moment"); enchweapon (); return; /* enchant weapon */ case 2: lprcat ("\nYou have been granted enlightenment!"); yh = min (playery + 7, MAXY); xh = min (playerx + 25, MAXX); yl = max (playery - 7, 0); xl = max (playerx - 25, 0); for (i = yl; i < yh; i++) for (j = xl; j < xh; j++) know[j][i] = 1; nap (2000); draws (xl, xh, yl, yh); return; case 3: lprcat ("\nThis scroll seems to be blank"); return; case 4: createmonster (makemonst (level + 1)); return; /* this one creates a monster */ case 5: something (level); /* create artifact */ return; case 6: c[AGGRAVATE] += 800; return; /* aggravate monsters */ case 7: gtime += (i = rnd (1000) - 850);/* time warp */ if (i >= 0) lprintf ("\nYou went forward in time by %d mobuls", (long) ((i + 99) / 100)); else lprintf ("\nYou went backward in time by %d mobuls", (long) (-(i + 99) / 100)); adjtime ((long) i); /* adjust time for time warping */ return; case 8: oteleport (0); return; /* teleportation */ case 9: c[AWARENESS] += 1800; return; /* expanded awareness */ case 10: c[HASTEMONST] += rnd (55) + 12; return; /* haste monster */ case 11: for (i = 0; i < MAXY; i++) for (j = 0; j < MAXX; j++) if (mitem[j][i]) hitp[j][i] = monster[mitem[j][i]].hitpoints; return; /* monster healing */ case 12: c[SPIRITPRO] += 300 + rnd (200); bottomline (); return; /* spirit protection */ case 13: c[UNDEADPRO] += 300 + rnd (200); bottomline (); return; /* undead protection */ case 14: c[STEALTH] += 250 + rnd (250); bottomline (); return; /* stealth */ case 15: lprcat ("\nYou have been granted enlightenment!");/* magic mapping */ for (i = 0; i < MAXY; i++) for (j = 0; j < MAXX; j++) know[j][i] = 1; nap (2000); draws (0, MAXX, 0, MAXY); return; case 16: c[HOLDMONST] += 30; bottomline (); return; /* hold monster */ case 17: for (i = 0; i < 26; i++)/* gem perfection */ switch (iven[i]) { case ODIAMOND: case ORUBY: case OEMERALD: case OSAPPHIRE: j = ivenarg[i]; j &= 255; j <<= 1; if (j > 255) j = 255;/* double value */ ivenarg[i] = j; break; } break; case 18: for (i = 0; i < 11; i++) c[exten[i]] <<= 1;/* spell extension */ break; case 19: for (i = 0; i < 26; i++) {/* identify */ if (iven[i] == OPOTION) potionname[ivenarg[i]][0] = ' '; if (iven[i] == OSCROLL) scrollname[ivenarg[i]][0] = ' '; } break; case 20: for (i = 0; i < 10; i++)/* remove curse */ if (c[curse[i]]) c[curse[i]] = 1; break; case 21: annihilate (); break; /* scroll of annihilation */ case 22: godirect (22, 150, "The ray hits the %s", 0, ' ');/* pulverization */ break; case 23: c[LIFEPROT]++; break; /* life protection */ }; } oorb () { } opit () { register int i; if (rnd (101) < 81) if (rnd (70) > 9 * c[DEXTERITY] - packweight () || rnd (101) < 5) if (level == MAXLEVEL - 1) obottomless (); else if (level == MAXLEVEL + MAXVLEVEL - 1) obottomless (); else { if (rnd (101) < 20) { i = 0; lprcat ("\nYou fell into a pit! Your fall is cushioned by an unknown force\n"); } else { i = rnd (level * 3 + 3); lprintf ("\nYou fell into a pit! You suffer %d hit points damage", (long) i); lastnum = 261;/* if he dies scoreboard will say so */ } losehp (i); nap (2000); newcavelevel (level + 1); draws (0, MAXX, 0, MAXY); } } obottomless () { lprcat ("\nYou fell into a bottomless pit!"); beep (); nap (3000); died (262); } oelevator (dir) int dir; { #ifdef lint int x; x = dir; dir = x; #endif lint } ostatue () { } omirror () { } obook () { lprcat ("\nDo you "); if (c[BLINDCOUNT] == 0) lprcat ("(r) read it, "); lprcat ("(t) take it"); iopts (); while (1) switch (readchar ()) { case '\33': case 'i': ignore (); return; case 'r': if (c[BLINDCOUNT]) break; lprcat ("read"); /* no more book */ readbook (iarg[playerx][playery]); forget (); return; case 't': lprcat ("take"); if (take (OBOOK, iarg[playerx][playery]) == 0) forget (); /* no more book */ return; }; } /* function to read a book */ readbook (lev) register int lev; { register int i, tmp; if (lev <= 3) i = rund ((tmp = splev[lev]) ? tmp : 1); else i = rnd ((tmp = splev[lev] - 9) ? tmp : 1) + 9; spelknow[i] = 1; lprintf ("\nSpell \"%s\": %s\n%s", spelcode[i], spelname[i], speldescript[i]); if (rnd (10) == 4) { lprcat ("\nYour int went up by one!"); c[INTELLIGENCE]++; bottomline (); } } ocookie () { char *p; lprcat ("\nDo you (e) eat it, (t) take it"); iopts (); while (1) switch (readchar ()) { case '\33': case 'i': ignore (); return; case 'e': lprcat ("eat\nThe cookie tasted good."); forget (); /* no more cookie */ if (c[BLINDCOUNT]) return; if (!(p = fortune (fortfile))) return; lprcat (" A message inside the cookie reads:\n"); lprcat (p); return; case 't': lprcat ("take"); if (take (OCOOKIE, 0) == 0) forget (); /* no more book */ return; }; } /* routine to pick up some gold -- if arg==OMAXGOLD then the pile is worth 100* the argument */ ogold (arg) int arg; { register long i; i = iarg[playerx][playery]; if (arg == OMAXGOLD) i *= 100; else if (arg == OKGOLD) i *= 1000; else if (arg == ODGOLD) i *= 10; lprintf ("\nIt is worth %d!", (long) i); c[GOLD] += i; bottomgold (); item[playerx][playery] = know[playerx][playery] = 0;/* destroy gold */ } ohome () { register int i; nosignal = 1; /* disable signals */ for (i = 0; i < 26; i++) if (iven[i] == OPOTION) if (ivenarg[i] == 21) { iven[i] = 0; /* remove the potion of cure dianthroritis from inventory */ clear (); lprcat ("Congratulations. You found a potion of cure dianthroritis.\n"); lprcat ("\nFrankly, No one thought you could do it. Boy! Did you surprise them!\n"); if (gtime > TIMELIMIT) { lprcat ("\nThe doctor has the sad duty to inform you that your daughter died!\n"); lprcat ("You didn't make it in time. In your agony, you kill the doctor,\nyour wife, and yourself! Too bad!\n"); nap (5000); died (269); } else { lprcat ("\nThe doctor is now administering the potion, and in a few moments\n"); lprcat ("Your daughter should be well on her way to recovery.\n"); nap (6000); lprcat ("\nThe potion is"); nap (3000); lprcat (" working! The doctor thinks that\n"); lprcat ("your daughter will recover in a few days. Congratulations!\n"); beep (); nap (5000); died (263); } } while (1) { clear (); lprintf ("Welcome home %s. Latest word from the doctor is not good.\n", logname); if (gtime > TIMELIMIT) { lprcat ("\nThe doctor has the sad duty to inform you that your daughter died!\n"); lprcat ("You didn't make it in time. In your agony, you kill the doctor,\nyour wife, and yourself! Too bad!\n"); nap (5000); died (269); } lprcat ("\nThe diagnosis is confirmed as dianthroritis. He guesses that\n"); lprintf ("your daughter has only %d mobuls left in this world. It's up to you,\n", (long) ((TIMELIMIT - gtime + 99) / 100)); lprintf ("%s, to find the only hope for your daughter, the very rare\n", logname); lprcat ("potion of cure dianthroritis. It is rumored that only deep in the\n"); lprcat ("depths of the caves can this potion be found.\n\n\n"); lprcat ("\n ----- press "); standout ("return"); lprcat (" to continue, "); standout ("escape"); lprcat (" to leave ----- "); i = readchar (); while (i != '\33' && i != '\n') i = readchar (); if (i == '\33') { drawscreen (); nosignal = 0; /* enable signals */ return; } } } /* routine to save program space */ iopts () { lprcat (", or (i) ignore it? "); } ignore () { lprcat ("ignore\n"); } SHAR_EOF if test 28817 -ne "`wc -c < 'object.c'`" then echo shar: error transmitting "'object.c'" '(should have been 28817 characters)' fi fi # end of overwriting check echo shar: extracting "'scores.c'" '(22296 characters)' if test -f 'scores.c' then echo shar: will not over-write existing file "'scores.c'" else cat << \SHAR_EOF > 'scores.c' /* scores.c Larn is copyrighted 1986 by Noah Morgan. * * Functions in this file are: * * readboard() Function to read in the scoreboard into a static buffer * writeboard() Function to write the scoreboard from readboard()'s buffer * makeboard() Function to create a new scoreboard(wipe out old one) * hashewon() Function to return 1 if player has won a game before, else 0 * long paytaxes(x) Function to pay taxes if any are due * winshou() Subroutine to print out the winning scoreboard * shou(x) Subroutine to print out the non-winners scoreboard * showscores() Function to show the scoreboard on the terminal * showallscores() Function to show scores and the iven lists that go with them * sortboard() Function to sort the scoreboard * newscore(score, whoo, whyded, winner) Function to add entry to scoreboard * new1sub(score,i,whoo,taxes) Subroutine to put player into a * new2sub(score,i,whoo,whyded) Subroutine to put player into a * died(x) Subroutine to record who played larn, and what the score was * diedsub(x) Subroutine to print out a line showing player when he is killed * diedlog() Subroutine to read a log file and print it out in ascii format * getplid(name) Function to get players id # from id file * */ #include #include #include "header.h" struct scofmt { /* This is the structure for the scoreboard */ long score; /* the score of the player */ long suid; /* the user id number of the player */ short what; /* the number of the monster that killed player */ short level; /* the level player was on when he died */ short hardlev; /* the level of difficulty player played at */ short order; /* the relative ordering place of this entry */ char who[40]; /* the name of the character */ char sciv[26][2];/* this is the inventory list of the character */ }; struct wscofmt { /* This is the structure for the winning scoreboard */ long score; /* the score of the player */ long timeused; /* the time used in mobuls to win the game */ long taxes; /* taxes he owes to LRS */ long suid; /* the user id number of the player */ short hardlev; /* the level of difficulty player played at */ short order; /* the relative ordering place of this entry */ char who[40]; /* the name of the character */ }; struct log_fmt { /* 102 bytes struct for the log file */ long score; /* the players score */ long diedtime; /* time when game was over */ short cavelev; /* level in caves */ short diff; /* difficulty player played at */ #ifdef EXTRA long elapsedtime;/* real time of game in seconds */ long bytout; /* bytes input and output */ long bytin; long moves; /* number of moves made by player */ short ac; /* armor class of player */ short hp,hpmax; /* players hitpoints */ short cputime; /* cpu time needed in seconds */ short killed, spused; /* monsters killed and spells cast */ short usage; /* usage of the cpu in % */ short lev; /* player level */ #endif char who[12]; /* player name */ char what[46]; /* what happened to player */ }; static struct scofmt sco[SCORESIZE];/* the structure for the scoreboard */ static struct wscofmt winr[SCORESIZE];/* struct for the winning scoreboard */ static struct log_fmt logg; /* structure for the log file */ static char *whydead[] = { "quit", "suspended", "self - annihilated", "shot by an arrow", "hit by a dart", "fell into a pit", "fell into a bottomless pit", "a winner", "trapped in solid rock", "killed by a missing save file", "killed by an old save file", "caught by the greedy cheater checker trap", "killed by a protected save file", "killed his family and committed suicide", "erased by a wayward finger", "fell through a bottomless trap door", "fell through a trap door", "drank some poisonous water", "fried by an electric shock", "slipped on a volcano shaft", "killed by a stupid act of frustration", "attacked by a revolting demon", "hit by his own magic", "demolished by an unseen attacker", "fell into the dreadful sleep", "killed by an exploding chest", /* 26 */ "killed by a missing maze data file", "annihilated in a sphere", "died a post mortem death", "wasted by a malloc() failure" }; /* * readboard() Function to read in the scoreboard into a static buffer * * returns -1 if unable to read in the scoreboard, returns 0 if all is OK */ readboard() { if (lopen(scorefile) < 0) { lprcat("Can't read scoreboard\n"); lflush(); return(-1); } lrfill((char *) sco, sizeof(sco)); lrfill((char *) winr, sizeof(winr)); lrclose(); lcreat((char *) 0); return(0); } /* * writeboard() Function to write the scoreboard from readboard()'s buffer * * returns -1 if unable to write the scoreboard, returns 0 if all is OK */ writeboard() { set_score_output(); delete(scorefile); /* otherwise we get many many copies */ if (lcreat(scorefile) < 0) { lprcat("Can't write scoreboard\n"); lflush(); return(-1); } lwrite((char *) sco, sizeof(sco)); lwrite((char *) winr, sizeof(winr)); lwclose(); lcreat((char *) 0); return(0); } /* * makeboard() Function to create a new scoreboard(wipe out old one) * * returns -1 if unable to write the scoreboard, returns 0 if all is OK */ makeboard() { register int i; for (i = 0; i < SCORESIZE; i++) { winr[i].taxes = winr[i].score = sco[i].score = 0; winr[i].order = sco[i].order = i; } if (writeboard()) return(-1); chmod(scorefile, 0664); return(0); } /* * hashewon() Function to return 1 if player has won a game before, else 0 * * This function also sets c[HARDGAME] to appropriate value -- 0 if not a * winner, otherwise the next level of difficulty listed in the winners * scoreboard. This function also sets outstanding_taxes to the value in * the winners scoreboard. */ hashewon() { register int i; c[HARDGAME] = 0; if (readboard() < 0) return(0); /* can't find scoreboard */ for (i = 0; i < SCORESIZE; i++)/* search through winners scoreboard */ if (winr[i].suid == userid) if (winr[i].score > 0) { c[HARDGAME] = winr[i].hardlev + 1; outstanding_taxes = winr[i].taxes; return(1); } return(0); } /* * long paytaxes(x) Function to pay taxes if any are due * * Enter with the amount(in gp) to pay on the taxes. * Returns amount actually paid. */ long paytaxes(x) long x; { register int i; register long amt; if (x < 0) return(0L); if (readboard() < 0) return(0L); for (i = 0; i < SCORESIZE; i++) if (winr[i].suid == userid)/* look for players winning entry */ if (winr[i].score > 0) {/* search for a winning entry for the player */ amt = winr[i].taxes; if (x < amt) amt = x; /* don't overpay taxes(Ughhhhh) */ winr[i].taxes -= amt; outstanding_taxes -= amt; if (writeboard() < 0) return(0); return(amt); } return(0L); /* couldn't find user on winning scoreboard */ } /* * winshou() Subroutine to print out the winning scoreboard * * Returns the number of players on scoreboard that were shown */ winshou() { register struct wscofmt *p; register int i,j,count; for (count = j = i = 0; i < SCORESIZE; i++)/* is there anyone on the scoreboard? */ if (winr[i].score != 0) { j++; break; } if (j) { lprcat("\n Score Difficulty Time Needed Larn Winners List\n"); for (i = 0; i < SCORESIZE; i++)/* this loop is needed to print out the */ for (j = 0; j < SCORESIZE; j++) {/* winners in order */ p = &winr[j]; /* pointer to the scoreboard entry */ if (p -> order == i) { if (p -> score) { count++; lprintf("%10d %2d %5d Mobuls %s \n", (long) p -> score,(long) p -> hardlev,(long) p -> timeused, p -> who); } break; } } } return(count); /* return number of people on scoreboard */ } /* * shou(x) Subroutine to print out the non-winners scoreboard * int x; * * Enter with 0 to list the scores, enter with 1 to list inventories too * Returns the number of players on scoreboard that were shown */ shou(x) int x; { register int i,j,n,k; int count; for (count = j = i = 0; i < SCORESIZE; i++)/* is the scoreboard empty? */ if (sco[i].score != 0) { j++; break; } if (j) { lprcat("\n Score Difficulty Larn Visitor Log\n"); for (i = 0; i < SCORESIZE; i++)/* be sure to print them out in order */ for (j = 0; j < SCORESIZE; j++) if (sco[j].order == i) { if (sco[j].score) { count++; lprintf("%10d %2d %s ", (long) sco[j].score,(long) sco[j].hardlev, sco[j].who); if (sco[j].what < 256) lprintf("killed by a %s", monster[sco[j].what].name); else lprintf("%s", whydead[sco[j].what - 256]); if (x != 263) lprintf(" on %s", levelname[sco[j].level]); if (x) { for (n = 0; n < 26; n++) { iven[n] = sco[j].sciv[n][0]; ivenarg[n] = sco[j].sciv[n][1]; } for (k = 1; k < 99; k++) for (n = 0; n < 26; n++) if (k == iven[n]) { srcount = 0; show3(n); } lprcat("\n\n"); } else lprc('\n'); } j = SCORESIZE; } } return(count); /* return the number of players just shown */ } /* * showscores() Function to show the scoreboard on the terminal * * Returns nothing of value */ static char esb[] = "The scoreboard is empty.\n"; showscores() { register int i,j; lflush(); lcreat((char *) 0); if (readboard() < 0) return; i = winshou(); j = shou(0); if (i + j == 0) lprcat(esb); else lprc('\n'); lflush(); } /* * showallscores() Function to show scores and the iven lists that go with them * * Returns nothing of value */ showallscores() { register int i,j; lflush(); lcreat((char *) 0); if (readboard() < 0) return; c[WEAR] = c[WIELD] = c[SHIELD] = -1;/* not wielding or wearing anything */ for (i = 0; i < MAXPOTION; i++) potionname[i][0] = ' '; for (i = 0; i < MAXSCROLL; i++) scrollname[i][0] = ' '; i = winshou(); j = shou(1); if (i + j == 0) lprcat(esb); else lprc('\n'); lflush(); } /* * sortboard() Function to sort the scoreboard * * Returns 0 if no sorting done, else returns 1 */ sortboard() { register int i,j,pos; long jdat; for (i = 0; i < SCORESIZE; i++) sco[i].order = winr[i].order = -1; pos = 0; while (pos < SCORESIZE) { jdat = 0; for (i = 0; i < SCORESIZE; i++) if ((sco[i].order < 0) &&(sco[i].score >= jdat)) { j = i; jdat = sco[i].score; } sco[j].order = pos++; } pos = 0; while (pos < SCORESIZE) { jdat = 0; for (i = 0; i < SCORESIZE; i++) if ((winr[i].order < 0) &&(winr[i].score >= jdat)) { j = i; jdat = winr[i].score; } winr[j].order = pos++; } return(1); } /* * newscore(score, whoo, whyded, winner) Function to add entry to scoreboard * int score, winner, whyded; * char *whoo; * * Enter with the total score in gp in score, players name in whoo, * died() reason # in whyded, and TRUE/FALSE in winner if a winner * ex. newscore(1000, "player 1", 32, 0); */ newscore(score, whoo, whyded, winner) long score; int winner,whyded; char *whoo; { register int i; long taxes; if (readboard() < 0) return; /* do the scoreboard */ /* if a winner then delete all non-winning scores */ if (cheat) winner = 0; /* if he cheated, don't let him win */ if (winner) { for (i = 0; i < SCORESIZE; i++) if (sco[i].suid == userid) sco[i].score = 0; taxes = score * TAXRATE; score += 100000 * c[HARDGAME];/* bonus for winning */ /* if he has a slot on the winning scoreboard update it if greater score */ for (i = 0; i < SCORESIZE; i++) if (winr[i].suid == userid) { new1sub(score, i, whoo, taxes); return; } /* he had no entry. look for last entry and see if he has a greater score */ for (i = 0; i < SCORESIZE; i++) if (winr[i].order == SCORESIZE - 1) { new1sub(score, i, whoo, taxes); return; } } else if (!cheat) { /* for not winning scoreboard */ /* if he has a slot on the scoreboard update it if greater score */ for (i = 0; i < SCORESIZE; i++) if (sco[i].suid == userid) { new2sub(score, i, whoo, whyded); return; } /* he had no entry. look for last entry and see if he has a greater score */ for (i = 0; i < SCORESIZE; i++) if (sco[i].order == SCORESIZE - 1) { new2sub(score, i, whoo, whyded); return; } } } /* * new1sub(score,i,whoo,taxes) Subroutine to put player into a * int score,i,whyded,taxes; winning scoreboard entry if his score * char *whoo; is high enough * * Enter with the total score in gp in score, players name in whoo, * died() reason # in whyded, and TRUE/FALSE in winner if a winner * slot in scoreboard in i, and the tax bill in taxes. * Returns nothing of value */ new1sub(score, i, whoo, taxes) long score,taxes; int i; char *whoo; { register struct wscofmt *p; p = &winr[i]; p -> taxes += taxes; if ((score >= p -> score) ||(c[HARDGAME] > p -> hardlev)) { strcpy(p -> who, whoo); p -> score = score; p -> hardlev = c[HARDGAME]; p -> suid = userid; p -> timeused = gtime / 100; } } /* * new2sub(score,i,whoo,whyded) Subroutine to put player into a * int score,i,whyded,taxes; non-winning scoreboard entry if his * char *whoo; score is high enough * * Enter with the total score in gp in score, players name in whoo, * died() reason # in whyded, and slot in scoreboard in i. * Returns nothing of value */ new2sub(score, i, whoo, whyded) long score; int i,whyded; char *whoo; { register int j; register struct scofmt *p; p = &sco[i]; if ((score >= p -> score) ||(c[HARDGAME] > p -> hardlev)) { strcpy(p -> who, whoo); p -> score = score; p -> what = whyded; p -> hardlev = c[HARDGAME]; p -> suid = userid; p -> level = level; for (j = 0; j < 26; j++) { p -> sciv[j][0] = iven[j]; p -> sciv[j][1] = ivenarg[j]; } } } /* * died(x) Subroutine to record who played larn, and what the score was * int x; * * if x < 0 then don't show scores * died() never returns!(unless c[LIFEPROT] and a reincarnatable death!) * * < 256 killed by the monster number * 256 quit * 257 suspended * 258 self - annihilated * 259 shot by an arrow * 260 hit by a dart * 261 fell into a pit * 262 fell into a bottomless pit * 263 a winner * 264 trapped in solid rock * 265 killed by a missing save file * 266 killed by an old save file * 267 caught by the greedy cheater checker trap * 268 killed by a protected save file * 269 killed his family and killed himself * 270 erased by a wayward finger * 271 fell through a bottomless trap door * 272 fell through a trap door * 273 drank some poisonous water * 274 fried by an electric shock * 275 slipped on a volcano shaft * 276 killed by a stupid act of frustration * 277 attacked by a revolting demon * 278 hit by his own magic * 279 demolished by an unseen attacker * 280 fell into the dreadful sleep * 281 killed by an exploding chest * 282 killed by a missing maze data file * 283 killed by a sphere of annihilation * 284 died a post mortem death * 285 malloc() failure * 300 quick quit -- don't put on scoreboard */ static int scorerror; died(x) int x; { register int f,win; char ch,*mod; long zzz,i; struct tms cputime; if (c[LIFEPROT] > 0) { /* if life protection */ switch((x > 0) ? x : -x) { case 256: case 257: case 262: case 263: case 265: case 266: case 267: case 268: case 269: case 271: case 282: case 284: case 285: case 300: goto invalid; /* can't be saved */ }; --c[LIFEPROT]; c[HP] = 1; --c[CONSTITUTION]; cursors(); lprcat("\nYou feel wiiieeeeerrrrrd all over! "); beep(); lflush(); sleep(4); return; /* only case where died() returns */ } invalid: clearvt100(); lflush(); f = 0; if (ckpflag) delete(ckpfile); /* remove checkpoint file if used */ if (x < 0) { f++; x = -x; } /* if we are not to display the scores */ if ((x == 300) ||(x == 257)) exit(); /* for quick exit or saved game */ if (x == 263) win = 1; else win = 0; c[GOLD] += c[BANKACCOUNT]; c[BANKACCOUNT] = 0; /* now enter the player at the end of the scoreboard */ newscore(c[GOLD], logname, x, win); diedsub(x); /* print out the score line */ lflush(); set_score_output(); if ((wizard == 0) &&(c[GOLD] > 0)) {/* wizards can't score */ if (lappend(logfile) < 0) {/* append to file */ if (lcreat(logfile) < 0) {/* and can't create new log file */ lcreat((char *) 0); lprcat("\nCan't open record file: I can't post your score.\n"); sncbr(); resetscroll(); lflush(); exit(); } chmod(logfile, 0666); } strcpy(logg.who, loginname); logg.score = c[GOLD]; logg.diff = c[HARDGAME]; if (x < 256) { ch = *monster[x].name; if (ch == 'a' || ch == 'e' || ch == 'i' || ch == 'o' || ch == 'u') mod = "an"; else mod = "a"; sprintf(logg.what, "killed by %s %s", mod, monster[x].name); } else sprintf(logg.what, "%s", whydead[x - 256]); logg.cavelev = level; time(&zzz); /* get current time -- write out score info */ logg.diedtime = zzz; #ifdef EXTRA times(&cputime); /* get cpu time -- write out score info */ logg.cputime = i = (cputime.tms_utime + cputime.tms_stime - start_cpu) / 100 + c[CPUTIME]; logg.lev = c[LEVEL]; logg.ac = c[AC]; logg.hpmax = c[HPMAX]; logg.hp = c[HP]; logg.elapsedtime = (zzz - initialtime + 59) / 60; logg.usage = (10000 * i) / (zzz - initialtime); logg.bytin = c[BYTESIN]; logg.bytout = c[BYTESOUT]; logg.moves = c[MOVESMADE]; logg.spused = c[SPELLSCAST]; logg.killed = c[MONSTKILLED]; #endif lwrite((char *) & logg, sizeof(struct log_fmt)); lwclose(); /* now for the scoreboard maintenance -- not for a suspended game */ if (x != 257) { if (sortboard()) scorerror = writeboard(); } } if ((x == 256) ||(x == 257) ||(f != 0)) exit(); if (scorerror == 0) showscores(); /* if we updated the scoreboard */ if (x == 263) mailbill(); exit(); } /* * diedsub(x) Subroutine to print out the line showing the player when he is killed * int x; */ diedsub(x) int x; { register char ch,*mod; lprintf("Score: %d, Diff: %d, %s ",(long) c[GOLD],(long) c[HARDGAME], logname); if (x < 256) { ch = *monster[x].name; if (ch == 'a' || ch == 'e' || ch == 'i' || ch == 'o' || ch == 'u') mod = "an"; else mod = "a"; lprintf("killed by %s %s", mod, monster[x].name); } else lprintf("%s", whydead[x - 256]); if (x != 263) lprintf(" on %s\n", levelname[level]); else lprc('\n'); } /* * diedlog() Subroutine to read a log file and print it out in ascii format */ diedlog() { register int n; register char *p; struct stat stbuf; lcreat((char *) 0); if (lopen(logfile) < 0) { lprintf("Can't locate log file \"%s\"\n", logfile); return; } if (fstat(fd, &stbuf) < 0) { lprintf("Can't stat log file \"%s\"\n", logfile); return; } for (n = stbuf.st_size / sizeof(struct log_fmt); n > 0; --n) { lrfill((char *) & logg, sizeof(struct log_fmt)); p = ctime(&logg.diedtime); p[16] = '\n'; p[17] = 0; lprintf("Score: %d, Diff: %d, %s %s on %d at %s",(long)(logg.score),(long)(logg.diff), logg.who, logg.what,(long)(logg.cavelev), p + 4); #ifdef EXTRA if (logg.moves <= 0) logg.moves = 1; lprintf(" Experience Level: %d, AC: %d, HP: %d/%d, Elapsed Time: %d minutes\n", (long)(logg.lev),(long)(logg.ac),(long)(logg.hp),(long)(logg.hpmax),(long)(logg.elapsedtime)); lprintf(" CPU time used: %d seconds, Machine usage: %d.%02d%%\n", (long)(logg.cputime),(long)(logg.usage / 100),(long)(logg.usage % 100)); lprintf(" BYTES in: %d, out: %d, moves: %d, deaths: %d, spells cast: %d\n", (long)(logg.bytin),(long)(logg.bytout),(long)(logg.moves),(long)(logg.killed),(long)(logg.spused)); lprintf(" out bytes per move: %d, time per move: %d ms\n", (long)(logg.bytout / logg.moves),(long)((logg.cputime * 1000) / logg.moves)); #endif } lflush(); lrclose(); return; } #ifndef UIDSCORE /* * getplid(name) Function to get players id # from id file * * Enter with the name of the players character in name. * Returns the id # of the players character, or -1 if failure. * This routine will try to find the name in the id file, if its not there, * it will try to make a new entry in the file. Only returns -1 if can't * find him in the file, and can't make a new entry in the file. * Format of playerids file: * Id # in ascii \n character name \n */ static int havepid = -1; /* playerid # if previously done */ getplid(nam) char *nam; { int fd7,high = 999,no; register char *p,*p2; char name[80]; if (havepid != -1) return(havepid); /* already did it */ lflush(); /* flush any pending I/O */ sprintf(name, "%s\n", nam); /* append a \n to name */ if (lopen(playerids) < 0) { /* no file, make it */ if (lcreat(playerids) < 0) return(-1); /* can't make it */ lwclose(); goto addone; /* now append new playerid record to file */ } for (;;) { /* now search for the name in the player id file */ p = lgetl(); if (p == NULL) break; /* EOF? */ no = atoi(p); /* the id # */ p2 = lgetl(); if (p2 == NULL) break; /* EOF? */ if (no > high) high = no; /* accumulate highest id # */ if (strcmp(p2, name) == 0) {/* we found him */ return(no); /* his id number */ } } lrclose(); /* if we get here, we didn't find him in the file -- put him there */ addone: if (lappend(playerids) < 0) return(-1); /* can't open file for append */ lprintf("%d\n%s",(long) ++high, name);/* new id # and name */ lwclose(); lcreat((char *) 0); /* re-open terminal channel */ return(high); } #endif UIDSCORE SHAR_EOF if test 22296 -ne "`wc -c < 'scores.c'`" then echo shar: error transmitting "'scores.c'" '(should have been 22296 characters)' fi fi # end of overwriting check echo shar: extracting "'store.c'" '(22511 characters)' if test -f 'store.c' then echo shar: will not over-write existing file "'store.c'" else cat << \SHAR_EOF > 'store.c' /* store.c Larn is copyrighted 1986 by Noah Morgan. */ #include "header.h" static int dndcount = 0,dnditm = 0; /* this is the data for the stuff in the dnd store */ int maxitm = 83; /* number of items in the dnd inventory table */ globaldef struct _itm itm[90] = { /* cost memory iven name iven arg how gp pointer iven[] ivenarg[] many */ { 2, 0, OLEATHER, 0, 3 }, { 10, 0, OSTUDLEATHER, 0, 2 }, { 40, 0, ORING, 0, 2 }, { 85, 0, OCHAIN, 0, 2 }, { 220, 0, OSPLINT, 0, 1 }, { 400, 0, OPLATE, 0, 1 }, { 900, 0, OPLATEARMOR, 0, 1 }, { 2600, 0, OSSPLATE, 0, 1 }, { 150, 0, OSHIELD, 0, 1 }, /* cost memory iven name iven arg how gp pointer iven[] ivenarg[] many */ { 2, 0, ODAGGER, 0, 3 }, { 20, 0, OSPEAR, 0, 3 }, { 80, 0, OFLAIL, 0, 2}, { 150, 0, OBATTLEAXE, 0, 2}, { 450, 0, OLONGSWORD, 0, 2}, { 1000, 0, O2SWORD, 0, 2}, { 5000, 0, OSWORD, 0, 1}, { 16500, 0, OLANCE, 0, 1}, { 6000, 0, OSWORDofSLASHING, 0, 0}, { 10000, 0, OHAMMER, 0, 0 }, /* cost memory iven name iven arg how gp pointer iven[] ivenarg[] many */ { 150, 0, OPROTRING, 1, 1 } , { 85, 0, OSTRRING, 1, 1 } , { 120, 0, ODEXRING, 1, 1 } , { 120, 0, OCLEVERRING, 1, 1 } , { 180, 0, OENERGYRING, 0, 1 } , { 125, 0, ODAMRING, 0, 1 } , { 220, 0, OREGENRING, 0, 1 } , { 1000, 0, ORINGOFEXTRA, 0, 1 } , { 280, 0, OBELT, 0, 1 } , { 400, 0, OAMULET, 0, 1 } , { 6500, 0, OORBOFDRAGON, 0, 0 } , { 5500, 0, OSPIRITSCARAB, 0, 0 } , { 5000, 0, OCUBEofUNDEAD, 0, 0 } , { 6000, 0, ONOTHEFT, 0, 0 } , { 590, 0, OCHEST, 6, 1 } , { 200, 0, OBOOK, 8, 1 } , { 10, 0, OCOOKIE, 0, 3 } , /* cost memory iven name iven arg how gp pointer iven[] ivenarg[] many */ { 20, potionname, OPOTION, 0, 6 } , { 90, potionname, OPOTION, 1, 5 } , { 520, potionname, OPOTION, 2, 1 } , { 100, potionname, OPOTION, 3, 2 } , { 50, potionname, OPOTION, 4, 2 } , { 150, potionname, OPOTION, 5, 2 } , { 70, potionname, OPOTION, 6, 1 } , { 30, potionname, OPOTION, 7, 7 } , { 200, potionname, OPOTION, 8, 1 } , { 50, potionname, OPOTION, 9, 1 } , { 80, potionname, OPOTION, 10, 1 } , /* cost memory iven name iven arg how gp pointer iven[] ivenarg[] many */ { 30, potionname, OPOTION, 11, 3 } , { 20, potionname, OPOTION, 12, 5 } , { 40, potionname, OPOTION, 13, 3 } , { 35, potionname, OPOTION, 14, 2 } , { 520, potionname, OPOTION, 15, 1 } , { 90, potionname, OPOTION, 16, 2 } , { 200, potionname, OPOTION, 17, 2 } , { 220, potionname, OPOTION, 18, 4 } , { 80, potionname, OPOTION, 19, 6 } , { 370, potionname, OPOTION, 20, 3 } , { 50, potionname, OPOTION, 22, 1 } , { 150, potionname, OPOTION, 23, 3 } , /* cost memory iven name iven arg how gp pointer iven[] ivenarg[] many */ { 100, scrollname, OSCROLL, 0, 2 } , { 125, scrollname, OSCROLL, 1, 2 } , { 60, scrollname, OSCROLL, 2, 4 } , { 10, scrollname, OSCROLL, 3, 4 } , { 100, scrollname, OSCROLL, 4, 3 } , { 200, scrollname, OSCROLL, 5, 2 } , { 110, scrollname, OSCROLL, 6, 1 } , { 500, scrollname, OSCROLL, 7, 2 } , { 200, scrollname, OSCROLL, 8, 2 } , { 250, scrollname, OSCROLL, 9, 4 } , { 20, scrollname, OSCROLL, 10, 5 } , { 30, scrollname, OSCROLL, 11, 3 } , /* cost memory iven name iven arg how gp pointer iven[] ivenarg[] many */ { 340, scrollname, OSCROLL, 12, 1 } , { 340, scrollname, OSCROLL, 13, 1 } , { 300, scrollname, OSCROLL, 14, 2 } , { 400, scrollname, OSCROLL, 15, 2 } , { 500, scrollname, OSCROLL, 16, 2 } , { 1000, scrollname, OSCROLL, 17, 1 } , { 500, scrollname, OSCROLL, 18, 1 } , { 340, scrollname, OSCROLL, 19, 2 } , { 220, scrollname, OSCROLL, 20, 3 } , { 3900, scrollname, OSCROLL, 21, 0 } , { 610, scrollname, OSCROLL, 22, 1 } , { 3000, scrollname, OSCROLL, 23, 0 } }; /* function for the dnd store */ dnd_2hed() { lprcat("Welcome to the Larn Thrift Shoppe. We stock many items explorers find useful\n"); lprcat(" in their adventures. Feel free to browse to your hearts content.\n"); lprcat("Also be advised, if you break 'em, you pay for 'em."); } dnd_hed() { register int i; for (i = dnditm; i < 26 + dnditm; i++) dnditem(i); cursor(50, 18); lprcat("You have "); } dndstore() { register int i; dnditm = 0; nosignal = 1; /* disable signals */ clear(); dnd_2hed(); if (outstanding_taxes > 0) { lprcat("\n\nThe Larn Revenue Service has ordered us to not do business with tax evaders.\n"); beep(); lprintf("They have also told us that you owe %d gp in back taxes, and as we must\n",(long) outstanding_taxes); lprcat("comply with the law, we cannot serve you at this time. Soo Sorry.\n"); cursors(); lprcat("\nPress "); standout("escape"); lprcat(" to leave: "); lflush(); i = 0; while (i != '\33') i = readchar(); drawscreen(); nosignal = 0; /* enable signals */ return; } dnd_hed(); while (1) { cursor(59, 18); lprintf("%d gold pieces",(long) c[GOLD]); cltoeoln(); cl_dn(1, 20); /* erase to eod */ lprcat("\nEnter your transaction ["); standout("space"); lprcat(" for more, "); standout("escape"); lprcat(" to leave]? "); i = 0; while ((i < 'a' || i > 'z') &&(i != ' ') &&(i != '\33') &&(i != 12)) i = readchar(); if (i == 12) { clear(); dnd_2hed(); dnd_hed(); } else if (i == '\33') { drawscreen(); nosignal = 0; /* enable signals */ return; } else if (i == ' ') { cl_dn(1, 4); if ((dnditm += 26) >= maxitm) dnditm = 0; dnd_hed(); } else { /* buy something */ lprc(i); /* echo the byte */ i += dnditm - 'a'; if (i >= maxitm) outofstock(); else if (itm[i].qty <= 0) outofstock(); else if (pocketfull()) handsfull(); else if (c[GOLD] < itm[i].price * 10) nogold(); else { if (itm[i].mem != 0) *itm[i].mem[itm[i].arg] = ' '; c[GOLD] -= itm[i].price * 10; itm[i].qty--; take(itm[i].obj, itm[i].arg); if (itm[i].qty == 0) dnditem(i); nap(1001); } } } } /* function for the players hands are full */ static handsfull() { lprcat("\nYou can't carry anything more!"); lflush(); nap(2200); } static outofstock() { lprcat("\nSorry, but we are out of that item."); lflush(); nap(2200); } static nogold() { lprcat("\nYou don't have enough gold to pay for that!"); lflush(); nap(2200); } /* dnditem(index) to print the item list; used in dndstore() enter with the index into itm */ static dnditem(i) register int i; { register int j,k; if (i >= maxitm) return; cursor((j = (i & 1) * 40 + 1),(k = ((i % 26) >> 1) + 5)); if (itm[i].qty == 0) { lprintf("%39s", ""); return; } lprintf("%c) ",(i % 26) + 'a'); if (itm[i].obj == OPOTION) { lprcat("potion of "); lprintf("%s", &potionname[itm[i].arg][1]); } else if (itm[i].obj == OSCROLL) { lprcat("scroll of "); lprintf("%s", &scrollname[itm[i].arg][1]); } else lprintf("%s", objectname[itm[i].obj]); cursor(j + 31, k); lprintf("%6d",(long)(itm[i].price * 10)); } /* for the college of larn */ globaldef char course[26] = 0; /* the list of courses taken */ char coursetime[] = { 10, 15, 10, 20, 10, 10, 10, 5 }; /* function to display the header info for the school */ sch_hed() { clear(); lprcat("The College of Larn offers the exciting opportunity of higher education to\n"); lprcat("all inhabitants of the caves. Here is a list of the class schedule:\n\n\n"); lprcat("\t\t Course Name \t Time Needed\n\n"); if (course[0] == 0) lprcat("\t\ta) Fighters Training I 10 mobuls");/* line 7 of crt */ lprc('\n'); if (course[1] == 0) lprcat("\t\tb) Fighters Training II 15 mobuls"); lprc('\n'); if (course[2] == 0) lprcat("\t\tc) Introduction to Wizardry 10 mobuls"); lprc('\n'); if (course[3] == 0) lprcat("\t\td) Applied Wizardry 20 mobuls"); lprc('\n'); if (course[4] == 0) lprcat("\t\te) Behavioral Psychology 10 mobuls"); lprc('\n'); if (course[5] == 0) lprcat("\t\tf) Faith for Today 10 mobuls"); lprc('\n'); if (course[6] == 0) lprcat("\t\tg) Contemporary Dance 10 mobuls"); lprc('\n'); if (course[7] == 0) lprcat("\t\th) History of Larn 5 mobuls"); lprcat("\n\n\t\tAll courses cost 250 gold pieces."); cursor(30, 18); lprcat("You are presently carrying "); } oschool() { register int i; long time_used; nosignal = 1; /* disable signals */ sch_hed(); while (1) { cursor(57, 18); lprintf("%d gold pieces. ",(long) c[GOLD]); cursors(); lprcat("\nWhat is your choice ["); standout("escape"); lprcat(" to leave] ? "); yrepcount = 0; i = 0; while ((i < 'a' || i > 'h') &&(i != '\33') &&(i != 12)) i = readchar(); if (i == 12) { sch_hed(); continue; } else if (i == '\33') { nosignal = 0; drawscreen(); /* enable signals */ return; } lprc(i); if (c[GOLD] < 250) nogold(); else if (course[i - 'a']) { lprcat("\nSorry, but that class is filled."); nap(1000); } else if (i <= 'h') { c[GOLD] -= 250; time_used = 0; switch(i) { case 'a': c[STRENGTH] += 2; c[CONSTITUTION]++; lprcat("\nYou feel stronger!"); cl_line(16, 7); break; case 'b': if (course[0] == 0) { lprcat("\nSorry, but this class has a prerequisite of Fighters Training I"); c[GOLD] += 250; time_used = -10000; break; } lprcat("\nYou feel much stronger!"); cl_line(16, 8); c[STRENGTH] += 2; c[CONSTITUTION] += 2; break; case 'c': c[INTELLIGENCE] += 2; lprcat("\nThe task before you now seems more attainable!"); cl_line(16, 9); break; case 'd': if (course[2] == 0) { lprcat("\nSorry, but this class has a prerequisite of Introduction to Wizardry"); c[GOLD] += 250; time_used = -10000; break; } lprcat("\nThe task before you now seems very attainable!"); cl_line(16, 10); c[INTELLIGENCE] += 2; break; case 'e': c[CHARISMA] += 3; lprcat("\nYou now feel like a born leader!"); cl_line(16, 11); break; case 'f': c[WISDOM] += 2; lprcat("\nYou now feel more confident that you can find the potion in time!"); cl_line(16, 12); break; case 'g': c[DEXTERITY] += 3; lprcat("\nYou feel like dancing!"); cl_line(16, 13); break; case 'h': c[INTELLIGENCE]++; lprcat("\nYour instructor told you that the Eye of Larn is rumored to be guarded\n"); lprcat("by a platinum dragon who possesses psionic abilities. "); cl_line(16, 14); break; } time_used += coursetime[i - 'a'] * 100; if (time_used > 0) { gtime += time_used; course[i - 'a']++;/* remember that he has taken that course */ c[HP] = c[HPMAX]; c[SPELLS] = c[SPELLMAX];/* he regenerated */ if (c[BLINDCOUNT]) c[BLINDCOUNT] = 1;/* cure blindness too! */ if (c[CONFUSE]) c[CONFUSE] = 1;/* end confusion */ adjtime((long) time_used);/* adjust parameters for time change */ } nap(1000); } } } /* * for the first national bank of Larn */ int lasttime = 0; /* last time he was in bank */ obank() { banktitle(" Welcome to the First National Bank of Larn."); } obank2() { banktitle("Welcome to the 5th level branch office of the First National Bank of Larn."); } static banktitle(str) char *str; { nosignal = 1; /* disable signals */ clear(); lprcat(str); if (outstanding_taxes > 0) { register int i; lprcat("\n\nThe Larn Revenue Service has ordered that your account be frozen until all\n"); beep(); lprintf("levied taxes have been paid. They have also told us that you owe %d gp in\n",(long) outstanding_taxes); lprcat("taxes, and we must comply with them. We cannot serve you at this time. Sorry.\n"); lprcat("We suggest you go to the LRS office and pay your taxes.\n"); cursors(); lprcat("\nPress "); standout("escape"); lprcat(" to leave: "); lflush(); i = 0; while (i != '\33') i = readchar(); drawscreen(); nosignal = 0; /* enable signals */ return; } lprcat("\n\n\tGemstone\t Appraisal\t\tGemstone\t Appraisal"); obanksub(); nosignal = 0; /* enable signals */ drawscreen(); } /* * function to put interest on your bank account */ ointerest() { register int i; if (c[BANKACCOUNT] < 0) c[BANKACCOUNT] = 0; else if ((c[BANKACCOUNT] > 0) &&(c[BANKACCOUNT] < 500000)) { i = (gtime - lasttime) / 100;/* # mobuls elapsed */ while ((i-- > 0) &&(c[BANKACCOUNT] < 500000)) c[BANKACCOUNT] += c[BANKACCOUNT] / 250; if (c[BANKACCOUNT] > 500000) c[BANKACCOUNT] = 500000;/* interest limit */ } lasttime = (gtime / 100) * 100; } static short gemorder[26] = 0;/* the reference to screen location for each */ static long gemvalue[26] = 0; /* the appraisal of the gems */ obanksub() { unsigned long amt; register int i, k; ointerest(); /* credit any needed interest */ for (k = i = 0; i < 26; i++) switch(iven[i]) { case OLARNEYE: case ODIAMOND: case OEMERALD: case ORUBY: case OSAPPHIRE: if (iven[i] == OLARNEYE) { gemvalue[i] = 250000 - ((gtime * 7) / 100) * 100; if (gemvalue[i] < 50000) gemvalue[i] = 50000; } else gemvalue[i] = (255 & ivenarg[i]) * 100; gemorder[i] = k; cursor((k % 2) * 40 + 1,(k >> 1) + 4); lprintf("%c) %s", i + 'a', objectname[iven[i]]); cursor((k % 2) * 40 + 33,(k >> 1) + 4); lprintf("%5d",(long) gemvalue[i]); k++; }; cursor(31, 17); lprintf("You have %8d gold pieces in the bank.",(long) c[BANKACCOUNT]); cursor(40, 18); lprintf("You have %8d gold pieces",(long) c[GOLD]); if (c[BANKACCOUNT] + c[GOLD] >= 500000) lprcat("\nNote: Larndom law states that only deposits under 500,000gp can earn interest."); while (1) { cl_dn(1, 20); lprcat("\nYour wish? [("); standout("d"); lprcat(") deposit,("); standout("w"); lprcat(") withdraw,("); standout("s"); lprcat(") sell a stone, or "); standout("escape"); lprcat("] "); yrepcount = 0; i = 0; while (i != 'd' && i != 'w' && i != 's' && i != '\33') i = readchar(); switch(i) { case 'd': lprcat("deposit\nHow much? "); amt = readnum((long) c[GOLD]); if (amt < 0) { lprcat("\nSorry, but we can't take negative gold!"); nap(2000); amt = 0; } else if (amt > c[GOLD]) { lprcat(" You don't have that much."); nap(2000); } else { c[GOLD] -= amt; c[BANKACCOUNT] += amt; } break; case 'w': lprcat("withdraw\nHow much? "); amt = readnum((long) c[BANKACCOUNT]); if (amt < 0) { lprcat("\nSorry, but we don't have any negative gold!"); nap(2000); amt = 0; } else if (amt > c[BANKACCOUNT]) { lprcat("\nYou don't have that much in the bank!"); nap(2000); } else { c[GOLD] += amt; c[BANKACCOUNT] -= amt; } break; case 's': lprcat("\nWhich stone would you like to sell? "); i = 0; while ((i < 'a' || i > 'z') && i != '*') i = readchar(); if (i == '*') for (i = 0; i < 26; i++) { if (gemvalue[i]) { c[GOLD] += gemvalue[i]; iven[i] = 0; gemvalue[i] = 0; k = gemorder[i]; cursor((k % 2) * 40 + 1,(k >> 1) + 4); lprintf("%39s", ""); } } else { if (gemvalue[i = i - 'a'] == 0) { lprintf("\nItem %c is not a gemstone!", i + 'a'); nap(2000); break; } c[GOLD] += gemvalue[i]; iven[i] = 0; gemvalue[i] = 0; k = gemorder[i]; cursor((k % 2) * 40 + 1,(k >> 1) + 4); lprintf("%39s", ""); } break; case '\33': return; }; cursor(40, 17); lprintf("%8d",(long) c[BANKACCOUNT]); cursor(49, 18); lprintf("%8d",(long) c[GOLD]); } } /* subroutine to appraise any stone for the bank */ appraise(gemstone) register int gemstone; { register int j, amt; for (j = 0; j < 26; j++) if (iven[j] == gemstone) { lprintf("\nI see you have %s", objectname[gemstone]); if (gemstone == OLARNEYE) lprcat(" I must commend you. I didn't think\nyou could get it."); lprcat(" Shall I appraise it for you? "); yrepcount = 0; if (getyn() == 'y') { lprcat("yes.\n Just one moment please \n"); nap(1000); if (gemstone == OLARNEYE) { amt = 250000 - ((gtime * 7) / 100) * 100; if (amt < 50000) amt = 50000; } else amt = (255 & ivenarg[j]) * 100; lprintf("\nI can see this is an excellent stone, It is worth %d",(long) amt); lprcat("\nWould you like to sell it to us? "); yrepcount = 0; if (getyn() == 'y') { lprcat("yes\n"); c[GOLD] += amt; iven[j] = 0; } else lprcat("no thank you.\n"); if (gemstone == OLARNEYE) lprcat("It is, of course, your privilege to keep the stone\n"); } else lprcat("no\nO. K.\n"); } } /* function for the trading post */ static otradhead() { clear(); lprcat("Welcome to the Larn Trading Post. We buy items that explorers no longer find\n"); lprcat("useful. Since the condition of the items you bring in is not certain,\n"); lprcat("and we incur great expense in reconditioning the items, we usually pay\n"); lprcat("only 20% of their value were they to be new. If the items are badly\n"); lprcat("damaged, we will pay only 10% of their new value.\n\n"); } otradepost() { register int i, j, value, isub, izarg; dnditm = dndcount = 0; nosignal = 1; /* disable signals */ resetscroll(); otradhead(); while (1) { lprcat("\nWhat item do you want to sell to us ["); standout("*"); lprcat(" for list, or "); standout("escape"); lprcat("] ? "); i = 0; while (i > 'z' ||(i < 'a' && i != '*' && i != '\33' && i != '.')) i = readchar(); if (i == '\33') { setscroll(); recalc(); drawscreen(); nosignal = 0; /* enable signals */ return; } isub = i - 'a'; j = 0; if (iven[isub] == OSCROLL) if (scrollname[ivenarg[isub]][0] == 0) { j = 1; cnsitm(); } /* can't sell unidentified item */ if (iven[isub] == OPOTION) if (potionname[ivenarg[isub]][0] == 0) { j = 1; cnsitm(); } /* can't sell unidentified item */ if (!j) if (i == '*') { clear(); qshowstr(); otradhead(); } else if (iven[isub] == 0) lprintf("\nYou don't have item %c!", isub + 'a'); else { for (j = 0; j < maxitm; j++) if ((itm[j].obj == iven[isub]) ||(iven[isub] == ODIAMOND) ||(iven[isub] == ORUBY) ||(iven[isub] == OEMERALD) ||(iven[isub] == OSAPPHIRE)) { srcount = 0; show3(isub);/* show what the item was */ if ((iven[isub] == ODIAMOND) ||(iven[isub] == ORUBY) ||(iven[isub] == OEMERALD) ||(iven[isub] == OSAPPHIRE)) value = 20 * ivenarg[isub]; else if ((itm[j].obj == OSCROLL) ||(itm[j].obj == OPOTION)) value = 2 * itm[j + ivenarg[isub]].price; else { izarg = ivenarg[isub]; value = itm[j].price;/* appreciate if a +n object */ if (izarg >= 0) value *= 2; while ((izarg-- > 0) &&((value = 14 *(67 + value) / 10) < 500000)); } lprintf("\nItem(%c) is worth %d gold pieces to us. Do you want to sell it? ", i,(long) value); yrepcount = 0; if (getyn() == 'y') { lprcat("yes\n"); c[GOLD] += value; if (c[WEAR] == isub) c[WEAR] = -1; if (c[WIELD] == isub) c[WIELD] = -1; if (c[SHIELD] == isub) c[SHIELD] = -1; adjustcvalues(iven[isub], ivenarg[isub]); iven[isub] = 0; } else lprcat("no thanks.\n"); j = maxitm + 100;/* get out of the inner loop */ } if (j <= maxitm + 2) lprcat("\nSo sorry, but we are not authorized to accept that item."); } } } cnsitm() { lprcat("\nSorry, we can't accept unidentified objects."); } /* * for the Larn Revenue Service */ olrs() { register int i, first; unsigned long amt; first = nosignal = 1; /* disable signals */ clear(); resetscroll(); cursor(1, 4); lprcat("Welcome to the Larn Revenue Service district office. How can we help you?"); while (1) { if (first) { first = 0; goto nxt; } cursors(); lprcat("\n\nYour wish? [("); standout("p"); lprcat(") pay taxes, or "); standout("escape"); lprcat("] "); yrepcount = 0; i = 0; while (i != 'p' && i != '\33') i = readchar(); switch(i) { case 'p': lprcat("pay taxes\nHow much? "); amt = readnum((long) c[GOLD]); if (amt < 0) { lprcat("\nSorry, but we can't take negative gold\n"); amt = 0; } else if (amt > c[GOLD]) lprcat(" You don't have that much.\n"); else c[GOLD] -= paytaxes((long) amt); break; case '\33': nosignal = 0; /* enable signals */ setscroll(); drawscreen(); return; }; nxt: cursor(1, 6); if (outstanding_taxes > 0) lprintf("You presently owe %d gp in taxes. ",(long) outstanding_taxes); else lprcat("You do not owe us any taxes. "); cursor(1, 8); if (c[GOLD] > 0) lprintf("You have %6d gp. ",(long) c[GOLD]); else lprcat("You have no gold pieces. "); } } SHAR_EOF if test 22511 -ne "`wc -c < 'store.c'`" then echo shar: error transmitting "'store.c'" '(should have been 22511 characters)' fi fi # end of overwriting check # End of shell archive exit 0