DataMuseum.dk

Presents historical artifacts from the history of:

DKUUG/EUUG Conference tapes

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about DKUUG/EUUG Conference tapes

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - metrics - download
Index: T o

⟦d72bc55d1⟧ TextFile

    Length: 31141 (0x79a5)
    Types: TextFile
    Names: »oscr.c«

Derivation

└─⟦b20c6495f⟧ Bits:30007238 EUUGD18: Wien-båndet, efterår 1987
    └─⟦this⟧ »EUUGD18/General/Omega/oscr.c« 

TextFile

/* omega (c) 1987 by Laurence Raphael Brothers */
/* oscr.c */
/* functions that use curses routines directly */
/* plus a few file i/o stuff */
/* also some in ofile.c */

#include <curses.h>
#include <sys/types.h>
#include <sys/timeb.h>
#include "oglob.h"

char *sprintf();

#ifdef EXCESSIVE_REDRAW
#define wclear werase
#endif


/* note these variables are not exported to other files */

WINDOW *Levelw,*Dataw,*Flagw,*Timew,*Menuw,*Locw,*Morew,*Phasew;
WINDOW *Comwin,*Rightside,*Msg1w,*Msg2w,*Msg3w,*Msgw,*Packw;
WINDOW *Hideline[MAXITEMS],*Showline[MAXITEMS];

void phaseprint()
{
  wclear(Phasew);
  wprintw(Phasew,"Moon's Phase:\n");
  switch(Phase/2) {
  case 0: wprintw(Phasew,"NEW"); break;
  case 1: case 11: wprintw(Phasew,"CRESCENT"); break;
  case 2: case 10: wprintw(Phasew,"1/4"); break;
  case 3: case 9: wprintw(Phasew,"HALF"); break;
  case 4: case 8: wprintw(Phasew,"3/4"); break;
  case 5: case 7: wprintw(Phasew,"GIBBOUS"); break;
  case 6: wprintw(Phasew,"FULL"); break;
  }
}

void show_screen()
{
  int i,j,top,bottom;
  wclear(Levelw);
  top = ScreenOffset;
  bottom = ScreenOffset + ScreenLength;
  top = max(0,top);
  bottom = min(bottom,LENGTH-1);
  if (Current_Environment != E_COUNTRYSIDE) 
    for (j=top;j<=bottom;j++) 
      for (i=0;i<WIDTH;i++) {
	wmove(Levelw,screenmod(j),i);
	waddch(Levelw,(loc_statusp(i,j,SEEN) ?
		       getspot(i,j,FALSE) :
		       ' '));
      }
  else for (j=top;j<=bottom;j++) 
      for (i=0;i<WIDTH;i++) {
	wmove(Levelw,screenmod(j),i);
	waddch(Levelw,(Country[i][j].explored ? 
		       Country[i][j].current_terrain_type : 
		       ' '));
      }
  wrefresh(Levelw);
}



char mgetc()
{
  return(wgetch(Msgw));
}

/* case insensitive mgetc -- sends uppercase to lowercase */
char mcigetc()
{
  char c = wgetch(Msgw);
  if ((c>='A') && (c<='Z'))
    return(c+('a'-'A'));
  else return(c);
}

char menugetc()
{
  return(wgetch(Menuw));
}


char lgetc()
{
  return(wgetch(Levelw));
}


char ynq()
{
  char p=' ';
  while ((p != 'n') && (p != 'y') && (p != 'q') && (p != ESCAPE))
    p = wgetch(Msgw);
  switch (p) {
    case 'y': wprintw(Msgw,"yes. "); break;
    case 'n': wprintw(Msgw,"no. "); break;
    case ESCAPE:
    case 'q': wprintw(Msgw,"quit. "); break;
    }
  wrefresh(Msgw);
  return(p);
}


char ynq1()
{
  char p=' ';
  while ((p != 'n') && (p != 'y') && (p != 'q') && (p != ESCAPE))
    p = wgetch(Msg1w);
  switch (p) {
    case 'y': wprintw(Msg1w,"yes. "); break;
    case 'n': wprintw(Msg1w,"no. "); break;
    case ESCAPE:
    case 'q': wprintw(Msg1w,"quit. "); break;
    }
  wrefresh(Msg1w);
  return(p);
}


char ynq2()
{
  char p=' ';
  while ((p != 'n') && (p != 'y') && (p != 'q') && (p != ESCAPE))
    p = wgetch(Msg2w);
  switch (p) {
    case 'y': wprintw(Msg2w,"yes. "); break;
    case 'n': wprintw(Msg2w,"no. "); break;
    case ESCAPE:
    case 'q': wprintw(Msg2w,"quit. "); break;
    }
  wrefresh(Msg2w);
  return(p);
}
    
/* puts up a morewait to allow reading if anything in top two lines */
void checkclear()
{
  int x1,y,x2;
  getyx(Msg1w,x1,y);
  getyx(Msg2w,x2,y);  
  if ((x1 != 0) || (x2 != 0)) {
    morewait();
    wclear(Msg1w);
    wclear(Msg2w);
    wrefresh(Msg1w);
    wrefresh(Msg2w);
  }
}
  
