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

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

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



#! /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 5 (of 19)."
# Contents:  oaux2.c ofile.c
# Wrapped by billr@saab on Wed Jul 13 10:46:43 1988
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f 'oaux2.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'oaux2.c'\"
else
echo shar: Extracting \"'oaux2.c'\" \(29781 characters\)
sed "s/^X//" >'oaux2.c' <<'END_OF_FILE'
X/* omega copyright (C) by Laurence Raphael Brothers, 1987,1988 */
X
X/* oaux2.c */
X
X/* some functions called by ocom.c, also see oaux1.c and oaux3.c*/ 
X/* This is a real grab bag file. It contains functions used by
X   oaux1 and o.c, as well as elsewhere. It is mainly here so oaux1.c
X   and oaux3.c are not huge */
X
X#include "oglob.h"
X
X
X/* Player stats like str, agi, etc give modifications to various abilities
X   chances to do things, etc. Positive is good, negative bad. */
Xint statmod(stat)
Xint stat;
X{
X  return((stat-10)/2);
X}
X
X
X/* effects of hitting */
Xvoid p_hit (m,dmg,dtype)
Xstruct monster *m;
Xint dmg;
Xint dtype;
X{
X  int dmult;
X
X  /* chance for critical hit..., 3/10 */
X  switch (random_range(10)) {  
X    case 0:
X    if (random_range(100) < Player.level) {
X      strcpy(Str3,"You annihilate ");
X      dmult = 1000;
X    }
X    else {
X      strcpy(Str3,"You blast "); 
X      dmult=5; 
X    }
X    break;
X    case 1:
X    case 2: 
X    strcpy(Str3,"You smash "); 
X    dmult=2; break;
X
X    default: 
X    dmult=1;
X    if (random_range(10)) strcpy(Str3,"You hit ");
X    else switch(random_range(4)) {
X    case 0: strcpy(Str3,"You damage "); break;
X    case 1: strcpy(Str3,"You inflict bodily harm on "); break;
X    case 2: strcpy(Str3,"You injure "); break;
X    case 3: strcpy(Str3,"You molest "); break;
X    }
X    break;
X  } 
X  if (Lunarity == 1) dmult = dmult * 2;
X  else if (Lunarity == -1) dmult = dmult / 2;
X  if (m->uniqueness == COMMON) strcat(Str3,"the ");
X  strcat(Str3,m->monstring);
X  strcat(Str3,". ");
X  if (Verbosity != TERSE) mprint(Str3);
X  else mprint("You hit it.");
X  m_damage(m,dmult * random_range(dmg),dtype);
X  if ((Verbosity != TERSE) && (random_range(10)==3) && (m->hp > 0))
X    mprint("It laughs at the injury and fights on!");
X}
X
X/* and effects of missing */
Xvoid player_miss(m,dtype)
Xstruct monster *m;
Xint dtype;
X{
X  if (random_range(30)==1) /* fumble 1 in 30 */
X    p_fumble(dtype);
X  else {
X    if (Verbosity != TERSE) {
X      if (random_range(10))
X	strcpy(Str3,"You miss ");
X      else switch(random_range(4)) {
X      case 0: strcpy(Str3,"You flail lamely at "); break;
X      case 1: strcpy(Str3,"You only amuse "); break;
X      case 2: strcpy(Str3,"You fail to even come close to "); break;
X      case 3: strcpy(Str3,"You totally avoid contact with "); break;
X      }	
X      if (m->uniqueness == COMMON) strcat(Str3,"the ");
X      strcat(Str3,m->monstring);
X      strcat(Str3,". ");
X      mprint(Str3);
X    }
X    else mprint("You missed it.");
X  }  
X}
X
X/* oh nooooo, a fumble.... */
Xvoid p_fumble(dtype)
Xint dtype;
X{
X  mprint("Ooops! You fumbled....");
X  switch(random_range(10)) {
X    case 0:
X    case 1:
X    case 2:
X    case 3: 
X    case 4: 
X    case 5: drop_weapon(); break;
X    case 6:
X    case 7:
X    case 8: break_weapon(); break;
X    case 9: mprint("Oh No! You hit yourself!");
X	    p_damage(Player.dmg,dtype,"stupidity");
X	    break;
X  }
X}	    
X
X/* try to drop a weapon (from fumbling) */
Xvoid drop_weapon()
X{
X  if (Player.possessions[O_WEAPON_HAND] != NULL) {
X    strcpy(Str1,"You dropped your ");
X    strcat(Str1,Player.possessions[O_WEAPON_HAND]->objstr);
X    mprint(Str1);
X    morewait();
X    p_drop_at(Player.x,Player.y,1,Player.possessions[O_WEAPON_HAND]);
X    conform_lost_objects(1,Player.possessions[O_WEAPON_HAND]);
X  }
X  else mprint("You feel fortunate.");
X}
X
X
X/* try to break a weapon (from fumbling) */
Xvoid break_weapon()
X{
X  if (Player.possessions[O_WEAPON_HAND] != NULL) {
X    strcpy(Str1,"Your ");
X    strcat(Str1,itemid(Player.possessions[O_WEAPON_HAND]));
X    strcat(Str1," vibrates in your hand....");
X    mprint(Str1);
X    damage_item(Player.possessions[O_WEAPON_HAND]);
X    morewait();
X  }
X}
X
X
X/* hooray */
Xvoid p_win()
X{
X  morewait();
X  clearmsg();
X  print1("You won!");
X  morewait();
X  display_win();
X  endgraf();
X  exit(0);
X}
X
X
X/* handle a h,j,k,l, etc., to change x and y by dx and dy */
X/* for targeting in dungeon */
Xvoid movecursor(x,y,dx,dy)
Xint *x,*y;
Xint dx,dy;
X{
X  if (inbounds(*x+dx,*y+dy)) {
X    *x += dx;
X    *y += dy;
X    screencheck(*y);
X  }
X  showcursor(*x,*y);
X}
X
X
X/* is Player immune to damage type dtype */
Xint p_immune(dtype)
Xint dtype;
X{
X  return(Player.immunity[dtype]>0);
X}
X
X
X
X
X
X
X/* deal with each possible stati -- values are per move */
X/* this function is executed every move */
X/* A value over 1000 indicates a permanent effect */
Xvoid minute_status_check()
X{
X  int i;
X
X  if (Player.status[HASTED]>0) {
X    if (Player.status[HASTED] < 1000) {
X      Player.status[HASTED]--;
X      if (Player.status[HASTED]==0) {
X	mprint("The world speeds up.");
X	calc_melee();
X      }
X    }
X  }
X
X
X  if (Player.status[POISONED]>0) {
X    Player.status[POISONED]--;
X    p_damage(3,POISON,"poison");
X    if (Player.status[POISONED] == 0) {
X      showflags();
X      mprint("You feel better now.");
X    }
X  }
X
X
X  if (Player.immunity[UNSTOPPABLE]>0) {
X    for(i=0;i<NUMIMMUNITIES;i++)
X    Player.immunity[i]--;
X    if (Player.immunity[UNSTOPPABLE]==1)
X      mprint("You feel vincible again.");
X  }
X
X
X  if (Player.status[IMMOBILE]>0) {
X    Player.status[IMMOBILE]--;
X    if (Player.status[IMMOBILE] == 0) 
X      mprint("You can move again.");
X  }
X
X
X  if (Player.status[SLEPT]>0) {
X    Player.status[SLEPT]--;
X    if (Player.status[SLEPT] == 0) {
X      mprint("You woke up.");
X    }
X  }
X
X  if (Player.status[REGENERATING]>0) {
X    if ((Player.hp < Player.maxhp) && (Player.mana > 0)){
X      Player.hp++;
X      Player.mana--;
X      dataprint();
X    }
X    if (Player.status[REGENERATING] < 1000) {
X      Player.status[REGENERATING]--;
X      if (Player.status[REGENERATING] == 0) {
X	mprint("You feel less homeostatic.");
X      }
X    }
X  }
X
X  if (Player.status[SLOWED]>0) {
X    if (Player.status[SLOWED] < 1000) {
X      Player.status[SLOWED]--;
X      if (Player.status[SLOWED] == 0) {
X	mprint("You feel quicker now.");
X	calc_melee();
X      }
X    }
X  }
X
X  if (Player.status[RETURNING]>0) {
X    Player.status[RETURNING]--;
X    if (Player.status[RETURNING] == 150)
X      mprint("Your spell slowly hums towards activation...");
X    else if (Player.status[RETURNING] == 100)
X      mprint("There is an electric tension in the air!");
X    else if (Player.status[RETURNING] == 50)
X      mprint("A vortex of mana begins to form around you!");
X    else if (Player.status[RETURNING] == 10)
X      mprint("Your surroundings start to warp and fade!");
X    if (Player.status[RETURNING] == 0) {
X      mprint("The vortex of mana carries you off!");
X      level_return();
X    }
X  }
X  
X  if (Player.status[AFRAID]>0) {
X    if (Player.status[AFRAID] < 1000) {
X      Player.status[AFRAID]--;
X      if (Player.status[AFRAID] == 0) {
X	mprint("You feel bolder now.");
X      }
X    }
X  }
X  
X}
X
X
X
X/* effect of gamma ray radiation... */
Xvoid moon_check()
X{
X  /* 24 day lunar cycle */
X  Phase = (Phase+1)%24;
X  phaseprint();
X  Lunarity = 0;
X  if (((Player.patron == DRUID) && ((Phase/2 == 3) || (Phase/2 == 9))) ||
X      ((Player.alignment > 10) && (Phase/2 == 6)) ||
X      ((Player.alignment < -10) && (Phase/2 == 0))) {
X    mprint("As the moon rises you feel unusually vital!");
X    Lunarity = 1;
X  }
X  else
X  if (((Player.patron == DRUID) && ((Phase/2 == 0) || (Phase/2 == 6))) ||
X      ((Player.alignment > 10) && (Phase/2 == 0)) ||
X      ((Player.alignment < -10) && (Phase/2 == 6))) {
X    mprint("The rise of the moon tokens a strange enervation!");
X    Lunarity = -1;
X  }
X
X}
X
X
X
X/* check 1/hour for torch to burn out if used */
Xvoid torch_check()
X{
X  int i;
X  for(i=O_READY_HAND;i<=O_WEAPON_HAND;i++) {
X    if (Player.possessions[i]!=NULL)
X      if ((Player.possessions[i]->id == THINGID+8) && /*torch */
X	  (Player.possessions[i]->aux > 0)) {
X	Player.possessions[i]->aux--;
X	if (Player.possessions[i]->aux==0) {
X	  mprint("Your torch goes out!!!");
X	  conform_unused_object(Player.possessions[i]);
X	  if (Player.possessions[i]->number > 1) {
X	    Player.possessions[i]->number--;
X	    Player.possessions[i]->aux = 6;
X	  }
X	  else {
X	    Player.possessions[i]->usef = I_NO_OP;
X	    Player.possessions[i]->cursestr =
X	      Player.possessions[i]->truename =
X		Player.possessions[i]->objstr = 
X		  salloc("burnt-out torch");
X	  }
X	}
X      }
X  }
X}
X
X
X
X/* values are in multiples of ten minutes */
X/* values over 1000 indicate a permanent effect */
Xvoid tenminute_status_check()
X{
X  if ((Player.status[SHADOWFORM]>0) && (Player.status[SHADOWFORM]<1000)) {
X    Player.status[SHADOWFORM]--;
X    if (Player.status[SHADOWFORM] == 0) {
X      Player.immunity[NORMAL_DAMAGE]--;
X      Player.immunity[ACID]--;
X      Player.immunity[THEFT]--;
X      Player.immunity[INFECTION]--;
X      mprint("You feel less shadowy now.");
X    }
X  }
X
X  if ((Player.status[ILLUMINATION]>0) && (Player.status[ILLUMINATION]<1000)) {
X    Player.status[ILLUMINATION]--;
X    if (Player.status[ILLUMINATION] == 0) {
X      mprint("Your light goes out!");
X    }
X  }
X
X
X  if ((Player.status[VULNERABLE]>0) && (Player.status[VULNERABLE]<1000)){
X    Player.status[VULNERABLE]--;
X    if (Player.status[VULNERABLE] == 0)
X      mprint("You feel less endangered.");
X  }
X
X
X  if ((Player.status[DEFLECTION]>0) && (Player.status[DEFLECTION]<1000)){
X    Player.status[DEFLECTION]--;
X    if (Player.status[DEFLECTION] == 0)
X      mprint("You feel less well defended.");
X  }
X
X  if ((Player.status[ACCURATE]>0) && (Player.status[ACCURACY]<1000)){
X    Player.status[ACCURATE]--;
X    if (Player.status[ACCURATE] == 0) {
X      calc_melee();
X      mprint("The bulls' eyes go away.");
X    }
X  }
X  if ((Player.status[HERO]>0) && (Player.status[HERO]<1000)){
X    Player.status[HERO]--;
X    if (Player.status[HERO] == 0) {
X      calc_melee();
X      mprint("You feel less than super.");
X    }
X  }
X
X  if ((Player.status[LEVITATING]>0) && (Player.status[LEVITATING]<1000)){
X    Player.status[LEVITATING]--;
X    if (Player.status[LEVITATING] == 0)
X      mprint("You're no longer walking on air.");
X  }
X
X  if (Player.status[DISEASED]>0) {
X    Player.status[DISEASED]--;
X    if (Player.status[DISEASED] == 0) {
X      showflags();
X      mprint("You feel better now.");
X    }
X  }
X
X
X  if ((Player.status[INVISIBLE] > 0) && (Player.status[INVISIBLE]<1000)){
X    Player.status[INVISIBLE]--;
X    if (Player.status[INVISIBLE] == 0)
X      mprint("You feel more opaque now.");
X  }
X
X  if ((Player.status[BLINDED]>0) && (Player.status[BLINDED]<1000)) {
X    Player.status[BLINDED]--;
X    if (Player.status[BLINDED] == 0) 
X      mprint("You can see again.");
X  }
X
X  if ((Player.status[TRUESIGHT]>0) && (Player.status[TRUESIGHT]<1000)) {
X    Player.status[TRUESIGHT]--;
X    if (Player.status[TRUESIGHT] == 0) 
X      mprint("You feel less keen now.");
X  }
X
X  if ((Player.status[BERSERK]>0) && (Player.status[BERSERK]<1000)) {
X    Player.status[BERSERK]--;
X    if (Player.status[BERSERK] == 0) 
X      mprint("You stop foaming at the mouth.");
X  }
X
X  if ((Player.status[ALERT]>0) && (Player.status[ALERT] < 1000)) {
X    Player.status[ALERT]--;
X    if (Player.status[ALERT] == 0) 
X      mprint("You feel less alert now.");
X  }
X
X  if ((Player.status[BREATHING]>0) && (Player.status[BREATHING] < 1000)) {
X    Player.status[BREATHING]--;
X    if (Player.status[BREATHING] == 0) 
X      mprint("You feel somewhat congested."); 
X  }
X
X  if ((Player.status[DISPLACED]>0) && (Player.status[DISPLACED] < 1000)) {
X    Player.status[DISPLACED]--;
X    if (Player.status[DISPLACED]==0) 
X      mprint("You feel a sense of position.");
X  }
X  timeprint();
X  dataprint();
X}
X
X
X
X/* Increase in level at appropriate experience gain */
Xvoid gain_level()
X{
X  int gained=FALSE;
X  morewait();
X  while (expval(Player.level+1) <= Player.xp) {
X    gained = TRUE;
X    Player.level++;
X    print1("You have attained a new experience level!");
X    print2("You are now ");
X    nprint2(getarticle(levelname(Player.level)));
X    nprint2(levelname(Player.level));
X    Player.maxhp += random_range(Player.con)+1;
X    Player.mana = Player.maxmana = calcmana();
X    morewait();
X  }
X  if (gained) clearmsg();
X  calc_melee();
X}
X
X/* experience requirements */
Xint expval(plevel)
Xint plevel;
X{
X  switch(plevel) {
X    case 0:return(0);break;
X    case 1:return(20);break;
X    case 2:return(50);break;
X    case 3:return(200);break;
X    case 4:return(500);break;
X    case 5:return(1000);break;
X    case 6:return(2000);break;
X    case 7:return(3000);break;
X    case 8:return(5000);break;
X    case 9:return(7000);break;
X    case 10:return(10000);break;
X    default:return((plevel-9) * 10000); break;
X  }
X}
X
X/* If an item is unidentified, it isn't worth much to those who would buy it */
Xint item_value(item)
Xpob item;
X{
X  if (item->known == 0) {
X    if (item->objchar == THING) return(1);
X    else return(true_item_value(item) / 10);
X  }
X  else if (item->known == 1) {
X    if (item->objchar == THING) return(item->basevalue);
X    else return(item->basevalue / 2);
X  }
X  else return(true_item_value(item));
X}
X
X
X/* figures value based on item base-value, charge, plus, and blessing */
Xint true_item_value(item)
Xpob item;
X{
X  float value = item->basevalue;
X  
X  if (item->objchar == THING) return(item->basevalue);
X  else {
X    if (item->objchar == STICK) value *= (1.0 + (item->charge/20.0));
X    if (item->plus > -1.0) value *= (1.0 + (item->plus/4.0));
X    else value *= (1.0/abs(item->plus));
X    if (item->blessing > 0) value *= 2.0;
X    return((int) value);
X  }
X}
X
X/* kill off player if he isn't got the "breathing" status */
Xvoid p_drown()
X{
X  if (Player.status[BREATHING] > 0)
X    mprint("Your breathing is unaffected!");
X  else {
X    print1("You try to hold your breath....");
X    morewait();
X    print2("You choke....");
X    morewait();
X    print3("Your lungs fill...");
X    morewait();
X    p_death("drowning");
X  }
X}
X
X
X/* the effect of some weapon on monster m, with dmgmod a bonus to damage */
Xvoid weapon_use(dmgmod,weapon,m)
Xint dmgmod;
Xpob weapon;
Xstruct monster *m;
X{
X  int aux = (weapon==NULL ? -2 : weapon->aux); /* bare hands */
X  switch(aux) {
X    case -2: weapon_bare_hands(dmgmod,m); break;
X    default:
X    case I_NO_OP: weapon_normal_hit(dmgmod,weapon,m); break;
X    case I_ACIDWHIP: weapon_acidwhip(dmgmod,weapon,m); break;
X    case I_TANGLE: weapon_tangle(dmgmod,weapon,m); break;
X    case I_ARROW: weapon_arrow(dmgmod,weapon,m); break;
X    case I_BOLT: weapon_bolt(dmgmod,weapon,m); break;
X    case I_DEMONBLADE: weapon_demonblade(dmgmod,weapon,m); break;
X    case I_LIGHTSABRE: weapon_lightsabre(dmgmod,weapon,m); break;
X    case I_MACE_DISRUPT: weapon_mace_disrupt(dmgmod,weapon,m); break;
X    case I_VORPAL: weapon_vorpal(dmgmod,weapon,m); break;
X    case I_DESECRATE: weapon_desecrate(dmgmod,weapon,m); break;
X    case I_FIRESTAR: weapon_firestar(dmgmod,weapon,m); break;
X    case I_DEFEND: weapon_defend(dmgmod,weapon,m); break;
X    case I_VICTRIX: weapon_victrix(dmgmod,weapon,m); break;
X    case I_SCYTHE: weapon_scythe(dmgmod,weapon,m); break;
X  }
X}
X
X
X/* for printing actions in printactions above */
Xchar *actionlocstr(dir)
Xchar dir;
X{
X  switch(dir) {
X  case 'L': strcpy(Str3,"low."); break;
X  case 'C': strcpy(Str3,"center."); break;
X  case 'H': strcpy(Str3,"high."); break;
X  default: strcpy(Str3,"wildly."); break;
X  }
X  return(Str3);
X}
X
X
X/* execute player combat actions versus monster m */
Xvoid tacplayer(m)
Xstruct monster *m;
X{
X  int i=0;
X
X  while (i < strlen(Player.meleestr)) {
X    if (m->hp > 0) {
X      switch(Player.meleestr[i]) {
X      case 't': case 'T':
X	if (Player.possessions[O_WEAPON_HAND] == NULL) 
X	  strcpy(Str1,"You punch ");
X	else strcpy(Str1,"You thrust ");
X	strcat(Str1,actionlocstr(Player.meleestr[i+1]));
X	if (Verbosity == VERBOSE) mprint(Str1);
X	if (player_hit(2*statmod(Player.dex),Player.meleestr[i+1],m))
X	  weapon_use(0,Player.possessions[O_WEAPON_HAND],m);
X	else player_miss(m,NORMAL_DAMAGE);
X	break;
X      case 'c': case 'C':
X	if (Player.possessions[O_WEAPON_HAND] == NULL) 
X	  strcpy(Str1,"You punch ");
X	else if (Player.possessions[O_WEAPON_HAND]->type == CUTTING) 
X	  strcpy(Str1,"You cut ");
X	else if (Player.possessions[O_WEAPON_HAND]->type == STRIKING) 
X	  strcpy(Str1,"You strike ");
X	else strcpy(Str1,"You attack ");
X	strcat(Str1,actionlocstr(Player.meleestr[i+1]));
X	if (Verbosity == VERBOSE) mprint(Str1);
X	if (player_hit(0,Player.meleestr[i+1],m))
X	  weapon_use(2*statmod(Player.str),
X		     Player.possessions[O_WEAPON_HAND],
X		     m);
X	else player_miss(m,NORMAL_DAMAGE);
X	break;
X      case 'l': case 'L':
X	strcpy(Str1,"You lunge ");
X	strcat(Str1,actionlocstr(Player.meleestr[i+1]));
X	if (Verbosity == VERBOSE) mprint(Str1);
X	if (player_hit(Player.level+Player.dex,Player.meleestr[i+1],m))
X	  weapon_use(Player.level,Player.possessions[O_WEAPON_HAND],m);
X	else player_miss(m,NORMAL_DAMAGE);
X	break;
X      }
X    }    
X    i+=2;
X  }
X}
X
X
X
X
X/* checks to see if player hits with hitmod vs. monster m at location hitloc */
Xint player_hit(hitmod,hitloc,m)
Xint hitmod;
Xchar hitloc;
Xstruct monster *m;
X{
X  int i=0,blocks=FALSE,goodblocks=0,hit;
X  if (m->hp < 1) {
X    mprint("Unfortunately, your opponent is already dead!");
X    return(FALSE);
X  }
X  else {
X    if (hitloc == 'X') hitloc = random_loc();
X
X    transcribe_monster_actions(m);
X
X    while (i<strlen(m->meleestr)) {
X      if ((m->meleestr[i] == 'B') || (m->meleestr[i] == 'R')) {
X	blocks = TRUE;
X	if (hitloc == m->meleestr[i+1])
X	  goodblocks++;
X      }
X      i+=2;
X    }
X
X    if (! blocks) goodblocks = -1;
X    hit = hitp(Player.hit+hitmod,m->ac+goodblocks*10);
X    if ((! hit) && (goodblocks > 0)) {
X      if (m->uniqueness == COMMON) {
X	strcpy(Str1,"The ");
X	strcat(Str1,m->monstring);
X      }
X      else strcpy(Str1,m->monstring);
X      strcat(Str1," blocks it!");
X      if (Verbosity == VERBOSE) mprint(Str1);
X    }
X    return(hit);
X  }
X}
X
X
X
X
X
X
X
X/* This function is used to undo all items temporarily, should
Xalways be used in pairs with on being TRUE and FALSE, and may cause
Xanomalous stats and item-usage if used indiscriminately */
X
Xvoid toggle_item_use(on)
Xint on;
X{
X  static int used[MAXITEMS];
X  int i;
X  setgamestatus(SUPPRESS_PRINTING);
X  if (on) 
X    for(i=0;i<MAXITEMS;i++) {
X      used[i] = FALSE;
X      if (Player.possessions[i] != NULL) {
X	if (used[i] = Player.possessions[i]->used) {
X	  Player.possessions[i]->used = FALSE;
X	  item_use(Player.possessions[i]);
X	}
X      }
X    }
X  else {
X    for(i=1;i<MAXITEMS;i++) 
X      if (used[i]) {
X	Player.possessions[i]->used = TRUE;
X	item_use(Player.possessions[i]);
X      }
X    calc_melee();
X    showflags();
X    dataprint();
X    timeprint();
X  }
X  resetgamestatus(SUPPRESS_PRINTING);
X}
X
X
Xvoid enter_site(site)
Xchar site;
X{
X  switch(site) {
X  case CITY: change_environment(E_CITY); break;
X  case VILLAGE: change_environment(E_VILLAGE); break;
X  case CAVES: change_environment(E_CAVES); break;
X  case CASTLE: change_environment(E_CASTLE); break;
X  case VOLCANO: change_environment(E_VOLCANO); break;
X  case TEMPLE: change_environment(E_TEMPLE); break;
X  case DRAGONLAIR: change_environment(E_DLAIR); break;
X  case STARPEAK: change_environment(E_STARPEAK); break;
X  case MAGIC_ISLE: change_environment(E_MAGIC_ISLE); break;
X  default:print3("There's nothing to enter here!"); break;
X  }
X}
X
X
X
X/* Switches context dungeon/countryside/city, etc */
Xvoid change_environment(new_environment)
Xchar new_environment;
X{
X  int i,emerging = FALSE;
X  pob o;
X
X  Player.sx = -1; Player.sy = -1; /* reset sanctuary if there was one */
X
X  resetgamestatus(FAST_MOVE);
X
X  Last_Environment = Current_Environment;
X  if (Last_Environment == E_COUNTRYSIDE) {
X    LastCountryLocX = Player.x;
X    LastCountryLocY = Player.y;
X  }
X  if (((Last_Environment == E_CITY) ||
X       (Last_Environment == E_VILLAGE)) &&
X      ((new_environment == E_MANSION) ||
X       (new_environment == E_HOUSE) ||
X       (new_environment == E_HOVEL) ||
X       (new_environment == E_SEWERS) ||
X       (new_environment == E_ARENA))) {
X    LastTownLocX = Player.x;
X    LastTownLocY = Player.y;
X  }
X  else if (((Last_Environment == E_MANSION) ||
X	    (Last_Environment == E_HOUSE) ||
X	    (Last_Environment == E_HOVEL) ||
X	    (Last_Environment == E_SEWERS) ||
X	    (Last_Environment == E_ARENA)) &&
X	   ((new_environment == E_CITY) ||
X	    (new_environment == E_VILLAGE))) {
X    Player.x = LastTownLocX;
X    Player.y = LastTownLocY;
X    emerging = TRUE;
X  }
X
X  if (Last_Environment == E_ARENA)
X    Arena_Victory = Arena_Monster->hp < 1;
X
X
X  Current_Environment = new_environment;
X/*    ScreenOffset = Player.y - (ScreenLength/2); */
X  switch(new_environment) {
X  case E_ARENA:
X    LENGTH = 16;
X    WIDTH = 64;
X    Player.x = 5;
X    Player.y = 7;
X    setgamestatus(ARENA_MODE);
X    locprint("The Rampart Arena");
X    load_arena();
X    erase_level();
X    ScreenOffset = 0;
X    show_screen();
X    break;
X  case E_ABYSS:
X    LENGTH = 16;
X    WIDTH = 64;
X    Player.x = 32;
X    Player.y = 15;
X    locprint("The Adept's Challenge");
X    load_abyss();
X    abyss_file();
X    lose_all_items();
X    erase_level();
X    ScreenOffset = 0;
X    show_screen();
X    break;
X  case E_CIRCLE:
X    LENGTH = 16;
X    WIDTH = 64;
X    Player.x = 32;
X    Player.y = 14;
X    locprint("The Astral Demesne of the Circle of Sorcerors");
X    load_circle();
X    if (find_item(&o,ARTIFACTID+21,-1)) {
X      print1("A bemused voice says:");
X      print2("'Why are you here? You already have the Star Gem!'");
X      morewait();
X    }
X    else if (Player.rank[CIRCLE] > 0) {
X      print1("You hear the voice of the Prime Sorceror:");
X      print2("'Congratulations on your attainment of the Circle's Demesne.'");
X      morewait();
X      print1("For the honor of the Circle, you may take the Star Gem");
X      print2("and destroy it on the acme of Star Peak.");
X      morewait();
X      print1("Beware the foul LawBringer who resides there...");
X      print2("By the way, some of the members of the Circle seem to");
X      morewait();
X      print1("have become a bit jealous of your success --");
X      print2("I'd watch out for them if I were you.");
X      morewait();
X    }
X    else if (Player.alignment > 0) {
X      print1("A mysterious ghostly image materializes in front of you.");
X      print2("It speaks: 'Greetings, fellow abider in Law. I am called");
X      morewait();
X      print1("The LawBringer. If you wish to advance our cause, obtain");
X      print2("the mystic Star Gem and return it to me on Star Peak.");
X      morewait();
X      print1("Beware the power of the evil Circle of Sorcerors and the");
X      print2("forces of Chaos which guard the gem.'");
X      morewait();
X      print1("The strange form fades slowly.");
X      morewait();
X    }
X    erase_level();
X    ScreenOffset = 0;
X    show_screen();
X    break;
X  case E_COURT:
X    WIDTH = 64;
X    LENGTH = 24;
X    Player.x = 32;
X    Player.y = 2;
X    load_court();
X    erase_level();
X    ScreenOffset = 0;
X    show_screen();
X    break;
X  case E_MANSION:
X    WIDTH = 64;
X    LENGTH = 16;
X    Player.y = 8;
X    Player.x = 2;
X    load_house(E_MANSION);
X    erase_level();
X    ScreenOffset = 0;
X    show_screen();
X    break;
X  case E_HOUSE:
X    WIDTH = 64;
X    LENGTH = 16;
X    Player.y = 13;
X    Player.x = 2;
X    load_house(E_HOUSE);
X    erase_level();
X    ScreenOffset = 0;
X    show_screen();
X    break;
X  case E_HOVEL:
X    WIDTH = 64;
X    LENGTH = 16;
X    Player.y = 9;
X    Player.x = 2;
X    load_house(E_HOVEL);
X    erase_level();
X    ScreenOffset = 0;
X    show_screen();
X    break;
X  case E_DLAIR:
X    WIDTH = 64;
X    LENGTH = 16;
X    Player.y = 9;
X    Player.x = 2;
X    load_dlair(gamestatusp(KILLED_DRAGONLORD));
X    erase_level();
X    ScreenOffset = 0;
X    show_screen();
X    break;
X  case E_STARPEAK:
X    WIDTH = 64;
X    LENGTH = 16;
X    Player.y = 9;
X    Player.x = 2;
X    load_speak(gamestatusp(KILLED_LAWBRINGER));
X    erase_level();
X    ScreenOffset = 0;
X    show_screen();
X    break;
X  case E_MAGIC_ISLE:
X    WIDTH = 64;
X    LENGTH = 16;
X    Player.y = 15;
X    Player.x = 63;
X    load_misle(gamestatusp(KILLED_EATER));
X    erase_level();
X    ScreenOffset = 0;
X    show_screen();
X    break;
X  case E_TEMPLE:
X    WIDTH = 64;
X    LENGTH = 16;
X    load_temple(Country[Player.x][Player.y].aux);
X    Player.y = 15;
X    Player.x = 32;
X    erase_level();
X    ScreenOffset = 0;
X    show_screen();
X    break;
X  case E_CITY:
X    WIDTH = 64;
X    LENGTH = 64;
X    if (emerging) {
X      print1("You emerge onto the street.");
X      emerging = FALSE;
X    }
X    else {
X      print1("You pass through the massive gates of Rampart, the city.");
X      Player.x = 62;
X      Player.y = 21;
X    }
X    if (City == NULL) load_city();
X    Level = City;
X    locprint("The City of Rampart.");
X    erase_level();
X    ScreenOffset = Player.y - (ScreenLength/2);
X    show_screen();
X    break;
X  case E_VILLAGE:
X    WIDTH = 64;
X    LENGTH = 16;
X    if (emerging) {
X      print1("You emerge onto the street.");
X      emerging = FALSE;
X    }
X    else {
X      print1("You enter a small rural village.");
X      /* different villages per different locations */
X      switch(Country[Player.x][Player.y].aux) {
X      case 1:
X	Player.x = 0;
X	Player.y = 6;
X	Villagenum = 1;
X	break;
X      default: 
X	print3("Very strange, a nonexistent village.");
X      case 2:
X	Player.x = 39;
X	Player.y = 15;
X	Villagenum = 2;
X	break;
X      case 3:
X	Player.x = 63;
X	Player.y = 8;
X	Villagenum = 3;
X	break;
X      case 4: 
X	Player.x = 32;
X	Player.y = 15;
X	Villagenum = 4;
X	break;
X      case 5: 
X	Player.x = 2;
X	Player.y = 8;
X	Villagenum = 5;
X	break;
X      case 6: 
X	Player.x = 2;
X	Player.y = 2;
X	Villagenum = 6;
X	break;
X      }
X    }
X    if ((! emerging) || (TempLevel == NULL)) load_village(Villagenum);
X    else if (TempLevel->environment != E_VILLAGE) load_village(Villagenum);
X    else Level = TempLevel;
X    switch(Villagenum) {
X      case 1: locprint("The Village of Star View."); break;
X      case 2: locprint("The Village of Woodmere."); break;
X      case 3: locprint("The Village of Stormwatch."); break;
X      case 4: locprint("The Village of Thaumaris."); break;
X      case 5: locprint("The Village of Skorch."); break;
X      case 6: locprint("The Village of Whorfen."); break;
X      default: locprint("A Deviant Village."); break;
X      }
X    erase_level();
X    ScreenOffset = 0;
X    show_screen();
X    break;
X  case E_CAVES:
X    WIDTH = 64;
X    LENGTH = 64;
X    print1("You enter a dark cleft in a hillside;");
X    print2("You note signs of recent passage in the dirt nearby.");
X    if (gamestatusp(MOUNTED)) {
X      morewait();
X      print1("Seeing as you might not be coming back, you feel compelled");
X      print2("to let your horse go, rather than keep him hobbled outside.");
X      resetgamestatus(MOUNTED);
X      calc_melee();
X    }
X    MaxDungeonLevels = CAVELEVELS;
X    if (Current_Dungeon != E_CAVES) {
X      free_dungeon();
X      Dungeon = NULL;
X      Level = NULL;
X      Current_Dungeon = E_CAVES;
X    }
X    change_level(0,1,FALSE);
X    break;
X  case E_VOLCANO:
X    WIDTH = 64;
X    LENGTH = 64;
X    print1("You pass down through the glowing crater.");
X    if (gamestatusp(MOUNTED)) {
X      morewait();
X      print1("Seeing as you might not be coming back, you feel compelled");
X      print2("to let your horse go, rather than keep him hobbled outside.");
X      resetgamestatus(MOUNTED);
X      calc_melee();
X    }
X    MaxDungeonLevels = VOLCANOLEVELS;
X    if (Current_Dungeon != E_VOLCANO) {
X      free_dungeon();
X      Dungeon = NULL;
X      Level = NULL;
X      Current_Dungeon = E_VOLCANO;
X    }
X    change_level(0,1,FALSE);
X    break;
X  case E_ASTRAL:
X    WIDTH = 64;
X    LENGTH = 64;
X    print1("You are in a weird flickery maze.");
X    if (gamestatusp(MOUNTED)) {
X      print2("Your horse doesn't seem to have made it....");
X      resetgamestatus(MOUNTED);
X      calc_melee();
X    }
X    MaxDungeonLevels = ASTRALLEVELS;
X    if (Current_Dungeon != E_ASTRAL) {
X      free_dungeon();
X      Dungeon = NULL;
X      Level = NULL;
X      Current_Dungeon = E_ASTRAL;
X    }
X    change_level(0,1,FALSE);
X    break;
X  case E_CASTLE:
X    WIDTH = 64;
X    LENGTH = 64;
X    print1("You cross the drawbridge. Strange forms move beneath the water.");
X    if (gamestatusp(MOUNTED)) {
X      morewait();
X      print1("Seeing as you might not be coming back, you feel compelled");
X      print2("to let your horse go, rather than keep him hobbled outside.");
X      resetgamestatus(MOUNTED);
X    }
X    MaxDungeonLevels = CASTLELEVELS;
X    if (Current_Dungeon != E_CASTLE) {
X      free_dungeon();
X      Dungeon = NULL;
X      Level = NULL;
X      Current_Dungeon = E_CASTLE;
X    }
X    change_level(0,1,FALSE);
X    break;
X  case E_SEWERS:
X    WIDTH = 64;
X    LENGTH = 64;
X    print1("You pry open a manhole and descend into the sewers below.");
X    if (gamestatusp(MOUNTED)) {
X      print2("You horse waits patiently outside the sewer entrance....");
X      dismount_steed();
X    }
X    MaxDungeonLevels = SEWERLEVELS;
X    if (Current_Dungeon != E_SEWERS) {
X      free_dungeon();
X      Dungeon = NULL;
X      Level = NULL;
X      Current_Dungeon = E_SEWERS;
X    }
X    change_level(0,1,FALSE);
X    break;
X  case E_COUNTRYSIDE:
X    WIDTH = 64;
X    LENGTH = 64;
X    print1("You return to the fresh air of the open countryside.");
X    if (Last_Environment == E_CITY) {
X      Player.x = 27;
X      Player.y = 19;
X    }
X    else {
X      Player.x = LastCountryLocX;
X      Player.y = LastCountryLocY;
X    }
X    for(i=0;i<9;i++)
X      Country[Player.x+Dirs[0][i]][Player.y+Dirs[1][i]].explored = TRUE;
X    erase_level();
X    ScreenOffset = Player.y - (ScreenLength/2);
X    show_screen();
X    break;
X  case E_TACTICAL_MAP:
X    WIDTH = 64;
X    LENGTH = 16;
X    print1("You are now on the tactical screen; exit off any side to leave");
X    make_country_screen(Country[Player.x][Player.y].current_terrain_type);
X    make_country_monsters(Country[Player.x][Player.y].current_terrain_type);
X    Player.x = WIDTH/2;
X    Player.y = LENGTH/2;
X    erase_level();
X    ScreenOffset = 0;
X    show_screen();
X    break;
X  case E_NEVER_NEVER_LAND: default:
X    print1("There must be some mistake. You don't look like Peter Pan.");
X    print2("(But here you are in Never-Never Land)");
X    erase_level();
X    ScreenOffset = Player.y - (ScreenLength/2);
X    show_screen();
X    break;
X  }
X}
X
X
X
END_OF_FILE
if test 29781 -ne `wc -c <'oaux2.c'`; then
    echo shar: \"'oaux2.c'\" unpacked with wrong size!
