[comp.sources.games] v05i025: 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 25
Archive-name: omega2/Part15



#! /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 15 (of 19)."
# Contents:  ochar.c ocom1.c oetc.c ohelp11.txt opriest.c
# Wrapped by billr@saab on Wed Jul 13 10:46:57 1988
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f 'ochar.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'ochar.c'\"
else
echo shar: Extracting \"'ochar.c'\" \(13387 characters\)
sed "s/^X//" >'ochar.c' <<'END_OF_FILE'
X/* omega copyright (C) by Laurence Raphael Brothers, 1987,1988 */
X/* ochar.c */
X/* Player generation */
X
X#include "oglob.h"
X
X
X/* set player to begin with */
Xvoid initplayer()
X{
X   int i;
X   int oldchar=FALSE;
X   FILE *fd;
X
X   strcpy(Player.name,getlogin());
X   Player.itemweight = 0;
X   Player.food = 36; 
X   Player.packptr = 0;
X   Player.options = 0;
X   for (i=0;i<MAXITEMS;i++)
X     Player.possessions[i] = NULL;
X   for (i=0;i<MAXPACK;i++)
X     Player.pack[i] = NULL;
X   for (i=0;i<NUMIMMUNITIES;i++) Player.immunity[i] = 0;
X   for (i=0;i<NUMSTATI;i++) Player.status[i] = 0;
X   for (i=0;i<NUMRANKS;i++) {
X     Player.rank[i] = 0;
X     Player.guildxp[i] = 0;
X   }
X   Player.alignment = 0;
X   Player.cash = 250;
X   if ((fd=omegarc_check())!=NULL) {
X     fread((char *)&i,sizeof(int),1,fd);
X     if (i != VERSION) {
X       print1("Out of date .omegarc! Make another!");
X       morewait();
X     }
X     else {
X       oldchar = TRUE;
X       fread((char *)&Player,sizeof(Player),1,fd);
X       fread((char *)&Searchnum,sizeof(int),1,fd);
X       fread((char *)&Verbosity,sizeof(char),1,fd);
X       strcpy(Player.name,getlogin());
X     }
X     fclose(fd);
X   }
X   if (! oldchar) {
X     initstats();
X     optionset(RUNSTOP);
X     optionset(CONFIRM);
X   }
X   Searchnum = max(1,min(9,Searchnum));
X   Player.hp = Player.maxhp = Player.maxcon;
X   calc_melee();
X   Player.mana = Player.maxmana = calcmana();
X   Player.click = 1;
X   strcpy(Player.meleestr,"CCBC");
X   dataprint();
X }
X
X
XFILE *omegarc_check()
X{
X  FILE *fd;
X  strcpy(Str3,".omegarc");
X  if ((fd = fopen(Str3,"r")) != NULL) {
X    print2("Use .omegarc in wd? [yn] ");
X    if (ynq2()!='y') fd = NULL;
X  }
X  clearmsg();
X  return(fd);
X}
X
Xvoid initstats()
X{
X  char response;
X  print1("Do you want to run a character [c] or play yourself [p]?");
X  do response = mcigetc(); while ((response!='c')&&(response != 'p'));
X  if (response == 'c') omegan_character_stats();
X  else {
X    user_character_stats();
X    user_intro();
X    print1("Do you want to save this set-up to .omegarc in this wd? [yn] ");
X    if (ynq1()=='y')
X      save_omegarc();
X  }
X  xredraw();
X}
X
Xvoid save_omegarc()
X{
X  FILE *fd = fopen(".omegarc","w");
X  int i=VERSION;
X  if (fd == NULL)
X    print1("Sorry, couldn't save .omegarc for some reason.");
X  else {
X    fwrite((char *)&i,sizeof(int),1,fd);
X    print1("First, set options.");
X    setoptions();
X    fwrite((char *)&Player,sizeof(Player),1,fd);
X    fwrite((char *)&Searchnum,sizeof(int),1,fd);
X    fwrite((char *)&Verbosity,sizeof(char),1,fd);
X    fclose(fd);
X  }
X}
X
X
X
Xint calcmana()
X{
X  return(Player.pow * (Player.level+1));
X}
X
X
X/*  npcbehavior digits 1234
X
X4 : alignment (LAWFUL,CHAOTIC, or NEUTRAL)
X3 : primary combat action (melee,missile,spell,thief,flight,1..5)
X2 : competence at 4 (0..9, 0 = incompetent, 9 = masterful)
X1 : conversation mode
X
Xstatus : 1 = dead, 2 = saved, 3 = retired
X*/
Xint fixnpc(status)
Xint status;
X{
X  int npcbehavior=0;
X  char response;
X  if (status == 1) { /* player is dead, all undead are chaotic */
X    npcbehavior+=CHAOTIC;
X    npcbehavior+=10; /* melee */
X    npcbehavior+=100*min(9,((int) (Player.level/3)));
X    npcbehavior+=3000; /* evil */
X  }
X  else {
X    clearmsg();
X    print1("NPC Behavior Determination Module");
X    menuclear();
X    menuprint("Your overall NPC behavior is:");
X    if (Player.alignment < -10) {
X      npcbehavior += CHAOTIC;
X      menuprint("\n\n CHAOTIC");
X    }
X    else if (Player.alignment > 10) {
X      npcbehavior += LAWFUL;
X      menuprint("\n\n LAWFUL");
X    }
X    else {
X      npcbehavior += NEUTRAL;
X      menuprint("\n\n NEUTRAL");
X    }
X    menuprint("\n\n1: hand-to-hand combat");
X    menuprint("\n2: missile combat");
X    menuprint("\n3: spellcasting");
X    menuprint("\n4: thieving");
X    menuprint("\n5: escape");
X    menuprint("\n\nEnter NPC response to combat: ");
X    response = '0';
X    while ((response != '1') && 
X	   (response != '2') &&
X	   (response != '3') &&
X	   (response != '4') &&
X	   (response != '5'))
X      response = menugetc();
X    menuaddch(response);
X    npcbehavior+=10*(response - '0');
X    npcbehavior+=100*competence_check(response-'0');
X    response = '0';
X    menuclear();
X    menuprint("1: threaten");
X    menuprint("\n2: greet");
X    menuprint("\n3: aid");
X    menuprint("\n4: beg");
X    menuprint("\n5: silence");
X    menuprint("\n\nEnter NPC response to conversation: ");
X    while ((response != '1') && 
X	   (response != '2') &&
X	   (response != '3') &&
X	   (response != '4') &&
X	   (response != '5'))
X      response = menugetc();
X    menuaddch(response);
X    npcbehavior+=1000*(response - '0');
X    xredraw();
X  }
X    return(npcbehavior);
X}
X
X
X/* estimates on a 0..9 scale how good a player is at something */
Xint competence_check(attack)
Xint attack;  
X{
X  int ability = 0;
X  switch(attack) {
X  case 1: /* melee */
X    ability += statmod(Player.str);
X  case 2: /* missle */
X    ability += statmod(Player.dex);
X    ability += Player.rank[LEGION];
X    ability += ((int) (Player.dmg / 10) - 1);
X    break;
X  case 3: /* spellcasting */
X    ability += statmod(Player.iq);
X    ability += statmod(Player.pow);
X    ability += Player.rank[CIRCLE];
X    ability += Player.rank[COLLEGE];
X    ability += Player.rank[PRIEST];
X    break;
X  case 4: /* thieving */
X    ability += statmod(Player.dex);
X    ability += statmod(Player.agi);
X    ability += Player.rank[THIEVES];
X    break;
X  case 5: /* escape */
X    ability += 2 * statmod(Player.agi);
X    break;
X  }
X  ability += ((int) (Player.level / 5));
X  if (ability < 0) ability = 0;
X  if (ability > 9) ability = 9;
X  return(ability);
X}
X
Xvoid user_character_stats()
X{
X  int num,iqpts=0,numints=0,ok,agipts=0,dexpts=0,powpts=0,conpts=0;
X  print1("OK, now try to answer honestly the following questions:");
X  morewait();
X  print1("How many pounds can you bench press? ");
X  num = parsenum();
X  if (num < 30) Player.str = Player.maxstr = 3;
X  else if (num < 90) Player.str = Player.maxstr = num/10;
X  else Player.str = Player.maxstr = 9+((num-120)/30);
X  if (Player.str > 18) {
X    print2("Even if it's true, I don't believe it.");
X    morewait();
X    clearmsg();
X    Player.str = Player.maxstr = 18;
X  }
X  
X  print1("Took an official IQ test? [yn] ");
X  if (ynq1()=='y') {
X    print1("So, whadja get? ");
X    num = parsenum()/10;
X    if (num > 18) {
X      print2("Even if it's true, I don't believe it.");
X      morewait();
X      clearmsg();
X      num = 18;
X    }
X    iqpts+=num;
X    numints++;
X  }
X
X  print1("Took Undergraduate entrance exams? [yn] ");
X  if (ynq1()=='y') {
X    do {
X      print1("So, what percentile? ");
X      num = parsenum();
X      ok = (num < 100);
X      if (! ok) {
X	print2("That's impossible!");
X	morewait();
X	clearmsg();
X      }
X    } while (! ok);
X    iqpts += (int) ((((num - 49)/50.0)*9)+9);
X    numints++;
X  }
X  print1("Took Graduate entrance exams? [yn] ");
X  if (ynq1()=='y') {
X    do {
X      print1("So, what percentile? ");
X      num = parsenum();
X      ok = (num < 100);
X      if (! ok) {
X	print2("That's impossible!");
X	morewait();
X	clearmsg();
X      }
X    } while (! ok);
X    iqpts += (int) ((((num - 49)/50.0)*9)+9);
X    numints++;
X  }
X
X  if (numints == 0) {
X    print1("Pretty dumb, aren't you? [yn] ");
X    if (ynq1()=='y') {
X      Player.iq = random_range(3)+3;      
X      print2("I thought so....");
X    }
X    else {
X      Player.iq = random_range(6)+8;
X      print2("Well, not *that* dumb.");
X    }
X    morewait();
X    clearmsg();
X  }
X  else Player.iq = iqpts/numints;
X  Player.maxiq = Player.iq;
X  agipts = 0;
X  print1("Can you dance? [yn] ");
X  if (ynq1()=='y') {
X    agipts++;
X    nprint1(" Well? [yn] ");
X    if (ynq1()=='y') agipts+=2;
X  }
X  print1("Do you have training in a martial art or gymnastics? [yn] ");
X  if (ynq1()=='y') {
X    agipts+=2;
X    print2("Do you have dan rank or equivalent? [yn] ");
X    if (ynq2()=='y') agipts+=4;
X  }
X  clearmsg();
X  print1("Do you play some field sport? [yn] ");
X  if (ynq1()=='y') {
X    agipts++;
X    nprint1(" Are you good? [yn] ");
X    if (ynq1()=='y') agipts++;
X  }
X  print1("Do you cave, mountaineer, etc.? [yn] ");
X  if (ynq1()=='y')
X    agipts+=3;
X  print1("Do you skate or ski? [yn] ");
X  if (ynq1()=='y') {
X    agipts+=2;
X    nprint1(" Well? [yn] ");
X    if (ynq1()=='y') agipts+=2;
X  }
X  print1("Are you physically handicapped? [yn] ");
X  if (ynq1()=='y')
X    agipts-=4;
X  print1("Are you accident prone? [yn] ");
X  if (ynq1()=='y')
X    agipts-=4;
X  print1("Can you use a bicycle? [yn] ");
X  if (ynq1()!='y')
X    agipts-=4;
X  Player.agi = Player.maxagi = 9 + agipts/2;
X  print1("Do you play video games? [yn] ");
X  if (ynq1()=='y') {
X    dexpts+=2;
X    print2("Do you get high scores? [yn] ");
X    if (ynq2()=='y') dexpts+=4;
X  }
X  clearmsg();
X  print1("Are you an archer, fencer, or marksman? [yn] ");
X  if (ynq1()=='y') {
X    dexpts+=2;
X    print2("A good one? [yn] ");
X    if (ynq2()=='y') dexpts+=4;
X  }
X  clearmsg();
X  print1("Have you ever picked a lock? [yn] ");
X  if (ynq1()=='y') {
X    dexpts+=2;
X    print2("Really. Well, the police are being notified.");
X  }
X  morewait();
X  clearmsg();
X  print1("What's your typing speed (words per minute) ");
X  num = parsenum();
X  if (num > 125) {
X    print2("Tell me another one....");
X    morewait();
X    clearmsg();
X    num = 125;
X  }
X  dexpts += num/25;
X  print1("Hold your arm out. Tense your fist. Hand shaking? [yn] ");
X  if (ynq1()=='y')
X    dexpts-=3;
X  print1("Ambidextrous, are you? [yn] ");
X  if (ynq1()=='y')
X    dexpts+=4;
X  print1("Can you cut a deck of cards with one hand? [yn] ");
X  if (ynq1()=='y')
X    dexpts+=2;
X  print1("Can you tie your shoes blindfolded? [yn] ");
X  if (ynq1()!='y')
X    dexpts-=3;
X  Player.dex = Player.maxdex = 6 + dexpts/2;
X  print1("Do you ever get colds? [yn] ");
X  if (ynq1()!='y') 
X    conpts+=4;
X  else {
X    nprint1(" Frequently? [yn] ");
X    if (ynq1() == 'y') conpts -=4;
X  }
X  print1("Had any serious accident or illness this year? [yn] ");
X  if (ynq1()=='y') conpts -=4;
X  else conpts +=4;
X  print1("Have a chronic disease? [yn] ");
X  if (ynq1() =='y') conpts -=4;
X  print1("Overweight or underweight by more than 20 percent? [yn] ");
X  if (ynq1() =='y') conpts -=2;
X  print1("High Blood Pressure? [yn] ");
X  if (ynq1() =='y') conpts -=2;
X  print1("Smoke? [yn] ");
X  if (ynq1() =='y') conpts -=3;
X  print1("Take aerobics classes? [yn] ");
X  if (ynq1() =='y') conpts +=2;
X  print1("How many miles can you run? ");
X  num = parsenum();
X  if (num > 25) {
X    print2("Right. Sure. Give me a break.");
X    morewait();
X    clearmsg();
X    conpts += 8;
X  }
X  else if (num < 1) conpts -= 3;
X  else if (num < 5) conpts += 2;
X  else if (num < 10) conpts += 4;
X  else conpts += 8;
X  Player.con = Player.maxcon = 12 + conpts/3;
X  print1("Do animals react oddly to your presence? [yn] ");
X  if (ynq1()=='y') {
X    print2("How curious that must be.");
X    morewait();
X    clearmsg();
X    powpts += 2;
X  }
X  print1("Can you see auras? [yn] ");
X  if (ynq1()=='y') {
X    nprint1(" How strange.");
X    morewait();
X    powpts += 3;
X  }
X  print1("Ever have an out-of-body experience? [yn] ");
X  if (ynq1()=='y') {
X    print2("Wow, man. Fly the friendly skies....");
X    morewait();
X    clearmsg();
X    powpts += 3;
X  }
X  print1("Did you ever cast a spell? [yn] ");
X  if (ynq1()=='y') {
X    powpts += 3;
X    nprint1(" Did it work? [yn] ");
X    if (ynq1()=='y') {
X      powpts+=7;
X      print2("Sure it did.");
X      morewait();
X      clearmsg();
X    }
X  }
X  print1("Do you have ESP? [yn] ");
X  if (ynq1()=='y') {
X    powpts += 3;
X    print2("Yeah, tell me more.");
X    morewait();
X    clearmsg();
X  }
X  print1("Do you have PK? [yn] ");
X  if (ynq1()=='y') {
X    powpts+= 6;
X    print2("I can't tell you how much that moves me.");
X    morewait();
X    clearmsg();
X  }
X  print1("Do you believe in ghosts? [yn] ");
X  if (ynq1()=='y') {
X    powpts+=2;
X    print2("I do! I do! I do believe in ghosts!");
X    morewait();
X    clearmsg();
X  }
X  print1("Are you Irish? [yn] ");
X  if (ynq1()=='y') {
X    powpts+=2;
X    nprint1(" Is that blarney or what?");
X    morewait();
X  }
X  Player.pow = Player.maxpow = 3 + powpts/2;
X  print1("What is your sexual preference? [mf] ");
X  do Player.preference = mcigetc();
X  while ((Player.preference != 'm') && (Player.preference != 'f'));
X}
X
X
X
Xvoid omegan_character_stats()
X{
X  int share1,share2,i=0;
X  print1("To reroll hit ESCAPE; hit any other key to accept these stats.");
X  print2("You have only 10 chances to reroll....");
X  do {
X    i++;
X    Player.iq = Player.maxiq = 4 + random_range(5)+
X      (share1 = random_range(6)) + (share2 = random_range(6));
X    Player.pow = Player.maxpow = 4 + random_range(5) + share1 +share2;
X    Player.dex = Player.maxdex = 4 + random_range(5)+
X      (share1 = random_range(6)) + (share2 = random_range(6));
X    Player.agi = Player.maxagi = 4 + random_range(5) + share1 +share2;
X    Player.str = Player.maxstr = 4 + random_range(5)+
X      (share1 = random_range(6)) + (share2 = random_range(6));
X    Player.con = Player.maxcon = 4 + random_range(5) + share1 +share2;
X    Player.cash = random_range(100)+random_range(100)+
X      random_range(100)+random_range(100)+random_range(100);
X    calc_melee();
X    dataprint();
X  } while ((i < 11) && (mgetc() == ESCAPE));
X  clearmsg();
X  print1("Please enter your character's name: ");
X  strcpy(Player.name,msgscanstring());
X  print1("What is your character's sexual preference? [mf] ");
X  do Player.preference = mcigetc();
X  while ((Player.preference != 'm') && (Player.preference != 'f'));
X
X}
X
END_OF_FILE
if test 13387 -ne `wc -c <'ochar.c'`; then
    echo shar: \"'ochar.c'\" unpacked with wrong size!