/* for external call */
void clearmsg()
{
  wclear(Msg1w);
  wclear(Msg2w);
  wclear(Msg3w);
  Msgw = Msg1w;
  wrefresh(Msg1w);
  wrefresh(Msg2w);
  wrefresh(Msg3w);
}

void clearmsg3()
{
  wclear(Msg3w);
  wrefresh(Msg3w);
}

void clearmsg1()
{
  wclear(Msg1w);
  wclear(Msg2w);
  Msgw = Msg1w;
  wrefresh(Msg1w);
  wrefresh(Msg2w);
}


void erase_level()
{
  wclear(Levelw);
}

/* direct print to first msg line */
void print1(s)
char *s;
{
  if (! gamestatusp(SUPPRESS_PRINTING)) {
    buffercycle(s);
    wclear(Msg1w);
    wprintw(Msg1w,s);
    wrefresh(Msg1w);
  }
}

/* for run on-messages -- print1 clears first.... */
void nprint1(s)
char *s;
{
  if (! gamestatusp(SUPPRESS_PRINTING)) {
    buffercycle(s);
    wprintw(Msg1w,s);
    wrefresh(Msg1w);
  }
}




/* direct print to second msg line */
void print2(s)
char *s;
{
  if (! gamestatusp(SUPPRESS_PRINTING)) {
    buffercycle(s);
    wclear(Msg2w);
    wprintw(Msg2w,s);
    wrefresh(Msg2w);
  }
}

/* for run on-messages -- print2 clears first.... */
void nprint2(s)
char *s;
{
  if (! gamestatusp(SUPPRESS_PRINTING)) {
    buffercycle(s);
    wprintw(Msg2w,s);
    wrefresh(Msg2w);
  }
}




/* msg line 3 is not part of the region that mprint or printm can reach */
/* typical use of print3 is for "you can't do that" type error messages */
void print3(s)
char *s;
{
  if (! gamestatusp(SUPPRESS_PRINTING)) {
    buffercycle(s);
    wclear(Msg3w);
    wprintw(Msg3w,s);
    wrefresh(Msg3w);
  }
}

/* for run on-messages -- print3 clears first.... */
void nprint3(s)
char *s;
{
  if (! gamestatusp(SUPPRESS_PRINTING)) {
    buffercycle(s);
    wprintw(Msg3w,s);
    wrefresh(Msg3w);
  }
}



/* prints wherever cursor is in window, but checks to see if
it should morewait and clear window */
void mprint(s)
char *s;
{
  int x,y;
  if (! gamestatusp(SUPPRESS_PRINTING)) {
    buffercycle(s);
    getyx(Msgw,y,x);
    if (x+strlen(s) >= WIDTH) {
      if (Msgw == Msg1w) {
	wclear(Msg2w);
	Msgw = Msg2w;
      }
      else {
	morewait();
	wclear(Msg1w);
	wclear(Msg2w);
	wrefresh(Msg2w);
	Msgw = Msg1w;
      }
    }
    wprintw(Msgw,s);
    waddch(Msgw,' '); 
    wrefresh(Msgw);
  }
}




void title()
{
  showmotd();
  /* Pseudo Random Seed */
  Seed = (int) time((long *)NULL);
  clear();
  refresh();  
  showscores();
}





/* blanks out ith line of Menuw or Levelw */
/* This is a serious kluge, but nothing else seems to work the way
   I want it to! */
void hide_line(i)
int i;
{
  touchwin(Hideline[i]);
  wrefresh(Hideline[i]);
}



/* initialize, screen, windows */
void initgraf()
{
  int i;
  initscr();
  if (LINES < 24) {
    printf("Minimum Screen Size: 24 Lines.");
    exit(0);
  }
  else ScreenLength = LINES - 6;
  Rightside = newwin(ScreenLength,15,2,65);
  Msg1w = newwin(1,80,0,0);
  Msg2w = newwin(1,80,1,0);
  Msg3w = newwin(1,80,2,0);
  Msgw = Msg1w;
  Morew = newwin(1,15,3,65);  
  Locw = newwin(1,80,ScreenLength+3,0);
  Levelw = newwin(ScreenLength,64,3,0);
  for(i=0;i<MAXITEMS;i++) {
    Hideline[i] = newwin(1,64,i+3,0);
    Showline[i] = newwin(1,64,i+3,0);
    wclear(Hideline[i]);
    wclear(Showline[i]);
  }
  Menuw = newwin(ScreenLength,64,3,0);
  Packw = newwin(ScreenLength,64,3,0);
  Dataw = newwin(2,80,ScreenLength+4,0);
  Timew = newwin(2,15,4,65);
  Phasew = newwin(2,15,6,65);
  Flagw = newwin(4,15,9,65);
  Comwin = newwin(8,15,14,65);

  noecho();
  crmode();

  clear();
  title();
  clear();
  refresh();
}





void drawplayer()
{
  static int lastx= -1,lasty= -1;
  if (Current_Environment == E_COUNTRYSIDE) {
    wmove(Levelw,screenmod(lasty),lastx);
    waddch(Levelw,Country[lastx][lasty].current_terrain_type);
    wmove(Levelw,screenmod(Player.y),Player.x);
    waddch(Levelw,PLAYER);
  }
  else {
    if (inbounds(lastx,lasty))
      plotspot(lastx,lasty,(Player.status[BLINDED]>0 ? FALSE : TRUE));
    wmove(Levelw,screenmod(Player.y),Player.x);
    if ((! Player.status[INVISIBLE]) || Player.status[TRUESIGHT])
      waddch(Levelw,PLAYER);
  }
  lastx = Player.x;
  lasty = Player.y;
}

