[comp.sources.games] v05i021: 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 21
Archive-name: omega2/Part11



#! /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 11 (of 19)."
# Contents:  odefs.h ogen1.c ohouse.c oscroll4.txt
# Wrapped by billr@saab on Wed Jul 13 10:46:51 1988
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f 'odefs.h' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'odefs.h'\"
else
echo shar: Extracting \"'odefs.h'\" \(27638 characters\)
sed "s/^X//" >'odefs.h' <<'END_OF_FILE'
X/* omega copyright (c) 1987,1988 by Laurence Raphael Brothers */
X/* This file is the header file for all omega modules */
X/* odefs.h */
X
X/* omega will NOT function unless the implementor sets the appropriate
Xdefinitions in the following section. */
X
X/*--------------------------USER DEFINITIONS--------------------------*/
X
X/* The average system V user should probably uncomment the following
Xtwo definitions. */
X
X/* Implementor should uncomment the following if his system uses
Xstring.h instead of strings.h (try man strings) */
X
X/* #define STRING */
X
X/* Implementor should uncomment the following if random and srandom 
X   are not available  (try man random) */
X
X/* #define NORANDOM */
X
X/* Implementor should uncomment the following if omega appears to
Xredraw the screen excessively. */
X
X/* #define EXCESSIVE_REDRAW */
X
X/* The following definition is recommended. Remove it only if you have
Xhuge amounts of disk space and are annoyed at waiting a few more seconds
Xon save and restore. */
X
X#define COMPRESS_SAVE_FILES
X
X/* Implementor should set the following three definitions: */
X
X/* OMEGALIB is where all the data files reside. 
X   Note the final / is necessary.
X   This might usually be "/usr/games/lib/omegalib/" */
X
X#define OMEGALIB "/grad/u4/brothers/omega/lib/"
X
X/* set WIZARD to implementor's username */
X
X#define WIZARD "brothers"
X
X/* If CATCH_SIGNALS is set to 1, will not dump core, nicer for players. */
X/* dbx still intercepts the signals first, so it's ok for debugging */
X
X#define CATCH_SIGNALS 1
X
X
X/*---------------------------SYSTEM DEFINITIONS---------------------------*/
X
X/* Don't change anything from here on (unless you know what you're doing) */
X#define VERSION 71
X#define VERSIONSTRING "omega version 0.71 (beta)"
X
X#define VACANT 0
X#define ABORT -1
X#define CASHVALUE -2
X
X/* moderately arbitrary but probably cannot be easily changed */
X#define MAXWIDTH 64
X#define MAXLENGTH 64
X#define SMALLSCREENLENGTH 16
X
X/* number of slots in inventory. Cannot be changed without work */
X#define MAXITEMS 16
X
X/* number of slots in pack. Should be <= 26. */
X#define MAXPACK 26
X
X/* number of items in pawn shop. Should be <= 26 */
X#define PAWNITEMS 10
X
X/* Verbosity levels */
X#define TERSE 0
X#define MEDIUM 1
X#define VERBOSE 2 
X
X/* Arbitrary. Max of the levels in the dungeons */
X#define MAXLEVELS 21
X
X/* levels in each dungeon */
X#define ASTRALLEVELS 5
X#define SEWERLEVELS 18
X#define CASTLELEVELS 16
X#define CAVELEVELS 10
X#define VOLCANOLEVELS 20
X
X/* Overall Game Progress Vector Bits */
X/* Long had BETTER have at least 32 bits.... */
X#define SPOKE_TO_DRUID 1L
X#define COMPLETED_CAVES 2L
X#define COMPLETED_SEWERS 4L
X#define COMPLETED_CASTLE 8L
X#define COMPLETED_ASTRAL 16L
X#define COMPLETED_VOLCANO 32L
X#define KILLED_DRAGONLORD 64L
X#define KILLED_EATER 128L
X#define KILLED_LAWBRINGER 256L
X#define COMPLETED_CHALLENGE 512L
X#define SOLD_CONDO 1024L
X#define FAST_MOVE 2048L
X#define SKIP_PLAYER 4096L
X#define SKIP_MONSTERS 8192L
X#define MOUNTED 16384L
X#define SUPPRESS_PRINTING 32768L
X#define LOST 65536L
X#define ARENA_MODE 131072L
X#define CHEATED 262144L
X#define BANK_BROKEN 524288L
X#define CLUB_MEMBER 1048576L
X#define PREPARED_VOID 2097152L
X#define DESTROYED_ORDER 4194304L
X#define GAVE_STARGEM 8388608L
X#define ATTACKED_ORACLE 16777216L
X#define UNDEAD_GUARDS 33554432L
X
X/* general environment types */
X#define E_NEVER_NEVER_LAND 0
X#define E_COUNTRYSIDE 1
X#define E_CITY 2
X#define E_VILLAGE 3
X#define E_TACTICAL_MAP 4
X#define E_SEWERS 5
X#define E_CASTLE 6
X#define E_CAVES 7
X#define E_VOLCANO 8
X#define E_ASTRAL 9
X#define E_ARENA 10
X#define E_HOVEL 11
X#define E_MANSION 12
X#define E_HOUSE 13
X#define E_DLAIR 14
X#define E_ABYSS 15
X#define E_STARPEAK 16
X#define E_MAGIC_ISLE 17
X#define E_TEMPLE 18
X#define E_CIRCLE 19
X#define E_COURT 20
X
X/* player game status */
X#define DEAD 1
X#define QUIT 2
X#define WIN 3
X#define BIGWIN 4
X
X/* kind of arbitrary */
X#define MAXROOMS 48
X#define MAXCONNECTIONS 4 
X
X/* some random characters */
X#define ESCAPE 27
X#define RETURN 13
X#define LINEFEED 10
X#define BACKSPACE 8
X#define DELETE 127
X
X
X/* tac mode action definitions */
X/* have to remember to find where these are used, mostly unused, now! */
X#define DISENGAGE 10
X#define BLOCK 20
X#define CUT 30
X#define THRUST 40
X#define MAGIC 50
X#define LUNGE 60
X#define RIPOSTE 70
X#define WIELD 80
X#define PICK_UP 90
X
X/* as in attack low, block high, etc. */
X/* These values may be added to the ones above to get things like
X   block high, cut low, etc. CLEVER is only used by some monsters
X   to cheat with.... */
X#define LOW 1
X#define CENTER 2
X#define HIGH 3
X#define CLEVER 4
X
X
X/* weapon types */
X#define CUTTING 1
X#define THRUSTING 2
X#define STRIKING 3
X#define MISSILE 4
X
X/* random aux constants */
X/* aux field for private residences in city */
X#define BURGLED 2
X#define LOCKED 3
X#define UNLOCKED 0
X
X/* cannot use M command on site with this aux value */
X#define NOCITYMOVE 666
X
X/* bow and crossbow object aux fields */
X#define LOADED 1
X#define UNLOADED 0
X
X/* alignment used randomly throughout*/
X#define LAWFUL 1
X#define CHAOTIC 2
X#define NEUTRAL 3
X
X/* spells */
X#define NUMSPELLS 41
X
X#define S_MON_DET 0
X#define S_OBJ_DET 1
X#define S_MISSILE 2
X#define S_FIREBOLT 3
X#define S_TELEPORT 4
X#define S_LBALL 5
X#define S_SLEEP 6
X#define S_DISRUPT 7
X#define S_DISINTEGRATE 8
X#define S_POLYMORPH 9
X#define S_HEAL 10
X#define S_DISPEL 11
X#define S_IDENTIFY 12
X#define S_BREATHE 13
X#define S_INVISIBLE 14
X#define S_WARP 15
X#define S_ENCHANT 16
X#define S_BLESS 17
X#define S_RESTORE 18
X#define S_CURE 19
X#define S_TRUESIGHT 20
X#define S_HELLFIRE 21
X#define S_KNOWLEDGE 22
X#define S_HERO 23
X#define S_RETURN 24
X#define S_DESECRATE 25
X#define S_HASTE 26
X#define S_SUMMON 27
X#define S_SANCTUARY 28
X#define S_ACCURACY 29
X#define S_RITUAL 30
X#define S_FEAR 31
X#define S_APPORT 32
X#define S_SHADOWFORM 33
X#define S_ALERT 34
X#define S_REGENERATE 35
X#define S_SANCTIFY 36
X#define S_CLAIRVOYANCE 37
X#define S_DRAIN 38
X#define S_LEVITATE 39
X#define S_WISH 40
X
X/* ranks in guilds, etc */
X#define NUMRANKS 9
X
X#define LEGION 0
X#define ARENA 1
X#define COLLEGE 2
X#define THIEVES 3
X#define ORDER 4
X#define CIRCLE 5
X#define NOBILITY 6
X#define PRIESTHOOD 7
X#define ADEPT 8
X
X#define LEGIONAIRE 1
X#define CENTURION 2
X#define FORCE_LEADER 3
X#define COLONEL 4
X#define COMMANDANT 5
X
X#define TRAINEE 1
X#define BESTIARIUS 2
X#define RETIARIUS 3
X#define GLADIATOR 4
X#define CHAMPION 5
X
X#define NOVICE 1
X#define STUDENT 2
X#define PRECEPTOR 3
X#define MAGE 4
X#define ARCHMAGE 5
X
X#define TMEMBER 1
X#define ATHIEF 2
X#define THIEF 3
X#define TMASTER 4
X#define SHADOWLORD 5
X
X#define GALLANT 1
X#define GUARDIAN 2
X#define CHEVALIER 3
X#define PALADIN 4
X#define JUSTICIAR 5
X
X#define INITIATE 1
X#define ENCHANTER 2
X#define SORCEROR 3
X#define HIGHSORCEROR 4
X#define PRIME 5
X
X#define COMMONER 1
X#define ESQUIRE 2
X#define KNIGHT 3
X#define LORD 4
X#define DUKE 5
X
X#define LAY 1
X#define ACOLYTE 2
X#define PRIEST 3
X#define SPRIEST 4
X#define HIGHPRIEST 5
X
X/* different priesthoods */
X#define ODIN 1
X#define SET 2
X#define ATHENA 3
X#define HECATE 4
X#define DRUID 5
X#define DESTINY 6
X
X
X
X/* MONSTER STATUS/ABILITY BITS */
X#define AWAKE 1
X#define MOBILE 2
X#define HOSTILE 4
X#define WANDERING 16
X#define HUNGRY 32
X#define GREEDY 64
X#define NEEDY  128
X#define ONLYSWIM 256
X#define FLYING 512
X#define INTANGIBLE 1024
X#define M_INVISIBLE 2048
X#define SWIMMING 4096
X#define POISONOUS 8192
X#define EDIBLE 16384
X
X
X/* PLAYER STATUS INDICES */
X#define NUMSTATI 25
X
X#define ACCURACY 0
X#define BLINDED 1
X#define SLOWED 2
X#define DISPLACED 3
X#define SLEPT 4
X#define DISEASED 5
X#define POISONED 6
X#define HASTED 7
X#define BREATHING 8
X#define INVISIBLE 9
X#define REGENERATING 10
X#define VULNERABLE 11
X#define BERSERK 12
X#define IMMOBILE 13
X#define ALERT 14
X#define AFRAID 15
X#define HERO 16
X#define LEVITATING 17
X#define ACCURATE 18
X#define TRUESIGHT 19
X#define SHADOWFORM 20
X#define ILLUMINATION 21
X#define DEFLECTION 22
X#define PROTECTION 23
X/* PROTECTION is deviant -- indicates protective value, not duration */
X#define RETURNING 24
X/* RETURNING is somewhat deviant--how many turns 'til RETURN spell goes off */
X
X/* player immunity indices */
X/* also monster immunity bits (2^n) */
X/* also damage types */
X#define NUMIMMUNITIES 14
X
X#define UNSTOPPABLE 0 
X#define NORMAL_DAMAGE 1
X#define FLAME 2
X#define COLD 3
X#define ELECTRICITY 4
X#define POISON 5
X#define ACID 6
X#define FEAR 7
X#define SLEEP 8
X#define NEGENERGY 9
X#define OTHER_MAGIC 10
X#define THEFT 11
X#define GAZE 12
X#define INFECTION 13
X#define EVERYTHING -1
X
X
X/* location lstatus bits */
X#define SEEN 1
X#define LIT 2
X#define SECRET 4
X#define STOPS 8
X
X
X/* room string id */
X/* for use in roomname() */
X#define NUMROOMNAMES 30
X
X/* normal room name indices start after the RS_ constants */
X#define ROOMBASE 39
X#define RS_COURT 38
X#define RS_ZORCH 37
X#define RS_CIRCLE 36
X#define RS_MAGIC_ISLE 35
X#define RS_STARPEAK 34
X#define RS_VOLCANO 33
X#define RS_HIGHASTRAL 32
X#define RS_FIREPLANE 31
X#define RS_AIRPLANE 30
X#define RS_WATERPLANE 29
X#define RS_EARTHPLANE 28
X#define RS_LOWERASTRAL 27
X#define RS_CLOSET 26
X#define RS_SECRETPASSAGE 25
X#define RS_DININGROOM 24
X#define RS_BATHROOM 23
X#define RS_BEDROOM 22
X#define RS_KITCHEN 21
X#define RS_DROWNED_SEWER 20
X#define RS_DRAINED_SEWER 19
X#define RS_SEWER_DUCT 18
X#define RS_ARENA 17
X#define RS_COUNTRYSIDE 16
X#define RS_DRUID 15
X#define RS_HECATE 14
X#define RS_ATHENA 13
X#define RS_SET 12
X#define RS_ODIN 11
X#define RS_DESTINY 10
X#define RS_ADEPT 9
X#define RS_WYRM 8
X#define RS_OCEAN 7 
X#define RS_PONDS 6
X#define RS_DRAGONLORD 5
X#define RS_GOBLINKING 4
X#define RS_CAVERN 3
X#define RS_CORRIDOR 2
X#define RS_WALLSPACE 1
X
X/* objects, locations, and terrain; characters to draw */
X#define SPACE ' '
X#define WALL '#'
X#define PORTCULLIS '7'
X#define OPEN_DOOR '|'
X#define CLOSED_DOOR '-'
X#define WHIRLWIND '6'
X#define ABYSS '0'
X#define LAVA '`'
X#define HEDGE '\"'
X#define WATER '~' 
X#define FIRE ';'
X#define TRAP '^'
X#define LIFT '_'
X#define UP '<'
X#define DOWN '>'
X#define FLOOR '.'
X#define PLAYER '@'
X#define CORPSE '+'
X#define STATUE '1'
X#define RUBBLE '4'
X#define ALTAR '8'
X#define CASH '$'      /* various kinds of money */
X#define PILE '*'      /* several objects in one place */
X#define FOOD '%'
X#define WEAPON ')'
X#define MISSILEWEAPON '('
X#define SCROLL '?'
X#define POTION '!'
X#define ARMOR ']'
X#define SHIELD '['
X#define CLOAK '}'
X#define BOOTS '{'
X#define STICK '/'
X
X#define RING '='
X#define THING '\\'
X#define ARTIFACT '&'
X
X/* TERRAIN TYPES */
X#define PLAINS '-'
X#define TUNDRA '_'
X#define ROAD '.'
X#define MOUNTAINS '^'
X#define PASS 'v'
X#define RIVER '~'
X#define CITY 'O'
X#define VILLAGE 'o'
X#define FOREST '('
X#define JUNGLE ')'
X#define SWAMP '='
X#define VOLCANO '!'
X#define CASTLE '%'
X#define TEMPLE 'X'
X#define CAVES '*'
X#define DESERT '\"'
X#define CHAOS_SEA '+'
X#define STARPEAK '|'
X#define DRAGONLAIR '$'
X#define MAGIC_ISLE '&'
X
X#define CHAIR '5'
X#define SAFE '3'
X#define FURNITURE '2'
X#define BED '9'
X
X/* wow, all characters used! */
X
X
X/* total number of player options */
X#define NUMOPTIONS 9
X
X/* number of options with TRUE/FALSE values */
X#define NUMTFOPTIONS 7
X
X/* The slot number of the two options not in Player.options */
X#define VERBOSITY_LEVEL 8
X#define SEARCH_DURATION 9
X
X/* Player.options bits */
X#define BELLICOSE 1 
X#define JUMPMOVE 2
X#define RUNSTOP 4
X#define PICKUP 8
X#define CONFIRM 16
X#define TOPINV 32
X#define PACKADD 64
X
X/* This has to be changed whenever an item is added */
X#define NUMSCROLLS 24
X#define NUMPOTIONS 18
X#define NUMFOODS 16
X#define NUMTHINGS 26
X#define NUMWEAPONS 41
X#define NUMARMOR 17
X#define NUMSHIELDS 8
X#define NUMCLOAKS 7
X#define NUMBOOTS 7
X#define NUMRINGS 10
X#define NUMSTICKS 17
X#define NUMARTIFACTS 24
X
X/* running sum of itemtypes, for indexing into Objects array */
X#define THINGID 0 
X#define FOODID NUMTHINGS
X#define SCROLLID (FOODID + NUMFOODS)
X#define POTIONID (SCROLLID + NUMSCROLLS)
X#define WEAPONID (POTIONID + NUMPOTIONS)
X#define ARMORID (WEAPONID + NUMWEAPONS)
X#define SHIELDID (ARMORID + NUMARMOR)
X#define CLOAKID (SHIELDID + NUMSHIELDS)
X#define BOOTID (CLOAKID + NUMCLOAKS)
X#define RINGID (BOOTID + NUMBOOTS)
X#define STICKID (RINGID + NUMRINGS)
X#define ARTIFACTID (STICKID + NUMSTICKS)
X#define CASHID (ARTIFACTID+NUMARTIFACTS)
X/* Corpse's aux field is monster id */
X#define CORPSEID (CASHID+1)
X
X#define TOTALITEMS (CORPSEID+1) 
X
X/* describing unique items and monsters */
X#define COMMON 0
X#define UNIQUE_UNMADE 1
X#define UNIQUE_MADE 2
X
X/* general item function id's */
X#define I_NO_OP 0
X#define I_NOTHING 1
X
X  /* note some of these functions are for other types of items too */
X
X    /* scroll functions */
X#define I_BLESS 101
X#define I_ACQUIRE 102
X#define I_ENCHANT 103
X#define I_TELEPORT 104
X#define I_WISH 105
X#define I_CLAIRVOYANCE 106
X#define I_DISPLACE 107
X#define I_ID 108
X#define I_FIREFLASH 109
X#define I_SPELLS 110
X#define I_JANE_T 111
X#define I_ALERT 112
X#define I_FLUX 113
X#define I_CHARGE 114
X#define I_WARP 115
X#define I_KNOWLEDGE 116
X#define I_LAW 117
X#define I_HINT 118
X#define I_HERO 119
X#define I_TRUESIGHT 120
X#define I_ILLUMINATE 121
X#define I_DEFLECT 122
X
X    /* potion functions */
X#define I_HEAL 201
X#define I_OBJDET 202
X#define I_MONDET 203
X#define I_SLEEP_SELF 204
X#define I_RESTORE 205
X#define I_NEUTRALIZE_POISON 206
X#define I_SPEED 207
X#define I_AZOTH 208
X#define I_REGENERATE 210
X#define I_INVISIBLE 211
X#define I_BREATHING 212
X#define I_FEAR_RESIST 213
X#define I_AUGMENT 214
X#define I_CHAOS 215
X#define I_ACCURACY 216
X#define I_LEVITATION 217
X#define I_CURE 218
X
X    /* stick functions */
X#define I_FIREBOLT 301
X#define I_LBOLT 302
X#define I_MISSILE 303
X#define I_SLEEP_OTHER 304
X#define I_FIREBALL 305
X#define I_LBALL 306
X#define I_SUMMON 307
X#define I_HIDE 308
X#define I_DISRUPT 309
X#define I_DISINTEGRATE 310
X#define I_SNOWBALL 311
X#define I_APPORT 312
X#define I_DISPEL 313
X#define I_POLYMORPH 314
X#define I_FEAR 315
X
X    /* food functions */
X#define I_FOOD 401
X#define I_LEMBAS 402
X#define I_STIM 403
X#define I_POW 404
X#define I_IMMUNE 405
X#define I_POISON_FOOD 406
X#define I_CORPSE 407
X#define I_PEPPER_FOOD 408
X#define I_CANNIBAL 409
X#define I_INEDIBLE 410
X
X    /* boots functions */
X#define I_PERM_SPEED 501
X#define I_PERM_HERO 502
X#define I_PERM_LEVITATE 503
X#define I_PERM_AGILITY 504
X#define I_BOOTS_JUMPING 505
X#define I_BOOTS_7LEAGUE 506
X
X    /* cloak functions */
X#define I_PERM_DISPLACE 601
X#define I_PERM_NEGIMMUNE 602
X#define I_PERM_INVISIBLE 603
X#define I_PERM_ACCURACY 604
X#define I_PERM_PROTECTION 605
X#define I_PERM_TRUESIGHT 606
X
X    /* ring functions */
X#define I_PERM_VISION 701
X#define I_PERM_BURDEN 702
X#define I_PERM_STRENGTH 703
X#define I_PERM_GAZE_IMMUNE 704
X#define I_PERM_FIRE_RESIST 705
X#define I_PERM_POISON_RESIST 706
X#define I_PERM_REGENERATE 707
X#define I_PERM_KNOWLEDGE 708
X
X    /* armor functions */
X#define I_PERM_ENERGY_RESIST 801
X#define I_PERM_BREATHING 802
X#define I_PERM_FEAR_RESIST 803
X#define I_NORMAL_ARMOR 804
X
X/* artifact functions */
X#define I_ORBFIRE 901
X#define I_ORBWATER 902
X#define I_ORBEARTH 903
X#define I_ORBAIR 904
X#define I_ORBMASTERY 905
X#define I_ORBDEAD 906
X#define I_CRYSTAL 907
X#define I_ANTIOCH 908
X#define I_KOLWYNIA 909
X#define I_DEATH 910
X#define I_ENCHANTMENT 911
X#define I_HELM 912
X#define I_LIFE 913
X#define I_JUGGERNAUT 914
X#define I_SYMBOL 915
X#define I_STARGEM 916
X#define I_SCEPTRE 917
X#define I_PLANES 918
X
X/* weapons functions */
X#define I_NORMAL_WEAPON 1001
X#define I_LIGHTSABRE 1002
X#define I_DEMONBLADE 1003
X#define I_MACE_DISRUPT 1004
X#define I_TANGLE 1005
X#define I_ARROW 1006
X#define I_BOLT 1007
X#define I_VORPAL 1008
X#define I_DESECRATE 1009
X#define I_FIRESTAR 1010
X#define I_DEFEND 1011
X#define I_VICTRIX 1012
X#define I_EMPIRE 1013
X#define I_SCYTHE 1014
X#define I_ACIDWHIP 1015
X
X/* thing functions */
X#define I_PICK 1101
X#define I_KEY 1102
X#define I_SHOVEL 1103 /* unused */
X#define I_EXCAVATOR 1104 /* unused */
X#define I_PERM_ILLUMINATE 1105
X#define I_TRAP 1106
X#define I_RAISE_PORTCULLIS 1107
X
X/* shield functions */
X#define I_PERM_DEFLECT 1201
X#define I_NORMAL_SHIELD 1202
X
X/* monster function ids */
X/* Its conceivable for a function of one type to be called when another
Xwould usually occur. A monster's special function may be an extra move,
Xfor example. */
X
X#define M_NO_OP -1
X
X/* talk functions */
X#define M_TALK_STUPID 101
X#define M_TALK_SILENT 102
X#define M_TALK_HUNGRY 103
X#define M_TALK_GREEDY 104
X#define M_TALK_TITTER 105
X#define M_TALK_MAN 106
X#define M_TALK_ROBOT 107
X#define M_TALK_EVIL 108
X#define M_TALK_BURBLE 109
X#define M_TALK_SLITHY 110
X#define M_TALK_MIMSY 111
X#define M_TALK_SEDUCTOR 112
X#define M_TALK_MP 113
X#define M_TALK_IM 114
X#define M_TALK_GUARD 115
X#define M_TALK_GHOST 116
X#define M_TALK_HINT 117
X#define M_TALK_BEG 118
X#define M_TALK_EF 119
X#define M_TALK_GF 120
X#define M_TALK_MORGON 121
X#define M_TALK_LB 122
X#define M_TALK_DEMONLOVER 123
X#define M_TALK_ASSASSIN 124
X#define M_TALK_NINJA 125
X#define M_TALK_THIEF 126
X#define M_TALK_MERCHANT 127
X#define M_TALK_HORSE 128
X#define M_TALK_PARROT 129
X#define M_TALK_ANIMAL 130
X#define M_TALK_HYENA 131
X#define M_TALK_SERVANT 132
X#define M_TALK_SCREAM 133
X#define M_TALK_DRUID 134
X#define M_TALK_ARCHMAGE 135
X#define M_TALK_PRIME 136
X
X/* ability functions */
X#define M_SP_SURPRISE 201
X#define M_SP_MP 202
X#define M_SP_THIEF 203
X#define M_SP_AGGRAVATE 204
X#define M_SP_POISON_CLOUD 205
X#define M_SP_HUGE 206
X#define M_SP_SUMMON 207
X#define M_SP_ILLUSION 208
X#define M_SP_FLUTTER 209
X#define M_SP_ESCAPE 210
X#define M_SP_SPELL 211
X#define M_SP_EXPLODE 212
X#define M_SP_DEMON 213
X#define M_SP_ACID_CLOUD 214
X#define M_SP_WHIRL 215
X#define M_SP_GHOST 216
X#define M_SP_WHISTLEBLOWER 217
X#define M_SP_EATER 218
X#define M_SP_LAWBRINGER 219
X#define M_SP_DRAGONLORD 220
X#define M_SP_DE 221
X#define M_SP_DEMONLOVER 222
X#define M_SP_SEDUCTOR 223
X#define M_SP_MASTER 224
X#define M_SP_WYRM 225
X#define M_SP_BLACKOUT 226
X#define M_SP_BOG 227
X#define M_SP_MERCHANT 228
X#define M_SP_WERE 229
X#define M_SP_LEASH 230
X#define M_SP_SERVANT 231
X#define M_SP_AV 232
X#define M_SP_LW 233
X#define M_SP_SWARM 234
X#define M_SP_ANGEL 235
X#define M_SP_MB 236
X#define M_SP_MIRROR 237
X#define M_SP_RAISE 238
X#define M_SP_DEATH 239
X#define M_SP_COURT 240
X#define M_SP_LAIR 241
X#define M_SP_PRIME 242
X
X/* rangestrike functions */
X#define M_STRIKE_MISSILE 301
X#define M_STRIKE_FBOLT 302
X#define M_STRIKE_LBALL 303
X#define M_STRIKE_FBALL 304
X#define M_STRIKE_BLIND 305
X#define M_STRIKE_SNOWBALL 306
X#define M_STRIKE_MASTER 307
X#define M_STRIKE_SONIC 308
X
X/* combat functions */
X#define M_MELEE_NORMAL 401
X#define M_MELEE_FIRE 402
X#define M_MELEE_DRAGON 403
X#define M_MELEE_MP 404
X#define M_MELEE_ELEC 405
X#define M_MELEE_POISON 406
X#define M_MELEE_NG 407
X#define M_MELEE_SUCCUBUS 408
X#define M_MELEE_SPIRIT 409
X#define M_MELEE_DISEASE 410
X#define M_MELEE_SLEEP 411
X#define M_MELEE_COLD 412
X#define M_MELEE_MASTER 413
X#define M_MELEE_GRAPPLE 414
X#define M_MELEE_DEATH 415
X
X/* movement functions */
X#define M_MOVE_NORMAL 501
X#define M_MOVE_FLUTTER 502
X#define M_MOVE_TELEPORT 503
X#define M_MOVE_FOLLOW 504
X#define M_MOVE_RANDOM 505
X#define M_MOVE_SMART 506
X#define M_MOVE_SPIRIT 507
X#define M_MOVE_SCAREDY 508
X#define M_MOVE_CONFUSED 509
X#define M_MOVE_ANIMAL 510
X
X/* MLx -> index to Monsters starting for level x */
X/* MLx -> number of monsters of level x or less */
X/* NML_x -> number of monsters of level x */
X/* NML-X must be changed whenever a monster is added */
X#define ML0 0
X#define NML_0 9
X#define ML1 (ML0 + NML_0)
X#define NML_1 22
X#define ML2 (ML1 + NML_1)
X#define NML_2 14
X#define ML3 (ML2 + NML_2)
X#define NML_3 15
X#define ML4 (ML3 + NML_3)
X#define NML_4 18
X#define ML5 (ML4 + NML_4)
X#define NML_5 14
X#define ML6 (ML5 + NML_5)
X#define NML_6 13
X#define ML7 (ML6 + NML_6)
X#define NML_7 15
X#define ML8 (ML7 + NML_7)
X#define NML_8 12
X#define ML9 (ML8 + NML_8)
X#define NML_9 8
X#define ML10 (ML9 + NML_9)
X#define NML_10 10
X
X#define NUMMONSTERS (ML10 + NML_10)
X
X/* Some monster ID's : (Those that are explicitly named in code) */
X/* Actually, there are still many magic constants floating around. */
X/* Eventually I'll get around to making each monster's id a constant.... */
X#define RANDOM -1
X#define NPC (ML0+4)
X#define HISCORE_NPC (ML0+8)
X#define BUNNY (ML0+5)
X#define BLACKSNAKE (ML1+14)
X#define HAWK (ML1+13)
X#define IMPALA (ML1+19)
X#define WOLF (ML2+10)
X#define LION (ML3+8)
X#define BRIGAND (ML3+9)
X#define QUAIL (ML1+11)
X#define BADGER (ML1+12)
X#define DEER (ML1+14)
X#define BEAR (ML3+10)
X#define ANTEATER (ML1+16)
X#define PARROT (ML1+20)
X#define MAMBA (ML3+11)
X#define ANT (ML2+11)
X#define HYENA (ML1+21)
X#define ELEPHANT (ML2+12)
X#define TROUT (ML1+18)
X#define BASS (ML1+19)
X#define MANOWAR (ML3+12)
X#define CROC (ML4+8)
X#define BOGTHING (ML5+8)
X#define CAMEL (ML1+15)
X#define SHEEP (ML0+5)
X#define GHOST (ML2+6)
X#define HAUNT (ML4+5)
X#define SPECTRE (ML5+5)
X#define LICHE (ML6+5)
X#define HORSE (ML2+13)
X
X
X/* location functions */
X#define L_NO_OP 0
X
X/* random sites */
X#define L_LIFT 1
X#define L_BALANCESTONE 2
X#define L_FIRE 3
X#define L_WHIRLWIND 4
X#define L_VOIDSTONE 5
X#define L_WARNING 6
X#define L_ARENA_EXIT 7
X#define L_HOUSE_EXIT 8
X#define L_SAFE 9
X
X/* city level shop and guild functions */
X/* following are those in CitySiteList */
X#define NUMCITYSITES 26
X#define CITYSITEBASE 10
X#define L_CHARITY 10
X#define L_ARMORER 11
X#define L_CLUB 12
X#define L_GYM 13
X#define L_THIEVES_GUILD 14
X#define L_COLLEGE 15
X#define L_HEALER 16
X#define L_CASINO 17
X#define L_TAVERN 18
X#define L_MERC_GUILD 19
X#define L_ALCHEMIST 20
X#define L_SORCERORS 21
X#define L_CASTLE 22
X#define L_ARENA 23
X#define L_DPW 24
X#define L_LIBRARY 25
X#define L_PAWN_SHOP 26
X#define L_BANK 27
X#define L_CONDO 28
X#define L_ORACLE 29
X#define L_ORDER 30
X#define L_DINER 31
X#define L_COMMANDANT 32
X#define L_CRAP 33
X#define L_TEMPLE 34
X#define L_COUNTRYSIDE 35
X/* end of city sites */
X
X/* random sites */
X#define L_JAIL 36
X#define L_TEMPLE_WARNING 37
X#define L_LAWSTONE 38
X#define L_CHAOSTONE 39
X
X/* final abyss sites ignore levitation*/
X#define L_EARTH_STATION 40
X#define L_FIRE_STATION 41
X#define L_WATER_STATION 42
X#define L_AIR_STATION 43
X#define L_VOID_STATION 44
X#define L_VOID 45
X#define L_VOICE1 46
X#define L_VOICE2 47
X#define L_VOICE3 48
X
X#define L_SACRIFICESTONE 49
X
X/* circle hq sites */
X#define L_TOME1 50
X#define L_TOME2 51
X#define L_ENTER_CIRCLE 52
X#define L_CIRCLE_LIBRARY 53
X
X/* other site functions */
X#define L_BROTHEL 54
X#define L_DRUID 55
X#define L_ALTAR 56
X
X#define L_GARDEN 57
X#define L_ADEPT 58
X#define L_SEWER 59
X
X#define L_OMEGA 60
X#define L_CARTOGRAPHER 61
X#define L_STABLES 62
X#define L_COMMONS 63
X#define L_GRANARY 64
X#define L_MAZE 65
X#define L_HOVEL 66
X#define L_HOUSE 67
X#define L_MANSION 68
X#define L_OCCUPIED_HOUSE 69
X#define L_TACTICAL_EXIT 70
X#define L_VAULT 71
X#define L_CEMETARY 72
X#define L_THRONE 73
X#define L_ESCALATOR 74
X#define L_ENTER_COURT 75
X
X#define L_TRIFID 76
X#define L_FINAL_ABYSS 77
X#define L_RAISE_PORTCULLIS 78
X
X#define L_MINDSTONE 79
X
X/* above LEVITATION_AVOIDANCE, no effect if player is levitating */
X#define LEVITATION_AVOIDANCE 80
X
X/* random sites */
X#define L_CHAOS 81
X#define L_WATER 82
X#define L_LAVA 83
X#define L_MAGIC_POOL 84
X#define L_PORTCULLIS_TRAP 85
X#define L_DROP_EVERY_PORTCULLIS 87
X#define L_PORTCULLIS 88
X
X
X/* traps */
X#define NUMTRAPS 13
X#define TRAP_BASE 89
X
X/* traps */
X#define L_TRAP_DART 89
X#define L_TRAP_PIT 90
X#define L_TRAP_DOOR 91
X#define L_TRAP_SNARE 92
X#define L_TRAP_BLADE 93
X#define L_TRAP_FIRE 94
X#define L_TRAP_TELEPORT 95
X#define L_TRAP_DISINTEGRATE 96
X#define L_TRAP_SLEEP_GAS 97
X#define L_TRAP_ACID 98
X#define L_TRAP_MANADRAIN 99
X#define L_TRAP_ABYSS 100
X#define L_TRAP_SIREN 101
X
X/* more random sites */
X#define L_STATUE_WAKE 102
X#define L_STATUE_RANDOM 103
X
X#define L_HEDGE 104
X#define L_RUBBLE 105
X
X#define L_ABYSS 106
X
X/* player possession slots */
X/* slot 0 should not be filled when out of inventory_control() */
X
X#define O_UP_IN_AIR 0
X#define O_READY_HAND 1
X#define O_WEAPON_HAND 2
X#define O_LEFT_SHOULDER 3
X#define O_RIGHT_SHOULDER 4
X#define O_BELT1 5
X#define O_BELT2 6
X#define O_BELT3 7
X#define O_SHIELD 8 
X#define O_ARMOR 9
X#define O_BOOTS 10
X#define O_CLOAK 11
X#define O_RING1 12
X#define O_RING2 13
X#define O_RING3 14
X#define O_RING4 15
X
X/* structure definitions */
X
Xstruct room {
X  int lighted; 
X  int left,right,top,bottom;
X  int rsi; /* index into roomname switch */
X};
X
X
X
Xstruct spell {
X  char known;
X  char id;
X  char powerdrain;
X} ;
X
X
Xstruct monster {
X  struct objectlist *possessions;
X  int attacked,aux1,aux2,x,y,click;
X  int id,hp,hit,ac,dmg,sense,wakeup,level,speed,sleep,treasure;
X  int xpv,corpseweight,corpsevalue,transformid,startthing,uniqueness;
X  int talkf,movef,meleef,strikef,specialf;
X  long status,immunity;
X  char monchar;
X  char *monstring,*corpsestr,*meleestr;
X};
X
X
Xstruct monsterlist {
X  struct monster *m;
X  struct monsterlist *next;
X};
X
X
X
X
Xstruct player {
X  int str,con,dex,agi,iq,pow,maxstr,maxcon,maxdex,maxagi,maxiq,maxpow;
X  int xp,level,hp,maxhp,hit,dmg,absorption,speed,click;
X  int defense,food,alignment,mana,maxmana;
X  int cash,patron,birthday;
X  char preference;
X  int sx,sy; /* sanctuary coordinates */
X  int x,y; /* current player coordinates */
X  int itemweight,maxweight;
X  int immunity[NUMIMMUNITIES];
X  int status[NUMSTATI];
X  long options;
X  int rank[NUMRANKS];
X  int guildxp[NUMRANKS];
X  char name[64];
X  char meleestr[64];
X  struct object *possessions[MAXITEMS];
X  struct object *pack[MAXPACK];
X  int packptr;
X};
X
X
X
Xstruct object {
X  int id,weight,plus,charge,dmg,hit,aux,number,fragility;
X  int basevalue, known, used, blessing,type,uniqueness,usef,level;
X  char objchar,*objstr,*truename,*cursestr;
X};
X
X
X
Xstruct objectlist {
X  struct object *thing;
X  struct objectlist *next;
X};
X
X
X
X/* terrain locations */
Xstruct terrain {
X  char base_terrain_type;
X  char current_terrain_type;
X  char aux;
X  char explored;
X};
X
X/* dungeon locations */
Xstruct location {
X  char p_locf; /* function executed when moved on */
X  int lstatus; /* seen,stopsrun,lit,secret, */
X  char roomnumber; /* so room can be named */
X  char locchar; /* terrain type */
X  char showchar; /*char instantaneously drawn for site */
X  int aux; /* signifies various things */
X  int buildaux; /* used in constructing level */
X  struct objectlist *things; 
X  struct monster *creature;
X };
X
X
Xstruct level {
X  char depth; /* which level is this */
X  struct level *next; /* pointer to next level in dungeon */
X  struct location site[MAXWIDTH][MAXLENGTH]; /* dungeon data */
X  char generated; /* has the level been made (visited) yet? */
X  char numrooms; /* number of rooms on level */
X  char tunnelled; /* amount of tunnelling done on this level */
X  struct monsterlist *mlist; /* List of monsters on level */
X  int environment; /* where kind of level is this? */
X  int deepest; /*If level is dungeon head, deepest level made */
X};
X
X 
X/* random typedef's */
X
Xtypedef struct monsterlist mltype;
Xtypedef mltype *pml;
X
Xtypedef struct monster montype;
Xtypedef montype *pmt;
X
Xtypedef struct location loctype;
Xtypedef loctype *plc;
X
Xtypedef struct level levtype;
Xtypedef levtype *plv;
X
Xtypedef struct object objtype;
Xtypedef objtype *pob;
X
Xtypedef struct objectlist oltype;
Xtypedef oltype *pol;
X
X/* random  function declarations from system libraries */
X
Xchar *malloc(),*calloc(),*getlogin();
Xint free();
Xlong time();
X
X#ifdef NORANDOM
Xint rand();
Xint srand();
X#define RANDFUNCTION rand()
X#define SRANDFUNCTION srand((int)(time((long *)NULL)+Seed))
X#endif
X
X#ifndef NORANDOM
Xlong random();
Xint srandom();
X#define RANDFUNCTION random()
X#define SRANDFUNCTION srandom((int)(time((long *)NULL)+Seed))
X#endif
X
X
X#define pow2(n) (1 << n)
X
X
X/* systemV for some reason uses string.h instead of strings.h */
X/* Also, random and srandom are unlikely to be found on system V... */
X
X#ifdef STRING
X#include <string.h>
X#endif
X
X#ifndef STRING
X#include <strings.h>
X#endif
X
X#include <stdio.h>
X
X#ifndef TRUE
X#define TRUE 1
X#define FALSE 0
X#endif
X
END_OF_FILE
if test 27638 -ne `wc -c <'odefs.h'`; then
    echo shar: \"'odefs.h'\" unpacked with wrong size!