fi
# end of 'ochar.c'
fi
if test -f 'ocom1.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'ocom1.c'\"
else
echo shar: Extracting \"'ocom1.c'\" \(9308 characters\)
sed "s/^X//" >'ocom1.c' <<'END_OF_FILE'
X/* omega copyright (C) by Laurence Raphael Brothers, 1987,1988 */
X/* ocom1.c */
X
X/* This file has the two toplevel command scanners, p_process,
Xwhich works everywhere but the countryside, and p_couyntry_process,
Xwhich works.... */
X
X#include "oglob.h"
X
X
X/* deal with a new player command in dungeon or city mode*/
Xvoid p_process()
X{
X  static int searchval=0;
X
X  if (Player.status[BERSERK]) 
X    if (goberserk()) {
X    setgamestatus(SKIP_PLAYER);
X    drawvision();
X  }
X  if (! gamestatusp(SKIP_PLAYER)) {
X    if (searchval > 0) {
X      searchval--;
X      if (searchval == 0) resetgamestatus(FAST_MOVE);
X    }
X    drawvision(Player.x,Player.y);
X    if (! gamestatusp(FAST_MOVE)) {
X      searchval = 0;
X      Cmd = mgetc();
X      clear_if_necessary();
X    }
X    Command_Duration = 0;
X    switch (Cmd) {
X    case ' ': 
X    case 13: setgamestatus(SKIP_MONSTERS); break; /*no op on space or return*/
X    case 6: abortshadowform(); break; /* ^f */
X    case 7: wizard(); break; /* ^g */
X    case 9: display_pack(); morewait(); xredraw(); break; /* ^i */
X    case 11: if (gamestatusp(CHEATED)) frobgamestatus();
X    case 12: xredraw(); setgamestatus(SKIP_MONSTERS); break; /* ^l */
X    case 16: bufferprint(); setgamestatus(SKIP_MONSTERS); break; /* ^p */ 
X    case 18: redraw();  setgamestatus(SKIP_MONSTERS); break; /* ^r */
X    case 23: if (gamestatusp(CHEATED)) drawscreen();  break; /* ^w */
X    case 24: /* ^x */ 
X      if (gamestatusp(CHEATED) || 
X	  Player.rank[ADEPT]) 
X	wish(1);
X      Command_Duration = 5;
X      break;
X    case 'a': zapwand();
X      Command_Duration =((int) 8.0*Player.speed/5.0); 
X      break;
X    case 'c': closedoor();  
X      Command_Duration =((int) 2.0*Player.speed/5.0); 
X      break;
X    case 'd': drop();
X      Command_Duration =((int) 5.0*Player.speed/5.0); 
X      break;
X    case 'e': eat();
X      Command_Duration = 30;
X      break;
X    case 'f': fire();
X      Command_Duration =((int) 5.0*Player.speed/5.0); 
X      break;
X    case 'g': pickup();
X      Command_Duration =((int) 10.0*Player.speed/5.0); 
X      break;
X    case 'i': 
X      if (optionp(TOPINV)) top_inventory_control();
X      else {
X	menuclear();
X	display_possessions();
X	inventory_control();
X      }
X      break;
X    case 'm': magic();
X      Command_Duration = 12;
X      break;
X    case 'o': opendoor();
X      Command_Duration =((int) 5.0*Player.speed/5.0); 
X      break;
X    case 'p': pickpocket();
X      Command_Duration =((int) 20.0*Player.speed/5.0); 
X      break;
X    case 'q': quaff();
X      Command_Duration = 10;
X      break;
X    case 'r': peruse();
X      Command_Duration = 20;
X      break;
X    case 's': search(&searchval);
X      Command_Duration = 20;
X      break;
X    case 't': talk();
X      Command_Duration = 10;
X      break;
X    case 'v': vault();
X      Command_Duration =((int) 10.0*Player.speed/5.0); 
X      break;
X    case 'x': examine();
X      Command_Duration = 1;
X      break;
X    case 'z': bash_location();
X      Command_Duration =((int) 10.0*Player.speed/5.0); 
X      break;
X    case 'A': activate();
X      Command_Duration = 10;
X      break;
X    case 'C': callitem();
X      break;
X    case 'D': disarm();
X      Command_Duration = 30;
X      break;
X    case 'E': dismount_steed();
X      Command_Duration =((int) 10.0*Player.speed/5.0); 
X      break;
X    case 'F': tacoptions();
X      break;
X    case 'G': give();
X      Command_Duration = 10;
X      break;
X    case 'I':
X      if (! optionp(TOPINV)) top_inventory_control();
X      else {
X	menuclear();
X	display_possessions();
X	inventory_control();
X      }
X      break;
X    case 'M': city_move();
X      Command_Duration = 10;
X      break;
X    case 'O': setoptions();
X      break;
X    case 'P': show_license();
X      break; /* actually show_license is in ofile */
X    case 'Q': quit(); 
X      break;
X    case 'R': rename_player();
X      break;
X    case 'S': save(TRUE); 
X      break;
X    case 'T': tunnel(); 
X      Command_Duration = ((int) 30.0*Player.speed/5.0); 
X      break;
X    case 'V': version(); 
X      break;
X    case 'Z': bash_item();
X      Command_Duration =((int) 10.0*Player.speed/5.0); 
X      break;
X    case '.': rest();
X      Command_Duration = 10;
X      break;
X    case ',': 
X      Command_Duration = 10;
X      nap();
X      break;
X    case '>': 
X      downstairs();
X      break;
X    case '<':
X      upstairs();
X      break;
X    case '@': 
X      p_movefunction(Level->site[Player.x][Player.y].p_locf);
X      Command_Duration = 5; 
X      break;
X    case '/': charid(); setgamestatus(SKIP_MONSTERS);
X      break;
X    case '?': help(); setgamestatus(SKIP_MONSTERS);
X      break;
X    case '4':	       
X    case 'h': moveplayer(-1,0);
X      Command_Duration =((int) 5.0*Player.speed/5.0); 
X      break;
X    case '2':
X    case 'j': moveplayer(0,1);  
X      Command_Duration =((int) 5.0*Player.speed/5.0); 
X      break;
X    case '8':
X    case 'k': moveplayer(0,-1);
X      Command_Duration =((int) 5.0*Player.speed/5.0); 
X      break;
X    case '6':
X    case 'l': moveplayer(1,0);
X      Command_Duration =((int) 5.0*Player.speed/5.0); 
X      break;
X    case '1':
X    case 'b': moveplayer(-1,1);
X      Command_Duration =((int) 5.0*Player.speed/5.0); 
X      break;
X    case '3':	      
X    case 'n': moveplayer(1,1); 
X      Command_Duration =((int) 5.0*Player.speed/5.0); 
X      break;
X    case '7':
X    case 'y': moveplayer(-1,-1);  
X      Command_Duration =((int) 5.0*Player.speed/5.0); 
X      break;
X    case '9':
X    case 'u': moveplayer(1,-1);  
X      Command_Duration =((int) 5.0*Player.speed/5.0); 
X      break;
X    case '5': 
X      setgamestatus(SKIP_MONSTERS); /* don't do anything; a dummy turn */
X      Cmd = mgetc();
X      while ((Cmd != ESCAPE) &&
X	     ((Cmd < '1') || (Cmd > '9') || (Cmd=='5'))) {
X	print3("Run in keypad direction [ESCAPE to abort]: ");
X	Cmd = mgetc();
X      }
X      if (Cmd != ESCAPE) setgamestatus(FAST_MOVE);
X      break;
X    case 'H': setgamestatus(FAST_MOVE); Cmd = 'h'; moveplayer(-1,0);
X      Command_Duration =((int) 4.0*Player.speed/5.0); 
X      break; 
X    case 'J': setgamestatus(FAST_MOVE); Cmd = 'j'; moveplayer(0,1);
X      Command_Duration =((int) 4.0*Player.speed/5.0); 
X      break;  
X    case 'K': setgamestatus(FAST_MOVE); Cmd = 'k'; moveplayer(0,-1);
X      Command_Duration =((int) 4.0*Player.speed/5.0); 
X      break; 
X    case 'L': setgamestatus(FAST_MOVE); Cmd = 'l'; moveplayer(1,0);
X      Command_Duration =((int) 4.0*Player.speed/5.0); 
X      break;  
X    case 'B': setgamestatus(FAST_MOVE); Cmd = 'b'; moveplayer(-1,1);
X      Command_Duration =((int) 4.0*Player.speed/5.0); 
X      break; 
X    case 'N': setgamestatus(FAST_MOVE); Cmd = 'n'; moveplayer(1,1);
X      Command_Duration =((int) 4.0*Player.speed/5.0); 
X      break;  
X    case 'Y': setgamestatus(FAST_MOVE); Cmd = 'y'; moveplayer(-1,-1);  
X      Command_Duration =((int) 4.0*Player.speed/5.0); 
X      break;
X    case 'U': setgamestatus(FAST_MOVE); Cmd = 'u'; moveplayer(1,-1);
X      Command_Duration =((int) 4.0*Player.speed/5.0); 
X      break;
X    default: commanderror();  setgamestatus(SKIP_MONSTERS); break;
X    }
X  }
X  if (Current_Environment != E_COUNTRYSIDE) roomcheck();
X  screencheck(Player.y);
X}
X
X
X
X
X
X/* deal with a new player command in countryside mode */
Xvoid p_country_process()
X{
X  int no_op;
X  
X  drawvision(Player.x,Player.y);
X  do {
X    no_op = FALSE;
X    Cmd = mgetc();
X    clear_if_necessary();
X    switch (Cmd) {
X    case ' ': 
X    case 13: no_op = TRUE; break;
X    case 7: wizard(); break; /* ^g */
X    case 14: xredraw(); no_op = TRUE; break; /* ^l */
X    case 16: bufferprint(); no_op = TRUE; break; /* ^p */ 
X    case 18: redraw(); no_op = TRUE; break; /* ^r */
X    case 23: if (gamestatusp(CHEATED)) drawscreen();  break; /* ^w */
X    case 24: if (gamestatusp(CHEATED) || 
X		 Player.rank[ADEPT]) wish(1);  break; /* ^x */
X    case 'd': drop();  break;
X    case 'e': eat();  break;
X    case 'i': 
X      if (optionp(TOPINV)) top_inventory_control();
X      else {
X	menuclear();
X	display_possessions();
X	inventory_control();
X      }
X      break;
X    case 's': countrysearch(); break;
X    case 'x': examine(); break;
X    case 'E': dismount_steed(); break;
X    case 'H': hunt(Country[Player.x][Player.y].current_terrain_type); break;
X    case 'I': 
X      if (! optionp(TOPINV)) top_inventory_control();
X      else {
X	menuclear();
X	display_possessions();
X	inventory_control();
X      }
X      break;
X    case 'O': setoptions(); break;
X    case 'P': show_license(); break; /* actually show_license is in ofile */
X    case 'Q': quit(); break;
X    case 'R': rename_player(); break;
X    case 'S': save(TRUE); break;
X    case 'V': version(); break;
X    case '>': 
X      enter_site(Country[Player.x][Player.y].base_terrain_type);
X      break;
X    case '/': charid(); no_op = TRUE; break;
X    case '?': help(); no_op = TRUE; break;
X    case '4':	       
X    case 'h': movepincountry(-1,0);  break;
X    case '2':
X    case 'j': movepincountry(0,1);  break;
X    case '8':
X    case 'k': movepincountry(0,-1);  break;
X    case '6':
X    case 'l': movepincountry(1,0);  break;
X    case '1':
X    case 'b': movepincountry(-1,1);  break;
X    case '3':	      
X    case 'n': movepincountry(1,1);  break;
X    case '7':
X    case 'y': movepincountry(-1,-1);  break;
X    case '9':
X    case 'u': movepincountry(1,-1);  break;
X    default: commanderror();  no_op = TRUE; break;
X    }
X  } while (no_op);
X  screencheck(Player.y);
X}
X
X
END_OF_FILE
if test 9308 -ne `wc -c <'ocom1.c'`; then
    echo shar: \"'ocom1.c'\" unpacked with wrong size!