int litroom(x,y)
int x,y;
{
  if (Level->site[x][y].roomnumber < ROOMBASE) return(FALSE);
  else return(loc_statusp(x,y,LIT) ||
	      Player.status[ILLUMINATION]);
}

void drawvision(x,y)
int x,y;
{
  static int oldx = -1,oldy = -1;
  int i,j;

  if (Current_Environment != E_COUNTRYSIDE) {
    if (Player.status[BLINDED]) {
      drawspot(oldx,oldy);
      drawspot(x,y);
      drawplayer();
    }
    else {
      if (Player.status[ILLUMINATION] > 0) {
	for (i= -2;i<3;i++)
	  for (j= -2;j<3;j++)
	    if (inbounds(x+i,y+j))
	      if (view_los_p(x+i,y+j,Player.x,Player.y))
		dodrawspot(x+i,y+j);
      }
      else {
	for (i= -1;i<2;i++)
	  for (j= -1;j<2;j++)
	    if (inbounds(x+i,y+j))
	      dodrawspot(x+i,y+j);
      }
      drawplayer();
      drawmonsters(FALSE); /* erase all monsters */
      drawmonsters(TRUE);  /* draw those now visible */
    }
    if ((! gamestatusp(FAST_MOVE)) || (! optionp(JUMPMOVE)))
      showcursor(Player.x,Player.y);
    oldx = x;
    oldy = y;
  }
  else {
    for (i= -1;i<2;i++)
      for (j= -1;j<2;j++)
	if (inbounds(x+i,y+j)) {
	  wmove(Levelw,screenmod(y+j),x+i);
	  Country[x+i][y+j].explored = TRUE;
	  waddch(Levelw,Country[x+i][y+j].current_terrain_type);
	}
    drawplayer();
    showcursor(Player.x,Player.y);
  }
}


void showcursor(x,y)
int x,y;
{
  wmove(Levelw,screenmod(y),x);
  wrefresh(Levelw);
}

void levelrefresh()
{
  wrefresh(Levelw);
}


/* draws a particular spot under if in line-of-sight */
void drawspot(x,y)
int x,y;
{
  char c = getspot(x,y,FALSE);
  if (c != Level->site[x][y].showchar)
    if (view_los_p(Player.x,Player.y,x,y)) {
      lset(x,y,SEEN);
      Level->site[x][y].showchar = c;
      putspot(x,y,c);
    }
}



/* draws a particular spot regardless of line-of-sight */
void dodrawspot(x,y)
int x,y;
{
  char c = getspot(x,y,FALSE);
  if (c != Level->site[x][y].showchar) {
    lset(x,y,SEEN);
    Level->site[x][y].showchar = c;
    putspot(x,y,c);
  }
}

/* write a blank to a spot if it is floor */
void blankoutspot(i,j)
int i,j;
{
  lreset(i,j,LIT);
  if (Level->site[i][j].locchar == FLOOR)  {
    Level->site[i][j].showchar = ' ';
    putspot(i,j,' ');
  }
}

/* blank out a spot regardless */
void blotspot(i,j)
int i,j;
{
  lreset(i,j,SEEN);
  Level->site[i][j].showchar = SPACE;
  if (! offscreen(j)) {
    wmove(Levelw,screenmod(j),i);
    wdelch(Levelw);
    winsch(Levelw,SPACE);
  }
}


/* for displaying activity specifically at some point */
void plotspot(x,y,showmonster)
int x,y,showmonster;
{
  if (loc_statusp(x,y,SEEN))
    putspot(x,y,getspot(x,y,showmonster));
  else 
    putspot(x,y,' ');
}


/* Puts c at x,y on screen. No fuss, no bother. */
void putspot(x,y,c)
int x,y;
char c;
{
  if (! offscreen(y)) {
    wmove(Levelw,screenmod(y),x);
    waddch(Levelw,c);
  }
}


/* regardless of line of sight, etc, draw a monster */
void plotmon(m)
struct monster *m;
{
  if (! offscreen(m->y)) {
    wmove(Levelw,screenmod(m->y),m->x);
    waddch(Levelw,m->monchar);
  }
}
  
/* if display, displays monsters, otherwise erases them */
void drawmonsters(display)
int display;
{
  pml ml;
  for (ml=Level->mlist;ml!=NULL;ml=ml->next) {
    if (ml->m->hp > 0) {
      if (display) {
	if (view_los_p(Player.x,Player.y,ml->m->x,ml->m->y)) {
	  if (Player.status[TRUESIGHT] || (! m_statusp(ml->m,M_INVISIBLE))) {
	    if ((ml->m->level > 5) &&
		(ml->m->monchar != '@') &&
		(ml->m->monchar != '|')) wstandout(Levelw);
	    putspot(ml->m->x,ml->m->y,ml->m->monchar);
	    wstandend(Levelw);
	  }
	}
      }
      else erase_monster(ml->m);
    }
  }
}

