[comp.sources.games] v03i059: omega - rogue like dungeon exploration, Part12/15

games-request@tekred.TEK.COM (01/21/88)

Submitted by: "Laurence R. Brothers" <brothers@paul.rutgers.edu>
Comp.sources.games: Volume 3, Issue 59
Archive-name: omega/Part12

#! /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 12 (of 15)."
# Contents:  oaux1.c omega.log omega.thanks oscr.c
# Wrapped by billr@tekred on Mon Jan 18 10:20:42 1988
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f oaux1.c -a "${1}" != "-c" ; then 
  echo shar: Will not over-write existing file \"oaux1.c\"
else
echo shar: Extracting \"oaux1.c\" \(30687 characters\)
sed "s/^X//" >oaux1.c <<'END_OF_oaux1.c'
X/* omega copyright (C) by Laurence Raphael Brothers, 1987 */
X
X/* oaux1.c */
X
X/* auxiliary functions for those in ocom.c, also see oaux2.c */ 
X/* Only functions called in ocom.c should be here */
X
X#include <strings.h>
X#include "oglob.h"
X
X/* from oitem */
Xextern pob create_object();
X
X/* from ospell */
Xextern char *spellid();
X
X/* from ogen */
Xextern char *roomname();
X
X/* from oeffect 1 or 2 */
Xextern void manastorm();
X
X/* from oitemf */
Xextern void weapon_normal_hit(),weapon_demonblade(),weapon_lightsabre();
Xextern void weapon_mace_disrupt(),weapon_bare_hands();
Xextern void weapon_vorpal(),weapon_desecrate(),weapon_firestar();
Xextern void weapon_defend(),weapon_victrix(),weapon_tangle();
Xextern void weapon_arrow(),weapon_bolt();
X
X/* from oitem */
Xextern void item_use();
X
X/* from oinv */
Xextern void pickup_at(),drop_at(),givemonster(),conform_lost_objects();
Xextern void add_item_to_pack();
Xextern char *itemid();
Xextern int getitem(),badobject(),cursed();
X
X/* from outil */
Xextern int random_range();
Xextern int inbounds(),confirmation();
Xextern char inversedir();
Xextern char *getarticle();
Xextern int unblocked(),bitp();
Xextern void bitset(),bitreset();
X
X/* from oetc */
Xextern char *wordnum();
X
X/* from oscr */
Xextern void showcursor(),refreshmsg(),drawspot(),describe_player();
Xextern void mprint(),endgraf(),showflags(),dataprint(),menuaddch();
Xextern void locprint(),xredraw(),putspot(),blankoutspot(),levelrefresh();
Xextern void drawvision(),display_death(),morewait(),menumorewait(),printm();
Xextern void menuclear(),menuprint(),display_win(),mnumprint(),menunumprint();
Xextern void screencheck();
Xextern char mgetc(),lgetc(),ynq(),getspot();
X
X
X/* from ocom */
Xvoid p_process();
X
X/* from omon */
Xextern void m_status_set(),m_status_reset(),m_death(),m_pickup();
Xextern void tacmonster(),m_teleport(),m_dropstuff(),m_vanish();
Xextern int m_statusp();
X
X/* from oaux2 */
Xextern char *actionlocstr();
Xextern void break_weapon(),drop_weapon(),gain_experience(),gain_level();
Xextern void p_fumble(),p_win(),p_hit(),p_miss(),addring();
Xextern void top_level(),printactions(),movecursor(),p_drown();
Xextern void tacplayer(),weapon_use(),move_status_check(),hour_status_check();
Xextern int expval(),player_hit(),statmod(),item_value(),true_item_value();
Xextern int p_immune();
X
X/* oaux1 functions */
Xvoid pickup_at(),setspot(),foodcheck(),p_death(),hourly_check();
Xvoid calc_melee(),p_melee(),gain_experience(),p_damage();
Xvoid p_process(),p_teleport(),tacplayer(),roomcheck(),tunnelcheck();
Xvoid searchat(),showroom(),weapon_use(),damage_item(),tacmode();
Xvoid hand_wield(),optionset(),optionreset(),describe_player();
Xvoid lightroom(),surrender(),threaten(),darkenroom();
Xchar *itemid(),*mstatus_string(),*trapid();
Xint p_moveable(),cursed(),getitem(),getdir(),optionp(),goberserk();
Xint player_on_sanctuary();
X
X
X/* check to see if too much tunneling has been done in this level */
Xvoid tunnelcheck()
X{
X  Leveldata[Dlevel].tunnelled++;
X  if ((Leveldata[Dlevel].tunnelled) > WIDTH/4)
X    mprint("Dust and stone fragments fall on you from overhead.");
X  if ((Leveldata[Dlevel].tunnelled) > WIDTH/2)
X    mprint("You hear groaning and creaking noises.");
X  if ((Leveldata[Dlevel].tunnelled) > 3*WIDTH/4) 
X    mprint("The floor trembles and you hear a loud grinding screech.");
X  if ((Leveldata[Dlevel].tunnelled) > WIDTH) {
X    mprint("With a scream of tortured stone, the entire level caves in!!!");
X    gain_experience(5000);
X    mprint("You are flattened into an unpleasant jellylike substance.");
X    p_death("dungeon cave-in");
X  }
X}
X
X/* displays a room's name */
Xvoid showroom(i)
Xint i;
X{
X  if (Dlevel == 0) locprint("The City of Rampart.");
X  else {
X    strcpy(Str1,"Level ");
X    if (Dlevel < 10) {
X      Str1[6] = Dlevel + '0';
X      Str1[7] = 0;
X    }
X    else {
X      Str1[6] = ((int) Dlevel / 10) + '0';
X      Str1[7] = (Dlevel % 10) + '0';
X      Str1[8] = 0;
X    }
X    strcat(Str1," -- ");
X    strcat(Str1,roomname(i));
X    locprint(Str1);
X  }
X}
X
X
Xint player_on_sanctuary()
X{
X  if ((Player.slevel==Dlevel) &&
X      (Player.x==Player.sx) &&
X      (Player.y==Player.sy))
X    return(TRUE);
X  else {
X    if (Player.patron) {
X      if ((Dungeon[Dlevel][Player.x][Player.y].locchar == ALTAR) &&
X	  (Dungeon[Dlevel][Player.x][Player.y].aux == Player.patron))
X	return(TRUE);
X      else return(FALSE);
X    }
X    else return(FALSE);
X  }
X}
X
X
X/* check a move attempt, maybe attack something, return TRUE if ok to move. */
X/* x y is the proposed place to move to */
X int p_moveable(x,y)
X int x,y;
X {
X   Skipmonsters = TRUE;
X   if (! inbounds(x,y)) return (FALSE);
X   else if (Player.status[SHADOWFORM]) {
X     Skipmonsters = FALSE;
X     return(TRUE);
X   }
X   else if (Dungeon[Dlevel][x][y].secret) {
X     if (!Fastmove) mprint("Ouch!");
X     return(FALSE);
X   }
X   else if (Dungeon[Dlevel][x][y].creature != NULL) {
X     if ((! Fastmove) || optionp(BELLICOSE)) {
X	 p_melee(Dungeon[Dlevel][x][y].creature);
X	 Skipmonsters = FALSE;
X	 return(FALSE);
X       }
X     else return(FALSE);
X   }
X   else if ((Dungeon[Dlevel][x][y].locchar == WALL) ||
X	    (Dungeon[Dlevel][x][y].locchar == STATUE) ||
X	    (Dungeon[Dlevel][x][y].locchar == CLOSED_DOOR) ||
X	    (Fastmove &&
X	     ((Dungeon[Dlevel][x][y].locchar == HEDGE) ||
X	      (Dungeon[Dlevel][x][y].locchar == LAVA) ||
X	      (Dungeon[Dlevel][x][y].locchar == ABYSS) ||
X	      (Dungeon[Dlevel][x][y].locchar == FIRE) ||
X	      (Dungeon[Dlevel][x][y].locchar == WATER) ||
X	      (Dungeon[Dlevel][x][y].locchar == WHIRLWIND) ||
X	      (Dungeon[Dlevel][x][y].locchar == LIFT) ||
X	      (Dungeon[Dlevel][x][y].locchar == TRAP)))) {
X     if (! Fastmove) mprint("Ouch!");
X     return(FALSE);
X   }
X   else if (optionp(CONFIRM)) {
X     if ((Dungeon[Dlevel][x][y].locchar == HEDGE) ||
X	 (Dungeon[Dlevel][x][y].locchar == LAVA) ||
X	 (Dungeon[Dlevel][x][y].locchar == FIRE) ||
X	 (Dungeon[Dlevel][x][y].locchar == ABYSS) ||
X	 (Dungeon[Dlevel][x][y].locchar == WATER) ||
X	 (Dungeon[Dlevel][x][y].locchar == WHIRLWIND) ||
X	 (Dungeon[Dlevel][x][y].locchar == LIFT) ||
X	 (Dungeon[Dlevel][x][y].locchar == TRAP)) {
X       return(! (Skipmonsters = ! confirmation()) );
X     }
X     else {
X       Skipmonsters = FALSE;
X       return(TRUE);
X     }
X   }
X   else {
X     Skipmonsters = FALSE;
X     return(TRUE);
X   }
X }
X
X
X/* search once particular spot */
Xvoid searchat(x,y)
Xint x,y;
X{
X  int i;
X  if (inbounds(x,y) && (random_range(3) || Player.status[ALERT])) {
X    if (Dungeon[Dlevel][x][y].secret) {
X      Dungeon[Dlevel][x][y].secret = FALSE;
X      if ((Dungeon[Dlevel][x][y].locchar==OPEN_DOOR) ||
X	  (Dungeon[Dlevel][x][y].locchar==CLOSED_DOOR))
X	mprint("You find a secret door!");
X      else mprint("You find a secret passage!");
X      for(i=0;i<8;i++)
X	Dungeon[Dlevel][x+Dirs[0][i]][y+Dirs[1][i]].stopsrun = TRUE;
X      drawvision(Player.x,Player.y,Player.vision);
X    }
X    if ((Dungeon[Dlevel][x][y].p_locf >= TRAP_BASE) &&
X	(Dungeon[Dlevel][x][y].locchar != TRAP) &&
X	(Dungeon[Dlevel][x][y].p_locf <= TRAP_BASE+NUMTRAPS)) {
X      Dungeon[Dlevel][x][y].locchar = TRAP;
X      mprint("You find a trap!");
X      if (Fastmove == TRUE) {
X	drawvision(Player.x,Player.y,Player.vision);
X	Fastmove = FALSE;
X      }
X    }
X  }
X}
X
X/* This is called whenever anything might change player performance in
X   melee, such as changing weapon, statistics, etc. */
Xvoid calc_melee()
X{
X  Player.maxweight = (Player.str * Player.agi * 10);
X  Player.absorption = Player.status[PROTECTION];
X  Player.defense = 2 * statmod(Player.agi)+(Player.level/2);
X  Player.hit = Player.level + statmod(Player.dex)+1;
X  Player.dmg = statmod(Player.str)+3;
X  Player.speed = 5 - min(4,(statmod(Player.agi)/2));
X  if (Player.status[HASTED]) Player.speed = Player.speed / 2;
X  if (Player.status[SLOWED]) Player.speed = Player.speed * 2;
X  if (Player.itemweight > 0)
X    switch(Player.maxweight / Player.itemweight) {
X    case 0: Player.speed+=6; break;
X    case 1: Player.speed+=3; break;
X    case 2: Player.speed+=2; break;
X    case 3: Player.speed+=1; break;
X    }
X  
X  if (Player.status[ACCURATE]) Player.hit+=20;
X  if (Player.status[HERO]) Player.hit+=Player.dex;
X  if (Player.status[HERO]) Player.dmg+=Player.str;
X  if (Player.status[HERO]) Player.defense+=Player.agi;
X  if (Player.status[HERO]) Player.speed=Player.speed / 2;
X
X  Player.speed = max(1,min(25,Player.speed));
X
X  /* weapon */
X  if (Player.primary != NULL) {
X    Player.hit += Player.primary->hit + Player.primary->plus;
X    Player.dmg += Player.primary->dmg + Player.primary->plus;
X  }
X
X  /* shield */
X  if (Player.secondary != NULL) 
X    Player.defense += Player.secondary->aux + Player.secondary->plus;
X
X  /* armor */
X  if (Player.armor != NULL) {
X    Player.absorption += Player.armor->dmg;
X    Player.defense = Player.defense + Player.armor->plus - Player.armor->aux;
X  }
X  comwinprint();
X}
X	
X
X/* player attacks monster m */
Xvoid p_melee(m)
Xstruct monster *m;
X{
X  int hitmod = 0;
X  if (Lunarity == 1) hitmod += Player.level;
X  else if (Lunarity == -1) hitmod -= (Player.level / 2);
X  if (Player.status[AFRAID])
X    mprint("You are much too afraid to fight!");
X  else if (player_on_sanctuary())
X    mprint("You restrain yourself from descrating this holy place.");
X  else if (Player.status[SHADOWFORM])
X    mprint("Your attack has no effect in your shadowy state.");
X  else {
X    if (! m->attacked) Player.alignment--; /* chaotic action */
X    m_status_set(m,AWAKE);
X    m_status_set(m,HOSTILE);
X    m->attacked = TRUE;
X    if (hitp(Player.hit+hitmod,m->ac))
X      weapon_use(0,Player.primary,m);
X    else p_miss(m,NORMAL_DAMAGE);
X  }
X}
X
X/* Attempt to break an object o */
Xvoid damage_item(o)
Xpob o;     
X{
X  int i;
X  if (o->objchar == STICK) {
X    strcpy(Str1,"Your ");
X    strcat(Str1,(o->blessing >= 0 ? o->truename : o->cursestr));
X    strcat(Str1," explodes!");
X    mprint(Str1);
X    morewait();
X    if (o->charge < 1)
X      mprint("Fzzz... Out of Power... Oh well...");
X    else {
X      mprint("Ka-Blamm!!!");
X      /* general case. Some sticks will eventually do special things */
X      for(i=0;i<9;i++)
X	manastorm(Player.x+Dirs[0][i],
X		  Player.y+Dirs[1][i],
X		  o->charge*o->level*10);
X      conform_lost_objects(1,o);
X    }
X  }
X  else if (o->blessing > 0) {
X    strcpy(Str1,"Your ");
X    strcat(Str1,itemid(o));
X    strcat(Str1," glows strongly.");
X    mprint(Str1);
X  }
X  else if (o->blessing < -1) {
X    strcpy(Str1,"You hear an evil giggle from your ");
X    strcat(Str1,itemid(o));
X    mprint(Str1);
X  }
X  else if (o->plus > 0) {
X    strcpy(Str1,"Your ");
X    strcat(Str1,itemid(o));
X    strcat(Str1," glows and then fades.");
X    mprint(Str1);
X    o->plus--;
X  }
X  else {
X    strcpy(Str1,"Your ");
X    strcat(Str1,itemid(o));
X    strcat(Str1," shatters in a thousand lost fragments!");
X    conform_lost_objects(1,o);
X    mprint(Str1);
X  }
X}
X
X
X
X
X
X/* do dmg points of damage of type dtype, from source fromstring */
Xvoid p_damage(dmg,dtype,fromstring)
Xint dmg,dtype;
Xchar *fromstring;
X{
X  if (! p_immune(dtype)) {
X    if (Fastmove == TRUE) {
X      drawvision(Player.x,Player.y,Player.vision);
X      Fastmove = FALSE;
X    }
X    if (dtype == NORMAL_DAMAGE) Player.hp -= max(1,(dmg-Player.absorption));
X    else Player.hp -= dmg;
X    if (Player.hp < 1) p_death(fromstring);
X  }
X  else mprint("You resist the effects!");
X}
X
X/* game over, you lose! */
Xvoid p_death(fromstring)
Xchar *fromstring;
X{
X  Player.hp = -1;
X  mprint("You died!");
X  morewait();
X  display_death(fromstring);
X  endgraf();
X  exit(0);
X}
X
X
X/* move the cursor around, like for firing a wand, sets x and y to target */
Xvoid setspot(x,y)
Xint *x,*y;
X{
X  char c = ' ';
X  mprint("Targeting.... ? for help");
X  showcursor(*x,*y);
X  while ((c != '.') && (c != ESCAPE)) {
X    c = lgetc();
X    switch(c) {
X      case 'h':case '4': movecursor(x,y,-1,0);  break;
X      case 'j':case '2': movecursor(x,y,0,1);  break;
X      case 'k':case '8': movecursor(x,y,0,-1);  break;
X      case 'l':case '6': movecursor(x,y,1,0);  break;
X      case 'b':case '1': movecursor(x,y,-1,1);  break;
X      case 'n':case '3': movecursor(x,y,1,1);  break;
X      case 'y':case '7': movecursor(x,y,-1,-1);  break;
X      case 'u':case '9': movecursor(x,y,1,-1);  break;
X      case '?':
X	menuclear();
X	menuprint("Use vi keys or numeric keypad\n");
X        menuprint("to move cursor to target.\n");
X	menuprint("Hit the '.' key when done,\n");
X	menuprint("or ESCAPE to abort.");
X	menumorewait();
X	xredraw();
X	break;
X    }
X  }
X  if (c==ESCAPE) *x = *y= ABORT;
X  screencheck(Player.y);
X}
X
X
X/* get a direction: return index into Dirs array corresponding to direction */
Xint getdir()
X{
X  mprint("Select direction [hjklyubn, ESCAPE to quit]: ");
X  switch (mgetc()) {
X  case '4':
X  case 'h':
X  case 'H': return(5); break;
X  case '2':
X  case 'j':
X  case 'J': return(6); break;
X  case '8':
X  case 'k':
X  case 'K': return(7); break;
X  case '6':
X  case 'l':
X  case 'L': return(4); break;
X  case '7':
X  case 'y':
X  case 'Y': return(3); break;
X  case '9':
X  case 'u':
X  case 'U': return(1); break;
X  case '1':
X  case 'b':
X  case 'B': return(2); break;
X  case '3':
X  case 'n':
X  case 'N': return(0); break;
X  case ESCAPE: return(ABORT); break;
X  default: mprint("That's not a direction! "); return(getdir()); break;
X  }
X}
X
X
X
X
X/* bitwise access functions to Player.options */
X
Xint optionp(o)
Xint o;
X{
X  return(bitp(Player.options,o));
X}
X
Xvoid optionset(o)
Xint o;
X{
X  bitset(&(Player.options),o);
X}
X
Xvoid optionreset(o)
Xint o;
X{
X  bitreset(&(Player.options),o);
X}
X
X
X
X/* functions describes monster m's state for examine function */      
Xchar *mstatus_string(m)
Xstruct monster *m;
X{
X  if (m->uniqueness == COMMON) {
X    if (m->hp < Monsters[m->id].hp / 3)
X      strcpy(Str2,"a grievously injured");
X    else if (m->hp < Monsters[m->id].hp / 2)
X      strcpy(Str2,"a severely injured");
X    else if (m->hp < Monsters[m->id].hp)
X      strcpy(Str2,"an injured ");
X    else strcpy(Str2,getarticle(m->monstring));
X    if (m->level > Monsters[m->id].level) {
X      strcat(Str2," (level ");
X      strcat(Str2,wordnum(m->level+1-Monsters[m->id].level));
X      strcat(Str2,") ");
X    }
X    strcat(Str2,m->monstring);
X  }
X  else {
X    strcpy(Str2,m->monstring);
X    if (m->hp < Monsters[m->id].hp / 3)
X      strcat(Str2,"who is grievously injured");
X    else if (m->hp < Monsters[m->id].hp / 2)
X      strcat(Str2,"who is severely injured");
X    else if (m->hp < Monsters[m->id].hp)
X      strcat(Str2,"who is injured ");
X  }
X  return(Str2);
X}
X
X
X
X
X/* for the examine function */
Xvoid describe_player()
X{
X  if (Player.hp < (Player.maxhp /5))
X    menuprint("\nA grievously injured ");
X  else if (Player.hp < (Player.maxhp /2))
X    menuprint("\nA seriously wounded ");
X  else if (Player.hp < Player.maxhp)
X    menuprint("\n somewhat bruised ");
X  else menuprint("\nA fit ");
X
X  if (Player.level == 0)
X    menuprint("\nbeginning adventurer named\n");
X  else if (Player.level < 4)
X    menuprint("\nnovice adventurer named\n");
X  else if (Player.level < 8)
X    menuprint("\nexperienced adventurer named\n");
X  else if (Player.level < 16)
X    menuprint("\nmaster adventurer named\n");
X  else menuprint("\ngodlike adventurer named\n");
X  menuprint(Player.name);
X}
X
X
X/* access to player experience... */
Xvoid gain_experience(amount)
Xint amount;
X{
X  Player.xp += amount;
X  gain_level();
X}
X
X
X/* try to hit a monster in an adjacent space. If there are none
X   return FALSE */
Xint goberserk()
X{
X  int wentberserk=FALSE,i;
X
X  for(i=0;i<8;i++)
X    if (Dungeon[Dlevel][Player.x+Dirs[0][i]][Player.y+Dirs[1][i]].creature
X	!= NULL) {
X	  wentberserk=TRUE;
X	  p_melee(Dungeon
X		  [Dlevel]
X		  [Player.x+Dirs[0][i]]
X		  [Player.y+Dirs[1][i]].creature);
X	}
X
X  return(wentberserk);
X}
X
X/* identifies a trap for examine() by its aux value */
Xchar *trapid(trapno)
Xint trapno;
X{
X  switch (trapno) {
X    case L_TRAP_DART:return("A dart trap");
X    case L_TRAP_PIT:return("A pit");
X    case L_TRAP_SNARE:return("A snare");
X    case L_TRAP_BLADE:return("A blade trap");
X    case L_TRAP_FIRE:return("A fire trap");
X    case L_TRAP_TELEPORT:return("A teleport trap");
X    case L_TRAP_DISINTEGRATE:return("A disintegration trap");
X    case L_TRAP_DOOR:return("A trap door");
X    case L_TRAP_MANADRAIN:return("A manadrain trap");
X    case L_TRAP_ACID:return("An acid shower trap");
X    case L_TRAP_SLEEP_GAS:return("A sleep gas trap");
X    case L_TRAP_ABYSS:return("A concealed entrance to the abyss");
X  }
X}
X
X
X/* checks current food status of player, every hour, and when food is eaten */
Xvoid foodcheck()
X{
X  if (Player.food > 24) {
X    mprint("You vomit up your huge meal.");
X    Player.food = 4;
X  }
X  else if (Player.food == 3) mprint("You feel hungry.");
X  else if (Player.food == 1) {
X    mprint("You feel weak.");
X    if (Fastmove == TRUE) {
X      drawvision(Player.x,Player.y,Player.vision);
X      Fastmove = FALSE;
X    }
X  }
X  else if (Player.food < 0) {
X    if (Fastmove == TRUE) {
X      drawvision(Player.x,Player.y,Player.vision);
X      Fastmove = FALSE;
X    }
X    mprint("You're starving!");
X    p_damage(-5*Player.food,UNSTOPPABLE,"starvation");
X  }
X  showflags();
X}
X
X
X/* tactical fighting mode, top-level routine */
Xvoid tacplayer(p_actions,pnumactions,m_actions,mnumactions,m)
Xint p_actions[10],*pnumactions,m_actions[10],mnumactions;
Xstruct monster *m;
X{
X  int i,actionsleft,index,maneuvers,done;
X  float times;
X
X  times = (Player.status[HASTED] ? 2.0 : 1.0);
X  times *= (Player.status[SLOWED] ? 0.5 : 1.0);
X
X  done = FALSE;
X  *pnumactions = 0;
X  maneuvers = 2 + Player.level/10;
X  if (Player.rank[ARENA]) maneuvers++;
X  maneuvers = ((int) (maneuvers*times));
X  maneuvers = min(8,max(1,maneuvers));
X  actionsleft = maneuvers;
X  printm("\n");
X  do {
X    menuclear();
X    if (Arena) 
X      menuprint("Arena Combat: [abgwlrd,BACKSPACE/DELETE,CR/ESC,?]");
X    else if (Final)
X      menuprint("Final Duel: [abgwlrm,BACKSPACE/DELETE,CR/ESC,?]");
X    else 
X      menuprint("Tactical Combat: [abgwlrmd,BACKSPACE/DELETE,CR/ESC,?]");
X    printactions(*pnumactions,p_actions);
X    menuprint("\n");
X    menunumprint(actionsleft);
X    menuprint(" Maneuvers left.\n");
X    switch(mgetc()) {
X    case '?':
X      if (Arena)
X	menuprint("ARENA COMBAT\n\n");
X      else if (Final) menuprint("THE FINAL DUEL\n\n");
X      else menuprint("TACTICAL COMBAT\n\n");
X      menuprint("\nOpponent: ");
X      menuprint(mstatus_string(m));
X      menuprint("\n\nSelect maneuvers:");
X      menuprint("\n[a] attack (1 maneuver)");
X      menuprint("\n[b] block (1 maneuver)");
X      menuprint("\n[g] pick up (all maneuvers)");
X      menuprint("\n[w] wield (all maneuvers)");
X      menuprint("\n[l] lunge (2 maneuvers)");
X      menuprint("\n[r] riposte (2 maneuvers)");
X      if (! Arena) 
X	menuprint("\n[m] magic (all maneuvers)");
X      if (! Final) menuprint("\n[d] disengage (all maneuvers)");
X      menuprint("\nBACKSPACE/DELETE clears choices");
X      menuprint("\nESCAPE/RETURN when done");
X      menuprint("\n? for this list");
X      menumorewait();
X      break;
X    case 'a':
X      if (actionsleft>0) {
X	if (Player.status[AFRAID])
X	  menuprint("You are too afraid!");
X	else {
X	  if (Player.primary == NULL) p_actions[*pnumactions] = CUT;
X	  else if ((Player.primary->type == THRUSTING) || 
X		   (Player.primary->type == MISSILE))
X	    p_actions[*pnumactions] = THRUST;
X	  else p_actions[*pnumactions] = CUT;
X	  menuprint("\nAttack");
X	  p_actions[*pnumactions]+=getlocation();
X	  (*pnumactions)++;
X	  actionsleft--;
X	}
X      }
X      else {
X	menuprint("\nNo more maneuvers!");
X	morewait();
X      }
X      break;
X    case 'b':
X      if (actionsleft>0) {
X	p_actions[*pnumactions] = BLOCK;
X	menuprint("\nBlock ");
X	p_actions[*pnumactions]+= getlocation();
X	(*pnumactions)++;
X	actionsleft--;
X      }
X      else {
X	menuprint("\nNo more maneuvers!.");
X	morewait();
X      }
X      break;
X    case 'l':
X      if (actionsleft>1) {
X	if (Player.status[AFRAID]) {
X	  menuprint("You are too afraid!");
X	  morewait();
X	}
X	else if (Player.primary != NULL) {
X	  if (Player.primary->type != MISSILE) {
X	    p_actions[*pnumactions] = LUNGE;
X	    p_actions[*pnumactions]+=getlocation();
X	    (*pnumactions)++;
X	    actionsleft -= 2;
X	    menuprint("\nLunge ");
X	  }
X	  else {
X	    menuprint("\nNot with a missile weapon!");
X	    morewait();
X	  }
X	}
X	else {
X	  menuprint("\Not without a weapon!");
X	  morewait();
X	}
X      }
X      else {
X	menuprint("\nNo more maneuvers!");
X	morewait();
X      }
X      break;
X    case 'r':
X      if (actionsleft>1) {
X	if (Player.status[AFRAID]) {
X	  menuprint("You are too afraid!");
X	  morewait();
X	}
X	else if (Player.primary != NULL) {
X	  if (Player.primary->type == THRUSTING) {
X	    p_actions[*pnumactions] = RIPOSTE;
X	    menuprint("\nRiposte ");
X	    p_actions[*pnumactions]+=getlocation();
X	    (*pnumactions)++;
X	    actionsleft -= 2;
X	  }
X	  else {
X	    menuprint("\nNot without a thrusting weapon!");
X	    morewait();
X	  }
X	}
X	else {
X	  menuprint("\nNot without a weapon!");
X	  morewait();
X	}
X      }
X      else {
X	menuprint("\nNo more maneuvers!!");
X	morewait();
X      }
X      break;
X    case 'm':
X      if (Arena) mprint("Magic is not allowed in the Arena.");
X      else if (actionsleft == maneuvers) {
X	if (Player.status[AFRAID]) {
X	  menuprint("\nYou are too afraid!");
X	  morewait();
X	}
X	else {
X	  index = getspell();
X	  if (index == ABORT)
X	    Skipmonsters = TRUE;
X	  else if (Spells[index].powerdrain > Player.mana) {
X	    menuprint("\nYou lack the power! ");
X	    morewait();
X	  }
X	  else {
X	    Player.mana -= Spells[index].powerdrain;
X	    p_actions[0] = MAGIC;
X	    p_actions[1] = index;
X	    *pnumactions = 1;
X	    actionsleft = 0;
X	  }
X	  xredraw();
X	}
X      }
X      else {
X	menuprint("No more maneuvers!");
X	morewait();
X      }
X      break;
X    case 'g':
X      if (Dungeon[Dlevel][Player.x][Player.y].things == NULL) {
X	menuprint("Nothing to pick up!");
X	morewait();
X      }
X      else if (actionsleft == maneuvers) {
X	p_actions[0] = PICK_UP;
X	*pnumactions = 1;
X	actionsleft = 0;
X      }
X      else {
X	menuprint("No more maneuvers!");
X	morewait();
X      }
X      break;
X    case 'w':
X      if (actionsleft == maneuvers) {
X	p_actions[0] = WIELD;
X	*pnumactions = 1;
X	actionsleft = 0;
X      }
X      else {
X	menuprint("No more maneuvers!");
X	morewait();
X      }
X      break;
X    case 'd':
X      if (Final) {
X	menuprint("There's nowhere to run....");
X	morewait();
X      }
X      else if (actionsleft == maneuvers) {
X	p_actions[0] = DISENGAGE;
X	*pnumactions = 1;
X	actionsleft = 0;
X      }
X      else {
X	menuprint("No more manuevers!");
X	morewait();
X      }
X      break;
X    case BACKSPACE:
X    case DELETE:
X      *pnumactions=0;
X      actionsleft=maneuvers;
X      break;
X    case RETURN:
X    case LINEFEED:
X    case ESCAPE:
X      done = TRUE;
X      break;
X    }
X  } while (! done);
X  menuclear();
X  dataprint();
X}
X
Xvoid tacmode(m)
Xstruct monster *m;
X{
X  int p_actions[10],pnumactions,m_actions[10],mnumactions;
X  int px=Player.x,py=Player.y,mx=m->x,my=m->y,level=Dlevel;
X  Tacmode = TRUE;
X  m_status_set(m,AWAKE);
X  m_status_set(m,HOSTILE);
X  m->attacked = TRUE;
X  while (Tacmode) {
X    tacplayer(p_actions,&pnumactions,m_actions,mnumactions,m);
X    morewait();
X    tacmonster(p_actions,pnumactions,m_actions,&mnumactions,m);
X    tacexecute(p_actions,pnumactions,m_actions,mnumactions,m);
X    if ((px!=Player.x) ||
X	(py!=Player.y) ||
X	(mx!=m->x) ||
X	(my!=m->y) ||
X	(level != Dlevel) ||
X	(Player.hp < 1) ||
X	(m->hp < 1))
X      Tacmode = FALSE;
X  }
X  if ((px!=Player.x) ||
X      (py!=Player.y) ||
X      (mx!=m->x) ||
X      (level != Dlevel) ||
X      (my!=m->y))
X    mprint("Close combat broken off by disengagement.");
X}
X
Xvoid roomcheck()
X{
X  static int oldroom = -1;
X  int roomno;
X  
X  if (oldroom != 
X      (roomno = Dungeon[Dlevel][Player.x][Player.y].roomnumber)) {
X    if (oldroom >= ROOMBASE) darkenroom(oldroom);
X    if (roomno >= ROOMBASE) {
X      lightroom(roomno);
X      showroom(Leveldata[Dlevel].rooms[roomno-ROOMBASE].rsi);
X    }
X    else showroom(roomno);
X  }
X  oldroom = roomno;
X}
X
X
X/* illuminate room when entered */
Xvoid lightroom(roomno)
Xint roomno;
X{
X  int i,j;
X  struct level_data *l;
X  struct room *r;
X  char c;
X
X  l = &(Leveldata[Dlevel]);
X
X  r = &(l->rooms[roomno-ROOMBASE]);
X
X  if (roomno > -1) {
X    if (Fastmove == TRUE) {
X      drawvision(Player.x,Player.y,Player.vision);
X      Fastmove = FALSE;
X    }
X    if ((r->lighted) || Player.status[ILLUMINATION])
X      for(i=r->left;i<=r->right;i++)
X	for(j=r->top;j<=r->bottom;j++) {
X	  c = getspot(i,j,FALSE);
X	  Dungeon[Dlevel][i][j].seen = TRUE;
X	  Dungeon[Dlevel][i][j].showchar = c;
X	  putspot(i,j,c);
X	}
X  }
X}
X
Xvoid darkenroom(roomno)
Xint roomno;
X{
X  int i,j;
X  struct room *r;
X
X  if (roomno >= ROOMBASE) {
X    r = &(Leveldata[Dlevel].rooms[roomno-ROOMBASE]);
X      for(i=r->left-1;i<=r->right+1;i++)
X	for(j=r->top-1;j<=r->bottom+1;j++) 
X	  blankoutspot(i,j);
X  }
X  levelrefresh();
X}
X
X
X
X/* ask for mercy */
Xvoid surrender(m)
X  struct monster *m;
X{
X  int i,bestitem,bestvalue;
X  switch(random_range(4)) {
X  case 0: printm("\nYou grovel at the monster's feet..."); break;
X  case 1: printm("\nYou cry 'uncle'!");
X  case 2: printm("\nYou beg for mercy.");
X  case 3: printm("\nYou yield to the monster.");
X  }
X  if ((m->talkf==M_NO_OP) ||
X      (m->talkf==M_TALK_STUPID))
X    mprint("Your plea is ignored.");
X  else  {
X    mprint("Your surrender is accepted.");
X    mprint("All your gold is taken....");
X    Player.cash = 0;
X    bestvalue = 0;
X    bestitem = ABORT;
X    for (i=0;i<MAXITEMS;i++)
X      if (Player.possessions[i] != NULL)
X	if (bestvalue < true_item_value(Player.possessions[i]))
X	  bestitem = i;
X    if (bestitem != ABORT) {
X      mprint("You also give away your best item....");
X      mprint(itemid(Player.possessions[bestitem]));
X      givemonster(m,Player.possessions[bestitem]);
X    }
X    mprint("You feel less experienced...");
X    Player.xp = max(0,Player.xp - m->xpv);
X    mprint("The monster seems more experienced!");
X    m->level = (min(10,m->level+1));
X    m->hp += m->level*20;
X    m->hit += m->level;
X    m->dmg += m->level;
X    m->ac += m->level;
X    m->xpv += m->level*10;
X    m->actions++;
X    if ((m->talkf == M_TALK_EVIL) && random_range(10)) {
X      mprint("It continues to attack you, laughing evilly!");
X      m_status_set(m,HOSTILE);
X      m_status_reset(m,GREEDY);
X    }
X    else {
X      mprint("The monster leaves, chuckling to itself....");
X      m_teleport(m);
X    }
X  }
X}
X
X
X/* threaten a monster */
Xvoid threaten(m)
Xstruct monster *m;
X{
X  char response;
X  switch(random_range(4)) {
X  case 0:mprint("You demand that your opponent surrender!"); break;
X  case 1:mprint("You threaten to do bodily harm to it."); break;
X  case 2:mprint("You attempt to bluster it into submission."); break;
X  case 3:mprint("You try to cow it with your awesome presence."); break;
X  }
X  if ((m->talkf == M_NO_OP) || (m->talkf == M_TALK_STUPID))
X    mprint("Your demand is ignored!");
X  else if (! m_statusp(m,HOSTILE)) {
X    mprint("You only annoy it with your futile demand.");
X    m_status_set(m,HOSTILE);
X  }
X  else if (m->level*3 > Player.level)
X    mprint("It sneers contemptuously at you.");
X  else if ((m->level*2 < Player.level) || (m->hp < Player.dmg)) {
X    mprint("It yields to your mercy.");
X    Player.alignment++;
X    mprint("Kill it, rob it, or free it? [krf] ");
X    do response = mgetc();
X    while ((response != 'k')&&(response != 'r')&&(response !='f'));
X    if (response == 'k') {
X      m_death(m);
X      mprint("You treacherous rogue!");
X      Player.alignment -= 10;
X    }
X    else if (response == 'r') {
X      mprint("It drops its treasure and flees.");
X      m_dropstuff(m);
X      m_vanish(m);
X    }
X    else {
X      Player.alignment+=5;
X      mprint("'If you love something set it free ... '");
X      if (random_range(100)==13)
X	mprint("'...If it doesn't come back, hunt it down and kill it.'");
X      mprint("It departs with a renewed sense of its own mortality.");
X      m_status_reset(m,HOSTILE);
X      m_teleport(m);
X    }
X  }
X}
X  
X
X
X
X/* Various things that get looked at every hour. Food/hunger status,
X   random events, hourly status checks, wandering monster generation,
X   player healing */
Xvoid hourly_check()
X{
X  int i;
X  pol ol;
X  pml ml;
X
X  Player.food--;
X  foodcheck();
X  wandercheck();
X  hour_status_check();
X  if ((Player.status[DISEASED] == 0) && (Player.hp < Player.maxhp))
X    Player.hp = min(Player.maxhp,Player.hp+Player.level+1);
X
X  /* random events, just general weirdness for the heck of it */
X  switch(random_range(1000)) {
X    case 0: 
X      mprint("You feel an unexplainable elation.");
X      morewait();
X      break;
X    case 1:
X      mprint("You hear a distant rumbling.");
X      morewait();
X      break;
X    case 2:
X      mprint("You realize your fly is open.");
X      morewait();
X      break;
X    case 3:
X      mprint("You have a sudden craving for a pecan twirl.");
X      morewait();
X      break;
X    case 4:
X      mprint("A mysterious healing flux settles over the level.");
X      morewait();
X      for (ml=Mlist[Dlevel];ml!=NULL;ml=ml->next)
X	ml->m->hp = Monsters[ml->m->id].hp;
X      Player.hp = max(Player.hp,Player.maxhp);
X      break;
X    case 5:
X      mprint("You discover an itch just where you can't scratch it.");
X      morewait();
X      break;
X    case 6:
X      mprint("A cosmic ray strikes!");
X      p_damage(10,UNSTOPPABLE,"a cosmic ray");
X      morewait();
X      break;
X    case 7:
X      mprint("You catch your second wind....");
X      Player.hp = ++Player.maxhp;
X      Player.mana = max(Player.mana, calcmana());
X      morewait();
X      break;
X    case 8:
X      mprint("You find some spare change in a hidden pocket.");
X      Player.cash += Player.level*Player.level+1;
X      morewait();
X      break;
X    case 9:
X      if (Player.primary != NULL) {
X	mprint("The warranty runs out on your weapon...");
X	damage_item(Player.primary);
X      }
X      else mprint("You feel strangely lucky.");
X      morewait();
X      break;
X    case 10:
X      if (Dungeon[Dlevel][Player.x][Player.y].locchar == FLOOR) {
X	Dungeon[Dlevel][Player.x][Player.y].locchar = TRAP;
X	Dungeon[Dlevel][Player.x][Player.y].p_locf = L_TRAP_PIT;
X	mprint("You fall into a pit -- filled with treasure!");
X	morewait();
X	for (i=0;i<5;i++) {
X	  ol = ((pol) calloc(1,sizeof(oltype)));
X	  ol->thing = create_object();
X	  ol->next = Dungeon[Dlevel][Player.x][Player.y].things;
X	  Dungeon[Dlevel][Player.x][Player.y].things = ol;
X	}
X	pickup();
X      }
X      else mprint("You feel like fortune has passed you by....");
X      break;
X    case 11: 
X      mprint("A mysterious voice echoes all around you....");
X      hint();
X      morewait();
X      break;
X    case 12:
X      if (Balance > 0) {
X	mprint("You get word of the failure of your bank!");
X	Balance = 0;
X      }
X      else mprint("You feel lucky.");
X      break;
X    case 13:
X      if (Balance > 0) {
X	mprint("You get word of a bank error in your favor!");
X	Balance += 5000;
X      }
X      else mprint("You feel unlucky.");
X      break;
X    }
X  showflags();
X}
X
X
END_OF_oaux1.c
if test 30687 -ne `wc -c <oaux1.c`; then
    echo shar: \"oaux1.c\" unpacked with wrong size!
