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

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

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



#! /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 13 (of 19)."
# Contents:  oabyss.c ocity.c olev.c ospell.c
# Wrapped by billr@saab on Wed Jul 13 10:46:55 1988
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f 'oabyss.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'oabyss.c'\"
else
echo shar: Extracting \"'oabyss.c'\" \(1698 characters\)
sed "s/^X//" >'oabyss.c' <<'END_OF_FILE'
X/* omega copyright (C) by Laurence Raphael Brothers, 1987,1988 */
X/* oabyss.c */
X/* some functions to make the abyss level and run the final challenge */
X
X#include "oglob.h"
X
X
X/* loads the abyss level into Level*/
Xvoid load_abyss()
X{
X  int i,j;
X  char site;
X  
X  FILE *fd;
X  
X  TempLevel = Level;
X  if (ok_to_free(TempLevel)) {
X    free((char *) TempLevel);
X    TempLevel = NULL;
X  }
X  Level = ((plv) malloc(sizeof(levtype)));
X  
X  clear_level(Level);
X
X  strcpy(Str3,OMEGALIB);
X  strcat(Str3,"oabyss.dat");
X  fd = fopen(Str3,"r");
X  for(j=0;j<LENGTH;j++) {
X    for(i=0;i<WIDTH;i++) {
X      site = getc(fd);
X      switch(site) {
X      case '0':
X	Level->site[i][j].locchar = ' ';
X	Level->site[i][j].p_locf = L_VOID;
X	break;
X      case 'V':
X	Level->site[i][j].locchar = ' ';
X	Level->site[i][j].p_locf = L_VOID_STATION;
X	break;
X      case '1':
X	Level->site[i][j].locchar = FLOOR;
X	Level->site[i][j].p_locf = L_VOICE1;
X	break;
X      case '2':
X	Level->site[i][j].locchar = FLOOR;
X	Level->site[i][j].p_locf = L_VOICE2;
X	break;
X      case '3':
X	Level->site[i][j].locchar = FLOOR;
X	Level->site[i][j].p_locf = L_VOICE3;
X	break;
X      case '~':
X	Level->site[i][j].locchar = WATER;
X	Level->site[i][j].p_locf = L_WATER_STATION;
X	break;
X      case ';':
X	Level->site[i][j].locchar = FIRE;
X	Level->site[i][j].p_locf = L_FIRE_STATION;
X	break;
X      case '"':
X	Level->site[i][j].locchar = HEDGE;
X	Level->site[i][j].p_locf = L_EARTH_STATION;
X	break;
X      case '6':
X	Level->site[i][j].locchar = WHIRLWIND;
X	Level->site[i][j].p_locf = L_AIR_STATION;
X	break;
X      case '#':
X	Level->site[i][j].locchar = WALL;
X	break;
X      case '.':
X	Level->site[i][j].locchar = FLOOR;
X	break;
X      }
X    }
X    fscanf(fd,"\n");
X  }
X}
END_OF_FILE
if test 1698 -ne `wc -c <'oabyss.c'`; then
    echo shar: \"'oabyss.c'\" unpacked with wrong size!