/* replace monster with what would be displayed if monster weren't there */
void erase_monster(m)
struct monster *m;
{
  if (loc_statusp(m->x,m->y,SEEN))
    putspot(m->x,m->y,getspot(m->x,m->y,FALSE));
  else blotspot(m->x,m->y);
}

/* find apt char to display at some location */
char getspot(x,y,showmonster)
int x,y,showmonster;
{
  if (loc_statusp(x,y,SECRET)) return(WALL);
  else switch (Level->site[x][y].locchar) {
  case WATER:
    if (Level->site[x][y].creature == NULL) 
      return(WATER);
    else if (m_statusp(Level->site[x][y].creature,SWIMMING))
      return(WATER);
    else return(Level->site[x][y].creature->monchar);
    break;
  /* these sites never show anything but their location char's */
  case CLOSED_DOOR:
  case LAVA:
  case FIRE:
  case ABYSS:
    return(Level->site[x][y].locchar);
    break;
  /* rubble and hedge don't show items on their location */
  case RUBBLE:
  case HEDGE:
    if (showmonster && (Level->site[x][y].creature != NULL)) {
      if ((m_statusp(Level->site[x][y].creature,M_INVISIBLE)) &&
	  (! Player.status[TRUESIGHT]))
	return(getspot(x,y,FALSE));
      else return (Level->site[x][y].creature->monchar);
    }
    else return(Level->site[x][y].locchar);
    break;
  /* everywhere else, first try to show monster, next show items, next show
     location char */
  default:
    if (showmonster && (Level->site[x][y].creature != NULL)) {
      if ((m_statusp(Level->site[x][y].creature,M_INVISIBLE)) &&
	  (! Player.status[TRUESIGHT]))
	return(getspot(x,y,FALSE));
      else return (Level->site[x][y].creature->monchar);
    }
    else if (Level->site[x][y].things != NULL) {
      if (Level->site[x][y].things->next != NULL)
	return(PILE);
      else return(Level->site[x][y].things->thing->objchar);
    }
    else return(Level->site[x][y].locchar);
    break;
  }
}

void commanderror()
{
  wclear(Msg3w);
  wprintw(Msg3w,"%c : unknown command",Cmd);
  wrefresh(Msg3w);
}

void timeprint()
{
  wclear(Timew);
  wprintw(Timew,"%d:%d",showhour(),showminute());
  if (showminute()==0) waddch(Timew,'0');
  wprintw(Timew,hour()>11 ? " PM \n" : " AM \n");
  wprintw(Timew,month());
  wprintw(Timew," the %d",day());
  wprintw(Timew,ordinal(day()));
  wrefresh(Timew);
}


void comwinprint()
{
  wclear(Comwin);
  wprintw(Comwin,"Hit: %d  \n",Player.hit);
  wprintw(Comwin,"Dmg: %d  \n",Player.dmg);
  wprintw(Comwin,"Def: %d  \n",Player.defense);
  wprintw(Comwin,"Arm: %d  \n",Player.absorption);
  wprintw(Comwin,"Spd: %.2f  \n",5.0/Player.speed);
  wrefresh(Comwin);
}

void dataprint()
{
  wclear(Dataw);
  wprintw(Dataw,"HP:%d/%d MANA:%d/%d AU:%d LEVEL:%d/%d CARRY:%d/%d \n",
	  Player.hp,Player.maxhp,Player.mana,Player.maxmana,Player.cash,
	  Player.level,Player.xp,Player.itemweight,Player.maxweight);
  wprintw(Dataw,"STR:%d/%d CON:%d/%d DEX:%d/%d AGI:%d/%d INT:%d/%d POW:%d/%d   ",
	  Player.str,Player.maxstr,Player.con,Player.maxcon,
	  Player.dex,Player.maxdex,Player.agi,Player.maxagi,
	  Player.iq,Player.maxiq,Player.pow,Player.maxpow);
  wrefresh(Dataw);
  wrefresh(Dataw);
}


/* redraw everything currently displayed */
void redraw()
{
  touchwin(curscr);
  wrefresh(curscr);
}  

/* redraw each permanent window */
void xredraw()
{
  wclear(Rightside);
  wrefresh(Rightside);
  touchwin(Msgw);
  touchwin(Msg3w);
  touchwin(Levelw);
  touchwin(Timew);
  touchwin(Flagw);
  touchwin(Dataw);
  touchwin(Locw);
  touchwin(Morew);
  touchwin(Phasew);
  touchwin(Comwin); 
  wrefresh(Msgw);
  wrefresh(Msg3w);
  wrefresh(Levelw);
  wrefresh(Timew);
  wrefresh(Flagw);
  wrefresh(Dataw);
  wrefresh(Locw);
  wrefresh(Morew);
  wrefresh(Phasew);
  wrefresh(Comwin);
}



void menuaddch(c)
char c;
{
  waddch(Menuw,c);
  wrefresh(Menuw);
}



void morewait()
{
  int display=TRUE;
  char c;
  do {
    wclear(Morew);
    if (display) wprintw(Morew,"***  MORE  ***");
    else wprintw(Morew,"+++  MORE  +++");
    display = ! display;
    wrefresh(Morew);
    c = wgetch(Msgw);
  } while ((c != SPACE) && (c != RETURN));
  wclear(Morew);
  wrefresh(Morew);
}

