home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / games / volume5 / omega2 / part02 / oscr.c < prev   
C/C++ Source or Header  |  1988-07-22  |  31KB  |  1,486 lines

  1. /* omega (c) 1987 by Laurence Raphael Brothers */
  2. /* oscr.c */
  3. /* functions that use curses routines directly */
  4. /* plus a few file i/o stuff */
  5. /* also some in ofile.c */
  6.  
  7. #include <curses.h>
  8. #include <sys/types.h>
  9. #include <sys/timeb.h>
  10. #include "oglob.h"
  11.  
  12. char *sprintf();
  13.  
  14. #ifdef EXCESSIVE_REDRAW
  15. #define wclear werase
  16. #endif
  17.  
  18.  
  19. /* note these variables are not exported to other files */
  20.  
  21. WINDOW *Levelw,*Dataw,*Flagw,*Timew,*Menuw,*Locw,*Morew,*Phasew;
  22. WINDOW *Comwin,*Rightside,*Msg1w,*Msg2w,*Msg3w,*Msgw,*Packw;
  23. WINDOW *Hideline[MAXITEMS],*Showline[MAXITEMS];
  24.  
  25. void phaseprint()
  26. {
  27.   wclear(Phasew);
  28.   wprintw(Phasew,"Moon's Phase:\n");
  29.   switch(Phase/2) {
  30.   case 0: wprintw(Phasew,"NEW"); break;
  31.   case 1: case 11: wprintw(Phasew,"CRESCENT"); break;
  32.   case 2: case 10: wprintw(Phasew,"1/4"); break;
  33.   case 3: case 9: wprintw(Phasew,"HALF"); break;
  34.   case 4: case 8: wprintw(Phasew,"3/4"); break;
  35.   case 5: case 7: wprintw(Phasew,"GIBBOUS"); break;
  36.   case 6: wprintw(Phasew,"FULL"); break;
  37.   }
  38. }
  39.  
  40. void show_screen()
  41. {
  42.   int i,j,top,bottom;
  43.   wclear(Levelw);
  44.   top = ScreenOffset;
  45.   bottom = ScreenOffset + ScreenLength;
  46.   top = max(0,top);
  47.   bottom = min(bottom,LENGTH-1);
  48.   if (Current_Environment != E_COUNTRYSIDE) 
  49.     for (j=top;j<=bottom;j++) 
  50.       for (i=0;i<WIDTH;i++) {
  51.     wmove(Levelw,screenmod(j),i);
  52.     waddch(Levelw,(loc_statusp(i,j,SEEN) ?
  53.                getspot(i,j,FALSE) :
  54.                ' '));
  55.       }
  56.   else for (j=top;j<=bottom;j++) 
  57.       for (i=0;i<WIDTH;i++) {
  58.     wmove(Levelw,screenmod(j),i);
  59.     waddch(Levelw,(Country[i][j].explored ? 
  60.                Country[i][j].current_terrain_type : 
  61.                ' '));
  62.       }
  63.   wrefresh(Levelw);
  64. }
  65.  
  66.  
  67.  
  68. char mgetc()
  69. {
  70.   return(wgetch(Msgw));
  71. }
  72.  
  73. /* case insensitive mgetc -- sends uppercase to lowercase */
  74. char mcigetc()
  75. {
  76.   char c = wgetch(Msgw);
  77.   if ((c>='A') && (c<='Z'))
  78.     return(c+('a'-'A'));
  79.   else return(c);
  80. }
  81.  
  82. char menugetc()
  83. {
  84.   return(wgetch(Menuw));
  85. }
  86.  
  87.  
  88. char lgetc()
  89. {
  90.   return(wgetch(Levelw));
  91. }
  92.  
  93.  
  94. char ynq()
  95. {
  96.   char p=' ';
  97.   while ((p != 'n') && (p != 'y') && (p != 'q') && (p != ESCAPE))
  98.     p = wgetch(Msgw);
  99.   switch (p) {
  100.     case 'y': wprintw(Msgw,"yes. "); break;
  101.     case 'n': wprintw(Msgw,"no. "); break;
  102.     case ESCAPE:
  103.     case 'q': wprintw(Msgw,"quit. "); break;
  104.     }
  105.   wrefresh(Msgw);
  106.   return(p);
  107. }
  108.  
  109.  
  110. char ynq1()
  111. {
  112.   char p=' ';
  113.   while ((p != 'n') && (p != 'y') && (p != 'q') && (p != ESCAPE))
  114.     p = wgetch(Msg1w);
  115.   switch (p) {
  116.     case 'y': wprintw(Msg1w,"yes. "); break;
  117.     case 'n': wprintw(Msg1w,"no. "); break;
  118.     case ESCAPE:
  119.     case 'q': wprintw(Msg1w,"quit. "); break;
  120.     }
  121.   wrefresh(Msg1w);
  122.   return(p);
  123. }
  124.  
  125.  
  126. char ynq2()
  127. {
  128.   char p=' ';
  129.   while ((p != 'n') && (p != 'y') && (p != 'q') && (p != ESCAPE))
  130.     p = wgetch(Msg2w);
  131.   switch (p) {
  132.     case 'y': wprintw(Msg2w,"yes. "); break;
  133.     case 'n': wprintw(Msg2w,"no. "); break;
  134.     case ESCAPE:
  135.     case 'q': wprintw(Msg2w,"quit. "); break;
  136.     }
  137.   wrefresh(Msg2w);
  138.   return(p);
  139. }
  140.     
  141. /* puts up a morewait to allow reading if anything in top two lines */
  142. void checkclear()
  143. {
  144.   int x1,y,x2;
  145.   getyx(Msg1w,x1,y);
  146.   getyx(Msg2w,x2,y);  
  147.   if ((x1 != 0) || (x2 != 0)) {
  148.     morewait();
  149.     wclear(Msg1w);
  150.     wclear(Msg2w);
  151.     wrefresh(Msg1w);
  152.     wrefresh(Msg2w);
  153.   }
  154. }
  155.   
  156. /* for external call */
  157. void clearmsg()
  158. {
  159.   wclear(Msg1w);
  160.   wclear(Msg2w);
  161.   wclear(Msg3w);
  162.   Msgw = Msg1w;
  163.   wrefresh(Msg1w);
  164.   wrefresh(Msg2w);
  165.   wrefresh(Msg3w);
  166. }
  167.  
  168. void clearmsg3()
  169. {
  170.   wclear(Msg3w);
  171.   wrefresh(Msg3w);
  172. }
  173.  
  174. void clearmsg1()
  175. {
  176.   wclear(Msg1w);
  177.   wclear(Msg2w);
  178.   Msgw = Msg1w;
  179.   wrefresh(Msg1w);
  180.   wrefresh(Msg2w);
  181. }
  182.  
  183.  
  184. void erase_level()
  185. {
  186.   wclear(Levelw);
  187. }
  188.  
  189. /* direct print to first msg line */
  190. void print1(s)
  191. char *s;
  192. {
  193.   if (! gamestatusp(SUPPRESS_PRINTING)) {
  194.     buffercycle(s);
  195.     wclear(Msg1w);
  196.     wprintw(Msg1w,s);
  197.     wrefresh(Msg1w);
  198.   }
  199. }
  200.  
  201. /* for run on-messages -- print1 clears first.... */
  202. void nprint1(s)
  203. char *s;
  204. {
  205.   if (! gamestatusp(SUPPRESS_PRINTING)) {
  206.     buffercycle(s);
  207.     wprintw(Msg1w,s);
  208.     wrefresh(Msg1w);
  209.   }
  210. }
  211.  
  212.  
  213.  
  214.  
  215. /* direct print to second msg line */
  216. void print2(s)
  217. char *s;
  218. {
  219.   if (! gamestatusp(SUPPRESS_PRINTING)) {
  220.     buffercycle(s);
  221.     wclear(Msg2w);
  222.     wprintw(Msg2w,s);
  223.     wrefresh(Msg2w);
  224.   }
  225. }
  226.  
  227. /* for run on-messages -- print2 clears first.... */
  228. void nprint2(s)
  229. char *s;
  230. {
  231.   if (! gamestatusp(SUPPRESS_PRINTING)) {
  232.     buffercycle(s);
  233.     wprintw(Msg2w,s);
  234.     wrefresh(Msg2w);
  235.   }
  236. }
  237.  
  238.  
  239.  
  240.  
  241. /* msg line 3 is not part of the region that mprint or printm can reach */
  242. /* typical use of print3 is for "you can't do that" type error messages */
  243. void print3(s)
  244. char *s;
  245. {
  246.   if (! gamestatusp(SUPPRESS_PRINTING)) {
  247.     buffercycle(s);
  248.     wclear(Msg3w);
  249.     wprintw(Msg3w,s);
  250.     wrefresh(Msg3w);
  251.   }
  252. }
  253.  
  254. /* for run on-messages -- print3 clears first.... */
  255. void nprint3(s)
  256. char *s;
  257. {
  258.   if (! gamestatusp(SUPPRESS_PRINTING)) {
  259.     buffercycle(s);
  260.     wprintw(Msg3w,s);
  261.     wrefresh(Msg3w);
  262.   }
  263. }
  264.  
  265.  
  266.  
  267. /* prints wherever cursor is in window, but checks to see if
  268. it should morewait and clear window */
  269. void mprint(s)
  270. char *s;
  271. {
  272.   int x,y;
  273.   if (! gamestatusp(SUPPRESS_PRINTING)) {
  274.     buffercycle(s);
  275.     getyx(Msgw,y,x);
  276.     if (x+strlen(s) >= WIDTH) {
  277.       if (Msgw == Msg1w) {
  278.     wclear(Msg2w);
  279.     Msgw = Msg2w;
  280.       }
  281.       else {
  282.     morewait();
  283.     wclear(Msg1w);
  284.     wclear(Msg2w);
  285.     wrefresh(Msg2w);
  286.     Msgw = Msg1w;
  287.       }
  288.     }
  289.     wprintw(Msgw,s);
  290.     waddch(Msgw,' '); 
  291.     wrefresh(Msgw);
  292.   }
  293. }
  294.  
  295.  
  296.  
  297.  
  298. void title()
  299. {
  300.   showmotd();
  301.   /* Pseudo Random Seed */
  302.   Seed = (int) time((long *)NULL);
  303.   clear();
  304.   refresh();  
  305.   showscores();
  306. }
  307.  
  308.  
  309.  
  310.  
  311.  
  312. /* blanks out ith line of Menuw or Levelw */
  313. /* This is a serious kluge, but nothing else seems to work the way
  314.    I want it to! */
  315. void hide_line(i)
  316. int i;
  317. {
  318.   touchwin(Hideline[i]);
  319.   wrefresh(Hideline[i]);
  320. }
  321.  
  322.  
  323.  
  324. /* initialize, screen, windows */
  325. void initgraf()
  326. {
  327.   int i;
  328.   initscr();
  329.   if (LINES < 24) {
  330.     printf("Minimum Screen Size: 24 Lines.");
  331.     exit(0);
  332.   }
  333.   else ScreenLength = LINES - 6;
  334.   Rightside = newwin(ScreenLength,15,2,65);
  335.   Msg1w = newwin(1,80,0,0);
  336.   Msg2w = newwin(1,80,1,0);
  337.   Msg3w = newwin(1,80,2,0);
  338.   Msgw = Msg1w;
  339.   Morew = newwin(1,15,3,65);  
  340.   Locw = newwin(1,80,ScreenLength+3,0);
  341.   Levelw = newwin(ScreenLength,64,3,0);
  342.   for(i=0;i<MAXITEMS;i++) {
  343.     Hideline[i] = newwin(1,64,i+3,0);
  344.     Showline[i] = newwin(1,64,i+3,0);
  345.     wclear(Hideline[i]);
  346.     wclear(Showline[i]);
  347.   }
  348.   Menuw = newwin(ScreenLength,64,3,0);
  349.   Packw = newwin(ScreenLength,64,3,0);
  350.   Dataw = newwin(2,80,ScreenLength+4,0);
  351.   Timew = newwin(2,15,4,65);
  352.   Phasew = newwin(2,15,6,65);
  353.   Flagw = newwin(4,15,9,65);
  354.   Comwin = newwin(8,15,14,65);
  355.  
  356.   noecho();
  357.   crmode();
  358.  
  359.   clear();
  360.   title();
  361.   clear();
  362.   refresh();
  363. }
  364.  
  365.  
  366.  
  367.  
  368.  
  369. void drawplayer()
  370. {
  371.   static int lastx= -1,lasty= -1;
  372.   if (Current_Environment == E_COUNTRYSIDE) {
  373.     wmove(Levelw,screenmod(lasty),lastx);
  374.     waddch(Levelw,Country[lastx][lasty].current_terrain_type);
  375.     wmove(Levelw,screenmod(Player.y),Player.x);
  376.     waddch(Levelw,PLAYER);
  377.   }
  378.   else {
  379.     if (inbounds(lastx,lasty))
  380.       plotspot(lastx,lasty,(Player.status[BLINDED]>0 ? FALSE : TRUE));
  381.     wmove(Levelw,screenmod(Player.y),Player.x);
  382.     if ((! Player.status[INVISIBLE]) || Player.status[TRUESIGHT])
  383.       waddch(Levelw,PLAYER);
  384.   }
  385.   lastx = Player.x;
  386.   lasty = Player.y;
  387. }
  388.  
  389. int litroom(x,y)
  390. int x,y;
  391. {
  392.   if (Level->site[x][y].roomnumber < ROOMBASE) return(FALSE);
  393.   else return(loc_statusp(x,y,LIT) ||
  394.           Player.status[ILLUMINATION]);
  395. }
  396.  
  397. void drawvision(x,y)
  398. int x,y;
  399. {
  400.   static int oldx = -1,oldy = -1;
  401.   int i,j;
  402.  
  403.   if (Current_Environment != E_COUNTRYSIDE) {
  404.     if (Player.status[BLINDED]) {
  405.       drawspot(oldx,oldy);
  406.       drawspot(x,y);
  407.       drawplayer();
  408.     }
  409.     else {
  410.       if (Player.status[ILLUMINATION] > 0) {
  411.     for (i= -2;i<3;i++)
  412.       for (j= -2;j<3;j++)
  413.         if (inbounds(x+i,y+j))
  414.           if (view_los_p(x+i,y+j,Player.x,Player.y))
  415.         dodrawspot(x+i,y+j);
  416.       }
  417.       else {
  418.     for (i= -1;i<2;i++)
  419.       for (j= -1;j<2;j++)
  420.         if (inbounds(x+i,y+j))
  421.           dodrawspot(x+i,y+j);
  422.       }
  423.       drawplayer();
  424.       drawmonsters(FALSE); /* erase all monsters */
  425.       drawmonsters(TRUE);  /* draw those now visible */
  426.     }
  427.     if ((! gamestatusp(FAST_MOVE)) || (! optionp(JUMPMOVE)))
  428.       showcursor(Player.x,Player.y);
  429.     oldx = x;
  430.     oldy = y;
  431.   }
  432.   else {
  433.     for (i= -1;i<2;i++)
  434.       for (j= -1;j<2;j++)
  435.     if (inbounds(x+i,y+j)) {
  436.       wmove(Levelw,screenmod(y+j),x+i);
  437.       Country[x+i][y+j].explored = TRUE;
  438.       waddch(Levelw,Country[x+i][y+j].current_terrain_type);
  439.     }
  440.     drawplayer();
  441.     showcursor(Player.x,Player.y);
  442.   }
  443. }
  444.  
  445.  
  446. void showcursor(x,y)
  447. int x,y;
  448. {
  449.   wmove(Levelw,screenmod(y),x);
  450.   wrefresh(Levelw);
  451. }
  452.  
  453. void levelrefresh()
  454. {
  455.   wrefresh(Levelw);
  456. }
  457.  
  458.  
  459. /* draws a particular spot under if in line-of-sight */
  460. void drawspot(x,y)
  461. int x,y;
  462. {
  463.   char c = getspot(x,y,FALSE);
  464.   if (c != Level->site[x][y].showchar)
  465.     if (view_los_p(Player.x,Player.y,x,y)) {
  466.       lset(x,y,SEEN);
  467.       Level->site[x][y].showchar = c;
  468.       putspot(x,y,c);
  469.     }
  470. }
  471.  
  472.  
  473.  
  474. /* draws a particular spot regardless of line-of-sight */
  475. void dodrawspot(x,y)
  476. int x,y;
  477. {
  478.   char c = getspot(x,y,FALSE);
  479.   if (c != Level->site[x][y].showchar) {
  480.     lset(x,y,SEEN);
  481.     Level->site[x][y].showchar = c;
  482.     putspot(x,y,c);
  483.   }
  484. }
  485.  
  486. /* write a blank to a spot if it is floor */
  487. void blankoutspot(i,j)
  488. int i,j;
  489. {
  490.   lreset(i,j,LIT);
  491.   if (Level->site[i][j].locchar == FLOOR)  {
  492.     Level->site[i][j].showchar = ' ';
  493.     putspot(i,j,' ');
  494.   }
  495. }
  496.  
  497. /* blank out a spot regardless */
  498. void blotspot(i,j)
  499. int i,j;
  500. {
  501.   lreset(i,j,SEEN);
  502.   Level->site[i][j].showchar = SPACE;
  503.   if (! offscreen(j)) {
  504.     wmove(Levelw,screenmod(j),i);
  505.     wdelch(Levelw);
  506.     winsch(Levelw,SPACE);
  507.   }
  508. }
  509.  
  510.  
  511. /* for displaying activity specifically at some point */
  512. void plotspot(x,y,showmonster)
  513. int x,y,showmonster;
  514. {
  515.   if (loc_statusp(x,y,SEEN))
  516.     putspot(x,y,getspot(x,y,showmonster));
  517.   else 
  518.     putspot(x,y,' ');
  519. }
  520.  
  521.  
  522. /* Puts c at x,y on screen. No fuss, no bother. */
  523. void putspot(x,y,c)
  524. int x,y;
  525. char c;
  526. {
  527.   if (! offscreen(y)) {
  528.     wmove(Levelw,screenmod(y),x);
  529.     waddch(Levelw,c);
  530.   }
  531. }
  532.  
  533.  
  534. /* regardless of line of sight, etc, draw a monster */
  535. void plotmon(m)
  536. struct monster *m;
  537. {
  538.   if (! offscreen(m->y)) {
  539.     wmove(Levelw,screenmod(m->y),m->x);
  540.     waddch(Levelw,m->monchar);
  541.   }
  542. }
  543.   
  544. /* if display, displays monsters, otherwise erases them */
  545. void drawmonsters(display)
  546. int display;
  547. {
  548.   pml ml;
  549.   for (ml=Level->mlist;ml!=NULL;ml=ml->next) {
  550.     if (ml->m->hp > 0) {
  551.       if (display) {
  552.     if (view_los_p(Player.x,Player.y,ml->m->x,ml->m->y)) {
  553.       if (Player.status[TRUESIGHT] || (! m_statusp(ml->m,M_INVISIBLE))) {
  554.         if ((ml->m->level > 5) &&
  555.         (ml->m->monchar != '@') &&
  556.         (ml->m->monchar != '|')) wstandout(Levelw);
  557.         putspot(ml->m->x,ml->m->y,ml->m->monchar);
  558.         wstandend(Levelw);
  559.       }
  560.     }
  561.       }
  562.       else erase_monster(ml->m);
  563.     }
  564.   }
  565. }
  566.  
  567. /* replace monster with what would be displayed if monster weren't there */
  568. void erase_monster(m)
  569. struct monster *m;
  570. {
  571.   if (loc_statusp(m->x,m->y,SEEN))
  572.     putspot(m->x,m->y,getspot(m->x,m->y,FALSE));
  573.   else blotspot(m->x,m->y);
  574. }
  575.  
  576. /* find apt char to display at some location */
  577. char getspot(x,y,showmonster)
  578. int x,y,showmonster;
  579. {
  580.   if (loc_statusp(x,y,SECRET)) return(WALL);
  581.   else switch (Level->site[x][y].locchar) {
  582.   case WATER:
  583.     if (Level->site[x][y].creature == NULL) 
  584.       return(WATER);
  585.     else if (m_statusp(Level->site[x][y].creature,SWIMMING))
  586.       return(WATER);
  587.     else return(Level->site[x][y].creature->monchar);
  588.     break;
  589.   /* these sites never show anything but their location char's */
  590.   case CLOSED_DOOR:
  591.   case LAVA:
  592.   case FIRE:
  593.   case ABYSS:
  594.     return(Level->site[x][y].locchar);
  595.     break;
  596.   /* rubble and hedge don't show items on their location */
  597.   case RUBBLE:
  598.   case HEDGE:
  599.     if (showmonster && (Level->site[x][y].creature != NULL)) {
  600.       if ((m_statusp(Level->site[x][y].creature,M_INVISIBLE)) &&
  601.       (! Player.status[TRUESIGHT]))
  602.     return(getspot(x,y,FALSE));
  603.       else return (Level->site[x][y].creature->monchar);
  604.     }
  605.     else return(Level->site[x][y].locchar);
  606.     break;
  607.   /* everywhere else, first try to show monster, next show items, next show
  608.      location char */
  609.   default:
  610.     if (showmonster && (Level->site[x][y].creature != NULL)) {
  611.       if ((m_statusp(Level->site[x][y].creature,M_INVISIBLE)) &&
  612.       (! Player.status[TRUESIGHT]))
  613.     return(getspot(x,y,FALSE));
  614.       else return (Level->site[x][y].creature->monchar);
  615.     }
  616.     else if (Level->site[x][y].things != NULL) {
  617.       if (Level->site[x][y].things->next != NULL)
  618.     return(PILE);
  619.       else return(Level->site[x][y].things->thing->objchar);
  620.     }
  621.     else return(Level->site[x][y].locchar);
  622.     break;
  623.   }
  624. }
  625.  
  626. void commanderror()
  627. {
  628.   wclear(Msg3w);
  629.   wprintw(Msg3w,"%c : unknown command",Cmd);
  630.   wrefresh(Msg3w);
  631. }
  632.  
  633. void timeprint()
  634. {
  635.   wclear(Timew);
  636.   wprintw(Timew,"%d:%d",showhour(),showminute());
  637.   if (showminute()==0) waddch(Timew,'0');
  638.   wprintw(Timew,hour()>11 ? " PM \n" : " AM \n");
  639.   wprintw(Timew,month());
  640.   wprintw(Timew," the %d",day());
  641.   wprintw(Timew,ordinal(day()));
  642.   wrefresh(Timew);
  643. }
  644.  
  645.  
  646. void comwinprint()
  647. {
  648.   wclear(Comwin);
  649.   wprintw(Comwin,"Hit: %d  \n",Player.hit);
  650.   wprintw(Comwin,"Dmg: %d  \n",Player.dmg);
  651.   wprintw(Comwin,"Def: %d  \n",Player.defense);
  652.   wprintw(Comwin,"Arm: %d  \n",Player.absorption);
  653.   wprintw(Comwin,"Spd: %.2f  \n",5.0/Player.speed);
  654.   wrefresh(Comwin);
  655. }
  656.  
  657. void dataprint()
  658. {
  659.   wclear(Dataw);
  660.   wprintw(Dataw,"HP:%d/%d MANA:%d/%d AU:%d LEVEL:%d/%d CARRY:%d/%d \n",
  661.       Player.hp,Player.maxhp,Player.mana,Player.maxmana,Player.cash,
  662.       Player.level,Player.xp,Player.itemweight,Player.maxweight);
  663.   wprintw(Dataw,"STR:%d/%d CON:%d/%d DEX:%d/%d AGI:%d/%d INT:%d/%d POW:%d/%d   ",
  664.       Player.str,Player.maxstr,Player.con,Player.maxcon,
  665.       Player.dex,Player.maxdex,Player.agi,Player.maxagi,
  666.       Player.iq,Player.maxiq,Player.pow,Player.maxpow);
  667.   wrefresh(Dataw);
  668.   wrefresh(Dataw);
  669. }
  670.  
  671.  
  672. /* redraw everything currently displayed */
  673. void redraw()
  674. {
  675.   touchwin(curscr);
  676.   wrefresh(curscr);
  677. }  
  678.  
  679. /* redraw each permanent window */
  680. void xredraw()
  681. {
  682.   wclear(Rightside);
  683.   wrefresh(Rightside);
  684.   touchwin(Msgw);
  685.   touchwin(Msg3w);
  686.   touchwin(Levelw);
  687.   touchwin(Timew);
  688.   touchwin(Flagw);
  689.   touchwin(Dataw);
  690.   touchwin(Locw);
  691.   touchwin(Morew);
  692.   touchwin(Phasew);
  693.   touchwin(Comwin); 
  694.   wrefresh(Msgw);
  695.   wrefresh(Msg3w);
  696.   wrefresh(Levelw);
  697.   wrefresh(Timew);
  698.   wrefresh(Flagw);
  699.   wrefresh(Dataw);
  700.   wrefresh(Locw);
  701.   wrefresh(Morew);
  702.   wrefresh(Phasew);
  703.   wrefresh(Comwin);
  704. }
  705.  
  706.  
  707.  
  708. void menuaddch(c)
  709. char c;
  710. {
  711.   waddch(Menuw,c);
  712.   wrefresh(Menuw);
  713. }
  714.  
  715.  
  716.  
  717. void morewait()
  718. {
  719.   int display=TRUE;
  720.   char c;
  721.   do {
  722.     wclear(Morew);
  723.     if (display) wprintw(Morew,"***  MORE  ***");
  724.     else wprintw(Morew,"+++  MORE  +++");
  725.     display = ! display;
  726.     wrefresh(Morew);
  727.     c = wgetch(Msgw);
  728.   } while ((c != SPACE) && (c != RETURN));
  729.   wclear(Morew);
  730.   wrefresh(Morew);
  731. }
  732.  
  733. int stillonblock()
  734. {
  735.   int display=TRUE;
  736.   char c;
  737.   do {
  738.     wclear(Morew);
  739.     if (display) wprintw(Morew,"<<<STAY?>>>");
  740.     else wprintw(Morew,">>>STAY?<<<");
  741.     display = ! display;
  742.     wrefresh(Morew);
  743.     c = wgetch(Msgw);
  744.   } while ((c != SPACE) && (c != ESCAPE));
  745.   wclear(Morew);
  746.   wrefresh(Morew);
  747.   return (c == SPACE);
  748. }
  749.  
  750. void menuclear()
  751. {
  752.   wclear(Menuw);
  753.   wrefresh(Menuw);
  754. }
  755.  
  756. void menuspellprint(i)
  757. int i;
  758. {
  759.   int x,y;
  760.   getyx(Menuw,y,x);
  761.   if (y >= ScreenLength - 2) {
  762.     morewait();
  763.     wclear(Menuw);
  764.   }
  765.   wprintw(Menuw,spellid(i));
  766.   wprintw(Menuw,"(%d)\n",Spells[i].powerdrain);
  767.   wrefresh(Menuw);
  768. }  
  769.  
  770. void menuprint(s)
  771. char *s;
  772. {
  773.   int x,y;
  774.   getyx(Menuw,y,x);
  775.   if (y >= ScreenLength - 2) {
  776.     morewait();
  777.     wclear(Menuw);
  778.   }
  779.   wprintw(Menuw,s);
  780.   wrefresh(Menuw);
  781. }
  782.  
  783.  
  784.  
  785. void endgraf()
  786. {
  787. clear();
  788. refresh();
  789. endwin();
  790. }
  791.  
  792.  
  793. void plotchar(pyx,x,y)
  794. char pyx;
  795. int x,y;
  796. {
  797.   if (! offscreen(y)) {
  798.     wmove(Levelw,screenmod(y),x);
  799.     waddch(Levelw,pyx);
  800.     wrefresh(Levelw);
  801.   }
  802. }
  803.  
  804.  
  805.  
  806. void draw_explosion(pyx,x,y)
  807. char pyx;
  808. int x,y;
  809. {
  810.   int i,j;
  811.   
  812.   for(j=0;j<3;j++) {
  813.     for(i=0;i<9;i++) 
  814.       plotchar(pyx,x+Dirs[0][i],y+Dirs[1][i]);
  815.     for(i=0;i<9;i++)
  816.       plotchar(' ',x+Dirs[0][i],y+Dirs[1][i]);
  817.   }
  818.   for(i=0;i<9;i++) 
  819.     plotspot(x+Dirs[0][i],y+Dirs[1][i],TRUE);
  820.   wrefresh(Levelw);
  821. }
  822.  
  823. char *msgscanstring()
  824. {
  825.   static char instring[80],byte='x';
  826.   int i=0;
  827.  
  828.   instring[0]=0;
  829.   byte = mgetc();
  830.   while (byte != '\n') {
  831.     if ((byte == 8) || (byte == 127)) { /* ^h or delete */
  832.       instring[i] = 0;
  833.       if (i>0){ 
  834.     i--;
  835.     dobackspace();
  836.       }
  837.     }
  838.     else {
  839.       instring[i] = byte;
  840.       waddch(Msgw,byte);
  841.       wrefresh(Msgw);
  842.       i++;
  843.       instring[i] = 0;
  844.     }
  845.     byte = mgetc();
  846.   } 
  847.   return(instring);
  848. }
  849.  
  850.  
  851. void locprint(s)
  852. char *s;
  853. {
  854.   wclear(Locw);
  855.   wprintw(Locw,s);
  856.   wrefresh(Locw);
  857. }
  858.  
  859. /* draw everything whether visible or not */
  860. void drawscreen()
  861. {
  862.   int i,j;
  863.   if (Current_Environment == E_COUNTRYSIDE)
  864.     for (i=0;i<WIDTH;i++)
  865.       for(j=0;j<LENGTH;j++)
  866.     putspot(i,j,Country[i][j].current_terrain_type);
  867.   else for (i=0;i<WIDTH;i++)
  868.     for(j=0;j<LENGTH;j++)
  869.       putspot(i,j,Level->site[i][j].locchar);
  870.   wrefresh(Levelw);
  871.   morewait();
  872.   xredraw();
  873. }
  874.  
  875. /*selects a number up to range */
  876.  
  877. int getnumber(range)
  878. {
  879.   int done=FALSE,value=1;
  880.   char atom;
  881.  
  882.   if (range==1) return(1);
  883.   else while (! done) {
  884.     clearmsg1();
  885.     wprintw(Msg1w,"How many? Change with < or >, ESCAPE to select:");
  886.     mnumprint(value);
  887.     do atom=mgetc();
  888.     while ((atom != '<')&&(atom != '>')&&(atom!=ESCAPE));
  889.     if ((atom=='>') && (value < range)) value++;
  890.     else if ((atom=='<') && (value > 1)) value--;
  891.     else if (atom==ESCAPE) done = TRUE;
  892.   }
  893.   return(value);
  894. }
  895.  
  896. /* reads a positive number up to 999999 */
  897. int parsenum()
  898. {
  899.   int number[8];
  900.   int place = -1;
  901.   int i,x,y,num=0,mult=1;
  902.   char byte=' ';
  903.  
  904.   while ((byte != ESCAPE) && (byte != '\n')) {
  905.     byte = mgetc();
  906.     if ((byte == BACKSPACE) || (byte == DELETE)) {
  907.       if (place > -1) {
  908.     number[place] = 0;
  909.     place--;
  910.     getyx(Msgw,y,x);
  911.     wmove(Msgw,y,x-1);
  912.     waddch(Msgw,' ');
  913.     wmove(Msgw,y,x-1);
  914.     wrefresh(Msgw);
  915.       }
  916.     }
  917.     else if ((byte <= '9') && (byte >= '0') && (place < 7)) {
  918.       place++;
  919.       number[place]=byte;
  920.       waddch(Msgw,byte);
  921.       wrefresh(Msgw);
  922.     }
  923.   }
  924.   waddch(Msgw,' ');
  925.   if (byte == ESCAPE) return(ABORT);
  926.   else {
  927.     for (i=place;i>=0;i--) {
  928.       num += mult*(number[i]-'0');
  929.       mult*=10;
  930.     }
  931.     return(num);
  932.   }
  933. }
  934.  
  935.  
  936.     
  937. void maddch(c)
  938. char c;
  939. {
  940.   waddch(Msgw,c);
  941.   wrefresh(Msgw);
  942. }
  943.  
  944.  
  945. void display_death(source)
  946. char *source;
  947. {
  948.   clear();
  949.   printw("\n\n\n\n");
  950.   printw("Requiescat In Pace, ");
  951.   printw(Player.name);
  952.   printw(" (%d points)",calc_points());
  953.   strcpy(Str4,"Killed by ");
  954.   strcat(Str4,source);
  955.   printw("\n");
  956.   printw(Str4);
  957.   printw(".");
  958.   printw("\n\n\n\n\nHit any key to continue.");
  959.   refresh();
  960.   wgetch(stdscr);
  961.   clear();
  962.   refresh();
  963.   extendlog(Str4,DEAD);
  964. }
  965.  
  966.  
  967. void display_win()
  968. {
  969.   clear();
  970.   printw("\n\n\n\n");
  971.   printw(Player.name);
  972.   if (Player.status[ADEPT]) {
  973.     printw(" is a total master of omega with %d points!",FixedPoints);
  974.     strcpy(Str4,"A total master of omega");
  975.   }
  976.   else {
  977.     strcpy(Str4,"retired a winner");
  978.     printw(" triumphed in omega with %d points!",calc_points());
  979.   }
  980.   printw("\n\n\n\n\nHit any key to continue.");
  981.   refresh();
  982.   wgetch(stdscr);
  983.   clear();
  984.   refresh();
  985.   if (Player.status[ADEPT])
  986.     extendlog(Str4,BIGWIN);
  987.   else extendlog(Str4,WIN);
  988. }
  989.  
  990. void display_quit()
  991. {
  992.   clear();
  993.   printw("\n\n\n\n");
  994.   printw(Player.name);
  995.   strcpy(Str4,"A quitter.");
  996.   printw(" wimped out with %d points!",calc_points());
  997.   printw("\n\n\n\n\nHit any key to continue.");
  998.   refresh();
  999.   wgetch(stdscr);
  1000.   clear();
  1001.   refresh();
  1002.   extendlog(Str4,QUIT);
  1003. }
  1004.  
  1005.  
  1006. void display_bigwin()
  1007. {
  1008.   clear();
  1009.   printw("\n\n\n\n");
  1010.   printw(Player.name);
  1011.   strcpy(Str4,"retired, an Adept of Omega.");
  1012.   printw(" retired, an Adept of Omega with %d points!",FixedPoints);
  1013.   printw("\n\n\n\n\nHit any key to continue.");
  1014.   refresh();
  1015.   wgetch(stdscr);
  1016.   clear();
  1017.   refresh();
  1018.   extendlog(Str4,BIGWIN);
  1019. }
  1020.  
  1021.  
  1022. void mnumprint(n)
  1023. int n;
  1024. {
  1025.   char numstr[20];
  1026.   sprintf(numstr,"%d",n);
  1027.   buffercycle(numstr);
  1028.   wprintw(Msgw,"%d",n);
  1029.   wrefresh(Msgw);
  1030. }
  1031.  
  1032. void menunumprint(n)
  1033. int n;
  1034. {
  1035.   int x,y;
  1036.   getyx(Menuw,y,x);
  1037.   if (y >= ScreenLength - 2) {
  1038.     morewait();
  1039.     wclear(Menuw);
  1040.   }
  1041.   wprintw(Menuw,"%d",n);
  1042.   wrefresh(Menuw);
  1043. }
  1044.  
  1045. void dobackspace()
  1046. {
  1047.   int x,y;
  1048.  
  1049.   getyx(Msgw,y,x);
  1050.   if (x > 0) {
  1051.     waddch(Msgw,' ');
  1052.     wmove(Msgw,y,x-1);
  1053.     waddch(Msgw,' ');
  1054.     wmove(Msgw,y,x-1);
  1055.   }
  1056.   wrefresh(Msgw);
  1057. }
  1058.  
  1059.  
  1060. void showflags()
  1061. {
  1062.  
  1063.   phaseprint();
  1064.   wclear(Flagw);
  1065.   if (Player.food < 0)
  1066.     wprintw(Flagw,"Starving\n");
  1067.   else if (Player.food <= 3)
  1068.     wprintw(Flagw,"Weak\n");
  1069.   else if (Player.food <= 10)
  1070.     wprintw(Flagw,"Ravenous\n");
  1071.   else if (Player.food <= 20)
  1072.     wprintw(Flagw,"Hungry\n");
  1073.   else if (Player.food <= 30)
  1074.     wprintw(Flagw,"A mite peckish\n");
  1075.   else if (Player.food <= 36)
  1076.     wprintw(Flagw,"Content\n");
  1077.   else if (Player.food <= 44)
  1078.     wprintw(Flagw,"Satiated\n");
  1079.   else wprintw(Flagw,"Bloated\n");
  1080.  
  1081.  
  1082.   if (Player.status[POISONED]>0)
  1083.     wprintw(Flagw,"Poisoned\n");
  1084.   else wprintw(Flagw,"Vigorous\n");
  1085.  
  1086.   if (Player.status[DISEASED]>0)
  1087.     wprintw(Flagw,"Diseased\n");
  1088.   else wprintw(Flagw,"Healthy\n");
  1089.  
  1090.   if (gamestatusp(MOUNTED)) wprintw(Flagw,"Mounted\n");
  1091.   else if (Player.status[LEVITATING]) wprintw(Flagw,"Levitating\n");
  1092.   else wprintw(Flagw,"Afoot\n");
  1093.  
  1094.   wrefresh(Flagw);
  1095. }
  1096.  
  1097. void drawomega()
  1098. {
  1099.   int i;
  1100.   for(i=0;i<7;i++) {
  1101.   clear();
  1102.   printw("\n\n\n");
  1103.   printw("\n                                    *****");
  1104.   printw("\n                               ******   ******");
  1105.   printw("\n                             ***             ***");
  1106.   printw("\n                           ***                 ***");
  1107.   printw("\n                          **                     **");
  1108.   printw("\n                         ***                     ***");
  1109.   printw("\n                         **                       **");
  1110.   printw("\n                         **                       **");
  1111.   printw("\n                         ***                     ***");
  1112.   printw("\n                          ***                   ***");
  1113.   printw("\n                            **                 **");
  1114.   printw("\n                       *   ***                ***   *");
  1115.   printw("\n                        ****                    ****");
  1116.   refresh();
  1117.   clear();
  1118.   printw("\n\n\n");
  1119.   printw("\n                                    +++++");
  1120.   printw("\n                               ++++++   ++++++");
  1121.   printw("\n                             +++             +++");
  1122.   printw("\n                           +++                 +++");
  1123.   printw("\n                          ++                     ++");
  1124.   printw("\n                         +++                     +++");
  1125.   printw("\n                         ++                       ++");
  1126.   printw("\n                         ++                       ++");
  1127.   printw("\n                         +++                     +++");
  1128.   printw("\n                          +++                   +++");
  1129.   printw("\n                            ++                 ++");
  1130.   printw("\n                       +   +++                +++   +");
  1131.   printw("\n                        ++++                    ++++");
  1132.   refresh();
  1133.   clear();
  1134.   printw("\n\n\n");
  1135.   printw("\n                                    .....");
  1136.   printw("\n                               ......   ......");
  1137.   printw("\n                             ...             ...");
  1138.   printw("\n                           ...                 ...");
  1139.   printw("\n                          ..                     ..");
  1140.   printw("\n                         ...                     ...");
  1141.   printw("\n                         ..                       ..");
  1142.   printw("\n                         ..                       ..");
  1143.   printw("\n                         ...                     ...");
  1144.   printw("\n                          ...                   ...");
  1145.   printw("\n                            ..                 ..");
  1146.   printw("\n                       .   ...                ...   .");
  1147.   printw("\n                        ....                    ....");
  1148.   refresh();
  1149.   }
  1150. }               
  1151.  
  1152. /* y is an absolute coordinate */
  1153. /* ScreenOffset is the upper left hand corner of the current screen
  1154.    in absolute coordinates */
  1155.  
  1156. void screencheck(y)
  1157. int y;
  1158. {
  1159.   if (((y-ScreenOffset) < (ScreenLength/8)) ||
  1160.       ((y-ScreenOffset) > (7*ScreenLength/8))) {
  1161.     ScreenOffset = y - (ScreenLength/2);
  1162.     show_screen();
  1163.   }
  1164. }
  1165.  
  1166.  
  1167.  
  1168.  
  1169. void spreadroomlight(x,y,roomno)
  1170. int x,y,roomno;
  1171. {
  1172.   lightspot(x,y);
  1173.  
  1174.   if (inbounds(x+1,y)) {
  1175.     if ((! loc_statusp(x+1,y,LIT)) && 
  1176.     (Level->site[x+1][y].roomnumber == roomno)) 
  1177.       spreadroomlight(x+1,y,roomno);
  1178.     else lightspot(x+1,y);
  1179.   }
  1180.  
  1181.   if (inbounds(x,y+1)) {
  1182.     if ((! loc_statusp(x,y+1,LIT)) && 
  1183.     (Level->site[x][y+1].roomnumber == roomno)) 
  1184.       spreadroomlight(x,y+1,roomno);
  1185.     else lightspot(x,y+1);
  1186.   }
  1187.  
  1188.   if (inbounds(x-1,y)) {
  1189.     if ((! loc_statusp(x-1,y,LIT)) && 
  1190.     (Level->site[x-1][y].roomnumber == roomno)) 
  1191.       spreadroomlight(x-1,y,roomno);
  1192.     else lightspot(x-1,y);
  1193.   }
  1194.  
  1195.   if (inbounds(x,y-1)) {
  1196.     if ((! loc_statusp(x,y-1,LIT)) && 
  1197.     (Level->site[x][y-1].roomnumber == roomno)) 
  1198.       spreadroomlight(x,y-1,roomno);
  1199.     else lightspot(x,y-1);
  1200.   }
  1201. }
  1202.  
  1203. /* illuminate one spot at x y */
  1204. void lightspot(x,y)
  1205. int x,y;
  1206.   char c;
  1207.   lset(x,y,LIT);
  1208.   lset(x,y,SEEN);
  1209.   c = getspot(x,y,FALSE);
  1210.   Level->site[x][y].showchar = c;
  1211.   putspot(x,y,c);
  1212. }
  1213.  
  1214.  
  1215.  
  1216. void spreadroomdark(x,y,roomno)
  1217. int x,y,roomno;
  1218. {
  1219.   if (inbounds(x,y))
  1220.     if (loc_statusp(x,y,LIT) && (Level->site[x][y].roomnumber == roomno)) {
  1221.       blankoutspot(x,y);
  1222.       spreadroomdark(x+1,y,roomno);
  1223.       spreadroomdark(x,y+1,roomno);
  1224.       spreadroomdark(x-1,y,roomno);
  1225.       spreadroomdark(x,y-1,roomno);
  1226.     }
  1227. }
  1228.  
  1229.  
  1230.  
  1231.  
  1232. void display_pack()
  1233. {
  1234.   int i,x,y;
  1235.   if (Player.packptr < 1) print3("Pack is empty.");
  1236.   else {
  1237.     wclear(Packw);
  1238.     wprintw(Packw,"Items in Pack:");
  1239.     for(i=0;i<Player.packptr;i++) {
  1240.       wprintw(Packw,"\n");
  1241.       getyx(Packw,y,x);
  1242.       if (y >= ScreenLength - 2) {
  1243.     wrefresh(Packw);
  1244.     morewait();
  1245.     wclear(Packw);
  1246.       }
  1247.       waddch(Packw,i+'A');
  1248.       waddch(Packw,':');
  1249.       wprintw(Packw,itemid(Player.pack[i]));
  1250.     }
  1251.     wrefresh(Packw);
  1252.   }
  1253. }
  1254.  
  1255.  
  1256. void display_possessions()
  1257. {
  1258.   int i;
  1259.   wclear(Menuw);
  1260.   for(i=0;i<MAXITEMS;i++) 
  1261.     display_inventory_slot(i,FALSE);
  1262.   move_slot(1,0,MAXITEMS);
  1263.   wrefresh(Menuw);
  1264. }
  1265.  
  1266.  
  1267.  
  1268. void display_inventory_slot(slotnum,topline)
  1269. int slotnum;
  1270. int topline;
  1271. {
  1272.   WINDOW *W;
  1273.   char usechar = ')';
  1274.   if (Player.possessions[slotnum] != NULL)
  1275.     if (Player.possessions[slotnum]->used)
  1276.       usechar = '>';
  1277.   if (topline) W = Msg3w;
  1278.   else {
  1279.     W = Showline[slotnum];
  1280.     hide_line(slotnum);
  1281.   }
  1282.   wclear(W);
  1283.   switch(slotnum) {
  1284.   case O_UP_IN_AIR:
  1285.     wprintw(W,"-- Object 'up in air':",usechar);
  1286.     break;
  1287.   case O_READY_HAND:
  1288.     wprintw(W,"-- a%c ready hand: ",usechar);
  1289.     break;
  1290.   case O_WEAPON_HAND:
  1291.     wprintw(W,"-- b%c weapon hand: ",usechar);
  1292.     break;
  1293.   case O_LEFT_SHOULDER:
  1294.     wprintw(W,"-- c%c left shoulder: ",usechar);
  1295.     break;
  1296.   case O_RIGHT_SHOULDER:
  1297.     wprintw(W,"-- d%c right shoulder: ",usechar);
  1298.     break;
  1299.   case O_BELT1:
  1300.     wprintw(W,"-- e%c belt: ",usechar);
  1301.     break;
  1302.   case O_BELT2:
  1303.     wprintw(W,"-- f%c belt: ",usechar);
  1304.     break;
  1305.   case O_BELT3:
  1306.     wprintw(W,"-- g%c belt: ",usechar);
  1307.     break;
  1308.   case O_SHIELD:
  1309.     wprintw(W,"-- h%c shield: ",usechar);
  1310.     break;
  1311.   case O_ARMOR:
  1312.     wprintw(W,"-- i%c armor: ",usechar);
  1313.     break;
  1314.   case O_BOOTS:
  1315.     wprintw(W,"-- j%c boots: ",usechar);
  1316.     break;
  1317.   case O_CLOAK:
  1318.     wprintw(W,"-- k%c cloak: ",usechar);
  1319.     break;
  1320.   case O_RING1:
  1321.     wprintw(W,"-- l%c finger: ",usechar);
  1322.     break;
  1323.   case O_RING2:
  1324.     wprintw(W,"-- m%c finger: ",usechar);
  1325.     break;
  1326.   case O_RING3:
  1327.     wprintw(W,"-- n%c finger: ",usechar);
  1328.     break;
  1329.   case O_RING4:
  1330.     wprintw(W,"-- o%c finger: ",usechar);
  1331.     break;
  1332.   }
  1333.   if (Player.possessions[slotnum]== NULL)
  1334.     wprintw(W,"(slot vacant)");
  1335.   else wprintw(W,itemid(Player.possessions[slotnum]));
  1336.   wrefresh(W);
  1337. }
  1338.  
  1339. int move_slot(oldslot,newslot,maxslot)
  1340. int oldslot,newslot;
  1341. {
  1342.   if ((newslot >= 0) && (newslot < maxslot)){
  1343.     wmove(Showline[oldslot],0,0);
  1344.     waddstr(Showline[oldslot],"--");
  1345.     wrefresh(Showline[oldslot]);
  1346.     wmove(Showline[newslot],0,0);
  1347.     wstandout(Showline[newslot]);
  1348.     waddstr(Showline[newslot],">>");
  1349.     wstandend(Showline[newslot]);
  1350.     wrefresh(Showline[newslot]);
  1351.     return(newslot);
  1352.   }
  1353.   else return(oldslot);
  1354. }
  1355.  
  1356.  
  1357.  
  1358. void display_option_slot(slot)
  1359. int slot;
  1360. {
  1361.   hide_line(slot);
  1362.   wclear(Showline[slot]);
  1363.   switch(slot) {
  1364.   case 1:
  1365.     wprintw(Showline[slot],"-- Option BELLICOSE [TF]: ");
  1366.     wprintw(Showline[slot], optionp(BELLICOSE) ? "(now T) " : "(now F) ");
  1367.     break;
  1368.   case 2:
  1369.     wprintw(Showline[slot],"-- Option JUMPMOVE [TF]: ");
  1370.     wprintw(Showline[slot], optionp(JUMPMOVE) ? "(now T) " : "(now F) ");
  1371.     break;
  1372.   case 3:
  1373.     wprintw(Showline[slot],"-- Option RUNSTOP [TF]: ");
  1374.     wprintw(Showline[slot], optionp(RUNSTOP) ? "(now T) " : "(now F) ");
  1375.     break;
  1376.   case 4:
  1377.     wprintw(Showline[slot],"-- Option PICKUP [TF]: ");
  1378.     wprintw(Showline[slot], optionp(PICKUP) ? "(now T) " : "(now F) ");
  1379.     break;
  1380.   case 5:
  1381.     wprintw(Showline[slot],"-- Option CONFIRM [TF]: ");
  1382.     wprintw(Showline[slot], optionp(CONFIRM) ? "(now T) " : "(now F) ");
  1383.     break;
  1384.   case 6:
  1385.     wprintw(Showline[slot],"-- Option TOPINV [TF]: ");
  1386.     wprintw(Showline[slot], optionp(TOPINV) ? "(now T) " : "(now F) ");
  1387.     break;
  1388.   case 7:
  1389.     wprintw(Showline[slot],"-- Option PACKADD [TF]: ");
  1390.     wprintw(Showline[slot], optionp(PACKADD) ? "(now T) " : "(now F) ");
  1391.     break;
  1392.   case 8:
  1393.     wprintw(Showline[slot],
  1394.         "-- Option VERBOSITY [(T)erse,(M)edium,(V)erbose]: (now ");
  1395.     if (Verbosity == VERBOSE) wprintw(Showline[slot],"Verbose)");
  1396.     else if (Verbosity == MEDIUM) wprintw(Showline[slot],"Medium)");
  1397.     else wprintw(Showline[slot],"Terse)");
  1398.     break;
  1399.   case 9:
  1400.     wprintw(Showline[slot],"-- Option SEARCHNUM [0>x>10]: (now %d)",Searchnum);
  1401.     break;
  1402.   }
  1403.   wrefresh(Showline[slot]);
  1404. }
  1405.  
  1406.  
  1407. void display_options()
  1408. {
  1409.   int i;
  1410.   menuclear();
  1411.   hide_line(0);
  1412.   for(i=1;i<=NUMOPTIONS;i++)
  1413.     display_option_slot(i);
  1414. }
  1415.  
  1416.  
  1417. /* nya ha ha ha ha haaaa.... */
  1418. void deathprint()
  1419. {
  1420.   mgetc();
  1421.   waddch(Msgw,'D');
  1422.   mgetc();
  1423.   waddch(Msgw,'e');
  1424.   mgetc();
  1425.   waddch(Msgw,'a');
  1426.   mgetc();
  1427.   waddch(Msgw,'t');
  1428.   mgetc();
  1429.   waddch(Msgw,'h');
  1430.   mgetc();
  1431. }
  1432.   
  1433. void clear_if_necessary()
  1434. {
  1435.   int x,y;
  1436.   getyx(Msg1w,y,x);
  1437.  
  1438.   if (x != 0) {
  1439.     wclear(Msg1w);
  1440.     wrefresh(Msg1w);
  1441.   }  
  1442.  
  1443.   getyx(Msg2w,y,x);
  1444.  
  1445.   if (x != 0) {
  1446.     wclear(Msg2w);
  1447.     wrefresh(Msg2w);
  1448.   }  
  1449.  
  1450.   getyx(Msg3w,y,x);
  1451.  
  1452.   if (x != 0) {
  1453.     wclear(Msg3w);
  1454.     wrefresh(Msg3w);
  1455.   }
  1456.  
  1457. }
  1458.  
  1459.  
  1460. void buffercycle(s)
  1461. char *s;
  1462. {
  1463.   int i;
  1464.   for(i=9;i>0;i--)
  1465.     strcpy(Stringbuffer[i], Stringbuffer[i-1]);
  1466.   strcpy(Stringbuffer[0],s);
  1467. }
  1468.  
  1469.  
  1470. void bufferprint()
  1471. {
  1472.   int i = 0;
  1473.   clearmsg();
  1474.   wprintw(Msg1w,"^p for last message, anything else to quit.");
  1475.   wrefresh(Msg1w);
  1476.   do {
  1477.     wclear(Msg2w);
  1478.     wprintw(Msg2w,Stringbuffer[i]);
  1479.     wrefresh(Msg2w);
  1480.     if (++i > 9) i = 0;
  1481.   } while (mgetc() == 16);
  1482.   clearmsg();
  1483.   showcursor(Player.x,Player.y);
  1484. }
  1485.