fi
# end of 'oabyss.c'
fi
if test -f 'ocity.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'ocity.c'\"
else
echo shar: Extracting \"'ocity.c'\" \(16797 characters\)
sed "s/^X//" >'ocity.c' <<'END_OF_FILE'
X/* omega copyright (C) by Laurence Raphael Brothers, 1987,1988 */
X/* ocity.c */
X/* some functions to make the city level */
X
X#include "oglob.h"
X
X
X/* loads the city level */
Xvoid load_city()
X{
X  int i,j;
X  pml ml;
X  char site;
X  
X  FILE *fd;
X  
X  for(i=0;i<NUMCITYSITES;i++) 
X    CitySiteList[i][0] = FALSE;
X
X  strcpy(Str3,OMEGALIB);
X  strcat(Str3,"ocity.dat");
X  fd = fopen(Str3,"r");
X
X
X  TempLevel = Level;
X  if (ok_to_free(TempLevel)) {
X    free((char *) TempLevel);
X    TempLevel = NULL;
X  }
X  Level = ((plv) malloc(sizeof(levtype)));
X  clear_level(Level);
X  Level->environment = E_CITY;
X  for(j=0;j<LENGTH;j++) {
X    for(i=0;i<WIDTH;i++) {
X      lset(i,j,SEEN);
X      site = getc(fd);
X
X      switch(site) {
X      case 'g':
X	Level->site[i][j].locchar = FLOOR;
X	Level->site[i][j].p_locf = L_GARDEN;
X	break;
X      case 'z':
X	Level->site[i][j].locchar = FLOOR;
X	Level->site[i][j].p_locf = L_MAZE;
X	break;
X      case 'y':
X	Level->site[i][j].locchar = FLOOR;
X	Level->site[i][j].p_locf = L_CEMETARY;
X	break;
X      case 'x':
X	assign_city_function(i,j);
X	break;
X      case 't':
X	Level->site[i][j].locchar = FLOOR;
X	Level->site[i][j].p_locf = L_TEMPLE;
X	CitySiteList[L_TEMPLE-CITYSITEBASE][0] = TRUE;
X	CitySiteList[L_TEMPLE-CITYSITEBASE][1] = i;
X	CitySiteList[L_TEMPLE-CITYSITEBASE][2] = j;
X	break;
X      case 'T':
X	Level->site[i][j].locchar = FLOOR;
X	Level->site[i][j].p_locf = L_PORTCULLIS_TRAP;
X	Level->site[i][j].aux = NOCITYMOVE;
X	break;
X      case 'R':
X	Level->site[i][j].locchar = FLOOR;
X	Level->site[i][j].p_locf = L_RAISE_PORTCULLIS;
X	Level->site[i][j].aux = NOCITYMOVE;
X	break;
X      case '7':
X	Level->site[i][j].locchar = FLOOR;
X	Level->site[i][j].p_locf = L_PORTCULLIS;
X	Level->site[i][j].aux = NOCITYMOVE;
X	break;
X      case 'C':
X	Level->site[i][j].locchar = OPEN_DOOR;
X	Level->site[i][j].p_locf = L_COLLEGE;
X	CitySiteList[L_COLLEGE-CITYSITEBASE][0] = TRUE;
X	CitySiteList[L_COLLEGE-CITYSITEBASE][1] = i;
X	CitySiteList[L_COLLEGE-CITYSITEBASE][2] = j;
X	break;
X      case 's':
X	Level->site[i][j].locchar = OPEN_DOOR;
X	Level->site[i][j].p_locf = L_SORCERORS;
X	CitySiteList[L_SORCERORS-CITYSITEBASE][0] = TRUE;
X	CitySiteList[L_SORCERORS-CITYSITEBASE][1] = i;
X	CitySiteList[L_SORCERORS-CITYSITEBASE][2] = j;
X	break;
X      case 'M':
X	Level->site[i][j].locchar = OPEN_DOOR;
X	Level->site[i][j].p_locf = L_MERC_GUILD;
X	CitySiteList[L_MERC_GUILD-CITYSITEBASE][0] = TRUE;
X	CitySiteList[L_MERC_GUILD-CITYSITEBASE][1] = i;
X	CitySiteList[L_MERC_GUILD-CITYSITEBASE][2] = j;
X	break;
X      case 'c':
X	Level->site[i][j].locchar = OPEN_DOOR;
X	Level->site[i][j].p_locf = L_CASTLE;
X	CitySiteList[L_CASTLE-CITYSITEBASE][0] = TRUE;
X	CitySiteList[L_CASTLE-CITYSITEBASE][1] = i;
X	CitySiteList[L_CASTLE-CITYSITEBASE][2] = j;
X	break;
X      case '?':
X	mazesite(i,j);
X	break;
X      case 'P':
X        Level->site[i][j].locchar = OPEN_DOOR;
X	Level->site[i][j].p_locf = L_ORDER;
X	CitySiteList[L_ORDER-CITYSITEBASE][0] = TRUE;
X	CitySiteList[L_ORDER-CITYSITEBASE][1] = i;
X	CitySiteList[L_ORDER-CITYSITEBASE][2] = j;
X	break;
X      case 'H':
X        Level->site[i][j].locchar = OPEN_DOOR;
X	Level->site[i][j].p_locf = L_CHARITY;
X	CitySiteList[L_CHARITY-CITYSITEBASE][0] = TRUE;
X	CitySiteList[L_CHARITY-CITYSITEBASE][1] = i;
X	CitySiteList[L_CHARITY-CITYSITEBASE][2] = j;
X	break;
X      case 'j':
X        Level->site[i][j].locchar = FLOOR;
X	make_justiciar(i,j);
X        break;
X      case 'J':
X	Level->site[i][j].locchar = CLOSED_DOOR;
X	Level->site[i][j].p_locf = L_JAIL;
X	break;
X      case 'A':
X	Level->site[i][j].locchar = OPEN_DOOR;
X	Level->site[i][j].p_locf = L_ARENA;
X	CitySiteList[L_ARENA-CITYSITEBASE][0] = TRUE;
X	CitySiteList[L_ARENA-CITYSITEBASE][1] = i;
X	CitySiteList[L_ARENA-CITYSITEBASE][2] = j;
X	break;
X      case 'B':
X	Level->site[i][j].locchar = OPEN_DOOR;
X	Level->site[i][j].p_locf = L_BANK;
X	CitySiteList[L_BANK-CITYSITEBASE][0] = TRUE;
X	CitySiteList[L_BANK-CITYSITEBASE][1] = i;
X	CitySiteList[L_BANK-CITYSITEBASE][2] = j;
X	lset(i,j+1,STOPS);
X	lset(i+1,j,STOPS);
X	lset(i-1,j,STOPS);
X	lset(i,j-1,STOPS);
X	break;
X      case 'X':
X	Level->site[i][j].locchar = FLOOR;
X	Level->site[i][j].p_locf = L_COUNTRYSIDE;
X	CitySiteList[L_COUNTRYSIDE-CITYSITEBASE][0] = TRUE;
X	CitySiteList[L_COUNTRYSIDE-CITYSITEBASE][1] = i;
X	CitySiteList[L_COUNTRYSIDE-CITYSITEBASE][2] = j;
X	break;
X      case 'V':
X	Level->site[i][j].locchar = FLOOR;
X	Level->site[i][j].p_locf = L_VAULT;
X	Level->site[i][j].aux = NOCITYMOVE;
X	lset(i,j,SECRET);
X	break;
X      case '\\':
X	Level->site[i][j].aux = NOCITYMOVE;
X	Level->site[i][j].showchar = WALL;
X	Level->site[i][j].locchar = CLOSED_DOOR;
X	Level->site[i][j].p_locf = L_VAULT;
X	lset(i,j,SECRET);
X	break;
X      case 'S':
X	Level->site[i][j].locchar = FLOOR;
X	Level->site[i][j].aux = NOCITYMOVE;
X	lset(i,j,SECRET);
X	break;
X      case 'G':
X	Level->site[i][j].locchar = FLOOR;
X	make_site_monster(i,j,ML0+3);
X	break;
X      case 'u':
X	Level->site[i][j].locchar = FLOOR;
X	make_minor_undead(i,j);
X	break;
X      case 'U':
X	Level->site[i][j].locchar = FLOOR;
X	make_major_undead(i,j);
X	break;
X      case '%':
X	Level->site[i][j].showchar = WALL;
X	Level->site[i][j].locchar = FLOOR;
X	Level->site[i][j].p_locf = L_TRAP_SIREN;
X	make_site_treasure(i,j,5);
X	Level->site[i][j].aux = NOCITYMOVE;
X	lset(i,j,SECRET);
X	break;
X      case '$':
X	Level->site[i][j].locchar = FLOOR;
X	make_site_treasure(i,j,5);
X	break;
X      case '2':
X	Level->site[i][j].locchar = ALTAR;
X	Level->site[i][j].p_locf = L_ALTAR;
X	Level->site[i][j].aux = ODIN;
X	break;
X      case '3':
X	Level->site[i][j].locchar = ALTAR;
X	Level->site[i][j].p_locf = L_ALTAR;
X	Level->site[i][j].aux = SET;
X	break;
X      case '4':
X	Level->site[i][j].locchar = ALTAR;
X	Level->site[i][j].p_locf = L_ALTAR;
X	Level->site[i][j].aux = ATHENA;
X	break;
X      case '5':
X	Level->site[i][j].locchar = ALTAR;
X	Level->site[i][j].p_locf = L_ALTAR;
X	Level->site[i][j].aux = HECATE;
X	break;
X      case '6':
X	Level->site[i][j].locchar = ALTAR;
X	Level->site[i][j].p_locf = L_ALTAR;
X	Level->site[i][j].aux = DESTINY;
X	break;
X      case 'O':
X	Level->site[i][j].locchar = OPEN_DOOR;
X	Level->site[i][j].p_locf = L_ORACLE;
X	CitySiteList[L_ORACLE-CITYSITEBASE][1] = i;
X	CitySiteList[L_ORACLE-CITYSITEBASE][2] = j;
X	break;
X      case '^':
X	Level->site[i][j].showchar = WALL;
X	Level->site[i][j].locchar = FLOOR;
X	Level->site[i][j].p_locf = TRAP_BASE+random_range(NUMTRAPS);
X	lset(i,j,SECRET);
X	break;
X      case '"':
X	Level->site[i][j].locchar = HEDGE;
X	break;
X      case '~':
X	Level->site[i][j].locchar = WATER;
X	Level->site[i][j].p_locf = L_WATER;
X	break;
X      case '=':
X	Level->site[i][j].locchar = WATER;
X	Level->site[i][j].p_locf = L_MAGIC_POOL;
X	break;
X      case '>':
X	Level->site[i][j].locchar = DOWN;
X	Level->site[i][j].p_locf = L_SEWER;
X	break;
X      case '*':
X	Level->site[i][j].locchar = WALL;
X	Level->site[i][j].aux = 10;
X	break;
X      case '#':
X	Level->site[i][j].locchar = WALL;
X	Level->site[i][j].aux = 500;
X	break;
X      case '.':
X	Level->site[i][j].locchar = FLOOR;
X	break;
X      case ',':
X	Level->site[i][j].showchar = WALL;
X	Level->site[i][j].locchar = FLOOR;
X	Level->site[i][j].aux = NOCITYMOVE;
X	lset(i,j,SECRET);
X	break;
X      default:
X	Level->site[i][j].locchar = site;
X	break;
X      }
X
X      if (loc_statusp(i,j,SEEN)) {
X	if (loc_statusp(i,j,SECRET))
X	  Level->site[i][j].showchar = '#';
X	else Level->site[i][j].showchar = Level->site[i][j].locchar;
X      }
X    }
X    fscanf(fd,"\n");
X  }
X  City = Level;
X
X  /* make all city monsters asleep, and shorten their wakeup range to 2 */
X  /* to prevent players from being molested by vicious monsters on */
X  /* the streets */
X  for(ml=Level->mlist;ml!=NULL;ml=ml->next) {
X    m_status_reset(ml->m,AWAKE);
X    ml->m->wakeup = 2;
X  }
X  fclose(fd);
X}
X
X
Xvoid assign_city_function(x,y)
Xint x,y;
X{
X  static int setup=0;
X  static int next=0;
X  static int permutation[64]; /* number of x's in city map */
X  int i,j,k,l;
X
X  Level->site[x][y].aux = TRUE;
X
X  lset(x,y+1,STOPS);
X  lset(x+1,y,STOPS);
X  lset(x-1,y,STOPS);
X  lset(x,y-1,STOPS);
X
X
X  if (setup == 0) {
X    setup = 1;
X    for(i=0;i<64;i++)
X      permutation[i] = i;
X    for(i=0;i<500;i++) {
X      j = random_range(64);
X      k = random_range(64);
X      l = permutation[j];
X      permutation[j] = permutation[k];
X      permutation[k] = l;
X    }
X  }
X  if (next > 63) { /* in case someone changes the no. of x's */
X    Level->site[x][y].locchar = CLOSED_DOOR;
X    Level->site[x][y].p_locf = L_HOUSE;
X    if(random_range(5)) Level->site[x][y].aux = LOCKED;
X  }
X  else switch(permutation[next]) {
X  case 0:
X    Level->site[x][y].locchar = OPEN_DOOR;
X    Level->site[x][y].p_locf = L_ARMORER;
X    CitySiteList[L_ARMORER-CITYSITEBASE][1] = x;
X    CitySiteList[L_ARMORER-CITYSITEBASE][2] = y;
X    break;
X  case 1:
X    Level->site[x][y].locchar = OPEN_DOOR;
X    Level->site[x][y].p_locf = L_CLUB;
X    CitySiteList[L_CLUB-CITYSITEBASE][1] = x;
X    CitySiteList[L_CLUB-CITYSITEBASE][2] = y;
X    break;
X  case 2:
X    Level->site[x][y].locchar = OPEN_DOOR;
X    Level->site[x][y].p_locf = L_GYM;
X    CitySiteList[L_GYM-CITYSITEBASE][1] = x;
X    CitySiteList[L_GYM-CITYSITEBASE][2] = y;
X    break;
X  case 3:
X    Level->site[x][y].locchar = CLOSED_DOOR;
X    Level->site[x][y].p_locf = L_THIEVES_GUILD;
X    CitySiteList[L_THIEVES_GUILD-CITYSITEBASE][1] = x;
X    CitySiteList[L_THIEVES_GUILD-CITYSITEBASE][2] = y;
X    break;
X  case 4:
X    Level->site[x][y].locchar = OPEN_DOOR;
X    Level->site[x][y].p_locf = L_HEALER;
X    CitySiteList[L_HEALER-CITYSITEBASE][1] = x;
X    CitySiteList[L_HEALER-CITYSITEBASE][2] = y;
X    break;
X  case 5:
X    Level->site[x][y].locchar = OPEN_DOOR;
X    Level->site[x][y].p_locf = L_CASINO;
X    CitySiteList[L_CASINO-CITYSITEBASE][1] = x;
X    CitySiteList[L_CASINO-CITYSITEBASE][2] = y;
X    break;
X  case 7: 
X    Level->site[x][y].locchar = OPEN_DOOR;
X    Level->site[x][y].p_locf = L_DINER;
X    CitySiteList[L_DINER-CITYSITEBASE][1] = x;
X    CitySiteList[L_DINER-CITYSITEBASE][2] = y;
X    break;
X  case 8: 
X    Level->site[x][y].locchar = OPEN_DOOR;
X    Level->site[x][y].p_locf = L_CRAP;
X    CitySiteList[L_CRAP-CITYSITEBASE][1] = x;
X    CitySiteList[L_CRAP-CITYSITEBASE][2] = y;
X    break;
X  case 6:
X  case 9: 
X  case 20: 
X    Level->site[x][y].locchar = OPEN_DOOR;
X    Level->site[x][y].p_locf = L_COMMANDANT;
X    CitySiteList[L_COMMANDANT-CITYSITEBASE][1] = x;
X    CitySiteList[L_COMMANDANT-CITYSITEBASE][2] = y;
X    break;
X  case 21:
X    Level->site[x][y].locchar = OPEN_DOOR;
X    Level->site[x][y].p_locf = L_TAVERN;
X    CitySiteList[L_TAVERN-CITYSITEBASE][1] = x;
X    CitySiteList[L_TAVERN-CITYSITEBASE][2] = y;
X    break;
X  case 10:
X    Level->site[x][y].locchar = OPEN_DOOR;
X    Level->site[x][y].p_locf = L_ALCHEMIST;
X    CitySiteList[L_ALCHEMIST-CITYSITEBASE][1] = x;
X    CitySiteList[L_ALCHEMIST-CITYSITEBASE][2] = y;
X    break;
X  case 11:
X    Level->site[x][y].locchar = OPEN_DOOR;
X    Level->site[x][y].p_locf = L_DPW;
X    CitySiteList[L_DPW-CITYSITEBASE][1] = x;
X    CitySiteList[L_DPW-CITYSITEBASE][2] = y;
X    break;
X  case 12:
X    Level->site[x][y].locchar = OPEN_DOOR;
X    Level->site[x][y].p_locf = L_LIBRARY;
X    CitySiteList[L_LIBRARY-CITYSITEBASE][1] = x;
X    CitySiteList[L_LIBRARY-CITYSITEBASE][2] = y;
X    break;
X  case 13:
X    Level->site[x][y].locchar = OPEN_DOOR;
X    Level->site[x][y].p_locf = L_PAWN_SHOP;
X    CitySiteList[L_PAWN_SHOP-CITYSITEBASE][1] = x;
X    CitySiteList[L_PAWN_SHOP-CITYSITEBASE][2] = y;
X    break;
X  case 14:
X    Level->site[x][y].locchar = OPEN_DOOR;
X    Level->site[x][y].p_locf = L_CONDO;
X    CitySiteList[L_CONDO-CITYSITEBASE][1] = x;
X    CitySiteList[L_CONDO-CITYSITEBASE][2] = y;
X    break;
X  case 15:
X    Level->site[x][y].locchar = CLOSED_DOOR;
X    Level->site[x][y].p_locf = L_BROTHEL;
X    break;
X  default:
X    Level->site[x][y].locchar = CLOSED_DOOR;
X    switch(random_range(6)) {
X    case 0: Level->site[x][y].p_locf = L_HOVEL; break;
X    case 1: case 2: case 3:
X    case 4: Level->site[x][y].p_locf = L_HOUSE; break;
X    case 5: Level->site[x][y].p_locf = L_MANSION; break;
X    }
X    if(random_range(5)) Level->site[x][y].aux = LOCKED;
X    break;
X  }
X  next++;
X}
X
X  
X
X
X/* makes a hiscore npc for mansions */
Xvoid make_justiciar(i,j)
Xint i,j;
X{
X  pml ml = ((pml) malloc(sizeof(mltype)));
X  ml->m = ((pmt) malloc(sizeof(montype)));
X  *(ml->m) = Monsters[NPC];
X  make_hiscore_npc(ml->m,15);
X  ml->m->x = i;
X  ml->m->y = j;
X  Level->site[i][j].creature = ml->m;
X  ml->m->click = (Tick + 1) % 60;
X  ml->next = Level->mlist;
X  Level->mlist = ml;
X  m_status_reset(ml->m,AWAKE);
X}
X
X
X
X/* loads the city level */
Xvoid resurrect_guards()
X{
X  int i,j;
X  pml ml;
X  char site;
X  
X  FILE *fd;
X  
X  strcpy(Str3,OMEGALIB);
X  strcat(Str3,"ocity.dat");
X  fd = fopen(Str3,"r");
X
X
X  for(j=0;j<LENGTH;j++) {
X    for(i=0;i<WIDTH;i++) {
X      site = getc(fd);
X      if (site == 'G') {
X	make_site_monster(i,j,ML0+3);
X	Level->site[i][j].creature->monstring =
X	  salloc("undead guardsman");
X	Level->site[i][j].creature->meleef = M_MELEE_SPIRIT;
X	Level->site[i][j].creature->movef = M_MOVE_SPIRIT;
X	Level->site[i][j].creature->strikef = M_STRIKE_MISSILE;
X	Level->site[i][j].creature->immunity = EVERYTHING-pow2(NORMAL_DAMAGE);
X	Level->site[i][j].creature->hp *= 2;
X	Level->site[i][j].creature->hit *= 2;
X	Level->site[i][j].creature->dmg *= 2;
X	Level->site[i][j].creature->ac *= 2;
X	m_status_set(Level->site[i][j].creature,HOSTILE);
X	m_status_set(Level->site[i][j].creature,AWAKE);
X      }
X    }
X    fscanf(fd,"\n");
X  }
X  City = Level;
X
X  fclose(fd);
X}
X
X
Xvoid mazesite(i,j)
Xint i,j;
X{
X  static FILE *fd=NULL;
X  static int k=0;
X  char site;
X  if (fd==NULL) {
X    strcpy(Str2,OMEGALIB);
X    strcpy(Str4,"omaze .dat");
X    Str4[5]='1'+random_range(4);
X    strcat(Str2,Str4);
X    fd = fopen(Str2,"r");
X  }
X  site = getc(fd);
X  k++;
X  if (k == 282) fclose(fd);
X  switch(site) {
X  case '"':
X    Level->site[i][j].locchar = HEDGE;
X    if (random_range(10))
X      Level->site[i][j].p_locf = L_HEDGE;
X    else
X      Level->site[i][j].p_locf = L_TRIFID;
X    break;
X  case '-':
X    Level->site[i][j].locchar = CLOSED_DOOR;
X  case '.':
X    Level->site[i][j].locchar = FLOOR;
X    break;
X  case '>':
X    Level->site[i][j].locchar = DOWN;
X    Level->site[i][j].p_locf = L_SEWER;
X    break;
X  case 'z':
X    Level->site[i][j].locchar = FLOOR;
X    Level->site[i][j].p_locf = L_MAZE;
X    break;
X  case 'O':
X    Level->site[i][j].locchar = OPEN_DOOR;
X    Level->site[i][j].p_locf = L_ORACLE;
X    CitySiteList[L_ORACLE-CITYSITEBASE][1] = i;
X    CitySiteList[L_ORACLE-CITYSITEBASE][2] = j;
X    break;
X  case '?':
X    randommazesite(i,j);
X    break;
X  }
X  lreset(i,j,SEEN);
X}
X
Xvoid randommazesite(i,j)
Xint i,j;
X{
X  switch(random_range(7)) {
X  case 0: case 1:
X    Level->site[i][j].locchar = FLOOR;
X    Level->site[i][j].p_locf = TRAP_BASE+random_range(NUMTRAPS);
X    break;
X  case 2: case 3:
X    Level->site[i][j].locchar = FLOOR;
X    make_site_monster(i,j,-1);
X    break;
X  case 4: case 5:
X    Level->site[i][j].locchar = FLOOR;
X    make_site_treasure(i,j,5);
X    break;
X  default:
X    Level->site[i][j].locchar = FLOOR;    
X  }
X}
X
X
X/* undead are not hostile unless disturbed.... */
Xvoid make_minor_undead(i,j)
Xint i,j;
X{
X  int mid;
X  if (random_range(2)) mid = ML2+6; /*ghost */
X  else mid = ML4+5; /*haunt*/
X  make_site_monster(i,j,mid);
X  m_status_reset(Level->site[i][j].creature,AWAKE);
X  m_status_reset(Level->site[i][j].creature,HOSTILE);
X}    
X
X/* undead are not hostile unless disturbed.... */
Xvoid make_major_undead(i,j)
Xint i,j;
X{
X  int mid;
X  if (random_range(2)) mid = ML6+5; /* lich */
X  else mid = ML9+5; /*vampire lord*/
X  make_site_monster(i,j,mid);
X  m_status_reset(Level->site[i][j].creature,AWAKE);
X  m_status_reset(Level->site[i][j].creature,HOSTILE);
X}    
X
X
Xstatic char jail[11][5] = 
X{
X   '#', '#', '*', '#', '#', '*', '#', '#', '*', '#', '#',
X   '#', '#', '*', '#', '#', '*', '#', '*', '#', '#', '#',  
X   '#', '#', 'T', '#', 'T', '#', 'T', '#', 'T', '#', '#',  
X   '#', '#', '7', '#', '7', '#', '7', '#', '7', '#', '#',  
X   '#', '#', 'R', '#', 'R', '#', 'R', '#', 'R', '#', '#', 
X};
X
X/* fixes up the jail in case it has been munged by player action */
Xvoid repair_jail()
X{
X  int i,j;
X  for(i=0;i<11;i++)
X    for(j=0;j<5;j++) {
X      switch(jail[i][j]) {
X      case '#':
X	City->site[i+35][j+52].locchar = WALL;
X	City->site[i+35][j+52].p_locf = L_NO_OP;
X	City->site[i+35][j+52].aux = 666;
X	break;
X      case '*':
X	City->site[i+35][j+52].locchar = WALL;
X	City->site[i+35][j+52].p_locf = L_NO_OP;
X	City->site[i+35][j+52].aux = 10;
X	break;
X      case 'T':
X	City->site[i+35][j+52].locchar = FLOOR;
X	City->site[i+35][j+52].p_locf = L_PORTCULLIS_TRAP;
X	City->site[i+35][j+52].aux = NOCITYMOVE;
X	break;
X      case '7':
X	City->site[i+35][j+52].locchar = FLOOR;
X	City->site[i+35][j+52].p_locf = L_PORTCULLIS;
X	City->site[i+35][j+52].aux = NOCITYMOVE;
X	break;
X      case 'R':
X	City->site[i+35][j+52].locchar = FLOOR;
X	City->site[i+35][j+52].p_locf = L_RAISE_PORTCULLIS;
X	City->site[i+35][j+52].aux = NOCITYMOVE;
X	break;
X      }
X    }
X}
END_OF_FILE
if test 16797 -ne `wc -c <'ocity.c'`; then
    echo shar: \"'ocity.c'\" unpacked with wrong size!