int stillonblock()
{
  int display=TRUE;
  char c;
  do {
    wclear(Morew);
    if (display) wprintw(Morew,"<<<STAY?>>>");
    else wprintw(Morew,">>>STAY?<<<");
    display = ! display;
    wrefresh(Morew);
    c = wgetch(Msgw);
  } while ((c != SPACE) && (c != ESCAPE));
  wclear(Morew);
  wrefresh(Morew);
  return (c == SPACE);
}

void menuclear()
{
  wclear(Menuw);
  wrefresh(Menuw);
}

void menuspellprint(i)
int i;
{
  int x,y;
  getyx(Menuw,y,x);
  if (y >= ScreenLength - 2) {
    morewait();
    wclear(Menuw);
  }
  wprintw(Menuw,spellid(i));
  wprintw(Menuw,"(%d)\n",Spells[i].powerdrain);
  wrefresh(Menuw);
}  

void menuprint(s)
char *s;
{
  int x,y;
  getyx(Menuw,y,x);
  if (y >= ScreenLength - 2) {
    morewait();
    wclear(Menuw);
  }
  wprintw(Menuw,s);
  wrefresh(Menuw);
}



void endgraf()
{
clear();
refresh();
endwin();
}


void plotchar(pyx,x,y)
char pyx;
int x,y;
{
  if (! offscreen(y)) {
    wmove(Levelw,screenmod(y),x);
    waddch(Levelw,pyx);
    wrefresh(Levelw);
  }
}



void draw_explosion(pyx,x,y)
char pyx;
int x,y;
{
  int i,j;
  
  for(j=0;j<3;j++) {
    for(i=0;i<9;i++) 
      plotchar(pyx,x+Dirs[0][i],y+Dirs[1][i]);
    for(i=0;i<9;i++)
      plotchar(' ',x+Dirs[0][i],y+Dirs[1][i]);
  }
  for(i=0;i<9;i++) 
    plotspot(x+Dirs[0][i],y+Dirs[1][i],TRUE);
  wrefresh(Levelw);
}

char *msgscanstring()
{
  static char instring[80],byte='x';
  int i=0;

  instring[0]=0;
  byte = mgetc();
  while (byte != '\n') {
    if ((byte == 8) || (byte == 127)) { /* ^h or delete */
      instring[i] = 0;
      if (i>0){ 
	i--;
	dobackspace();
      }
    }
    else {
      instring[i] = byte;
      waddch(Msgw,byte);
      wrefresh(Msgw);
      i++;
      instring[i] = 0;
    }
    byte = mgetc();
  } 
  return(instring);
}


void locprint(s)
char *s;
{
  wclear(Locw);
  wprintw(Locw,s);
  wrefresh(Locw);
}

/* draw everything whether visible or not */
void drawscreen()
{
  int i,j;
  if (Current_Environment == E_COUNTRYSIDE)
    for (i=0;i<WIDTH;i++)
      for(j=0;j<LENGTH;j++)
	putspot(i,j,Country[i][j].current_terrain_type);
  else for (i=0;i<WIDTH;i++)
    for(j=0;j<LENGTH;j++)
      putspot(i,j,Level->site[i][j].locchar);
  wrefresh(Levelw);
  morewait();
  xredraw();
}

/*selects a number up to range */

int getnumber(range)
{
  int done=FALSE,value=1;
  char atom;

  if (range==1) return(1);
  else while (! done) {
    clearmsg1();
    wprintw(Msg1w,"How many? Change with < or >, ESCAPE to select:");
    mnumprint(value);
    do atom=mgetc();
    while ((atom != '<')&&(atom != '>')&&(atom!=ESCAPE));
    if ((atom=='>') && (value < range)) value++;
    else if ((atom=='<') && (value > 1)) value--;
    else if (atom==ESCAPE) done = TRUE;
  }
  return(value);
}

/* reads a positive number up to 999999 */
int parsenum()
{
  int number[8];
  int place = -1;
  int i,x,y,num=0,mult=1;
  char byte=' ';

  while ((byte != ESCAPE) && (byte != '\n')) {
    byte = mgetc();
    if ((byte == BACKSPACE) || (byte == DELETE)) {
      if (place > -1) {
	number[place] = 0;
	place--;
	getyx(Msgw,y,x);
	wmove(Msgw,y,x-1);
	waddch(Msgw,' ');
	wmove(Msgw,y,x-1);
	wrefresh(Msgw);
      }
    }
    else if ((byte <= '9') && (byte >= '0') && (place < 7)) {
      place++;
      number[place]=byte;
      waddch(Msgw,byte);
      wrefresh(Msgw);
    }
  }
  waddch(Msgw,' ');
  if (byte == ESCAPE) return(ABORT);
  else {
    for (i=place;i>=0;i--) {
      num += mult*(number[i]-'0');
      mult*=10;
    }
    return(num);
  }
}


    
void maddch(c)
char c;
{
  waddch(Msgw,c);
  wrefresh(Msgw);
}