fi
# end of 'ocom1.c'
fi
if test -f 'oetc.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'oetc.c'\"
else
echo shar: Extracting \"'oetc.c'\" \(12947 characters\)
sed "s/^X//" >'oetc.c' <<'END_OF_FILE'
X/* omega copyright (C) by Laurence Raphael Brothers, 1987,1988 */
X/* oetc.c */
X/* grab bag of random functions used in random places */
X
X#include "oglob.h"
X
X/* there are various ways for the player to receive one of these hints */
Xvoid hint()
X{
X  switch(random_range(95)) {
X  case 0:mprint("There is an entrance to the sewers in the Garden.");break;
X  case 1:mprint("Statues can be dangerous.");break;
X  case 2:mprint("Unidentified Artifacts can be dangerous.");break;
X  case 3:mprint("The higher form of mercury is desirable.");break;
X  case 4:mprint("A sense of unease is a good thing to have.");break;
X  case 5:mprint("If you dig too much, you might cause a cave in!.");break;
X  case 6:mprint("Be Lawful: Live and Let Live.");break;
X  case 7:mprint("Be Chaotic: Live and Let Die."); break;
X  case 8:mprint("The world doesn't slow down; you speed up.");break;
X  case 9:mprint("Security is a sense of dislocation.");break;
X  case 10:mprint("Tullimore Dew is a panacea.");break;
X  case 11:mprint("Thieves hide behind closed doors.");break;
X  case 12:mprint("`No jail is escapeproof' -- John Dillinger.");break;
X  case 13:mprint("Oh, to have an apartment of your own!");break;
X  case 14:mprint("Some homes have money and treasure.");break;
X  case 15:mprint("Some homes are defended.");break;
X  case 16:mprint("Sometimes you could just wish for Death."); break;
X  case 17:mprint("A cursed wish can be fatal.");break;
X  case 18:mprint("The way you play, you should wish for Skill."); break;
X  case 19:mprint("A druid might wish for Balance."); break;
X  case 20:mprint("Mages always wish for Knowledge.");break;
X  case 21:mprint("Some fairies are good.");break;
X  case 22:mprint("An affair with a demon can be heartbreaking."); break;
X  case 23:mprint("The Explorer's Club knows a useful spell."); break;
X  case 24:mprint("They say some famous people live in mansions."); break;
X  case 25:mprint("Magic pools are totally random."); break;
X  case 26:mprint("There are five elements, including Void."); break;
X  case 27:mprint("Humans can be good or evil, lawful or chaotic."); break;
X  case 28:mprint("There are many kinds of wishes. Case counts, you know.");
X    break;
X  case 29:mprint("There are caves due south of Rampart"); break;
X  case 30:mprint("Donaldson's Giants can withstand lava.");break;
X  case 31:mprint("Ritual magic can have many different effects.");break;
X  case 32:mprint("The Mercenaries are the best equipped fighters."); break;
X  case 33:mprint("The Gladiators are the most skilled fighters."); break;
X  case 34:mprint("Rent a flat and lose any bad stati you may have."); break;
X  case 35:mprint("Some junk may be worth a fortune if identified."); break;
X  case 36:mprint("Identify humans by talking to them."); break;
X  case 37:mprint("They say the Duke has a treasure trove."); break;
X  case 38:mprint("If you yield, your opponent will gain experience."); break;
X  case 39:mprint("The Dragon Lord lives in the Waste of Time."); break;
X  case 40:mprint("A full moon bodes well for the followers of Law."); break;
X  case 41:mprint("A new moon omens evil for the Law-abiding."); break;
X  case 42:mprint("Druids revere the half-moon."); break;
X  case 43:mprint("Most grot is useless."); break;
X  case 44:mprint("Cash can sometimes be found in the walls."); break;
X  case 45:mprint("Pointy weapons break often but dig better."); break;
X  case 46:mprint("The DREADED AQUAE MORTIS is invulnerable."); break;
X  case 47:mprint("There must be *some* reason to worship Destiny!"); break;
X  case 48:mprint("Kill a trifid? A puzzle! Try a saline solution!"); break;
X  case 49:mprint("Beware! The Eater of Souls inhabits the abyss!"); break;
X  case 50:mprint("They say there's a red-light district in town."); break;
X  case 51:mprint("The House of the Eclipse is behind a closed door."); break;
X  case 52:mprint("The Orbs may be encountered on the Astral Plane."); break;
X  case 53:mprint("The Champion should never refuse a challenge."); break;
X  case 54:mprint("They say that the autoteller program is buggy."); break;
X  case 55:mprint("It's better not to sleep on the ground."); break;
X  case 56:mprint("Try ritual magic in different kinds of rooms."); break;
X  case 57:mprint("Breaking down a wall by bashing it is a bad idea!"); break;
X  case 58:mprint("Follow the Oracle's advice; she is all-wise."); break;
X  case 59:mprint("The ArchDruid lives in the northern forest.");break;
X  case 60:mprint("A search of the mountains may reveal a secret pass.");break;
X  case 61:mprint("Star Peak is to the far North-East."); break;
X  case 62:mprint("The Archmage lives in the far North-West beyond a pass.");
X    break;
X  case 63:mprint("There is a volcano in the southern marshes."); break;
X  case 64:mprint("The Demon Emperor resides in the Volcano."); break;
X  case 65:mprint("The Lawgiver can be found at Star Peak."); break;
X  case 66:mprint("The Temple of Athena is to the North-East."); break;
X  case 67:mprint("The Temple of Set can be found in a desert.");break;
X  case 68:mprint("The Temple of Hecate is in the swamp."); break;
X  case 69:mprint("The Temple of Odin is to the South in some mountains.");
X    break;
X  case 70:mprint("There is a curious island off a promontory of the swamp.");
X    break;
X  case 71:mprint("The Eater of Magic can be found on an island.");break;
X  case 72:mprint("The Temple of Destiny is practically inaccessible.");break;
X  case 73:mprint("Each sect has its own main temple outside the city.");break;
X  case 74:mprint("The aligned temples are dangerous to unbelievers.");break;
X  case 75:mprint("If you are poor, maybe you should wish for Wealth.");break;
X  case 76:mprint("Need mana? Wish for Power.");break;
X  case 77:mprint("Wishing for Law, Balance, or Chaos alters alignment.");break;
X  case 78:mprint("Feeling out of sorts? Wish for Health.");break;
X  case 79:mprint("Challenge the abyss at the Temple of Destiny.");break;
X  case 80:mprint("The Circle of Sorcerors has an Astral HQ");break;
X  case 81:mprint("The Star Gem is the only way back from the Astral Plane.");
X    break;
X  case 82:mprint("The Star Gem is guarded by the Circle of Sorcerors.");break;
X  case 83:mprint("The Star Gem is rightfully the property of the LawBringer.");
X    break;
X  case 84:mprint("They say the Demon Emperor owns the Amulet of the Planes.");
X    break;
X  case 85:mprint("An Amulet might get you to the Temple of Destiny.");break;
X  case 86:mprint("A wish for Location might help you become Adept.");break;
X  case 87:mprint("Some Artifacts may be used only once per day.");break;
X  case 88:mprint("Overusing Artifacts can be a bad move."); break;
X  case 89:mprint("You might starve in the Swamp or the Mountains!");break;
X  case 90:mprint("You would have to be very chaotic to attack a guard!");break;
X  case 91:mprint("You would have to be very foolhardy to attack a guard!");
X    break;
X  case 92:mprint("Only a master of chaos would kill all the city guards!");
X    break;
X  case 93:mprint("The Order depends on the force of the LawGiver");break;
X  case 94:mprint("City Guards are employees of the Order");break;
X  }
X}
X
X/* for when a deity teaches spells to a devotee */
Xvoid learnclericalspells(deity,level)
Xint deity,level;
X{
X  mprint("With your new clerical rank comes knowledge of magic...");
X  Player.pow+=level;
X  Player.maxpow+=level;
X  switch(level) {
X    case LAY: 
X      if (deity==ODIN) 
X	Spells[S_MISSILE].known = TRUE;
X      else if (deity==SET)
X	Spells[S_INVISIBLE].known = TRUE;
X      else if (deity==ATHENA)
X	Spells[S_IDENTIFY].known = TRUE;
X      else if (deity==HECATE)
X	Spells[S_DRAIN].known = TRUE;
X      else if (deity==DRUID) {
X	Spells[S_KNOWLEDGE].known = TRUE;
X	Spells[S_MON_DET].known = TRUE;
X      }
X      break;
X    case ACOLYTE: 
X      if (deity==ODIN) {
X	Spells[S_LBALL].known = TRUE;
X	Spells[S_TRUESIGHT].known = TRUE;
X      }
X      else if (deity==SET) {
X	Spells[S_SUMMON].known = TRUE;
X	Spells[S_FIREBOLT].known = TRUE;
X      }
X      else if (deity==ATHENA) {
X	Spells[S_HEAL].known = TRUE;
X	Spells[S_SANCTUARY].known = TRUE;
X      }
X      else if (deity==HECATE) {
X	Spells[S_SLEEP].known = TRUE;
X	Spells[S_DISPEL].known = TRUE;
X      }
X      else if (deity==DRUID) {
X	Spells[S_HEAL].known = TRUE;
X	Spells[S_CURE].known = TRUE;
X      }
X      else if (deity==DESTINY)
X	mprint("An acolyte of the Lords of Destiny. Gee whiz.");
X      break;
X    case PRIEST: 
X      Spells[S_SANCTIFY].known = TRUE;
X      if (deity==ODIN) {
X	Spells[S_HERO].known = TRUE;
X	Spells[S_HEAL].known = TRUE;
X      }
X      else if (deity==SET) {
X	Spells[S_INVISIBLE].known = TRUE;
X	Spells[S_DISPEL].known = TRUE;
X      }
X      else if (deity==ATHENA) {
X	Spells[S_REGENERATE].known = TRUE;
X	Spells[S_ACCURACY].known = TRUE;
X      }
X      else if (deity==HECATE) {
X	Spells[S_SHADOWFORM].known = TRUE;
X	Spells[S_CURE].known = TRUE;
X      }
X      else if (deity==DRUID) {
X	Spells[S_DISRUPT].known = TRUE;
X	Spells[S_ALERT].known = TRUE;
X	Spells[S_CLAIRVOYANCE].known = TRUE;
X      }
X      else if (deity==DESTINY)
X	mprint("How useless, a new priest of the Lords of Destiny.");
X      break;
X    case SPRIEST:
X      Spells[S_BLESS].known = TRUE;
X      if (deity == ODIN) 
X	Spells[S_ACCURACY].known = TRUE;
X      else if (deity == SET)
X	Spells[S_SHADOWFORM].known = TRUE;
X      else if (deity == ATHENA)
X	Spells[S_HERO].known = TRUE;
X      else if (deity == HECATE)
X	Spells[S_POLYMORPH].known = TRUE;
X      else if (deity == DRUID) {
X	Spells[S_POLYMORPH].known = TRUE;	
X	Spells[S_LEVITATE].known = TRUE;
X      }
X      else if (deity == DESTINY)
X	mprint("Wow, a new senior priest of the Lords of Destiny.");
X      break;
X    case HIGHPRIEST:
X      if (deity == ODIN)
X	Spells[S_RESTORE].known = TRUE;
X      else if (deity == SET)
X	Spells[S_HELLFIRE].known = TRUE;
X      else if (deity == ATHENA)
X	Spells[S_HELLFIRE].known = TRUE;
X      else if (deity == HECATE)
X	Spells[S_DESECRATE].known = TRUE;
X      else if (deity == DRUID) {
X	Spells[S_DISINTEGRATE].known = TRUE;
X	Spells[S_HERO].known = TRUE;
X      }
X      else if (deity == DESTINY) {
X	mprint("So you're now the high priest of the Lords of Destiny.");
X	mprint("You didn't think you were going to get anything, did you?");
X      }
X    }
X}
X
X/* for the use of the casino slot machine */
Xchar *slotstr(num)
Xint num;
X{
X  switch(num) {
X  case 0:
X    return("<Slime Mold>");
X    break;
X  case 1:
X    return("<Lemon>");
X    break;
X  case 2:
X    return("<Copper>");
X    break;
X  case 3:
X    return("<Nymph>");
X    break;
X  case 4:
X    return("<Sword>");
X    break;
X  case 5:
X    return("<Shield>");
X    break;
X  case 6:
X    return("<Chest>");
X    break;
X  case 7:
X    return("<Bar>");
X    break;
X  case 8:
X    return("<Orb>");
X    break;
X  case 9:
X    return("<Mithril Nugget>");
X    break;
X  }
X}
X
X/* random names for various uses */
Xchar *nameprint()
X{
X  switch(random_range(40)) {
X  case 0:strcpy(Str3,"Orion Splash");break;
X  case 1:strcpy(Str3,"Gorgar");break;
X  case 2:strcpy(Str3,"Hieronymous");break;
X  case 3:strcpy(Str3,"Quantifor Quotron");break;
X  case 4:strcpy(Str3,"Leon");break;
X  case 5:strcpy(Str3,"Joyce");break;
X  case 6:strcpy(Str3,"Leticia Smiley");break;
X  case 7:strcpy(Str3,"Ogilvy the Grim");break;
X  case 8:strcpy(Str3,"Salara Storn");break;
X  case 9:strcpy(Str3,"Murgo");break;
X  case 10:strcpy(Str3,"Jonathan Atwilder");break;
X  case 11:strcpy(Str3,"Xylos the Tan");break;
X  case 12:strcpy(Str3,"Terence");break;
X  case 13:strcpy(Str3,"Toronado");break;
X  case 14:strcpy(Str3,"Kelly");break;
X  case 15:strcpy(Str3,"Cantinflas");break;
X  case 16:strcpy(Str3,"Ixel");break;
X  case 17:strcpy(Str3,"Toto");break;
X  case 18:strcpy(Str3,"Frost");break;
X  case 19:strcpy(Str3,"Aliera Erinyes");break;
X  case 20:strcpy(Str3,"Godel");break;
X  case 21:strcpy(Str3,"Kerst Blackblade");break;
X  case 22:strcpy(Str3,"Ebenezer");break;
X  case 23:strcpy(Str3,"Jeremiah");break;
X  case 24:strcpy(Str3,"Triskelion Shadow");break;
X  case 25:strcpy(Str3,"Eleskir Eremar");break;
X  case 26:strcpy(Str3,"Tyron");break;
X  case 27:strcpy(Str3,"Morgon");break;
X  case 28:strcpy(Str3,"Achmed");break;
X  case 29:strcpy(Str3,"Chin");break;
X  case 30:strcpy(Str3,"Fujimoto");break;
X  case 31:strcpy(Str3,"Dos Santos");break;
X  case 32:strcpy(Str3,"Federico");break;
X  case 33:strcpy(Str3,"Jaime");break;
X  case 34:strcpy(Str3,"Siobhan");break;
X  case 35:strcpy(Str3,"Hans");break;
X  case 36:strcpy(Str3,"Gurkov");break;
X  case 37:strcpy(Str3,"Krilos the Slayer");break;
X  case 38:strcpy(Str3,"Oxxblud");break;
X  case 39:strcpy(Str3,"Dorian");break;
X  }
X  return(Str3);
X}
X
X
X/* returns english string equivalent of number */
Xchar *wordnum(num)
X{
X  switch(num) {
X  case 0: return("zero "); break;
X  case 1: return("one "); break;
X  case 2: return("two "); break;
X  case 3: return("three "); break;
X  case 4: return("four "); break;
X  case 5: return("five "); break;
X  case 6: return("six "); break;
X  case 7: return("seven "); break;
X  case 8: return("eight "); break;
X  case 9: return("nine "); break;
X  case 10: return("ten "); break;
X  default: return(""); break;
X  }
X}
END_OF_FILE
if test 12947 -ne `wc -c <'oetc.c'`; then
    echo shar: \"'oetc.c'\" unpacked with wrong size!
