[comp.sources.games] v07i033: omega3 - rogue like dungeon exploration

billr@saab.CNA.TEK.COM (Bill Randle) (07/14/89)

Submitted-by: "Laurence R. Brothers"   <brothers@paul.rutgers.edu>
Posting-number: Volume 7, Issue 33
Archive-name: omega3/Part14
Supersedes: omega2: Volume 5, Issue 12-29,38-40



#! /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 14 (of 20)."
# Contents:  oeffect2.c oextern.h ospell.c oupdate.txt
# Wrapped by billr@saab on Thu Jun 29 08:14:09 1989
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f 'oeffect2.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'oeffect2.c'\"
else
echo shar: Extracting \"'oeffect2.c'\" \(16789 characters\)
sed "s/^X//" >'oeffect2.c' <<'END_OF_FILE'
X/* omega copyright (C) by Laurence Raphael Brothers, 1987,1988,1989 */
X/* oeffect2.c */
X
X#include "oglob.h"
X
X
X
Xvoid knowledge(blessing)
Xint blessing;
X{
X  if (blessing < 0)
X    mprint("You feel ignorant.");
X  else {
X    mprint("You feel knowledgeable!");
X    menuclear();
X    menuprint("Current Point Total: ");
X    menunumprint(calc_points());
X    menuprint("\nAlignment:");
X    if (Player.alignment == 0)
X      menuprint("Neutral, embodying the Cosmic Balance");
X    else if (abs(Player.alignment) < 10)
X      menuprint("Neutral, tending toward ");
X    else if (abs(Player.alignment) < 50)
X      menuprint("Neutral-");
X    else if (abs(Player.alignment) < 100) ;
X    else if (abs(Player.alignment) < 200)
X      menuprint("Servant of ");
X    else if (abs(Player.alignment) < 400)
X      menuprint("Master of ");
X    else if (abs(Player.alignment) < 800)
X      menuprint("The Essence of ");
X    else menuprint("The Ultimate Avatar of ");
X    if (Player.alignment < 0) menuprint("Chaos\n");
X    else if (Player.alignment > 0) menuprint("Law\n");
X    morewait();
X    menuclear();
X    menuprint("Current stati:\n");
X    if (Player.status[BLINDED])
X      menuprint("Blinded\n");
X    if (Player.status[SLOWED])
X      menuprint("Slowed\n");
X    if (Player.status[HASTED])
X      menuprint("Hasted\n");
X    if (Player.status[DISPLACED])
X      menuprint("Displaced\n");
X    if (Player.status[SLEPT])
X      menuprint("Slept\n");
X    if (Player.status[DISEASED])
X      menuprint("Diseased\n");
X    if (Player.status[POISONED])
X      menuprint("Poisoned\n");
X    if (Player.status[BREATHING])
X      menuprint("Breathing\n");
X    if (Player.status[INVISIBLE])
X      menuprint("Invisible\n");
X    if (Player.status[REGENERATING])
X      menuprint("Regenerating\n");
X    if (Player.status[VULNERABLE])
X      menuprint("Vulnerable\n");
X    if (Player.status[BERSERK])
X      menuprint("Berserk\n");
X    if (Player.status[IMMOBILE])
X      menuprint("Immobile\n");
X    if (Player.status[ALERT])
X      menuprint("Alert\n");
X    if (Player.status[AFRAID])
X      menuprint("Afraid\n");
X    if (Player.status[ACCURATE])
X      menuprint("Accurate\n");
X    if (Player.status[HERO])
X      menuprint("Heroic\n");
X    if (Player.status[LEVITATING])
X      menuprint("Levitating\n");
X    morewait();
X    menuclear();
X    menuprint("Immunities:\n");
X    if (p_immune(NORMAL_DAMAGE))
X      menuprint("Normal Damage\n");
X    if (p_immune(FLAME))
X      menuprint("Flame\n");
X    if (p_immune(ELECTRICITY))
X      menuprint("Electricity\n");
X    if (p_immune(COLD))
X      menuprint("Cold\n");
X    if (p_immune(POISON))
X      menuprint("Poison\n");
X    if (p_immune(ACID))
X      menuprint("Acid\n");
X    if (p_immune(FEAR))
X      menuprint("Fear\n");
X    if (p_immune(SLEEP))
X      menuprint("Sleep\n");
X    if (p_immune(NEGENERGY))
X      menuprint("Negative Energies\n");
X    if (p_immune(THEFT))
X      menuprint("Theft\n");
X    if (p_immune(GAZE))
X      menuprint("Gaze\n");
X    if (p_immune(INFECTION))
X      menuprint("Infection\n");
X    morewait();
X    menuclear();
X    menuprint("Ranks:\n");
X    switch(Player.rank[LEGION]) {
X    case COMMANDANT:
X      menuprint("Commandant of the Legion"); 
X      break;
X    case COLONEL:    
X      menuprint("Colonel of the Legion");
X      break;
X    case FORCE_LEADER:
X      menuprint("Force Leader of the Legion");
X      break;
X    case CENTURION:
X      menuprint("Centurion of the Legion");
X      break;
X    case LEGIONAIRE:
X      menuprint("Legionaire");
X      break;
X    }
X    if (Player.rank[LEGION] > 0) {
X      menuprint(" (");
X      menunumprint(Player.guildxp[LEGION]);
X      menuprint(" XP).\n");
X    }
X    switch(Player.rank[ARENA]) {
X    case -1:
X      menuprint("Ex-gladiator\n");
X      break;
X    case CHAMPION:
X      menuprint("Gladiator Champion");
X      break;
X    case GLADIATOR:    
X      menuprint("Gladiator of the Arena");
X      break;
X    case RETIARIUS:
X      menuprint("Retiarius of the Arena");
X      break;
X    case BESTIARIUS:
X      menuprint("Bestiarius of the Arena");
X      break;
X    case TRAINEE:
X      menuprint("Gladiator Trainee of the Arena");
X      break;
X    }
X    if (Player.rank[ARENA] > 0) {
X      menuprint(" (Opponent ");
X      menunumprint(Arena_Opponent);
X      menuprint(")\n");
X    }
X    switch(Player.rank[COLLEGE]) {
X    case ARCHMAGE:
X      menuprint("Archmage of the Collegium Magii");
X      break;
X    case MAGE:
X      menuprint("Collegium Magii: Mage");
X      break;
X    case PRECEPTOR:
X      menuprint("Collegium Magii: Preceptor");
X      break;
X    case STUDENT:
X      menuprint("Collegium Magii: Student");
X      break;
X    case NOVICE:
X      menuprint("Collegium Magii: Novice");
X      break;
X    }
X    if (Player.rank[COLLEGE] > 0) {
X      menuprint(" (");
X      menunumprint(Player.guildxp[COLLEGE]);
X      menuprint(" XP).\n");
X    }
X    switch(Player.rank[NOBILITY]) {
X    case DUKE:
X      menuprint("Duke of Rampart");
X      break;
X    case LORD:
X      menuprint("Peer of the Realm");
X      break;
X    case KNIGHT:
X      menuprint("Order of the Knights of Rampart");
X      break;
X    case ESQUIRE:
X      menuprint("Squire of Rampart");
X      break;
X    case COMMONER:
X      menuprint("Commoner");
X      break;
X    default:
X      menuprint("Lowly Commoner\n");
X      break;
X    }
X    if (Player.rank[NOBILITY] > 0) {
X      menuprint(" (");
X      menunumprint(Player.rank[NOBILITY]);
X      menuprint(ordinal(Player.rank[NOBILITY]));
X      menuprint(" Quest Completed)\n");
X    }
X    switch(Player.rank[CIRCLE]) {
X    case -1:
X      menuprint("Former member of the Circle.\n");
X      break;
X    case PRIME:
X      menuprint("Prime Sorceror of the Inner Circle");
X      break;
X    case HIGHSORCEROR:
X      menuprint("High Sorceror of the Inner Circle");
X      break;
X    case SORCEROR:
X      menuprint("Member of the Circle of Sorcerors");
X      break;
X    case ENCHANTER:
X      menuprint("Member of the Circle of Enchanters");
X      break;
X    case INITIATE:
X      menuprint("Member of the Circle of Initiates");
X      break;
X    }
X    if (Player.rank[CIRCLE] > 0) {
X      menuprint(" (");
X      menunumprint(Player.guildxp[CIRCLE]);
X      menuprint(" XP).\n");
X    }
X    switch(Player.rank[ORDER]) {
X    case -1:
X      menuprint("Washout from the Order of Paladins\n");
X    case JUSTICIAR:
X      menuprint("Justiciar of the Order of Paladins");
X      break;
X    case PALADIN:
X      menuprint("Paladin of the Order");
X      break;
X    case CHEVALIER:
X      menuprint("Chevalier of the Order");
X      break;
X    case GUARDIAN:
X      menuprint("Guardian of the Order");
X      break;
X    case GALLANT:
X      menuprint("Gallant of the Order");
X      break;
X    }
X    if (Player.rank[ORDER] > 0) {
X      menuprint(" (");
X      menunumprint(Player.guildxp[ORDER]);
X      menuprint(" XP).\n");
X    }
X    switch(Player.rank[THIEVES]) {
X    case SHADOWLORD:
X      menuprint("Guild of Thieves: Shadowlord");
X      break;
X    case TMASTER:
X      menuprint("Guild of Thieves: Master Thief");
X      break;
X    case THIEF:
X      menuprint("Guild of Thieves: Thief");
X      break;
X    case ATHIEF:
X      menuprint("Guild of Thieves: Apprentice Thief");
X      break;
X    case TMEMBER:
X      menuprint("Guild of Thieves: Candidate Member");
X      break;
X    }
X    if (Player.rank[THIEVES] > 0) {
X      menuprint(" (");
X      menunumprint(Player.guildxp[THIEVES]);
X      menuprint(" XP).\n");
X    }
X    switch(Player.rank[PRIESTHOOD]) {
X      case LAY:
X        menuprint("A lay devotee of ");
X	break;
X      case ACOLYTE:
X        menuprint("An Acolyte of ");
X	break;
X      case PRIEST:
X        menuprint("A Priest of ");
X	break;
X      case SPRIEST:
X        menuprint("A Senior Priest of ");
X	break;
X      case HIGHPRIEST:
X        menuprint("The High Priest of ");
X	break;
X      }
X    switch(Player.patron) {
X      case ODIN:
X        menuprint("Odin");
X	break;
X      case SET:
X        menuprint("Set");
X	break;
X      case ATHENA:
X        menuprint("Athena");
X	break;
X      case HECATE:
X        menuprint("Hecate");
X	break;
X      case DRUID:
X        menuprint("Druidism");
X	break;
X      case DESTINY:
X        menuprint("the Lords of Destiny");
X	break;
X    }
X    if (Player.rank[PRIESTHOOD] > 0) {
X      menuprint(" (");
X      menunumprint(Player.guildxp[PRIESTHOOD]);
X      menuprint(" XP).\n");
X    }
X    if (Player.rank[ADEPT] > 0) 
X      menuprint("**************\n*Omegan Adept*\n**************\n");
X    morewait();
X    xredraw();
X  }
X}
X
X
X/* Recreates the current level */
Xvoid flux(blessing)
Xint blessing;
X{
X  mprint("The universe warps around you!");
X  if (Current_Environment == E_CITY) {
X    mprint("Sensing dangerous high order magic, the Collegium Magii");
X    mprint("and the Circle of Sorcerors join forces to negate the spell.");
X    mprint("You are zapped by an antimagic ray!!!");
X    dispel(-1);
X    mprint("The universe unwarps itself....");
X  }
X  else if (Current_Environment != Current_Dungeon)
X    mprint("Odd.... No effect!");
X  else {
X    mprint("You stagger as the very nature of reality warps!");
X    erase_level();
X    Level->generated = FALSE;
X    mprint("The fabric of spacetime reknits....");
X    change_level(Level->depth-1,Level->depth,TRUE);
X  }
X}
X
X/*Turns on displacement status for the player */
Xvoid displace(blessing)
Xint blessing;
X{
X  if (blessing > -1) {
X      mprint("You feel a sense of dislocation.");
X      Player.status[DISPLACED] = blessing + random_range(6);
X    }
X  else {
X    mprint("You feel vulnerable");
X    Player.status[VULNERABLE] += random_range(6) - blessing;
X  }
X}
X
X  
X	
Xvoid invisible(blessing)
Xint blessing;
X{  
X  if (blessing > -1) {
X    mprint("You feel transparent!");
X    Player.status[INVISIBLE]+= 2+5*blessing;
X  }
X  else {
X    mprint("You feel dangerous!");
X    Player.status[VULNERABLE] +=
X      random_range(10)+1;
X  }
X}
X
X
Xvoid warp(blessing)
Xint blessing;
X{
X  int newlevel;
X  if (Current_Environment != Current_Dungeon) 
X    mprint("How strange! No effect....");
X  else {
X    if (blessing > -1) {
X      mprint("Warp to which level? ");
X      newlevel = parsenum();
X    }
X    if (newlevel >= MaxDungeonLevels) {
X      mprint("You have been deflected!");
X      newlevel=random_range(MaxDungeonLevels);
X    }
X    mprint("You dematerialize...");
X    change_level(Level->depth,newlevel,FALSE);
X  }
X  roomcheck();
X}
X
Xvoid alert(blessing)
X int blessing;
X{
X  if (blessing > -1) {
X    mprint("You feel a sense of insomnia.");
X    Player.status[ALERT]+= 4+(5*blessing);
X  }
X  else sleep_player(abs(blessing)+3);
X}
X
Xvoid regenerate(blessing)
Xint blessing;
X{
X  if (blessing < 0)
X    heal(blessing * 10);
X  else {
X    mprint("You feel abnormally healthy.");
X    Player.status[REGENERATING] += (blessing+1)*50;
X  }
X}
X
Xvoid haste(blessing)
Xint blessing;
X{
X  if (blessing > -1) {
X    if (! Player.status[HASTED]) 
X      mprint("The world slows down!"); 
X    else mprint("Nothing much happens.");
X    if (Player.status[SLOWED]) 
X      Player.status[SLOWED] = 0;
X    Player.status[HASTED] += (blessing*100)+random_range(250);
X  }
X  else {
X    mprint("You feel slower.");
X    if (Player.status[HASTED] > 0) mprint("...but the feeling quickly fades.");
X    else Player.status[SLOWED] += random_range(250)+250;
X  }
X}
X
X
Xvoid recover_stat(blessing)
Xint blessing;
X{
X  if (blessing < 0) {
X    mprint("You feel a cold surge!");
X    switch(random_range(6)) {
X      case 0: Player.str = min(Player.str-1,Player.maxstr-1); break;
X      case 1: Player.con = min(Player.con-1,Player.maxcon-1); break;
X      case 2: Player.dex = min(Player.dex-1,Player.maxdex-1); break;
X      case 3: Player.agi = min(Player.agi-1,Player.maxagi-1); break;
X      case 4: Player.iq = min(Player.iq-1,Player.maxiq-1); break;
X      case 5: Player.pow = min(Player.pow-1,Player.maxpow-1); break;
X    }
X  }
X  else {
X    mprint("You feel a warm tingle!");
X    Player.str = max(Player.str,Player.maxstr);
X    Player.con = max(Player.con,Player.maxcon);
X    Player.dex = max(Player.dex,Player.maxdex);
X    Player.agi = max(Player.agi,Player.maxagi);
X    Player.iq = max(Player.iq,Player.maxiq);
X    Player.pow = max(Player.pow,Player.maxpow);
X    }
X  calc_melee();
X}
X
Xvoid augment(blessing)
Xint blessing;
X{
X  if (blessing < 0) {
X    mprint("You feel a cold surge!");
X    switch(random_range(6)) {
X      case 0: Player.str = min(Player.str-1,Player.maxstr-1); break;
X      case 1: Player.con = min(Player.con-1,Player.maxcon-1); break;
X      case 2: Player.dex = min(Player.dex-1,Player.maxdex-1); break;
X      case 3: Player.agi = min(Player.agi-1,Player.maxagi-1); break;
X      case 4: Player.iq = min(Player.iq-1,Player.maxiq-1); break;
X      case 5: Player.pow = min(Player.pow-1,Player.maxpow-1); break;
X    }
X  }
X  else if (blessing == 0) {
X    mprint("You feel a warm tingle!");
X    switch(random_range(6)) {
X      case 0: Player.str = max(Player.str+1,Player.maxstr+1); break;
X      case 1: Player.con = max(Player.con+1,Player.maxcon+1); break;
X      case 2: Player.dex = max(Player.dex+1,Player.maxdex+1); break;
X      case 3: Player.agi = max(Player.agi+1,Player.maxagi+1); break;
X      case 4: Player.iq = max(Player.iq+1,Player.maxiq+1); break;
X      case 5: Player.pow = max(Player.pow+1,Player.maxpow+1); break;
X    }
X  }
X  else {
X    mprint("You feel a hot flash!");
X    Player.str = max(Player.str+1,Player.maxstr+1);
X    Player.con = max(Player.con+1,Player.maxcon+1);
X    Player.dex = max(Player.dex+1,Player.maxdex+1);
X    Player.agi = max(Player.agi+1,Player.maxagi+1);
X    Player.iq = max(Player.iq+1,Player.maxiq+1);
X    Player.pow = max(Player.pow+1,Player.maxpow+1);
X  }
X  calc_melee();
X}
X
Xvoid breathe(blessing)
Xint blessing;
X{
X  if (blessing > -1) {
X      mprint("Your breath is energized!");
X      Player.status[BREATHING] += 6+blessing;
X    }
X  else {
X    mprint("You choke as your lungs fill with water!");
X    p_damage(50,UNSTOPPABLE,"drowning");
X  }
X}
X
X
Xvoid i_chaos(o)
Xpob o;
X{
X  if (Player.alignment < 0) {
X    Player.alignment -= random_range(20);
X    mprint("You feel deliciously chaotic!");
X    gain_experience(abs(Player.alignment)*10);
X  }
X  else {
X    mprint("You feel a sense of inner turmoil!");
X    Player.alignment -= random_range(20);
X  }
X}
X
Xvoid i_law(o)
Xpob o;
X{
X  if (Player.alignment > 0) {
X    Player.alignment += random_range(20);
X    mprint("You feel wonderfully lawful!");
X    gain_experience(Player.alignment*10);
X  }
X  else {
X    mprint("You feel a sense of inner constraint!");
X    Player.alignment += random_range(20);
X  }
X}
X
Xvoid sanctify(blessing)
Xint blessing;
X{
X  if (blessing > -1) {
X    if (Level->environment == E_TEMPLE) 
X      mprint("Odd, the spell has no effect. I wonder why.");
X    else if (Level->site[Player.x][Player.y].locchar == ALTAR) 
X      mprint("This site can't get any holier!");
X    else if (Player.patron == 0) {
X      mprint("The gods are angered!");
X      Level->site[Player.x][Player.y].locchar = LAVA;
X      Level->site[Player.x][Player.y].p_locf = L_LAVA;
X      p_movefunction(L_LAVA);
X    }
X    else {
X      Level->site[Player.x][Player.y].locchar = ALTAR;
X      Level->site[Player.x][Player.y].aux = Player.patron;
X      Level->site[Player.x][Player.y].p_locf = L_ALTAR;
X      mprint("You are standing on sacred ground!");
X    }
X  }
X  else {
X    if (Level->site[Player.x][Player.y].locchar == ALTAR) {
X      mprint("The altar crumbles before your unholy blast....");
X      Level->site[Player.x][Player.y].locchar = FLOOR;
X      Level->site[Player.x][Player.y].p_locf = L_NO_OP;
X      if (Level->site[Player.x][Player.y].aux == Player.patron) {
X	mprint("Your deity is not amused....");
X	p_damage(Player.hp-1,UNSTOPPABLE,"Divine Wrath");
X      }
X      else if ((Player.patron == ATHENA) || (Player.patron == ODIN)) {
X	if ((Level->site[Player.x][Player.y].aux == SET) ||
X	    (Level->site[Player.x][Player.y].aux == HECATE)) {
X	  mprint("Your deity applauds the eradication of Chaos' taint");
X	  gain_experience(1000);
X	}
X	else {
X	  mprint("Your deity approves of your action.");
X	  gain_experience(100);
X	}
X      }
X      if ((Player.patron == SET) || (Player.patron == HECATE)) {
X	if ((Level->site[Player.x][Player.y].aux == ODIN) ||
X	    (Level->site[Player.x][Player.y].aux == ATHENA)) {
X	  mprint("Your deity applauds the obliteration of Law");
X	  gain_experience(1000);
X	}
X	else {
X	  mprint("Your deity approves of your action.");
X	  gain_experience(100);
X	}
X      }
X      else if (Player.patron == DRUID) {
X	mprint("Your attempt to maintain the Balance is applauded....");
X	gain_experience(250);
X      }
X      else mprint("Nothing much happens");
X    }
X    else mprint("You feel an aura of unholiness arising from this spot....");
X  }
X}
X
Xvoid accuracy(blessing)
Xint blessing;
X{
X  if (blessing > -1) {
X      mprint("Everything seems covered in bullseyes!");
X      Player.status[ACCURACY] += random_range(5)+1+blessing*5;
X      calc_melee();
X    }
X  else {
X    Player.status[ACCURACY]=0;
X    calc_melee();
X    mprint("Your vision blurs...");
X  }
X}
END_OF_FILE
if test 16789 -ne `wc -c <'oeffect2.c'`; then
    echo shar: \"'oeffect2.c'\" unpacked with wrong size!