fi
# end of overwriting check
fi
if test -f omega.log -a "${1}" != "-c" ; then 
  echo shar: Will not over-write existing file \"omega.log\"
else
echo shar: Extracting \"omega.log\" \(135 characters\)
sed "s/^X//" >omega.log <<'END_OF_omega.log'
XSysop
XCaspar (The Friendly Ghost)
X1 2 1118
XSysop
XSlongo The Unknown
X2 5 2718
XSysop
XVlad Tepes
X2 3 2618
XSysop
XBedwyr the Brave
X1 2 3012
END_OF_omega.log
if test 135 -ne `wc -c <omega.log`; then
    echo shar: \"omega.log\" unpacked with wrong size!
fi
# end of overwriting check
fi
if test -f omega.thanks -a "${1}" != "-c" ; then 
  echo shar: Will not over-write existing file \"omega.thanks\"
else
echo shar: Extracting \"omega.thanks\" \(130 characters\)
sed "s/^X//" >omega.thanks <<'END_OF_omega.thanks'
X
X
XThanks to:
X
XBen Page, Greg Fisher, Hammy, and Silver, for bug reports, playtesting,
Xsuggestions, debugging, and general advice.
END_OF_omega.thanks
if test 130 -ne `wc -c <omega.thanks`; then
    echo shar: \"omega.thanks\" unpacked with wrong size!