fi
# end of 'oetc.c'
fi
if test -f 'ohelp11.txt' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'ohelp11.txt'\"
else
echo shar: Extracting \"'ohelp11.txt'\" \(803 characters\)
sed "s/^X//" >'ohelp11.txt' <<'END_OF_FILE'
XOPTION SETTINGS
X===============
XOptions may be set with the 'O' command. The options are:
X
X(F) BELLICOSE: Attack friendly monsters without confirmation.
X(F) JUMPMOVE: Don't display things until the end of a run.
X(T) PICKUP: Automatically pick things up when you move over them.
X(T) RUNSTOP: Stop a run when something like a door is passed.
X(T) CONFIRM: Ask confirmation before you do some dangerous things.
X(F) TOPINV: Display inventory to message line, not to full screen.
X(F) PACKADD: Add new items to pack, instead of going into inventory mode
X(V) VERBOSITY: TERSE, MEDIUM, or VERBOSE, the level of detail in combat.
X(1) SEARCHNUM: the number of turns spent searching when you hit the 's' key.
X
XThe default values are parenthesized. These options will be recovered from
Xyour .omegarc if you use one.
END_OF_FILE
if test 803 -ne `wc -c <'ohelp11.txt'`; then
    echo shar: \"'ohelp11.txt'\" unpacked with wrong size!
