[comp.sources.games] v07i021: omega3 - rogue like dungeon exploration

billr@saab.CNA.TEK.COM (Bill Randle) (07/13/89)

Submitted-by: "Laurence R. Brothers"   <brothers@paul.rutgers.edu>
Posting-number: Volume 7, Issue 21
Archive-name: omega3/Part02
Supersedes: omega2: Volume 5, Issue 11-29,38-40



#! /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 2 (of 20)."
# Contents:  ogen1.c oscr.c
# Wrapped by billr@saab on Thu Jun 29 08:13:57 1989
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f 'ogen1.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'ogen1.c'\"
else
echo shar: Extracting \"'ogen1.c'\" \(17944 characters\)
sed "s/^X//" >'ogen1.c' <<'END_OF_FILE'
X/* omega copyright (c) 1987,1988,1989 by Laurence Raphael Brothers */
X/* ogen1.c */
X/* level generator functions */
X
X#include "oglob.h"
X
X
X#ifndef MSDOS
X/* bv access functions for dungeon location stati */
Xint loc_statusp(x,y,stat)
Xint x,y;
Xint stat;
X{
X  return(Level->site[x][y].lstatus & stat);
X}
X
Xvoid lset(x,y,stat)
Xint x,y;
Xint stat;
X{
X Level->site[x][y].lstatus |= stat;
X}
X
Xvoid lreset(x,y,stat)
Xint x,y;
Xint stat;
X{
X  Level->site[x][y].lstatus &= ~stat;
X}
X#endif
X
X
X
X/* Deallocate current dungeon */
Xvoid free_dungeon()
X{
X#ifndef MSDOS
X  plv tlv;
X  
X  while (Dungeon != NULL) {
X    tlv = Dungeon;
X    Dungeon = Dungeon->next;
X    free((char *) tlv);
X  }
X#else
X  if (Dungeon != NULL)
X  {
X    sprintf(Str2,"om%d*.lev",Dungeon->environment);
X    kill_levels(Str2);
X  }
X#endif
X}
X
X
X/* erase the level w/o deallocating it*/
Xvoid clear_level(dungeon_level)
Xstruct level *dungeon_level;
X{
X  int i,j;
X  if (dungeon_level != NULL) {
X    dungeon_level->generated = FALSE;
X    dungeon_level->numrooms = 0;
X    dungeon_level->tunnelled = 0;
X    dungeon_level->depth = 0;
X    dungeon_level->mlist = NULL;
X    for(i=0;i<MAXWIDTH;i++)
X      for(j=0;j<MAXLENGTH;j++) {
X	dungeon_level->site[i][j].locchar = WALL;
X	dungeon_level->site[i][j].showchar = ' ';
X	dungeon_level->site[i][j].creature = NULL;
X	dungeon_level->site[i][j].things = NULL;
X	dungeon_level->site[i][j].aux = difficulty()*20;
X	dungeon_level->site[i][j].buildaux = 0;
X	dungeon_level->site[i][j].p_locf = L_NO_OP;
X	dungeon_level->site[i][j].lstatus = 0;
X	dungeon_level->site[i][j].roomnumber = RS_WALLSPACE;
X      }
X  }
X}
X
X
X
X/* Looks for level tolevel in current dungeon which is named by
XDungeon, which may be NULL. If the level is found, and rewrite_level
Xis FALSE, and the level has already been generated, nothing happens
Xbeyond Level being set correctly. Otherwise the level is recreated
Xfrom scratch */
X
Xvoid change_level(fromlevel,tolevel,rewrite_level)
Xchar fromlevel,tolevel,rewrite_level;
X{
X  struct level *thislevel = NULL;
X#ifndef MSDOS
X  Player.sx = -1; Player.sy = -1; /* sanctuary effect dispelled */
X  thislevel = findlevel(Dungeon,tolevel);
X  deepest[Current_Environment] = max(deepest[Current_Environment],tolevel);
X  if (thislevel == NULL) {
X    thislevel = ((plv) malloc(sizeof(levtype)));
X#else
X  Player.sx = -1; Player.sy = -1; /* sanctuary effect dispelled */
X  thislevel = msdos_changelevel(Level,Current_Environment,tolevel);
X  deepest[Current_Environment] = max(deepest[Current_Environment],tolevel);
X  if (thislevel == NULL) {
X    thislevel = &TheLevel;
X#endif
X    clear_level(thislevel);
X    Level = thislevel;
X    Level->next = Dungeon;
X    Dungeon = Level;
X  }
X  Level = thislevel;
X  if ((! Level->generated) || rewrite_level) {
X    Level->environment = Current_Environment;
X    Level->depth = tolevel;
X    Level->generated = TRUE;
X    switch(Current_Environment) {
X    case E_CAVES: 
X      if ((random_range(4)==0) && (tolevel < MaxDungeonLevels))
X	room_level();
X      else cavern_level();
X      break;
X    case E_SEWERS: 
X      if ((random_range(4)==0) && (tolevel < MaxDungeonLevels))
X	room_level();
X      else sewer_level(); 
X      break;
X    case E_CASTLE:
X      room_level();
X      break;
X    case E_ASTRAL:
X      maze_level();
X      break;
X    case E_VOLCANO:
X      switch(random_range(3)) {
X      case 0: cavern_level(); break;
X      case 1: room_level(); break;
X      case 2: maze_level(); break;
X      }
X      break;
X    default: print3("This dungeon not implemented!"); break;
X    }
X    install_traps();
X    install_specials();
X    make_stairs(fromlevel);
X    make_stairs(fromlevel);
X  }
X  find_stairs(fromlevel,tolevel);
X  erase_level();
X  ScreenOffset = Player.y - (ScreenLength/2);
X  show_screen();
X  screencheck(Player.y);
X  drawvision(Player.x,Player.y);
X  /* synchronize with player on level change */
X  Player.click = (Tick+1)%60;
X  roomcheck();
X}
X
X
X#ifndef MSDOS
X/* tries to find the level of depth levelnum in dungeon; if can't find
X   it returns NULL */
Xplv findlevel(dungeon,levelnum)
Xstruct level *dungeon;
Xchar levelnum;
X{
X  if (dungeon == NULL) return(NULL);
X  else {
X    while((dungeon->next != NULL) && (dungeon->depth != levelnum))
X      dungeon = dungeon->next;
X    if (dungeon->depth == levelnum) return(dungeon);
X    else return(NULL);
X  }
X}
X#endif
X
X
X
X/* keep going in one orthogonal direction or another until we hit our */
X/* destination */
X
Xvoid straggle_corridor(fx,fy,tx,ty,loc,rsi)
Xint fx,fy,tx,ty;
Xchar loc;
Xchar rsi;
X{
X  int dx,dy;
X  while ((fx != tx) || (fy != ty)) {
X    dx = tx - fx;
X    dy = ty - fy;
X    if (random_range(abs(dx)+abs(dy)) < abs(dx))
X      corridor_crawl(&fx,&fy,sign(dx),0,random_range(abs(dx))+1,loc,rsi);
X    else corridor_crawl(&fx,&fy,0,sign(dy),random_range(abs(dy))+1,loc,rsi);
X  }
X}
X
X
X
Xvoid makedoor(x,y)
Xint x,y;
X{
X  if (random_range(20) <= Level->depth/10) {
X    Level->site[x][y].locchar = FLOOR;
X    lset(x,y,SECRET);
X  }
X  else if (random_range(20)<=Level->depth/2) {
X    Level->site[x][y].locchar = CLOSED_DOOR;
X    if (random_range(20) <= Level->depth/10) 
X      lset(x,y,SECRET);
X    if (random_range(40) <= Level->depth) 
X      Level->site[x][y].aux = LOCKED;
X    else Level->site[x][y].aux = UNLOCKED;
X  }
X  else {
X    Level->site[x][y].locchar = OPEN_DOOR;
X    Level->site[x][y].aux = UNLOCKED;
X  }
X  if (! loc_statusp(x,y,SECRET)) {
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  Level->site[x][y].p_locf = L_NO_OP; 
X  /* prevents water corridors from being instant death in sewers */
X}
X
X
Xvoid corridor_crawl(fx,fy,sx,sy,n,loc,rsi)
Xint *fx,*fy,sx,sy,n;
Xchar loc,rsi;
X{
X  int i;
X  for (i=0;i<n;i++) {
X    *fx += sx;
X    *fy += sy;
X    if ((*fx < WIDTH) && 
X	(*fx > -1) && 
X	(*fy > -1) && 
X	(*fy < LENGTH)) {
X      Level->site[*fx][*fy].locchar = loc;
X      if (Level->site[*fx][*fy].roomnumber == RS_WALLSPACE)
X	Level->site[*fx][*fy].roomnumber = rsi;
X      if (loc==WATER) 
X	Level->site[*fx][*fy].p_locf = L_WATER;
X      else if (loc==FLOOR) 
X	Level->site[*fx][*fy].p_locf = L_NO_OP;
X      else if (loc==RUBBLE)
X	Level->site[*fx][*fy].p_locf = L_RUBBLE;
X    }
X  }
X}  
X
X
X
X
X
Xchar *roomname(index)
Xint index;
X{
X  switch(index) {
X  case RS_ZORCH:strcpy(Str4,"A place zorched by high power magic.");break;
X  case RS_COURT:strcpy(Str4,"The Court of the ArchMage."); break;
X  case RS_CIRCLE:strcpy(Str4,"The Astral Demesne of the Circle of Sorcerors");
X    break;
X  case RS_MAGIC_ISLE: strcpy(Str4,"An island positively reeking of magic");
X    break;
X  case RS_STARPEAK: strcpy(Str4,"Near the oddly glowing peak of a mountain");
X    break;
X  case RS_VOLCANO: strcpy(Str4,"Deep within the bowels of the earth"); break;
X  case RS_HIGHASTRAL: strcpy(Str4,"The High Astral Plane"); break;
X  case RS_EARTHPLANE: strcpy(Str4,"The Plane of Earth"); break;
X  case RS_WATERPLANE: strcpy(Str4,"The Plane of Water"); break;
X  case RS_FIREPLANE: strcpy(Str4,"The Plane of Fire"); break;
X  case RS_AIRPLANE: strcpy(Str4,"The Plane of Air"); break;
X  case RS_KITCHEN: strcpy(Str4,"A kitchen"); break;
X  case RS_BATHROOM: strcpy(Str4,"A bathroom"); break;
X  case RS_BEDROOM: strcpy(Str4,"A bedroom"); break;
X  case RS_DININGROOM: strcpy(Str4,"A dining room"); break;
X  case RS_SECRETPASSAGE: strcpy(Str4,"A secret passage"); break;
X  case RS_CLOSET: strcpy(Str4,"A stuffy closet"); break;
X  case RS_ARENA: strcpy(Str4,"The Rampart Arena"); break;
X  case RS_DROWNED_SEWER: strcpy(Str4,"A water-filled sewer node"); break;
X  case RS_DRAINED_SEWER: strcpy(Str4,"An unused sewer node"); break;
X  case RS_SEWER_DUCT: strcpy(Str4,"A winding sewer duct"); break;
X  case RS_DESTINY: strcpy(Str4,"The Halls of Fate"); break;
X  case RS_DRUID: strcpy(Str4,"The Great Henge"); break;
X  case RS_HECATE: strcpy(Str4,"The Church of the Far Side"); break;
X  case RS_SET: strcpy(Str4,"The Temple of the Black Hand"); break;
X  case RS_ATHENA: strcpy(Str4,"The Parthenon"); break;
X  case RS_ODIN: strcpy(Str4,"The Shrine of the Noose"); break;
X  case RS_ADEPT: strcpy(Str4,"Labyrinth of The Adept's Challenge."); break;
X  case RS_WYRM: strcpy(Str4,"The Sunken Cavern of the Great Wyrm."); break;
X  case RS_OCEAN: strcpy(Str4,"The Underground Ocean."); break;
X  case RS_PONDS: strcpy(Str4,"A series of subterranean pools and streams."); break;
X  case RS_DRAGONLORD: strcpy(Str4,"The Lair of the DragonLord."); break;
X  case RS_GOBLINKING: strcpy(Str4,"The Caves of the Goblins."); break;
X  case RS_CAVERN: strcpy(Str4,"A vast natural cavern."); break;
X  case RS_CORRIDOR: strcpy(Str4,"A dimly lit corridor."); break;
X  case RS_WALLSPACE: strcpy(Str4,"A niche hollowed out of the wall."); break;
X  case ROOMBASE+0: strcpy(Str4,"An abandoned garderobe."); break;
X  case ROOMBASE+1: strcpy(Str4,"A dungeon cell."); break;
X  case ROOMBASE+2: strcpy(Str4,"A tiled chamber."); break;
X  case ROOMBASE+3: strcpy(Str4,"A crystal cavern."); break;
X  case ROOMBASE+4: strcpy(Str4,"Someone's bedroom."); break;
X  case ROOMBASE+5: strcpy(Str4,"An old storeroom."); break;
X  case ROOMBASE+6: strcpy(Str4,"A room with charred walls."); break;
X  case ROOMBASE+7: strcpy(Str4,"A marble hall."); break;
X  case ROOMBASE+8: strcpy(Str4,"An eerie cave."); break;
X  case ROOMBASE+9: strcpy(Str4,"A ransacked treasure-chamber."); break;
X  case ROOMBASE+10: strcpy(Str4,"A smoke-filled room."); break;
X  case ROOMBASE+11: strcpy(Str4,"A well-appointed apartment."); break;
X  case ROOMBASE+12: strcpy(Str4,"An antechamber."); break;
X  case ROOMBASE+13: strcpy(Str4,"An unoccupied harem."); break;
X  case ROOMBASE+14: strcpy(Str4,"A multi-purpose room."); break;
X  case ROOMBASE+15: strcpy(Str4,"A room filled with stalactites."); break;
X  case ROOMBASE+16: strcpy(Str4,"An underground greenhouse."); break;
X  case ROOMBASE+17: strcpy(Str4,"A water closet."); break;
X  case ROOMBASE+18: strcpy(Str4,"A study."); break;
X  case ROOMBASE+19: strcpy(Str4,"A living room."); break;
X  case ROOMBASE+20: strcpy(Str4,"A comfortable den."); break;
X  case ROOMBASE+21: strcpy(Str4,"An abatoir."); break;
X  case ROOMBASE+22: strcpy(Str4,"A boudoir.");break;
X  case ROOMBASE+23: strcpy(Str4,"A star chamber.");break;
X  case ROOMBASE+24: strcpy(Str4,"A manmade cavern."); break;
X  case ROOMBASE+25: strcpy(Str4,"A sewer control room");break;
X  case ROOMBASE+26: strcpy(Str4,"A shrine to High Magic"); break;
X  case ROOMBASE+27: strcpy(Str4,"A magic laboratory"); break;
X  case ROOMBASE+28: strcpy(Str4,"A room with inscribed pentagram");break;
X  case ROOMBASE+29: strcpy(Str4,"A chamber with a blue crystal omega dais");
X    break;
X  default: strcpy(Str4,"A room of mystery and allure."); break;
X  }
X  return(Str4);
X}
X
X
X
X/* puts the player on the first set of stairs from the apt level */
X/* if can't find them, just drops player anywhere.... */
Xvoid find_stairs(fromlevel,tolevel)
Xchar fromlevel;
Xchar tolevel;
X{
X  int i,j,found=FALSE;
X  char sitechar;
X  if (fromlevel > tolevel) sitechar = DOWN; else sitechar = UP;
X  for(i=0;i<WIDTH;i++)
X    for(j=0;j<LENGTH;j++) 
X      if ((Level->site[i][j].locchar == sitechar) && (! found)) { 
X	found = TRUE;
X	Player.x = i;
X	Player.y = j;
X	break;
X      }
X  if (! found) {
X    findspace(&Player.x,&Player.y,-1);
X    if (Level->environment != E_ASTRAL)
X      Level->site[Player.x][Player.y].locchar = sitechar;
X  }
X}
X
X
X
Xvoid install_traps()
X{
X  int i,j;
X  for(i=0;i<WIDTH;i++)
X    for(j=0;j<LENGTH;j++)
X      if ((Level->site[i][j].locchar == FLOOR) &&
X	  (Level->site[i][j].p_locf == L_NO_OP) &&
X	  random_range(500) <= ((int)(Level->depth/6)))
X	Level->site[i][j].p_locf = TRAP_BASE+random_range(NUMTRAPS);
X}
X
X
X
X/* x, y, is top left corner, l is length of side, rsi is room string index */
X/* baux is so all rooms will have a key field. */
Xvoid build_square_room(x,y,l,rsi,baux)
Xint x,y,l;
Xchar rsi;
Xint baux;
X{
X  int i,j;
X
X  for(i=x;i<=x+l;i++)
X    for(j=y;j<=y+l;j++){
X      Level->site[i][j].roomnumber = rsi;
X      Level->site[i][j].buildaux = baux;
X    }
X  for(i=x+1;i<x+l;i++)
X    for(j=y+1;j<y+l;j++) {
X      Level->site[i][j].locchar = FLOOR;
X      Level->site[i][j].p_locf = L_NO_OP;
X    }
X}
X
X
X
Xvoid build_room(x,y,l,rsi,baux)
Xint x,y,l;
Xchar rsi;
Xint baux;
X{
X  build_square_room(x,y,l,rsi,baux);
X}
X
Xvoid cavern_level()
X{
X  int i,fx,fy,tx,ty,t,l,e;
X  char rsi;
X
X  Level->numrooms = 1;
X
X  if ((Current_Dungeon == E_CAVES) && (Level->depth == CAVELEVELS))
X    rsi = RS_GOBLINKING;
X  else rsi = RS_CAVERN;
X  t = random_range(LENGTH/2);
X  l = random_range(WIDTH/2);
X  e = random_range(WIDTH/8)+WIDTH/8;
X  build_square_room(t,l,e,rsi,0);
X  
X  for (i=0;i<16;i++) {
X    findspace(&tx,&ty,-1);
X    fx = random_range(WIDTH-2)+1;
X    fy = random_range(LENGTH-2)+1;
X    straggle_corridor(fx,fy,tx,ty,FLOOR,RS_CORRIDOR);
X  }
X  while (random_range(3)==1) {
X    findspace(&tx,&ty,-1);
X    fx = random_range(WIDTH-2)+1;
X    fy = random_range(LENGTH-2)+1;
X    straggle_corridor(fx,fy,tx,ty,WATER,RS_PONDS);
X  }
X  if (Current_Dungeon == E_CAVES) {
X    if ((Level->depth == CAVELEVELS) && (! gamestatusp(COMPLETED_CAVES))) {
X      findspace(&tx,&ty,-1);
X      Level->mlist = ((pml) malloc(sizeof(mltype)));
X      Level->mlist->next = NULL;
X      Level->mlist->m = 
X	Level->site[tx][ty].creature = 
X	  ((pmt) make_creature(ML3+5)); /* goblin king */
X      Level->mlist->m->x = tx;
X      Level->mlist->m->y = ty;
X    }
X  }
X  else if (Current_Environment == E_VOLCANO) {
X    if (Level->depth == VOLCANOLEVELS) {
X      findspace(&tx,&ty,-1);
X      Level->mlist = ((pml) malloc(sizeof(mltype)));
X      Level->mlist->next = NULL;
X      Level->mlist->m = 
X	Level->site[tx][ty].creature = 
X	  ((pmt) make_creature(ML10+4)); /* The dark emp */
X      Level->mlist->m->x = tx;
X      Level->mlist->m->y = ty;
X    }
X  }
X  populate_level(Current_Environment);
X  stock_level();
X}
X
X
X
X
X
X
X
Xvoid sewer_level()
X{
X  int i,tx,ty,t,l,e;
X  char rsi,lchar;
X
X  Level->numrooms = random_range(3)+3;
X  rsi = RS_DRAINED_SEWER;
X  for (i=0;i<Level->numrooms;i++) {
X    do {
X      t = random_range(LENGTH-10)+1;
X      l = random_range(WIDTH-10)+1;
X      e = 4;
X    } while ((Level->site[l][t].roomnumber == rsi) ||
X	     (Level->site[l+e][t].roomnumber == rsi) ||
X	     (Level->site[l][t+e].roomnumber == rsi) ||
X	     (Level->site[l+e][t+e].roomnumber == rsi));
X    if (random_range(5)) {
X      lchar = FLOOR;
X      rsi = RS_DRAINED_SEWER;
X    }
X    else {
X      lchar = WATER;
X      rsi = RS_DROWNED_SEWER;
X    }
X    build_room(l,t,e,rsi,i);
X    sewer_corridor(l,t,-1,-1,lchar);
X    sewer_corridor(l+e,t,1,-1,lchar);
X    sewer_corridor(l,t+e,-1,1,lchar);
X    sewer_corridor(l+e,t+e,1,1,lchar);
X  }
X  if (Current_Dungeon == E_SEWERS) {
X    if ((Level->depth == SEWERLEVELS) && (! gamestatusp(COMPLETED_SEWERS))) {
X      findspace(&tx,&ty,-1);
X      Level->mlist = ((pml) malloc(sizeof(mltype)));
X      Level->mlist->next = NULL;
X      Level->mlist->m = 
X	Level->site[tx][ty].creature = 
X	  ((pmt) make_creature(ML7+5)); /* The Great Wyrm */
X      Level->mlist->m->x = tx;
X      Level->mlist->m->y = ty;
X    }
X  }
X  populate_level(Current_Environment); 
X  stock_level();
X}
X
X
X
Xvoid sewer_corridor(x,y,dx,dy,locchar)
Xint x,y,dx,dy;
Xchar locchar;
X{
X  int continuing = TRUE;
X  makedoor(x,y);
X  x+=dx;
X  y+=dy;
X  while(continuing) {
X    Level->site[x][y].locchar = locchar;
X    if (locchar == WATER)
X      Level->site[x][y].p_locf = L_WATER;
X    else Level->site[x][y].p_locf = L_NO_OP;
X    Level->site[x][y].roomnumber = RS_SEWER_DUCT;
X    x+=dx;
X    y+=dy;
X  if (locchar == WATER)
X    continuing = (inbounds(x,y) && 
X		  ((Level->site[x][y].locchar == WALL) ||
X		   (Level->site[x][y].locchar == WATER)));
X  else
X    continuing = (inbounds(x,y) && 
X		  ((Level->site[x][y].roomnumber == RS_WALLSPACE) ||
X		   (Level->site[x][y].roomnumber == RS_SEWER_DUCT)));
X  }
X  if (inbounds(x,y))
X    makedoor(x,y);
X}
X
X
X
X
Xvoid install_specials()
X{
X  int i,j,x,y;
X
X  for(x=0;x<WIDTH;x++)
X    for(y=0;y<LENGTH;y++)
X      if ((Level->site[x][y].locchar == FLOOR) &&
X	  (Level->site[x][y].p_locf == L_NO_OP) &&
X	  (random_range(300) < difficulty())) {
X	i = random_range(100);
X	if (i < 10) {
X	  Level->site[x][y].locchar = ALTAR;
X	  Level->site[x][y].p_locf = L_ALTAR;
X	  Level->site[x][y].aux = random_range(10);
X	}
X	else if (i < 20) {
X	  Level->site[x][y].locchar = WATER;
X	  Level->site[x][y].p_locf = L_MAGIC_POOL;
X	}
X	else if (i < 35) {
X	  Level->site[x][y].locchar = RUBBLE;
X	  Level->site[x][y].p_locf = L_RUBBLE;
X	}
X	else if (i < 40) {
X	  Level->site[x][y].locchar = LAVA;
X	  Level->site[x][y].p_locf = L_LAVA;
X	}
X	else if (i < 45) {
X	  Level->site[x][y].locchar = FIRE;
X	  Level->site[x][y].p_locf = L_FIRE;
X	}
X	else if ((i < 50) && (Current_Environment != E_ASTRAL)) {
X	  Level->site[x][y].locchar = LIFT;
X	  Level->site[x][y].p_locf = L_LIFT;
X	}
X	else if ((i < 55) && (Current_Environment != E_VOLCANO)) {
X	  Level->site[x][y].locchar = HEDGE;
X	  Level->site[x][y].p_locf = L_HEDGE;
X	}
X	else if (i < 57) {
X	  Level->site[x][y].locchar = HEDGE;
X	  Level->site[x][y].p_locf = L_TRIFID;
X	}
X	else if (i< 70) {
X	  Level->site[x][y].locchar = STATUE;
X	  if (random_range(100) < difficulty()) 
X	    for (j=0;j<8;j++) {
X	      if (Level->site[x+Dirs[0][j]][y+Dirs[1][j]].p_locf != L_NO_OP)
X		Level->site[x+Dirs[0][j]][y+Dirs[1][j]].locchar = FLOOR;
X	      Level->site[x+Dirs[0][j]][y+Dirs[1][j]].p_locf = 
X		L_STATUE_WAKE;
X	    }
X	}
X	else {
X	  if (Current_Environment == E_VOLCANO) {
X	    Level->site[x][y].locchar = LAVA;
X	    Level->site[x][y].p_locf = L_LAVA;
X	  }
X	  else if (Current_Environment == E_ASTRAL) {
X	    if (Level->depth == 1) {
X	      Level->site[x][y].locchar = RUBBLE;
X	      Level->site[x][y].p_locf = L_RUBBLE;
X	    }
X	    else if (Level->depth == 2) {
X	      Level->site[x][y].locchar = FIRE;
X	      Level->site[x][y].p_locf = L_FIRE;
X	    }
X	    else if (Level->depth == 3) {
X	      Level->site[x][y].locchar = WATER;
X	      Level->site[x][y].p_locf = L_WATER;
X	    }
X	    else if (Level->depth == 4) {
X	      Level->site[x][y].locchar = ABYSS;
X	      Level->site[x][y].p_locf = L_ABYSS;
X	    }
X	  }
X	  else {
X	    Level->site[x][y].locchar = WATER;
X	    Level->site[x][y].p_locf = L_WATER;
X	  }
X	}
X      }
X}
END_OF_FILE
if test 17944 -ne `wc -c <'ogen1.c'`; then
    echo shar: \"'ogen1.c'\" unpacked with wrong size!
fi
# end of 'ogen1.c'
fi
if test -f 'oscr.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'oscr.c'\"
else
echo shar: Extracting \"'oscr.c'\" \(33518 characters\)
sed "s/^X//" >'oscr.c' <<'END_OF_FILE'
X/* omega (c) 1987,1988,1989 by Laurence Raphael Brothers */
X/* oscr.c */
X/* functions that use curses routines directly */
X/* plus a few file i/o stuff */
X/* also some in ofile.c */
X
X#include <curses.h>
X#include <sys/types.h>
X#include <sys/timeb.h>
X#include "oglob.h"
X
X#ifndef MSDOS
Xchar *sprintf();
X#endif
X
X#ifdef EXCESSIVE_REDRAW
X#define wclear werase
X#endif
X
X
X/* note these variables are not exported to other files */
X
XWINDOW *Levelw,*Dataw,*Flagw,*Timew,*Menuw,*Locw,*Morew,*Phasew;
XWINDOW *Comwin,*Rightside,*Msg1w,*Msg2w,*Msg3w,*Msgw,*Packw;
XWINDOW *Hideline[MAXITEMS],*Showline[MAXITEMS];
X
Xvoid phaseprint()
X{
X  wclear(Phasew);
X  wprintw(Phasew,"Moon's Phase:\n");
X  switch(Phase/2) {
X  case 0: wprintw(Phasew,"NEW"); break;
X  case 1: case 11: wprintw(Phasew,"CRESCENT"); break;
X  case 2: case 10: wprintw(Phasew,"1/4"); break;
X  case 3: case 9: wprintw(Phasew,"HALF"); break;
X  case 4: case 8: wprintw(Phasew,"3/4"); break;
X  case 5: case 7: wprintw(Phasew,"GIBBOUS"); break;
X  case 6: wprintw(Phasew,"FULL"); break;
X  }
X}
X
Xvoid show_screen()
X{
X  int i,j,top,bottom;
X  wclear(Levelw);
X  top = ScreenOffset;
X  bottom = ScreenOffset + ScreenLength;
X  top = max(0,top);
X  bottom = min(bottom,LENGTH-1);
X  if (Current_Environment != E_COUNTRYSIDE) 
X    for (j=top;j<=bottom;j++) 
X      for (i=0;i<WIDTH;i++) {
X	wmove(Levelw,screenmod(j),i);
X	waddch(Levelw,(loc_statusp(i,j,SEEN) ?
X		       getspot(i,j,FALSE) :
X		       ' '));
X      }
X  else for (j=top;j<=bottom;j++) 
X      for (i=0;i<WIDTH;i++) {
X	wmove(Levelw,screenmod(j),i);
X	waddch(Levelw,(Country[i][j].explored ? 
X		       Country[i][j].current_terrain_type : 
X		       ' '));
X      }
X  wrefresh(Levelw);
X}
X
X
X
Xchar mgetc()
X{
X  return(wgetch(Msgw));
X}
X
X/* case insensitive mgetc -- sends uppercase to lowercase */
X#ifndef MSDOS
Xchar mcigetc()
X#else
Xint mcigetc()
X#endif
X{
X#ifndef MSDOS
X  char c = wgetch(Msgw);
X#else
X  int c;
X
X  keypad(Msgw,TRUE);
X  c = wgetch(Msgw);
X#endif
X  if ((c>='A') && (c<='Z'))
X    return(c+('a'-'A'));
X  else return(c);
X}
X
Xchar menugetc()
X{
X  return(wgetch(Menuw));
X}
X
X
Xchar lgetc()
X{
X  return(wgetch(Levelw));
X}
X
X
Xchar ynq()
X{
X  char p=' ';
X  while ((p != 'n') && (p != 'y') && (p != 'q') && (p != ESCAPE))
X    p = wgetch(Msgw);
X  switch (p) {
X    case 'y': wprintw(Msgw,"yes. "); break;
X    case 'n': wprintw(Msgw,"no. "); break;
X    case ESCAPE:
X    case 'q': wprintw(Msgw,"quit. "); break;
X    }
X  wrefresh(Msgw);
X  return(p);
X}
X
X
Xchar ynq1()
X{
X  char p=' ';
X  while ((p != 'n') && (p != 'y') && (p != 'q') && (p != ESCAPE))
X    p = wgetch(Msg1w);
X  switch (p) {
X    case 'y': wprintw(Msg1w,"yes. "); break;
X    case 'n': wprintw(Msg1w,"no. "); break;
X    case ESCAPE:
X    case 'q': wprintw(Msg1w,"quit. "); break;
X    }
X  wrefresh(Msg1w);
X  return(p);
X}
X
X
Xchar ynq2()
X{
X  char p=' ';
X  while ((p != 'n') && (p != 'y') && (p != 'q') && (p != ESCAPE))
X    p = wgetch(Msg2w);
X  switch (p) {
X    case 'y': wprintw(Msg2w,"yes. "); break;
X    case 'n': wprintw(Msg2w,"no. "); break;
X    case ESCAPE:
X    case 'q': wprintw(Msg2w,"quit. "); break;
X    }
X  wrefresh(Msg2w);
X  return(p);
X}
X    
X/* puts up a morewait to allow reading if anything in top two lines */
Xvoid checkclear()
X{
X  int x1,y,x2;
X  getyx(Msg1w,x1,y);
X  getyx(Msg2w,x2,y);  
X  if ((x1 != 0) || (x2 != 0)) {
X    morewait();
X    wclear(Msg1w);
X    wclear(Msg2w);
X    wrefresh(Msg1w);
X    wrefresh(Msg2w);
X  }
X}
X  
X/* for external call */
Xvoid clearmsg()
X{
X  wclear(Msg1w);
X  wclear(Msg2w);
X  wclear(Msg3w);
X  Msgw = Msg1w;
X  wrefresh(Msg1w);
X  wrefresh(Msg2w);
X  wrefresh(Msg3w);
X}
X
Xvoid clearmsg3()
X{
X  wclear(Msg3w);
X  wrefresh(Msg3w);
X}
X
Xvoid clearmsg1()
X{
X  wclear(Msg1w);
X  wclear(Msg2w);
X  Msgw = Msg1w;
X  wrefresh(Msg1w);
X  wrefresh(Msg2w);
X}
X
X
Xvoid erase_level()
X{
X  wclear(Levelw);
X}
X
X/* direct print to first msg line */
Xvoid print1(s)
Xchar *s;
X{
X  if (! gamestatusp(SUPPRESS_PRINTING)) {
X    buffercycle(s);
X    wclear(Msg1w);
X    wprintw(Msg1w,s);
X    wrefresh(Msg1w);
X  }
X}
X
X/* for run on-messages -- print1 clears first.... */
Xvoid nprint1(s)
Xchar *s;
X{
X  if (! gamestatusp(SUPPRESS_PRINTING)) {
X    buffercycle(s);
X    wprintw(Msg1w,s);
X    wrefresh(Msg1w);
X  }
X}
X
X
X
X
X/* direct print to second msg line */
Xvoid print2(s)
Xchar *s;
X{
X  if (! gamestatusp(SUPPRESS_PRINTING)) {
X    buffercycle(s);
X    wclear(Msg2w);
X    wprintw(Msg2w,s);
X    wrefresh(Msg2w);
X  }
X}
X
X/* for run on-messages -- print2 clears first.... */
Xvoid nprint2(s)
Xchar *s;
X{
X  if (! gamestatusp(SUPPRESS_PRINTING)) {
X    buffercycle(s);
X    wprintw(Msg2w,s);
X    wrefresh(Msg2w);
X  }
X}
X
X
X
X
X/* msg line 3 is not part of the region that mprint or printm can reach */
X/* typical use of print3 is for "you can't do that" type error messages */
Xvoid print3(s)
Xchar *s;
X{
X  if (! gamestatusp(SUPPRESS_PRINTING)) {
X    buffercycle(s);
X    wclear(Msg3w);
X    wprintw(Msg3w,s);
X    wrefresh(Msg3w);
X  }
X}
X
X/* for run on-messages -- print3 clears first.... */
Xvoid nprint3(s)
Xchar *s;
X{
X  if (! gamestatusp(SUPPRESS_PRINTING)) {
X    buffercycle(s);
X    wprintw(Msg3w,s);
X    wrefresh(Msg3w);
X  }
X}
X
X
X
X/* prints wherever cursor is in window, but checks to see if
Xit should morewait and clear window */
Xvoid mprint(s)
Xchar *s;
X{
X  int x,y;
X  if (! gamestatusp(SUPPRESS_PRINTING)) {
X    buffercycle(s);
X    getyx(Msgw,y,x);
X    if (x+strlen(s) >= WIDTH) {
X      if (Msgw == Msg1w) {
X	wclear(Msg2w);
X	Msgw = Msg2w;
X      }
X      else {
X	morewait();
X	wclear(Msg1w);
X	wclear(Msg2w);
X	wrefresh(Msg2w);
X	Msgw = Msg1w;
X      }
X    }
X    wprintw(Msgw,s);
X    waddch(Msgw,' '); 
X    wrefresh(Msgw);
X  }
X}
X
X
X
X
Xvoid title()
X{
X  showmotd();
X  /* Pseudo Random Seed */
X  Seed = (int) time((long *)NULL);
X  clear();
X  refresh();  
X  showscores();
X}
X
X
X
X
X
X/* blanks out ith line of Menuw or Levelw */
X/* This is a serious kluge, but nothing else seems to work the way
X   I want it to! */
Xvoid hide_line(i)
Xint i;
X{
X  touchwin(Hideline[i]);
X  wrefresh(Hideline[i]);
X}
X
X
X
X/* initialize, screen, windows */
Xvoid initgraf()
X{
X  int i;
X  initscr();
X  if (LINES < 24) {
X    printf("Minimum Screen Size: 24 Lines.");
X    exit(0);
X  }
X  else ScreenLength = LINES - 6;
X  Rightside = newwin(ScreenLength,15,2,65);
X  Msg1w = newwin(1,80,0,0);
X  Msg2w = newwin(1,80,1,0);
X  Msg3w = newwin(1,80,2,0);
X  Msgw = Msg1w;
X  Morew = newwin(1,15,3,65);  
X  Locw = newwin(1,80,ScreenLength+3,0);
X  Levelw = newwin(ScreenLength,64,3,0);
X  for(i=0;i<MAXITEMS;i++) {
X    Hideline[i] = newwin(1,64,i+3,0);
X    Showline[i] = newwin(1,64,i+3,0);
X    wclear(Hideline[i]);
X    wclear(Showline[i]);
X  }
X  Menuw = newwin(ScreenLength,64,3,0);
X  Packw = newwin(ScreenLength,64,3,0);
X  Dataw = newwin(2,80,ScreenLength+4,0);
X  Timew = newwin(2,15,4,65);
X  Phasew = newwin(2,15,6,65);
X  Flagw = newwin(4,15,9,65);
X  Comwin = newwin(8,15,14,65);
X
X  noecho();
X  crmode();
X
X  clear();
X  title();
X  clear();
X  refresh();
X}
X
X
X
X
X
Xvoid drawplayer()
X{
X  static int lastx= -1,lasty= -1;
X  if (Current_Environment == E_COUNTRYSIDE) {
X    wmove(Levelw,screenmod(lasty),lastx);
X    waddch(Levelw,Country[lastx][lasty].current_terrain_type);
X    wmove(Levelw,screenmod(Player.y),Player.x);
X    waddch(Levelw,PLAYER);
X  }
X  else {
X    if (inbounds(lastx,lasty))
X      plotspot(lastx,lasty,(Player.status[BLINDED]>0 ? FALSE : TRUE));
X    wmove(Levelw,screenmod(Player.y),Player.x);
X    if ((! Player.status[INVISIBLE]) || Player.status[TRUESIGHT])
X      waddch(Levelw,PLAYER);
X  }
X  lastx = Player.x;
X  lasty = Player.y;
X}
X
Xint litroom(x,y)
Xint x,y;
X{
X  if (Level->site[x][y].roomnumber < ROOMBASE) return(FALSE);
X  else return(loc_statusp(x,y,LIT) ||
X	      Player.status[ILLUMINATION]);
X}
X
Xvoid drawvision(x,y)
Xint x,y;
X{
X  static int oldx = -1,oldy = -1;
X  int i,j;
X
X  if (Current_Environment != E_COUNTRYSIDE) {
X    if (Player.status[BLINDED]) {
X      drawspot(oldx,oldy);
X      drawspot(x,y);
X      drawplayer();
X    }
X    else {
X      if (Player.status[ILLUMINATION] > 0) {
X	for (i= -2;i<3;i++)
X	  for (j= -2;j<3;j++)
X	    if (inbounds(x+i,y+j))
X	      if (view_los_p(x+i,y+j,Player.x,Player.y))
X		dodrawspot(x+i,y+j);
X      }
X      else {
X	for (i= -1;i<2;i++)
X	  for (j= -1;j<2;j++)
X	    if (inbounds(x+i,y+j))
X	      dodrawspot(x+i,y+j);
X      }
X      drawplayer();
X      drawmonsters(FALSE); /* erase all monsters */
X      drawmonsters(TRUE);  /* draw those now visible */
X    }
X    if ((! gamestatusp(FAST_MOVE)) || (! optionp(JUMPMOVE)))
X      showcursor(Player.x,Player.y);
X    oldx = x;
X    oldy = y;
X  }
X  else {
X    for (i= -1;i<2;i++)
X      for (j= -1;j<2;j++)
X	if (inbounds(x+i,y+j)) {
X	  wmove(Levelw,screenmod(y+j),x+i);
X	  Country[x+i][y+j].explored = TRUE;
X	  waddch(Levelw,Country[x+i][y+j].current_terrain_type);
X	}
X    drawplayer();
X    showcursor(Player.x,Player.y);
X  }
X}
X
X
Xvoid showcursor(x,y)
Xint x,y;
X{
X  wmove(Levelw,screenmod(y),x);
X  wrefresh(Levelw);
X}
X
Xvoid levelrefresh()
X{
X  wrefresh(Levelw);
X}
X
X
X/* draws a particular spot under if in line-of-sight */
Xvoid drawspot(x,y)
Xint x,y;
X{
X  char c;
X  if (inbounds(x,y)) {
X    c = getspot(x,y,FALSE);
X    if (c != Level->site[x][y].showchar)
X      if (view_los_p(Player.x,Player.y,x,y)) {
X	lset(x,y,SEEN);
X	Level->site[x][y].showchar = c;
X	putspot(x,y,c);
X      }
X  }
X}
X
X
X
X/* draws a particular spot regardless of line-of-sight */
Xvoid dodrawspot(x,y)
Xint x,y;
X{
X  char c;
X  if (inbounds(x,y)) {
X    c = getspot(x,y,FALSE);
X    if (c != Level->site[x][y].showchar) {
X      lset(x,y,SEEN);
X      Level->site[x][y].showchar = c;
X      putspot(x,y,c);
X    }
X  }
X}
X
X/* write a blank to a spot if it is floor */
Xvoid blankoutspot(i,j)
Xint i,j;
X{
X  if (inbounds(i,j)) {
X    lreset(i,j,LIT);
X    if (Level->site[i][j].locchar == FLOOR)  {
X      Level->site[i][j].showchar = ' ';
X      putspot(i,j,' ');
X    }
X  }
X}
X
X/* blank out a spot regardless */
Xvoid blotspot(i,j)
Xint i,j;
X{
X  if (inbounds(i,j)) {
X    lreset(i,j,SEEN);
X    Level->site[i][j].showchar = SPACE;
X    if (! offscreen(j)) {
X      wmove(Levelw,screenmod(j),i);
X      wdelch(Levelw);
X      winsch(Levelw,SPACE);
X    }
X  }
X}
X
X
X/* for displaying activity specifically at some point */
Xvoid plotspot(x,y,showmonster)
Xint x,y,showmonster;
X{
X  if (loc_statusp(x,y,SEEN))
X    putspot(x,y,getspot(x,y,showmonster));
X  else 
X    putspot(x,y,' ');
X}
X
X
X/* Puts c at x,y on screen. No fuss, no bother. */
Xvoid putspot(x,y,c)
Xint x,y;
Xchar c;
X{
X  if (! offscreen(y)) {
X    wmove(Levelw,screenmod(y),x);
X    waddch(Levelw,c);
X  }
X}
X
X
X/* regardless of line of sight, etc, draw a monster */
Xvoid plotmon(m)
Xstruct monster *m;
X{
X  if (! offscreen(m->y)) {
X    wmove(Levelw,screenmod(m->y),m->x);
X    waddch(Levelw,m->monchar);
X  }
X}
X  
X/* if display, displays monsters, otherwise erases them */
Xvoid drawmonsters(display)
Xint display;
X{
X  pml ml;
X  for (ml=Level->mlist;ml!=NULL;ml=ml->next) {
X    if (ml->m->hp > 0) {
X      if (display) {
X	if (view_los_p(Player.x,Player.y,ml->m->x,ml->m->y)) {
X	  if (Player.status[TRUESIGHT] || (! m_statusp(ml->m,M_INVISIBLE))) {
X	    if ((ml->m->level > 5) &&
X		(ml->m->monchar != '@') &&
X		(ml->m->monchar != '|')) wstandout(Levelw);
X	    putspot(ml->m->x,ml->m->y,ml->m->monchar);
X	    wstandend(Levelw);
X	  }
X	}
X      }
X      else erase_monster(ml->m);
X    }
X  }
X}
X
X/* replace monster with what would be displayed if monster weren't there */
Xvoid erase_monster(m)
Xstruct monster *m;
X{
X  if (loc_statusp(m->x,m->y,SEEN))
X    putspot(m->x,m->y,getspot(m->x,m->y,FALSE));
X  else blotspot(m->x,m->y);
X}
X
X/* find apt char to display at some location */
Xchar getspot(x,y,showmonster)
Xint x,y,showmonster;
X{
X  if (loc_statusp(x,y,SECRET)) return(WALL);
X  else switch (Level->site[x][y].locchar) {
X  case WATER:
X    if (Level->site[x][y].creature == NULL) 
X      return(WATER);
X    else if (m_statusp(Level->site[x][y].creature,SWIMMING))
X      return(WATER);
X    else if (showmonster)
X      return(Level->site[x][y].creature->monchar);
X    else return(WATER);
X    break;
X  /* these sites never show anything but their location char's */
X  case CLOSED_DOOR:
X  case LAVA:
X  case FIRE:
X  case ABYSS:
X    return(Level->site[x][y].locchar);
X    break;
X  /* rubble and hedge don't show items on their location */
X  case RUBBLE:
X  case HEDGE:
X    if (showmonster && (Level->site[x][y].creature != NULL)) {
X      if ((m_statusp(Level->site[x][y].creature,M_INVISIBLE)) &&
X	  (! Player.status[TRUESIGHT]))
X	return(getspot(x,y,FALSE));
X      else return (Level->site[x][y].creature->monchar);
X    }
X    else return(Level->site[x][y].locchar);
X    break;
X  /* everywhere else, first try to show monster, next show items, next show
X     location char */
X  default:
X    if (showmonster && (Level->site[x][y].creature != NULL)) {
X      if ((m_statusp(Level->site[x][y].creature,M_INVISIBLE)) &&
X	  (! Player.status[TRUESIGHT]))
X	return(getspot(x,y,FALSE));
X      else return (Level->site[x][y].creature->monchar);
X    }
X    else if (Level->site[x][y].things != NULL) {
X      if (Level->site[x][y].things->next != NULL)
X	return(PILE);
X      else return(Level->site[x][y].things->thing->objchar);
X    }
X    else return(Level->site[x][y].locchar);
X    break;
X  }
X}
X
Xvoid commanderror()
X{
X  wclear(Msg3w);
X  wprintw(Msg3w,"%c : unknown command",Cmd);
X  wrefresh(Msg3w);
X}
X
Xvoid timeprint()
X{
X  wclear(Timew);
X  wprintw(Timew,"%d:%d",showhour(),showminute());
X  if (showminute()==0) waddch(Timew,'0');
X  wprintw(Timew,hour()>11 ? " PM \n" : " AM \n");
X  wprintw(Timew,month());
X  wprintw(Timew," the %d",day());
X  wprintw(Timew,ordinal(day()));
X  wrefresh(Timew);
X}
X
X
Xvoid comwinprint()
X{
X  wclear(Comwin);
X  wprintw(Comwin,"Hit: %d  \n",Player.hit);
X  wprintw(Comwin,"Dmg: %d  \n",Player.dmg);
X  wprintw(Comwin,"Def: %d  \n",Player.defense);
X  wprintw(Comwin,"Arm: %d  \n",Player.absorption);
X  wprintw(Comwin,"Spd: %.2f  \n",5.0/Player.speed);
X  wrefresh(Comwin);
X}
X
Xvoid dataprint()
X{
X  wclear(Dataw);
X#ifndef MSDOS
X  wprintw(Dataw,"HP:%d/%d MANA:%d/%d AU:%d LEVEL:%d/%d CARRY:%d/%d \n",
X#else
X  wprintw(Dataw,"HP:%d/%d MANA:%ld/%ld AU:%ld LEVEL:%d/%ld CARRY:%d/%d \n",
X#endif
X	  Player.hp,Player.maxhp,Player.mana,Player.maxmana,Player.cash,
X	  Player.level,Player.xp,Player.itemweight,Player.maxweight);
X  wprintw(Dataw,"STR:%d/%d CON:%d/%d DEX:%d/%d AGI:%d/%d INT:%d/%d POW:%d/%d   ",
X	  Player.str,Player.maxstr,Player.con,Player.maxcon,
X	  Player.dex,Player.maxdex,Player.agi,Player.maxagi,
X	  Player.iq,Player.maxiq,Player.pow,Player.maxpow);
X  wrefresh(Dataw);
X  wrefresh(Dataw);
X}
X
X
X/* redraw everything currently displayed */
Xvoid redraw()
X{
X  touchwin(curscr);
X  wrefresh(curscr);
X}  
X
X/* redraw each permanent window */
Xvoid xredraw()
X{
X  wclear(Rightside);
X  wrefresh(Rightside);
X  touchwin(Msgw);
X  touchwin(Msg3w);
X  touchwin(Levelw);
X  touchwin(Timew);
X  touchwin(Flagw);
X  touchwin(Dataw);
X  touchwin(Locw);
X  touchwin(Morew);
X  touchwin(Phasew);
X  touchwin(Comwin); 
X  wrefresh(Msgw);
X  wrefresh(Msg3w);
X  wrefresh(Levelw);
X  wrefresh(Timew);
X  wrefresh(Flagw);
X  wrefresh(Dataw);
X  wrefresh(Locw);
X  wrefresh(Morew);
X  wrefresh(Phasew);
X  wrefresh(Comwin);
X}
X
X
X
Xvoid menuaddch(c)
Xchar c;
X{
X  waddch(Menuw,c);
X  wrefresh(Menuw);
X}
X
X
X
Xvoid morewait()
X{
X  int display=TRUE;
X  char c;
X  do {
X    wclear(Morew);
X    if (display) wprintw(Morew,"***  MORE  ***");
X    else wprintw(Morew,"+++  MORE  +++");
X    display = ! display;
X    wrefresh(Morew);
X    c = wgetch(Msgw);
X  } while ((c != SPACE) && (c != RETURN));
X  wclear(Morew);
X  wrefresh(Morew);
X}
X
Xint stillonblock()
X{
X  int display=TRUE;
X  char c;
X  do {
X    wclear(Morew);
X    if (display) wprintw(Morew,"<<<STAY?>>>");
X    else wprintw(Morew,">>>STAY?<<<");
X    display = ! display;
X    wrefresh(Morew);
X    c = wgetch(Msgw);
X  } while ((c != SPACE) && (c != ESCAPE));
X  wclear(Morew);
X  wrefresh(Morew);
X  return (c == SPACE);
X}
X
Xvoid menuclear()
X{
X  wclear(Menuw);
X  wrefresh(Menuw);
X}
X
Xvoid menuspellprint(i)
Xint i;
X{
X  int x,y;
X  getyx(Menuw,y,x);
X  if (y >= ScreenLength - 2) {
X    morewait();
X    wclear(Menuw);
X  }
X  wprintw(Menuw,spellid(i));
X  wprintw(Menuw,"(%d)\n",Spells[i].powerdrain);
X  wrefresh(Menuw);
X}  
X
Xvoid menuprint(s)
Xchar *s;
X{
X  int x,y;
X  getyx(Menuw,y,x);
X  if (y >= ScreenLength - 2) {
X    morewait();
X    wclear(Menuw);
X  }
X  wprintw(Menuw,s);
X  wrefresh(Menuw);
X}
X
X
X
Xvoid endgraf()
X{
Xclear();
Xrefresh();
Xendwin();
X}
X
X
Xvoid plotchar(pyx,x,y)
Xchar pyx;
Xint x,y;
X{
X  if (! offscreen(y)) {
X    wmove(Levelw,screenmod(y),x);
X    waddch(Levelw,pyx);
X    wrefresh(Levelw);
X  }
X}
X
X
X
Xvoid draw_explosion(pyx,x,y)
Xchar pyx;
Xint x,y;
X{
X  int i,j;
X  
X  for(j=0;j<3;j++) {
X    for(i=0;i<9;i++) 
X      plotchar(pyx,x+Dirs[0][i],y+Dirs[1][i]);
X    for(i=0;i<9;i++)
X      plotchar(' ',x+Dirs[0][i],y+Dirs[1][i]);
X  }
X  for(i=0;i<9;i++) 
X    plotspot(x+Dirs[0][i],y+Dirs[1][i],TRUE);
X  wrefresh(Levelw);
X}
X
Xchar *msgscanstring()
X{
X  static char instring[80],byte='x';
X  int i=0;
X
X  instring[0]=0;
X  byte = mgetc();
X  while (byte != '\n') {
X    if ((byte == 8) || (byte == 127)) { /* ^h or delete */
X      instring[i] = 0;
X      if (i>0){ 
X	i--;
X	dobackspace();
X      }
X    }
X    else {
X      instring[i] = byte;
X      waddch(Msgw,byte);
X      wrefresh(Msgw);
X      i++;
X      instring[i] = 0;
X    }
X    byte = mgetc();
X  } 
X  return(instring);
X}
X
X
Xvoid locprint(s)
Xchar *s;
X{
X  wclear(Locw);
X  wprintw(Locw,s);
X  wrefresh(Locw);
X}
X
X/* draw everything whether visible or not */
Xvoid drawscreen()
X{
X  int i,j;
X  if (Current_Environment == E_COUNTRYSIDE)
X    for (i=0;i<WIDTH;i++)
X      for(j=0;j<LENGTH;j++)
X	putspot(i,j,Country[i][j].current_terrain_type);
X  else for (i=0;i<WIDTH;i++)
X    for(j=0;j<LENGTH;j++)
X      putspot(i,j,Level->site[i][j].locchar);
X  wrefresh(Levelw);
X  morewait();
X  xredraw();
X}
X
X/*selects a number up to range */
X
Xint getnumber(range)
X{
X  int done=FALSE,value=1;
X#ifndef MSDOS
X  char atom;
X#else
X  int atom;
X#endif
X
X  if (range==1) return(1);
X  else while (! done) {
X    clearmsg1();
X    wprintw(Msg1w,"How many? Change with < or >, ESCAPE to select:");
X    mnumprint(value);
X#ifndef MSDOS
X    do atom=mgetc();
X    while ((atom != '<')&&(atom != '>')&&(atom!=ESCAPE));
X    if ((atom=='>') && (value < range)) value++;
X    else if ((atom=='<') && (value > 1)) value--;
X    else if (atom==ESCAPE) done = TRUE;
X#else
X    atom=mcigetc();
X    switch (atom)
X    {
X      case '>':
X      case 'k':
X      case KEY_UP:
X        if (value < range)
X	  value++;
X	break;
X      case '<':
X      case 'j':
X      case KEY_DOWN:
X        if (value > 1)
X	  value--;
X	break;
X      case KEY_HOME:
X        value = 1;
X        break;
X      case KEY_LL:
X        value = range;
X        break;
X      case ESCAPE:
X      	done = TRUE;
X	break;
X    }
X#endif
X  }
X  return(value);
X}
X
X/* reads a positive number up to 999999 */
X#ifndef MSDOS
Xint parsenum()
X#else
Xlong parsenum()
X#endif
X{
X  int number[8];
X  int place = -1;
X#ifndef MSDOS
X  int i,x,y,num=0,mult=1;
X#else
X  int i,x,y,mult=1;
X  long num=0;
X#endif
X  char byte=' ';
X
X  while ((byte != ESCAPE) && (byte != '\n')) {
X    byte = mgetc();
X    if ((byte == BACKSPACE) || (byte == DELETE)) {
X      if (place > -1) {
X	number[place] = 0;
X	place--;
X	getyx(Msgw,y,x);
X	wmove(Msgw,y,x-1);
X	waddch(Msgw,' ');
X	wmove(Msgw,y,x-1);
X	wrefresh(Msgw);
X      }
X    }
X    else if ((byte <= '9') && (byte >= '0') && (place < 7)) {
X      place++;
X      number[place]=byte;
X      waddch(Msgw,byte);
X      wrefresh(Msgw);
X    }
X  }
X  waddch(Msgw,' ');
X  if (byte == ESCAPE) return(ABORT);
X  else {
X    for (i=place;i>=0;i--) {
X      num += mult*(number[i]-'0');
X      mult*=10;
X    }
X    return(num);
X  }
X}
X
X
X    
Xvoid maddch(c)
Xchar c;
X{
X  waddch(Msgw,c);
X  wrefresh(Msgw);
X}
X
X
Xvoid display_death(source)
Xchar *source;
X{
X  clear();
X  printw("\n\n\n\n");
X  printw("Requiescat In Pace, ");
X  printw(Player.name);
X#ifndef MSDOS
X  printw(" (%d points)",calc_points());
X#else
X  printw(" (%ld points)",calc_points());
X#endif
X  strcpy(Str4,"Killed by ");
X  strcat(Str4,source);
X  printw("\n");
X  printw(Str4);
X  printw(".");
X  printw("\n\n\n\n\nHit any key to continue.");
X  refresh();
X  wgetch(stdscr);
X  clear();
X  refresh();
X  extendlog(Str4,DEAD);
X}
X
X
Xvoid display_win()
X{
X  clear();
X  printw("\n\n\n\n");
X  printw(Player.name);
X  if (Player.status[ADEPT]) {
X#ifndef MSDOS
X    printw(" is a total master of omega with %d points!",FixedPoints);
X#else
X    printw(" is a total master of omega with %ld points!",FixedPoints);
X#endif
X    strcpy(Str4,"A total master of omega");
X  }
X  else {
X    strcpy(Str4,"retired a winner");
X#ifndef MSDOS
X    printw(" triumphed in omega with %d points!",calc_points());
X#else
X    printw(" triumphed in omega with %ld points!",calc_points());
X#endif
X  }
X  printw("\n\n\n\n\nHit any key to continue.");
X  refresh();
X  wgetch(stdscr);
X  clear();
X  refresh();
X  if (Player.status[ADEPT])
X    extendlog(Str4,BIGWIN);
X  else extendlog(Str4,WIN);
X}
X
Xvoid display_quit()
X{
X  clear();
X  printw("\n\n\n\n");
X  printw(Player.name);
X  strcpy(Str4,"A quitter.");
X#ifndef MSDOS
X  printw(" wimped out with %d points!",calc_points());
X#else
X  printw(" wimped out with %ld points!",calc_points());
X#endif
X  printw("\n\n\n\n\nHit any key to continue.");
X  refresh();
X  wgetch(stdscr);
X  clear();
X  refresh();
X  extendlog(Str4,QUIT);
X}
X
X
Xvoid display_bigwin()
X{
X  clear();
X  printw("\n\n\n\n");
X  printw(Player.name);
X  strcpy(Str4,"retired, an Adept of Omega.");
X#ifndef MSDOS
X  printw(" retired, an Adept of Omega with %d points!",FixedPoints);
X#else
X  printw(" retired, an Adept of Omega with %ld points!",FixedPoints);
X#endif
X  printw("\n\n\n\n\nHit any key to continue.");
X  refresh();
X  wgetch(stdscr);
X  clear();
X  refresh();
X  extendlog(Str4,BIGWIN);
X}
X
X
X#ifndef MSDOS
Xvoid mnumprint(n)
Xint n;
X{
X  char numstr[20];
X  sprintf(numstr,"%d",n);
X  buffercycle(numstr);
X  wprintw(Msgw,"%d",n);
X  wrefresh(Msgw);
X}
X#else
Xvoid mlongprint(n)
Xlong n;
X{
X  char numstr[20];
X  sprintf(numstr,"%ld",n);
X  buffercycle(numstr);
X  wprintw(Msgw,"%ld",n);
X  wrefresh(Msgw);
X}
X#endif
X
X#ifndef MSDOS
Xvoid menunumprint(n)
Xint n;
X{
X  int x,y;
X  getyx(Menuw,y,x);
X  if (y >= ScreenLength - 2) {
X    morewait();
X    wclear(Menuw);
X  }
X  wprintw(Menuw,"%d",n);
X  wrefresh(Menuw);
X}
X#else
Xvoid menulongprint(n)
Xlong n;
X{
X  int x,y;
X  getyx(Menuw,y,x);
X  if (y >= ScreenLength - 2) {
X    morewait();
X    wclear(Menuw);
X  }
X  wprintw(Menuw,"%ld",n);
X  wrefresh(Menuw);
X}
X#endif
X
Xvoid dobackspace()
X{
X  int x,y;
X
X  getyx(Msgw,y,x);
X  if (x > 0) {
X    waddch(Msgw,' ');
X    wmove(Msgw,y,x-1);
X    waddch(Msgw,' ');
X    wmove(Msgw,y,x-1);
X  }
X  wrefresh(Msgw);
X}
X
X
Xvoid showflags()
X{
X
X  phaseprint();
X  wclear(Flagw);
X  if (Player.food < 0)
X    wprintw(Flagw,"Starving\n");
X  else if (Player.food <= 3)
X    wprintw(Flagw,"Weak\n");
X  else if (Player.food <= 10)
X    wprintw(Flagw,"Ravenous\n");
X  else if (Player.food <= 20)
X    wprintw(Flagw,"Hungry\n");
X  else if (Player.food <= 30)
X    wprintw(Flagw,"A mite peckish\n");
X  else if (Player.food <= 36)
X    wprintw(Flagw,"Content\n");
X  else if (Player.food <= 44)
X    wprintw(Flagw,"Satiated\n");
X  else wprintw(Flagw,"Bloated\n");
X
X
X  if (Player.status[POISONED]>0)
X    wprintw(Flagw,"Poisoned\n");
X  else wprintw(Flagw,"Vigorous\n");
X
X  if (Player.status[DISEASED]>0)
X    wprintw(Flagw,"Diseased\n");
X  else wprintw(Flagw,"Healthy\n");
X
X  if (gamestatusp(MOUNTED)) wprintw(Flagw,"Mounted\n");
X  else if (Player.status[LEVITATING]) wprintw(Flagw,"Levitating\n");
X  else wprintw(Flagw,"Afoot\n");
X
X  wrefresh(Flagw);
X}
X
Xvoid drawomega()
X{
X  int i;
X  for(i=0;i<7;i++) {
X  clear();
X  printw("\n\n\n");
X  printw("\n                                    *****");
X  printw("\n                               ******   ******");
X  printw("\n                             ***             ***");
X  printw("\n                           ***                 ***");
X  printw("\n                          **                     **");
X  printw("\n                         ***                     ***");
X  printw("\n                         **                       **");
X  printw("\n                         **                       **");
X  printw("\n                         ***                     ***");
X  printw("\n                          ***                   ***");
X  printw("\n                            **                 **");
X  printw("\n                       *   ***                ***   *");
X  printw("\n                        ****                    ****");
X  refresh();
X  clear();
X  printw("\n\n\n");
X  printw("\n                                    +++++");
X  printw("\n                               ++++++   ++++++");
X  printw("\n                             +++             +++");
X  printw("\n                           +++                 +++");
X  printw("\n                          ++                     ++");
X  printw("\n                         +++                     +++");
X  printw("\n                         ++                       ++");
X  printw("\n                         ++                       ++");
X  printw("\n                         +++                     +++");
X  printw("\n                          +++                   +++");
X  printw("\n                            ++                 ++");
X  printw("\n                       +   +++                +++   +");
X  printw("\n                        ++++                    ++++");
X  refresh();
X  clear();
X  printw("\n\n\n");
X  printw("\n                                    .....");
X  printw("\n                               ......   ......");
X  printw("\n                             ...             ...");
X  printw("\n                           ...                 ...");
X  printw("\n                          ..                     ..");
X  printw("\n                         ...                     ...");
X  printw("\n                         ..                       ..");
X  printw("\n                         ..                       ..");
X  printw("\n                         ...                     ...");
X  printw("\n                          ...                   ...");
X  printw("\n                            ..                 ..");
X  printw("\n                       .   ...                ...   .");
X  printw("\n                        ....                    ....");
X  refresh();
X  }
X}               
X
X/* y is an absolute coordinate */
X/* ScreenOffset is the upper left hand corner of the current screen
X   in absolute coordinates */
X
Xvoid screencheck(y)
Xint y;
X{
X  if (((y-ScreenOffset) < (ScreenLength/8)) ||
X      ((y-ScreenOffset) > (7*ScreenLength/8))) {
X    ScreenOffset = y - (ScreenLength/2);
X    show_screen();
X  }
X}
X
X
X
X
Xvoid spreadroomlight(x,y,roomno)
Xint x,y,roomno;
X{
X  lightspot(x,y);
X
X  if (inbounds(x+1,y)) {
X    if ((! loc_statusp(x+1,y,LIT)) && 
X	(Level->site[x+1][y].roomnumber == roomno)) 
X      spreadroomlight(x+1,y,roomno);
X    else lightspot(x+1,y);
X  }
X
X  if (inbounds(x,y+1)) {
X    if ((! loc_statusp(x,y+1,LIT)) && 
X	(Level->site[x][y+1].roomnumber == roomno)) 
X      spreadroomlight(x,y+1,roomno);
X    else lightspot(x,y+1);
X  }
X
X  if (inbounds(x-1,y)) {
X    if ((! loc_statusp(x-1,y,LIT)) && 
X	(Level->site[x-1][y].roomnumber == roomno)) 
X      spreadroomlight(x-1,y,roomno);
X    else lightspot(x-1,y);
X  }
X
X  if (inbounds(x,y-1)) {
X    if ((! loc_statusp(x,y-1,LIT)) && 
X	(Level->site[x][y-1].roomnumber == roomno)) 
X      spreadroomlight(x,y-1,roomno);
X    else lightspot(x,y-1);
X  }
X}
X
X/* illuminate one spot at x y */
Xvoid lightspot(x,y)
Xint x,y;
X{ 
X  char c;
X  lset(x,y,LIT);
X  lset(x,y,SEEN);
X  c = getspot(x,y,FALSE);
X  Level->site[x][y].showchar = c;
X  putspot(x,y,c);
X}
X
X
X
Xvoid spreadroomdark(x,y,roomno)
Xint x,y,roomno;
X{
X  if (inbounds(x,y))
X    if (loc_statusp(x,y,LIT) && (Level->site[x][y].roomnumber == roomno)) {
X      blankoutspot(x,y);
X      spreadroomdark(x+1,y,roomno);
X      spreadroomdark(x,y+1,roomno);
X      spreadroomdark(x-1,y,roomno);
X      spreadroomdark(x,y-1,roomno);
X    }
X}
X
X
X
X
Xvoid display_pack()
X{
X  int i,x,y;
X  if (Player.packptr < 1) print3("Pack is empty.");
X  else {
X    wclear(Packw);
X    wprintw(Packw,"Items in Pack:");
X    for(i=0;i<Player.packptr;i++) {
X      wprintw(Packw,"\n");
X      getyx(Packw,y,x);
X      if (y >= ScreenLength - 2) {
X	wrefresh(Packw);
X	morewait();
X	wclear(Packw);
X      }
X      waddch(Packw,i+'A');
X      waddch(Packw,':');
X      wprintw(Packw,itemid(Player.pack[i]));
X    }
X    wrefresh(Packw);
X  }
X}
X
X
Xvoid display_possessions()
X{
X  int i;
X  wclear(Menuw);
X  for(i=0;i<MAXITEMS;i++) 
X    display_inventory_slot(i,FALSE);
X  move_slot(1,0,MAXITEMS);
X#ifndef MSDOS
X  wrefresh(Menuw);
X#endif
X}
X
X
X
Xvoid display_inventory_slot(slotnum,topline)
Xint slotnum;
Xint topline;
X{
X  WINDOW *W;
X  char usechar = ')';
X  if (Player.possessions[slotnum] != NULL)
X    if (Player.possessions[slotnum]->used)
X      usechar = '>';
X  if (topline) W = Msg3w;
X  else {
X    W = Showline[slotnum];
X    hide_line(slotnum);
X  }
X  wclear(W);
X  switch(slotnum) {
X  case O_UP_IN_AIR:
X    wprintw(W,"-- Object 'up in air':",usechar);
X    break;
X  case O_READY_HAND:
X    wprintw(W,"-- a%c ready hand: ",usechar);
X    break;
X  case O_WEAPON_HAND:
X    wprintw(W,"-- b%c weapon hand: ",usechar);
X    break;
X  case O_LEFT_SHOULDER:
X    wprintw(W,"-- c%c left shoulder: ",usechar);
X    break;
X  case O_RIGHT_SHOULDER:
X    wprintw(W,"-- d%c right shoulder: ",usechar);
X    break;
X  case O_BELT1:
X    wprintw(W,"-- e%c belt: ",usechar);
X    break;
X  case O_BELT2:
X    wprintw(W,"-- f%c belt: ",usechar);
X    break;
X  case O_BELT3:
X    wprintw(W,"-- g%c belt: ",usechar);
X    break;
X  case O_SHIELD:
X    wprintw(W,"-- h%c shield: ",usechar);
X    break;
X  case O_ARMOR:
X    wprintw(W,"-- i%c armor: ",usechar);
X    break;
X  case O_BOOTS:
X    wprintw(W,"-- j%c boots: ",usechar);
X    break;
X  case O_CLOAK:
X    wprintw(W,"-- k%c cloak: ",usechar);
X    break;
X  case O_RING1:
X    wprintw(W,"-- l%c finger: ",usechar);
X    break;
X  case O_RING2:
X    wprintw(W,"-- m%c finger: ",usechar);
X    break;
X  case O_RING3:
X    wprintw(W,"-- n%c finger: ",usechar);
X    break;
X  case O_RING4:
X    wprintw(W,"-- o%c finger: ",usechar);
X    break;
X  }
X  if (Player.possessions[slotnum]== NULL)
X    wprintw(W,"(slot vacant)");
X  else wprintw(W,itemid(Player.possessions[slotnum]));
X  wrefresh(W);
X}
X
Xint move_slot(oldslot,newslot,maxslot)
Xint oldslot,newslot;
X{
X  if ((newslot >= 0) && (newslot < maxslot)){
X    wmove(Showline[oldslot],0,0);
X    waddstr(Showline[oldslot],"--");
X    wrefresh(Showline[oldslot]);
X    wmove(Showline[newslot],0,0);
X    wstandout(Showline[newslot]);
X    waddstr(Showline[newslot],">>");
X    wstandend(Showline[newslot]);
X    wrefresh(Showline[newslot]);
X    return(newslot);
X  }
X  else return(oldslot);
X}
X
X
X
Xvoid display_option_slot(slot)
Xint slot;
X{
X  hide_line(slot);
X  wclear(Showline[slot]);
X  switch(slot) {
X  case 1:
X    wprintw(Showline[slot],"-- Option BELLICOSE [TF]: ");
X    wprintw(Showline[slot], optionp(BELLICOSE) ? "(now T) " : "(now F) ");
X    break;
X  case 2:
X    wprintw(Showline[slot],"-- Option JUMPMOVE [TF]: ");
X    wprintw(Showline[slot], optionp(JUMPMOVE) ? "(now T) " : "(now F) ");
X    break;
X  case 3:
X    wprintw(Showline[slot],"-- Option RUNSTOP [TF]: ");
X    wprintw(Showline[slot], optionp(RUNSTOP) ? "(now T) " : "(now F) ");
X    break;
X  case 4:
X    wprintw(Showline[slot],"-- Option PICKUP [TF]: ");
X    wprintw(Showline[slot], optionp(PICKUP) ? "(now T) " : "(now F) ");
X    break;
X  case 5:
X    wprintw(Showline[slot],"-- Option CONFIRM [TF]: ");
X    wprintw(Showline[slot], optionp(CONFIRM) ? "(now T) " : "(now F) ");
X    break;
X  case 6:
X    wprintw(Showline[slot],"-- Option TOPINV [TF]: ");
X    wprintw(Showline[slot], optionp(TOPINV) ? "(now T) " : "(now F) ");
X    break;
X  case 7:
X    wprintw(Showline[slot],"-- Option PACKADD [TF]: ");
X    wprintw(Showline[slot], optionp(PACKADD) ? "(now T) " : "(now F) ");
X    break;
X  case 8:
X    wprintw(Showline[slot],
X	    "-- Option VERBOSITY [(T)erse,(M)edium,(V)erbose]: (now ");
X    if (Verbosity == VERBOSE) wprintw(Showline[slot],"Verbose)");
X    else if (Verbosity == MEDIUM) wprintw(Showline[slot],"Medium)");
X    else wprintw(Showline[slot],"Terse)");
X    break;
X  case 9:
X    wprintw(Showline[slot],"-- Option SEARCHNUM [0>x>10]: (now %d)",Searchnum);
X    break;
X  }
X  wrefresh(Showline[slot]);
X}
X
X
Xvoid display_options()
X{
X  int i;
X  menuclear();
X  hide_line(0);
X  for(i=1;i<=NUMOPTIONS;i++)
X    display_option_slot(i);
X}
X
X
X/* nya ha ha ha ha haaaa.... */
Xvoid deathprint()
X{
X  mgetc();
X  waddch(Msgw,'D');
X  mgetc();
X  waddch(Msgw,'e');
X  mgetc();
X  waddch(Msgw,'a');
X  mgetc();
X  waddch(Msgw,'t');
X  mgetc();
X  waddch(Msgw,'h');
X  mgetc();
X}
X  
Xvoid clear_if_necessary()
X{
X  int x,y;
X  getyx(Msg1w,y,x);
X
X  if (x != 0) {
X    wclear(Msg1w);
X    wrefresh(Msg1w);
X  }  
X
X  getyx(Msg2w,y,x);
X
X  if (x != 0) {
X    wclear(Msg2w);
X    wrefresh(Msg2w);
X  }  
X
X  getyx(Msg3w,y,x);
X
X  if (x != 0) {
X    wclear(Msg3w);
X    wrefresh(Msg3w);
X  }
X
X}
X
X
Xvoid buffercycle(s)
Xchar *s;
X{
X  int i;
X  for(i=9;i>0;i--)
X    strcpy(Stringbuffer[i], Stringbuffer[i-1]);
X  strcpy(Stringbuffer[0],s);
X}
X
X
Xvoid bufferprint()
X{
X  int i = 0;
X  clearmsg();
X#ifndef MSDOS
X  wprintw(Msg1w,"^p for last message, anything else to quit.");
X#else
X  wprintw(Msg1w,"^o for last message, anything else to quit.");
X#endif
X  wrefresh(Msg1w);
X  do {
X    wclear(Msg2w);
X    wprintw(Msg2w,Stringbuffer[i]);
X    wrefresh(Msg2w);
X    if (++i > 9) i = 0;
X#ifndef MSDOS
X  } while (mgetc() == 16);
X#else
X  } while (mgetc() == 15);
X#endif
X  clearmsg();
X  showcursor(Player.x,Player.y);
X}
X
X#ifdef MSDOS
X/* ****Moved here from another file**** */
X/* bv access functions for dungeon location stati */
Xint loc_statusp(x,y,stat)
Xint x,y;
Xint stat;
X{
X  return(Level->site[x][y].lstatus & stat);
X}
X
Xvoid lset(x,y,stat)
Xint x,y;
Xint stat;
X{
X Level->site[x][y].lstatus |= stat;
X}
X
Xvoid lreset(x,y,stat)
Xint x,y;
Xint stat;
X{
X  Level->site[x][y].lstatus &= ~stat;
X}
X#endif
END_OF_FILE
if test 33518 -ne `wc -c <'oscr.c'`; then
    echo shar: \"'oscr.c'\" unpacked with wrong size!
fi
# end of 'oscr.c'
fi
echo shar: End of archive 2 \(of 20\).
cp /dev/null ark2isdone
MISSING=""
for I in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 ; do
    if test ! -f ark${I}isdone ; then
	MISSING="${MISSING} ${I}"
    fi
done
if test "${MISSING}" = "" ; then
    echo You have unpacked all 20 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