[comp.sources.games] v05i018: omega2 - rogue like dungeon exploration

games@tekred.TEK.COM (07/26/88)

Submitted by: "Laurence R. Brothers" <brothers@paul.rutgers.edu>
Comp.sources.games: Volume 5, Issue 18
Archive-name: omega2/Part08



#! /bin/sh
# This is a shell archive.  Remove anything before this line, then unpack
# it by saving it into a file and typing "sh file".  To overwrite existing
# files, type "sh file -c".  You can also feed this as standard input via
# unshar, or by typing "sh <file", e.g..  If this archive is complete, you
# will see the following message at the end:
#		"End of archive 8 (of 19)."
# Contents:  oabyss.dat ocom3.c oitem.c
# Wrapped by billr@saab on Wed Jul 13 10:46:47 1988
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f 'oabyss.dat' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'oabyss.dat'\"
else
echo shar: Extracting \"'oabyss.dat'\" \(1106 characters\)
sed "s/^X//" >'oabyss.dat' <<'END_OF_FILE'
X0000000000000000000000000.....#####.....000000000000000000000000
X0000000000000000000000000...###~.6###...000000000000000000000000
X0000000000000000000000000..##.......##..000000000000000000000000
X0000000000000000000000000..##".....;##..000000000000000000000000
X0000000000000000000000000...##.....##...000000000000000000000000
X0000000000000000000000000.##1##.V.##2##.000000000000000000000000
X0000000000000000000000000..###..3..###..000000000000000000000000
X0000000000000000000000000...............000000000000000000000000
X0000000000000000000000000000000...000000000000000000000000000000
X0000000000000000000000000000000...000000000000000000000000000000
X0000000000000000000000000000000...000000000000000000000000000000
X0000000000000000000000000000000...000000000000000000000000000000
X0000000000000000000000000000000...000000000000000000000000000000
X0000000000000000000000000000000...000000000000000000000000000000
X0000000000000000000000000000000...000000000000000000000000000000
X0000000000000000000000000000000...000000000000000000000000000000
X0000000000000000000000000000000...000000000000000000000000000000
X
END_OF_FILE
if test 1106 -ne `wc -c <'oabyss.dat'`; then
    echo shar: \"'oabyss.dat'\" unpacked with wrong size!
