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

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

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



#! /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 10 (of 19)."
# Contents:  ocom2.c oeffect1.c omaze1.dat ovillage.c
# Wrapped by billr@saab on Wed Jul 13 10:46:50 1988
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f 'ocom2.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'ocom2.c'\"
else
echo shar: Extracting \"'ocom2.c'\" \(26763 characters\)
sed "s/^X//" >'ocom2.c' <<'END_OF_FILE'
X/* omega copyright (C) by Laurence Raphael Brothers, 1987,1988 */
X/* ocom2.c */
X
X/* This file contains toplevel commands called from ocom1.c */
X
X#include "oglob.h"
X
X
X/* no op a turn.... */
Xvoid rest()
X{
X  if (random_range(20) == 1) {
X    switch(random_range(10)) {
X      case 0: print3(" Time passes slowly.... "); break;
X      case 1: print3(" Tick. Tock. Tick. Tock. "); break;
X      case 2: print3(" Ho Hum. "); break;
X      case 3: print3(" Beauty Sleep. Well, in your case, Ugly Sleep. "); break;
X      case 4: print3(" And with Strange Aeons, even Death may die. "); break;
X      case 5: print3(" La Di Da. "); break;
X      case 6: print3(" Time keeps on tickin' tickin' -- into the future.... ");
X  	      break;
X      case 7: print3(" Boooring! "); break;
X      case 8: print3(" You think I like watching you sleep? "); break;
X      case 9: print3(" You sure have an early bedtime! "); break;
X    }
X    morewait();
X  }
X}
X
X
X/* read a scroll, book, tome, etc. */
Xvoid peruse()
X{
X  int index;
X  struct object *obj;
X
X  clearmsg();
X
X  if (Player.status[BLINDED] > 0)
X    print3("You're blind -- you can't read!!!");
X  else if (Player.status[AFRAID] > 0)
X    print3("You are too afraid to stop to read a scroll!");
X  else {
X    print1("Read -- ");
X    index = getitem(SCROLL);
X    if (index == ABORT)
X      setgamestatus(SKIP_MONSTERS);
X    else {
X      obj = Player.possessions[index];
X      if (obj->objchar != SCROLL) {
X	print3("There's nothing written on ");
X	nprint3(itemid(obj));
X      }
X      else {
X	nprint1("You carefully unfurl the scroll....");
X	morewait();
X	item_use(obj);
X	dispose_lost_objects(1,obj);
X      }
X    }
X  }
X}
X
X
X
X
Xvoid quaff()
X{
X  int index;
X  struct object *obj;
X  clearmsg();
X  print1("Quaff --");
X  index = getitem(POTION);
X  if (index == ABORT)
X    setgamestatus(SKIP_MONSTERS);
X  else {
X    obj = Player.possessions[index];
X    if (obj->objchar != POTION) {
X      print3("You can't drink ");
X      nprint3(itemid(obj));
X    }
X    else {
X      print1("You drink it down.... ");
X      item_use(obj);
X      morewait();
X      dispose_lost_objects(1,obj);
X    }
X  }
X}
X
X
X
X
Xvoid activate()
X{
X  int index;
X  char response;
X
X  clearmsg();
X
X  print1("Activate -- item [i] or artifact [a] or quit [ESCAPE]?");
X  do response = mcigetc();
X  while ((response != 'i') && (response != 'a') && (response != ESCAPE));
X  if (response != ESCAPE) {
X    if (response == 'i')
X      index = getitem(THING);
X    else if (response == 'a')
X      index = getitem(ARTIFACT);
X    if (index != ABORT) {
X      clearmsg();
X      print1("You activate it.... ");
X      morewait();
X      item_use(Player.possessions[index]);
X    }
X    else setgamestatus(SKIP_MONSTERS);
X  }
X  else setgamestatus(SKIP_MONSTERS);
X}
X
X
X
X
X
Xvoid eat()
X{
X  int index;
X  struct object *obj;
X
X  clearmsg();
X
X  print1("Eat --");
X  index = getitem(FOOD);
X  if (index == ABORT)
X    setgamestatus(SKIP_MONSTERS);
X  else {
X    obj = Player.possessions[index];
X    if ((obj->objchar != FOOD)&&(obj->objchar != CORPSE)) {
X      print3("You can't eat ");
X      nprint3(itemid(obj));
X    }
X    else {
X      if (obj->usef == I_FOOD) Player.food = max(0,Player.food+obj->aux);
X      item_use(obj);
X      dispose_lost_objects(1,obj);
X      if (Current_Dungeon == E_COUNTRYSIDE) {
X	Time += 100;
X	hourly_check();
X      }
X    }
X  }
X  foodcheck();
X}
X
X
X
X
X/* search all adjacent spots for secrecy */
Xvoid search(searchval)
Xint *searchval;
X{
X  int i;
X  if (Player.status[AFRAID] > 0)
X    print3("You are too terror-stricken to stop to search for anything.");
X  else {
X    if (!gamestatusp(FAST_MOVE)) {
X      setgamestatus(FAST_MOVE);
X      *searchval = Searchnum;
X    }
X    for (i=0;i<8;i++) 
X      searchat(Player.x+Dirs[0][i],Player.y+Dirs[1][i]);
X    drawvision(Player.x,Player.y);
X  }
X}
X
X
X
X/* pick up a thing where the player is */
X void pickup()
X {
X   if (Level->site[Player.x][Player.y].things == NULL)
X     print3("There's nothing there!");
X   else pickup_at(Player.x,Player.y);
X }
X
X
X/* floor inventory */
Xvoid floor_inv()
X{
X  pol ol = Level->site[Player.x][Player.y].things;
X  setgamestatus(SKIP_MONSTERS);
X  menuclear();
X  while (ol != NULL) {
X    if (ol->thing == NULL) print3("***Error; null thing on things list***");
X    else {
X      menuprint(itemid(ol->thing));
X      menuprint("\n");
X    }
X    ol = ol->next;
X  }
X  morewait();
X  xredraw();
X}
X
X
X
X
X
X
X
X
X
Xvoid drop()
X{
X  int index,n;
X  
X  clearmsg();
X
X  print1("Drop --");
X  index = getitem(CASHVALUE);
X  if (index == ABORT)
X    setgamestatus(SKIP_MONSTERS);
X  else {
X    if (index == CASHVALUE) drop_money();
X    else if ((! Player.possessions[index]->used) ||
X	     (! cursed(Player.possessions[index]))) {
X      if (Player.possessions[index]->number == 1) {
X	p_drop_at(Player.x,Player.y,1,Player.possessions[index]);
X	conform_lost_objects(1,Player.possessions[index]);
X      }
X      else {
X	n = getnumber(Player.possessions[index]->number);
X	p_drop_at(Player.x,Player.y,n,Player.possessions[index]);
X	conform_lost_objects(n,Player.possessions[index]);
X      }
X    }
X    else {
X      print3("You can't seem to get rid of: ");
X      nprint3(itemid(Player.possessions[index]));
X    }
X  }
X  calc_melee();
X}
X
X
X      
X
X
X
X
X
X
X/* talk to the animals -- learn their languages.... */
Xvoid talk()
X{
X  int dx,dy,index=0;
X  char response;
X  struct monster *m;
X
X  clearmsg();
X
X  print1("Talk --");
X  index = getdir();
X
X  if (index == ABORT)
X    setgamestatus(SKIP_MONSTERS);
X  else {
X    dx = Dirs[0][index];
X    dy = Dirs[1][index];
X    
X    if ((! inbounds(Player.x+dx, Player.y+dy)) ||
X	(Level->site[Player.x+dx][Player.y+dy].creature == NULL)) {
X      print3("There's nothing there to talk to!!!");
X      setgamestatus(SKIP_MONSTERS);
X    }
X    else {
X      m = Level->site[Player.x+dx][Player.y+dy].creature;
X      menuclear();
X      strcpy(Str1,"     Talk to ");
X      strcat(Str1,m->monstring);
X      strcat(Str1,":");
X      menuprint(Str1);
X      menuprint("\na: Greet.");
X      menuprint("\nb: Threaten.");
X      menuprint("\nc: Surrender.");
X      menuprint("\nESCAPE: Clam up.");
X      do response = menugetc();
X      while ((response != 'a') &&
X	     (response != 'b') &&
X	     (response != 'c') &&
X	     (response != ESCAPE));
X      switch(response) {
X      case 'a': monster_talk(m); break;
X      case 'b': threaten(m); break;
X      case 'c': surrender(m); break;
X      default: setgamestatus(SKIP_MONSTERS); break;
X      }
X    }
X  }
X  xredraw();
X}
X
X/* try to deactivate a trap */
Xvoid disarm()
X{
X  int x,y,index=0;
X  pob o;
X
X  clearmsg();
X  print1("Disarm -- ");
X
X  index = getdir();
X
X  if (index == ABORT)
X    setgamestatus(SKIP_MONSTERS);
X  else {
X    x = Dirs[0][index]+Player.x;
X    y = Dirs[1][index]+Player.y;
X    
X    if (! inbounds(x,y))
X      print3("Whoa, off the map...");
X    else if (Level->site[x][y].locchar != TRAP)
X      print3("You can't see a trap there!");
X    else {
X      if (random_range(50+Level->depth*2) < 
X	  Player.dex+Player.level+Player.rank[THIEVES]*10) {
X	print1("You disarmed the trap!");
X	if (random_range(100) < Player.dex+Player.rank[THIEVES]*10) {
X	  o = ((pob) malloc(sizeof(objtype)));
X	  switch(Level->site[x][y].p_locf) {
X	  case L_TRAP_DART: 
X	    *o=Objects[THINGID+17];
X	    break;
X	  case L_TRAP_DISINTEGRATE:
X	    *o=Objects[THINGID+23];
X	    break;
X	  case L_TRAP_SLEEP_GAS:
X	    *o=Objects[THINGID+22];
X	    break;
X	  case L_TRAP_TELEPORT:
X	    *o=Objects[THINGID+21];
X	    break;
X	  case L_TRAP_ABYSS:
X	    *o=Objects[THINGID+24];
X	    break;
X	  case L_TRAP_FIRE:
X	    *o=Objects[THINGID+20];
X	    break;
X	  case L_TRAP_SNARE:
X	    *o=Objects[THINGID+19];
X	    break;
X	  case L_TRAP_ACID:
X	    *o=Objects[THINGID+18];
X	    break;
X	  case L_TRAP_MANADRAIN:
X	    *o=Objects[THINGID+25];
X	    break;
X	  default:
X	    o = NULL;
X	    break;
X	  }
X	  if (o != NULL) {
X	    print2("You manage to retrieve the trap components!");
X	    Objects[o->id].known = 1;
X	    o->known = 1;
X	    gain_item(o);
X	    gain_experience(25);
X	  }
X	}
X	Level->site[x][y].p_locf = L_NO_OP;
X	Level->site[x][y].locchar = FLOOR;
X	gain_experience(5);
X      }
X      else if (random_range(10+Level->depth) > Player.dex) {
X	print1("You accidentally set off the trap!");
X	Player.x = x; Player.y = y;
X	p_movefunction(Level->site[x][y].p_locf);
X      }
X      else print1("You failed to disarm the trap.");
X    }
X  }
X}
X
X/* is it more blessed to give, or receive? */
Xvoid give()
X{
X  int index;
X  int dx,dy,dindex=0;
X  struct monster *m;
X  pob obj;
X
X  clearmsg();
X
X  print1("Give to monster --");
X  dindex = getdir();
X  if (dindex == ABORT) 
X    setgamestatus(SKIP_MONSTERS);
X  else {
X    dx = Dirs[0][dindex];
X    dy = Dirs[1][dindex];
X    if (! inbounds(Player.x+dx, Player.y+dy))
X      print3("Whoa, off the map...");
X    else if (Level->site[Player.x+dx][Player.y+dy].creature == NULL) {
X      print3("There's nothing there to give something to!!!");
X      setgamestatus(SKIP_MONSTERS);
X    }
X    else {
X      m = Level->site[Player.x+dx][Player.y+dy].creature;
X      clearmsg();
X      print1("Give what? "); 
X      index = getitem(CASHVALUE);
X      if (index == ABORT)
X	setgamestatus(SKIP_MONSTERS);
X      else if (index == CASHVALUE) give_money(m);
X      else if (! cursed(Player.possessions[index])) {
X	obj = ((pob) malloc(sizeof(objtype)));
X	*obj = *(Player.possessions[index]);
X	conform_lost_objects(1,Player.possessions[index]);
X	obj->number = 1;
X	givemonster(m,obj);
X	print2("Given: ");
X	nprint2(itemid(obj));
X	morewait();
X	calc_melee();
X      }
X      else {
X	print3("You can't even give away: ");
X	nprint3(itemid(Player.possessions[index]));
X      }
X    }
X  }
X}
X
X
X
X
X/* zap a wand, of course */
Xvoid zapwand()
X{
X  int index;
X  struct object *obj;
X
X  clearmsg();
X
X  if (Player.status[AFRAID] > 0)
X    print3("You are so terror-stricken you can't hold a wand straight!");
X  else {
X    print1("Zap --");
X    index = getitem(STICK);
X    if (index == ABORT)
X      setgamestatus(SKIP_MONSTERS);
X    else {
X      obj = Player.possessions[index];
X      if (obj->objchar != STICK) {
X	print3("You can't zap: ");
X	nprint3(itemid(obj));
X      }
X      else 
X	if (obj->charge < 1) 
X	  print3("Fizz.... Pflpt. Out of charges. ");
X	else {
X	  obj->charge--;
X	  item_use(obj);
X	}
X    }
X  }
X}
X
X/* cast a spell */
Xvoid magic()
X{
X  int index,drain;
X  clearmsg();
X  if (Player.status[AFRAID] > 0)
X    print3("You are too afraid to concentrate on a spell!");
X  else {
X    index = getspell();
X    xredraw();
X    if (index == ABORT)
X      setgamestatus(SKIP_MONSTERS);
X    else {
X      drain = Spells[index].powerdrain;
X      if (Lunarity == 1) drain = drain / 2;
X      else if (Lunarity == -1) drain = drain *2;
X      if (drain > Player.mana)
X	print3("You lack the power for that spell! ");
X      else {
X	Player.mana -= drain;
X	cast_spell(index);
X      }
X    }
X  }
X  dataprint();
X}
X
X
X/* go upstairs ('<' command) */
Xvoid upstairs()
X{
X  if (Level->site[Player.x][Player.y].locchar != UP)
X    print3("Not here!");
X  else {
X    if (gamestatusp(MOUNTED))
X      print2("You manage to get your horse upstairs.");
X    print1("You ascend a level.");
X    if (Level->depth <= 1) {
X      if (Level->environment == E_SEWERS)
X	change_environment(E_CITY);
X      else change_environment(E_COUNTRYSIDE);
X    }
X    else change_level(Level->depth,Level->depth-1,FALSE);
X    roomcheck();
X  }
X  setgamestatus(SKIP_MONSTERS);
X}
X
X
X
X/* go downstairs ('>' command) */
Xvoid downstairs()
X{
X  if (Level->site[Player.x][Player.y].locchar != DOWN)
X    print3("Not here!");
X  else {
X    if (gamestatusp(MOUNTED))
X      print2("You manage to get your horse downstairs.");
X    if (Current_Environment == Current_Dungeon) {
X      print1("You descend a level.");
X      change_level(Level->depth,Level->depth+1,FALSE);
X      roomcheck();
X    }
X    else if ((Current_Environment == E_CITY) ||
X	     (Last_Environment == E_CITY))
X      change_environment(E_SEWERS);
X    else if (Current_Environment != Current_Dungeon)
X      print3("This stairway is deviant. You can't use it.");
X  }
X  setgamestatus(SKIP_MONSTERS);
X}
X
X
X
X
X/* set various player options */
X/* have to redefine in odefs for next full recompile */
Xvoid setoptions()
X{
X  int slot = 1,done = FALSE;
X  char response;
X
X  clearmsg();
X  menuclear();
X
X  display_options();
X
X  move_slot(1,1,NUMOPTIONS);
X  clearmsg();
X  print1("Currently selected option is preceded by highlit >>");
X  print2("Move selected option with '>' and '<', ESCAPE to quit.");
X  do {
X    response = mcigetc();
X    switch(response) {
X    case 'j':
X    case '>':
X      slot = move_slot(slot,slot+1,NUMOPTIONS+1);
X      break;
X    case 'k':
X    case '<':
X      if (slot > 1) /* hack hack */
X	slot = move_slot(slot,slot-1,NUMOPTIONS+1); 
X      break;
X    case 't':
X      if (slot <= NUMTFOPTIONS) 
X	optionset(pow2(slot-1));
X      else if (slot == VERBOSITY_LEVEL)
X	Verbosity = TERSE;
X      else print3("'T' is meaningless for this option.");
X      break;
X    case 'f':
X      if (slot <= NUMTFOPTIONS) 
X	optionreset(pow2(slot-1));
X      else print3("'F' is meaningless for this option.");
X      break;
X    case 'm':
X      if (slot == VERBOSITY_LEVEL) 
X	Verbosity = MEDIUM;
X      else print3("'M' is meaningless for this option.");
X      break;
X    case 'v':
X      if (slot == VERBOSITY_LEVEL) 
X	Verbosity = VERBOSE;
X      else print3("'V' is meaningless for this option.");
X      break;
X    case '1':case '2':case '3':case '4':case '5':
X    case '6':case '7':case '8':case'9':
X      if (slot == SEARCH_DURATION)
X	Searchnum = response - '0';
X      else print3("A number is meaningless for this option.");
X      break;
X    case ESCAPE:
X      done = TRUE;
X      break;
X    default: print3("That response is meaningless for this option."); break;
X    }
X    display_option_slot(slot);
X    move_slot(slot,slot,NUMOPTIONS+1);
X  } while (! done);
X  xredraw();
X}
X
X
X
X/* name an item */
Xvoid callitem()
X{
X  int index;
X  pob obj;
X
X  clearmsg();
X  setgamestatus(SKIP_MONSTERS);
X  print1("Call --");
X  index = getitem(NULL);
X  if (index == CASHVALUE) print3("Can't rename cash!");
X  else if (index != ABORT) {
X    obj = Player.possessions[index];
X    if (obj->known)
X      print3("That item is already identified!");
X    else {
X      print1("Call it:");
X      obj->objstr = salloc(msgscanstring());
X      clearmsg();
X      print2("Also call by that name all similar items? [yn] ");
X      if (ynq2() == 'y') {
X	Objects[obj->id].objstr = salloc(obj->objstr);
X      }
X    }
X  }
X}
X      
X
X
X
X/* open a door */
Xvoid opendoor()
X{
X  int dir;
X  int ox,oy;
X
X  clearmsg();
X  print1("Open --");
X  dir = getdir();
X  if (dir == ABORT)
X    setgamestatus(SKIP_MONSTERS);
X  else {
X    ox = Player.x + Dirs[0][dir];
X    oy = Player.y + Dirs[1][dir];
X    if (Level->site[ox][oy].locchar == OPEN_DOOR) {
X      print3("That door is already open!");
X      setgamestatus(SKIP_MONSTERS);
X    }
X    else if (Level->site[ox][oy].locchar == PORTCULLIS) {
X      print1("You try to lift the massive steel portcullis....");
X      if (random_range(100) < Player.str) {
X	print2("Incredible. You bust a gut and lift the portcullis.");
X	Level->site[ox][oy].locchar = FLOOR;
X      }
X      else {
X	print2("Argh. You ruptured yourself.");
X	p_damage(Player.str,UNSTOPPABLE,"a portcullis");
X      }
X    }
X    else if ((Level->site[ox][oy].locchar != CLOSED_DOOR) || 
X	     loc_statusp(ox,oy,SECRET)) {
X      print3("You can't open that!");
X      setgamestatus(SKIP_MONSTERS);
X    }
X    else if (Level->site[ox][oy].aux == LOCKED) 
X      print3("That door seems to be locked.");
X    else Level->site[ox][oy].locchar = OPEN_DOOR;
X  }
X}
X
X
X
X/* Try to destroy some location */
Xvoid bash_location()
X{
X  int dir;
X  int ox,oy;
X
X  clearmsg();
X  print1("Bashing --");
X  dir = getdir();
X  if (dir == ABORT)
X    setgamestatus(SKIP_MONSTERS);
X  else {
X    ox = Player.x + Dirs[0][dir];
X    oy = Player.y + Dirs[1][dir];
X    if ((Current_Environment == E_CITY) &&
X	(ox == 0) &&
X	(oy == 0)) {
X      print1("Back Door WIZARD Mode!");
X      print2("You will invalidate your score if you proceed.");
X      morewait();
X      print1("Enable WIZARD Mode? [yn] ");
X      if (ynq1()=='y') {
X	print2("You feel like a cheater.");
X	setgamestatus(CHEATED);
X      }
X      else print2("A sudden tension goes out of the air....");
X    }
X    else {
X      if (Level->site[ox][oy].locchar == WALL) {
X	print1("You hurl yourself at the wall!");
X	p_damage(Player.str,NORMAL_DAMAGE,"a suicidal urge");
X      }
X      else if (Level->site[ox][oy].locchar == OPEN_DOOR) {
X	print1("You hurl yourself through the open door!");
X	print2("Yaaaaah! ... thud.");
X	Player.x = ox;
X	Player.y = oy;
X	p_damage(3,UNSTOPPABLE,"silliness");
X	p_movefunction(Level->site[Player.x][Player.y].p_locf);
X	setgamestatus(SKIP_MONSTERS); /* monsters are surprised... */
X      }
X      else if (Level->site[ox][oy].locchar == CLOSED_DOOR) {
X	if (loc_statusp(ox,oy,SECRET)) {
X	  print1("You found a secret door!");
X	  lreset(ox,oy,SECRET);
X	}
X	if (Level->site[ox][oy].aux == LOCKED) {
X	  if (random_range(100)+Level->depth < Player.str) {
X	    Player.x = ox;
X	    Player.y = oy;
X	    print1("You blast the door off its hinges!");
X	    p_movefunction(Level->site[Player.x][Player.y].p_locf);
X	    Level->site[ox][oy].locchar = FLOOR;
X	    setgamestatus(SKIP_MONSTERS); /* monsters are surprised... */
X	  }
X	  else {
X	    print1("Crash! The door holds.");
X	    if (random_range(30) > Player.str)
X	      p_damage(max(1,statmod(Player.str)),UNSTOPPABLE,"a door");
X	  }
X	}
X	else {
X	  Player.x = ox;
X	  Player.y = oy;
X	  print1("You bash open the door!");
X	  if (random_range(30) > Player.str)
X	    p_damage(1,UNSTOPPABLE,"a door");
X	  p_movefunction(Level->site[Player.x][Player.y].p_locf);
X	  Level->site[ox][oy].locchar = OPEN_DOOR;
X	  setgamestatus(SKIP_MONSTERS); /* monsters are surprised... */
X	}
X      }
X      else if (Level->site[ox][oy].locchar == STATUE) {
X	statue_random(ox,oy);
X      }
X      else if (Level->site[ox][oy].locchar == PORTCULLIS) {
X	print1("Really, you don't have a prayer.");
X	if (random_range(1000) < Player.str) {
X	  print2("The portcullis flies backwards into a thousand fragments.");
X	  print3("Wow. What a stud.");
X	  gain_experience(100);
X	  Level->site[ox][oy].locchar = FLOOR;
X	  Level->site[ox][oy].p_locf = L_NO_OP;
X	}
X	else {
X	  print2("You only hurt yourself on the 3'' thick steel bars.");
X	  p_damage(Player.str,UNSTOPPABLE,"a portcullis");
X	}
X      }
X      else if (Level->site[ox][oy].locchar == ALTAR) {
X	if ((Player.patron > 0)&&(Level->site[ox][oy].aux == Player.patron)) {
X	  print1("You have a vision! An awesome angel hovers over the altar.");
X	  print2("The angel says: 'You twit, don't bash your own altar!'");
X	  print3("The angel slaps you upside the head for your presumption.");
X	  p_damage(Player.hp-1,UNSTOPPABLE,"an annoyed angel");
X	}
X	else if (Level->site[ox][oy].aux == 0) {
X	  print1("The feeble powers of the minor godling are not enough to");
X	  print2("protect his altar! The altar crumbles away to dust.");
X	  print3("You feel almost unbearably smug.");
X	  Level->site[ox][oy].locchar = RUBBLE;
X	  Level->site[ox][oy].p_locf = L_RUBBLE;
X	  gain_experience(5);
X	}
X	else {
X	  print1("You have successfully annoyed a major deity. Good job.");
X	  print2("Zzzzap! A bolt of godsfire strikes!");
X	  if (Player.rank[PRIESTHOOD] > 0) 
X	    print3("Your own deity's aegis defends you from the bolt!");
X	  p_damage(max(0,random_range(100)-Player.rank[PRIESTHOOD]*20),
X		   UNSTOPPABLE,
X		   "a bolt of godsfire");
X	  if (Player.rank[PRIESTHOOD]*20+Player.pow+Player.level >
X	      random_range(200)) {
X	    morewait();
X	    print1("The altar crumbles...");
X	    Level->site[ox][oy].locchar = RUBBLE;
X	    Level->site[ox][oy].p_locf = L_RUBBLE;
X	    morewait();
X	    print2("You sense your deity's pleasure with you.");
X	    morewait();
X	    print3("You are surrounded by a golden glow.");
X	    cleanse(1);
X	    heal(10);
X	    gain_experience(500);
X	  }
X	}
X      }
X      else {
X	print3("You restrain yourself from total silliness.");
X	setgamestatus(SKIP_MONSTERS);
X      }
X    }
X  }
X}
X
X
X/* attempt destroy an item */
Xvoid bash_item()
X{
X  int item;
X  pob obj;
X
X  clearmsg();
X  print1("Destroy an item --");
X  item = getitem(NULL);
X  if (item == CASHVALUE) print3("Can't destroy cash!");
X  else if (item != ABORT) {
X    obj = Player.possessions[item];
X    if (Player.str+random_range(20) > obj->fragility+random_range(20)) {
X      if (Player.alignment < 0) {
X	print2("That was fun....");
X	gain_experience(obj->level * obj->level * 5);
X      }
X      damage_item(obj);
X    }
X    else {
X      if (obj->objchar == WEAPON) {
X	print2("The weapon turned in your hand -- you hit yourself!");
X	p_damage(random_range(obj->dmg+abs(obj->plus)),
X		 NORMAL_DAMAGE,
X		 "a failure at vandalism");
X      }
X      else if (obj->objchar == ARTIFACT) {
X	print2("Uh Oh -- Now you've gotten it angry....");
X	p_damage(obj->level*10,
X		 UNSTOPPABLE,
X		 "an enraged artifact");
X      }
X      else {
X	print2("Ouch! Damn thing refuses to break...");
X	p_damage(1,UNSTOPPABLE,"a failure at vandalism");
X      }
X    }
X  }
X}
X
X
X/* guess what this does */
Xvoid save(compress)
Xint compress;
X{
X  clearmsg();
X  print1("Confirm Save? [yn] ");
X  if (ynq1() == 'y') {
X    if (gamestatusp(ARENA_MODE)) {
X      print3("Can't save the game in the arena!");
X      setgamestatus(SKIP_MONSTERS);
X    }
X    else if (Current_Environment == L_ADEPT) {
X      print3("Can't save the game in the Adept's Challenge!");
X      setgamestatus(SKIP_MONSTERS);
X    }
X    else {
X      print1("Enter savefile name: ");
X      strcpy(Str1,msgscanstring());
X#ifdef COMPRESS_SAVE_FILES
X      if (!compress) {
X	print1("Warning: This file will not be compressed.");
X	print2("You should compress it yourself.");
X	morewait();
X      }
X#endif
X      if (save_game(compress,Str1)) {
X	print3("Bye!");
X	sleep(1);
X	endgraf();
X	exit(0);
X      }
X      else setgamestatus(SKIP_MONSTERS);
X    }
X  }
X  else print1("Save Aborted.");
X}
X
X/* close a door */
Xvoid closedoor()
X{
X  int dir;
X  int ox,oy;
X
X  clearmsg();
X
X  print1("Close --");
X  dir = getdir();
X  if (dir == ABORT)
X    setgamestatus(SKIP_MONSTERS);
X  else {
X    ox = Player.x + Dirs[0][dir];
X    oy = Player.y + Dirs[1][dir];
X    if (Level->site[ox][oy].locchar == CLOSED_DOOR) {
X      print3("That door is already closed!");
X      setgamestatus(SKIP_MONSTERS);
X    }
X    else if (Level->site[ox][oy].locchar != OPEN_DOOR) {
X      print3("You can't close that!");
X      setgamestatus(SKIP_MONSTERS);
X    }
X    else Level->site[ox][oy].locchar = CLOSED_DOOR;
X  }
X}
X
X/* handle a h,j,k,l, etc. */
Xvoid moveplayer(dx,dy)
Xint dx,dy;
X{
X  static int twiddle = FALSE;
X  if (p_moveable(Player.x+dx,Player.y+dy)) {
X      
X    if (Player.status[IMMOBILE] > 0) {
X      resetgamestatus(FAST_MOVE);
X      print3("You are unable to move");
X    }
X    else if ((Player.maxweight < Player.itemweight) && 
X	     random_range(2) &&
X	     (! Player.status[LEVITATING])) {
X      if (gamestatusp(MOUNTED)) {
X	print1("Your horse refuses to carry you and your pack another step!");
X	print2("Your steed bucks wildly and throws you off!");
X	p_damage(10,UNSTOPPABLE,"a cruelly abused horse");
X	resetgamestatus(MOUNTED);
X	summon(-1,HORSE);
X      }
X      else {
X	p_damage(1,UNSTOPPABLE,"a rupture");
X	print3("The weight of your pack drags you down. You can't move.");
X      }
X    }
X    else {
X      Player.x += dx;
X      Player.y += dy;
X      p_movefunction(Level->site[Player.x][Player.y].p_locf);
X      
X      /* causes moves to take effectively 30 seconds in town without
X         monsters being sped up compared to player */
X      if ((Current_Environment == E_CITY) ||
X	  (Current_Environment == E_VILLAGE)) {
X	twiddle = ! twiddle;
X	if (twiddle) {
X	  Time++;
X	  if (Time % 10 == 0) tenminute_check();
X	  else minute_status_check();
X	}
X      }
X
X      /* this test protects against player entering countryside and still
X      having effects from being on the Level, a kluge, but hey,... */
X
X      if (Current_Environment != E_COUNTRYSIDE) {
X	if (gamestatusp(FAST_MOVE))
X	  if ((Level->site[Player.x][Player.y].things != NULL) ||
X	      (optionp(RUNSTOP) && 
X	       loc_statusp(Player.x,Player.y,STOPS)))
X	    resetgamestatus(FAST_MOVE);
X	if ((Level->site[Player.x][Player.y].things != NULL) &&
X	    (optionp(PICKUP)))
X	  pickup();
X      }
X    }
X  }
X  else if (gamestatusp(FAST_MOVE)) {
X    drawvision(Player.x,Player.y);
X    resetgamestatus(FAST_MOVE);
X  }
X}
X
X
X/* handle a h,j,k,l, etc. */
Xvoid movepincountry(dx,dy)
Xint dx,dy;
X{
X  int i,takestime = TRUE;
X  if ((Player.maxweight < Player.itemweight) && 
X      random_range(2) &&
X      (! Player.status[LEVITATING])) {
X    if (gamestatusp(MOUNTED)) {
X      print1("Your horse refuses to carry you and your pack another step!");
X      print2("Your steed bucks wildly and throws you off!");
X      p_damage(10,UNSTOPPABLE,"a cruelly abused horse");
X      resetgamestatus(MOUNTED);
X      morewait();
X      print1("With a shrill neigh of defiance, your former steed gallops");
X      print2("off into the middle distance....");
X      if (Player.packptr != 0) {
X	morewait();
X	print1("You remember (too late) that the contents of your pack");
X	print2("were kept in your steed's saddlebags!");
X	for(i=0;i<MAXPACK;i++) {
X	  if (Player.pack[i] != NULL)
X	    free((char *) Player.pack[i]);
X	  Player.pack[i] = NULL;
X	}
X	Player.packptr = 0;
X	calc_melee();
X      }
X    }
X    else {
X      p_damage(1,UNSTOPPABLE,"a rupture");
X      print3("The weight of your pack drags you down. You can't move.");
X    }
X  }
X  else {
X    if (gamestatusp(LOST)) {
X      print3("Being lost, you strike out randomly....");
X      morewait();
X      dx = random_range(3)-1;
X      dy = random_range(3)-1;
X    }
X    if (p_country_moveable(Player.x+dx,Player.y+dy)) {
X      if (Player.status[IMMOBILE] > 0) 
X	print3("You are unable to move");
X      else {
X	Player.x += dx;
X	Player.y += dy;
X	if ((! gamestatusp(MOUNTED))&&(Player.possessions[O_BOOTS] != NULL)) {
X	  if (Player.possessions[O_BOOTS]->usef == I_BOOTS_7LEAGUE) {
X	    takestime = FALSE;
X	    if (Player.possessions[O_BOOTS]->blessing < 0) {
X	      print1("Whooah! -- Your boots launch you into the sky....");
X	      print2("You come down in a strange location....");
X	      Player.x = random_range(WIDTH);
X	      Player.y = random_range(LENGTH);
X	      morewait();
X	      clearmsg();
X	      print1("Your boots disintegrate with a malicious giggle...");
X	      dispose_lost_objects(1,Player.possessions[O_BOOTS]);
X	    }
X	    else if (Player.possessions[O_BOOTS]->known != 2) {
X	      print1("Wow! Your boots take you 7 leagues in a single stride!");
X	      Player.possessions[O_BOOTS]->known = 2;
X	    }
X	  }
X	}
X	if (gamestatusp(LOST) && (Precipitation < 1) && 
X	    Country[Player.x][Player.y].explored) {
X	  print3("Ah! Now you know where you are!");
X	  morewait();
X	  resetgamestatus(LOST);
X	}
X	else if (gamestatusp(LOST)) {
X	  print3("You're still lost.");
X	  morewait();
X	}
X	if (Precipitation > 0) Precipitation--;
X	Country[Player.x][Player.y].explored = TRUE;
X	terrain_check(takestime);
X      }
X    }
X  }
X}
X
END_OF_FILE
if test 26763 -ne `wc -c <'ocom2.c'`; then
    echo shar: \"'ocom2.c'\" unpacked with wrong size!