fi
# end of 'ocity.c'
fi
if test -f 'olev.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'olev.c'\"
else
echo shar: Extracting \"'olev.c'\" \(15956 characters\)
sed "s/^X//" >'olev.c' <<'END_OF_FILE'
X/* omega copyright (c) 1987,1988 by Laurence Raphael Brothers */
X/* olev.c */
X
X#include "oglob.h"
X
X/* Functions dealing with dungeon and country levels aside from actual
Xlevel structure generation */
X
X
X/* monsters for tactical encounters */
Xvoid make_country_monsters(terrain)
Xchar terrain;
X{
X  pml tml,ml=NULL;
X  static int plains[10] = 
X    {BUNNY,BUNNY,BLACKSNAKE,HAWK,IMPALA,WOLF,LION,BRIGAND,RANDOM};
X  static int forest[10] =
X   {BUNNY,QUAIL,HAWK,BADGER,DEER,DEER,WOLF,BEAR,BRIGAND,RANDOM};
X  static int jungle[10] =
X    {ANTEATER,PARROT,MAMBA,ANT,ANT,HYENA,HYENA,ELEPHANT,LION,RANDOM};
X  static int river[10] =
X    {QUAIL,TROUT,TROUT,MANOWAR,BASS,BASS,CROC,CROC,BRIGAND,RANDOM};
X  static int swamp[10] =
X    {BASS,BASS,CROC,CROC,BOGTHING,ANT,ANT,RANDOM,RANDOM,RANDOM};
X  static int desert[10] =
X    {HAWK,HAWK,CAMEL,CAMEL,HYENA,HYENA,LION,LION,RANDOM,RANDOM};
X  static int tundra[10] =
X    {WOLF,WOLF,BEAR,BEAR,DEER,DEER,RANDOM,RANDOM,RANDOM,RANDOM};
X  static int mountain[10] =
X    {BUNNY,SHEEP,WOLF,WOLF,HAWK,HAWK,HAWK,RANDOM,RANDOM,RANDOM};
X  int *monsters,i,nummonsters;
X
X  nummonsters = (random_range(5)+1) * (random_range(3)+1);
X
X  switch(terrain) {
X  case PLAINS: monsters = plains; break;
X  case FOREST: monsters = forest; break;
X  case JUNGLE: monsters = jungle; break;
X  case RIVER: monsters = river; break;
X  case SWAMP: monsters = swamp; break;
X  case MOUNTAINS: case PASS: case VOLCANO: monsters = mountain; break;
X  case DESERT: monsters = desert; break;
X  case TUNDRA: monsters = tundra; break;
X  default: monsters = NULL;
X  }
X  for(i=0;i<nummonsters;i++) {
X    tml = ((pml) malloc(sizeof(mltype)));
X    tml->m = ((pmt) malloc(sizeof(montype)));
X    if (monsters == NULL) tml->m = 
X      m_create(random_range(WIDTH),random_range(LENGTH),TRUE,difficulty());
X    else {
X      tml->m = make_creature(*(monsters+random_range(10)));
X      tml->m->x = random_range(WIDTH);
X      tml->m->y = random_range(LENGTH);
X    }
X    Level->site[tml->m->x][tml->m->y].creature = tml->m;
X    tml->m->sense = WIDTH;
X    if (m_statusp(tml->m,ONLYSWIM)) {
X      Level->site[tml->m->x][tml->m->y].locchar = WATER;
X      Level->site[tml->m->x][tml->m->y].p_locf = L_WATER;
X    }
X
X    tml->next = ml;
X    ml = tml;
X  }
X  Level->mlist = ml;
X}
X
X
X
X/* monstertype is more or less Current_Dungeon */
X/* The caves and sewers get harder as you penetrate them; the castle
Xis completely random, but also gets harder as it is explored;
Xthe astral and the volcano just stay hard... */
Xvoid populate_level(monstertype)
Xint monstertype;
X{
X  pml head,tml;
X  int i,j,k,monsterid,nummonsters=(random_range(difficulty()/3)+1)*3+8;
X
X  if (monstertype == E_CASTLE) nummonsters += 10;
X  else if (monstertype == E_ASTRAL) nummonsters += 10;
X  else if (monstertype == E_VOLCANO) nummonsters += 20;
X
X  head = tml = ((pml) malloc(sizeof(mltype)));
X
X  for(k=0;k<nummonsters;k++) {
X
X    findspace(&i,&j,-1);
X
X    switch(monstertype) {
X    case E_CAVES:
X      if (Level->depth*10+random_range(100) > 150) 
X	monsterid = ML3+7; /* Goblin Shaman*/
X      else if (Level->depth*10+random_range(100) > 100) 
X	monsterid = ML2+9; /* Goblin Chieftain */
X      else if (random_range(100) > 50) monsterid = ML1+6; /* Goblin */
X      else monsterid = -1; /* IE, random monster */
X      break;
X    case E_SEWERS:
X      if (! random_range(3)) monsterid = -1;
X      else switch(random_range(Level->depth+3)) {
X      case 0: monsterid = ML1+3; break; /* sewer rat */
X      case 1: monsterid = ML1+4; break; /* aggravator fungus */
X      case 2: monsterid = ML1+5; break; /* blipper rat */
X      case 3: monsterid = ML2+1; break; /* night gaunt */
X      case 4: monsterid = ML2+5; break; /* transparent nasty */
X      case 5: monsterid = ML2+8; break; /* murk fungus */
X      case 6: monsterid = ML3+1; break; /* catoblepas */
X      case 7: monsterid = ML3+3; break; /* acid cloud */
X      case 8: monsterid = ML4+3; break; /* denebian slime devil */
X      case 9: monsterid = ML4+8; break; /* giant crocodile */
X      case 10: monsterid = ML5+1; break; /* tesla monster */
X      case 11: monsterid = ML5+7; break; /* shadow spirit */
X      case 12: monsterid = ML5+8; break; /* bogthing */
X      case 13: monsterid = ML6+2; break; /* water elemental */
X      case 14: monsterid = ML6+6; break; /* triton */
X      case 15: monsterid = ML7+3; break; /* ROUS */
X      default: monsterid = -1; break;
X      }
X      break;
X    case E_ASTRAL:
X      if (random_range(2)) /* random astral creatures */
X	switch(random_range(12)) {
X	case 0: monsterid = ML3+14; break; /* thought form */
X	case 1: monsterid = ML4+11; break; /* astral fuzzy */
X	case 2: monsterid = ML4+15; break; /* ban sidhe */
X	case 3: monsterid = ML4+16; break; /* astral grue */
X	case 4: monsterid = ML5+7; break; /* shadow spirit */
X	case 5: monsterid = ML5+9; break; /* astral vampire */
X	case 6: monsterid = ML5+11; break; /* manaburst */
X	case 7: monsterid = ML6+9; break; /* rakshasa */
X	case 8: monsterid = ML7+4; break; /* illusory fiend */
X	case 9: monsterid = ML7+9; break; /* mirror master */
X	case 10: monsterid = ML7+10; break; /* elder etheric grue */
X	case 11: monsterid = ML8+8; break; /* shadow slayer */
X	}
X      else if (random_range(2) && (Level->depth == 1)) /* plane of earth */
X	monsterid = ML6+3; /* earth elemental */
X      else if (random_range(2) && (Level->depth == 2)) /* plane of air */
X	monsterid = ML6+1;  /* air elemental */
X      else if (random_range(2) && (Level->depth == 3)) /* plane of water */
X	monsterid = ML6+2;  /* water elemental */
X      else if (random_range(2) && (Level->depth == 4)) /* plane of fire */
X	monsterid = ML6+0;  /* fire elemental */
X      else if (random_range(2) && (Level->depth == 5)) /* deep astral */
X	switch (random_range(12)) {
X	case 0:monsterid = ML2+1; break; /* night gaunt */
X	case 1:monsterid = ML4+12; break; /* servant of law */
X	case 2:monsterid = ML4+13; break; /* servant of chaos */
X	case 3:monsterid = ML5+4; break; /* lesser frost demon */
X	case 4:monsterid = ML5+12; break; /* outer circle demon */
X	case 5:monsterid = ML6+10; break; /* demon serpent */
X	case 6:monsterid = ML6+11; break; /* angel */
X	case 7:monsterid = ML7+14; break; /* inner circle demon */
X	case 8:monsterid = ML8+5; break; /* frost demon lord */
X	case 9:monsterid = ML8+11; break; /* high angel */
X	case 10:monsterid = ML9+7; break; /* prime circle demon */
X	case 11:monsterid = ML9+6; break; /* archangel */
X	}
X      else monsterid = -1;
X      break;
X    case E_VOLCANO:
X      if (random_range(2)) {
X	do monsterid = random_range(ML10-ML4)+ML4;
X	while (Monsters[monsterid].uniqueness != COMMON);
X      }
X      else switch(random_range(Level->depth/2+2)) { /* evil & fire creatures */
X      case 0: monsterid = ML4+5; break;
X      case 1: monsterid = ML4+6; break;
X      case 2: monsterid = ML5+0; break;
X      case 3: monsterid = ML5+4; break;
X      case 4: monsterid = ML5+5; break;
X      case 5: monsterid = ML5+10; break;
X      case 6: monsterid = ML6+0; break;
X      case 7: monsterid = ML6+5; break;
X      case 8: monsterid = ML6+9; break;
X      case 9: monsterid = ML6+10; break;
X      case 10: monsterid = ML7+1; break;
X      case 11: monsterid = ML7+6; break;
X      case 12: monsterid = ML7+11; break;
X      case 13: monsterid = ML7+12; break;
X      case 14: monsterid = ML7+14; break;
X      case 15: monsterid = ML7+3; break; 
X      case 16: monsterid = ML8+3; break; 
X      case 17: monsterid = ML8+5; break; 
X      case 18: monsterid = ML8+8; break; 
X      case 19: monsterid = ML7+3; break; 
X      case 20: monsterid = ML9+5; break; 
X      case 21: monsterid = ML9+7; break; 
X      default: monsterid = -1; break;
X      }
X      break;      
X    case E_CASTLE: 
X      if (random_range(4)==1) {
X	if (difficulty() < 5)
X	  monsterid = ML2+7;
X	else if (difficulty() < 6)
X	  monsterid = ML5+6;
X	else if (difficulty() < 8)
X	  monsterid = ML6+0;
X	else monsterid = ML9+4;
X      }
X      else monsterid = -1;
X    break;
X
X    default: monsterid = -1; break;
X    }
X    
X    if (monsterid > -1)
X      Level->site[i][j].creature = make_creature(monsterid);
X    else Level->site[i][j].creature = m_create(i,j,TRUE,difficulty());
X
X
X    Level->site[i][j].creature->x = i;
X    Level->site[i][j].creature->y = j;
X    
X    if (m_statusp(Level->site[i][j].creature,ONLYSWIM)) {
X      Level->site[i][j].locchar = WATER;
X      Level->site[i][j].p_locf = L_WATER;
X    }
X    
X    tml->next = ((pml) malloc(sizeof(mltype)));
X    tml->next->m = Level->site[i][j].creature;
X    tml = tml->next;
X  }
X  
X  if (Level->mlist==NULL) {
X    tml->next = NULL;
X    Level->mlist = head->next;
X  }
X  else {
X    tml->next = Level->mlist;
X    Level->mlist = head->next;
X  }
X}
X
X
X
X/* Add a wandering monster possibly */
Xvoid wandercheck()
X{
X  int x,y;
X  pml tml;
X  if (random_range(MaxDungeonLevels) < difficulty()) {
X    findspace(&x,&y,-1);
X    tml = ((pml) malloc(sizeof(mltype)));
X    tml->next = Level->mlist;
X    tml->m = Level->site[x][y].creature = m_create(x,y,WANDERING,difficulty());
X    Level->mlist = tml;    
X  }
X}
X
X
X
X/* call make_creature and place created monster on Level->mlist and Level */
Xvoid make_site_monster(i,j,mid)
Xint i,j,mid;
X{
X  pml ml = ((pml) malloc(sizeof(mltype)));
X  pmt m;
X  if (mid > -1)  Level->site[i][j].creature = (m = make_creature(mid));
X  else Level->site[i][j].creature = (m = m_create(i,j,WANDERING,difficulty()));
X  m->x = i;
X  m->y = j;
X  ml->m = m;
X  ml->next = Level->mlist;
X  Level->mlist = ml;
X}
X
X
X/* make and return an appropriate monster for the level and depth*/
X/* called by populate_level, doesn't actually add to mlist for some reason*/
X/* eventually to be more intelligent */
Xpmt m_create(x,y,kind,level)
Xint x,y,kind,level;
X{
X  pmt newmonster;
X  int monster_range;
X  int mid;
X
X  switch(level) {
X    case 0:monster_range = ML1; break;
X    case 1:monster_range = ML2; break;
X    case 2:monster_range = ML3; break;
X    case 3:monster_range = ML4; break;
X    case 4:monster_range = ML5; break;
X    case 5:monster_range = ML6; break;
X    case 6:monster_range = ML7; break;
X    case 7:monster_range = ML8; break;
X    case 8:monster_range = ML9; break;
X    case 9:monster_range = ML10; break;
X    default:monster_range = NUMMONSTERS; break;
X  }
X
X  do 
X    mid = random_range(monster_range);
X  while (Monsters[mid].uniqueness != COMMON); 
X  newmonster = make_creature(mid);
X
X  /* no duplicates of unique monsters */
X  if (kind == WANDERING) m_status_set(newmonster,WANDERING);
X  newmonster->x = x;
X  newmonster->y = y;
X  return(newmonster);
X}
X
X
X
X/* make creature # mid, totally random if mid == -1 */
X/* make creature allocates space for the creature */
Xpmt make_creature(mid)
Xint mid;
X{
X  pmt newmonster = ((pmt) malloc(sizeof(montype)));
X  pob ob;
X  int i,treasures;
X
X  if (mid == -1) mid = random_range(ML9);
X  *newmonster = Monsters[mid];
X  if ((mid == ML6+11) || (mid == ML8+11) || (mid == ML9+6)) {
X    /* aux1 field of an angel is its deity */
X    newmonster->aux1 = random_range(6)+1;
X    newmonster->corpsestr = salloc(Monsters[mid].corpsestr);
X    strcpy(Str3,Monsters[mid].monstring);
X    switch(newmonster->aux1) {
X    case ODIN: strcat(Str3," of Odin"); break;
X    case SET: strcat(Str3," of Set"); break;
X    case HECATE: strcat(Str3," of Hecate"); break;
X    case ATHENA: strcat(Str3," of Athena"); break;
X    case DESTINY: strcat(Str3," of Destiny"); break;
X    case DRUID: strcat(Str3," of the Balance"); break;
X    }
X    newmonster->monstring = salloc(Str3);
X  }
X  else if (mid == ML0+7) { 
X    /* generic 0th level human */
X    newmonster->monstring = salloc(mantype());
X    strcpy(Str1,"dead ");
X    strcat(Str1,newmonster->monstring);
X    newmonster->corpsestr = salloc(Str1);
X  }
X  else if (newmonster->monchar == '!') {
X    /* the nymph/satyr and incubus/succubus */
X    if (Player.preference == 'f') {
X      newmonster->monchar = 'n';
X      newmonster->monstring = salloc("nymph");
X      newmonster->corpsestr = salloc("dead nymph");
X    }
X    else {
X      newmonster->monchar = 's';
X      newmonster->monstring = salloc("satyr");
X      newmonster->corpsestr = salloc("dead satyr");
X    }
X    if (newmonster->id == ML4+6) {
X      if (Player.preference == 'f') 
X	newmonster->corpsestr = salloc("dead succubus");
X      else newmonster->corpsestr = salloc("dead incubus");
X    }
X  }
X  if (mid == NPC)
X    make_log_npc(newmonster);
X  else {
X    if (newmonster->sleep < random_range(100))
X      m_status_set(newmonster,AWAKE);
X    if (newmonster->startthing > -1) {
X      ob = ((pob) malloc(sizeof(objtype)));    
X      *ob = Objects[newmonster->startthing];
X      m_pickup(newmonster,ob);
X    }
X    treasures = random_range(newmonster->treasure);
X    for(i=0;i<treasures;i++) {
X      ob = ((pob) malloc(sizeof(objtype)));    
X      do ob = ((pob) (create_object(newmonster->level)));
X      while (ob->uniqueness != 0);
X      m_pickup(newmonster,ob);
X    }
X  }
X  newmonster->click = (Tick + 1) % 50;
X  return(newmonster);
X}
X
X
X
X
X/* drop treasures randomly onto level */
Xvoid stock_level()
X{
X  int i,j,k,numtreasures=2*random_range(difficulty()/4)+4;
X
X  /* put cash anywhere, including walls, put other treasures only on floor */
X  for (k=0;k<numtreasures+10;k++) {
X    do {
X      i = random_range(WIDTH);
X      j = random_range(LENGTH);
X    } while (Level->site[i][j].locchar != FLOOR);
X    make_site_treasure(i,j,difficulty());
X    i = random_range(WIDTH);
X    j = random_range(LENGTH);
X    Level->site[i][j].things = ((pol) malloc(sizeof(oltype)));
X    Level->site[i][j].things->thing = ((pob) malloc(sizeof(objtype)));
X    make_cash(Level->site[i][j].things->thing,difficulty());
X    Level->site[i][j].things->next = NULL;
X    /* caves have more random cash strewn around */
X    if (Current_Dungeon == E_CAVES) {
X      i = random_range(WIDTH);
X      j = random_range(LENGTH);
X      Level->site[i][j].things = ((pol) malloc(sizeof(oltype)));
X      Level->site[i][j].things->thing = ((pob) malloc(sizeof(objtype)));
X      make_cash(Level->site[i][j].things->thing,difficulty());
X      Level->site[i][j].things->next = NULL;
X      i = random_range(WIDTH);
X      j = random_range(LENGTH);
X      Level->site[i][j].things = ((pol) malloc(sizeof(oltype)));
X      Level->site[i][j].things->thing = ((pob) malloc(sizeof(objtype)));
X      make_cash(Level->site[i][j].things->thing,difficulty());
X      Level->site[i][j].things->next = NULL;
X    }
X  }
X}
X
X
X/* make a new object (of at most level itemlevel) at site i,j on level*/
Xvoid make_site_treasure(i,j,itemlevel)
Xint i,j,itemlevel;
X{
X  pol tmp = ((pol) malloc(sizeof(oltype)));
X  tmp->thing = ((pob) create_object(itemlevel));
X  tmp->next = Level->site[i][j].things;
X  Level->site[i][j].things = tmp;
X}
X
X/* make a specific new object at site i,j on level*/
Xvoid make_specific_treasure(i,j,itemid)
Xint i,j,itemid;
X{
X  pol tmp = ((pol) malloc(sizeof(oltype)));
X  tmp->thing = ((pob) malloc(sizeof(objtype)));
X  *(tmp->thing) = Objects[itemid];
X  tmp->next = Level->site[i][j].things;
X  Level->site[i][j].things = tmp;
X}
X
X
X
X/* returns a "level of difficulty" based on current environment
X   and depth in dungeon. Is somewhat arbitrary. value between 1 and 10.
X   May not actually represent real difficulty, but instead level
X   of items, monsters encountered.    */
Xint difficulty()
X{
X  int depth = 1;
X  if (Level != NULL) depth = Level->depth;
X  switch(Current_Environment) {
X  case E_COUNTRYSIDE: return(7); break;
X  case E_CITY: return(3); break;
X  case E_VILLAGE: return(1); break;
X  case E_TACTICAL_MAP: return(7); break;
X  case E_SEWERS: return(depth/6)+3;break;
X  case E_CASTLE: return(depth/4)+4;break;
X  case E_CAVES: return(depth/3)+1;break;
X  case E_VOLCANO: return(depth/4)+5;break;
X  case E_ASTRAL: return(8);break;
X  case E_ARENA: return(5);break;
X  case E_HOVEL: return(3);break;
X  case E_MANSION: return(7);break;
X  case E_HOUSE: return(5);break;
X  case E_DLAIR: return(9);break;
X  case E_ABYSS: return(10);break;
X  case E_STARPEAK: return(9);break;
X  case E_CIRCLE: return(8);break;
X  case E_MAGIC_ISLE: return(8);break;
X  case E_TEMPLE: return(8);break;
X  default: return(3); break;
X  }
X}
END_OF_FILE
if test 15956 -ne `wc -c <'olev.c'`; then
    echo shar: \"'olev.c'\" unpacked with wrong size!