fi
# end of 'oabyss.dat'
fi
if test -f 'ocom3.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'ocom3.c'\"
else
echo shar: Extracting \"'ocom3.c'\" \(27429 characters\)
sed "s/^X//" >'ocom3.c' <<'END_OF_FILE'
X/* omega copyright (C) by Laurence Raphael Brothers, 1987,1988 */
X/* ocom3.c */
X
X/* This file contains some more top level command functions
X   called from ocom1.c */
X
X#include "oglob.h"
X#include "odate.h"
X
X/* look at some spot */
Xvoid examine()
X{
X  pol ol;
X  int x=Player.x,y=Player.y,drewmenu=FALSE;
X
X  clearmsg();
X
X  setgamestatus(SKIP_MONSTERS);
X  mprint("Examine --");
X  setspot(&x,&y);
X  if (inbounds(x,y)) {
X    clearmsg();
X    if (Current_Environment == E_COUNTRYSIDE) {
X      if (! Country[x][y].explored) 
X	print3("How should I know what that is?");
X      else {
X	mprint("That terrain is:");
X	mprint(countryid(Country[x][y].current_terrain_type));
X      }
X    } 
X    else if (! los_p(Player.x,Player.y,x,y))
X      print3("I refuse to examine something I can't see.");
X    else {
X      clearmsg();
X      if (Level->site[x][y].creature != NULL) 
X	mprint(mstatus_string(Level->site[x][y].creature));
X      else if ((Player.x == x) && (Player.y ==y)) 
X	describe_player();
X      if (loc_statusp(x,y,SECRET))
X	print2("An age-worn stone wall.");
X      else
X	switch (Level->site[x][y].locchar) {
X	case SPACE: print2("An infinite void."); break;
X	case PORTCULLIS: print2("A heavy steel portcullis"); break;
X	case ABYSS: print2("An entrance to the infinite abyss"); break;
X	case FLOOR:
X	  if (Current_Dungeon == Current_Environment)
X	    print2("A dirty stone floor.");
X	  else print2("The ground.");
X	  break;
X	case WALL:
X	  if (Level->site[x][y].aux == 0)
X	    print2("A totally impervious wall.");
X	  else if (Level->site[x][y].aux < 10)
X	    print2("A pitted concrete wall.");
X	  else if (Level->site[x][y].aux < 30)
X	    print2("An age-worn sandstone wall.");
X	  else if (Level->site[x][y].aux < 50)
X	    print2("A smooth basalt wall.");
X	  else if (Level->site[x][y].aux < 70)
X	    print2("A solid granite wall.");
X	  else if (Level->site[x][y].aux < 90)
X	    print2("A wall of steel.");
X	  else if (Level->site[x][y].aux < 210) {
X	    if (Current_Environment == E_CITY)
X	      print2("A thick wall of Rampart bluestone");
X	    else print2("A magically reinforced wall.");
X	  }
X	  else print2("An almost totally impervious wall.");
X	  break;
X	case RUBBLE:print2("A dangerous-looking pile of rubble."); break;
X	case SAFE:print2("A steel safe inset into the floor."); break;
X	case CLOSED_DOOR:print2("A solid oaken door, now closed."); break;
X	case OPEN_DOOR:print2("A solid oaken door, now open."); break;
X	case STATUE:print2("A strange-looking statue."); break;
X	case UP:print2("A stairway leading up."); break;
X	case DOWN:print2("A stairway leading down...."); break;
X	case TRAP:print2(trapid(Level->site[x][y].p_locf)); break;
X	case HEDGE:
X	  if (Level->site[x][y].p_locf == L_EARTH_STATION)
X	    print2("A weird fibrillation of oozing tendrils.");
X	  else print2("A brambly, thorny hedge."); 
X	  break;
X	case LAVA:print2("A bubbling pool of lava."); break;
X	case LIFT:print2("A strange glowing disk."); break;
X	case ALTAR:print2("An (un?)holy altar."); break;
X	case CHAIR:print2("A chair."); break;
X	case WHIRLWIND:print2("A strange cyclonic electrical storm."); break;
X	case WATER: 
X	  if (Level->site[x][y].p_locf == L_WATER)
X	    print2("A deep pool of water.");
X	  else if (Level->site[x][y].p_locf == L_CHAOS)
X	    print2("A pool of primal chaos.");
X	  else if (Level->site[x][y].p_locf == L_WATER_STATION)
X	    print2("A bubbling pool of acid.");
X	  else print2("An eerie pool of water.");
X	  break;
X	case FIRE:print2("A curtain of fire."); break;
X	default:print2("Wow, I haven't the faintest idea!"); break;
X	}
X      if ((ol = Level->site[x][y].things) != NULL) {
X	if (ol->next == NULL)
X	  print3(itemid(ol->thing));
X	else {
X	  drewmenu = TRUE;
X	  menuclear();
X	  menuprint("Things on floor:\n");
X	  while (ol != NULL) {
X	    menuprint("\n");
X	    menuprint(itemid(ol->thing));
X	    ol = ol->next;
X	  }
X	}
X      }
X      morewait();
X      sign_print(x,y,TRUE);
X    }
X  }
X  if (drewmenu) xredraw();
X}
X
Xvoid help()
X{
X  char c;
X  char filestr[80];
X  int n,filenum;
X  clearmsg();
X  print1("Please enter the letter indicating what topic you want help on.");
X  menuclear();
X  menuprint("a: Overview\n");
X  menuprint("b: Characters\n");
X  menuprint("c: Inventories\n");
X  menuprint("d: Movement\n");
X  menuprint("e: Combat\n");
X  menuprint("f: Bugs\n");
X  menuprint("g: Magic\n");
X  menuprint("h: The Countryside\n");
X  menuprint("i: The Screen Display\n");
X  menuprint("j: Saving and Restoring\n");
X  menuprint("k: Options Settings\n");
X  menuprint("l: Dungeon/City/Other Command List\n");
X  menuprint("m: Countryside Command List\n");
X  menuprint("n: Everything\n");
X  menuprint("ESCAPE: Forget the whole thing.");
X  do 
X    c = mcigetc();
X  while ((c < 'a') && (c > 'n') && (c != ESCAPE));
X  if (c == 'n') {
X    print1("Trying to copy all help files to ./omega.doc ");
X    nprint1("Confirm [yn]");
X    if (ynq1()=='y') {
X      print2("Copying");
X      nprint2(".");
X      strcpy(Str1,"cat ");
X      strcat(Str1,OMEGALIB);
X      strcat(Str1,"ohelp1.txt");
X      strcat(Str1," >> omega.doc");
X      system(Str1);
X      nprint2(".");
X      strcpy(Str1,"cat ");
X      strcat(Str1,OMEGALIB);
X      strcat(Str1,"ohelp2.txt");
X      strcat(Str1," >> omega.doc");
X      system(Str1);
X      nprint2(".");
X      strcpy(Str1,"cat ");
X      strcat(Str1,OMEGALIB);
X      strcat(Str1,"ohelp3.txt");
X      strcat(Str1," >> omega.doc");
X      system(Str1);
X      nprint2(".");
X      strcpy(Str1,"cat ");
X      strcat(Str1,OMEGALIB);
X      strcat(Str1,"ohelp4.txt");
X      strcat(Str1," >> omega.doc");
X      system(Str1);
X      nprint2(".");
X      strcpy(Str1,"cat ");
X      strcat(Str1,OMEGALIB);
X      strcat(Str1,"ohelp5.txt");
X      strcat(Str1," >> omega.doc");
X      system(Str1);
X      nprint2(".");
X      strcpy(Str1,"cat ");
X      strcat(Str1,OMEGALIB);
X      strcat(Str1,"ohelp6.txt");
X      strcat(Str1," >> omega.doc");
X      system(Str1);
X      nprint2(".");
X      strcpy(Str1,"cat ");
X      strcat(Str1,OMEGALIB);
X      strcat(Str1,"ohelp7.txt");
X      strcat(Str1," >> omega.doc");
X      system(Str1);
X      nprint2(".");
X      strcpy(Str1,"cat ");
X      strcat(Str1,OMEGALIB);
X      strcat(Str1,"ohelp8.txt");
X      strcat(Str1," >> omega.doc");
X      system(Str1);
X      nprint2(".");
X      strcpy(Str1,"cat ");
X      strcat(Str1,OMEGALIB);
X      strcat(Str1,"ohelp9.txt");
X      strcat(Str1," >> omega.doc");
X      system(Str1);
X      nprint2(".");
X      strcpy(Str1,"cat ");
X      strcat(Str1,OMEGALIB);
X      strcat(Str1,"ohelp10.txt");
X      strcat(Str1," >> omega.doc");
X      system(Str1);
X      nprint2(".");
X      strcpy(Str1,"cat ");
X      strcat(Str1,OMEGALIB);
X      strcat(Str1,"ohelp11.txt");
X      strcat(Str1," >> omega.doc");
X      system(Str1);
X      nprint2(".");
X      strcpy(Str1,"cat ");
X      strcat(Str1,OMEGALIB);
X      strcat(Str1,"ohelp12.txt");
X      strcat(Str1," >> omega.doc");
X      system(Str1);
X      nprint2(".");
X      strcpy(Str1,"cat ");
X      strcat(Str1,OMEGALIB);
X      strcat(Str1,"ohelp13.txt");
X      strcat(Str1," >> omega.doc");
X      system(Str1);
X      nprint2(" Done.");
X    }
X  }
X  else if (c != ESCAPE) {
X    strcpy(filestr,OMEGALIB);
X    strcat(filestr,"ohelp");
X    filenum = c+1-'a';
X    n = strlen(filestr);
X    if (filenum<10) {
X      filestr[n] = filenum+'0';
X      filestr[n+1] = 0;
X    }
X    else {
X      filestr[n] = '1';
X      filenum = c - 'j';
X      filestr[n+1] = filenum+'0';
X      filestr[n+2] = 0;
X    }
X    strcat(filestr,".txt");
X    print1("Display help file, or Copy help file to file in wd. [dc] ");
X    do 
X      c = mcigetc();
X    while ((c != 'd') && (c != 'c')&& (c!=ESCAPE));
X    if (c == 'd')
X      displayfile(filestr);
X    else if (c == 'c') copyfile(filestr);
X  }
X  xredraw();
X}
X
Xvoid version()
X{
X  setgamestatus(SKIP_MONSTERS);
X  print3(VERSIONSTRING);
X  nprint3(":");
X  nprint3(" Last Edited: ");
X  nprint3(LAST_OMEGA_EDIT_DATE);
X}
X
Xvoid fire()
X{
X  int index,x1,y1,x2,y2;
X  pob obj;
X  struct monster *m;
X
X  clearmsg();
X
X  print1("Fire/Throw --");
X  index = getitem(NULL);
X  if (index == ABORT)
X    setgamestatus(SKIP_MONSTERS);
X  else if (index == CASHVALUE) print3("Can't fire money at something!");
X  else if (cursed(Player.possessions[index]) && 
X	   Player.possessions[index]->used)
X    print3("You can't seem to get rid of it!");
X  /* load a crossbow */
X  else if ((Player.possessions[O_WEAPON_HAND] != NULL) &&  
X	   (Player.possessions[O_WEAPON_HAND]->id == WEAPONID+27) && 
X	   (Player.possessions[O_WEAPON_HAND]->aux != LOADED) &&
X	   (Player.possessions[index]->id == WEAPONID+29)) {
X	     mprint("You crank back the crossbow and load a bolt.");
X	     Player.possessions[O_WEAPON_HAND]->aux = LOADED;
X	   }
X  else {
X    if (Player.possessions[index]->used) {
X      Player.possessions[index]->used = FALSE;
X      item_use(Player.possessions[index]);
X    }
X    obj = Player.possessions[index];
X    x1 = x2 = Player.x;
X    y1 = y2 = Player.y;
X    setspot(&x2,&y2);
X    if ((x2 == Player.x) && (y2 == Player.y)) 
X      mprint("You practice juggling for a moment or two.");
X    else {
X      do_object_los(obj->objchar,&x1,&y1,x2,y2);
X      if ((m=Level->site[x1][y1].creature) != NULL) {
X	if (obj->dmg == 0) {
X	  if (m->treasure > 0) { /* the monster can have treasure/objects */
X	    mprint("Your gift is caught!");
X	    givemonster(m,obj);
X	    conform_lost_objects(1,obj);
X	  }
X	  else {
X	    mprint("Your thrown offering is ignored.");
X	    p_drop_at(x1,y1,1,obj);
X	    conform_lost_objects(1,obj);
X	  }
X	}
X	else if (hitp(Player.hit,m->ac)) {/* ok already, hit the damn thing */
X	  weapon_use(2*statmod(Player.str),obj,m);
X	  dispose_lost_objects(1,obj);
X	}
X	else {
X	  mprint("You miss it.");
X	  p_drop_at(x1,y1,1,obj);
X	  conform_lost_objects(1,obj);
X	}
X      }
X      else {
X	p_drop_at(x1,y1,1,obj);
X	conform_lost_objects(1,obj);
X      }
X    }
X  }
X}
X
X
X
Xint quit()
X{
X  clearmsg();
X  mprint("Quit: Are you sure? [yn] ");
X  if (ynq()=='y') {
X    if (Player.rank[ADEPT] == 0) display_quit();
X    else display_bigwin();
X    endgraf();
X    exit(0);
X  }
X  else resetgamestatus(SKIP_MONSTERS);
X}
X
X
X
X/* rest in 10 second segments so if woken up by monster won't
Xdie automatically.... */
Xvoid nap()
X{
X  static int naptime;
X  if (gamestatusp(FAST_MOVE)) {
X    if (naptime-- < 1) {
X      clearmsg();
X      mprint("Yawn. You wake up.");
X      resetgamestatus(FAST_MOVE);
X      drawvision(Player.x,Player.y);
X    }
X  }
X  else {
X    clearmsg();
X    mprint("Rest for how long? (in minutes) ");
X    naptime = parsenum();
X    if (naptime > 600) {
X      print3("You can only sleep up to 10 hours (600 minutes)");
X      naptime = 3600;
X    }
X    else naptime *= 6;
X    if (naptime > 1) {
X      clearmsg();
X      setgamestatus(FAST_MOVE);
X      mprint("Resting.... ");
X    }
X  }
X}
X
X
Xvoid charid()
X{
X  char id;
X  int countryside=FALSE;
X  char cstr[80];
X
X  clearmsg();
X  mprint("Character to identify: ");
X  id = mgetc();
X  if (Current_Environment == E_COUNTRYSIDE) {
X    countryside = TRUE;
X    strcpy(cstr,countryid(id));
X    if (strcmp(cstr,"I have no idea.")==0)
X      countryside = FALSE;
X    else mprint(cstr);
X  }
X  if (! countryside) {
X    if (((id >= 'a') && (id <= 'z')) || ((id >= 'A') && (id <= 'Z'))) 
X      mprint("A monster or NPC -- examine (x) to find out exactly.");
X    else switch(id) {
X    case SPACE:
X      mprint(" : An airless void (if seen) or unknown region (if unseen)");
X      break;
X    case WALL:
X      mprint(" : An (impenetrable?) wall");
X      break;
X    case OPEN_DOOR:
X      mprint(" : An open door");
X      break;
X    case CLOSED_DOOR:
X      mprint(" : A closed (possibly locked) door");
X      break;
X    case LAVA:
X      mprint(" : A pool of lava");
X      break;
X    case HEDGE:
X      mprint(" : A dense hedge");
X      break;
X    case WATER:
X      mprint(" : A deep body of water");
X      break;
X    case FIRE:
X      mprint(" : A curtain of fire");
X      break;
X    case TRAP:
X      mprint(" : An uncovered trap");
X      break;
X    case UP:
X      mprint(" : A stairway leading up");
X      break;
X    case DOWN:
X      mprint(" : A stairway leading down");
X      break;
X    case FLOOR:
X      mprint(" : The dungeon floor");
X      break;
X    case PORTCULLIS:
X      mprint(" : A heavy steel portcullis");
X      break;
X    case ABYSS:
X      mprint(" : An entrance to the infinite abyss");
X      break;
X    case PLAYER:
X      mprint(" : You, the player");
X      break;
X    case CORPSE:
X      mprint(" : The remains of some creature");
X      break;
X    case THING:
X      mprint(" : Some random miscellaneous object");
X      break;
X    case SAFE:
X      mprint(" : A steel safe inset into the floor"); 
X      break;
X    case RUBBLE:
X      mprint(" : A dangerous-looking pile of rubble");
X      break;
X    case STATUE:
X      mprint(" : A statue");
X      break;
X    case ALTAR:
X      mprint(" : A (un?)holy altar");
X      break;
X    case CASH:
X      mprint(" : Bills, specie, gems: cash");
X      break;
X    case PILE:
X      mprint(" : A pile of objects");
X      break;
X    case FOOD:
X      mprint(" : Something edible");
X      break;
X    case WEAPON:
X      mprint(" : Some kind of weapon");
X      break;
X    case MISSILEWEAPON:
X      mprint(" : Some kind of missile weapon");
X      break;
X    case SCROLL:
X      mprint(" : Something readable");
X      break;
X    case POTION:
X      mprint(" : Something drinkable");
X      break;
X    case ARMOR:
X      mprint(" : A suit of armor");
X      break;
X    case SHIELD:
X      mprint(" : A shield");
X      break;
X    case CLOAK:
X      mprint(" : A cloak");
X      break;
X    case BOOTS:
X      mprint(" : A pair of boots");
X      break;
X    case STICK:
X      mprint(" : A stick");
X      break;
X    case RING:
X      mprint(" : A ring");
X      break;
X    case ARTIFACT:
X      mprint(" : An artifact");
X      break;
X    case CHAIR:
X      mprint(" : A chair");
X      break;
X    case WHIRLWIND:
X      mprint(" : A whirlwind");
X      break;
X    default:
X      mprint("That character is unused.");
X      break;
X    }
X  }
X}
X
X
Xvoid wizard()
X{
X  setgamestatus(SKIP_MONSTERS);
X  if (gamestatusp(CHEATED)) mprint("You're already in wizard mode!");
X  else {
X    clearmsg();
X    mprint("Really try to enter wizard mode? [yn] ");
X    if (ynq()=='y') {
X      if (strcmp(getlogin(),WIZARD)==0) {
X	setgamestatus(CHEATED);
X	mprint("Wizard mode set.");
X      }
X      else {
X	mprint("There is a shrieking sound, as of reality being distorted.");
X	strcpy(Str1,WIZARD);
X	strcat(Str1,", the Wizard of omega appears before you....");
X	mprint(Str1);
X	mprint("'Do not meddle in the affairs of Wizards --");
X	if (random_range(2)) mprint("it makes them soggy and hard to light.'");
X	else mprint("for they are subtle, and swift to anger!'");
X      }
X    }
X  }
X}
X
X/* Jump, that is */
Xvoid vault()
X{
X  int x=Player.x,y=Player.y,jumper=0;
X  
X  clearmsg();
X
X  if (Player.possessions[O_BOOTS] != NULL)
X    if (Player.possessions[O_BOOTS]->usef = I_BOOTS_JUMPING)
X      jumper = 2;
X  if (Player.status[IMMOBILE] > 0) {
X    resetgamestatus(FAST_MOVE);
X    print3("You are unable to move");
X  }
X  else {
X    setgamestatus(SKIP_MONSTERS);
X    mprint("Jump where?");
X    setspot(&x,&y);
X    if (! los_p(x,y,Player.x,Player.y))
X      print3("The way is obstructed.");
X    else if (Player.itemweight > Player.maxweight) 
X      print3("You are too burdened to jump anywhere.");
X    else if (distance(x,y,Player.x,Player.y) > 
X	     max(2,statmod(Player.agi)+2)+jumper)
X      print3("The jump is too far for you.");
X    else if (Level->site[x][y].creature != NULL)
X      print3("You can't jump on another creature.");
X    else if (! p_moveable(x,y))
X      print3("You can't jump there.");
X    else {
X      resetgamestatus(SKIP_MONSTERS);
X      Player.x = x;
X      Player.y = y;
X      if ((! jumper) && (random_range(30) > Player.agi)) {
X	mprint("Oops -- took a tumble.");
X	setgamestatus(SKIP_PLAYER);
X	p_damage((Player.itemweight/250),UNSTOPPABLE,"clumsiness");
X      }
X      p_movefunction(Level->site[Player.x][Player.y].p_locf);
X      if (Current_Environment != E_COUNTRYSIDE) 
X	if ((Level->site[Player.x][Player.y].things != NULL) &&
X	    (optionp(PICKUP)))
X	  pickup();
X    }
X  }
X}
X
X
X/* Sets sequence of combat maneuvers. */
Xvoid tacoptions()
X{
X  int actionsleft,done,place;
X  float times;
X
X  setgamestatus(SKIP_MONSTERS);
X
X  done = FALSE;
X  actionsleft = maneuvers();
X  menuclear();
X  place = 0;
X  menuprint("Enter a combat maneuvers sequence.\n");
X  menuprint("? for help, ! for default, RETURN to save sequence\n");
X  do {
X    clearmsg1();
X    mprint("Maneuvers Left:");
X    mnumprint(actionsleft);
X    switch(mgetc()) {
X    case '?':
X      combat_help();
X      break;
X    case 'a': case 'A':
X      if (actionsleft < 1) print3("No more maneuvers!");
X      else {
X	if (Player.possessions[O_WEAPON_HAND] == NULL) {
X	  Player.meleestr[place] = 'C';
X	  menuprint("\nPunch:");
X	}
X	else if (Player.possessions[O_WEAPON_HAND]->type == THRUSTING) {
X	  Player.meleestr[place] = 'T';
X	  menuprint("\nThrust:");
X	}
X	else if (Player.possessions[O_WEAPON_HAND]->type == STRIKING) {
X	  Player.meleestr[place] = 'C';
X	  menuprint("\nStrike:");
X	}
X	else {
X	  menuprint("\nCut:");
X	  Player.meleestr[place] = 'C';
X	}
X	place++;
X	Player.meleestr[place]=getlocation();
X	place++;
X	actionsleft--;
X      }
X      break;
X    case 'b': case 'B':
X      if (actionsleft<1) print3("No more maneuvers!");
X      else {
X	Player.meleestr[place] = 'B';
X	if (Player.possessions[O_WEAPON_HAND] == NULL)
X	  menuprint("\nDodge (from):");
X	else if (Player.possessions[O_WEAPON_HAND]->type == THRUSTING) 
X	  menuprint("\nParry:");
X	else menuprint("\nBlock:");
X	place++;
X	Player.meleestr[place]= getlocation();
X	place++;
X	actionsleft--;
X      }
X      break;
X    case 'l': case 'L':
X      if (actionsleft<2) print3("Not enough maneuvers to lunge!");
X      else {
X	if (Player.possessions[O_WEAPON_HAND] != NULL) {
X	  if (Player.possessions[O_WEAPON_HAND]->type != MISSILE) {
X	    Player.meleestr[place] = 'L';
X	    place++;
X	    Player.meleestr[place]=getlocation();
X	    place++;
X	    actionsleft -= 2;
X	    menuprint("\nLunge:");
X	  }
X	  else {
X	    print3("Can't lunge with a missile weapon!");
X	    morewait();
X	  }
X	}
X	else {
X	  print3("Can't lunge without a weapon!");
X	  morewait();
X	}
X      }
X      break;
X    case 'r': case 'R':
X      if (actionsleft<2) print3("Not enough maneuvers to riposte!");
X      else {
X	if (Player.possessions[O_WEAPON_HAND] != NULL) {
X	  if (Player.possessions[O_WEAPON_HAND]->type == THRUSTING) {
X	    Player.meleestr[place] = 'R';
X	    menuprint("\nRiposte ");
X	    Player.meleestr[place]=getlocation();
X	    actionsleft -= 2;
X	  }
X	  else {
X	    print3("Can't riposte without a thrusting weapon!");
X	    morewait();
X	  }
X	}
X	else {
X	  print3("Can't riposte without a thrusting weapon!");
X	  morewait();
X	}
X      }
X      break;
X    case BACKSPACE:
X    case DELETE:
X      place = 0;
X      actionsleft=maneuvers();
X      break;
X    case RETURN:
X    case LINEFEED:
X    case ESCAPE:
X      done = TRUE;
X      break;
X    }
X  } while (! done);
X  xredraw();
X  Player.meleestr[place] = 0;
X}
X
X
X
X
X/* Do the Artful Dodger trick */
Xvoid pickpocket()
X{
X  int dx,dy,index=0;
X  struct monster *m;
X
X  clearmsg();
X
X  mprint("Pickpocketing --");
X
X  index = getdir();
X
X  if (index == ABORT)
X    setgamestatus(SKIP_MONSTERS);
X  else {
X    dx = Dirs[0][index];
X    dy = Dirs[1][index];
X    
X    if ((! inbounds(Player.x+dx, Player.y+dy)) ||
X	(Level->site[Player.x+dx][Player.y+dy].creature == NULL)) {
X      print3("There's nothing there to steal from!!!");
X      setgamestatus(SKIP_MONSTERS);
X    }
X    else {
X      m = Level->site[Player.x+dx][Player.y+dy].creature;
X      if (m->id == ML0+3) {
X	mprint("Trying to steal from a guardsman, eh?");
X	mprint("Not a clever idea.");
X	if (Player.cash > 0) {
X	  mprint("As a punitive fine, the guard takes all your money.");
X	  Player.cash = 0;
X	  dataprint();
X	}
X	else {
X	  mprint("The guardsman places you under arrest.");
X	  morewait();
X	  send_to_jail();
X	}
X      }
X      else if (m->possessions == NULL) {
X	mprint("You couldn't find anything worth taking!");
X	mprint("But you managed to annoy it...");
X	m_status_set(m,HOSTILE);
X      }
X      else if (Player.dex*5+Player.rank[THIEVES]*20+random_range(100) >
X	       random_range(100)+m->level*20) {
X	mprint("You successfully complete your crime!");
X	mprint("You stole:");
X	mprint(itemid(m->possessions->thing));
X	Player.alignment--;
X	gain_experience(m->level*m->level);
X	gain_item(m->possessions->thing);
X	m->possessions = m->possessions->next;
X      }
X    }
X  }
X}
X
X
X
Xvoid rename_player()
X{
X  setgamestatus(SKIP_MONSTERS);
X  clearmsg();
X  mprint("Rename Character:");
X  strcpy(Player.name,msgscanstring());
X}
X
X
Xvoid abortshadowform()
X{
X  setgamestatus(SKIP_MONSTERS);
X  if (Player.status[SHADOWFORM] && (Player.status[SHADOWFORM]<1000)) {
X    mprint("You abort your spell of Shadow Form.");
X    Player.immunity[NORMAL_DAMAGE]--;
X    Player.immunity[ACID]--;
X    Player.immunity[THEFT]--;
X    Player.immunity[INFECTION]--;
X    mprint("You feel less shadowy now.");
X    Player.status[SHADOWFORM] = 0;
X  }
X}
X
Xvoid tunnel()
X{
X  int dir,ox,oy,aux;
X
X  clearmsg();
X  mprint("Tunnel -- ");
X  dir = getdir();
X  if (dir == ABORT)
X    setgamestatus(SKIP_MONSTERS);
X  else {
X    ox = Player.x + Dirs[0][dir];
X    oy = Player.y + Dirs[1][dir];
X    if (loc_statusp(ox,oy,SECRET))
X      mprint("You have no success as yet.");
X    else if (Level->site[ox][oy].locchar != WALL) {
X      print3("You can't tunnel through that!");
X      setgamestatus(SKIP_MONSTERS);
X    }
X    else {
X      aux = Level->site[ox][oy].aux;
X      if (random_range(20)==1){
X	if (Player.possessions[O_WEAPON_HAND] == NULL) {
X	  mprint("Ouch! broke a fingernail...");
X	  p_damage(Player.str / 6,UNSTOPPABLE,"A broken fingernail");
X	}
X	else if ((Player.possessions[O_WEAPON_HAND]->type == THRUSTING) ||
X		 ((Player.possessions[O_WEAPON_HAND]->type != STRIKING) &&
X		  (Player.possessions[O_WEAPON_HAND]->fragility < 
X		   random_range(20)))) {
X	  mprint("Clang! Uh oh...");
X	  damage_item(Player.possessions[O_WEAPON_HAND]);
X	}
X	else mprint("Your digging implement shows no sign of breaking.");
X      }
X      if (Player.possessions[O_WEAPON_HAND] == NULL) {
X	if ((aux > 0) && ((Player.str/3)+random_range(100) > aux)) {
X	  mprint("You carve a tunnel through the stone!");
X	  tunnelcheck();
X	  Level->site[ox][oy].locchar = RUBBLE;
X	  Level->site[ox][oy].p_locf = L_RUBBLE;
X	}
X	else mprint("No joy.");
X      }
X      else if (Player.possessions[O_WEAPON_HAND]->type == THRUSTING) {
X	if ((aux > 0) && 
X	    (Player.possessions[O_WEAPON_HAND]->dmg*2+random_range(100) > 
X	     aux)) {
X	  mprint("You carve a tunnel through the stone!");
X	  tunnelcheck();
X	  Level->site[ox][oy].locchar = RUBBLE;
X	  Level->site[ox][oy].p_locf = L_RUBBLE;
X	}
X	else mprint("No luck.");
X      }
X      else if ((aux > 0) && 
X	       (Player.possessions[O_WEAPON_HAND]->dmg+random_range(100) 
X		> aux)) {
X	mprint("You carve a tunnel through the stone!");
X	tunnelcheck();
X	Level->site[ox][oy].locchar = RUBBLE;
X	Level->site[ox][oy].p_locf = L_RUBBLE;
X      }
X      else mprint("You have no success as yet.");
X    }
X  }
X}
X
X
X
X
Xvoid hunt(terrain)
Xchar terrain;     
X{
X  int fertility=0;
X  switch(terrain) {
X  case SWAMP: 
X    mprint("You hesitate to hunt for food in the marshy wasteland.");
X    break;
X  case VOLCANO:
X  case CASTLE:
X  case TEMPLE:
X  case CAVES:
X  case STARPEAK:
X  case MAGIC_ISLE:
X  case DRAGONLAIR:
X    mprint("There is nothing alive here (or so it seems)");
X    break;
X  case VILLAGE:
X  case CITY:
X    mprint("You can find no food here; perhaps if you went inside....");
X    break;
X  case ROAD:
X    mprint("You feel it would be a better idea to hunt off the road.");
X    break;
X  case CHAOS_SEA:
X    mprint("Food in the Sea of Chaos? Go on!");
X    break;
X  case DESERT:
X    mprint("You wander off into the trackless desert in search of food...");
X    Time += 100;
X    hourly_check();  
X    fertility = 10;
X    break;
X  case JUNGLE:
X    mprint("You search the lush and verdant jungle for game....");
X    Time += 100;
X    hourly_check();
X    fertility = 80;
X    break;
X  case PLAINS:
X    mprint("You set off through the tall grass; the game is afoot.");
X    Time += 100;
X    hourly_check();
X    fertility = 50;
X    break;
X  case TUNDRA:
X    mprint("You blaze a trail through the frozen wasteland....");
X    Time += 100;
X    hourly_check();
X    fertility = 30;
X    break;
X  case FOREST:
X    mprint("You try to follow the many tracks through the forest loam....");
X    Time += 100;
X    hourly_check();
X    fertility = 70;
X    break;
X  case MOUNTAINS: case PASS:
X    mprint("You search the cliff walls looking for something to eat....");
X    Time += 100;
X    hourly_check();  
X    fertility = 30;
X    break;
X  case RIVER:
X    mprint("The halcyon river is your hopeful food source...");
X    Time += 100;
X    hourly_check();  
X    fertility = 80;
X    break;
X  }
X  if (((Date % 360 < 60) || (Date % 360 > 300)) && 
X      (terrain != DESERT) &&
X      (terrain != JUNGLE)) {
X    mprint("The cold weather impedes your hunt....");
X    fertility = fertility / 2;
X  }
X  if (fertility > random_range(100)) {
X    mprint("You have an encounter...");
X    change_environment(E_TACTICAL_MAP);
X  }
X  else mprint("Your hunt is fruitless.");
X}
X
Xvoid dismount_steed()
X{
X  pml ml;
X  if (! gamestatusp(MOUNTED))
X    print3("You're on foot already!");
X  else if (Current_Environment == E_COUNTRYSIDE) {
X    mprint("If you leave your steed here he will wander away!");
X    mprint("Do it anyway? [yn] ");
X    if (ynq()=='y') resetgamestatus(MOUNTED);
X  }
X  else {
X    resetgamestatus(MOUNTED);;
X    ml = ((pml) malloc(sizeof(mltype)));
X    ml->m = ((pmt) malloc(sizeof(montype)));
X    *(ml->m) = Monsters[HORSE];
X    ml->m->x = Player.x;
X    ml->m->y = Player.y;
X    ml->m->status = MOBILE+SWIMMING;
X    ml->next = Level->mlist;
X    Level->site[Player.x][Player.y].creature = ml->m;
X    Level->mlist = ml;
X  }
X  calc_melee();
X}
X
X
Xvoid city_move()
X{
X  int site,x=Player.x,y=Player.y,toggle=FALSE;
X  clearmsg();
X  if (Current_Environment != E_CITY) {
X    print3("This command only works in the city!");
X    setgamestatus(SKIP_MONSTERS);
X  }
X  else if (Player.status[IMMOBILE] > 0) 
X    print3("You can't even move!");
X  else if (hostilemonstersnear()) {
X    setgamestatus(SKIP_MONSTERS);
X    print3("You can't move this way with hostile monsters around!");
X  }
X  else if (Level->site[Player.x][Player.y].aux == NOCITYMOVE)
X    print3("You can't use the 'M' command from this location.");
X  else {
X    mprint("Move to which establishment [? for help, ESCAPE to quit] ");
X    site = parsecitysite();
X    if (site != ABORT) {
X      mprint("You're on your way...");
X      morewait();
X      while ((x != CitySiteList[site][1]) || (y != CitySiteList[site][2])) {
X	toggle = ! toggle;
X	if (toggle) {
X	  Time++;
X	  if (Time % 10 == 0) tenminute_check();
X	  else minute_status_check();
X	}
X	x += sign(CitySiteList[site][1] - x);
X	y += sign(CitySiteList[site][2] - y);
X	screencheck(y);
X	showcursor(x,y);
X      }
X      Player.x = x;
X      Player.y = y;
X      screencheck(Player.y);
X      mprint("Made it!");
X      morewait();
X      p_movefunction(Level->site[x][y].p_locf);
X    }
X  }
X}
X
X
X
Xvoid frobgamestatus()
X{
X  char response;
X  long num;
X  mprint("Set or Reset or Forget it [s,r,ESCAPE]:");
X  do response = mcigetc();
X  while ((response != 'r') && (response != 's') && (response != ESCAPE));
X  if (response != ESCAPE) {
X    mprint("Enter log2 of flag:");
X    num = parsenum();
X    if (num > -1) {
X      num = pow2(num);
X      if (response == 's') setgamestatus(num);
X      else resetgamestatus(num);
X      mprint("Done....");
X    }
X  }
X}
X      
END_OF_FILE
if test 27429 -ne `wc -c <'ocom3.c'`; then
    echo shar: \"'ocom3.c'\" unpacked with wrong size!