fi
# end of 'ohelp11.txt'
fi
if test -f 'opriest.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'opriest.c'\"
else
echo shar: Extracting \"'opriest.c'\" \(14332 characters\)
sed "s/^X//" >'opriest.c' <<'END_OF_FILE'
X/* omega copyright (C) by Laurence Raphael Brothers, 1987,1988 */
X/* opriest.c */
X/* functions for clerics. */
X
X#include "oglob.h"
X
X/* prayer occurs at altars, hence name of function */
Xvoid l_altar()
X{
X  int i,deity;
X  char response;
X
X  if (Current_Environment == E_COUNTRYSIDE) deity = DRUID;
X  else deity = Level->site[Player.x][Player.y].aux;
X
X  switch(deity) {
X    default:
X      print1("This rude altar has no markings.");
X      break;
X    case ODIN:
X      print1("This granite altar is graven with a gallows.");
X      break;
X    case SET:
X      print1("This sandstone altar has a black hand drawn on it.");
X      break;
X    case HECATE:
X      print1("This silver altar is inlaid with a black crescent moon.");
X      break;
X    case ATHENA:
X      print1("This golden altar is inscribed with an owl.");
X      break;
X    case DESTINY:
X      print1("This crystal altar is in the form of an omega.");
X      break;
X    case DRUID:
X      print1("This oaken altar is ornately engraved with leaves.");
X      break;
X  }
X  print2("Worship at this altar? [yn] ");
X  if (ynq2() == 'y') {
X    if (Player.rank[PRIESTHOOD] == 0) increase_priest_rank(deity);
X    else if (! check_sacrilege(deity)) {
X      if (Blessing) print1("You have a sense of immanence.");
X      print2("Request a Blessing, Sacrifice an item, or just Pray [b,s,p] ");
X      do response = mcigetc();
X      while ((response != 'b') && 
X	     (response != 's') && 
X	     (response != 'p') && 
X	     (response != ESCAPE));
X      if (response == 'b') {
X	print1("You beg a heavenly benefice.");
X	print2("You hear a gong resonating throughout eternity....");
X	morewait();
X	if (Blessing) {
X	  print1("A shaft of lucent radiance lances down from the heavens!");
X	  print2("You feel uplifted....");
X	  morewait();
X	  gain_experience(Player.rank[PRIESTHOOD]*Player.rank[PRIESTHOOD]*50);
X	  cleanse(1);
X	  heal(10);
X	  bless(1);
X	  Blessing = FALSE;
X	  increase_priest_rank(deity);
X	}
X	else {
X	  print1("Your ardent plea is ignored.");
X	  print2("You feel ashamed.");
X	  Player.xp -= (Player.xp/4);
X	}
X	calc_melee();
X      }
X      else if (response == 's') {
X	print1("Which item to Sacrifice?");
X	i = getitem(NULL);
X	if (i==ABORT) i = 0;
X	if (Player.possessions[i] == NULL) {
X	  print1("You have insulted your deity!");
X	  print2("Not a good idea, as it turns out...");
X	  dispel(-1);
X	  p_damage(Player.hp-1,UNSTOPPABLE,"a god's pique");
X	}
X	else if (true_item_value(Player.possessions[i]) >
X		 (Player.rank[PRIESTHOOD] *
X		  Player.rank[PRIESTHOOD] *
X		  Player.rank[PRIESTHOOD] * 50)) {
X	  print1("With a burst of blue flame, your offering vanishes!");
X	  dispose_lost_objects(1,Player.possessions[i]);
X	  print2("A violet nimbus settles around your head and slowly fades.");
X	  morewait();
X	  Blessing = TRUE;
X	}
X	else {
X	  print1("A darkling glow envelopes your offering!");
X	  print2("The glow slowly fades....");
X	  morewait();
X	  setgamestatus(SUPPRESS_PRINTING);
X	  if (Player.possessions[i]->used) {
X	    Player.possessions[i]->used = FALSE;
X	    item_use(Player.possessions[i]);
X	    Player.possessions[i]->blessing =
X	      -1 - abs(Player.possessions[i]->blessing);
X	    Player.possessions[i]->used = TRUE;
X	    item_use(Player.possessions[i]);
X	  }
X	  else Player.possessions[i]->blessing =
X	    -1 - abs(Player.possessions[i]->blessing);
X	  resetgamestatus(SUPPRESS_PRINTING);
X	}
X      }
X      else if (response == 'p') {
X	if (deity != Player.patron) 
X	  print1("Nothing seems to happen.");
X	else increase_priest_rank(deity);
X      }
X    }
X  }
X}
X
X
X
X
Xint check_sacrilege(deity)
Xint deity;
X{
X  int i,sacrilege=FALSE;
X  if ((Player.patron != deity) && (Player.patron > 0)) {
X    sacrilege=TRUE;
X    Player.pow--;
X    Player.maxpow--;
X    switch(Player.patron) {
X    case ODIN:
X      print1("Odin notices your lack of faith! ");
X      morewait();
X      if (deity == ATHENA) {
X	print2("However, Athena intercedes on your behalf.");
X	sacrilege = FALSE;
X      }
X      else {
X	print2("You are struck by a thunderbolt!");
X	p_damage(Player.level*5,UNSTOPPABLE,"Odin's wrath");
X	if (Player.hp > 0) {
X	  morewait();
X	  print2("The bolt warps your feeble frame....");
X	  Player.maxcon = Player.maxcon/2;
X	  Player.con = min(Player.con,Player.maxcon);
X	  Player.maxstr = Player.maxstr/2;
X	  Player.con = min(Player.str,Player.maxstr);
X	}
X      }
X      morewait();
X      break;
X    case SET:
X      print1("Set notices your lack of faith! ");
X      morewait();
X      if (deity == HECATE) {
X	print1("But since you pray to a friendly deity,");
X	print2("Set decides not to punish you.");
X	sacrilege = FALSE;
X      }
X      else {
X	print2("You are blasted by a shaft of black fire!");
X	p_damage(Player.level*5,UNSTOPPABLE,"Set's anger");
X	if (Player.hp > 0) {
X	  morewait();
X	  print1("You are wreathed in clouds of smoke.");
X	  for(i=0;i<MAXITEMS;i++) 
X	    if ((Player.possessions[i] != NULL) &&
X		(Player.possessions[i]->blessing > -1))
X	      conform_lost_object(Player.possessions[i]);
X	  morewait();
X	  print2("You feel Set's Black Hand on your heart....");
X	  Player.con = Player.maxcon = Player.maxcon / 4;
X	}
X      }
X      morewait();
X      break;
X    case HECATE:
X      print1("Hecate notices your lack of faith! ");
X      morewait();
X      if (deity == SET) {
X	print1("But ignores the affront since she likes Set.");
X	sacrilege = FALSE;
X      }
X      else {
X	print1("You are zapped by dark moonbeams!");
X	p_damage(Player.level*5,UNSTOPPABLE,"Hecate's malice");
X	if (Player.hp > 0) {
X	  print2("The beams leach you of magical power!");
X	  Player.maxpow = Player.maxpow/5;
X	  Player.pow = min(Player.pow,Player.maxpow);
X	  for(i=0;i<NUMSPELLS;i++) 
X	    Spells[i].known = FALSE;
X	}
X      }
X      morewait();
X      break;
X    case ATHENA:
X      print1("Athena notices your lack of faith! ");
X      morewait();
X      if (deity == ODIN) {
X	print2("But lets you off this time since Odin is also Lawful.");
X	sacrilege = FALSE;
X      }
X      else {
X	print2("You are zorched by godsfire!");
X	if (Player.hp > 0) {
X	  morewait();
X	  print1("The fire burns away your worldly experience!");
X		Player.level = 0;
X	  Player.xp = 0;
X	  Player.maxhp = Player.hp = Player.con;
X	  print2("Your power is reduced by the blast!!!");
X	  Player.pow = Player.maxpow = Player.maxpow/3;
X	  Player.mana = min(Player.mana,calcmana());
X	}
X      }
X      morewait();
X      break;
X    case DESTINY:
X      print2("The Lords of Destiny ignore your lack of faith.");
X      sacrilege = FALSE;
X      morewait();
X      break;
X    case DRUID:
X      print2("Your treachery to the ArchDruid has been noted.");
X      if (random_range(2) == 1)
X	Player.alignment += 40;
X      else Player.alignment -= 40;
X      morewait();
X      break;
X    }
X    if (sacrilege) {
X      Player.patron = 0;
X      Player.rank[PRIESTHOOD] = 0;
X    }
X  }
X  return(sacrilege);
X}
X
Xvoid increase_priest_rank(deity)
Xint deity;
X{
X  if (Player.rank[PRIESTHOOD] == 0) switch(deity) {
X  default:
X    print2("Some nameless god blesses you....");
X    Player.hp = Player.maxhp;
X    morewait();
X    print2("The altar crumbles to dust and blows away.");
X    Level->site[Player.x][Player.y].locchar = FLOOR;
X    Level->site[Player.x][Player.y].p_locf = L_NO_OP;
X    break;
X  case ODIN:
X    if (Player.alignment > 0) {
X      print1("Odin hears your prayer!");
X      print2(Priest[ODIN]);
X      nprint2(" personally blesses you.");
X      nprint2(" You are now a lay devotee of Odin.");
X      Player.patron = ODIN;
X      Player.rank[PRIESTHOOD] = LAY;
X      Player.guildxp[PRIESTHOOD] = 1;
X      morewait();
X      learnclericalspells(ODIN,LAY);
X    }
X    else print1("Odin ignores you.");
X    break;
X  case SET:
X    if (Player.alignment < 0) {
X      print1("Set hears your prayer!");
X      print2(Priest[SET]);
X      nprint2(" personally blesses you. ");
X      nprint2(" You are now a lay devotee of Set.");
X      Player.patron = SET;
X      Player.rank[PRIESTHOOD] = LAY;
X      Player.guildxp[PRIESTHOOD] = 1;
X      morewait();
X      learnclericalspells(SET,LAY);
X    }
X    else print1("Set ignores you.");
X    break;
X  case ATHENA:
X    if (Player.alignment > 0) {
X      print1("Athena hears your prayer!");
X      print2(Priest[ATHENA]);
X      nprint2(" personally blesses you.");
X      nprint2(" You are now a lay devotee of Athena.");
X      Player.patron = ATHENA;
X      Player.rank[PRIESTHOOD] = LAY;
X      Player.guildxp[PRIESTHOOD] = 1;
X      morewait();
X      learnclericalspells(ATHENA,LAY);
X    }
X    else print1("Athena ignores you.");
X    break;
X  case HECATE:
X    if (Player.alignment < 0) {
X      print1("Hecate hears your prayer!");
X      print2(Priest[HECATE]);
X      nprint2(" personally blesses you.");
X      nprint2(" You are now a lay devotee of Hecate.");
X      Player.patron = HECATE;
X      Player.rank[PRIESTHOOD] = LAY;
X      Player.guildxp[PRIESTHOOD] = 1;
X      morewait();
X      learnclericalspells(HECATE,LAY);
X    }
X    else print1("Hecate ignores you.");
X    break;
X  case DRUID:
X    if (abs(Player.alignment) < 10) {
X      print1(Priest[DRUID]);
X      nprint1(" personally blesses you.");
X      print2("You are now a lay devotee of the Druids.");
X      Player.patron = DRUID;
X      Player.rank[PRIESTHOOD] = LAY;
X      Player.guildxp[PRIESTHOOD] = 1;
X      morewait();
X      learnclericalspells(DRUID,LAY);
X    }
X    else {
X      print1("You hear a voice....");
X      morewait();
X      print2("'Only those who embody the Balance may become Druids.'");
X    }
X    break;
X  case DESTINY:
X    print1("The Lords of Destiny could hardly care less.");
X    print2("But you can consider yourself now to be a lay devotee.");
X    Player.patron = DESTINY;
X    Player.rank[PRIESTHOOD] = LAY;
X      Player.guildxp[PRIESTHOOD] = 1;
X    break;
X  }
X  else if (deity == Player.patron) {
X    if ((((deity == ODIN) || (deity == ATHENA)) && 
X	 (Player.alignment < 1)) ||
X	(((deity == SET) || (deity == HECATE)) && 
X	 (Player.alignment > 1)) ||
X	((deity == DRUID) && (abs(Player.alignment) > 10))) {
X      print1("You have swerved from the One True Path!");
X      print2("Your deity is greatly displeased...");
X      Player.xp -= Player.level*Player.level;
X      Player.xp = max(0,Player.xp);
X    }
X    else if (Player.rank[PRIESTHOOD]== HIGHPRIEST) answer_prayer();
X    else if (Player.rank[PRIESTHOOD]== SPRIEST) {
X      if (Player.level > Priestlevel[deity])
X	hp_req_test();
X      else answer_prayer();
X    }
X    else if (Player.rank[PRIESTHOOD]==PRIEST) {
X      if (Player.guildxp[PRIESTHOOD] >= 4000) {
X	print1("An heavenly fanfare surrounds you!");
X	print2("Your deity raises you to the post of Senior Priest.");
X	hp_req_print();
X	Player.rank[PRIESTHOOD] = SPRIEST;
X      }
X      else answer_prayer();
X    }
X    else if (Player.rank[PRIESTHOOD]==ACOLYTE) {
X      if (Player.guildxp[PRIESTHOOD] >= 1500) {
X	print1("A trumpet sounds in the distance.");
X	print2("Your deity raises you to the post of Priest.");
X	Player.rank[PRIESTHOOD] = PRIEST;
X	morewait();
X	learnclericalspells(deity,PRIEST);
X      }
X      else answer_prayer();
X    }
X    else if (Player.rank[PRIESTHOOD]==LAY) {
X      if (Player.guildxp[PRIESTHOOD] >= 400) {
X	print1("A mellifluous chime sounds from above the altar.");
X	print2("Your deity raises you to the post of Acolyte.");
X	Player.rank[PRIESTHOOD] = ACOLYTE;
X	morewait();
X	learnclericalspells(deity,ACOLYTE);
X      }
X      else answer_prayer();
X    }
X  }
X}
X
X
Xvoid answer_prayer()
X{
X  clearmsg();
X  switch(random_range(12)) {
X  case 0: print1("You have a revelation!"); break;
X  case 1: print1("You feel pious."); break;
X  case 2: print1("A feeling of sanctity comes over you."); break;
X  default: print1("Nothing unusual seems to happen."); break;
X  }
X}
X
X
Xvoid hp_req_test()
X{
X  pob o;
X  switch  (Player.patron) {
X  case ODIN:
X    if (find_item(&o,ARTIFACTID+17,-1))
X      make_hp(o);
X    else hp_req_print();
X    break;
X  case SET:
X    if (find_item(&o,ARTIFACTID+14,-1))
X      make_hp(o);
X    else hp_req_print();
X    break;
X  case ATHENA:
X    if (find_item(&o,ARTIFACTID+15,-1))
X      make_hp(o);
X    else hp_req_print();
X    break;
X  case HECATE:
X    if (find_item(&o,ARTIFACTID+16,-1))
X      make_hp(o);
X    else hp_req_print();
X    break;
X  case DRUID:
X    if (find_item(&o,ARTIFACTID+14,-1))
X      make_hp(o);
X    else if (find_item(&o,ARTIFACTID+15,-1))
X      make_hp(o);
X    else if (find_item(&o,ARTIFACTID+16,-1))
X      make_hp(o);
X    else if (find_item(&o,ARTIFACTID+17,-1))
X      make_hp(o);
X    else hp_req_print();
X    break;
X  case DESTINY:
X    if (find_item(&o,ARTIFACTID+19,-1))
X      make_hp(o);
X    else hp_req_print();
X    break;
X  }
X}
X
X
Xvoid hp_req_print()
X{
X  morewait();
X  print1("To advance further, you must obtain the Holy Symbol of ");
X  switch(Player.patron) {
X  case ODIN:
X    nprint1(Priest[SET]);
X    print2("who may be found in the main Temple of Set.");
X    break;
X  case SET:
X    nprint1(Priest[ODIN]);
X    print2("who may be found in the main Temple of Odin.");
X    break;
X  case ATHENA:
X    nprint1(Priest[HECATE]);
X    print2("who may be found in the main Temple of Hecate.");
X    break;
X  case HECATE:
X    nprint1(Priest[ATHENA]);
X    print2("who may be found in the main Temple of Athena.");
X    break;
X  case DRUID:
X    print2("any of the aligned priests");
X    nprint2(" who may be found in their main temples.");
X    break;
X  case DESTINY:
X    nprint1(Priest[DESTINY]);
X    print2("who may be found in the main Temple of Destiny.");
X    break;
X  }
X}
X
Xvoid make_hp(o)
Xpob o;
X{
X  print1("A full-scale heavenly choir chants 'Hallelujah' all around you!");
X  print2("You notice a change in the symbol you carry....");
X  switch(Player.patron) {
X  case ODIN:
X    *o = Objects[ARTIFACTID+14];
X    break;
X  case SET:
X    *o = Objects[ARTIFACTID+17];
X    break;
X  case ATHENA:
X    *o = Objects[ARTIFACTID+16];
X    break;
X  case HECATE:
X    *o = Objects[ARTIFACTID+15];
X    break;
X  case DRUID:
X    *o = Objects[ARTIFACTID+18];
X    break;
X  case DESTINY:
X    *o = Objects[ARTIFACTID+19];
X    break;
X  }
X  o->known = 2;
X  o->charge = 17; /* random hack to convey bit that symbol is functional */
X  morewait();
X  if (Player.patron == DRUID)
X    print1("Your deity raises you to the post of ArchDruid!");
X  else print1("Your deity raises you to the post of High Priest!");
X  print2("You feel holy.");
X  strcpy(Priest[Player.patron],Player.name);
X  Priestlevel[Player.patron] = Player.level;
X  Player.rank[PRIESTHOOD] = HIGHPRIEST;
X  morewait();
X  learnclericalspells(Player.patron,HIGHPRIEST);
X}
END_OF_FILE
if test 14332 -ne `wc -c <'opriest.c'`; then
    echo shar: \"'opriest.c'\" unpacked with wrong size!
fi
# end of 'opriest.c'
fi
echo shar: End of archive 15 \(of 19\).
cp /dev/null ark15isdone
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