fi
# end of 'ocom2.c'
fi
if test -f 'oeffect1.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'oeffect1.c'\"
else
echo shar: Extracting \"'oeffect1.c'\" \(17668 characters\)
sed "s/^X//" >'oeffect1.c' <<'END_OF_FILE'
X
X/* omega copyright (C) by Laurence Raphael Brothers, 1987,1988 */
X/* oeffect1.c */
X
X#include "oglob.h"
X
X
X/* enchant */
Xvoid enchant(delta)
Xint delta;
X{
X  int i,used = FALSE;
X  float mult;
X
X  if (delta < 0) {
X    i = random_item();
X    if (i == ABORT) {
X      print1("You feel fortunate.");
X      morewait();
X    }
X    else {
X      if (Player.possessions[i]->blessing < 0) {
X	print1("The item glows, but the glow flickers out...");
X	morewait();
X      }
X      else {
X	used = (Player.possessions[i]->used);
X	if (used) {
X	  Player.possessions[i]->used = FALSE;
X	  item_use(Player.possessions[i]);
X	} 
X	print1("Your ");
X	nprint1(itemid(Player.possessions[i]));
X	nprint1(" radiates an aura of mundanity!");
X	morewait();
X	Player.possessions[i]->plus = 0;
X	Player.possessions[i]->charge = -1;
X	Player.possessions[i]->usef = I_NOTHING;
X	if (used) {
X	  Player.possessions[i]->used = TRUE;
X	  item_use(Player.possessions[i]);      
X	}
X      }
X    }
X  }
X  else {
X    i = getitem(NULL);
X    if (i == ABORT) {
X      print1("You feel unlucky.");
X      morewait();
X    }
X    else if (i == CASHVALUE) {
X      print1("You enchant your money.... What a concept!");
X      mult = 1 + (random_range(7)-3)/6.0;
X      if (mult > 1.0) print2("Seems to have been a good idea!");
X      else print2("Maybe it wasn't such a good idea....");
X      Player.cash = ((int) (mult*Player.cash));
X      morewait();
X    }
X    else {
X      if (Player.possessions[i]->plus > random_range(20)+1) {
X	print1("Uh-oh, the force of the enchantment was too much!");
X	print2("There is a loud explosion!");
X	morewait();
X	manastorm(Player.x,Player.y,Player.possessions[i]->plus*5);
X	dispose_lost_objects(1,Player.possessions[i]);
X      }
X      else {
X	used = (Player.possessions[i]->used);
X	if (used) {
X	  setgamestatus(SUPPRESS_PRINTING);
X	  Player.possessions[i]->used = FALSE;
X	  item_use(Player.possessions[i]);
X	  resetgamestatus(SUPPRESS_PRINTING);
X	}
X	print1("The item shines!");
X	morewait();
X	Player.possessions[i]->plus += delta+1;
X	if (Player.possessions[i]->charge > -1)
X	  Player.possessions[i]->charge += 
X	    ((delta+1) * (random_range(10) + 1));
X	if (used) {
X	  setgamestatus(SUPPRESS_PRINTING);
X	  Player.possessions[i]->used = TRUE;
X	  item_use(Player.possessions[i]);      
X	  resetgamestatus(SUPPRESS_PRINTING);
X	}
X      }
X    }
X    calc_melee();
X  }
X}
X
X/* bless */
Xvoid bless(blessing)
Xint blessing;
X{
X  int index,used;
X
X  if (blessing < 0) {
X    index = random_item();
X    if (index == ABORT) {
X      print1("You feel fortunate.");
X      morewait();
X    }
X    else {
X      print1("A foul odor arises from your ");
X      nprint1(itemid(Player.possessions[index]));
X      morewait();
X      used = (Player.possessions[index]->used);
X      if (used) {
X	setgamestatus(SUPPRESS_PRINTING);
X	Player.possessions[index]->used = FALSE;
X	item_use(Player.possessions[index]);
X	resetgamestatus(SUPPRESS_PRINTING);
X      }
X      Player.possessions[index]->blessing -= 2;
X      if (Player.possessions[index]->blessing < 0) 
X	Player.possessions[index]->plus =
X	  abs(Player.possessions[index]->plus) - 1;
X      if (used) {
X	setgamestatus(SUPPRESS_PRINTING);
X	Player.possessions[index]->used = TRUE;
X	item_use(Player.possessions[index]);      
X	resetgamestatus(SUPPRESS_PRINTING);
X      }
X    }
X  }
X  else {
X    index = getitem(NULL);
X    if (index == CASHVALUE) {
X      print1("Blessing your money has no effect.");
X      morewait();
X    }
X    else if (index != ABORT) {
X      used = (Player.possessions[index]->used == TRUE);
X      if (used) {
X	setgamestatus(SUPPRESS_PRINTING);
X	Player.possessions[index]->used = FALSE;
X	item_use(Player.possessions[index]);      
X	resetgamestatus(SUPPRESS_PRINTING);
X      }
X      print1("A pure white light surrounds the item... ");
X      if (Player.possessions[index]->blessing < 0-(blessing+1)) {
X	print2("which is evil enough to resist the effect of the blessing!");
X        morewait();
X      }
X      else if (Player.possessions[index]->blessing < -1) {
X	print2("which disintegrates under the influence of the holy aura!");
X        morewait();
X	Player.itemweight -=  Player.possessions[index]->weight;
X	dispose_lost_objects(1,Player.possessions[index]);
X      }
X      else if (Player.possessions[index]->blessing < blessing+1) {
X	print2("which now seems affected by afflatus!");
X	morewait();
X	Player.possessions[index]->blessing++;
X	Player.possessions[index]->plus =
X	  abs(Player.possessions[index]->plus)+1;
X      }
X      else {
X        print2("The hierolux fades without any appreciable effect....");
X        morewait();
X      }
X      if (used && (Player.possessions[index] != NULL)) {
X	setgamestatus(SUPPRESS_PRINTING);
X	Player.possessions[index]->used = TRUE;
X	item_use(Player.possessions[index]);     
X	resetgamestatus(SUPPRESS_PRINTING);
X      } 
X    }
X  }
X  calc_melee();
X}
X
X
X
Xvoid heal(amount)
Xint amount;
X{
X  if (amount > -1) {
X    mprint("You feel better.");
X    Player.hp += random_range(10*amount)+1;
X    Player.status[BLINDED] = 0;
X    if (Player.hp > Player.maxhp)
X      Player.hp = Player.maxhp + amount;
X  }
X  else {
X    mprint("You feel unwell.");
X    Player.hp -= random_range(10*abs(amount)+1);
X    if (Player.hp < 0)
X      p_death("magical disruption");
X  }
X  dataprint();
X}
X
X
Xvoid fbolt(fx,fy,tx,ty,hit,dmg)
Xint fx,fy,tx,ty,hit,dmg;
X{
X  bolt(fx,fy,tx,ty,hit,dmg,FLAME);
X}
X
Xvoid lbolt(fx,fy,tx,ty,hit,dmg)
Xint fx,fy,tx,ty,hit,dmg;
X{
X  bolt(fx,fy,tx,ty,hit,dmg,ELECTRICITY);
X}
X
Xvoid nbolt(fx,fy,tx,ty,hit,dmg)
Xint fx,fy,tx,ty,hit,dmg;
X{
X  bolt(fx,fy,tx,ty,hit,dmg,NORMAL_DAMAGE);
X}
X
X
X/* from f to t */
Xvoid bolt(fx,fy,tx,ty,hit,dmg,dtype)
Xint fx,fy,tx,ty,hit,dmg,dtype;
X{
X  int xx,yy;
X  struct monster *target;
X  char boltchar;
X  xx = fx; yy = fy;
X  
X  switch(dtype) {
X    case FLAME:boltchar='*';break;
X    case ELECTRICITY:boltchar = '^';break;
X    case NORMAL_DAMAGE:boltchar = '!';break;
X  }
X
X  do_los(boltchar,&xx,&yy,tx,ty);
X
X  if ((xx == Player.x) && (yy == Player.y)) {
X    if (Player.status[DEFLECTION] > 0) 
X      mprint("The bolt just missed you!");
X    else {
X      switch (dtype) {
X      case FLAME:
X	mprint("You were blasted by a firebolt!");
X	p_damage(random_range(dmg),dtype,"a firebolt");
X	break;
X      case ELECTRICITY:
X	mprint("You were zapped by lightning!");
X	p_damage(random_range(dmg),dtype,"a bolt of lightning");
X	break;
X      case NORMAL_DAMAGE:
X	mprint("You were hit by a missile!");
X	p_damage(random_range(dmg),dtype,"a missile");
X	break;
X      }
X    }
X  }
X  else if (NULL != (target = Level->site[xx][yy].creature)) {
X    if (hitp(hit,target->ac)) {
X      if (target->uniqueness == COMMON) {
X	strcpy(Str1,"The ");
X	strcat(Str1,target->monstring);
X      }
X      else strcpy(Str1,target->monstring);
X      switch (dtype) {
X      case FLAME:strcat(Str1," was blasted by a firebolt!");break;
X      case ELECTRICITY:strcat(Str1," was zapped by lightning!");break;
X      case NORMAL_DAMAGE:strcat(Str1," was hit by a missile!"); break;
X      }
X      mprint(Str1);
X      m_status_set(target,HOSTILE);
X      m_damage(target,random_range(dmg),dtype);
X    }
X    else {
X      if (target->uniqueness == COMMON) {
X	strcpy(Str1,"The ");
X	strcat(Str1,target->monstring);
X      }
X      else strcpy(Str1,target->monstring);
X      switch (dtype) {
X      case FLAME:strcat(Str1," was missed by a firebolt!");break;
X      case ELECTRICITY:strcat(Str1," was missed by lightning!");break;
X      case NORMAL_DAMAGE:strcat(Str1," was missed by a missile!"); break;
X      }
X      mprint(Str1);
X    }
X  }
X  else if (Level->site[xx][yy].locchar == HEDGE)
X    if (Level->site[xx][yy].p_locf == L_HEDGE) {
X      if ((dtype == FLAME)||(dtype == ELECTRICITY)) {
X	mprint("The hedge is blasted away!");
X	Level->site[xx][yy].p_locf = L_NO_OP;
X	Level->site[xx][yy].locchar = FLOOR;
X      }
X      else mprint("The hedge is unaffected.");
X    }
X    else mprint("The trifid absorbs the energy and laughs!");
X  else if (Level->site[xx][yy].locchar == WATER)
X    if (dtype == FLAME) {
X      mprint("The water is vaporised!");
X      Level->site[xx][yy].p_locf = L_NO_OP;
X      Level->site[xx][yy].locchar = FLOOR;
X    }
X}
X
X
Xvoid lball(fx,fy,tx,ty,dmg)
Xint fx,fy,tx,ty,dmg;
X{
X  ball(fx,fy,tx,ty,dmg,ELECTRICITY);
X}
X
Xvoid manastorm(x,y,dmg)
Xint x,y,dmg;
X{
X  ball(x,y,x,y,dmg,UNSTOPPABLE);
X}
X
Xvoid snowball(fx,fy,tx,ty,dmg)
Xint fx,fy,tx,ty,dmg;
X{
X  ball(fx,fy,tx,ty,dmg,COLD);
X}
X
Xvoid fball(fx,fy,tx,ty,dmg)
Xint fx,fy,tx,ty,dmg;
X{
X  ball(fx,fy,tx,ty,dmg,FLAME);
X}
X
X
X/* from f to t */
Xvoid ball(fx,fy,tx,ty,dmg,dtype)
Xint fx,fy,tx,ty,dmg,dtype;
X{
X  int xx,yy,ex,ey,i;
X  struct monster *target;
X  char expchar='@';
X
X  xx = fx; yy = fy;
X
X  switch(dtype){
X    case FLAME:expchar='*';break;
X    case COLD:expchar='o';break;
X    case ELECTRICITY:expchar='^';break;
X  }
X
X  do_los(expchar,&xx,&yy,tx,ty);
X  draw_explosion(expchar,xx,yy);
X  for(i=0;i<9;i++) {
X    ex = xx + Dirs[0][i];
X    ey = yy + Dirs[1][i];
X    
X    if ((ex == Player.x) && (ey == Player.y)) {
X      switch(dtype) {
X	case FLAME:mprint("You were blasted by a fireball!");
X	  p_damage(random_range(dmg),FLAME,"a fireball");
X	  break;
X	case COLD:mprint("You were blasted by a snowball!");
X	  p_damage(random_range(dmg),COLD,"a snowball");
X	  break;
X	case ELECTRICITY:mprint("You were blasted by ball lightning!");
X	  p_damage(random_range(dmg),ELECTRICITY,"ball lightning");
X	  break;
X	case UNSTOPPABLE:mprint("Oh No! Manastorm!");
X	  p_damage(random_range(dmg),UNSTOPPABLE,"a manastorm!");
X	  break;
X      }
X    }
X    else if (NULL != (target = Level->site[ex][ey].creature)) {
X      if (los_p(Player.x,Player.y,target->x,target->y)) {
X      if (target->uniqueness == COMMON) {
X	strcpy(Str1,"The ");
X	strcat(Str1,target->monstring);
X      }
X      else strcpy(Str1,target->monstring);
X	switch(dtype) {
X	  case FLAME:strcat(Str1," was zorched by a fireball!"); break;
X	  case COLD:strcat(Str1," was blasted by a snowball!"); break;
X	  case ELECTRICITY:strcat(Str1," was zapped by ball lightning!");break;
X	  case UNSTOPPABLE:strcat(Str1," was nuked by a manastorm!");break;
X	}
X	mprint(Str1);
X      }
X      m_status_set(target,HOSTILE);
X      m_damage(target,random_range(dmg),dtype);
X    }
X    else if (Level->site[ex][ey].locchar == HEDGE)
X      if (Level->site[ex][ey].p_locf == L_HEDGE) {
X	if ((dtype == FLAME)||(dtype == ELECTRICITY)) {
X	  mprint("The hedge is blasted away!");
X	  Level->site[ex][ey].p_locf = L_NO_OP;
X	  Level->site[ex][ey].locchar = FLOOR;
X	}
X	else mprint("The hedge is unaffected.");
X      }
X      else mprint("The trifid absorbs the energy and laughs!");
X    else if (Level->site[xx][yy].locchar == WATER)
X      if (dtype == FLAME) {
X	mprint("The water is vaporised!");
X	Level->site[xx][yy].p_locf = L_NO_OP;
X	Level->site[xx][yy].locchar = FLOOR;
X      }
X  }
X}
X
X
X
X
Xvoid mondet(blessing)
Xint blessing;    
X{
X  pml ml;
X  for (ml=Level->mlist;ml!=NULL;ml=ml->next) 
X    if (ml->m->hp > 0)
X      plotmon(blessing > -1 ? ml->m : &(Monsters[random_range(NUMMONSTERS)]));
X  levelrefresh();
X  morewait();
X  erase_level();
X  show_screen();
X}
X
X
Xvoid objdet(blessing)
Xint blessing;     
X{
X  int i,j;
X  for (i=0;i<WIDTH;i++)
X    for (j=0;j<LENGTH;j++) 
X      if (Level->site[i][j].things != NULL) {
X	if (blessing < 0)
X	  putspot(random_range(WIDTH),
X		  random_range(LENGTH),
X		  Level->site[i][j].things->thing->objchar);
X	else putspot(i,j,Level->site[i][j].things->thing->objchar);
X      }
X  levelrefresh();
X  morewait();
X  erase_level();
X  show_screen();
X}
X
Xvoid identify(blessing)
X{
X  int index;
X
X  clearmsg();
X
X  if (blessing == 0) {
X    print1("Identify:");
X    index = getitem(NULL);
X    if (index == CASHVALUE) print3("Your money is really money.");
X    else if (index == ABORT)
X      setgamestatus(SKIP_MONSTERS);
X    else {
X      if (Player.possessions[index]->objchar == FOOD)
X	Player.possessions[index]->known = 1;
X      else {
X	Player.possessions[index]->known = 2;
X	Objects[Player.possessions[index]->id].known = 1;
X      }
X      print1("Identified: ");
X      mprint(itemid(Player.possessions[index]));
X    }
X  }
X  else if (blessing < 0) {
X    print2("You feel forgetful.");
X    for (index=0;index<MAXITEMS;index++) 
X      if (Player.possessions[index] != NULL) {
X	Player.possessions[index]->known = 0;
X	Objects[Player.possessions[index]->id].known = 0;
X      }
X  }
X  else {
X    print2("You feel encyclopaedic.");
X    for (index=0;index<MAXITEMS;index++)
X      if (Player.possessions[index] != NULL) {
X	if (Player.possessions[index]->objchar == FOOD)
X	  Player.possessions[index]->known = 1;
X	else {
X	  Player.possessions[index]->known = 2;
X	  Objects[Player.possessions[index]->id].known = 1;
X	}
X      }
X    for (index=0;index<Player.packptr;index++)
X      if (Player.pack[index] != NULL) {
X	if (Player.pack[index]->objchar == FOOD)
X	  Player.pack[index]->known = 1;
X	else {
X	  Player.pack[index]->known = 2;
X	  Objects[Player.pack[index]->id].known = 1;
X	}
X      }
X  }
X  calc_melee();
X}
X
X
X
X
X/* returns index of random item, ABORT if player carrying none */
Xint random_item()
X{
X  int item,tries=0;
X  int done = FALSE;
X
X  for(tries=0;((tries<MAXITEMS)&&(!done));tries++) {
X    item = random_range(MAXITEMS);
X    done = (Player.possessions[item] != NULL);
X  }
X  return(done ? item : ABORT);
X}
X
X  
X/* various kinds of wishes */
Xvoid wish(blessing)
Xint blessing;
X{
X  int i;
X  char wishstr[80];
X  clearmsg();
X  print1("What do you wish for? ");
X  if (blessing < 0) deathprint();
X  strcpy(wishstr,msgscanstring());
X  if (strcmp(wishstr,"Death")==0) {
X    print2("As you wish, so shall it be.");
X    p_death("a deathwish");
X  }
X  if (strcmp(wishstr,"Power")==0) {
X    print2("You feel a sudden surge of energy");
X    Player.mana=calcmana()*10;
X  }
X  else if (strcmp(wishstr,"Skill")==0) {
X    print2("You feel more competent.");
X    gain_experience(min(10000,Player.xp));
X  }
X  else if (strcmp(wishstr,"Wealth")==0) {
X    print2("You are submerged in shower of gold pieces!");
X    Player.cash += 10000;
X  }
X  else if (strcmp(wishstr,"Balance")==0) {
X    print2("You feel neutral.");
X    Player.alignment = 0;
X  }
X  else if (strcmp(wishstr,"Chaos")==0) {
X    print2("You feel chaotic.");
X    Player.alignment -= 25;
X  }
X  else if (strcmp(wishstr,"Law")==0) {
X    print2("You feel lawful.");
X    Player.alignment += 25;
X  }
X  else if (strcmp(wishstr,"Location")==0)
X    strategic_teleport(1);
X  else if (strcmp(wishstr,"Knowledge")==0) {
X    print2("You feel more knowledgeable.");
X    i = random_range(NUMSPELLS);
X    if (Spells[i].known) 
X      Spells[i].powerdrain =
X	(max(1,Spells[i].powerdrain/2));
X    else Spells[i].known = TRUE;
X  }
X  else if (strcmp(wishstr,"Health")==0) {
X    print2("You feel vigorous");
X    Player.hp = Player.maxhp;
X    Player.status[DISEASED] = 0;
X    Player.status[POISONED] = 0;
X  }
X  else if (strcmp(wishstr,"Destruction")==0)
X    annihilate(gamestatusp(CHEATED));
X  else if (strcmp(wishstr,"Acquisition")==0)
X    acquire(gamestatusp(CHEATED));
X  else if (strcmp(wishstr,"Summoning")==0)
X    summon(gamestatusp(CHEATED),-1);
X  else print2("You feel stupid.");
X  dataprint();
X  showflags();
X}
X
X/* gain for an item */
Xvoid acquire(blessing)
Xint blessing;
X{
X  char otype;
X  int index,id = ABORT;
X  pob newthing;
X
X  if (blessing < 0) {
X    index = random_item();
X    if (index == ABORT)
X      mprint("You feel fortunate.");
X    else {
X      print1("Smoke drifts out of your pack.... ");
X      print2("Destroyed: ");
X      nprint2(itemid(Player.possessions[index]));
X      morewait();
X      dispose_lost_objects(1,Player.possessions[index]);
X    }
X  }
X  else if (blessing == 0) {
X    print1("You magically acquire an object!");
X    morewait();
X    newthing = ((pob) malloc(sizeof(objtype)));
X    *newthing = Objects[random_range(TOTALITEMS)];
X    newthing->used = FALSE;
X    gain_item(newthing);
X  }
X  else {
X    newthing = ((pob) malloc(sizeof(objtype)));
X    newthing->id = -1;
X    
X    print1("Acquire which kind of item: !?][}{)/=%%\\ ");
X    otype = mgetc();
X    nprint1("Item ID? ");
X    switch (otype) {
X    case POTION: 
X      id = itemlist(POTIONID,NUMPOTIONS);
X      if (id < 0) print2("You feel stupid."); 
X      else make_potion(newthing,id); 
X      break;
X    case SCROLL:
X      id = itemlist(SCROLLID,NUMSCROLLS);
X      if (id < 0) print2("You feel stupid."); 
X      else make_scroll(newthing,id); 
X      break;
X    case RING: 
X      id = itemlist(RINGID,NUMRINGS);
X      if (id < 0) print2("You feel stupid."); 
X      else make_ring(newthing,id); 
X      break;
X    case STICK:
X      id = itemlist(STICKID,NUMSTICKS);
X      if (id < 0) print2("You feel stupid."); 
X      else make_stick(newthing,id); 
X      break;
X    case ARMOR: 
X      id = itemlist(ARMORID,NUMARMOR);
X      if (id < 0) print2("You feel stupid."); 
X      else make_armor(newthing,id); 
X      break;
X    case SHIELD:
X      id = itemlist(SHIELDID,NUMSHIELDS);
X      if (id < 0) print2("You feel stupid."); 
X      else make_shield(newthing,id); 
X      break;
X    case WEAPON:
X      id = itemlist(WEAPONID,NUMWEAPONS);
X      if (id < 0) print2("You feel stupid."); 
X      else make_weapon(newthing,id); 
X      break;
X    case BOOTS:
X      id = itemlist(BOOTID,NUMBOOTS);
X      if (id < 0) print2("You feel stupid."); 
X      else make_boots(newthing,id); 
X      break;
X    case CLOAK: 
X      id = itemlist(CLOAKID,NUMCLOAKS);
X      if (id < 0) print2("You feel stupid."); 
X      else make_cloak(newthing,id); 
X      break;
X    case FOOD: 
X      id = itemlist(FOODID,NUMFOODS);
X      if (id < 0) print2("You feel stupid."); 
X      else make_food(newthing,id); 
X      break;
X    case THING:
X      id = itemlist(THINGID,10); /* crock to avoid grot*/
X      if (id < 0) print2("You feel stupid."); 
X      else make_thing(newthing,id); 
X      break;
X    }
X    xredraw();
X    if (id != ABORT) {
X      newthing->known = 2;
X      Objects[id].known = 1;
X      gain_item(newthing);
X    }
X  }
X}
END_OF_FILE
if test 17668 -ne `wc -c <'oeffect1.c'`; then
    echo shar: \"'oeffect1.c'\" unpacked with wrong size!