fi
# end of overwriting check
fi
if test -f oscr.c -a "${1}" != "-c" ; then 
  echo shar: Will not over-write existing file \"oscr.c\"
else
echo shar: Extracting \"oscr.c\" \(22823 characters\)
sed "s/^X//" >oscr.c <<'END_OF_oscr.c'
X/* omega (c) 1987 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 <strings.h>
X#include <sys/types.h>
X#include <sys/timeb.h>
X#include "oglob.h"
X
X/* from ofile */
Xextern void showscores(),extendlog(),showfile();
X
X
X
X/* from outil */
Xextern int los_p(),view_los_p();
Xextern int inbounds();
Xextern int screenmod();
Xextern int offscreen();
Xextern int distance();
Xextern int calc_points();
Xextern int hour(),showhour();
Xextern int day();
Xextern char *month(),*ordinal();
X
X/* from oplay */
Xextern char *itemid();
Xextern int optionp();
X
X/* from ospell */
Xextern char *spellid();
X
XWINDOW *Levelw,*Dataw,*Flagw,*Timew,*Menuw1,*Menuw2,*Msgw,*Locw,*Morew,*Phasew;
XWINDOW *CurrentMenu,*Rightside,*Comwin;
X     
Xvoid redraw(),drawspot(),drawvision(),morewait(),drawmonsters();
Xvoid mprint(),printm(),title(),sitclear(),initgraf(),xredraw();
Xvoid plotchar(),show_screen(),blankoutspot(),show_license();
Xvoid menuclear(),showcursor(),mnumprint(),menumorewait(),menunumprint();
Xvoid menu_i_print(),clearmsg(),menuprint(),menu_item_print();
Xvoid stdmorewait(),draw_explosion(),dataprint(),comwinprint(),timeprint();
Xvoid menuspellprint(),erase_level(),levelrefresh();
Xvoid refreshmsg(),menuaddch(),drawscreen(),maddch(),putspot();
Xvoid menuprintitem(),display_quit(),showflags();
Xvoid drawplayer(),displaystats(),display_death(),plotmon();
Xvoid dobackspace(),drawandrefreshspot(),selectmenu();
Xvoid drawomega(),screencheck(),blotspot(),plotspot();
Xint parsenum(),getnumber(),litroom();
Xchar getspot(),mgetc(),lgetc(),menugetc(),*msgscanstring();
Xchar mcigetc();
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 selectmenu()
X{
X  int y,x;
X  getyx(CurrentMenu,y,x);
X  if (y>17) {
X    if (CurrentMenu == Menuw1)
X      CurrentMenu = Menuw2;
X    else {
X      menumorewait();
X      menuclear();
X      CurrentMenu = Menuw1;
X    }
X  }
X}
X
Xvoid show_screen(y)
Xint y;
X{
X  int i,j,seen,top,bottom;
X  wclear(Levelw);
X  switch(y) {
X  case 0:
X    top = TOPEDGE;
X    bottom = EDGE1+2;
X    break;
X  case 1:
X    top = EDGE1-1;
X    bottom = EDGE2+1;
X    break;
X  case 2:
X    top = EDGE2-1;
X    bottom = EDGE3+1;
X    break;
X  case 3:
X    top = EDGE3-2;
X    bottom = BOTTOMEDGE;
X    break;
X  }
X  for (j=top;j<=bottom;j++) 
X    for (i=0;i<WIDTH;i++) {
X      seen = Dungeon[Dlevel][i][j].seen;
X      wmove(Levelw,screenmod(j),i);
X      waddch(Levelw,(seen ? Dungeon[Dlevel][i][j].showchar : ' '));
X    }
X  wrefresh(Levelw);
X}
X
X
X
X
X
Xvoid refreshmsg()
X{
X  wrefresh(Msgw);
X}
X
X
Xchar mgetc()
X{
X  return(wgetch(Msgw));
X}
X
X/* case insensitive mgetc -- sends uppercase to lowercase */
Xchar mcigetc()
X{
X  char c = wgetch(Msgw);
X  if ((c>='A') && (c<='Z'))
X    return(c+('a'-'A'));
X  else return(c);
X}
X
Xchar menugetc()
X{
X  return(wgetch(Menuw1));
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
X/* for external call */
Xvoid clearmsg()
X{
X  wclear(Msgw);
X  wrefresh(Msgw);
X}
X
X
Xvoid erase_level()
X{
X  wclear(Levelw);
X}
X
X
X/* possible moreprint to message window, otherwise just a printm */
Xvoid mprint(s)
Xchar *s;
X{
X  int x,y;
X  if (! SuppressPrinting) {
X    strcpy(Laststring,s);
X    getyx(Msgw,y,x);
X    if (x+strlen(s) > 64) {
X      morewait();
X      wclear(Msgw);
X    }
X    wprintw(Msgw,s);
X    waddch(Msgw,' '); 
X    wrefresh(Msgw);
X  }
X}
X
X
X
X/* no new line */
Xvoid printm(s)
Xchar *s;
X{
X  if (! SuppressPrinting) {
X    wprintw(Msgw,s);
X    waddch(Msgw,' ');
X    wrefresh(Msgw);
X  }
X}  
X
Xvoid title()
X{
X  FILE *fd;
X  strcpy(Str1,OMEGALIB);
X  strcat(Str1,"omega.motd");
X  fd = fopen(Str1,"r");
X  showfile(fd);
X  /* Pseudo Random Seed */
X  Seed = (int) time(0);
X  clear();
X  refresh();  
X  showscores();
X}
X
X
X
X
X
X
X
X
X
X
X/* initialize, screen, windows */
Xvoid initgraf()
X{
X  initscr();
X
X  Rightside = newwin(20,15,1,65);
X  Msgw = newwin(1,80,0,0);  
X  Morew = newwin(1,15,1,65);  
X  Locw = newwin(1,80,21,0);
X  Levelw = newwin(20,64,1,0);
X  Menuw1 = newwin(20,64,1,0);
X  Menuw2 = newwin(20,40,1,40);  
X  Dataw = newwin(2,80,22,0);
X  Timew = newwin(2,15,3,65);
X  Phasew = newwin(2,15,6,65);
X  Flagw = newwin(3,15,9,65);
X  Comwin = newwin(8,15,13,65);
X  CurrentMenu = Menuw1;
X
X  noecho();
X  crmode();
X
X  scrollok(Msgw,TRUE);
X
X  wclear(Msgw);
X  wclear(Locw);
X  wclear(Levelw);
X  wclear(Timew);
X  wclear(Flagw);
X  wclear(Phasew);
X  wclear(Dataw);
X  wclear(Menuw1);
X  wclear(Menuw2);
X  wclear(Comwin);
X
X  clear();
X  refresh();
X  title();
X  clear();
X  refresh();
X}
X
Xvoid drawplayer()
X{
X  static int lastx=0,lasty=0;
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  lastx = Player.x;
X  lasty = Player.y;
X}
X
Xint litroom(x,y)
Xint x,y;
X{
X  if (Dungeon[Dlevel][x][y].roomnumber < ROOMBASE) return(FALSE);
X  else 
X    return(Leveldata[Dlevel].rooms
X	   [Dungeon[Dlevel][x][y].roomnumber-ROOMBASE].lighted ||
X	   Player.status[ILLUMINATION]);
X}
X
Xvoid drawvision(x,y,v)
Xint x,y,v;
X{
X  static int oldx,oldy,oldv,oldroom;
X  int i,j;
X  if (Dlevel != 0)
X    for (i=0-oldv;i<oldv+1;i++)
X      for (j=0-oldv;j<oldv+1;j++)
X	if (inbounds(oldx+i,oldy+j))
X	  if ((oldroom != Dungeon[Dlevel][x][y].roomnumber) ||
X	      (! litroom(oldx,oldy)))
X	    blankoutspot(oldx+i,oldy+j);
X  if (Player.status[BLINDED]) {
X    drawspot(oldx,oldy);
X    drawspot(x,y);
X    drawplayer();
X    v = 0;
X  }
X  else {
X    for (i=0-v;i<v+1;i++)
X      for (j=0-v;j<v+1;j++)
X	if (inbounds(x+i,y+j))
X	  drawspot(x+i,y+j);
X    drawplayer();
X    drawmonsters(TRUE);
X  }
X  if ((! Fastmove) || (! optionp(JUMPMOVE)))
X    showcursor(Player.x,Player.y);
X  oldx = x;
X  oldy = y;
X  oldv = v;
X  oldroom = Dungeon[Dlevel][x][y].roomnumber;
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/* this one refreshes immediately and also ignores monsters */
Xvoid drawandrefreshspot(x,y)
Xint x,y;
X{
X  char c = getspot(x,y,FALSE);
X  int l;
X  if (c != Dungeon[Dlevel][x][y].showchar)
X    if (view_los_p(Player.x,Player.y,x,y)) {
X	Dungeon[Dlevel][x][y].seen = TRUE;
X	Dungeon[Dlevel][x][y].showchar = c;
X	putspot(x,y,c);
X      }
X  wrefresh(Levelw);
X}
X
X/* draws a particular spot under if in line-of-sight */
Xvoid drawspot(x,y)
Xint x,y;
X{
X  char c = getspot(x,y,FALSE);
X  if (c != Dungeon[Dlevel][x][y].showchar)
X    if (view_los_p(Player.x,Player.y,x,y)) {
X	Dungeon[Dlevel][x][y].seen = TRUE;
X	Dungeon[Dlevel][x][y].showchar = c;
X	putspot(x,y,c);
X      }
X}
X
X/* write a blank to a spot if it is floor */
Xvoid blankoutspot(i,j)
Xint i,j;
X{
X  if (Dungeon[Dlevel][i][j].showchar == FLOOR) 
X    blotspot(i,j);
X}
X
X/* blank out a spot regardless */
Xvoid blotspot(i,j)
Xint i,j;
X{
X  Dungeon[Dlevel][i][j].seen = FALSE;
X  Dungeon[Dlevel][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/* for displaying activity specifically at some point */
Xvoid plotspot(x,y,showmonster)
Xint x,y,showmonster;
X{
X  if (Dungeon[Dlevel][x][y].seen)
X    putspot(x,y,getspot(x,y,showmonster));
X  else 
X    putspot(x,y,' ');
X}
X
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=Mlist[Dlevel];ml!=NULL;ml=ml->next) {
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	  putspot(ml->m->x,ml->m->y,ml->m->monchar);
X    }
X    else if (Dungeon[Dlevel][ml->m->x][ml->m->y].seen)
X      putspot(ml->m->x,
X	      ml->m->y,
X	      Dungeon[Dlevel][ml->m->x][ml->m->y].showchar);
X    else blotspot(ml->m->x,ml->m->y);
X  }
X}
X
X/* find apt char to display at some location */
Xchar getspot(x,y,showmonster)
Xint x,y,showmonster;
X{
X  if (Dungeon[Dlevel][x][y].secret) return(WALL);
X  switch (Dungeon[Dlevel][x][y].locchar) {
X  case WHIRLWIND: 
X    return((Time % 2 == 1) ? WHIRLWIND2 : WHIRLWIND);
X    break;
X  case WATER:
X    if (Dungeon[Dlevel][x][y].creature == NULL) 
X      return(WATER);
X    else if (m_statusp(Dungeon[Dlevel][x][y].creature,SWIMMING))
X      return(WATER);
X    else return(Dungeon[Dlevel][x][y].creature->monchar);
X    break;
X  case CLOSED_DOOR:
X  case LAVA:
X  case HEDGE:
X  case FIRE:
X  case PORTAL:
X  case ABYSS:
X    return(Dungeon[Dlevel][x][y].locchar);
X    break;
X  default:
X    if (showmonster && (Dungeon[Dlevel][x][y].creature != NULL)) {
X      if ((m_statusp(Dungeon[Dlevel][x][y].creature,M_INVISIBLE)) &&
X	  (! Player.status[TRUESIGHT]))
X	return(getspot(x,y,FALSE));
X      else return (Dungeon[Dlevel][x][y].creature->monchar);
X    }
X    else if (Dungeon[Dlevel][x][y].things != NULL) {
X      if (Dungeon[Dlevel][x][y].things->next != NULL)
X	return(PILE);
X      else return(Dungeon[Dlevel][x][y].things->thing->objchar);
X    }
X    else return(Dungeon[Dlevel][x][y].locchar);
X    break;
X  }
X}
X
Xvoid commanderror()
X{
X  wclear(Msgw);
X  wrefresh(Msgw);
X  wprintw(Msgw,"%c : unknown command",Cmd);
X  wrefresh(Msgw);
X}
X
Xvoid timeprint()
X{
X  wclear(Timew);
X  wprintw(Timew,"%d",showhour());
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  wprintw(Dataw,"HP:%d/%d MANA:%d/%d AU:%d LEVEL:%d/%d CARRY:%d/%d \n",
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}
X
X
Xvoid displaystats(statpoints)
Xint statpoints;
X{
Xwclear(Dataw);
Xwprintw(Dataw,"       Statistic Points Left: %d \n",statpoints);
Xwprintw(Dataw,"STR:%d  CON:%d  DEX:%d  AGI:%d  INT:%d  POW:%d  ",
X	Player.maxstr,Player.maxcon,Player.maxdex,Player.maxagi,Player.maxiq,
X	Player.maxpow);
Xwrefresh(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  scrollok(Msgw,FALSE);
X  touchwin(Msgw);
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(Levelw);
X  wrefresh(Timew);
X  wrefresh(Flagw);
X  wrefresh(Dataw);
X  wrefresh(Locw);
X  wrefresh(Morew);
X  wrefresh(Phasew);
X  wrefresh(Comwin);
X  scrollok(Msgw,TRUE);
X}
X
X
X
Xvoid menuaddch(c)
Xchar c;
X{
X  selectmenu();
X  waddch(CurrentMenu,c);
X  wrefresh(CurrentMenu);
X}
X
Xvoid stdmorewait()
X{
X  printw("\n---More---");
X  refresh();
X  while (wgetch(stdscr) != SPACE) { }
X}
X
Xvoid menumorewait()
X{
X  wprintw(Menuw2,"\n ---More---");
X  wrefresh(Menuw2);
X  while (wgetch(Menuw2) != SPACE) { }
X}
X
X
X/* Neato the way it doesn't matter what display is set to, huh */
Xvoid morewait()
X{
X  int display;
X  do {
X    wclear(Morew);
X    if (display) wprintw(Morew,"***  MORE  ***");
X    else wprintw(Morew,"+++  MORE  +++");
X    display = ! display;
X    wrefresh(Morew);
X  } while (wgetch(Msgw) != SPACE);
X  wclear(Morew);
X  wrefresh(Morew);
X}
X
Xvoid menuclear()
X{
X  wclear(Menuw1);
X  wclear(Menuw2);
X  wrefresh(Menuw1);
X  wrefresh(Menuw2);
X  CurrentMenu = Menuw1;
X}
X
Xvoid menuspellprint(i)
Xint i;
X{
X  selectmenu();
X  wprintw(CurrentMenu,spellid(i));
X  wprintw(CurrentMenu,"(%d)\n",Spells[i].powerdrain);
X  wrefresh(CurrentMenu);
X}  
X
Xvoid menuprint(s)
Xchar *s;
X{
X  selectmenu();
X  wprintw(CurrentMenu,s);
X  wrefresh(CurrentMenu);
X}
X
Xvoid menu_i_print(i)
Xint i;
X{
X  menu_item_print(i,Player.possessions[i]);
X}
X
Xvoid menuprintitem(i,s)
Xint i;
Xchar *s;
X{
X  selectmenu();
X  wprintw(CurrentMenu,"%d",i);
X  waddch(CurrentMenu,':');
X  waddch(CurrentMenu,' ');
X  wprintw(CurrentMenu,s);
X  wprintw(CurrentMenu,"\n");
X  wrefresh(CurrentMenu);
X}
X
Xvoid menu_item_print(i,item)
Xint i;
Xpob item;
X{
X  selectmenu();
X  waddch(CurrentMenu,((char) ('a' + i)));
X  waddch(CurrentMenu,':');
X  waddch(CurrentMenu,' ');
X  waddch(CurrentMenu,item->objchar);
X  waddch(CurrentMenu,' ');
X  wprintw(CurrentMenu,itemid(item));
X  if (item->used) wprintw(CurrentMenu," (in use)");
X  wprintw(CurrentMenu,"\n");
X  wrefresh(CurrentMenu);
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  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
X  for (i=0;i<WIDTH;i++)
X    for(j=0;j<LENGTH;j++)
X      putspot(i,j,Dungeon[Dlevel][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  char atom;
X
X  if (range==1) return(1);
X  else while (! done) {
X    printm("\nHow many? Change with < or >, ESCAPE to select:");
X    mnumprint(value);
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  }
X  return(value);
X}
X
X/* reads a positive number up to 99999 */
Xint parsenum()
X{
X  int number[5];
X  int place = -1;
X  int done=FALSE;
X  int i,x,y,num=0,mult=1;
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 < 4)) {
X      place++;
X      number[place]=byte;
X      waddch(Msgw,byte);
X      wrefresh(Msgw);
X    }
X	   }
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  printw(" (%d points)",calc_points());
X  strcpy(Str4,"Killed by ");
X  strcat(Str4,source);
X  printw("\n");
X  printw(Str4);
X  printw(".");
X  printw("\n\n\n\n\n\Hit 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    printw("is a total master of omega with %d points!",calc_points());
X    strcpy(Str4,"A total master of omega");
X  }
X  else {
X    strcpy(Str4,"retired a winner");
X    printw(" triumphed in omega with %d points!",calc_points());
X    printw("\nDeepest penetration was level %d.",Deepest);
X  }
X  printw("\n\n\n\n\n\Hit 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  printw(" wimped out on level %d with %d points!",Dlevel,calc_points());
X  printw("\nDeepest penetration was level %d.",Deepest);
X  printw("\n\n\n\n\n\Hit any key to continue.");
X  refresh();
X  wgetch(stdscr);
X  clear();
X  refresh();
X  extendlog(Str4,QUIT);
X}
X
X
Xvoid mnumprint(n)
Xint n;
X{
X  wprintw(Msgw,"%d",n);
X  wrefresh(Msgw);
X}
X
Xvoid menunumprint(n)
Xint n;
X{
X  wprintw(CurrentMenu,"%d",n);
X  wrefresh(CurrentMenu);
X}
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 > 20)
X    wprintw(Flagw,"Satiated\n");
X  else if (Player.food < 0)
X    wprintw(Flagw,"Starving\n");
X  else if (Player.food < 2)
X    wprintw(Flagw,"Weak\n");
X  else if (Player.food < 4)
X    wprintw(Flagw,"Hungry\n");
X  else if (Player.food < 8)
X    wprintw(Flagw,"A mite peckish\n");
X  else wprintw(Flagw,"Content\n");
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  wrefresh(Flagw);
X}
X
Xvoid drawomega()
X{
X  int i;
X  for(i=0;i<7;i++) {
X  clear();
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                          +++++");
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                          .....");
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  xredraw();
X}               
X
X
Xvoid screencheck(y)
Xint y;
X{
X  if (y/16 != WhichScreen) {
X    WhichScreen = y/16;
X    show_screen(WhichScreen);
X  }
X}
X
X
X
Xvoid show_license()
X{
X  Skipmonsters = TRUE;
X  clear();
X  printw("General Public License:\n\n");
X  printw("omega is copyright (C) 1987 by:\n");
X  printw("Laurence R. Brothers (brothers@paul.rutgers.edu)\n\n");
X  printw("All rights are reserved, save the following permissions:\n\n");
X  printw("Free copying: Anyone may make a copy of omega, and distribute\n");
X  printw("the copy, so long as this license remains accessible\n");
X  printw("(via the 'P' command). No charge will be levied for such copying\n");
X  printw("or distribution. The author will gladly accept any remuneration\n");
X  printw("that users may wish to provide, however.\n\n");
X  printw("Modification: No one may modify omega except inasmuch\n");
X  printw("as may be necessary to cause omega to function in any given\n");
X  printw("computer environment. 'Porting' is therefore freely allowed. Any\n");
X  printw("such modifications will be considered 'works for hire'\n");
X  printw("and the modifiers will have no rights of ownership over\n");
X  printw("such modifications. I specifically note that no compensation\n");
X  printw("in any form will be rendered to those who make such allowed\n");
X  printw("changes to omega. All other modifications are in violation of\n");
X  printw("this license.\n\n");
X  stdmorewait();
X  clear();
X  printw("Warranty: No warranty is made for omega's operation.\n");
X  printw("Any damages incurred in the use of omega or in its\n");
X  printw("implementation are solely the responsibility of the end-user.\n\n");
X  printw("Coverage: Anyone who compiles, runs, copies, or in any other way\n");
X  printw("manipulates any copy of omega's code, programs, or files shall\n");
X  printw("considered to be bound by this license.\n");
X  refresh();
X  stdmorewait();
X  xredraw();
X}
END_OF_oscr.c
if test 22823 -ne `wc -c <oscr.c`; then
    echo shar: \"oscr.c\" unpacked with wrong size!
fi
# end of overwriting check
fi
echo shar: End of archive 12 \(of 15\).
cp /dev/null ark12isdone
MISSING=""
for I in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ; do
    if test ! -f ark${I}isdone ; then
	MISSING="${MISSING} ${I}"
    fi
done
if test "${MISSING}" = "" ; then
    echo You have unpacked all 15 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