void display_death(source)
char *source;
{
  clear();
  printw("\n\n\n\n");
  printw("Requiescat In Pace, ");
  printw(Player.name);
  printw(" (%d points)",calc_points());
  strcpy(Str4,"Killed by ");
  strcat(Str4,source);
  printw("\n");
  printw(Str4);
  printw(".");
  printw("\n\n\n\n\nHit any key to continue.");
  refresh();
  wgetch(stdscr);
  clear();
  refresh();
  extendlog(Str4,DEAD);
}


void display_win()
{
  clear();
  printw("\n\n\n\n");
  printw(Player.name);
  if (Player.status[ADEPT]) {
    printw(" is a total master of omega with %d points!",FixedPoints);
    strcpy(Str4,"A total master of omega");
  }
  else {
    strcpy(Str4,"retired a winner");
    printw(" triumphed in omega with %d points!",calc_points());
  }
  printw("\n\n\n\n\nHit any key to continue.");
  refresh();
  wgetch(stdscr);
  clear();
  refresh();
  if (Player.status[ADEPT])
    extendlog(Str4,BIGWIN);
  else extendlog(Str4,WIN);
}

void display_quit()
{
  clear();
  printw("\n\n\n\n");
  printw(Player.name);
  strcpy(Str4,"A quitter.");
  printw(" wimped out with %d points!",calc_points());
  printw("\n\n\n\n\nHit any key to continue.");
  refresh();
  wgetch(stdscr);
  clear();
  refresh();
  extendlog(Str4,QUIT);
}


void display_bigwin()
{
  clear();
  printw("\n\n\n\n");
  printw(Player.name);
  strcpy(Str4,"retired, an Adept of Omega.");
  printw(" retired, an Adept of Omega with %d points!",FixedPoints);
  printw("\n\n\n\n\nHit any key to continue.");
  refresh();
  wgetch(stdscr);
  clear();
  refresh();
  extendlog(Str4,BIGWIN);
}


void mnumprint(n)
int n;
{
  char numstr[20];
  sprintf(numstr,"%d",n);
  buffercycle(numstr);
  wprintw(Msgw,"%d",n);
  wrefresh(Msgw);
}

void menunumprint(n)
int n;
{
  int x,y;
  getyx(Menuw,y,x);
  if (y >= ScreenLength - 2) {
    morewait();
    wclear(Menuw);
  }
  wprintw(Menuw,"%d",n);
  wrefresh(Menuw);
}

void dobackspace()
{
  int x,y;

  getyx(Msgw,y,x);
  if (x > 0) {
    waddch(Msgw,' ');
    wmove(Msgw,y,x-1);
    waddch(Msgw,' ');
    wmove(Msgw,y,x-1);
  }
  wrefresh(Msgw);
}


void showflags()
{

  phaseprint();
  wclear(Flagw);
  if (Player.food < 0)
    wprintw(Flagw,"Starving\n");
  else if (Player.food <= 3)
    wprintw(Flagw,"Weak\n");
  else if (Player.food <= 10)
    wprintw(Flagw,"Ravenous\n");
  else if (Player.food <= 20)
    wprintw(Flagw,"Hungry\n");
  else if (Player.food <= 30)
    wprintw(Flagw,"A mite peckish\n");
  else if (Player.food <= 36)
    wprintw(Flagw,"Content\n");
  else if (Player.food <= 44)
    wprintw(Flagw,"Satiated\n");
  else wprintw(Flagw,"Bloated\n");


  if (Player.status[POISONED]>0)
    wprintw(Flagw,"Poisoned\n");
  else wprintw(Flagw,"Vigorous\n");

  if (Player.status[DISEASED]>0)
    wprintw(Flagw,"Diseased\n");
  else wprintw(Flagw,"Healthy\n");

  if (gamestatusp(MOUNTED)) wprintw(Flagw,"Mounted\n");
  else if (Player.status[LEVITATING]) wprintw(Flagw,"Levitating\n");
  else wprintw(Flagw,"Afoot\n");

  wrefresh(Flagw);
}

void drawomega()
{
  int i;
  for(i=0;i<7;i++) {
  clear();
  printw("\n\n\n");
  printw("\n                                    *****");
  printw("\n                               ******   ******");
  printw("\n                             ***             ***");
  printw("\n                           ***                 ***");
  printw("\n                          **                     **");
  printw("\n                         ***                     ***");
  printw("\n                         **                       **");
  printw("\n                         **                       **");
  printw("\n                         ***                     ***");
  printw("\n                          ***                   ***");
  printw("\n                            **                 **");
  printw("\n                       *   ***                ***   *");
  printw("\n                        ****                    ****");
  refresh();
  clear();
  printw("\n\n\n");
  printw("\n                                    +++++");
  printw("\n                               ++++++   ++++++");
  printw("\n                             +++             +++");
  printw("\n                           +++                 +++");
  printw("\n                          ++                     ++");
  printw("\n                         +++                     +++");
  printw("\n                         ++                       ++");
  printw("\n                         ++                       ++");
  printw("\n                         +++                     +++");
  printw("\n                          +++                   +++");
  printw("\n                            ++                 ++");
  printw("\n                       +   +++                +++   +");
  printw("\n                        ++++                    ++++");
  refresh();
  clear();
  printw("\n\n\n");
  printw("\n                                    .....");
  printw("\n                               ......   ......");
  printw("\n                             ...             ...");
  printw("\n                           ...                 ...");
  printw("\n                          ..                     ..");
  printw("\n                         ...                     ...");
  printw("\n                         ..                       ..");
  printw("\n                         ..                       ..");
  printw("\n                         ...                     ...");
  printw("\n                          ...                   ...");
  printw("\n                            ..                 ..");
  printw("\n                       .   ...                ...   .");
  printw("\n                        ....                    ....");
  refresh();
  }
}               