fi
# end of 'oeffect1.c'
fi
if test -f 'omaze1.dat' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'omaze1.dat'\"
else
echo shar: Extracting \"'omaze1.dat'\" \(287 characters\)
sed "s/^X//" >'omaze1.dat' <<'END_OF_FILE'
X"z"""""""""""""""""""""."...".....".".."...""..."."."-".".?".""".""""""."."?".".".".."."".......""".""".""...""-"""""."....."".""".""?".....".""""""?..".""""."."""."""""""".".""..."..?".""O?.....".""-"""""""."""""""""".""?..?"".".""""""."."."""""">?"-......."."?."""""""""""""""""""""""
END_OF_FILE
if test 287 -ne `wc -c <'omaze1.dat'`; then
    echo shar: \"'omaze1.dat'\" unpacked with wrong size!
fi
# end of 'omaze1.dat'
fi
if test -f 'ovillage.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'ovillage.c'\"
else
echo shar: Extracting \"'ovillage.c'\" \(6150 characters\)
sed "s/^X//" >'ovillage.c' <<'END_OF_FILE'
X/* omega copyright (C) by Laurence Raphael Brothers, 1987,1988 */
X/* ovillage.c */
X/* some functions to make the village levels */
X
X#include "oglob.h"
X
X
X/* loads the village level into Level*/
Xvoid load_village(villagenum)
Xint villagenum;
X{
X  int i,j;
X  char site;
X  
X  FILE *fd;
X  
X
X  TempLevel = Level;
X  if (ok_to_free(TempLevel)) {
X    free((char *) TempLevel);
X    TempLevel = NULL;
X  }
X
X  assign_village_function(0,0,TRUE);
X
X  Level = ((plv) malloc(sizeof(levtype)));
X  clear_level(Level);
X  Level->environment = E_VILLAGE;
X  strcpy(Str3,OMEGALIB);
X  switch(villagenum) {
X  case 1:strcat(Str3,"ovillage1.dat");break;
X  case 2:strcat(Str3,"ovillage2.dat");break;
X  case 3:strcat(Str3,"ovillage3.dat");break;
X  case 4:strcat(Str3,"ovillage4.dat");break;
X  case 5:strcat(Str3,"ovillage5.dat");break;
X  case 6:strcat(Str3,"ovillage6.dat");break;
X  }
X  fd = fopen(Str3,"r");
X  for(j=0;j<LENGTH;j++) {
X    for(i=0;i<WIDTH;i++) {
X      lset(i,j,SEEN);
X      site = getc(fd);
X      switch(site) {
X      case 'f':
X	Level->site[i][j].locchar = FLOOR;
X	make_food_bin(i,j);
X	break;
X      case 'g':
X	Level->site[i][j].locchar = FLOOR;
X	Level->site[i][j].p_locf = L_GRANARY;
X	break;
X      case 'h':
X	Level->site[i][j].locchar = FLOOR;
X	make_horse(i,j);
X	break;
X      case 'S':
X	Level->site[i][j].locchar = FLOOR;
X	Level->site[i][j].p_locf = L_STABLES;
X	break;
X      case 'H':
X	Level->site[i][j].locchar = FLOOR;
X	make_merchant(i,j);
X	break;
X      case 'C':
X	Level->site[i][j].locchar = FLOOR;
X	Level->site[i][j].p_locf = L_COMMONS;
X	break;
X      case 's':
X	Level->site[i][j].locchar = FLOOR;
X	make_sheep(i,j);
X	break;
X      case 'x':
X	assign_village_function(i,j,FALSE);
X	break;
X      case 'X':
X	Level->site[i][j].locchar = FLOOR;
X	Level->site[i][j].p_locf = L_COUNTRYSIDE;
X	break;
X      case 'G':
X	Level->site[i][j].locchar = FLOOR;
X	make_guard(i,j);
X	break;
X      case '^':
X	Level->site[i][j].locchar = FLOOR;
X	Level->site[i][j].p_locf = L_TRAP_SIREN;
X	break;
X      case '"':
X	Level->site[i][j].locchar = HEDGE;
X	Level->site[i][j].p_locf = L_HEDGE;
X	break;
X      case '~':
X	Level->site[i][j].locchar = WATER;
X	Level->site[i][j].p_locf = L_WATER;
X	break;
X      case '+':
X	Level->site[i][j].locchar = WATER;
X	Level->site[i][j].p_locf = L_CHAOS;
X	break;
X      case '\'':
X	Level->site[i][j].locchar = HEDGE;
X	Level->site[i][j].p_locf = L_TRIFID;
X	break;
X      case '!':
X	special_village_site(i,j,villagenum);
X	break;
X      case '#':
X	Level->site[i][j].locchar = WALL;
X	Level->site[i][j].aux = 100;
X	break;
X      default:
X	Level->site[i][j].p_locf = L_NO_OP;
X	Level->site[i][j].locchar = site;
X	break;
X      }
X      if (loc_statusp(i,j,SECRET))
X	Level->site[i][j].showchar = '#';
X      else Level->site[i][j].showchar = Level->site[i][j].locchar;
X    }
X    fscanf(fd,"\n");
X  }
X  fclose(fd);
X}
X
Xvoid make_guard(i,j)
Xint i,j;
X{
X  pml tml = ((pml) (malloc(sizeof(mltype))));
X  tml->m = (Level->site[i][j].creature = make_creature(ML0+3));
X  tml->m->x = i;
X  tml->m->y = j;
X  tml->next = Level->mlist;
X  Level->mlist = tml;
X}
X
Xvoid make_sheep(i,j)
Xint i,j;
X{
X  pml tml = ((pml) (malloc(sizeof(mltype))));
X  tml->m = (Level->site[i][j].creature = make_creature(SHEEP));
X  tml->m->x = i;
X  tml->m->y = j;
X  tml->next = Level->mlist;
X  Level->mlist = tml;
X}
X
Xvoid make_food_bin(i,j)
Xint i,j;
X{ 
X  pol tol;
X  int k;
X
X  for(k=0;k<10;k++) {
X    tol = ((pol) malloc(sizeof(oltype)));
X    tol->thing = ((pob) malloc(sizeof(objtype)));
X    make_food(tol->thing,15); /* grain */
X    tol->next = Level->site[i][j].things;
X    Level->site[i][j].things = tol;
X  }
X}
X
Xvoid make_horse(i,j)
Xint i,j;
X{
X  pml tml = ((pml) (malloc(sizeof(mltype))));
X  tml->m = (Level->site[i][j].creature = make_creature(HORSE));
X  tml->m->x = i;
X  tml->m->y = j;
X  tml->next = Level->mlist;
X  Level->mlist = tml;
X}
X
X
Xvoid make_merchant(i,j)
Xint i,j;
X{
X  pml tml = ((pml) (malloc(sizeof(mltype))));
X  tml->m = (Level->site[i][j].creature = make_creature(ML0+6));
X  tml->m->x = i;
X  tml->m->y = j;
X  tml->next = Level->mlist;
X  Level->mlist = tml;
X}
X
X
Xvoid assign_village_function(x,y,setup)
Xint x,y,setup;
X{
X  static int next=0;
X  static int permutation[24]; /* number of x's in village map */
X  int i,j,k;
X
X
X  if (setup) {
X    next = 0;
X    for(i=0;i<24;i++)
X      permutation[i] = i;
X    for(i=0;i<24;i++) {
X      j = permutation[i];
X      k = random_range(24);
X      permutation[i] = permutation[k];
X      permutation[k] = j;
X    }
X  }
X  else {
X
X    lset(x,y+1,STOPS);
X    lset(x+1,y,STOPS);
X    lset(x-1,y,STOPS);
X    lset(x,y-1,STOPS);
X    
X    
X    switch(permutation[next++]) {
X    case 0:
X      Level->site[x][y].locchar = OPEN_DOOR;
X      Level->site[x][y].p_locf = L_ARMORER;
X      break;
X    case 1:
X      Level->site[x][y].locchar = OPEN_DOOR;
X      Level->site[x][y].p_locf = L_HEALER;
X      break;
X    case 2: 
X      Level->site[x][y].locchar = OPEN_DOOR;
X      Level->site[x][y].p_locf = L_TAVERN;
X      break;
X    case 3:
X      Level->site[x][y].locchar = OPEN_DOOR;
X      Level->site[x][y].p_locf = L_COMMANDANT;
X      break;
X    case 4:
X      Level->site[x][y].locchar = OPEN_DOOR;
X      Level->site[x][y].p_locf = L_CARTOGRAPHER;
X      break;
X    default:
X      Level->site[x][y].locchar = CLOSED_DOOR;
X      if (random_range(2))
X	Level->site[x][y].p_locf = L_HOVEL;
X      if (random_range(2)) 
X	Level->site[x][y].aux = LOCKED;
X      else Level->site[x][y].p_locf = L_HOUSE;
X      break;
X    }
X  }
X}  
X  
X
Xvoid special_village_site(i,j,villagenum)
Xint i,j,villagenum;
X{
X  if (villagenum == 1) {
X    Level->site[i][j].locchar = ALTAR;
X    Level->site[i][j].p_locf = L_LAWSTONE;
X  }
X  if (villagenum == 2) {
X    Level->site[i][j].locchar = ALTAR;
X    Level->site[i][j].p_locf = L_BALANCESTONE;
X  }
X  else if (villagenum == 3) {
X    Level->site[i][j].locchar = ALTAR; 
X    Level->site[i][j].p_locf = L_CHAOSTONE; 
X  }
X  else if (villagenum == 4) {
X    Level->site[i][j].locchar = ALTAR; 
X    Level->site[i][j].p_locf = L_VOIDSTONE; 
X  }
X  else if (villagenum == 5) {
X    Level->site[i][j].locchar = ALTAR; 
X    Level->site[i][j].p_locf = L_SACRIFICESTONE; 
X  }
X  else if (villagenum == 6) {
X    Level->site[i][j].locchar = ALTAR; 
X    Level->site[i][j].p_locf = L_MINDSTONE; 
X  }
X}
END_OF_FILE
if test 6150 -ne `wc -c <'ovillage.c'`; then
    echo shar: \"'ovillage.c'\" unpacked with wrong size!
fi
# end of 'ovillage.c'
fi
echo shar: End of archive 10 \(of 19\).
cp /dev/null ark10isdone
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