fi
# end of 'odefs.h'
fi
if test -f 'ogen1.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'ogen1.c'\"
else
echo shar: Extracting \"'ogen1.c'\" \(17410 characters\)
sed "s/^X//" >'ogen1.c' <<'END_OF_FILE'
X/* omega copyright (c) 1987,1988 by Laurence Raphael Brothers */
X/* ogen1.c */
X/* level generator functions */
X
X#include "oglob.h"
X
X
X/* bv access functions for dungeon location stati */
Xint loc_statusp(x,y,stat)
Xint x,y;
Xint stat;
X{
X  return(Level->site[x][y].lstatus & stat);
X}
X
Xvoid lset(x,y,stat)
Xint x,y;
Xint stat;
X{
X Level->site[x][y].lstatus |= stat;
X}
X
Xvoid lreset(x,y,stat)
Xint x,y;
Xint stat;
X{
X  Level->site[x][y].lstatus &= ~stat;
X}
X
X
X
X/* Deallocate current dungeon */
Xvoid free_dungeon()
X{
X  plv tlv;
X  
X  while (Dungeon != NULL) {
X    tlv = Dungeon;
X    Dungeon = Dungeon->next;
X    free((char *) tlv);
X  }
X}
X
X
X/* erase the level w/o deallocating it*/
Xvoid clear_level(dungeon_level)
Xstruct level *dungeon_level;
X{
X  int i,j;
X  if (dungeon_level != NULL) {
X    dungeon_level->generated = FALSE;
X    dungeon_level->numrooms = 0;
X    dungeon_level->tunnelled = 0;
X    dungeon_level->mlist = NULL;
X    for(i=0;i<MAXWIDTH;i++)
X      for(j=0;j<MAXLENGTH;j++) {
X	dungeon_level->site[i][j].locchar = WALL;
X	dungeon_level->site[i][j].showchar = ' ';
X	dungeon_level->site[i][j].creature = NULL;
X	dungeon_level->site[i][j].things = NULL;
X	dungeon_level->site[i][j].aux = difficulty()*20;
X	dungeon_level->site[i][j].buildaux = 0;
X	dungeon_level->site[i][j].p_locf = L_NO_OP;
X	dungeon_level->site[i][j].lstatus = 0;
X	dungeon_level->site[i][j].roomnumber = RS_WALLSPACE;
X      }
X  }
X}
X
X
X
X/* Looks for level tolevel in current dungeon which is named by
XDungeon, which may be NULL. If the level is found, and rewrite_level
Xis FALSE, and the level has already been generated, nothing happens
Xbeyond Level being set correctly. Otherwise the level is recreated
Xfrom scratch */
X
Xvoid change_level(fromlevel,tolevel,rewrite_level)
Xchar fromlevel,tolevel,rewrite_level;
X{
X  struct level *thislevel = NULL;
X  Player.sx = -1; Player.sy = -1; /* sanctuary effect dispelled */
X  thislevel = findlevel(Dungeon,tolevel);
X  if (Dungeon != NULL) {
X    Dungeon->deepest = max(Dungeon->deepest,tolevel);
X    Level->deepest = Dungeon->deepest;
X  }
X  if (thislevel == NULL) {
X    thislevel = ((plv) malloc(sizeof(levtype)));
X    clear_level(thislevel);
X    Level = thislevel;
X    Level->next = Dungeon;
X    Dungeon = Level;
X  }
X  Level = thislevel;
X  if ((! Level->generated) || rewrite_level) {
X    Level->environment = Current_Environment;
X    Level->depth = tolevel;
X    Level->generated = TRUE;
X    switch(Current_Environment) {
X    case E_CAVES: 
X      if ((random_range(4)==0) && (tolevel < MaxDungeonLevels))
X	room_level();
X      else cavern_level();
X      break;
X    case E_SEWERS: 
X      if ((random_range(4)==0) && (tolevel < MaxDungeonLevels))
X	room_level();
X      else sewer_level(); 
X      break;
X    case E_CASTLE:
X      room_level();
X      break;
X    case E_ASTRAL:
X      maze_level();
X      break;
X    case E_VOLCANO:
X      switch(random_range(3)) {
X      case 0: cavern_level(); break;
X      case 1: room_level(); break;
X      case 2: maze_level(); break;
X      }
X      break;
X    default: print3("This dungeon not implemented!"); break;
X    }
X    Level->deepest = tolevel;
X    install_traps();
X    install_specials();
X    make_stairs(fromlevel);
X    make_stairs(fromlevel);
X  }
X  find_stairs(fromlevel,tolevel);
X  erase_level();
X  ScreenOffset = Player.y - (ScreenLength/2);
X  show_screen();
X  screencheck(Player.y);
X  drawvision(Player.x,Player.y);
X  /* synchronize with player on level change */
X  Player.click = (Tick+1)%60;
X  roomcheck();
X}
X
X
X/* tries to find the level of depth levelnum in dungeon; if can't find
X   it returns NULL */
Xplv findlevel(dungeon,levelnum)
Xstruct level *dungeon;
Xchar levelnum;
X{
X  if (dungeon == NULL) return(NULL);
X  else {
X    while((dungeon->next != NULL) && (dungeon->depth != levelnum))
X      dungeon = dungeon->next;
X    if (dungeon->depth == levelnum) return(dungeon);
X    else return(NULL);
X  }
X}
X
X
X
X/* keep going in one orthogonal direction or another until we hit our */
X/* destination */
X
Xvoid straggle_corridor(fx,fy,tx,ty,loc,rsi)
Xint fx,fy,tx,ty;
Xchar loc;
Xchar rsi;
X{
X  int dx,dy;
X  while ((fx != tx) || (fy != ty)) {
X    dx = tx - fx;
X    dy = ty - fy;
X    if (random_range(abs(dx)+abs(dy)) < abs(dx))
X      corridor_crawl(&fx,&fy,sign(dx),0,random_range(abs(dx))+1,loc,rsi);
X    else corridor_crawl(&fx,&fy,0,sign(dy),random_range(abs(dy))+1,loc,rsi);
X  }
X}
X
X
X
Xvoid makedoor(x,y)
Xint x,y;
X{
X  if (random_range(20) <= Level->depth/10) {
X    Level->site[x][y].locchar = FLOOR;
X    lset(x,y,SECRET);
X  }
X  else if (random_range(20)<=Level->depth/2) {
X    Level->site[x][y].locchar = CLOSED_DOOR;
X    if (random_range(20) <= Level->depth/10) 
X      lset(x,y,SECRET);
X    if (random_range(40) <= Level->depth) 
X      Level->site[x][y].aux = LOCKED;
X    else Level->site[x][y].aux = UNLOCKED;
X  }
X  else {
X    Level->site[x][y].locchar = OPEN_DOOR;
X    Level->site[x][y].aux = UNLOCKED;
X  }
X  if (! loc_statusp(x,y,SECRET)) {
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
X
Xvoid corridor_crawl(fx,fy,sx,sy,n,loc,rsi)
Xint *fx,*fy,sx,sy,n;
Xchar loc,rsi;
X{
X  int i;
X  for (i=0;i<n;i++) {
X    *fx += sx;
X    *fy += sy;
X    if ((*fx < WIDTH) && 
X	(*fx > -1) && 
X	(*fy > -1) && 
X	(*fy < LENGTH)) {
X      Level->site[*fx][*fy].locchar = loc;
X      if (Level->site[*fx][*fy].roomnumber == RS_WALLSPACE)
X	Level->site[*fx][*fy].roomnumber = rsi;
X      if (loc==WATER) 
X	Level->site[*fx][*fy].p_locf = L_WATER;
X      else if (loc==FLOOR) 
X	Level->site[*fx][*fy].p_locf = L_NO_OP;
X      else if (loc==RUBBLE)
X	Level->site[*fx][*fy].p_locf = L_RUBBLE;
X    }
X  }
X}  
X
X
X
X
Xchar *roomname(index)
Xint index;
X{
X  switch(index) {
X  case RS_ZORCH:strcpy(Str4,"A place zorched by high power magic.");break;
X  case RS_COURT:strcpy(Str4,"The Court of the ArchMage."); break;
X  case RS_CIRCLE:strcpy(Str4,"The Astral Demesne of the Circle of Sorcerors");
X    break;
X  case RS_MAGIC_ISLE: strcpy(Str4,"An island positively reeking of magic");
X    break;
X  case RS_STARPEAK: strcpy(Str4,"Near the oddly glowing peak of a mountain");
X    break;
X  case RS_VOLCANO: strcpy(Str4,"Deep within the bowels of the earth"); break;
X  case RS_HIGHASTRAL: strcpy(Str4,"The High Astral Plane"); break;
X  case RS_EARTHPLANE: strcpy(Str4,"The Plane of Earth"); break;
X  case RS_WATERPLANE: strcpy(Str4,"The Plane of Water"); break;
X  case RS_FIREPLANE: strcpy(Str4,"The Plane of Fire"); break;
X  case RS_AIRPLANE: strcpy(Str4,"The Plane of Air"); break;
X  case RS_KITCHEN: strcpy(Str4,"A kitchen"); break;
X  case RS_BATHROOM: strcpy(Str4,"A bathroom"); break;
X  case RS_BEDROOM: strcpy(Str4,"A bedroom"); break;
X  case RS_DININGROOM: strcpy(Str4,"A dining room"); break;
X  case RS_SECRETPASSAGE: strcpy(Str4,"A secret passage"); break;
X  case RS_CLOSET: strcpy(Str4,"A stuffy closet"); break;
X  case RS_ARENA: strcpy(Str4,"The Rampart Arena"); break;
X  case RS_DROWNED_SEWER: strcpy(Str4,"A water-filled sewer node"); break;
X  case RS_DRAINED_SEWER: strcpy(Str4,"An unused sewer node"); break;
X  case RS_SEWER_DUCT: strcpy(Str4,"A winding sewer duct"); break;
X  case RS_DESTINY: strcpy(Str4,"The Halls of Fate"); break;
X  case RS_DRUID: strcpy(Str4,"The Great Henge"); break;
X  case RS_HECATE: strcpy(Str4,"The Church of the Far Side"); break;
X  case RS_SET: strcpy(Str4,"The Temple of the Black Hand"); break;
X  case RS_ATHENA: strcpy(Str4,"The Parthenon"); break;
X  case RS_ODIN: strcpy(Str4,"The Shrine of the Noose"); break;
X  case RS_ADEPT: strcpy(Str4,"Labyrinth of The Adept's Challenge."); break;
X  case RS_WYRM: strcpy(Str4,"The Sunken Cavern of the Great Wyrm."); break;
X  case RS_OCEAN: strcpy(Str4,"The Underground Ocean."); break;
X  case RS_PONDS: strcpy(Str4,"A series of subterranean pools and streams."); break;
X  case RS_DRAGONLORD: strcpy(Str4,"The Lair of the DragonLord."); break;
X  case RS_GOBLINKING: strcpy(Str4,"The Caves of the Goblins."); break;
X  case RS_CAVERN: strcpy(Str4,"A vast natural cavern."); break;
X  case RS_CORRIDOR: strcpy(Str4,"A dimly lit corridor."); break;
X  case RS_WALLSPACE: strcpy(Str4,"A niche hollowed out of the wall."); break;
X  case ROOMBASE+0: strcpy(Str4,"An abandoned garderobe."); break;
X  case ROOMBASE+1: strcpy(Str4,"A dungeon cell."); break;
X  case ROOMBASE+2: strcpy(Str4,"A tiled chamber."); break;
X  case ROOMBASE+3: strcpy(Str4,"A crystal cavern."); break;
X  case ROOMBASE+4: strcpy(Str4,"Someone's bedroom."); break;
X  case ROOMBASE+5: strcpy(Str4,"An old storeroom."); break;
X  case ROOMBASE+6: strcpy(Str4,"A room with charred walls."); break;
X  case ROOMBASE+7: strcpy(Str4,"A marble hall."); break;
X  case ROOMBASE+8: strcpy(Str4,"An eerie cave."); break;
X  case ROOMBASE+9: strcpy(Str4,"A ransacked treasure-chamber."); break;
X  case ROOMBASE+10: strcpy(Str4,"A smoke-filled room."); break;
X  case ROOMBASE+11: strcpy(Str4,"A well-appointed apartment."); break;
X  case ROOMBASE+12: strcpy(Str4,"An antechamber."); break;
X  case ROOMBASE+13: strcpy(Str4,"An unoccupied harem."); break;
X  case ROOMBASE+14: strcpy(Str4,"A multi-purpose room."); break;
X  case ROOMBASE+15: strcpy(Str4,"A room filled with stalactites."); break;
X  case ROOMBASE+16: strcpy(Str4,"An underground greenhouse."); break;
X  case ROOMBASE+17: strcpy(Str4,"A water closet."); break;
X  case ROOMBASE+18: strcpy(Str4,"A study."); break;
X  case ROOMBASE+19: strcpy(Str4,"A living room."); break;
X  case ROOMBASE+20: strcpy(Str4,"A comfortable den."); break;
X  case ROOMBASE+21: strcpy(Str4,"An abatoir."); break;
X  case ROOMBASE+22: strcpy(Str4,"A boudoir.");break;
X  case ROOMBASE+23: strcpy(Str4,"A star chamber.");break;
X  case ROOMBASE+24: strcpy(Str4,"A manmade cavern."); break;
X  case ROOMBASE+25: strcpy(Str4,"A sewer control room");break;
X  case ROOMBASE+26: strcpy(Str4,"A shrine to High Magic"); break;
X  case ROOMBASE+27: strcpy(Str4,"A magic laboratory"); break;
X  case ROOMBASE+28: strcpy(Str4,"A room with inscribed pentagram");break;
X  case ROOMBASE+29: strcpy(Str4,"A chamber with a blue crystal omega dais");
X    break;
X  default: strcpy(Str4,"A room of mystery and allure."); break;
X  }
X  return(Str4);
X}
X
X
X
X/* puts the player on the first set of stairs from the apt level */
X/* if can't find them, just drops player anywhere.... */
Xvoid find_stairs(fromlevel,tolevel)
Xchar fromlevel;
Xchar tolevel;
X{
X  int i,j,found=FALSE;
X  char sitechar;
X  if (fromlevel > tolevel) sitechar = DOWN; else sitechar = UP;
X  for(i=0;i<WIDTH;i++)
X    for(j=0;j<LENGTH;j++) 
X      if ((Level->site[i][j].locchar == sitechar) && (! found)) { 
X	found = TRUE;
X	Player.x = i;
X	Player.y = j;
X	break;
X      }
X  if (! found) {
X    findspace(&Player.x,&Player.y,-1);
X    if (Level->environment != E_ASTRAL)
X      Level->site[Player.x][Player.y].locchar = sitechar;
X  }
X}
X
X
X
Xvoid install_traps()
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].locchar == FLOOR) &&
X	  (Level->site[i][j].p_locf == L_NO_OP) &&
X	  random_range(500) <= ((int)(Level->depth/6)))
X	Level->site[i][j].p_locf = TRAP_BASE+random_range(NUMTRAPS);
X}
X
X
X
X/* x, y, is top left corner, l is length of side, rsi is room string index */
X/* baux is so all rooms will have a key field. */
Xvoid build_square_room(x,y,l,rsi,baux)
Xint x,y,l;
Xchar rsi;
Xint baux;
X{
X  int i,j;
X
X  for(i=x;i<=x+l;i++)
X    for(j=y;j<=y+l;j++){
X      Level->site[i][j].roomnumber = rsi;
X      Level->site[i][j].buildaux = baux;
X    }
X  for(i=x+1;i<x+l;i++)
X    for(j=y+1;j<y+l;j++) {
X      Level->site[i][j].locchar = FLOOR;
X      Level->site[i][j].p_locf = L_NO_OP;
X    }
X}
X
X
X
Xvoid build_room(x,y,l,rsi,baux)
Xint x,y,l;
Xchar rsi;
Xint baux;
X{
X  build_square_room(x,y,l,rsi,baux);
X}
X
Xvoid cavern_level()
X{
X  int i,fx,fy,tx,ty,t,l,e;
X  char rsi;
X
X  Level->numrooms = 1;
X
X  if ((Current_Dungeon == CAVES) && (Level->depth == CAVELEVELS))
X    rsi = RS_GOBLINKING;
X  else rsi = RS_CAVERN;
X  t = random_range(LENGTH/2);
X  l = random_range(WIDTH/2);
X  e = random_range(WIDTH/8)+WIDTH/8;
X  build_square_room(t,l,e,rsi,0);
X  
X  for (i=0;i<16;i++) {
X    findspace(&tx,&ty,-1);
X    fx = random_range(WIDTH-2)+1;
X    fy = random_range(LENGTH-2)+1;
X    straggle_corridor(fx,fy,tx,ty,FLOOR,RS_CORRIDOR);
X  }
X  while (random_range(3)==1) {
X    findspace(&tx,&ty,-1);
X    fx = random_range(WIDTH-2)+1;
X    fy = random_range(LENGTH-2)+1;
X    straggle_corridor(fx,fy,tx,ty,WATER,RS_PONDS);
X  }
X  if (Current_Dungeon == E_CAVES) {
X    if ((Level->depth == CAVELEVELS) && (! gamestatusp(COMPLETED_CAVES))) {
X      findspace(&tx,&ty,-1);
X      Level->mlist = ((pml) malloc(sizeof(mltype)));
X      Level->mlist->next = NULL;
X      Level->mlist->m = 
X	Level->site[tx][ty].creature = 
X	  ((pmt) make_creature(ML3+5)); /* goblin king */
X      Level->mlist->m->x = tx;
X      Level->mlist->m->y = ty;
X    }
X  }
X  else if (Current_Environment == E_VOLCANO) {
X    if (Level->depth == VOLCANOLEVELS) {
X      findspace(&tx,&ty,-1);
X      Level->mlist = ((pml) malloc(sizeof(mltype)));
X      Level->mlist->next = NULL;
X      Level->mlist->m = 
X	Level->site[tx][ty].creature = 
X	  ((pmt) make_creature(ML10+4)); /* The dark emp */
X      Level->mlist->m->x = tx;
X      Level->mlist->m->y = ty;
X    }
X  }
X  populate_level(Current_Environment);
X  stock_level();
X}
X
X
X
X
X
X
X
Xvoid sewer_level()
X{
X  int i,tx,ty,t,l,e;
X  char rsi,lchar;
X
X  Level->numrooms = random_range(3)+3;
X  rsi = RS_DRAINED_SEWER;
X  for (i=0;i<Level->numrooms;i++) {
X    do {
X      t = random_range(LENGTH-10)+1;
X      l = random_range(WIDTH-10)+1;
X      e = 4;
X    } while ((Level->site[l][t].roomnumber == rsi) ||
X	     (Level->site[l+e][t].roomnumber == rsi) ||
X	     (Level->site[l][t+e].roomnumber == rsi) ||
X	     (Level->site[l+e][t+e].roomnumber == rsi));
X    if (random_range(5)) {
X      lchar = FLOOR;
X      rsi = RS_DRAINED_SEWER;
X    }
X    else {
X      lchar = WATER;
X      rsi = RS_DROWNED_SEWER;
X    }
X    build_room(l,t,e,rsi,i);
X    sewer_corridor(l,t,-1,-1,lchar);
X    sewer_corridor(l+e,t,1,-1,lchar);
X    sewer_corridor(l,t+e,-1,1,lchar);
X    sewer_corridor(l+e,t+e,1,1,lchar);
X  }
X  if (Current_Dungeon == E_SEWERS) {
X    if ((Level->depth == SEWERLEVELS) && (! gamestatusp(COMPLETED_SEWERS))) {
X      findspace(&tx,&ty,-1);
X      Level->mlist = ((pml) malloc(sizeof(mltype)));
X      Level->mlist->next = NULL;
X      Level->mlist->m = 
X	Level->site[tx][ty].creature = 
X	  ((pmt) make_creature(ML7+5)); /* The Great Wyrm */
X      Level->mlist->m->x = tx;
X      Level->mlist->m->y = ty;
X    }
X  }
X  populate_level(Current_Environment); 
X  stock_level();
X}
X
X
X
Xvoid sewer_corridor(x,y,dx,dy,locchar)
Xint x,y,dx,dy;
Xchar locchar;
X{
X  int continuing = TRUE;
X  makedoor(x,y);
X  x+=dx;
X  y+=dy;
X  while(continuing) {
X    Level->site[x][y].locchar = locchar;
X    if (locchar == WATER)
X      Level->site[x][y].p_locf = L_WATER;
X    else Level->site[x][y].p_locf = L_NO_OP;
X    Level->site[x][y].roomnumber = RS_SEWER_DUCT;
X    x+=dx;
X    y+=dy;
X  if (locchar == WATER)
X    continuing = (inbounds(x,y) && 
X		  ((Level->site[x][y].locchar == WALL) ||
X		   (Level->site[x][y].locchar == WATER)));
X  else
X    continuing = (inbounds(x,y) && 
X		  ((Level->site[x][y].roomnumber == RS_WALLSPACE) ||
X		   (Level->site[x][y].roomnumber == RS_SEWER_DUCT)));
X  }
X  if (inbounds(x,y))
X    makedoor(x,y);
X}
X
X
X
X
Xvoid install_specials()
X{
X  int i,j,x,y;
X
X  for(x=0;x<WIDTH;x++)
X    for(y=0;y<LENGTH;y++)
X      if ((Level->site[x][y].locchar == FLOOR) &&
X	  (Level->site[x][y].p_locf == L_NO_OP) &&
X	  (random_range(300) < difficulty())) {
X	i = random_range(100);
X	if (i < 10) {
X	  Level->site[x][y].locchar = ALTAR;
X	  Level->site[x][y].p_locf = L_ALTAR;
X	  Level->site[x][y].aux = random_range(10);
X	}
X	else if (i < 20) {
X	  Level->site[x][y].locchar = WATER;
X	  Level->site[x][y].p_locf = L_MAGIC_POOL;
X	}
X	else if (i < 35) {
X	  Level->site[x][y].locchar = RUBBLE;
X	  Level->site[x][y].p_locf = L_RUBBLE;
X	}
X	else if (i < 40) {
X	  Level->site[x][y].locchar = LAVA;
X	  Level->site[x][y].p_locf = L_LAVA;
X	}
X	else if (i < 45) {
X	  Level->site[x][y].locchar = FIRE;
X	  Level->site[x][y].p_locf = L_FIRE;
X	}
X	else if ((i < 50) && (Current_Environment != E_ASTRAL)) {
X	  Level->site[x][y].locchar = LIFT;
X	  Level->site[x][y].p_locf = L_LIFT;
X	}
X	else if ((i < 55) && (Current_Environment != E_VOLCANO)) {
X	  Level->site[x][y].locchar = HEDGE;
X	  Level->site[x][y].p_locf = L_HEDGE;
X	}
X	else if (i < 57) {
X	  Level->site[x][y].locchar = HEDGE;
X	  Level->site[x][y].p_locf = L_TRIFID;
X	}
X	else if (i< 70) {
X	  Level->site[x][y].locchar = STATUE;
X	  if (random_range(100) < difficulty()) 
X	    for (j=0;j<8;j++) {
X	      if (Level->site[x+Dirs[0][j]][y+Dirs[1][j]].p_locf != L_NO_OP)
X		Level->site[x+Dirs[0][j]][y+Dirs[1][j]].locchar = FLOOR;
X	      Level->site[x+Dirs[0][j]][y+Dirs[1][j]].p_locf = 
X		L_STATUE_WAKE;
X	    }
X	}
X	else {
X	  if (Current_Environment == E_VOLCANO) {
X	    Level->site[x][y].locchar = LAVA;
X	    Level->site[x][y].p_locf = L_LAVA;
X	  }
X	  else if (Current_Environment == E_ASTRAL) {
X	    if (Level->depth == 1) {
X	      Level->site[x][y].locchar = RUBBLE;
X	      Level->site[x][y].p_locf = L_RUBBLE;
X	    }
X	    else if (Level->depth == 2) {
X	      Level->site[x][y].locchar = FIRE;
X	      Level->site[x][y].p_locf = L_FIRE;
X	    }
X	    else if (Level->depth == 3) {
X	      Level->site[x][y].locchar = WATER;
X	      Level->site[x][y].p_locf = L_WATER;
X	    }
X	    else if (Level->depth == 4) {
X	      Level->site[x][y].locchar = ABYSS;
X	      Level->site[x][y].p_locf = L_ABYSS;
X	    }
X	  }
X	  else {
X	    Level->site[x][y].locchar = WATER;
X	    Level->site[x][y].p_locf = L_WATER;
X	  }
X	}
X      }
X}
X
X
END_OF_FILE
if test 17410 -ne `wc -c <'ogen1.c'`; then
    echo shar: \"'ogen1.c'\" unpacked with wrong size!