fi
# end of 'oeffect2.c'
fi
if test -f 'oextern.h' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'oextern.h'\"
else
echo shar: Extracting \"'oextern.h'\" \(16657 characters\)
sed "s/^X//" >'oextern.h' <<'END_OF_FILE'
X/* omega copyright (c) 1987,1988,1989 by Laurence Raphael Brothers */
X/* oextern.h -- function declarations */
X
X/* o.c functions */
Xvoid initrand(),inititem(),init_world();
Xint game_restore(),signalexit(),main();
X
X
X/* oabyss functions */
Xvoid load_abyss();
X
X
X/* oaux1 and oaux3 functions */
Xvoid pickup_at(),setspot(),foodcheck(),p_death(),hourly_check();
X#ifndef MSDOS
Xvoid calc_melee(),gain_experience(),p_damage(),minute_check();
X#else
Xvoid calc_melee(),p_damage(),minute_check();
Xvoid gain_lexperience();
X#endif
Xvoid p_process(),p_teleport(),tacplayer(),roomcheck(),tunnelcheck();
Xvoid searchat(),showroom(),weapon_use(),damage_item(),tacmode();
Xvoid hand_wield(),optionset(),optionreset(),describe_player();
Xvoid lightroom(),surrender(),threaten(),darkenroom(),fight_monster();
Xvoid indoors_random_event(),outdoors_random_event(),tenminute_check();
Xchar getlocation(),*itemid(),*mstatus_string(),*trapid(),*levelname();
Xint p_moveable(),cursed(),getdir(),optionp(),goberserk();
Xint player_on_sanctuary(),maneuvers();
X
X
X/* oaux2 and oaux3 functions */
Xchar *actionlocstr();
Xvoid break_weapon(),drop_weapon(),moon_check(),toggle_item_use();
Xvoid p_fumble(),p_win(),p_hit(),player_miss(),addring(),torch_check();
Xvoid top_level(),printactions(),movecursor(),p_drown(),enter_site();
Xvoid tacexecute(),weapon_use(),minute_status_check(),tenminute_status_check();
Xvoid expandsiteabbrev(),gain_level(),terrain_check();
Xvoid countrysearch(),default_maneuvers(),alert_guards();
X#ifndef MSDOS
Xint expval(),player_hit(),statmod(),item_value(),true_item_value();
X#else
Xlong expval(),item_value(),true_item_value();
Xint player_hit(),statmod();
X#endif
Xint parsecitysite(),expandsite(),hostilemonstersnear(),magic_resist();
Xchar *countryid(),*citysiteid();
X
X/* ochar functions */
Xvoid initplayer(),initstats(),save_omegarc(),omegan_character_stats();
Xvoid user_character_stats();
X#ifndef MSDOS
Xint calcmana(),fixnpc(),competence_check();
X#else
Xlong calcmana();
Xint fixnpc(),competence_check();
X#endif
XFILE *omegarc_check();
X
X
X/* ocity functions */
Xvoid load_city(),randommazesite(),assign_city_function(),make_justiciar();
Xvoid resurrect_guards(),mazesite(),make_minor_undead(),make_major_undead();
Xvoid repair_jail();
X
X/* ocom1 functions */
Xvoid p_country_process(),p_process();
X
X/* ocom3 and ocom2 functions */
Xvoid pickup(),drop(),magic(),disarm(),save(),restore();
Xvoid inventory(),opendoor(),closedoor(),fire(),fight(),city_move();
Xvoid eat(),version(),nap(),vault(),bash_item(),frobgamestatus();
Xvoid search(),peruse(),quaff(),talk(),bash_location(),wizard();
Xvoid give(),rest(),examine(),help();
Xvoid zapwand(),floor_inv(),callitem(), charid();
Xvoid moveplayer(),upstairs(),downstairs(),setoptions(),activate();
Xvoid pickpocket(),rename_player(),abortshadowform(),tunnel();
Xvoid change_environment();
Xvoid movepincountry(),tacoptions(),hunt(),dismount_steed();
Xint quit();
X
X/* oeffect1 functions */
Xvoid bless(),identify(),bolt(),ball(),amnesia(),p_poison();
Xvoid heal(),mondet(),objdet(),enchant(),wish(),manastorm();
Xvoid acquire(),cleanse(),annihilate(),sleep_monster(),apport();
Xvoid sleep_player(),summon(),hide(),clairvoyance(),aggravate();
Xvoid fbolt(),lbolt(),lball(),fball(),nbolt(),learnspell(),level_drain();
Xvoid disintegrate(),disrupt(),snowball(),p_teleport(),acid_cloud();
Xvoid strategic_teleport();
Xint random_item(),itemlist(),monsterlist();
X
X
X/* oeffect2 functions */
Xvoid knowledge(),flux(),displace(),breathe(),invisible(),warp(),alert();
Xvoid haste(),regenerate(),recover_stat(),augment(),truesight(),disease();
Xvoid i_chaos(),i_law(),sanctify(),hero(),level_return(),cure(),dispel();
Xvoid polymorph(),hellfire(),illuminate(),drain_life(),drain();
Xvoid inflict_fear(),levitate(),accuracy(),sanctuary(),shadowform();
Xvoid invulnerable(),deflection();
X
X/* oetc functions */
Xvoid hint(),learnclericalspells(),add_new_npc();
Xchar *slotstr(),*wordnum(),*nameprint();
X
X
X/* ofile functions */
Xvoid commandlist(),helpfile(),showfile(),showscores(),showmotd();
Xvoid extendlog(),filescanstring(),checkhigh(),user_intro();
Xvoid theologyfile(),cityguidefile(),combat_help(),inv_help();
Xvoid abyss_file(),wishfile(),adeptfile(),copyfile(),displayfile();
Xint filecheck();
XFILE *checkfopen();
X
X
X/* ogen functions */
Xint loc_statusp(),mazeok();
Xvoid lset(),lreset(),load_arena(),make_country_screen(),room_corridor();
Xvoid clear_level(),create_level(),build_square_room(),build_diamond_room();
Xvoid connect_room(),corridor_crawl(),build_room(),sewer_corridor();
Xvoid clear_dungeon(),init_dungeon(),install_traps(),straggle_corridor();
Xvoid room_connect_corridor(),sewer_level(),room_level(),make_prime();
Xvoid change_level(),cavern_level(),makedoor(),make_archmage();
Xvoid maze_level(),maze_corridor();
Xvoid install_specials(),make_stairs();
Xvoid make_plains(),make_road(),make_forest(),make_jungle();
Xvoid make_river(),make_swamp(),make_mountains(),load_circle(),load_court();
Xvoid find_stairs();
Xchar *roomname();
Xplv findlevel();
X
X/* outil functions */
X#ifndef MSDOS
Xint inbounds(),random_range(),hitp(),sign(),max(),min(),distance();
X#else
Xint inbounds(),random_range(),hitp(),distance();
X#endif
X#ifndef MSDOS
Xint unblocked(),los_p(),screenmod(),offscreen(),calc_points();
X#else
Xint unblocked(),los_p(),screenmod(),offscreen();
Xlong calc_points();
X#endif
Xint bitp(),nighttime(),hour(),showhour(),day(),showminute();
Xint view_unblocked(),m_unblocked(),strmem();
X#ifndef MSDOS
Xint view_los_p(),confirmation(),gamestatusp();
X#else
Xint view_los_p(),confirmation();
Xlong gamestatusp();
X#endif
Xchar inversedir(),*getarticle(),*ordinal(),*month(),*salloc();
Xvoid initdirs(),do_los(),do_object_los(),bitset(),bitreset();
Xvoid findspace(),setgamestatus(),resetgamestatus(),calc_weight();
X
X
X/* otime functions */
Xvoid time_clock();
X
X
X/* ospell functions */
Xvoid s_firebolt(),s_lball(),s_sleep(),s_objdet(),s_mondet(),s_identify();
Xvoid s_teleport(),s_disrupt(),s_disintegrate(),s_missile();
Xvoid s_heal(),s_dispel(),s_breathe(),s_invisible(),s_warp(),s_enchant();
Xvoid s_bless(),s_truesight(),s_hellfire(),s_knowledge(),s_hero();
Xvoid s_restore(),s_cure(),s_return(),s_desecrate(),s_summon();
Xvoid s_accuracy(),s_ritual(),s_apport(),s_shadowform(),s_alert();
Xvoid s_regenerate(),s_sanctify(),s_clairvoyance(),s_drain(),s_polymorph();
Xvoid s_invulnerable(),cast_spell(),s_fear(),s_wish();
Xvoid initspells(),expandspellabbrevs();
Xint getspell(),expandspell();
Xchar *spellid();
X
X
X/* osite functions */
Xvoid l_temple(),l_armorer(),l_club(),l_gym(),sign_print(),l_castle();
Xvoid l_healer(),statue_random(),l_statue_wake(),l_casino(),l_bank();
Xvoid l_sewer(),l_tavern(),l_alchemist(),l_vault(),l_oracle(),l_commandant();
Xvoid l_countryside(),l_dpw(),l_library(),l_pawn_shop(),l_diner();
Xvoid l_condo(),l_cemetary(),l_garden(),l_house(),l_hovel(),l_mansion();
Xvoid l_jail(),l_adept(),l_trifid(),l_warning(),l_brothel(),l_crap();
Xvoid l_safe(),l_cartographer(),l_charity(),l_mindstone();
Xvoid healforpay(),cureforpay(),gymtrain(),buyfromstock(),wake_statue();
Xvoid send_to_jail();
X
X
X/* oscr functions */     
Xvoid redraw(),drawspot(),drawvision(),morewait(),drawmonsters(),locprint();
Xvoid mprint(),title(),sitclear(),initgraf(),xredraw(),erase_monster();
Xvoid plotchar(),show_screen(),blankoutspot(),show_license(),phaseprint();
X#ifndef MSDOS
Xvoid menuclear(),showcursor(),mnumprint(),menunumprint(),display_pack();
X#else
Xvoid menuclear(),showcursor(),display_pack();
Xvoid mlongprint(),menulongprint();
X#endif
Xvoid clearmsg(),menuprint(),print3(),nprint3(),print1(),print2(),nprint1();
Xvoid clearmsg1(),clearmsg3(),commanderror(),nprint2(),deathprint();
Xvoid stdmorewait(),draw_explosion(),dataprint(),comwinprint(),timeprint();
Xvoid erase_level(),levelrefresh(),display_options(),display_option_slot();
Xvoid refreshmsg(),menuaddch(),drawscreen(),maddch(),putspot(),checkclear();
Xvoid display_quit(),showflags(),spreadroomdark(),display_win();
Xvoid drawplayer(),displaystats(),display_death(),plotmon(),display_bigwin();
Xvoid dobackspace(),drawandrefreshspot(),spreadroomlight(),bufferprint();
Xvoid drawomega(),screencheck(),blotspot(),plotspot(),dodrawspot();
Xvoid display_inventory_slot(),endgraf(),menuspellprint(),hide_line();
Xvoid display_possessions(),clear_if_necessary(),buffercycle(),lightspot();
X#ifndef MSDOS
Xint parsenum(),getnumber(),litroom(),move_slot(),stillonblock();
X#else
Xlong parsenum();
Xint getnumber(),litroom(),move_slot(),stillonblock();
X#endif
Xchar getspot(),mgetc(),lgetc(),menugetc(),*msgscanstring();
X#ifndef MSDOS
Xchar mcigetc(),ynq(),ynq1(),ynq2();
X#else
Xint mcigetc();
Xchar ynq(),ynq1(),ynq2();
X#endif
X
X
X/* omove functions */
Xvoid p_movefunction();
Xvoid l_water(),l_hedge(),l_lava(),l_lift(),l_magic_pool(),l_whirlwind();
Xvoid l_abyss(),l_no_op(),l_tactical_exit(),l_rubble(),l_raise_portcullis();
Xvoid l_portcullis(),l_portcullis_trap(),l_arena_exit(),l_house_exit();
Xvoid l_drop_every_portcullis(),l_earth_station(),l_water_station();
Xvoid l_fire_station(),l_air_station(),l_void(),stationcheck(),l_whirlwind();
Xvoid l_voice1(),l_voice2(),l_voice3(),l_whirlwind(),l_void_station();
Xvoid l_chaos(),l_tome1(),l_tome2(),l_enter_circle(),l_circle_library();
Xvoid l_temple_warning(),l_throne(),l_enter_court(),l_escalator(),l_fire();
Xvoid l_voidstone(),l_chaostone(),l_lawstone(),l_balancestone();
Xvoid l_sacrificestone();
X
X/* otrap functions */
Xvoid l_trap_dart(),l_trap_pit(),l_trap_door(),l_trap_snare(),l_trap_siren();
Xvoid l_trap_blade(),l_trap_fire(),l_trap_disintegrate(),l_trap_teleport();
Xvoid l_trap_acid(),l_trap_manadrain(),l_trap_sleepgas(),l_trap_abyss();
X
X
X
X/* ohouse functions */
Xvoid load_house(),make_dog(),make_automaton(),make_house_npc();
Xvoid make_mansion_npc();
X
X/* omonf functions */
Xvoid m_normal_move(),m_no_op();
Xvoid m_smart_move(),m_simple_move(),m_spirit_move(),m_vanish();
Xvoid m_firebolt(),m_talk_guard(),m_random_move(),m_sp_morgon();
Xvoid m_flutter_move(),m_nbolt(),m_sp_surprise(),m_talk_druid();
Xvoid m_talk_stupid(),m_talk_hungry(),m_talk_silent(),m_talk_greedy();
Xvoid m_talk_mp(),m_follow_move(),m_sp_mp(),m_talk_evil(),m_talk_prime();
Xvoid m_lball(),m_fireball(),m_talk_titter(),m_talk_thief();
Xvoid m_sp_ng(),m_sp_poison_cloud(),m_huge_sounds(),m_talk_robot();
Xvoid m_blind_strike(),m_talk_im(),m_confused_move(),m_talk_beg();
Xvoid m_thief_f(),m_talk_man(),m_summon(),m_animal_talk(),m_move_animal();
Xvoid m_teleport(),m_illusion(),m_aggravate(),m_talk_hint();
Xvoid m_sp_explode(),m_sp_acid_cloud(),m_sp_bogthing(),m_talk_animal();
Xvoid m_sp_whirl(),m_sp_escape(),m_sp_ghost(),m_sp_demonlover();
Xvoid m_talk_mimsy(),m_talk_slithy(),m_talk_burble(),m_sp_spell();
Xvoid m_scaredy_move(),m_talk_gf(),m_talk_ef(),m_sp_demon(),m_sp_av();
Xvoid m_sp_seductor(),m_talk_demonlover(),m_talk_seductor(),m_sp_lw();
Xvoid m_sp_eater(),m_sp_dragonlord(),m_talk_ninja(),m_talk_assassin();
Xvoid m_sp_blackout(),m_sp_leash(),m_sp_were(),m_sp_angel(),m_sp_servant();
Xvoid m_sp_swarm(),m_talk_servant(),m_talk_horse(),m_snowball(),m_sp_prime();
Xvoid m_sp_mb(),m_sp_mirror(),m_sp_raise(),m_talk_scream(),m_strike_sonic();
Xvoid m_talk_parrot(),m_talk_hyena(),m_talk_archmage(),m_talk_merchant();
Xvoid m_sp_merchant(),m_sp_court(),m_sp_lair(),m_sp_whistleblower();
X
Xchar *mantype();
X
X/* omon functions */
Xint m_statusp(),m_immunityp(),tacticalp();
Xvoid m_pulse(),m_status_set(),m_damage(),monster_action();
Xvoid m_death(),m_hit(),m_miss(),m_pickup(),m_dropstuff();
Xvoid m_status_reset(),monster_strike(),tacmonster(),free_mlist();
Xvoid monster_talk(),monster_melee(),monster_move(),monster_special();
Xvoid movemonster(),make_log_npc(),m_abyss(),transcribe_monster_actions();
Xvoid m_movefunction(),trasnscribe_monster_actions(),determine_npc_behavior();
Xvoid m_water(),m_lava(),m_altar(),m_whirlwind(),m_fire(),make_hiscore_npc();
Xvoid m_trap_dart(),m_trap_pit(),m_trap_door(),m_trap_snare();
Xvoid m_trap_blade(),m_trap_fire(),m_trap_disintegrate(),m_trap_teleport();
Xvoid m_trap_manadrain(),m_trap_acid(),m_trap_sleepgas(),m_trap_abyss();
Xvoid strengthen_death(),fix_phantom(),destroy_order();
Xchar random_loc();
Xint corpsevalue(),monster_hit();
X
X
X/* olev functions */
Xvoid populate_level(),stock_level(),wandercheck(),make_site_monster();
Xvoid free_dungeon(),tactical_map(),make_country_monsters();
Xvoid make_site_treasure(),make_specific_treasure();
Xint difficulty();
Xpmt m_create(),make_creature();
X
X/* osave functions */
Xint save_game(),restore_game(), signalsave();
Xvoid save_player(),save_player_items(),save_player_spells();
Xvoid save_player_item_knowledge(),save_monsters(),save_country();
Xvoid save_level(),save_item(),save_itemlist();
Xvoid restore_player(),restore_player_items(),restore_player_spells();
Xvoid restore_player_item_knowledge(),restore_monsters();
Xvoid restore_level(),restore_country();
Xpob restore_item();
Xpol restore_itemlist();
X
X
X
X
X/* oitemf functions (1 to 3)*/
Xvoid weapon_bare_hands(),weapon_normal_hit(),weapon_demonblade();
Xvoid weapon_lightsabre(),weapon_mace_disrupt(),weapon_tangle();
Xvoid weapon_vorpal(),weapon_desecrate(),weapon_firestar(),weapon_defend();
Xvoid weapon_victrix(),weapon_bolt(),weapon_arrow(),weapon_scythe();
Xvoid weapon_acidwhip();
Xvoid i_no_op(),i_nothing(),i_stargem(),i_sceptre(),i_deflect();
Xvoid i_spells(),i_bless(),i_enchant(),i_acquire(),i_jane_t();
Xvoid i_flux(),i_breathing(),i_invisible(),i_perm_invisible();
Xvoid i_teleport(),i_wish(),i_clairvoyance(),i_displace(),i_id(),i_augment();
Xvoid i_heal(),i_objdet(),i_mondet(),i_sleep_self(),i_neutralize_poison();
Xvoid i_speed(),i_restore(),i_azoth(),i_regenerate(),i_demonblade();
Xvoid i_firebolt(),i_lbolt(),i_missile(),i_fireball(),i_lball(),i_snowball();
Xvoid i_sleep_other(),i_summon(),i_hide(),i_disrupt(),i_disintegrate();
Xvoid i_perm_vision(),i_perm_burden(),i_perm_fire_resist(),i_charge();
Xvoid i_perm_poison_resist(),i_perm_strength(),i_perm_gaze_immune();
Xvoid i_perm_energy_resist(), i_perm_speed(),i_perm_breathing();
Xvoid i_perm_displace(),i_perm_negimmune(),i_mace_disrupt(),i_warp();
Xvoid i_food(),i_poison_food(),i_stim(),i_immune(),i_lembas(),i_pow();
Xvoid i_orbfire(),i_orbwater(),i_orbair(),i_orbearth(),i_orbdead();
Xvoid i_orbmastery(),i_lightsabre(),i_alert(),i_knowledge(),i_pick();
Xvoid i_perm_knowledge(),i_fear_resist(),i_perm_fear_resist(),i_key();
Xvoid i_defend(),i_victrix(),i_apport(),i_corpse(),i_accuracy();
Xvoid i_perm_accuracy(),i_hero(),i_perm_hero(),i_levitate();
Xvoid i_perm_regenerate(),i_perm_levitate(),i_perm_protection();
Xvoid i_perm_agility(),i_truesight(),i_perm_truesight(),i_cure();
Xvoid i_dispel(),i_pepper_food(),i_enchantment(),polymorph();
Xvoid i_crystal(),i_kolwynia(),i_death(),i_life(),i_helm(),i_antioch();
Xvoid i_illuminate(),i_perm_illuminate(),i_desecrate();
Xvoid i_trap(),i_juggernaut(),i_raise_portcullis(),i_planes();
Xvoid i_fear(),i_polymorph(),i_symbol(),i_perm_deflect();
Xvoid i_normal_armor(),i_normal_weapon(),i_normal_shield();
X
X/* oitem functions */
Xvoid item_use();
Xpob create_object();
Xvoid make_shield(),make_armor(),make_weapon();
Xvoid make_scroll(),make_potion(),make_food();
Xvoid make_thing(),make_ring(),make_artifact(),make_corpse();
Xvoid make_boots(),make_cloak(),make_stick(),make_cash();
Xint itemplus(),itemcharge(),itemblessing(),twohandedp();
Xchar *scrollname(),*potionname(),*stickname(),*ringname(),*cloakname();
Xchar *bootname(),*grotname();
X
X
X/* oinv functions */
Xvoid pickup_at(),drop_at(),givemonster(),conform_lost_object();
Xvoid conform_unused_object(),gain_item(),drop_money(),add_to_pack();
Xvoid setplustr(),setchargestr(), setnumstr(),p_drop_at(),give_money();
Xvoid conform_lost_objects(),itemlist_inventory(),take_from_pack();
Xvoid merge_item(),take_from_slot(),inventory_control(),item_inventory();
Xvoid drop_from_slot(),put_to_pack(),switch_to_slot(),top_inventory_control();
Xvoid lose_all_items(),dispose_lost_objects(),pack_extra_items(),fixpack();
Xint get_inventory_slot(),getitem();
Xint objequal(),slottable(),item_useable(),find_and_remove_item();
X#ifndef MSDOS
Xint getitem(),badobject(),cursed(),get_money(),get_item_number(),find_item();
X#else
Xint getitem(),badobject(),cursed(),get_item_number(),find_item();
Xlong get_money();
X#endif
Xpob detach_money(),split_item();
Xchar *itemid(),*cashstr();
X
X/* oguild functions */
Xvoid l_druid(),l_thieves_guild(),l_college(),l_merc_guild(),l_sorcerors();
Xvoid l_altar(),l_arena(),l_order();
X
X/* opriest functions */
Xvoid make_hp(),hp_req_test(),hp_req_print(),increase_priest_rank();
Xvoid answer_prayer();
Xint check_sacrilege();
X
X/* ocountry functions */
Xvoid load_country(),load_dlair(),load_speak(),load_misle(),load_temple();
Xvoid make_high_priest(),random_temple_site();
X
X/* ovillage functions */
Xvoid load_village(),make_horse(),make_sheep();
Xvoid make_guard(),make_sheep(),make_merchant(),make_food_bin();
Xvoid assign_village_function(),special_village_site();
X
X
END_OF_FILE
if test 16657 -ne `wc -c <'oextern.h'`; then
    echo shar: \"'oextern.h'\" unpacked with wrong size!