/* y is an absolute coordinate */
/* ScreenOffset is the upper left hand corner of the current screen
   in absolute coordinates */

void screencheck(y)
int y;
{
  if (((y-ScreenOffset) < (ScreenLength/8)) ||
      ((y-ScreenOffset) > (7*ScreenLength/8))) {
    ScreenOffset = y - (ScreenLength/2);
    show_screen();
  }
}




void spreadroomlight(x,y,roomno)
int x,y,roomno;
{
  lightspot(x,y);

  if (inbounds(x+1,y)) {
    if ((! loc_statusp(x+1,y,LIT)) && 
	(Level->site[x+1][y].roomnumber == roomno)) 
      spreadroomlight(x+1,y,roomno);
    else lightspot(x+1,y);
  }

  if (inbounds(x,y+1)) {
    if ((! loc_statusp(x,y+1,LIT)) && 
	(Level->site[x][y+1].roomnumber == roomno)) 
      spreadroomlight(x,y+1,roomno);
    else lightspot(x,y+1);
  }

  if (inbounds(x-1,y)) {
    if ((! loc_statusp(x-1,y,LIT)) && 
	(Level->site[x-1][y].roomnumber == roomno)) 
      spreadroomlight(x-1,y,roomno);
    else lightspot(x-1,y);
  }

  if (inbounds(x,y-1)) {
    if ((! loc_statusp(x,y-1,LIT)) && 
	(Level->site[x][y-1].roomnumber == roomno)) 
      spreadroomlight(x,y-1,roomno);
    else lightspot(x,y-1);
  }
}

/* illuminate one spot at x y */
void lightspot(x,y)
int x,y;
{ 
  char c;
  lset(x,y,LIT);
  lset(x,y,SEEN);
  c = getspot(x,y,FALSE);
  Level->site[x][y].showchar = c;
  putspot(x,y,c);
}



void spreadroomdark(x,y,roomno)
int x,y,roomno;
{
  if (inbounds(x,y))
    if (loc_statusp(x,y,LIT) && (Level->site[x][y].roomnumber == roomno)) {
      blankoutspot(x,y);
      spreadroomdark(x+1,y,roomno);
      spreadroomdark(x,y+1,roomno);
      spreadroomdark(x-1,y,roomno);
      spreadroomdark(x,y-1,roomno);
    }
}




void display_pack()
{
  int i,x,y;
  if (Player.packptr < 1) print3("Pack is empty.");
  else {
    wclear(Packw);
    wprintw(Packw,"Items in Pack:");
    for(i=0;i<Player.packptr;i++) {
      wprintw(Packw,"\n");
      getyx(Packw,y,x);
      if (y >= ScreenLength - 2) {
	wrefresh(Packw);
	morewait();
	wclear(Packw);
      }
      waddch(Packw,i+'A');
      waddch(Packw,':');
      wprintw(Packw,itemid(Player.pack[i]));
    }
    wrefresh(Packw);
  }
}


void display_possessions()
{
  int i;
  wclear(Menuw);
  for(i=0;i<MAXITEMS;i++) 
    display_inventory_slot(i,FALSE);
  move_slot(1,0,MAXITEMS);
  wrefresh(Menuw);
}



void display_inventory_slot(slotnum,topline)
int slotnum;
int topline;
{
  WINDOW *W;
  char usechar = ')';
  if (Player.possessions[slotnum] != NULL)
    if (Player.possessions[slotnum]->used)
      usechar = '>';
  if (topline) W = Msg3w;
  else {
    W = Showline[slotnum];
    hide_line(slotnum);
  }
  wclear(W);
  switch(slotnum) {
  case O_UP_IN_AIR:
    wprintw(W,"-- Object 'up in air':",usechar);
    break;
  case O_READY_HAND:
    wprintw(W,"-- a%c ready hand: ",usechar);
    break;
  case O_WEAPON_HAND:
    wprintw(W,"-- b%c weapon hand: ",usechar);
    break;
  case O_LEFT_SHOULDER:
    wprintw(W,"-- c%c left shoulder: ",usechar);
    break;
  case O_RIGHT_SHOULDER:
    wprintw(W,"-- d%c right shoulder: ",usechar);
    break;
  case O_BELT1:
    wprintw(W,"-- e%c belt: ",usechar);
    break;
  case O_BELT2:
    wprintw(W,"-- f%c belt: ",usechar);
    break;
  case O_BELT3:
    wprintw(W,"-- g%c belt: ",usechar);
    break;
  case O_SHIELD:
    wprintw(W,"-- h%c shield: ",usechar);
    break;
  case O_ARMOR:
    wprintw(W,"-- i%c armor: ",usechar);
    break;
  case O_BOOTS:
    wprintw(W,"-- j%c boots: ",usechar);
    break;
  case O_CLOAK:
    wprintw(W,"-- k%c cloak: ",usechar);
    break;
  case O_RING1:
    wprintw(W,"-- l%c finger: ",usechar);
    break;
  case O_RING2:
    wprintw(W,"-- m%c finger: ",usechar);
    break;
  case O_RING3:
    wprintw(W,"-- n%c finger: ",usechar);
    break;
  case O_RING4:
    wprintw(W,"-- o%c finger: ",usechar);
    break;
  }
  if (Player.possessions[slotnum]== NULL)
    wprintw(W,"(slot vacant)");
  else wprintw(W,itemid(Player.possessions[slotnum]));
  wrefresh(W);
}