fi
# end of 'oaux2.c'
fi
if test -f 'ofile.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'ofile.c'\"
else
echo shar: Extracting \"'ofile.c'\" \(21529 characters\)
sed "s/^X//" >'ofile.c' <<'END_OF_FILE'
X/* omega (c) 1987,1988 by Laurence Raphael Brothers */
X/* ofile.c */
X/* functions with file access in them. Also some direct calls to
X   curses functions */
X
X#include <curses.h>
X#include <sys/file.h>
X#include "oglob.h"
X
X#ifndef F_OK
X#define F_OK 00 
X#define R_OK 04
X#define W_OK 02
X#endif
X
XFILE *checkfopen(filestring,optionstring)
Xchar *filestring,*optionstring;
X{
X  FILE *fd;
X  char response;
X  fd = fopen(filestring,optionstring);
X  clearmsg();
X  while (fd == NULL) {
X    print3("Warning! Error opening file:");
X    nprint3(filestring);
X    print1(" Abort or Retry? [ar] ");
X    do response = mcigetc(); while ((response != 'a') && (response != 'r'));
X    if (response == 'r') fd = fopen(filestring,optionstring);
X    else {
X      print2("Sorry 'bout that.... Bye!");
X      morewait();
X      endgraf();
X      exit(0);
X    }
X  }
X  return(fd);
X}
X
Xvoid commandlist()
X{
X  FILE *fd; 
X  strcpy(Str1,OMEGALIB);
X  if (Current_Environment == E_COUNTRYSIDE)
X    strcat(Str1,"occmds.txt");
X  else strcat(Str1,"ocmds.txt");
X  fd = checkfopen(Str1,"r");
X  showfile(fd);
X  fclose(fd);
X  clear();
X  refresh();
X  xredraw();
X}
X
X
Xvoid user_intro()
X{
X  FILE *fd; 
X  strcpy(Str1,OMEGALIB);
X  strcat(Str1,"ointro.txt");
X  fd = checkfopen(Str1,"r");
X  showfile(fd);
X  fclose(fd);
X  clear();
X  refresh();
X  xredraw();
X}
X
Xvoid show_license()
X{
X  FILE *fd; 
X  strcpy(Str1,OMEGALIB);
X  strcat(Str1,"olicense.txt");
X  fd = checkfopen(Str1,"r");
X  showfile(fd);
X  fclose(fd);
X  clear();
X  refresh();
X  xredraw();
X}
X
X
X
Xvoid abyss_file()
X{
X  FILE *fd; 
X  strcpy(Str1,OMEGALIB);
X  strcat(Str1,"oabyss.txt");
X  fd = checkfopen(Str1,"r");
X  showfile(fd);
X  fclose(fd);
X  clear();
X  refresh();
X}
X
X
X
X
Xvoid inv_help()
X{
X  FILE *fd; 
X  strcpy(Str1,OMEGALIB);
X  strcat(Str1,"ohelp3.txt");
X  fd = checkfopen(Str1,"r");
X  showfile(fd);
X  fclose(fd);
X  clear();
X  refresh();
X  xredraw();
X}
X
X
X
Xvoid combat_help()
X{
X  FILE *fd; 
X  strcpy(Str1,OMEGALIB);
X  strcat(Str1,"ohelp5.txt");
X  fd = checkfopen(Str1,"r");
X  showfile(fd);
X  fclose(fd);
X  clear();
X  refresh();
X  xredraw();
X}
X
X
X
X
Xvoid cityguidefile()
X{
X  FILE *fd;
X  strcpy(Str1,OMEGALIB);
X  strcat(Str1,"oscroll2.txt");
X  fd = checkfopen(Str1,"r");
X  showfile(fd);
X  fclose(fd);
X  clear();
X  refresh();
X  xredraw();
X}
X
X
Xvoid wishfile()
X{
X  FILE *fd;
X  strcpy(Str1,OMEGALIB);
X  strcat(Str1,"oscroll3.txt");
X  fd = checkfopen(Str1,"r");
X  showfile(fd);
X  fclose(fd);
X  clear();
X  refresh();
X  xredraw();
X}
X
Xvoid adeptfile()
X{
X  FILE *fd;
X  strcpy(Str1,OMEGALIB);
X  strcat(Str1,"oscroll4.txt");
X  fd = checkfopen(Str1,"r");
X  showfile(fd);
X  fclose(fd);
X  clear();
X  refresh();
X  xredraw();
X}
X
Xvoid theologyfile()
X{
X  FILE *fd;
X  strcpy(Str1,OMEGALIB);
X  strcat(Str1,"oscroll1.txt");
X  fd = checkfopen(Str1,"r");
X  showfile(fd);
X  fclose(fd);
X  clear();
X  refresh();
X  xredraw();
X}
X
X
Xvoid showmotd()
X{
X  FILE *fd;
X  strcpy(Str1,OMEGALIB);
X  strcat(Str1,"omotd.txt");
X  fd = checkfopen(Str1,"r");
X  showfile(fd);
X  fclose(fd);
X  clear();
X  refresh();
X}
X
X
X
X
X/* display a file page at a time */
Xvoid showfile(fd)
XFILE *fd;
X{
X  int c,d=' ';
X  int x,y;
X  clear();
X  refresh();
X  c = fgetc(fd);
X  while ((c != EOF)&&((char) d != 'q')&&((char) d!=ESCAPE)) {
X    getyx(stdscr,y,x);
X    if (y > ScreenLength) {
X      printw("\n-More-");
X      refresh();
X      d = wgetch(stdscr);
X      clear();
X    }
X    printw("%c",(char) c);
X    c = fgetc(fd);
X  }
X  if (((char) d != 'q')&&((char) d!=ESCAPE)) {
X    printw("\n-Done-");
X    refresh();
X    getch();
X  }
X}    
X
X
X
Xvoid showscores()
X{
X  FILE *fd;
X  int i;
X  strcpy(Str1,OMEGALIB);
X  strcat(Str1,"omega.hi");
X  fd = checkfopen(Str1,"r");
X  filescanstring(fd,Hiscorer);
X  filescanstring(fd,Hidescrip);
X  fscanf(fd,"%d\n%d\n%d\n",&Hiscore,&Hilevel,&Hibehavior);
X  filescanstring(fd,Chaoslord);
X  fscanf(fd,"%d\n%d\n%d\n",&Chaoslordlevel,&Chaos,&Chaoslordbehavior);
X  filescanstring(fd,Lawlord);
X  fscanf(fd,"%d\n%d\n%d\n",&Lawlordlevel,&Law,&Lawlordbehavior);
X  filescanstring(fd,Duke);
X  fscanf(fd,"%d\n%d\n",&Dukelevel,&Dukebehavior);
X  filescanstring(fd,Justiciar);
X  fscanf(fd,"%d\n%d\n",&Justiciarlevel,&Justiciarbehavior);
X  filescanstring(fd,Commandant);
X  fscanf(fd,"%d\n%d\n",&Commandantlevel,&Commandantbehavior);
X  filescanstring(fd,Champion);
X  fscanf(fd,"%d\n%d\n",&Championlevel,&Championbehavior);
X  filescanstring(fd,Archmage);
X  fscanf(fd,"%d\n%d\n",&Archmagelevel,&Archmagebehavior);
X  filescanstring(fd,Prime);
X  fscanf(fd,"%d\n%d\n",&Primelevel,&Primebehavior);
X  filescanstring(fd,Shadowlord);
X  fscanf(fd,"%d\n%d\n",&Shadowlordlevel,&Shadowlordbehavior);
X  for(i=1;i<7;i++) {
X    filescanstring(fd,Priest[i]);
X    fscanf(fd,"%d\n%d\n",&(Priestlevel[i]),&(Priestbehavior[i]));
X  }
X  fclose(fd);
X  clear();
X  printw("High Score: %d",Hiscore);
X  printw(", by %s (%s)",Hiscorer,levelname(Hilevel));
X  printw("\n%s\n",Hidescrip);
X  printw("\nLord of Chaos: %s (%s)",Chaoslord,levelname(Chaoslordlevel));
X  printw("\nLord of Law: %s (%s)",Lawlord,levelname(Lawlordlevel));
X  printw("\n\nDuke of Rampart:              ");
X  printw("%s (%s)",Duke,levelname(Dukelevel));
X  printw("\nJusticiar:                    ");
X  printw("%s (%s)",Justiciar,levelname(Justiciarlevel));
X  printw("\nCommandant:                   ");
X  printw("%s (%s)",Commandant,levelname(Commandantlevel));
X  printw("\nChampion:                     ");
X  printw("%s (%s)",Champion,levelname(Championlevel));
X  printw("\nArchmage:                     ");
X  printw("%s (%s)",Archmage,levelname(Archmagelevel));
X  printw("\nPrime Sorceror:               ");
X  printw("%s (%s)",Prime,levelname(Primelevel));
X  printw("\nShadowlord:                   ");
X  printw("%s (%s)",Shadowlord,levelname(Shadowlordlevel));
X  printw("\n\nHigh Priests:");
X  printw("\n of Odin:                     ");
X  printw("%s (%s)",Priest[ODIN],levelname(Priestlevel[ODIN]));
X  printw("\n of Set:                      ");
X  printw("%s (%s)",Priest[SET],levelname(Priestlevel[SET]));
X  printw("\n of Athena:                   ");
X  printw("%s (%s)",Priest[ATHENA],levelname(Priestlevel[ATHENA]));
X  printw("\n of Hecate:                   ");
X  printw("%s (%s)",Priest[HECATE],levelname(Priestlevel[HECATE]));
X  printw("\n of the Lords of Destiny:     ");
X  printw("%s (%s)",Priest[DESTINY],levelname(Priestlevel[DESTINY]));
X  printw("\nThe ArchDruid:                ");
X  printw("%s (%s)",Priest[DRUID],levelname(Priestlevel[DRUID]));
X  printw("\n\nHit any key to continue.");
X  refresh();
X  wgetch(stdscr);
X}
X
X
X/* writes a new high score file */
Xvoid checkhigh(descrip,behavior)
Xchar *descrip;
Xint behavior;
X{
X  int i,points;
X  FILE *fd;
X
X  if (FixedPoints > 0) points = FixedPoints;
X  else points = calc_points();
X
X  if (! gamestatusp(CHEATED)) {
X    strcpy(Str1,OMEGALIB);
X    strcat(Str1,"omega.hi");
X    fd = checkfopen(Str1,"w");
X    
X    if (Hiscore < points) {
X      morewait();
X      mprint("Yow! A new high score!");
X      fprintf(fd,"%s\n",Player.name);
X      fprintf(fd,"%s\n",descrip);
X      fprintf(fd,"%d\n",points);
X      fprintf(fd,"%d\n",Player.level);
X      fprintf(fd,"%d\n",behavior);
X    }
X    else {
X      fprintf(fd,"%s\n",Hiscorer);
X      fprintf(fd,"%s\n",Hidescrip);
X      fprintf(fd,"%d\n",Hiscore);
X      fprintf(fd,"%d\n",Hilevel);
X      fprintf(fd,"%d\n",Hibehavior);
X    }
X
X
X
X    if (Player.alignment < Chaos) {
X      morewait();
X      mprint("Criminy! A new Lord of Chaos!");
X      fprintf(fd,"%s\n",Player.name);
X      fprintf(fd,"%d\n",Player.level);
X      fprintf(fd,"%d\n",Player.alignment);
X      fprintf(fd,"%d\n",behavior);
X    }
X    else {
X      fprintf(fd,"%s\n",Chaoslord);
X      fprintf(fd,"%d\n",Chaoslordlevel);
X      fprintf(fd,"%d\n",Chaos);
X      fprintf(fd,"%d\n",Chaoslordbehavior);
X    }
X
X
X
X
X
X
X    if (Player.alignment > Law) {
X      morewait();
X      mprint("Gosh! A new Lord of Law!");
X      fprintf(fd,"%s\n",Player.name);
X      fprintf(fd,"%d\n",Player.level);
X      fprintf(fd,"%d\n",Player.alignment);
X      fprintf(fd,"%d\n",behavior);
X    }
X    else {
X      fprintf(fd,"%s\n",Lawlord);
X      fprintf(fd,"%d\n",Lawlordlevel);
X      fprintf(fd,"%d\n",Law);
X      fprintf(fd,"%d\n",Lawlordbehavior);
X    }
X
X
X
X
X    fprintf(fd,"%s",Duke);
X    fprintf(fd,"\n%d",Dukelevel);
X    if (Player.rank[NOBILITY] == DUKE)
X      fprintf(fd,"\n%d",behavior);
X    else fprintf(fd,"\n%d",Dukebehavior);
X    fprintf(fd,"\n%s",Justiciar);
X    fprintf(fd,"\n%d",Justiciarlevel);
X    if (Player.rank[ORDER] == JUSTICIAR)
X      fprintf(fd,"\n%d",behavior);
X    else fprintf(fd,"\n%d",Justiciarbehavior);
X    fprintf(fd,"\n%s",Commandant);
X    fprintf(fd,"\n%d",Commandantlevel);
X    if (Player.rank[LEGION] == COMMANDANT)
X      fprintf(fd,"\n%d",behavior);
X    else fprintf(fd,"\n%d",Commandantbehavior);
X    fprintf(fd,"\n%s",Champion);
X    fprintf(fd,"\n%d",Championlevel);
X    if (Player.rank[ARENA] == CHAMPION)
X      fprintf(fd,"\n%d",behavior);
X    else fprintf(fd,"\n%d",Championbehavior);
X    fprintf(fd,"\n%s",Archmage);
X    fprintf(fd,"\n%d",Archmagelevel);
X    if (Player.rank[COLLEGE] == ARCHMAGE)
X      fprintf(fd,"\n%d",behavior);
X    else fprintf(fd,"\n%d",Archmagebehavior);
X    fprintf(fd,"\n%s",Prime);
X    fprintf(fd,"\n%d",Primelevel);
X    if (Player.rank[CIRCLE] == PRIME)
X      fprintf(fd,"\n%d",behavior);
X    else fprintf(fd,"\n%d",Primebehavior);
X    fprintf(fd,"\n%s",Shadowlord);
X    fprintf(fd,"\n%d",Shadowlordlevel);
X    if (Player.rank[THIEVES] == SHADOWLORD)
X      fprintf(fd,"\n%d",behavior);
X    else fprintf(fd,"\n%d",Shadowlordbehavior);
X    for(i=1;i<7;i++) {
X      fprintf(fd,"\n%s",Priest[i]);
X      fprintf(fd,"\n%d",Priestlevel[i]);
X      if ((Player.rank[PRIESTHOOD] == HIGHPRIEST) && (Player.patron == i))
X	fprintf(fd,"\n%d",behavior);
X      else fprintf(fd,"\n%d",Priestbehavior[i]);
X    }
X    fprintf(fd,"\n");
X    fclose(fd);
X  }
X}
X
Xvoid extendlog(descrip,lifestatus)
Xchar *descrip;
Xint lifestatus;
X{
X  FILE *fd;
X  char username[60];
X  int npcbehavior;
X  strcpy(username,getlogin());
X  if ((Player.level > 0) && (! gamestatusp(CHEATED))) {
X    npcbehavior=fixnpc(lifestatus);
X    checkhigh(descrip,npcbehavior);
X    strcpy(Str1,OMEGALIB);
X    strcat(Str1,"omega.log");
X    fd = checkfopen(Str1,"a");
X    fprintf(fd,
X	    " %d %d %d %s\n",
X	    lifestatus,
X	    Player.level,
X	    npcbehavior,
X	    Player.name);
X    fclose(fd);
X  }
X}
X
X
X
X
X
X/* reads a string from a file. If it is a line with more than 80 char's,
X   then remainder of line to \n is consumed */
Xvoid filescanstring(fd,fstr)
XFILE *fd;
Xchar *fstr;
X{
X  int i= -1;
X  int byte='x';
X  while ((i<80) && (byte != '\n') && (byte != EOF)) {
X    i++;
X    byte=fgetc(fd);
X    fstr[i] = byte;
X  } 
X  if (byte != '\n')
X    while((byte!='\n') && (byte != EOF))
X      byte=fgetc(fd);
X  fstr[i]=0;
X}
X
X
X/* Checks existence of omega data files */
X/* Returns 1 if OK, 0 if impossible to run, -1 if possible but not OK */
Xint filecheck()
X{
X  int impossible=FALSE,badbutpossible=FALSE;
X  int result;
X
X  strcpy(Str1,OMEGALIB);
X  strcat(Str1,"ocity.dat");
X  result = access(Str1,F_OK|R_OK);
X  if (result == -1) {
X    impossible = TRUE;
X    printf("\nWarning! File not accessible:");
X    printf(Str1);
X  }
X
X  strcpy(Str1,OMEGALIB);
X  strcat(Str1,"ocountry.dat");
X  result = access(Str1,F_OK|R_OK);
X  if (result == -1) {
X    impossible = TRUE;
X    printf("\nWarning! File not accessible:");
X    printf(Str1);
X  }
X
X  strcpy(Str1,OMEGALIB);
X  strcat(Str1,"odlair.dat");
X  result = access(Str1,F_OK|R_OK);
X  if (result == -1) {
X    impossible = TRUE;
X    printf("\nWarning! File not accessible:");
X    printf(Str1);
X  }
X
X  strcpy(Str1,OMEGALIB);
X  strcat(Str1,"omisle.dat");
X  result = access(Str1,F_OK|R_OK);
X  if (result == -1) {
X    impossible = TRUE;
X    printf("\nWarning! File not accessible:");
X    printf(Str1);
X  }
X  strcpy(Str1,OMEGALIB);
X  strcat(Str1,"ocourt.dat");
X  result = access(Str1,F_OK|R_OK);
X  if (result == -1) {
X    impossible = TRUE;
X    printf("\nWarning! File not accessible:");
X    printf(Str1);
X  }
X
X  strcpy(Str1,OMEGALIB);
X  strcat(Str1,"ospeak.dat");
X  result = access(Str1,F_OK|R_OK);
X  if (result == -1) {
X    impossible = TRUE;
X    printf("\nWarning! File not accessible:");
X    printf(Str1);
X  }
X
X  strcpy(Str1,OMEGALIB);
X  strcat(Str1,"otemple.dat");
X  result = access(Str1,F_OK|R_OK);
X  if (result == -1) {
X    impossible = TRUE;
X    printf("\nWarning! File not accessible:");
X    printf(Str1);
X  }
X
X  strcpy(Str1,OMEGALIB);
X  strcat(Str1,"oabyss.dat");
X  result = access(Str1,F_OK|R_OK);
X  if (result == -1) {
X    impossible = TRUE;
X    printf("\nWarning! File not accessible:");
X    printf(Str1);
X  }
X
X  strcpy(Str1,OMEGALIB);
X  strcat(Str1,"ovillage1.dat");
X  result = access(Str1,F_OK|R_OK);
X  if (result == -1) {
X    impossible = TRUE;
X    printf("\nWarning! File not accessible:");
X    printf(Str1);
X  }
X  strcpy(Str1,OMEGALIB);
X  strcat(Str1,"ovillage2.dat");
X  result = access(Str1,F_OK|R_OK);
X  if (result == -1) {
X    impossible = TRUE;
X    printf("\nWarning! File not accessible:");
X    printf(Str1);
X  }
X  strcpy(Str1,OMEGALIB);
X  strcat(Str1,"ovillage3.dat");
X  result = access(Str1,F_OK|R_OK);
X  if (result == -1) {
X    impossible = TRUE;
X    printf("\nWarning! File not accessible:");
X    printf(Str1);
X  }
X  strcpy(Str1,OMEGALIB);
X  strcat(Str1,"ovillage4.dat");
X  result = access(Str1,F_OK|R_OK);
X  if (result == -1) {
X    impossible = TRUE;
X    printf("\nWarning! File not accessible:");
X    printf(Str1);
X  }
X
X  strcpy(Str1,OMEGALIB);
X  strcat(Str1,"ohome1.dat");
X  result = access(Str1,F_OK|R_OK);
X  if (result == -1) {
X    impossible = TRUE;
X    printf("\nWarning! File not accessible:");
X    printf(Str1);
X  }
X
X  strcpy(Str1,OMEGALIB);
X  strcat(Str1,"ohome2.dat");
X  result = access(Str1,F_OK|R_OK);
X  if (result == -1) {
X    impossible = TRUE;
X    printf("\nWarning! File not accessible:");
X    printf(Str1);
X  }
X
X  strcpy(Str1,OMEGALIB);
X  strcat(Str1,"ohome3.dat");
X  result = access(Str1,F_OK|R_OK);
X  if (result == -1) {
X    impossible = TRUE;
X    printf("\nWarning! File not accessible:");
X    printf(Str1);
X  }
X
X  strcpy(Str1,OMEGALIB);
X  strcat(Str1,"oarena.dat");
X  result = access(Str1,F_OK|R_OK);
X  if (result == -1) {
X    impossible = TRUE;
X    printf("\nWarning! File not accessible:");
X    printf(Str1);
X  }
X  
X  
X  strcpy(Str1,OMEGALIB);
X  strcat(Str1,"omaze1.dat");
X  result = access(Str1,F_OK|R_OK);
X  if (result == -1) {
X    impossible = TRUE;
X    printf("\nWarning! File not appendable or accessible:");
X    printf(Str1);
X  }
X  strcpy(Str1,OMEGALIB);
X  strcat(Str1,"omaze2.dat");
X  result = access(Str1,F_OK|R_OK);
X  if (result == -1) {
X    impossible = TRUE;
X    printf("\nWarning! File not appendable or accessible:");
X    printf(Str1);
X  }
X  strcpy(Str1,OMEGALIB);
X  strcat(Str1,"omaze3.dat");
X  result = access(Str1,F_OK|R_OK);
X  if (result == -1) {
X    impossible = TRUE;
X    printf("\nWarning! File not appendable or accessible:");
X    printf(Str1);
X  }
X  strcpy(Str1,OMEGALIB);
X  strcat(Str1,"omaze4.dat");
X  result = access(Str1,F_OK|R_OK);
X  if (result == -1) {
X    impossible = TRUE;
X    printf("\nWarning! File not appendable or accessible:");
X    printf(Str1);
X  }
X
X  strcpy(Str1,OMEGALIB);
X  strcat(Str1,"omega.hi");
X  result = access(Str1,F_OK|R_OK|W_OK);
X  if (result == -1) {
X    impossible = TRUE;
X    printf("\nWarning! File not appendable or accessible:");
X    printf(Str1);
X  }
X  
X  strcpy(Str1,OMEGALIB);
X  strcat(Str1,"omega.log");
X  result = access(Str1,F_OK|R_OK|W_OK);
X  if (result == -1) {
X    impossible = TRUE;
X    printf("\nWarning! File not appendable or accessible:");
X    printf(Str1);
X  }
X
X  strcpy(Str1,OMEGALIB);
X  strcat(Str1,"omotd.txt");
X  result = access(Str1,F_OK|R_OK);
X  if (result == -1) {
X    impossible = TRUE;
X    printf("\nWarning! File not accessible:");
X    printf(Str1);
X  }
X
X  strcpy(Str1,OMEGALIB);
X  strcat(Str1,"olicense.txt");
X  result = access(Str1,F_OK|R_OK);
X  if (result == -1) {
X    impossible = TRUE;
X    printf("\nWarning! File not accessible:");
X    printf(Str1);
X  }
X  
X  strcpy(Str1,OMEGALIB);
X  strcat(Str1,"ocircle.dat");
X  result = access(Str1,F_OK|R_OK);
X  if (result == -1) {
X    impossible = TRUE;
X    printf("\nWarning! File not accessible:");
X    printf(Str1);
X  }
X  strcpy(Str1,OMEGALIB);
X  strcat(Str1,"ocmds.txt");
X  result = access(Str1,F_OK|R_OK);
X  if (result == -1) {
X    badbutpossible = TRUE;
X    printf("\nWarning! File not accessible:");
X    printf(Str1);
X  }
X
X  strcpy(Str1,OMEGALIB);
X  strcat(Str1,"occmds.txt");
X  result = access(Str1,F_OK|R_OK);
X  if (result == -1) {
X    badbutpossible = TRUE;
X    printf("\nWarning! File not accessible:");
X    printf(Str1);
X  }
X  
X
X  strcpy(Str1,OMEGALIB);
X  strcat(Str1,"ohelp1.txt");
X  result = access(Str1,F_OK|R_OK);
X  if (result == -1) {
X    badbutpossible = TRUE;
X    printf("\nWarning! File not accessible:");
X    printf(Str1);
X  }
X  strcpy(Str1,OMEGALIB);
X  strcat(Str1,"ohelp2.txt");
X  result = access(Str1,F_OK|R_OK);
X  if (result == -1) {
X    badbutpossible = TRUE;
X    printf("\nWarning! File not accessible:");
X    printf(Str1);
X  }
X  strcpy(Str1,OMEGALIB);
X  strcat(Str1,"ohelp3.txt");
X  result = access(Str1,F_OK|R_OK);
X  if (result == -1) {
X    badbutpossible = TRUE;
X    printf("\nWarning! File not accessible:");
X    printf(Str1);
X  }
X  strcpy(Str1,OMEGALIB);
X  strcat(Str1,"ohelp4.txt");
X  result = access(Str1,F_OK|R_OK);
X  if (result == -1) {
X    badbutpossible = TRUE;
X    printf("\nWarning! File not accessible:");
X    printf(Str1);
X  }
X  strcpy(Str1,OMEGALIB);
X  strcat(Str1,"ohelp5.txt");
X  result = access(Str1,F_OK|R_OK);
X  if (result == -1) {
X    badbutpossible = TRUE;
X    printf("\nWarning! File not accessible:");
X    printf(Str1);
X  }
X  strcpy(Str1,OMEGALIB);
X  strcat(Str1,"ohelp6.txt");
X  result = access(Str1,F_OK|R_OK);
X  if (result == -1) {
X    badbutpossible = TRUE;
X    printf("\nWarning! File not accessible:");
X    printf(Str1);
X  }
X  strcpy(Str1,OMEGALIB);
X  strcat(Str1,"ohelp7.txt");
X  result = access(Str1,F_OK|R_OK);
X  if (result == -1) {
X    badbutpossible = TRUE;
X    printf("\nWarning! File not accessible:");
X    printf(Str1);
X  }
X  strcpy(Str1,OMEGALIB);
X  strcat(Str1,"ohelp8.txt");
X  result = access(Str1,F_OK|R_OK);
X  if (result == -1) {
X    badbutpossible = TRUE;
X    printf("\nWarning! File not accessible:");
X    printf(Str1);
X  }
X  strcpy(Str1,OMEGALIB);
X  strcat(Str1,"ohelp9.txt");
X  result = access(Str1,F_OK|R_OK);
X  if (result == -1) {
X    badbutpossible = TRUE;
X    printf("\nWarning! File not accessible:");
X    printf(Str1);
X  }
X  strcpy(Str1,OMEGALIB);
X  strcat(Str1,"ohelp10.txt");
X  result = access(Str1,F_OK|R_OK);
X  if (result == -1) {
X    badbutpossible = TRUE;
X    printf("\nWarning! File not accessible:");
X    printf(Str1);
X  }
X  strcpy(Str1,OMEGALIB);
X  strcat(Str1,"ohelp11.txt");
X  result = access(Str1,F_OK|R_OK);
X  if (result == -1) {
X    badbutpossible = TRUE;
X    printf("\nWarning! File not accessible:");
X    printf(Str1);
X  }
X  strcpy(Str1,OMEGALIB);
X  strcat(Str1,"ohelp12.txt");
X  result = access(Str1,F_OK|R_OK);
X  if (result == -1) {
X    badbutpossible = TRUE;
X    printf("\nWarning! File not accessible:");
X    printf(Str1);
X  }
X  strcpy(Str1,OMEGALIB);
X  strcat(Str1,"ohelp13.txt");
X  result = access(Str1,F_OK|R_OK);
X  if (result == -1) {
X    badbutpossible = TRUE;
X    printf("\nWarning! File not accessible:");
X    printf(Str1);
X  }
X  
X  
X  strcpy(Str1,OMEGALIB);
X  strcat(Str1,"oabyss.txt");
X  result = access(Str1,F_OK|R_OK);
X  if (result == -1) {
X    badbutpossible = TRUE;
X    printf("\nWarning! File not accessible:");
X    printf(Str1);
X  }
X  strcpy(Str1,OMEGALIB);
X  strcat(Str1,"oscroll1.txt");
X  result = access(Str1,F_OK|R_OK);
X  if (result == -1) {
X    badbutpossible = TRUE;
X    printf("\nWarning! File not accessible:");
X    printf(Str1);
X  }
X  
X  strcpy(Str1,OMEGALIB);
X  strcat(Str1,"oscroll2.txt");
X  result = access(Str1,F_OK|R_OK);
X  if (result == -1) {
X    badbutpossible = TRUE;
X    printf("\nWarning! File not accessible:");
X    printf(Str1);
X  }
X
X
X  strcpy(Str1,OMEGALIB);
X  strcat(Str1,"oscroll3.txt");
X  result = access(Str1,F_OK|R_OK);
X  if (result == -1) {
X    badbutpossible = TRUE;
X    printf("\nWarning! File not accessible:");
X    printf(Str1);
X  }
X
X  strcpy(Str1,OMEGALIB);
X  strcat(Str1,"oscroll4.txt");
X  result = access(Str1,F_OK|R_OK);
X  if (result == -1) {
X    badbutpossible = TRUE;
X    printf("\nWarning! File not accessible:");
X    printf(Str1);
X  }
X  
X  if (impossible) {
X    printf("\nFurther execution is impossible. Sorry.");
X    printf("\nOMEGALIB may be badly #defined in odefs.h\n");
X    return(0);
X  }
X  else if (badbutpossible) {
X    printf("\nFurther execution may cause anomalous behavior.");
X    printf("\nContinue anyhow? [yn] ");
X    if (getchar()=='y') return(-1);
X    else return(0);
X  }
X  else return(1);
X}
X
X
X/* display a file given a string name of file */
Xvoid displayfile(filestr)
Xchar *filestr;
X{
X  FILE *fd = checkfopen(filestr,"r");
X  int c,d=' ';
X  int x,y;
X  clear();
X  refresh();
X  c = fgetc(fd);
X  while ((c != EOF)&&((char) d != 'q')&&((char) d!=ESCAPE)) {
X    getyx(stdscr,y,x);
X    if (y > ScreenLength) { 
X      printw("\n-More-");
X      refresh();
X      d = wgetch(stdscr);
X      clear();
X    }
X    printw("%c",(char) c);
X    c = fgetc(fd);
X  }
X  if (((char) d != 'q')&&((char) d!=ESCAPE)) {
X    printw("\n-Done-");
X    refresh();
X    getch();
X  }
X  clear();
X  refresh();
X}    
X
X
X/* display a file given a string name of file */
Xvoid copyfile(srcstr)
Xchar *srcstr;
X{
X  char deststr[80];
X  char cmd[200];
X  print1("Enter name of file to create: ");
X  strcpy(deststr,msgscanstring());
X  strcpy(cmd,"cp ");
X  strcat(cmd,srcstr);
X  strcat(cmd," ");
X  strcat(cmd,deststr);
X  print2("Copying file....");
X  system(cmd);
X  print3("Done.");
X}    
X
END_OF_FILE
if test 21529 -ne `wc -c <'ofile.c'`; then
    echo shar: \"'ofile.c'\" unpacked with wrong size!
fi
# end of 'ofile.c'
fi
echo shar: End of archive 5 \(of 19\).
cp /dev/null ark5isdone
MISSING=""
for I in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 ; do
    if test ! -f ark${I}isdone ; then
	MISSING="${MISSING} ${I}"
    fi
done
if test "${MISSING}" = "" ; then
    echo You have unpacked all 19 archives.
    rm -f ark[1-9]isdone ark[1-9][0-9]isdone
else
    echo You still need to unpack the following archives:
    echo "        " ${MISSING}
fi
##  End of shell archive.
exit 0