fi
# end of 'ogen1.c'
fi
if test -f 'ohouse.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'ohouse.c'\"
else
echo shar: Extracting \"'ohouse.c'\" \(5401 characters\)
sed "s/^X//" >'ohouse.c' <<'END_OF_FILE'
X/* omega copyright (C) by Laurence Raphael Brothers, 1987,1988 */
X/* ovillage.c */
X/* some functions to make the house levels */
X
X#include "oglob.h"
X
X
X/* loads the house level into Level*/
Xvoid load_house(kind)
Xint kind;
X{
X  int i,j;
X  char site;
X  
X  FILE *fd;
X
X  TempLevel = Level;
X  if (ok_to_free(TempLevel)) {
X    free((char *) TempLevel);
X    TempLevel = NULL;
X  }
X  Level = ((plv) malloc(sizeof(levtype)));
X  clear_level(Level);
X  strcpy(Str3,OMEGALIB);
X  switch(kind) {
X  case E_HOUSE:
X    strcat(Str3,"ohome1.dat");
X    Level->environment = E_HOUSE;
X    break;
X  case E_MANSION:
X    strcat(Str3,"ohome2.dat");
X    Level->environment = E_MANSION;
X    break;
X  default:
X  case E_HOVEL:
X    strcat(Str3,"ohome3.dat");
X    Level->environment = E_HOVEL;
X    break;
X  }
X  fd = fopen(Str3,"r");
X  for(j=0;j<LENGTH;j++) {
X    for(i=0;i<WIDTH;i++) {
X      if (kind == E_HOVEL) Level->site[i][j].lstatus = SEEN;
X      else Level->site[i][j].lstatus = 0;
X      Level->site[i][j].roomnumber = RS_CORRIDOR;
X      Level->site[i][j].p_locf = L_NO_OP;
X      site = getc(fd);
X      switch(site) {
X      case 'N':
X	Level->site[i][j].locchar = FLOOR;
X	Level->site[i][j].roomnumber = RS_BEDROOM;
X	if (random_range(2)) make_house_npc(i,j);
X	break;
X      case 'H':
X	Level->site[i][j].locchar = FLOOR;
X	Level->site[i][j].roomnumber = RS_BEDROOM;
X	if (random_range(2)) make_mansion_npc(i,j);
X	break;
X      case 'D':
X	Level->site[i][j].locchar = FLOOR;
X	Level->site[i][j].roomnumber = RS_DININGROOM;
X	break;
X      case '.':
X	Level->site[i][j].locchar = FLOOR;
X	break;
X      case 'c':
X	Level->site[i][j].locchar = FLOOR;
X	Level->site[i][j].roomnumber = RS_CLOSET;
X	break;
X      case 'G':
X	Level->site[i][j].locchar = FLOOR;
X	Level->site[i][j].roomnumber = RS_BATHROOM;
X	break;
X      case 'B':
X	Level->site[i][j].locchar = FLOOR;
X	Level->site[i][j].roomnumber = RS_BEDROOM;
X	break;
X      case 'K':
X	Level->site[i][j].locchar = FLOOR;
X	Level->site[i][j].roomnumber = RS_KITCHEN;
X	break;
X      case 'S':
X	Level->site[i][j].locchar = FLOOR;
X	Level->site[i][j].showchar = WALL;
X	lset(i,j,SECRET);
X	Level->site[i][j].roomnumber = RS_SECRETPASSAGE;
X	break;
X      case '3':
X	Level->site[i][j].locchar = SAFE;
X	Level->site[i][j].showchar = WALL;
X	lset(i,j,SECRET);
X	Level->site[i][j].p_locf = L_SAFE;
X	break;
X      case '^':
X	Level->site[i][j].locchar = FLOOR;
X	Level->site[i][j].p_locf = TRAP_BASE+random_range(NUMTRAPS);
X	break;
X      case 'P':
X	Level->site[i][j].locchar = PORTCULLIS;
X	Level->site[i][j].p_locf = L_PORTCULLIS;
X	break;
X      case 'R':
X	Level->site[i][j].locchar = FLOOR;
X	Level->site[i][j].p_locf = L_RAISE_PORTCULLIS;
X	break;
X      case 'p':
X	Level->site[i][j].locchar = FLOOR;
X	Level->site[i][j].p_locf = L_PORTCULLIS;
X	break;
X      case 'T':
X	Level->site[i][j].locchar = FLOOR;
X	Level->site[i][j].p_locf = L_PORTCULLIS_TRAP;
X	break;
X      case 'X':
X	Level->site[i][j].locchar = FLOOR;
X	Level->site[i][j].p_locf = L_HOUSE_EXIT;
X	break;
X      case '#':
X	Level->site[i][j].locchar = WALL;
X	switch (kind) {
X	case E_HOVEL: Level->site[i][j].aux = 10; break;
X	case E_HOUSE: Level->site[i][j].aux = 50; break;
X	case E_MANSION: Level->site[i][j].aux = 150; break;
X	}
X	break;
X      case '|':
X	Level->site[i][j].locchar = OPEN_DOOR;
X	Level->site[i][j].roomnumber = RS_CORRIDOR;
X	lset(i,j,STOPS);
X	break;
X      case '+':
X	Level->site[i][j].locchar = CLOSED_DOOR;
X	Level->site[i][j].roomnumber = RS_CORRIDOR;
X	Level->site[i][j].aux = LOCKED;
X	lset(i,j,STOPS);
X	break;
X      case 'd':
X	Level->site[i][j].locchar = FLOOR;
X	Level->site[i][j].roomnumber = RS_CORRIDOR;
X	make_site_monster(i,j,ML4+10); /* dog */
X	break;
X      case 'a':
X	Level->site[i][j].locchar = FLOOR;
X	Level->site[i][j].roomnumber = RS_CORRIDOR;
X	Level->site[i][j].p_locf = L_TRAP_SIREN;
X	break;
X      case 'A':
X	Level->site[i][j].locchar = FLOOR;
X	Level->site[i][j].roomnumber = RS_CORRIDOR;
X	make_site_monster(i,j,ML4+2); /* automaton */
X	break;
X      }
X      Level->site[i][j].showchar = ' ';
X    }
X    fscanf(fd,"\n");
X  }
X}
X
X
X  
X/* makes a log npc for houses and hovels */
Xvoid make_house_npc(i,j)
Xint i,j;
X{
X  pml ml = ((pml) malloc(sizeof(mltype)));
X  pob ob;
X  ml->m = ((pmt) malloc(sizeof(montype)));
X  *(ml->m) = Monsters[NPC];
X  make_log_npc(ml->m);
X  if (ml->m->id == NPC) mprint("You detect signs of life in this house.");
X  else mprint("An eerie shiver runs down your spine as you enter....");
X  /* if not == NPC, then we got a ghost off the npc list */
X  ml->m->x = i;
X  ml->m->y = j;
X  Level->site[i][j].creature = ml->m;
X  ml->m->click = (Tick + 1) % 50;
X  ml->next = Level->mlist;
X  Level->mlist = ml;
X  m_status_set(ml->m,HOSTILE);
X  if (nighttime())
X    m_status_reset(ml->m,AWAKE);
X  else m_status_set(ml->m,AWAKE);
X  if (ml->m->startthing > -1) {
X    ob = ((pob) malloc(sizeof(objtype)));    
X    *ob = Objects[ml->m->startthing];
X    m_pickup(ml->m,ob);
X  }
X}
X
X
X
X
X
X/* makes a hiscore npc for mansions */
Xvoid make_mansion_npc(i,j)
Xint i,j;
X{
X  pml ml = ((pml) malloc(sizeof(mltype)));
X  ml->m = ((pmt) malloc(sizeof(montype)));
X  *(ml->m) = Monsters[NPC];
X  make_hiscore_npc(ml->m,random_range(14)+1);
X  mprint("You detect signs of life in this house.");
X  ml->m->x = i;
X  ml->m->y = j;
X  Level->site[i][j].creature = ml->m;
X  ml->m->click = (Tick + 1) % 50;
X  ml->next = Level->mlist;
X  Level->mlist = ml;
X  m_status_set(ml->m,HOSTILE);
X  if (nighttime())
X    m_status_reset(ml->m,AWAKE);
X  else m_status_set(ml->m,AWAKE);
X}
X
X
END_OF_FILE
if test 5401 -ne `wc -c <'ohouse.c'`; then
    echo shar: \"'ohouse.c'\" unpacked with wrong size!