fi
# end of 'oextern.h'
fi
if test -f 'ospell.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'ospell.c'\"
else
echo shar: Extracting \"'ospell.c'\" \(16536 characters\)
sed "s/^X//" >'ospell.c' <<'END_OF_FILE'
X/* omega copyright (C) by Laurence Raphael Brothers, 1987,1988,1989 */
X/* ospell.c */
X/* functions having to do with spellcasting */
X
X#include "oglob.h"
X
X
Xvoid s_wish()
X{
X  if (random_range(100) > Player.iq+Player.pow+Player.level) {
X    mprint("Your concentration is flawed!");
X    mprint("The spell energy backfires!");
X    p_damage(random_range(Spells[S_WISH].powerdrain),
X	     UNSTOPPABLE,
X	     "a backfired wish spell");
X  }
X  else {
X    wish(0);
X    mprint("The power of the spell is too much for you to withstand!");
X    mprint("All memory of the spell is expunged from your brain.");
X    Spells[S_WISH].known = FALSE;
X  }
X}
X
Xvoid s_firebolt()
X{
X  int x=Player.x,y=Player.y;
X  setspot(&x,&y);
X  fbolt(Player.x,Player.y,x,y,Player.dex*2+Player.level,Player.level*10+10);
X}
X
Xvoid s_missile()
X{
X  int x=Player.x,y=Player.y;
X  setspot(&x,&y);
X  nbolt(Player.x,Player.y,x,y,Player.dex*2+Player.level,Player.level*3+3);
X}
X
Xvoid s_teleport()
X{
X  p_teleport(0);
X}
X
Xvoid s_disrupt()
X{
X  int x=Player.x,y=Player.y;
X  setspot(&x,&y);
X  disrupt(x,y,Player.level*10+25);
X}
X
X
Xvoid s_disintegrate()
X{
X  int x=Player.x,y=Player.y;
X  setspot(&x,&y);
X  disintegrate(x,y);
X}
X
X
Xvoid s_sleep()
X{
X  sleep_monster(0);
X}
X
Xvoid s_heal()
X{
X  heal(3);
X}
X
Xvoid s_dispel()
X{
X  dispel((Player.level+Player.maxpow)/10); 
X}
X
Xvoid s_breathe()
X{
X  breathe(0);
X}
X
Xvoid s_invisible()
X{
X  invisible(0);
X}
X
X
Xvoid s_warp()
X{
X  warp(1);
X}
X
Xvoid s_enchant()
X{
X  enchant(1);
X}
X
X
Xvoid s_bless()
X{
X  bless(0);
X}
X
X
Xvoid s_restore()
X{
X  recover_stat(0);
X}
X
X
Xvoid s_cure()
X{
X  cure(0);
X}
X
X
Xvoid s_truesight()
X{
X  truesight(0);
X}
X
X
Xvoid s_hellfire()
X{
X  int x=Player.x,y=Player.y;
X  setspot(&x,&y);
X  hellfire(x,y,0);
X}
X
X
Xvoid s_knowledge()
X{
X  knowledge(0);
X}
X
X
Xvoid s_hero()
X{
X  hero(0);
X}
X
X/* spell takes longer and longer to work deeper into dungeon */
Xvoid s_return()
X{
X  mprint("You hear a whine as your spell begins to charge up.");
X  Player.status[RETURNING] = 
X    ((Current_Environment == Current_Dungeon) ? difficulty() : 1);
X}
X
Xvoid s_desecrate()
X{
X  sanctify(-1);
X}
X
X
Xvoid s_haste()
X{
X  haste(0);
X}
X
X
Xvoid s_summon()
X{
X  summon(0,-1);
X}
X
X
Xvoid s_sanctuary()
X{
X  sanctuary();
X}
X
Xvoid s_sanctify()
X{
X  sanctify(1);
X}
X
X
Xvoid s_accuracy()
X{
X  accuracy(0);
X}
X
Xvoid s_fear()
X{
X  int x = Player.x,y=Player.y;
X  setspot(&x,&y);
X  inflict_fear(x,y);
X}
X
X
X/* Has all kinds of effects in different circumstances.
X   Eventually will be more interesting */
Xvoid s_ritual()
X{
X  pob symbol;
X  int i,roomno;
X  mprint("You begin your ritual....");
X  mprint("You enter a deep trance. Time Passes...");
X  setgamestatus(SKIP_PLAYER);
X  time_clock(FALSE);
X  setgamestatus(SKIP_PLAYER);
X  time_clock(FALSE);
X  setgamestatus(SKIP_PLAYER);
X  time_clock(FALSE);
X  setgamestatus(SKIP_PLAYER);
X  time_clock(FALSE);
X  setgamestatus(SKIP_PLAYER);
X  time_clock(FALSE);
X  if (RitualHour == hour())
X    mprint("Your mental fatigue prevents from completing the ritual!");
X  else if (random_range(100) > Player.iq+Player.pow+Player.level)
X    mprint("Your concentration was broken -- the ritual fails!");
X  else {
X    mprint("You charge the ritual with magical energy and focus your will.");
X    mprint("Time Passes...");
X    setgamestatus(SKIP_PLAYER);
X    time_clock(FALSE);
X    setgamestatus(SKIP_PLAYER);
X    time_clock(FALSE);
X    setgamestatus(SKIP_PLAYER);
X    time_clock(FALSE);
X    setgamestatus(SKIP_PLAYER);
X    time_clock(FALSE);
X    setgamestatus(SKIP_PLAYER);
X    time_clock(FALSE);
X    RitualHour = hour();
X    /* set of random conditions for different ritual effects */
X    if (Current_Environment == E_CITY) {
X      mprint("Flowing waves of mystical light congeal all around you.");
X      mprint("'Like wow, man! Colors!'");
X      mprint("Appreciative citizens throw you spare change.");
X      Player.cash +=random_range(50);
X    }
X    else if ((roomno=Level->site[Player.x][Player.y].roomnumber) >= 0) {
X      if (RitualRoom == roomno)
X	mprint("For some reason the ritual doesn't work this time...");
X      else {
X	RitualRoom = roomno;
X	switch (RitualRoom) {
X	case ROOMBASE+9: /* ransacked treasure chamber */
X	  mprint("Your spell sets off frenetic growth all around you!");
X	  for(i=0;i<8;i++){
X	    Level->site[Player.x+Dirs[0][i]][Player.y+Dirs[1][i]].locchar =
X	      HEDGE;
X	    Level->site[Player.x+Dirs[0][i]][Player.y+Dirs[1][i]].p_locf =
X	      L_TRIFID;
X	  }
X	  break;
X	case ROOMBASE+22: /* boudoir */
X	  mprint("A secret panel opens next to the bed....");
X	  if (random_range(2))
X	    summon(0,ML4+6); /* succubus/incubus */
X	  else summon(0,ML4+7); /* satyr/nymph */
X	  break;
X	case ROOMBASE+26: /*shrine to high magic */
X	  mprint("A storm of mana coaelesces around you.");
X	  mprint("You are buffeted by bursts of random magic.");
X	  p_damage(random_range(Player.pow),UNSTOPPABLE,"high magic");
X	  mprint("Continue ritual? Could be dangerous.... [yn] ");
X	  if (ynq()=='y') s_wish();
X	  else mprint("The mana fades away to nothingness.");
X	  Level->site[Player.x][Player.y].roomnumber = RS_ZORCH;
X	  break;
X	case ROOMBASE+27: /* magician's lab */
X	  mprint("Your magical activity sets off a latent spell in the lab!");
X	  cast_spell(random_range(NUMSPELLS));
X	  break;
X	case ROOMBASE+28: /* pentagram room */
X	  mprint("A smoky form begins to coalesce....");
X	  summon(-1,-1);
X	  mprint("Fortunately, it seems confined to the pentagram.");
X	  m_status_reset(Level->mlist->m,MOBILE);
X	  break;
X	case ROOMBASE+29: /* blue omega room */
X	  mprint("The Lords of Destiny look upon you....");
X	  if (Player.level > 10) {
X	    mprint("A curtain of blue flames leaps up from the omega.");
X	    mprint("Enter it? [yn] ");
X	    if (ynq()=='y') l_adept();
X	  }
X	  else {
X	    if (Player.patron == DESTINY) {
X	      mprint("Your patrons take pity on you.");
X	      if ((Player.rank[PRIESTHOOD]<SPRIEST) &&
X		  (! find_item(&symbol,ARTIFACTID+19,-1))) {
X		symbol = ((pob) malloc(sizeof(objtype)));
X		*symbol = Objects[ARTIFACTID+19];
X		symbol->known = 2;
X		symbol->charge = 17;
X		gain_item(symbol);
X		mprint("You feel uplifted.");
X	      }
X	      else gain_experience(min(1000,Player.xp));
X	    }
X	    else if (random_range(3)==1) {
X	      mprint("You feel Fated.");
X	      gain_experience(Player.level*Player.level*10);
X	      Player.hp = Player.maxhp;
X	    }
X	    else if (random_range(2)) {
X	      mprint("You feel Doomed.");
X	      Player.hp = 1;
X	      Player.mana = 0;
X	      Player.xp = 0;
X	    }
X	    else mprint("The Lords of Destiny laugh at you!");
X	  }
X	  break;
X	default:
X	  mprint("Well, not much effect. Chalk it up to experience.");
X	  gain_experience(Player.level*5);
X	  break;
X	}
X      }
X    }
X    else {
X      if (RitualRoom == Level->site[Player.x][Player.y].roomnumber)
X	mprint("The ritual fails for some unexplainable reason.");
X      else {
X	mprint("The ritual seems to be generating some spell effect.");
X	RitualRoom = Level->site[Player.x][Player.y].roomnumber;
X	switch (RitualRoom) {
X	case RS_WALLSPACE:
X	  shadowform();
X	  break;
X	case RS_CORRIDOR:
X	  haste(0);
X	  break;
X	case RS_PONDS:
X	  breathe(0);
X	  break;
X	case RS_ADEPT:
X	  hero(1);
X	  break;
X	default:
X	  mprint("The ritual doesn't seem to produce any tangible results...");
X	  gain_experience(Player.level*6);
X	}
X      }
X    }
X  }
X}
X
X
X
Xvoid s_apport()
X{
X  apport(0);
X}
X
Xvoid s_shadowform()
X{
X  shadowform();
X}
X
Xvoid s_alert()
X{
X  alert(0);
X}
X
Xvoid s_regenerate()
X{
X  regenerate(0);
X}
X
Xvoid s_clairvoyance()
X{
X  clairvoyance(10);
X}
X
Xvoid s_drain()
X{
X  drain(0);
X}
X
Xvoid s_levitate()
X{
X  levitate(0);
X}
X
Xvoid s_polymorph()
X{
X  polymorph(0);
X}
X
X
X/* lball spell */
Xvoid s_lball()
X{
X  int x=Player.x,y=Player.y;
X  setspot(&x,&y);
X  lball(Player.x,Player.y,x,y,Player.level*10+10);
X}
X
Xvoid s_identify()
X{
X  identify(0);
X}
X
Xvoid s_objdet()
X{
X  objdet(1);
X}
X
Xvoid s_mondet()
X{
X  mondet(1);
X}
X
X
X/* select a spell to cast */
Xint getspell()
X{
X  int spell= -2;
X  do {
X    mprint("Cast Spell: [type spell abbrev, ?, or ESCAPE]: ");
X    spell = spellparse();
X  } while (spell < ABORT);
X  return(spell);
X}
X
X
Xchar *spellid(id)
Xint id;
X{
X  switch(id) {
X    case S_MON_DET:return("monster detection");break;
X    case S_OBJ_DET:return("object detection");break;
X    case S_IDENTIFY:return("identification");break;
X    case S_FIREBOLT:return("firebolt");break;
X    case S_LBALL:return("ball lightning");break;
X    case S_SLEEP:return("sleep");break;
X    case S_DISRUPT:return("disrupt");break;
X    case S_DISINTEGRATE:return("disintegrate");break;
X    case S_TELEPORT:return("teleport");break;
X    case S_MISSILE:return("magic missile"); break;
X    case S_HEAL:return("healing"); break;
X    case S_DISPEL:return("dispelling"); break;
X    case S_BREATHE:return("breathing"); break;
X    case S_INVISIBLE:return("invisibility"); break;
X    case S_WARP:return("the warp"); break;
X    case S_ENCHANT:return("enchantment"); break;
X    case S_BLESS:return("blessing"); break;
X    case S_RESTORE:return("restoration"); break;
X    case S_CURE:return("curing"); break;
X    case S_TRUESIGHT:return("true sight"); break;
X    case S_HELLFIRE:return("hellfire"); break;
X    case S_KNOWLEDGE:return("self knowledge"); break;
X    case S_HERO:return("heroism"); break;
X    case S_RETURN:return("return"); break;
X    case S_DESECRATE:return("desecration"); break;
X    case S_HASTE:return("haste"); break;
X    case S_SUMMON:return("summoning"); break;
X    case S_SANCTUARY:return("sanctuary"); break;
X    case S_ACCURACY:return("accuracy"); break;
X    case S_RITUAL:return("ritual magic"); break;
X    case S_APPORT:return("apportation"); break;
X    case S_SHADOWFORM:return("shadow form"); break;
X    case S_ALERT:return("alertness"); break;
X    case S_REGENERATE:return("regeneration"); break;
X    case S_SANCTIFY:return("sanctification"); break;
X    case S_CLAIRVOYANCE:return("clairvoyance"); break;
X    case S_DRAIN:return("energy drain"); break;
X    case S_LEVITATE:return("levitate"); break;
X    case S_POLYMORPH:return("polymorph"); break;
X    case S_FEAR:return("fear"); break;
X    case S_WISH:return("wishing"); break;
X    default:return("???"); break;
X  }      
X}
X
X
X
Xvoid initspells()
X{
X  int i;
X
X  for (i=0; i<NUMSPELLS; i++)
X    Spells[i].known = FALSE;
X
X  Spells[S_MON_DET].powerdrain = 3;
X  Spells[S_MON_DET].id = S_MON_DET;
X
X  Spells[S_OBJ_DET].powerdrain = 3;
X  Spells[S_OBJ_DET].id = S_OBJ_DET;
X
X  Spells[S_IDENTIFY].powerdrain = 10;
X  Spells[S_IDENTIFY].id = S_IDENTIFY;
X
X  Spells[S_FIREBOLT].powerdrain = 20;
X  Spells[S_FIREBOLT].id = S_FIREBOLT;
X
X  Spells[S_SLEEP].powerdrain = 15;
X  Spells[S_SLEEP].id = S_SLEEP;
X
X  Spells[S_LBALL].powerdrain = 25;
X  Spells[S_LBALL].id = S_LBALL;
X
X  Spells[S_TELEPORT].powerdrain = 20;
X  Spells[S_TELEPORT].id = S_TELEPORT;
X
X  Spells[S_DISRUPT].powerdrain = 30;
X  Spells[S_DISRUPT].id = S_DISRUPT;
X
X  Spells[S_DISINTEGRATE].powerdrain = 40;
X  Spells[S_DISINTEGRATE].id = S_DISINTEGRATE;
X
X  Spells[S_MISSILE].powerdrain = 10;
X  Spells[S_MISSILE].id = S_MISSILE;
X
X  Spells[S_HEAL].powerdrain = 15;
X  Spells[S_HEAL].id = S_HEAL;
X
X  Spells[S_DISPEL].powerdrain = 40;
X  Spells[S_DISPEL].id = S_DISPEL;
X
X  Spells[S_BREATHE].powerdrain = 20;
X  Spells[S_BREATHE].id = S_BREATHE;
X
X  Spells[S_INVISIBLE].powerdrain = 15;
X  Spells[S_INVISIBLE].id = S_INVISIBLE;
X
X  Spells[S_WARP].powerdrain = 50;
X  Spells[S_WARP].id = S_WARP;
X
X  Spells[S_ENCHANT].powerdrain = 30;
X  Spells[S_ENCHANT].id = S_ENCHANT;
X
X  Spells[S_BLESS].powerdrain = 30;
X  Spells[S_BLESS].id = S_BLESS;
X
X  Spells[S_RESTORE].powerdrain = 20;
X  Spells[S_RESTORE].id = S_RESTORE;
X
X  Spells[S_CURE].powerdrain = 20;
X  Spells[S_CURE].id = S_CURE;
X
X  Spells[S_TRUESIGHT].powerdrain = 20;
X  Spells[S_TRUESIGHT].id = S_TRUESIGHT;
X
X  Spells[S_HELLFIRE].powerdrain = 90;
X  Spells[S_HELLFIRE].id = S_HELLFIRE;
X
X  Spells[S_KNOWLEDGE].powerdrain = 10;
X  Spells[S_KNOWLEDGE].id = S_KNOWLEDGE;
X
X  Spells[S_HERO].powerdrain = 20;
X  Spells[S_HERO].id = S_HERO;
X
X  Spells[S_RETURN].powerdrain = 10;
X  Spells[S_RETURN].id = S_RETURN;
X
X  Spells[S_DESECRATE].powerdrain = 50;
X  Spells[S_DESECRATE].id = S_DESECRATE;
X
X  Spells[S_HASTE].powerdrain = 15;
X  Spells[S_HASTE].id = S_HASTE;
X
X  Spells[S_SUMMON].powerdrain = 20;
X  Spells[S_SUMMON].id = S_SUMMON;
X
X  Spells[S_SANCTUARY].powerdrain = 75;
X  Spells[S_SANCTUARY].id = S_SANCTUARY;
X
X  Spells[S_ACCURACY].powerdrain = 20;
X  Spells[S_ACCURACY].id = S_ACCURACY;
X
X  Spells[S_RITUAL].powerdrain = 50;
X  Spells[S_RITUAL].id = S_RITUAL;
X
X  Spells[S_APPORT].powerdrain = 15;
X  Spells[S_APPORT].id = S_APPORT;
X
X  Spells[S_SHADOWFORM].powerdrain = 50;
X  Spells[S_SHADOWFORM].id = S_SHADOWFORM;
X
X  Spells[S_ALERT].powerdrain = 15;
X  Spells[S_ALERT].id = S_ALERT;
X
X  Spells[S_REGENERATE].powerdrain = 20;
X  Spells[S_REGENERATE].id = S_REGENERATE;
X
X  Spells[S_SANCTIFY].powerdrain = 75;
X  Spells[S_SANCTIFY].id = S_SANCTIFY;
X
X  Spells[S_CLAIRVOYANCE].powerdrain = 10;
X  Spells[S_CLAIRVOYANCE].id = S_CLAIRVOYANCE;
X
X  Spells[S_DRAIN].powerdrain = 40;
X  Spells[S_DRAIN].id = S_DRAIN;
X
X  Spells[S_LEVITATE].powerdrain = 25;
X  Spells[S_LEVITATE].id = S_LEVITATE;
X
X  Spells[S_POLYMORPH].powerdrain = 30;
X  Spells[S_POLYMORPH].id = S_POLYMORPH;
X
X  Spells[S_FEAR].powerdrain = 10;
X  Spells[S_FEAR].id = S_FEAR;
X
X  Spells[S_WISH].powerdrain = 100;
X  Spells[S_WISH].id = S_WISH;
X
X}
X
X
X
X
X
X
Xvoid cast_spell(spell)
Xint spell;
X{
X  switch(spell) {
X  case S_MON_DET:s_mondet();
X    break;
X  case S_OBJ_DET:s_objdet();
X    break;
X  case S_IDENTIFY:s_identify();
X    break;
X  case S_FIREBOLT:s_firebolt();
X    break;
X  case S_SLEEP:s_sleep();
X    break;
X  case S_LBALL:s_lball();
X    break;
X  case S_TELEPORT:s_teleport();
X    break;
X  case S_DISRUPT:s_disrupt();
X    break;
X  case S_DISINTEGRATE:s_disintegrate();
X    break;
X  case S_MISSILE:s_missile();
X    break;
X  case S_HEAL:s_heal();
X    break;
X  case S_DISPEL:s_dispel();
X    break;
X  case S_BREATHE:s_breathe();
X    break;
X  case S_INVISIBLE:s_invisible();
X    break;
X  case S_WARP:s_warp();
X    break;
X  case S_ENCHANT:s_enchant();
X    break;
X  case S_BLESS:s_bless();
X    break;
X  case S_RESTORE:s_restore();
X    break;
X  case S_CURE:s_cure();
X    break;
X  case S_TRUESIGHT:s_truesight();
X    break;
X  case S_HELLFIRE:s_hellfire();
X    break;
X  case S_KNOWLEDGE:s_knowledge();
X    break;
X  case S_HERO:s_hero();
X    break;
X  case S_RETURN:s_return();
X    break;
X  case S_DESECRATE:s_desecrate();
X    break;
X  case S_HASTE:s_haste();
X    break;
X  case S_SUMMON:s_summon();
X    break;
X  case S_SANCTUARY:s_sanctuary();
X    break;
X  case S_ACCURACY:s_accuracy();
X    break;
X  case S_RITUAL:s_ritual();
X    break;
X  case S_APPORT:s_apport();
X    break;
X  case S_SHADOWFORM:s_shadowform();
X    break;
X  case S_ALERT:s_alert();
X    break;
X  case S_REGENERATE:s_regenerate();
X    break;
X  case S_SANCTIFY:s_sanctify();
X    break;
X  case S_CLAIRVOYANCE:s_clairvoyance();
X    break;
X  case S_DRAIN:s_drain();
X    break;
X  case S_LEVITATE:s_levitate();
X    break;
X  case S_FEAR:s_fear();
X    break;
X  case S_POLYMORPH:s_polymorph();
X    break;
X  case S_WISH:s_wish();
X    break;
X  default: mprint("Your odd spell fizzles with a small 'sput'.");
X    break;
X  }
X}
X
X
X
X
X
Xint spellparse()
X{
X  int spell= -3,place=0;
X  char byte,prefix[80];
X
X  prefix[0]=0;
X
X  do {
X    byte = mgetc();
X    if ((byte >= 'A') && (byte <= 'Z')) {
X      maddch(byte+'a'-'A');
X      prefix[place] = byte+'a'-'A';
X      prefix[place+1] = 0;
X      place++;
X    }
X    else if ((byte == ' ') || ((byte >= 'a') && (byte <= 'z'))) {
X      maddch(byte);
X      prefix[place] = byte;
X      prefix[place+1] = 0;
X      place++;
X    }
X    else if ((byte == 8) || (byte == 127)) { /* ^h or delete */ 
X      prefix[place]=0;
X      if (place > 0) {
X	place--;
X	dobackspace();
X      }
X    }
X    else if (byte == '?') {
X      maddch(byte);
X      expandspellabbrevs(prefix);
X      dobackspace();
X    }
X    else if (byte == '\n')
X      spell = expandspell(prefix);
X    else if (byte == ESCAPE)
X      spell = ABORT;
X  } while (spell == -3);
X  xredraw();
X  return(spell);
X}
X
Xvoid expandspellabbrevs(prefix)
Xchar prefix[80];
X{
X  int i,printed=FALSE;
X  
X  menuclear();
X  menuprint("\nPossible Spells:\n");
X  for (i=0;i<NUMSPELLS;i++)
X    if (Spells[i].known && strprefix(prefix,spellid(i))) {
X      menuspellprint(i);
X      printed = TRUE;
X    }
X  if (! printed)
X    menuprint("\nNo spells match that prefix!");
X}
X
X
Xint expandspell(prefix)
Xchar prefix[80];
X{
X  int i,spell,matched=0;
X  
X  for (i=0;i<NUMSPELLS;i++)
X    if (Spells[i].known && strprefix(prefix,spellid(i))) {
X      spell = i;
X      matched++;
X    }
X  if (matched==0) {
X    mprint("No spells match that prefix!");
X    return(-2);
X  }
X  else if (matched > 1) {
X    mprint("That is an ambiguous abbreviation!");
X    return(-2);
X  }
X  else return(spell);
X}
X
END_OF_FILE
if test 16536 -ne `wc -c <'ospell.c'`; then
    echo shar: \"'ospell.c'\" unpacked with wrong size!