fi
# end of 'ocom3.c'
fi
if test -f 'oitem.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'oitem.c'\"
else
echo shar: Extracting \"'oitem.c'\" \(22667 characters\)
sed "s/^X//" >'oitem.c' <<'END_OF_FILE'
X/* omega copyright (C) 1987,1988 by Laurence Raphael Brothers */
X/* oitem.c */
X
X#include "oglob.h"
X
X/* make a random new object, returning pointer */
X/* may return NULL. */
Xpob create_object(itemlevel)
Xint itemlevel;
X{
X  pob new;
X  int  r; 
X  int ok = FALSE;
X
X  while (! ok) {
X    new = ((pob) malloc(sizeof(objtype)));
X    r= random_range(135);
X    if (r < 20) make_thing(new,-1);
X    else if (r < 40) make_food(new,-1);
X    else if (r < 50) make_scroll(new,-1);
X    else if (r < 60) make_potion(new,-1);
X    else if (r < 70) make_weapon(new,-1);
X    else if (r < 80) make_armor(new,-1);
X    else if (r < 90) make_shield(new,-1);
X    else if (r < 100) make_stick(new,-1);
X    else if (r < 110) make_boots(new,-1);
X    else if (r < 120) make_cloak(new,-1);
X    else if (r < 130) make_ring(new,-1);
X    else make_artifact(new,-1);
X    /* not ok if object is too good for level, or if unique and already made */
X    /* 1/100 chance of finding object if too good for level */
X    ok = ((new->uniqueness != UNIQUE_MADE) &&
X	  ((new->level < itemlevel+random_range(3))
X	   || (random_range(100)==23)));
X    if (!ok) free((char *) new);
X  }
X  if (new->uniqueness == UNIQUE_UNMADE) 
X    Objects[new->id].uniqueness=UNIQUE_MADE;
X  return(new);
X}
X
Xvoid make_cash(new,level)
Xpob new;
Xint level;
X{
X  *new = Objects[CASHID];
X  new->basevalue = random_range(level*level+10)+1; /* aux is AU value */
X  new->objstr = salloc(cashstr());
X  new->cursestr = new->truename = new->objstr;
X}
X
Xvoid make_food(new,id)
Xpob new;
Xint id;
X{
X  if (id == -1) id = random_range(NUMFOODS);
X  *new = Objects[FOODID+id];
X}
X
X
Xvoid make_corpse(new,m)
Xpob new;
Xstruct monster *m;
X{
X  *new = Objects[CORPSEID];
X  new->charge = m->id;
X  new->weight = m->corpseweight;
X  new->basevalue = m->corpsevalue;
X  new->known = 2;
X  new->objstr = salloc(m->corpsestr);
X  new->truename = new->cursestr = new->objstr;
X  if (m->monchar == '@')
X    new->usef = I_CANNIBAL;
X  else if (m_statusp(m,EDIBLE)) {
X    new->usef = I_FOOD;
X    new->aux = 6;
X  }
X  else if (m_statusp(m,POISONOUS))
X    new->usef = I_POISON_FOOD;
X  /* Special corpse-eating effects */
X  else switch(m->id) {
X  case ML1+1: /*tse tse fly */
X  case ML4+9: /*torpor beast */
X    new->usef = I_SLEEP_SELF;
X    break;
X  case ML2+5:
X    new->usef = I_INVISIBLE;
X    break;
X  case ML1+5: /* blipper */
X    new->usef = I_TELEPORT;
X    break;
X  case ML2+3: /* floating eye -- it's traditional.... */
X    new->usef = I_CLAIRVOYANCE;
X    break;
X  case ML4+11: /*astral fuzzy */
X    new->usef = I_DISPLACE;
X    break;
X  case ML4+12: /*s o law */
X    new->usef = I_CHAOS;
X    break;
X  case ML4+13: /*s o chaos */
X    new->usef = I_LAW;
X    break;
X  case ML5+9: /* astral vampire */
X    new->usef = I_ENCHANT;
X    break;
X  case ML5+11: /* manaburst */
X    new->usef = I_SPELLS;
X    break;
X  case ML6+9: /* rakshasa */
X    new->usef = I_TRUESIGHT;
X    break;
X  case ML7+0: /* behemoth */
X    new->usef = I_HEAL;
X    break;
X  case ML7+2: /* unicorn */
X    new->usef = I_NEUTRALIZE_POISON;
X    break;
X  case ML8+10: /*coma beast */
X    new->usef = I_ALERT;
X    break;
X  default:
X    new->usef = I_INEDIBLE; 
X    break;
X  }
X}
X
X
X
X
Xvoid make_ring(new,id)
Xpob new;
Xint id;
X{
X  if (id == -1) id = random_range(NUMRINGS);
X  *new = Objects[RINGID+id];
X  if (new->blessing == 0) new->blessing = itemblessing();
X  if (new->plus == 0) new->plus = itemplus()+1;
X  if (new->blessing < 0) new->plus = -1 - abs(new->plus);
X}
X
Xvoid make_thing(new,id)
Xpob new;
Xint id;
X{
X  if (id == -1) id = random_range(NUMTHINGS);
X  *new = Objects[THINGID+id];
X  if (strcmp(new->objstr,"grot") == 0) {
X    new->objstr = salloc(grotname());
X    new->truename = new->cursestr = new->objstr;
X  }
X}
X
X
Xvoid make_scroll(new,id)
Xpob new;
Xint id;
X{
X  if (id == -1) id = random_range(NUMSCROLLS);
X  *new = Objects[SCROLLID+id];
X  /* if a scroll of spells, aux is the spell id in Spells */
X  if (new->id == SCROLLID+1) {
X    new->aux = random_range(NUMSPELLS);
X  }
X}
X
Xvoid make_potion(new,id)
Xpob new;
Xint id;
X{
X  if (id == -1) id = random_range(NUMPOTIONS);
X  *new = Objects[POTIONID+id];
X  if (new->plus == 0) new->plus = itemplus();
X}
X
Xvoid make_weapon(new,id)
Xpob new;
Xint id;
X{
X  if (id == -1) id = random_range(NUMWEAPONS);
X  *new = Objects[WEAPONID+id];
X  if ((id == 28) || (id == 29)) /* bolt or arrow */
X    new->number = random_range(20)+1;
X  if (new->blessing == 0) new->blessing = itemblessing();
X  if (new->plus == 0) {
X    new->plus = itemplus();
X    if (new->blessing < 0)
X      new->plus = -1 - abs(new->plus);
X    else if (new->blessing > 0)
X      new->plus = 1 + abs(new->plus);
X  }
X}
X
Xvoid make_shield(new,id)
Xpob new;
Xint id;
X{
X  if (id == -1) id = random_range(NUMSHIELDS);
X  *new = Objects[SHIELDID+id];
X  if (new->plus == 0)
X    new->plus = itemplus();
X  if (new->blessing == 0) new->blessing = itemblessing();
X  if (new->blessing < 0)
X    new->plus = -1 - abs(new->plus);
X  else if (new->blessing > 0)
X    new->plus = 1 + abs(new->plus);
X}
X
Xvoid make_armor(new,id)
Xpob new;
Xint id;
X{
X  if (id == -1) id = random_range(NUMARMOR);
X  *new = Objects[ARMORID+id];
X  if (new->plus == 0) new->plus = itemplus();
X  if (new->blessing == 0) new->blessing = itemblessing();
X  if (new->blessing < 0)
X    new->plus = -1 - abs(new->plus);
X  else if (new->blessing > 0)
X    new->plus = 1 + abs(new->plus);  
X}
X
Xvoid make_cloak(new,id)
Xpob new;
Xint id;
X{
X  if (id == -1) id = random_range(NUMCLOAKS);
X  Objects[CLOAKID+4].plus = 2;
X  *new = Objects[CLOAKID+id];
X  if (new->blessing == 0) new->blessing = itemblessing();
X}
X
Xvoid make_boots(new,id)
Xpob new;
Xint id;
X{
X  if (id == -1) id = random_range(NUMBOOTS);
X  *new = Objects[BOOTID+id];
X  if (new->blessing == 0) new->blessing = itemblessing();
X}
X
Xvoid make_stick(new,id)
Xpob new;
Xint id;
X{
X  if (id == -1) id = random_range(NUMSTICKS);
X  *new = Objects[STICKID+id];
X  new->charge = itemcharge();
X  if (new->blessing == 0) new->blessing = itemblessing();
X}
X
Xvoid make_artifact(new,id)
Xpob new;
X{
X  if (id == -1) id = random_range(NUMARTIFACTS);
X  *new = Objects[ARTIFACTID+id];
X}
X
X
X
X
X/* item name functions */
X
Xchar *scrollname(reset,id)
Xint reset,id;
X
X{
X  static int ids[30];
X  int i,j,k;
X
X  if (reset) {
X    for(i=0;i<30;i++)
X      ids[i]=i;
X    for(i=0;i<500;i++) {
X      j = random_range(30);
X      k = ids[i % 30];
X      ids[i % 30]=ids[j];
X      ids[j]=k;
X    }
X  }
X  else {
X    switch(ids[id]) {
X      case 0: strcpy(Str4,"scroll-GRISTOGRUE"); break;
X      case 1: strcpy(Str4,"scroll-Kho Reck Tighp"); break;
X      case 2: strcpy(Str4,"scroll-E Z"); break;
X      case 3: strcpy(Str4,"scroll-Kevitz"); break;
X      case 4: strcpy(Str4,"scroll-Arcanum Prime"); break;
X      case 5: strcpy(Str4,"scroll-NYARLATHOTEP"); break;
X      case 6: strcpy(Str4,"scroll-Gilthoniel"); break;
X      case 7: strcpy(Str4,"scroll-Zarathustra"); break;
X      case 8: strcpy(Str4,"scroll-Ancient Lore"); break;
X      case 9: strcpy(Str4,"scroll-Eyes Only"); break;
X      case 10: strcpy(Str4,"scroll-Ambogar Empheltz"); break;
X      case 11: strcpy(Str4,"scroll-Isengard"); break;
X      case 12: strcpy(Str4,"scroll-Deosil Widdershins"); break;
X      case 13: strcpy(Str4,"scroll-Magister Paracelsus"); break;
X      case 14: strcpy(Str4,"scroll-Qlipphotic Summons"); break;
X      case 15: strcpy(Str4,"scroll-Aratron Samael"); break;
X      case 16: strcpy(Str4,"scroll-De Wormiis Mysterius"); break;
X      case 17: strcpy(Str4,"scroll-Necronomicon"); break;
X      case 18: strcpy(Str4,"scroll-Pnakotic Manuscript"); break;
X      case 19: strcpy(Str4,"scroll-Codex of Xalimar"); break;
X      case 20: strcpy(Str4,"scroll-The Mabinogion"); break;
X      case 21: strcpy(Str4,"scroll-Ginseng Shiatsu"); break;
X      case 22: strcpy(Str4,"scroll-Tome of Tromax"); break;
X      case 23: strcpy(Str4,"scroll-Book of the Dead "); break;
X      case 24: strcpy(Str4,"scroll-The Flame Tongue"); break;
X      case 25: strcpy(Str4,"scroll-Karst Khogar"); break;
X      case 26: strcpy(Str4,"scroll-The Yellow Sign"); break;
X      case 27: strcpy(Str4,"scroll-The Kevillist Manifesto"); break;
X      case 28: strcpy(Str4,"scroll-Goshtar Script"); break;
X      case 29: strcpy(Str4,"scroll-Pendragon Encryption"); break;
X      }
X  }
X  return(Str4);
X}
X
X
Xchar *grotname()
X{
X  switch(random_range(20)) {
X    case 0: strcpy(Str4,"pot lid"); break;
X    case 1: strcpy(Str4,"mound of offal"); break;
X    case 2: strcpy(Str4,"sword that was broken"); break;
X    case 3: strcpy(Str4,"salted snail"); break;
X    case 4: strcpy(Str4,"key"); break;
X    case 5: strcpy(Str4,"toadstool"); break;
X    case 6: strcpy(Str4,"greenish spindle"); break;
X    case 7: strcpy(Str4,"tin soldier"); break;
X    case 8: strcpy(Str4,"broken yo-yo"); break;
X    case 9: strcpy(Str4,"NYC subway map"); break;
X    case 10: strcpy(Str4,"Nixon's the One! button"); break;
X    case 11: strcpy(Str4,"beer can (empty)"); break;
X    case 12: strcpy(Str4,"golden bejewelled falcon"); break;
X    case 13: strcpy(Str4,"hamster cage"); break;
X    case 14: strcpy(Str4,"wooden nickel"); break;
X    case 15: strcpy(Str4,"three-dollar bill"); break;
X    case 16: strcpy(Str4,"rosebud"); break;
X    case 17: strcpy(Str4,"water pistol"); break;
X    case 18: strcpy(Str4,"shattered skull"); break;
X    case 19: strcpy(Str4,"jawbone of an ass"); break;
X  }
X  return(Str4);
X}
X
X
X
X
Xchar *potionname(reset,id)
Xint reset,id;
X{
X  static int ids[20];
X  int i,j,k;
X
X  if (reset) {
X    for(i=0;i<20;i++)
X      ids[i]=i;
X    for(i=0;i<500;i++) {
X      j = random_range(20);
X      k = ids[i % 20];
X      ids[i % 20]=ids[j];
X      ids[j]=k;
X    }
X  }
X  else {
X    switch (ids[id]) {
X      case 0: strcpy(Str4,"vial of dewy liquid"); break;
X      case 1: strcpy(Str4,"jug of tarry black substance"); break;
X      case 2: strcpy(Str4,"flask of cold smoking froth"); break;
X      case 3: strcpy(Str4,"phial of glowing fluid"); break;
X      case 4: strcpy(Str4,"bottle of sickening slime"); break;
X      case 5: strcpy(Str4,"sac of greenish gel"); break;
X      case 6: strcpy(Str4,"wineskin of odorous goo"); break;
X      case 7: strcpy(Str4,"canteen of sweet sap"); break;
X      case 8: strcpy(Str4,"urn of clear fluid"); break;
X      case 9: strcpy(Str4,"clotted grey ooze"); break;
X      case 10: strcpy(Str4,"keg of bubbly golden fluid"); break;
X      case 11: strcpy(Str4,"tube of minty paste"); break;
X      case 12: strcpy(Str4,"pitcher of aromatic liquid"); break;
X      case 13: strcpy(Str4,"pot of rancid grease"); break;
X      case 14: strcpy(Str4,"thermos of hot black liquid"); break;
X      case 15: strcpy(Str4,"magnum of deep red liquid"); break;
X      case 16: strcpy(Str4,"vase full of ichor"); break;
X      case 17: strcpy(Str4,"container of white cream"); break;
X      case 18: strcpy(Str4,"syringe of clear fluid"); break;
X      case 19: strcpy(Str4,"can of volatile essence"); break;
X      }      
X    return(Str4);
X  }
X}
X
X
Xchar *stickname(reset,id)
Xint reset,id;
X{
X  static int ids[20];
X  int i,j,k;
X
X  if (reset) {
X    for(i=0;i<20;i++)
X      ids[i]=i;
X    for(i=0;i<500;i++) {
X      j = random_range(20);
X      k = ids[i % 20];
X      ids[i % 20]=ids[j];
X      ids[j]=k;
X    }
X  }
X  else {
X    switch (ids[id]) {
X      case 0: strcpy(Str4,"oaken staff"); break;
X      case 1: strcpy(Str4,"heavy metal rod"); break;
X      case 2: strcpy(Str4,"shaft of congealed light"); break;
X      case 3: strcpy(Str4,"slender ceramic wand"); break;
X      case 4: strcpy(Str4,"rune-inscribed bone wand"); break;
X      case 5: strcpy(Str4,"knurly staff"); break;
X      case 6: strcpy(Str4,"steel knobbed rod");  break;
X      case 7: strcpy(Str4,"lucite wand"); break;
X      case 8: strcpy(Str4,"sturdy alpenstock"); break;
X      case 9: strcpy(Str4,"gem-studded ebony staff"); break;
X      case 10: strcpy(Str4,"chromed sequinned staff"); break;
X      case 11: strcpy(Str4,"old peeling stick"); break;
X      case 12: strcpy(Str4,"jointed metal rod"); break;
X      case 13: strcpy(Str4,"wand with lead ferrules"); break;
X      case 14: strcpy(Str4,"forked wooden stick"); break;
X      case 15: strcpy(Str4,"cane with gold eagle handle"); break;
X      case 16: strcpy(Str4,"crystalline wand");  break;
X      case 17: strcpy(Str4,"metal stick with trigger"); break;
X      case 18: strcpy(Str4,"leather-handled stone rod"); break;
X      case 19: strcpy(Str4,"tiny mithril wand"); break;
X      }      
X    return(Str4);
X  }
X}
X
Xchar *ringname(reset,id)
Xint reset,id;
X{
X  static int ids[20];
X  int i,j,k;
X
X  if (reset) {
X    for(i=0;i<20;i++)
X      ids[i]=i;
X    for(i=0;i<500;i++) {
X      j = random_range(20);
X      k = ids[i % 20];
X      ids[i % 20]=ids[j];
X      ids[j]=k;
X    }
X  }
X  else {
X    switch (ids[id]) {
X      case 0: strcpy(Str4,"gold ring with a blue gem"); break;
X      case 1: strcpy(Str4,"brass ring"); break;
X      case 2: strcpy(Str4,"mithril ring with a red gem"); break;
X      case 3: strcpy(Str4,"platinum ring");  break;
X      case 4: strcpy(Str4,"gold dragon's head ring"); break;
X      case 5: strcpy(Str4,"bronze ring"); break;
X      case 6: strcpy(Str4,"aardvark seal ring"); break;
X      case 7: strcpy(Str4,"grey metal ring"); break;
X      case 8: strcpy(Str4,"silver skull ring"); break;
X      case 9: strcpy(Str4,"onyx ring"); break;
X      case 10: strcpy(Str4,"Collegium Magii class ring"); break;
X      case 11: strcpy(Str4,"worn stone ring"); break;
X      case 12: strcpy(Str4,"diorite ring"); break;
X      case 13: strcpy(Str4,"ancient scarab ring");  break;
X      case 14: strcpy(Str4,"plastic charm ring"); break;
X      case 15: strcpy(Str4,"soapy gypsum ring"); break;
X      case 16: strcpy(Str4,"glass ring"); break;
X      case 17: strcpy(Str4,"glowing bluestone ring"); break;
X      case 18: strcpy(Str4,"ring with eye sigil"); break;
X      case 19: strcpy(Str4,"zirconium ring"); break;
X      }      
X    return(Str4);
X  }
X}
X
X
Xchar *cloakname(reset,id)
Xint reset,id;
X{
X  static int ids[20];
X  int i,j,k;
X
X  if (reset) {
X    for(i=0;i<20;i++)
X      ids[i]=i;
X    for(i=0;i<500;i++) {
X      j = random_range(20);
X      k = ids[i % 20];
X      ids[i % 20]=ids[j];
X      ids[j]=k;
X    }
X  }
X  else {
X    switch (ids[id]) {
X      case 0: strcpy(Str4,"tattered piece of cloth"); break;
X      case 1: strcpy(Str4,"fuligin cloak"); break;
X      case 2: strcpy(Str4,"chintz cloak"); break;
X      case 3: strcpy(Str4,"diaphanous cape");  break;
X      case 4: strcpy(Str4,"red half-cloak"); break;
X      case 5: strcpy(Str4,"mouse-hide cloak"); break;
X      case 6: strcpy(Str4,"kelly green cloak"); break;
X      case 7: strcpy(Str4,"cloth-of-gold cloak"); break;
X      case 8: strcpy(Str4,"dirty old cloak"); break;
X      case 9: strcpy(Str4,"weightless cloak"); break;
X      case 10: strcpy(Str4,"boat cloak"); break;
X      case 11: strcpy(Str4,"greasy tarpaulin"); break;
X      case 12: strcpy(Str4,"sable cloak"); break;
X      case 13: strcpy(Str4,"soft velvet cloak");  break;
X      case 14: strcpy(Str4,"opera cape"); break;
X      case 15: strcpy(Str4,"elegant brocade cloak"); break;
X      case 16: strcpy(Str4,"cloak of many colors"); break;
X      case 17: strcpy(Str4,"grey-green rag"); break;
X      case 18: strcpy(Str4,"puce and chartreuse cloak"); break;
X      case 19: strcpy(Str4,"smoky cloak"); break;
X      }      
X    return(Str4);
X  }
X}
X
Xchar *bootname(reset,id)
Xint reset,id;
X{
X  static int ids[20];
X  int i,j,k;
X
X  if (reset) {
X    for(i=0;i<20;i++)
X      ids[i]=i;
X    for(i=0;i<500;i++) {
X      j = random_range(20);
X      k = ids[i % 20];
X      ids[i % 20]=ids[j];
X      ids[j]=k;
X    }
X  }
X  else {
X    switch (ids[id]) {
X      case 0: strcpy(Str4,"sturdy leather boots"); break;
X      case 1: strcpy(Str4,"calf-length moccasins"); break;
X      case 2: strcpy(Str4,"dark-colored tabi"); break;
X      case 3: strcpy(Str4,"patent-leather shoes");  break;
X      case 4: strcpy(Str4,"beaten-up gumshoes"); break;
X      case 5: strcpy(Str4,"alligator-hide boots"); break;
X      case 6: strcpy(Str4,"comfortable sandals"); break;
X      case 7: strcpy(Str4,"roller skates"); break;
X      case 8: strcpy(Str4,"purple suede gaiters"); break;
X      case 9: strcpy(Str4,"mirror-plated wingtips"); break;
X      case 10: strcpy(Str4,"heavy workboots"); break;
X      case 11: strcpy(Str4,"polyurethane-soled sneakers"); break;
X      case 12: strcpy(Str4,"clodhoppers"); break;
X      case 13: strcpy(Str4,"wooden shoes");  break;
X      case 14: strcpy(Str4,"ski boots"); break;
X      case 15: strcpy(Str4,"hob-nailed boots"); break;
X      case 16: strcpy(Str4,"elven boots"); break;
X      case 17: strcpy(Str4,"cowboy boots"); break;
X      case 18: strcpy(Str4,"flipflop slippers"); break;
X      case 19: strcpy(Str4,"riding boots"); break;
X    }      
X    return(Str4);
X  }
X}
X
X
X
Xint itemplus()
X{
X  int p = 0;
X
X  while (random_range(2) == 0)
X    p++;
X  return(p);
X}
X
X
X
Xint itemcharge()
X{
X  return(random_range(20)+1);
X}
X
X
X
Xint itemblessing()
X{
X  switch(random_range(10)) {
X    case 0:
X    case 1:return(-1-random_range(10)); break;
X    case 8:
X    case 9:return(1+random_range(10)); break;
X    default: return(0);	   
X  }
X}
X
X    
Xint twohandedp(id)
Xint id;
X{
X  switch(id) {
X  case WEAPONID+5:
X  case WEAPONID+12:
X  case WEAPONID+18:
X  case WEAPONID+20:
X  case WEAPONID+26:
X  case WEAPONID+27:
X  case WEAPONID+32:
X  case WEAPONID+36:
X  case WEAPONID+38:
X  case WEAPONID+39:
X    return(TRUE); break;
X  default: return(FALSE); break;
X  }
X}
X
X
Xvoid item_use(o)
Xstruct object *o;
X{
X  clearmsg();
X  switch(o->usef) {
X    case -1:i_no_op(o); break;
X    case 0:i_nothing(o); break;
X
X    /* scrolls */	    
X    case I_SPELLS: i_spells(o); break;
X    case I_BLESS: i_bless(o); break;
X    case I_ACQUIRE: i_acquire(o); break;
X    case I_ENCHANT: i_enchant(o); break;
X    case I_TELEPORT: i_teleport(o); break;
X    case I_WISH: i_wish(o); break;
X    case I_CLAIRVOYANCE: i_clairvoyance(o); break;
X    case I_DISPLACE: i_displace(o); break;
X    case I_ID: i_id(o); break;
X    case I_JANE_T: i_jane_t(o); break;
X    case I_FLUX: i_flux(o); break;
X    case I_WARP: i_warp(o); break;
X    case I_ALERT: i_alert(o); break;
X    case I_CHARGE: i_charge(o); break;
X    case I_KNOWLEDGE: i_knowledge(o); break;
X    case I_LAW: i_law(o); break;
X    case I_HINT: hint(); break;
X    case I_HERO: i_hero(o); break;
X    case I_TRUESIGHT: i_truesight(o); break;
X    case I_ILLUMINATE: i_illuminate(o); break;
X    case I_DEFLECT: i_deflect(o); break;
X
X    /* potion functions */
X    case I_HEAL: i_heal(o); break;
X    case I_OBJDET: i_objdet(o); break;
X    case I_MONDET: i_mondet(o); break;
X    case I_SLEEP_SELF: i_sleep_self(o); break;
X    case I_NEUTRALIZE_POISON: i_neutralize_poison(o); break;
X    case I_RESTORE: i_restore(o); break;
X    case I_AZOTH: i_azoth(o); break;
X    case I_AUGMENT: i_augment(o); break;
X    case I_REGENERATE: i_regenerate(o); break;
X    case I_INVISIBLE: i_invisible(o); break;
X    case I_BREATHING: i_breathing(o); break;
X    case I_FEAR_RESIST: i_fear_resist(o); break;
X    case I_CHAOS: i_chaos(o); break;
X    case I_ACCURACY: i_accuracy(o); break;
X    case I_LEVITATION: i_levitate(o); break;
X    case I_CURE: i_cure(o); break;
X	    
X    /* stick functions */
X    case I_FIREBOLT: i_firebolt(o); break;
X    case I_LBOLT: i_lbolt(o); break;
X    case I_MISSILE: i_missile(o); break;
X    case I_SLEEP_OTHER: i_sleep_other(o); break;
X    case I_FIREBALL: i_fireball(o); break;
X    case I_LBALL: i_lball(o); break;    
X    case I_SNOWBALL: i_snowball(o); break;
X    case I_SUMMON: i_summon(o); break;
X    case I_HIDE: i_hide(o); break;
X    case I_DISRUPT: i_disrupt(o); break;
X    case I_DISINTEGRATE: i_disintegrate(o); break;
X    case I_APPORT: i_apport(o); break;
X    case I_DISPEL: i_dispel(o); break;
X    case I_POLYMORPH: i_polymorph(o); break;
X    case I_FEAR:i_fear(o); break;
X
X    /* food functions */
X    case I_FOOD: i_food(o); break;
X    case I_LEMBAS: i_lembas(o); break;
X    case I_STIM: i_stim(o); break;
X    case I_POW: i_pow(o); break;
X    case I_IMMUNE: i_immune(o); break;
X    case I_POISON_FOOD: i_poison_food(o); break;
X    case I_PEPPER_FOOD: i_pepper_food(o); break;
X    case I_CORPSE: i_corpse(o); break;
X
X    /* boots functions */
X    case I_PERM_SPEED: i_perm_speed(o); break;
X    case I_PERM_HERO: i_perm_hero(o); break;
X    case I_PERM_LEVITATE: i_perm_levitate(o); break;
X    case I_PERM_AGILITY: i_perm_agility(o); break;
X      
X    /* artifact functions */
X    case I_SCEPTRE:i_sceptre(o);break;
X    case I_PLANES:i_planes(o);break;
X    case I_STARGEM:i_stargem(o);break;
X    case I_SYMBOL:i_symbol(o); break;
X    case I_ORBMASTERY: i_orbmastery(o); break;
X    case I_ORBFIRE: i_orbfire(o); break;
X    case I_ORBWATER: i_orbwater(o); break;
X    case I_ORBEARTH: i_orbearth(o); break;
X    case I_ORBAIR: i_orbair(o); break;
X    case I_ORBDEAD: i_orbdead(o); break;
X    case I_CRYSTAL: i_crystal(o); break;
X    case I_LIFE: i_life(o); break;
X    case I_DEATH: i_death(o); break;
X    case I_ANTIOCH: i_antioch(o); break;
X    case I_HELM: i_helm(o); break;
X    case I_KOLWYNIA: i_kolwynia(o); break;
X    case I_ENCHANTMENT: i_enchantment(o); break;
X    case I_JUGGERNAUT: i_juggernaut(o); break;
X
X    /* cloak functions */
X    case I_PERM_DISPLACE: i_perm_displace(o); break;
X    case I_PERM_NEGIMMUNE: i_perm_negimmune(o); break;
X    case I_PERM_INVISIBLE: i_perm_invisible(o); break;
X    case I_PERM_PROTECTION: i_perm_protection(o);break;
X    case I_PERM_ACCURACY: i_perm_accuracy(o);break;
X    case I_PERM_TRUESIGHT: i_perm_truesight(o); break;
X
X    /* ring functions */
X    case I_PERM_BURDEN: i_perm_burden(o); break;
X    case I_PERM_STRENGTH: i_perm_strength(o); break;
X    case I_PERM_GAZE_IMMUNE: i_perm_gaze_immune(o); break;
X    case I_PERM_FIRE_RESIST: i_perm_fire_resist(o); break;
X    case I_PERM_POISON_RESIST: i_perm_poison_resist(o); break;
X    case I_PERM_REGENERATE: i_perm_regenerate(o); break;
X    case I_PERM_KNOWLEDGE: i_perm_knowledge(o); break;
X
X    /* armor functions */
X    case I_NORMAL_ARMOR: i_normal_armor(o); break;
X    case I_PERM_FEAR_RESIST: i_perm_fear_resist(o); break;
X    case I_PERM_ENERGY_RESIST: i_perm_energy_resist(o); break;
X    case I_PERM_BREATHING: i_perm_breathing(o); break;
X
X    /* weapons functions */
X    case I_NORMAL_WEAPON: i_normal_weapon(o); break;
X    case I_LIGHTSABRE: i_lightsabre(o); break;
X    case I_DEMONBLADE: i_demonblade(o); break;
X    case I_DESECRATE: i_desecrate(o); break;
X    case I_MACE_DISRUPT: i_mace_disrupt(o); break;
X    case I_DEFEND: i_defend(o); break;
X    case I_VICTRIX: i_victrix(o); break;
X
X    /* thing functions */	    
X    case I_PICK: i_pick(o); break;
X    case I_KEY: i_key(o); break;
X    case I_PERM_ILLUMINATE: i_perm_illuminate(o); break;
X    case I_TRAP: i_trap(o); break;
X    case I_RAISE_PORTCULLIS:i_raise_portcullis(o); break;
X
X    /* shield functions */
X    case I_NORMAL_SHIELD: i_normal_shield(o); break;
X    case I_PERM_DEFLECT: i_perm_deflect(o); break;
X  }
X}
X
END_OF_FILE
if test 22667 -ne `wc -c <'oitem.c'`; then
    echo shar: \"'oitem.c'\" unpacked with wrong size!
fi
# end of 'oitem.c'
fi
echo shar: End of archive 8 \(of 19\).
cp /dev/null ark8isdone
MISSING=""
for I in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 ; do
    if test ! -f ark${I}isdone ; then
	MISSING="${MISSING} ${I}"
    fi
done
if test "${MISSING}" = "" ; then
    echo You have unpacked all 19 archives.
    rm -f ark[1-9]isdone ark[1-9][0-9]isdone
else
    echo You still need to unpack the following archives:
    echo "        " ${MISSING}
fi
##  End of shell archive.
exit 0