int move_slot(oldslot,newslot,maxslot)
int oldslot,newslot;
{
  if ((newslot >= 0) && (newslot < maxslot)){
    wmove(Showline[oldslot],0,0);
    waddstr(Showline[oldslot],"--");
    wrefresh(Showline[oldslot]);
    wmove(Showline[newslot],0,0);
    wstandout(Showline[newslot]);
    waddstr(Showline[newslot],">>");
    wstandend(Showline[newslot]);
    wrefresh(Showline[newslot]);
    return(newslot);
  }
  else return(oldslot);
}



void display_option_slot(slot)
int slot;
{
  hide_line(slot);
  wclear(Showline[slot]);
  switch(slot) {
  case 1:
    wprintw(Showline[slot],"-- Option BELLICOSE [TF]: ");
    wprintw(Showline[slot], optionp(BELLICOSE) ? "(now T) " : "(now F) ");
    break;
  case 2:
    wprintw(Showline[slot],"-- Option JUMPMOVE [TF]: ");
    wprintw(Showline[slot], optionp(JUMPMOVE) ? "(now T) " : "(now F) ");
    break;
  case 3:
    wprintw(Showline[slot],"-- Option RUNSTOP [TF]: ");
    wprintw(Showline[slot], optionp(RUNSTOP) ? "(now T) " : "(now F) ");
    break;
  case 4:
    wprintw(Showline[slot],"-- Option PICKUP [TF]: ");
    wprintw(Showline[slot], optionp(PICKUP) ? "(now T) " : "(now F) ");
    break;
  case 5:
    wprintw(Showline[slot],"-- Option CONFIRM [TF]: ");
    wprintw(Showline[slot], optionp(CONFIRM) ? "(now T) " : "(now F) ");
    break;
  case 6:
    wprintw(Showline[slot],"-- Option TOPINV [TF]: ");
    wprintw(Showline[slot], optionp(TOPINV) ? "(now T) " : "(now F) ");
    break;
  case 7:
    wprintw(Showline[slot],"-- Option PACKADD [TF]: ");
    wprintw(Showline[slot], optionp(PACKADD) ? "(now T) " : "(now F) ");
    break;
  case 8:
    wprintw(Showline[slot],
	    "-- Option VERBOSITY [(T)erse,(M)edium,(V)erbose]: (now ");
    if (Verbosity == VERBOSE) wprintw(Showline[slot],"Verbose)");
    else if (Verbosity == MEDIUM) wprintw(Showline[slot],"Medium)");
    else wprintw(Showline[slot],"Terse)");
    break;
  case 9:
    wprintw(Showline[slot],"-- Option SEARCHNUM [0>x>10]: (now %d)",Searchnum);
    break;
  }
  wrefresh(Showline[slot]);
}


void display_options()
{
  int i;
  menuclear();
  hide_line(0);
  for(i=1;i<=NUMOPTIONS;i++)
    display_option_slot(i);
}


/* nya ha ha ha ha haaaa.... */
void deathprint()
{
  mgetc();
  waddch(Msgw,'D');
  mgetc();
  waddch(Msgw,'e');
  mgetc();
  waddch(Msgw,'a');
  mgetc();
  waddch(Msgw,'t');
  mgetc();
  waddch(Msgw,'h');
  mgetc();
}
  
void clear_if_necessary()
{
  int x,y;
  getyx(Msg1w,y,x);

  if (x != 0) {
    wclear(Msg1w);
    wrefresh(Msg1w);
  }  

  getyx(Msg2w,y,x);

  if (x != 0) {
    wclear(Msg2w);
    wrefresh(Msg2w);
  }  

  getyx(Msg3w,y,x);

  if (x != 0) {
    wclear(Msg3w);
    wrefresh(Msg3w);
  }

}


void buffercycle(s)
char *s;
{
  int i;
  for(i=9;i>0;i--)
    strcpy(Stringbuffer[i], Stringbuffer[i-1]);
  strcpy(Stringbuffer[0],s);
}


void bufferprint()
{
  int i = 0;
  clearmsg();
  wprintw(Msg1w,"^p for last message, anything else to quit.");
  wrefresh(Msg1w);
  do {
    wclear(Msg2w);
    wprintw(Msg2w,Stringbuffer[i]);
    wrefresh(Msg2w);
    if (++i > 9) i = 0;
  } while (mgetc() == 16);
  clearmsg();
  showcursor(Player.x,Player.y);
}