fi
# end of 'ospell.c'
fi
if test -f 'oupdate.txt' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'oupdate.txt'\"
else
echo shar: Extracting \"'oupdate.txt'\" \(1377 characters\)
sed "s/^X//" >'oupdate.txt' <<'END_OF_FILE'
XVersion			Changes
X=======			=======
X
X0.57(alpha)		First public release
X
X0.58(alpha)		bugfixes, I forget what else
X
X0.59(alpha)		bugfixes, better tactical combat mode ^c trapping
X
X0.60(alpha)		bugfixes, filechecking,	cuserid changed to getlogin,
X			brothel on city level, more foods. this file
X			started. new time mechanism, new module otime.
X			12/5/87. 
X
X0.70(alpha)             architecture changed -- therefore most code
X			rewritten. Only large-scale changes detailed
X			here, otherwise too many to count.
X
X			Countryside; multiple dungeons; "special levels";
X			special screens for houses, the arena, and
X			countryside encounters; single combat mode
X			with different verbosity levels; no more
X			filechecking for saved games; many new
X			monsters; a few new items; new end game;
X			new inventory modes, effects of many commands
X			are different, some new commands added,
X			other old ones removed. Commands and
X			terrain characters have different meanings
X			in countryside. 3/22/88.
X  
X0.70.5(alpha)		First 0.70 version released via ftp. Many
X			bugs. Among other things, wouldn't work at all
X			on a vax. 3/22/88.
X		
X0.71 (beta)		Rather different version of 0.70 now about to
X			be released to usenet via comp.sources.games.
X			7/11/88.
X             
X0.75			Somewhat bugfixed version of 0.71, with MS-DOS
X			cpp code and makefile courtesy Nathan Glasser.
X			5/4/89.
END_OF_FILE
if test 1377 -ne `wc -c <'oupdate.txt'`; then
    echo shar: \"'oupdate.txt'\" unpacked with wrong size!
fi
# end of 'oupdate.txt'
fi
echo shar: End of archive 14 \(of 20\).
cp /dev/null ark14isdone
MISSING=""
for I in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 ; do
    if test ! -f ark${I}isdone ; then
	MISSING="${MISSING} ${I}"
    fi
done
if test "${MISSING}" = "" ; then
    echo You have unpacked all 20 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