fi
# end of 'ohouse.c'
fi
if test -f 'oscroll4.txt' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'oscroll4.txt'\"
else
echo shar: Extracting \"'oscroll4.txt'\" \(1354 characters\)
sed "s/^X//" >'oscroll4.txt' <<'END_OF_FILE'
X[Librarian's note. This odd item just won't go away. Every time we
Xlend it out, it just appears back in the stacks.... Even burning it
Xdidn't work....]
X
X                    The Adepts' Manifesto.
X
X``Mastery of the World can only be achieved by the Master of the Self.
XFor one who has total Self-Control, all things are possible.''
X
X[Obvious hyperbole -- Librarian]
X
X``The apex of High Magic is a triviality for a true Adept.''
X
X[Surely, this is exaggeration -- Librarian]
X
X``An Adept makes his own Destiny, and Destiny caters to the whims of
Xan Adept.''
X
X[Oh, come now, be serious. -- Librarian]
X
X``Only Self-Improvement can lead to Adepthood. Those who have not
Xraised their personal attributes to the highest values will
Xbe inevitably destroyed in their quest for Adepthood.''
X
X[Say what? -- Librarian]
X
X``The Challenge of Adepthood is maintained by the Lords of Destiny.''
X
X[Nonsense! -- Librarian]
X
X``An Adept-Aspirant must be prepared to go beyond the trivial powers of
XMagic, even spurning the tawdry attractions of Artifacts, if the
XAspirant would achieve Adepthood.''
X
X[Me, I'll take the Artifacts... -- Librarian]
X
X``The final test of an Adept is Mastery of that Void which lies both
Xwithin and without the Self.''
X
X[Zen Gobbledygook. -- Librarian]
X
X``Only an Adept can become a Total Winner.''
X
X[What the heck is a Total Winner? -- Librarian]
X
END_OF_FILE
if test 1354 -ne `wc -c <'oscroll4.txt'`; then
    echo shar: \"'oscroll4.txt'\" unpacked with wrong size!
fi
# end of 'oscroll4.txt'
fi
echo shar: End of archive 11 \(of 19\).
cp /dev/null ark11isdone
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