fi
# end of 'olev.c'
fi
if test -f 'ospell.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'ospell.c'\"
else
echo shar: Extracting \"'ospell.c'\" \(16531 characters\)
sed "s/^X//" >'ospell.c' <<'END_OF_FILE'
X/* omega copyright (C) by Laurence Raphael Brothers, 1987,1988 */
X/* ospell.c */
X/* functions having to do with spellcasting */
X
X#include "oglob.h"
X
X
Xvoid s_wish()
X{
X  if (random_range(100) > Player.iq+Player.pow+Player.level) {
X    mprint("Your concentration is flawed!");
X    mprint("The spell energy backfires!");
X    p_damage(random_range(Spells[S_WISH].powerdrain),
X	     UNSTOPPABLE,
X	     "a backfired wish spell");
X  }
X  else {
X    wish(0);
X    mprint("The power of the spell is too much for you to withstand!");
X    mprint("All memory of the spell is expunged from your brain.");
X    Spells[S_WISH].known = FALSE;
X  }
X}
X
Xvoid s_firebolt()
X{
X  int x=Player.x,y=Player.y;
X  setspot(&x,&y);
X  fbolt(Player.x,Player.y,x,y,Player.dex*2+Player.level,Player.level*10+10);
X}
X
Xvoid s_missile()
X{
X  int x=Player.x,y=Player.y;
X  setspot(&x,&y);
X  nbolt(Player.x,Player.y,x,y,Player.dex*2+Player.level,Player.level*3+3);
X}
X
Xvoid s_teleport()
X{
X  p_teleport(0);
X}
X
Xvoid s_disrupt()
X{
X  int x=Player.x,y=Player.y;
X  setspot(&x,&y);
X  disrupt(x,y,Player.level*10+25);
X}
X
X
Xvoid s_disintegrate()
X{
X  int x=Player.x,y=Player.y;
X  setspot(&x,&y);
X  disintegrate(x,y);
X}
X
X
Xvoid s_sleep()
X{
X  sleep_monster(0);
X}
X
Xvoid s_heal()
X{
X  heal(3);
X}
X
Xvoid s_dispel()
X{
X  dispel((Player.level+Player.maxpow)/10); 
X}
X
Xvoid s_breathe()
X{
X  breathe(0);
X}
X
Xvoid s_invisible()
X{
X  invisible(0);
X}
X
X
Xvoid s_warp()
X{
X  warp(1);
X}
X
Xvoid s_enchant()
X{
X  enchant(1);
X}
X
X
Xvoid s_bless()
X{
X  bless(0);
X}
X
X
Xvoid s_restore()
X{
X  recover_stat(0);
X}
X
X
Xvoid s_cure()
X{
X  cure(0);
X}
X
X
Xvoid s_truesight()
X{
X  truesight(0);
X}
X
X
Xvoid s_hellfire()
X{
X  int x=Player.x,y=Player.y;
X  setspot(&x,&y);
X  hellfire(x,y,0);
X}
X
X
Xvoid s_knowledge()
X{
X  knowledge(0);
X}
X
X
Xvoid s_hero()
X{
X  hero(0);
X}
X
X/* spell takes longer and longer to work deeper into dungeon */
Xvoid s_return()
X{
X  mprint("You hear a whine as your spell begins to charge up.");
X  Player.status[RETURNING] = 
X    ((Current_Environment == Current_Dungeon) ? difficulty() : 1);
X}
X
Xvoid s_desecrate()
X{
X  sanctify(-1);
X}
X
X
Xvoid s_haste()
X{
X  haste(0);
X}
X
X
Xvoid s_summon()
X{
X  summon(0,-1);
X}
X
X
Xvoid s_sanctuary()
X{
X  sanctuary();
X}
X
Xvoid s_sanctify()
X{
X  sanctify(1);
X}
X
X
Xvoid s_accuracy()
X{
X  accuracy(0);
X}
X
Xvoid s_fear()
X{
X  int x = Player.x,y=Player.y;
X  setspot(&x,&y);
X  inflict_fear(x,y);
X}
X
X
X/* Has all kinds of effects in different circumstances.
X   Eventually will be more interesting */
Xvoid s_ritual()
X{
X  pob symbol;
X  int i,roomno;
X  mprint("You begin your ritual....");
X  mprint("You enter a deep trance. Time Passes...");
X  setgamestatus(SKIP_PLAYER);
X  time_clock(FALSE);
X  setgamestatus(SKIP_PLAYER);
X  time_clock(FALSE);
X  setgamestatus(SKIP_PLAYER);
X  time_clock(FALSE);
X  setgamestatus(SKIP_PLAYER);
X  time_clock(FALSE);
X  setgamestatus(SKIP_PLAYER);
X  time_clock(FALSE);
X  if (RitualHour == hour())
X    mprint("Your mental fatigue prevents from completing the ritual!");
X  else if (random_range(100) > Player.iq+Player.pow+Player.level)
X    mprint("Your concentration was broken -- the ritual fails!");
X  else {
X    mprint("You charge the ritual with magical energy and focus your will.");
X    mprint("Time Passes...");
X    setgamestatus(SKIP_PLAYER);
X    time_clock(FALSE);
X    setgamestatus(SKIP_PLAYER);
X    time_clock(FALSE);
X    setgamestatus(SKIP_PLAYER);
X    time_clock(FALSE);
X    setgamestatus(SKIP_PLAYER);
X    time_clock(FALSE);
X    setgamestatus(SKIP_PLAYER);
X    time_clock(FALSE);
X    RitualHour = hour();
X    /* set of random conditions for different ritual effects */
X    if (Current_Environment == E_CITY) {
X      mprint("Flowing waves of mystical light congeal all around you.");
X      mprint("'Like wow, man! Colors!'");
X      mprint("Appreciative citizens throw you spare change.");
X      Player.cash +=random_range(50);
X    }
X    else if ((roomno=Level->site[Player.x][Player.y].roomnumber) >= 0) {
X      if (RitualRoom == roomno)
X	mprint("For some reason the ritual doesn't work this time...");
X      else {
X	RitualRoom = roomno;
X	switch (RitualRoom) {
X	case ROOMBASE+9: /* ransacked treasure chamber */
X	  mprint("Your spell sets off frenetic growth all around you!");
X	  for(i=0;i<8;i++){
X	    Level->site[Player.x+Dirs[0][i]][Player.y+Dirs[1][i]].locchar =
X	      HEDGE;
X	    Level->site[Player.x+Dirs[0][i]][Player.y+Dirs[1][i]].p_locf =
X	      L_TRIFID;
X	  }
X	  break;
X	case ROOMBASE+22: /* boudoir */
X	  mprint("A secret panel opens next to the bed....");
X	  if (random_range(2))
X	    summon(0,ML4+6); /* succubus/incubus */
X	  else summon(0,ML4+7); /* satyr/nymph */
X	  break;
X	case ROOMBASE+26: /*shrine to high magic */
X	  mprint("A storm of mana coaelesces around you.");
X	  mprint("You are buffeted by bursts of random magic.");
X	  p_damage(random_range(Player.pow),UNSTOPPABLE,"high magic");
X	  mprint("Continue ritual? Could be dangerous.... [yn] ");
X	  if (ynq()=='y') s_wish();
X	  else mprint("The mana fades away to nothingness.");
X	  Level->site[Player.x][Player.y].roomnumber = RS_ZORCH;
X	  break;
X	case ROOMBASE+27: /* magician's lab */
X	  mprint("Your magical activity sets off a latent spell in the lab!");
X	  cast_spell(random_range(NUMSPELLS));
X	  break;
X	case ROOMBASE+28: /* pentagram room */
X	  mprint("A smoky form begins to coalesce....");
X	  summon(-1,-1);
X	  mprint("Fortunately, it seems confined to the pentagram.");
X	  m_status_reset(Level->mlist->m,MOBILE);
X	  break;
X	case ROOMBASE+29: /* blue omega room */
X	  mprint("The Lords of Destiny look upon you....");
X	  if (Player.level > 10) {
X	    mprint("A curtain of blue flames leaps up from the omega.");
X	    mprint("Enter it? [yn] ");
X	    if (ynq()=='y') l_adept();
X	  }
X	  else {
X	    if (Player.patron == DESTINY) {
X	      mprint("Your patrons take pity on you.");
X	      if ((Player.rank[PRIESTHOOD]<SPRIEST) &&
X		  (! find_item(&symbol,ARTIFACTID+19,-1))) {
X		symbol = ((pob) malloc(sizeof(objtype)));
X		*symbol = Objects[ARTIFACTID+19];
X		symbol->known = 2;
X		symbol->charge = 17;
X		gain_item(symbol);
X		mprint("You feel uplifted.");
X	      }
X	      else gain_experience(min(1000,Player.xp));
X	    }
X	    else if (random_range(3)==1) {
X	      mprint("You feel Fated.");
X	      gain_experience(Player.level*Player.level*10);
X	      Player.hp = Player.maxhp;
X	    }
X	    else if (random_range(2)) {
X	      mprint("You feel Doomed.");
X	      Player.hp = 1;
X	      Player.mana = 0;
X	      Player.xp = 0;
X	    }
X	    else mprint("The Lords of Destiny laugh at you!");
X	  }
X	  break;
X	default:
X	  mprint("Well, not much effect. Chalk it up to experience.");
X	  gain_experience(Player.level*5);
X	  break;
X	}
X      }
X    }
X    else {
X      if (RitualRoom == Level->site[Player.x][Player.y].roomnumber)
X	mprint("The ritual fails for some unexplainable reason.");
X      else {
X	mprint("The ritual seems to be generating some spell effect.");
X	RitualRoom = Level->site[Player.x][Player.y].roomnumber;
X	switch (RitualRoom) {
X	case RS_WALLSPACE:
X	  shadowform();
X	  break;
X	case RS_CORRIDOR:
X	  haste(0);
X	  break;
X	case RS_PONDS:
X	  breathe(0);
X	  break;
X	case RS_ADEPT:
X	  hero(1);
X	  break;
X	default:
X	  mprint("The ritual doesn't seem to produce any tangible results...");
X	  gain_experience(Player.level*6);
X	}
X      }
X    }
X  }
X}
X
X
X
Xvoid s_apport()
X{
X  apport(0);
X}
X
Xvoid s_shadowform()
X{
X  shadowform();
X}
X
Xvoid s_alert()
X{
X  alert(0);
X}
X
Xvoid s_regenerate()
X{
X  regenerate(0);
X}
X
Xvoid s_clairvoyance()
X{
X  clairvoyance(10);
X}
X
Xvoid s_drain()
X{
X  drain(0);
X}
X
Xvoid s_levitate()
X{
X  levitate(0);
X}
X
Xvoid s_polymorph()
X{
X  polymorph(0);
X}
X
X
X/* lball spell */
Xvoid s_lball()
X{
X  int x=Player.x,y=Player.y;
X  setspot(&x,&y);
X  lball(Player.x,Player.y,x,y,Player.level*10+10);
X}
X
Xvoid s_identify()
X{
X  identify(0);
X}
X
Xvoid s_objdet()
X{
X  objdet(1);
X}
X
Xvoid s_mondet()
X{
X  mondet(1);
X}
X
X
X/* select a spell to cast */
Xint getspell()
X{
X  int spell= -2;
X  do {
X    mprint("Cast Spell: [type spell abbrev, ?, or ESCAPE]: ");
X    spell = spellparse();
X  } while (spell < ABORT);
X  return(spell);
X}
X
X
Xchar *spellid(id)
Xint id;
X{
X  switch(id) {
X    case S_MON_DET:return("monster detection");break;
X    case S_OBJ_DET:return("object detection");break;
X    case S_IDENTIFY:return("identification");break;
X    case S_FIREBOLT:return("firebolt");break;
X    case S_LBALL:return("ball lightning");break;
X    case S_SLEEP:return("sleep");break;
X    case S_DISRUPT:return("disrupt");break;
X    case S_DISINTEGRATE:return("disintegrate");break;
X    case S_TELEPORT:return("teleport");break;
X    case S_MISSILE:return("magic missile"); break;
X    case S_HEAL:return("healing"); break;
X    case S_DISPEL:return("dispelling"); break;
X    case S_BREATHE:return("breathing"); break;
X    case S_INVISIBLE:return("invisibility"); break;
X    case S_WARP:return("the warp"); break;
X    case S_ENCHANT:return("enchantment"); break;
X    case S_BLESS:return("blessing"); break;
X    case S_RESTORE:return("restoration"); break;
X    case S_CURE:return("curing"); break;
X    case S_TRUESIGHT:return("true sight"); break;
X    case S_HELLFIRE:return("hellfire"); break;
X    case S_KNOWLEDGE:return("self knowledge"); break;
X    case S_HERO:return("heroism"); break;
X    case S_RETURN:return("return"); break;
X    case S_DESECRATE:return("desecration"); break;
X    case S_HASTE:return("haste"); break;
X    case S_SUMMON:return("summoning"); break;
X    case S_SANCTUARY:return("sanctuary"); break;
X    case S_ACCURACY:return("accuracy"); break;
X    case S_RITUAL:return("ritual magic"); break;
X    case S_APPORT:return("apportation"); break;
X    case S_SHADOWFORM:return("shadow form"); break;
X    case S_ALERT:return("alertness"); break;
X    case S_REGENERATE:return("regeneration"); break;
X    case S_SANCTIFY:return("sanctification"); break;
X    case S_CLAIRVOYANCE:return("clairvoyance"); break;
X    case S_DRAIN:return("energy drain"); break;
X    case S_LEVITATE:return("levitate"); break;
X    case S_POLYMORPH:return("polymorph"); break;
X    case S_FEAR:return("fear"); break;
X    case S_WISH:return("wishing"); break;
X    default:return("???"); break;
X  }      
X}
X
X
X
Xvoid initspells()
X{
X  int i;
X
X  for (i=0; i<NUMSPELLS; i++)
X    Spells[i].known = FALSE;
X
X  Spells[S_MON_DET].powerdrain = 3;
X  Spells[S_MON_DET].id = S_MON_DET;
X
X  Spells[S_OBJ_DET].powerdrain = 3;
X  Spells[S_OBJ_DET].id = S_OBJ_DET;
X
X  Spells[S_IDENTIFY].powerdrain = 10;
X  Spells[S_IDENTIFY].id = S_IDENTIFY;
X
X  Spells[S_FIREBOLT].powerdrain = 20;
X  Spells[S_FIREBOLT].id = S_FIREBOLT;
X
X  Spells[S_SLEEP].powerdrain = 15;
X  Spells[S_SLEEP].id = S_SLEEP;
X
X  Spells[S_LBALL].powerdrain = 25;
X  Spells[S_LBALL].id = S_LBALL;
X
X  Spells[S_TELEPORT].powerdrain = 20;
X  Spells[S_TELEPORT].id = S_TELEPORT;
X
X  Spells[S_DISRUPT].powerdrain = 30;
X  Spells[S_DISRUPT].id = S_DISRUPT;
X
X  Spells[S_DISINTEGRATE].powerdrain = 40;
X  Spells[S_DISINTEGRATE].id = S_DISINTEGRATE;
X
X  Spells[S_MISSILE].powerdrain = 10;
X  Spells[S_MISSILE].id = S_MISSILE;
X
X  Spells[S_HEAL].powerdrain = 15;
X  Spells[S_HEAL].id = S_HEAL;
X
X  Spells[S_DISPEL].powerdrain = 40;
X  Spells[S_DISPEL].id = S_DISPEL;
X
X  Spells[S_BREATHE].powerdrain = 20;
X  Spells[S_BREATHE].id = S_BREATHE;
X
X  Spells[S_INVISIBLE].powerdrain = 15;
X  Spells[S_INVISIBLE].id = S_INVISIBLE;
X
X  Spells[S_WARP].powerdrain = 50;
X  Spells[S_WARP].id = S_WARP;
X
X  Spells[S_ENCHANT].powerdrain = 30;
X  Spells[S_ENCHANT].id = S_ENCHANT;
X
X  Spells[S_BLESS].powerdrain = 30;
X  Spells[S_BLESS].id = S_BLESS;
X
X  Spells[S_RESTORE].powerdrain = 20;
X  Spells[S_RESTORE].id = S_RESTORE;
X
X  Spells[S_CURE].powerdrain = 20;
X  Spells[S_CURE].id = S_CURE;
X
X  Spells[S_TRUESIGHT].powerdrain = 20;
X  Spells[S_TRUESIGHT].id = S_TRUESIGHT;
X
X  Spells[S_HELLFIRE].powerdrain = 90;
X  Spells[S_HELLFIRE].id = S_HELLFIRE;
X
X  Spells[S_KNOWLEDGE].powerdrain = 10;
X  Spells[S_KNOWLEDGE].id = S_KNOWLEDGE;
X
X  Spells[S_HERO].powerdrain = 20;
X  Spells[S_HERO].id = S_HERO;
X
X  Spells[S_RETURN].powerdrain = 10;
X  Spells[S_RETURN].id = S_RETURN;
X
X  Spells[S_DESECRATE].powerdrain = 50;
X  Spells[S_DESECRATE].id = S_DESECRATE;
X
X  Spells[S_HASTE].powerdrain = 15;
X  Spells[S_HASTE].id = S_HASTE;
X
X  Spells[S_SUMMON].powerdrain = 20;
X  Spells[S_SUMMON].id = S_SUMMON;
X
X  Spells[S_SANCTUARY].powerdrain = 75;
X  Spells[S_SANCTUARY].id = S_SANCTUARY;
X
X  Spells[S_ACCURACY].powerdrain = 20;
X  Spells[S_ACCURACY].id = S_ACCURACY;
X
X  Spells[S_RITUAL].powerdrain = 50;
X  Spells[S_RITUAL].id = S_RITUAL;
X
X  Spells[S_APPORT].powerdrain = 15;
X  Spells[S_APPORT].id = S_APPORT;
X
X  Spells[S_SHADOWFORM].powerdrain = 50;
X  Spells[S_SHADOWFORM].id = S_SHADOWFORM;
X
X  Spells[S_ALERT].powerdrain = 15;
X  Spells[S_ALERT].id = S_ALERT;
X
X  Spells[S_REGENERATE].powerdrain = 20;
X  Spells[S_REGENERATE].id = S_REGENERATE;
X
X  Spells[S_SANCTIFY].powerdrain = 75;
X  Spells[S_SANCTIFY].id = S_SANCTIFY;
X
X  Spells[S_CLAIRVOYANCE].powerdrain = 10;
X  Spells[S_CLAIRVOYANCE].id = S_CLAIRVOYANCE;
X
X  Spells[S_DRAIN].powerdrain = 40;
X  Spells[S_DRAIN].id = S_DRAIN;
X
X  Spells[S_LEVITATE].powerdrain = 25;
X  Spells[S_LEVITATE].id = S_LEVITATE;
X
X  Spells[S_POLYMORPH].powerdrain = 30;
X  Spells[S_POLYMORPH].id = S_POLYMORPH;
X
X  Spells[S_FEAR].powerdrain = 10;
X  Spells[S_FEAR].id = S_FEAR;
X
X  Spells[S_WISH].powerdrain = 100;
X  Spells[S_WISH].id = S_WISH;
X
X}
X
X
X
X
X
X
Xvoid cast_spell(spell)
Xint spell;
X{
X  switch(spell) {
X  case S_MON_DET:s_mondet();
X    break;
X  case S_OBJ_DET:s_objdet();
X    break;
X  case S_IDENTIFY:s_identify();
X    break;
X  case S_FIREBOLT:s_firebolt();
X    break;
X  case S_SLEEP:s_sleep();
X    break;
X  case S_LBALL:s_lball();
X    break;
X  case S_TELEPORT:s_teleport();
X    break;
X  case S_DISRUPT:s_disrupt();
X    break;
X  case S_DISINTEGRATE:s_disintegrate();
X    break;
X  case S_MISSILE:s_missile();
X    break;
X  case S_HEAL:s_heal();
X    break;
X  case S_DISPEL:s_dispel();
X    break;
X  case S_BREATHE:s_breathe();
X    break;
X  case S_INVISIBLE:s_invisible();
X    break;
X  case S_WARP:s_warp();
X    break;
X  case S_ENCHANT:s_enchant();
X    break;
X  case S_BLESS:s_bless();
X    break;
X  case S_RESTORE:s_restore();
X    break;
X  case S_CURE:s_cure();
X    break;
X  case S_TRUESIGHT:s_truesight();
X    break;
X  case S_HELLFIRE:s_hellfire();
X    break;
X  case S_KNOWLEDGE:s_knowledge();
X    break;
X  case S_HERO:s_hero();
X    break;
X  case S_RETURN:s_return();
X    break;
X  case S_DESECRATE:s_desecrate();
X    break;
X  case S_HASTE:s_haste();
X    break;
X  case S_SUMMON:s_summon();
X    break;
X  case S_SANCTUARY:s_sanctuary();
X    break;
X  case S_ACCURACY:s_accuracy();
X    break;
X  case S_RITUAL:s_ritual();
X    break;
X  case S_APPORT:s_apport();
X    break;
X  case S_SHADOWFORM:s_shadowform();
X    break;
X  case S_ALERT:s_alert();
X    break;
X  case S_REGENERATE:s_regenerate();
X    break;
X  case S_SANCTIFY:s_sanctify();
X    break;
X  case S_CLAIRVOYANCE:s_clairvoyance();
X    break;
X  case S_DRAIN:s_drain();
X    break;
X  case S_LEVITATE:s_levitate();
X    break;
X  case S_FEAR:s_fear();
X    break;
X  case S_POLYMORPH:s_polymorph();
X    break;
X  case S_WISH:s_wish();
X    break;
X  default: mprint("Your odd spell fizzles with a small 'sput'.");
X    break;
X  }
X}
X
X
X
X
X
Xint spellparse()
X{
X  int spell= -3,place=0;
X  char byte,prefix[80];
X
X  prefix[0]=0;
X
X  do {
X    byte = mgetc();
X    if ((byte >= 'A') && (byte <= 'Z')) {
X      maddch(byte+'a'-'A');
X      prefix[place] = byte+'a'-'A';
X      prefix[place+1] = 0;
X      place++;
X    }
X    else if ((byte == ' ') || ((byte >= 'a') && (byte <= 'z'))) {
X      maddch(byte);
X      prefix[place] = byte;
X      prefix[place+1] = 0;
X      place++;
X    }
X    else if ((byte == 8) || (byte == 127)) { /* ^h or delete */ 
X      prefix[place]=0;
X      if (place > 0) {
X	place--;
X	dobackspace();
X      }
X    }
X    else if (byte == '?') {
X      maddch(byte);
X      expandspellabbrevs(prefix);
X      dobackspace();
X    }
X    else if (byte == '\n')
X      spell = expandspell(prefix);
X    else if (byte == ESCAPE)
X      spell = ABORT;
X  } while (spell == -3);
X  xredraw();
X  return(spell);
X}
X
Xvoid expandspellabbrevs(prefix)
Xchar prefix[80];
X{
X  int i,printed=FALSE;
X  
X  menuclear();
X  menuprint("\nPossible Spells:\n");
X  for (i=0;i<NUMSPELLS;i++)
X    if (Spells[i].known && strprefix(prefix,spellid(i))) {
X      menuspellprint(i);
X      printed = TRUE;
X    }
X  if (! printed)
X    menuprint("\nNo spells match that prefix!");
X}
X
X
Xint expandspell(prefix)
Xchar prefix[80];
X{
X  int i,spell,matched=0;
X  
X  for (i=0;i<NUMSPELLS;i++)
X    if (Spells[i].known && strprefix(prefix,spellid(i))) {
X      spell = i;
X      matched++;
X    }
X  if (matched==0) {
X    mprint("No spells match that prefix!");
X    return(-2);
X  }
X  else if (matched > 1) {
X    mprint("That is an ambiguous abbreviation!");
X    return(-2);
X  }
X  else return(spell);
X}
X
END_OF_FILE
if test 16531 -ne `wc -c <'ospell.c'`; then
    echo shar: \"'ospell.c'\" unpacked with wrong size!
fi
# end of 'ospell.c'
fi
echo shar: End of archive 13 \(of 19\).
cp /dev/null ark13isdone
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