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

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

Submitted-by: "Laurence R. Brothers"   <brothers@paul.rutgers.edu>
Posting-number: Volume 7, Issue 28
Archive-name: omega3/Part09
Supersedes: omega2: Volume 5, Issue 11-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 9 (of 20)."
# Contents:  odefs.h oitem.c omotd.txt
# Wrapped by billr@saab on Thu Jun 29 08:14:04 1989
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'\" \(28627 characters\)
sed "s/^X//" >'odefs.h' <<'END_OF_FILE'
X/* omega copyright (c) 1987,1988,1989 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#ifdef MSDOS
X#define SYSTEMV
X#endif
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/* 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 "/es/quasar/games/lib/omega/"
X
X/* set WIZARD to implementor's username */
X
X#define WIZARD "quasar"
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 75
X#define VERSIONSTRING "omega version 0.75 (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#define E_MAX E_COURT
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
Xtypedef unsigned char uchar;
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  uchar attacked;
X  int aux1,aux2,x,y,click;
X  int id,hp,hit,ac,dmg,sense,wakeup,level,speed;
X  uchar sleep,treasure;
X  long xpv;
X  int corpseweight,corpsevalue,transformid,startthing;
X  uchar 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  long xp;
X  int level,hp,maxhp,hit,dmg,absorption,speed,click;
X  int defense,food,alignment;
X  long mana,maxmana;
X  long cash;
X  int 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  long 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
Xstruct object {
X  int id,weight,plus,charge,dmg,hit,aux,number,fragility;
X  long basevalue;
X  uchar known,used;
X  int blessing;
X  uchar type,uniqueness;
X  int usef;
X  uchar 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  uchar 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  uchar 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#ifndef MSDOS
X  struct location site[MAXWIDTH][MAXLENGTH]; /* dungeon data */
X#else
X  /* Over 64K worth of data! */
X  struct location *site[MAXWIDTH]; /* dungeon data */
X#endif
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
X#ifndef MSDOS
Xchar *malloc(),*calloc(),*getlogin();
Xint free();
Xlong time();
X#else
X#include <stdlib.h>
X#include <time.h>
X#define getlogin() "pcuser"
X#define mnumprint(n) mlongprint((long)(n))
X#define menunumprint(n) menulongprint((long)(n))
X#define gain_experience(n) gain_lexperience((long)(n))
X#undef sign
X#undef max
X#undef min
X#undef abs
X/* These must be made to work for both longs and ints */
X#define sign(n) (((n) < 0) ? -1 : (((n) > 0) ? 1 : 0))
X#define max(a,b) (((a) > (b)) ? (a) : (b))
X#define min(a,b) (((a) < (b)) ? (a) : (b))
X#define abs(n) (((n) < 0) ? (-(n)) : (n))
X#endif
X
X#ifdef NORANDOM
X#ifndef MSDOS
Xint rand();
Xint srand();
X#endif
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#ifndef MSDOS
X#include <stdio.h>
X#else
X/* Include stdio.h only if not already include (by curses.h) */
X#ifndef NULL
X#include <stdio.h>
X#endif
X#endif
X
X#ifndef TRUE
X#define TRUE 1
X#define FALSE 0
X#endif
X
X#ifdef MSDOS
Xplv msdos_changelevel();
X#endif
END_OF_FILE
if test 28627 -ne `wc -c <'odefs.h'`; then
    echo shar: \"'odefs.h'\" unpacked with wrong size!
fi
# end of 'odefs.h'
fi
if test -f 'oitem.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'oitem.c'\"
else
echo shar: Extracting \"'oitem.c'\" \(22969 characters\)
sed "s/^X//" >'oitem.c' <<'END_OF_FILE'
X/* omega copyright (C) 1987,1988,1989 by Laurence Raphael Brothers */
X/* oitem.c */
X
X#include "oglob.h"
X
X/* make a random new object, returning pointer */
X/* may return NULL. */
Xpob create_object(itemlevel)
Xint itemlevel;
X{
X  pob new;
X  int  r; 
X  int ok = FALSE;
X
X  while (! ok) {
X    new = ((pob) malloc(sizeof(objtype)));
X    r= random_range(135);
X    if (r < 20) make_thing(new,-1);
X    else if (r < 40) make_food(new,-1);
X    else if (r < 50) make_scroll(new,-1);
X    else if (r < 60) make_potion(new,-1);
X    else if (r < 70) make_weapon(new,-1);
X    else if (r < 80) make_armor(new,-1);
X    else if (r < 90) make_shield(new,-1);
X    else if (r < 100) make_stick(new,-1);
X    else if (r < 110) make_boots(new,-1);
X    else if (r < 120) make_cloak(new,-1);
X    else if (r < 130) make_ring(new,-1);
X    else make_artifact(new,-1);
X    /* not ok if object is too good for level, or if unique and already made */
X    /* 1/100 chance of finding object if too good for level */
X    ok = ((new->uniqueness != UNIQUE_MADE) &&
X	  ((new->level < itemlevel+random_range(3))
X	   || (random_range(100)==23)));
X    if (!ok) free((char *) new);
X  }
X  if (new->uniqueness == UNIQUE_UNMADE) 
X    Objects[new->id].uniqueness=UNIQUE_MADE;
X  /* allocate string space for item names -- should fix name mangling bug */
X  new->objstr = salloc(Objects[new->id].objstr);
X  new->truename = salloc(Objects[new->id].truename);
X  new->cursestr = salloc(Objects[new->id].cursestr);
X  return(new);
X}
X
Xvoid make_cash(new,level)
Xpob new;
Xint level;
X{
X  *new = Objects[CASHID];
X  new->basevalue = random_range(level*level+10)+1; /* aux is AU value */
X  new->objstr = salloc(cashstr());
X  new->cursestr = new->truename = new->objstr;
X}
X
Xvoid make_food(new,id)
Xpob new;
Xint id;
X{
X  if (id == -1) id = random_range(NUMFOODS);
X  *new = Objects[FOODID+id];
X}
X
X
Xvoid make_corpse(new,m)
Xpob new;
Xstruct monster *m;
X{
X  *new = Objects[CORPSEID];
X  new->charge = m->id;
X  new->weight = m->corpseweight;
X  new->basevalue = m->corpsevalue;
X  new->known = 2;
X  new->objstr = salloc(m->corpsestr);
X  new->truename = new->cursestr = new->objstr;
X  if (m->monchar == '@')
X    new->usef = I_CANNIBAL;
X  else if (m_statusp(m,EDIBLE)) {
X    new->usef = I_FOOD;
X    new->aux = 6;
X  }
X  else if (m_statusp(m,POISONOUS))
X    new->usef = I_POISON_FOOD;
X  /* Special corpse-eating effects */
X  else switch(m->id) {
X  case ML1+1: /*tse tse fly */
X  case ML4+9: /*torpor beast */
X    new->usef = I_SLEEP_SELF;
X    break;
X  case ML2+5:
X    new->usef = I_INVISIBLE;
X    break;
X  case ML1+5: /* blipper */
X    new->usef = I_TELEPORT;
X    break;
X  case ML2+3: /* floating eye -- it's traditional.... */
X    new->usef = I_CLAIRVOYANCE;
X    break;
X  case ML4+11: /*astral fuzzy */
X    new->usef = I_DISPLACE;
X    break;
X  case ML4+12: /*s o law */
X    new->usef = I_CHAOS;
X    break;
X  case ML4+13: /*s o chaos */
X    new->usef = I_LAW;
X    break;
X  case ML5+9: /* astral vampire */
X    new->usef = I_ENCHANT;
X    break;
X  case ML5+11: /* manaburst */
X    new->usef = I_SPELLS;
X    break;
X  case ML6+9: /* rakshasa */
X    new->usef = I_TRUESIGHT;
X    break;
X  case ML7+0: /* behemoth */
X    new->usef = I_HEAL;
X    break;
X  case ML7+2: /* unicorn */
X    new->usef = I_NEUTRALIZE_POISON;
X    break;
X  case ML8+10: /*coma beast */
X    new->usef = I_ALERT;
X    break;
X  default:
X    new->usef = I_INEDIBLE; 
X    break;
X  }
X}
X
X
X
X
Xvoid make_ring(new,id)
Xpob new;
Xint id;
X{
X  if (id == -1) id = random_range(NUMRINGS);
X  *new = Objects[RINGID+id];
X  if (new->blessing == 0) new->blessing = itemblessing();
X  if (new->plus == 0) new->plus = itemplus()+1;
X  if (new->blessing < 0) new->plus = -1 - abs(new->plus);
X}
X
Xvoid make_thing(new,id)
Xpob new;
Xint id;
X{
X  if (id == -1) id = random_range(NUMTHINGS);
X  *new = Objects[THINGID+id];
X  if (strcmp(new->objstr,"grot") == 0) {
X    new->objstr = salloc(grotname());
X    new->truename = new->cursestr = new->objstr;
X  }
X}
X
X
Xvoid make_scroll(new,id)
Xpob new;
Xint id;
X{
X  if (id == -1) id = random_range(NUMSCROLLS);
X  *new = Objects[SCROLLID+id];
X  /* if a scroll of spells, aux is the spell id in Spells */
X  if (new->id == SCROLLID+1) {
X    new->aux = random_range(NUMSPELLS);
X  }
X}
X
Xvoid make_potion(new,id)
Xpob new;
Xint id;
X{
X  if (id == -1) id = random_range(NUMPOTIONS);
X  *new = Objects[POTIONID+id];
X  if (new->plus == 0) new->plus = itemplus();
X}
X
Xvoid make_weapon(new,id)
Xpob new;
Xint id;
X{
X  if (id == -1) id = random_range(NUMWEAPONS);
X  *new = Objects[WEAPONID+id];
X  if ((id == 28) || (id == 29)) /* bolt or arrow */
X    new->number = random_range(20)+1;
X  if (new->blessing == 0) new->blessing = itemblessing();
X  if (new->plus == 0) {
X    new->plus = itemplus();
X    if (new->blessing < 0)
X      new->plus = -1 - abs(new->plus);
X    else if (new->blessing > 0)
X      new->plus = 1 + abs(new->plus);
X  }
X}
X
Xvoid make_shield(new,id)
Xpob new;
Xint id;
X{
X  if (id == -1) id = random_range(NUMSHIELDS);
X  *new = Objects[SHIELDID+id];
X  if (new->plus == 0)
X    new->plus = itemplus();
X  if (new->blessing == 0) new->blessing = itemblessing();
X  if (new->blessing < 0)
X    new->plus = -1 - abs(new->plus);
X  else if (new->blessing > 0)
X    new->plus = 1 + abs(new->plus);
X}
X
Xvoid make_armor(new,id)
Xpob new;
Xint id;
X{
X  if (id == -1) id = random_range(NUMARMOR);
X  *new = Objects[ARMORID+id];
X  if (new->plus == 0) new->plus = itemplus();
X  if (new->blessing == 0) new->blessing = itemblessing();
X  if (new->blessing < 0)
X    new->plus = -1 - abs(new->plus);
X  else if (new->blessing > 0)
X    new->plus = 1 + abs(new->plus);  
X}
X
Xvoid make_cloak(new,id)
Xpob new;
Xint id;
X{
X  if (id == -1) id = random_range(NUMCLOAKS);
X  Objects[CLOAKID+4].plus = 2;
X  *new = Objects[CLOAKID+id];
X  if (new->blessing == 0) new->blessing = itemblessing();
X}
X
Xvoid make_boots(new,id)
Xpob new;
Xint id;
X{
X  if (id == -1) id = random_range(NUMBOOTS);
X  *new = Objects[BOOTID+id];
X  if (new->blessing == 0) new->blessing = itemblessing();
X}
X
Xvoid make_stick(new,id)
Xpob new;
Xint id;
X{
X  if (id == -1) id = random_range(NUMSTICKS);
X  *new = Objects[STICKID+id];
X  new->charge = itemcharge();
X  if (new->blessing == 0) new->blessing = itemblessing();
X}
X
Xvoid make_artifact(new,id)
Xpob new;
X{
X  if (id == -1) id = random_range(NUMARTIFACTS);
X  *new = Objects[ARTIFACTID+id];
X}
X
X
X
X
X/* item name functions */
X
Xchar *scrollname(reset,id)
Xint reset,id;
X{
X#define ids scroll_ids
X  int i,j,k;
X
X  if (reset) {
X    for(i=0;i<30;i++)
X      ids[i]=i;
X    for(i=0;i<500;i++) {
X      j = random_range(30);
X      k = ids[i % 30];
X      ids[i % 30]=ids[j];
X      ids[j]=k;
X    }
X  }
X  else {
X    switch(ids[id]) {
X      case 0: strcpy(Str4,"scroll-GRISTOGRUE"); break;
X      case 1: strcpy(Str4,"scroll-Kho Reck Tighp"); break;
X      case 2: strcpy(Str4,"scroll-E Z"); break;
X      case 3: strcpy(Str4,"scroll-Kevitz"); break;
X      case 4: strcpy(Str4,"scroll-Arcanum Prime"); break;
X      case 5: strcpy(Str4,"scroll-NYARLATHOTEP"); break;
X      case 6: strcpy(Str4,"scroll-Gilthoniel"); break;
X      case 7: strcpy(Str4,"scroll-Zarathustra"); break;
X      case 8: strcpy(Str4,"scroll-Ancient Lore"); break;
X      case 9: strcpy(Str4,"scroll-Eyes Only"); break;
X      case 10: strcpy(Str4,"scroll-Ambogar Empheltz"); break;
X      case 11: strcpy(Str4,"scroll-Isengard"); break;
X      case 12: strcpy(Str4,"scroll-Deosil Widdershins"); break;
X      case 13: strcpy(Str4,"scroll-Magister Paracelsus"); break;
X      case 14: strcpy(Str4,"scroll-Qlipphotic Summons"); break;
X      case 15: strcpy(Str4,"scroll-Aratron Samael"); break;
X      case 16: strcpy(Str4,"scroll-De Wormiis Mysterius"); break;
X      case 17: strcpy(Str4,"scroll-Necronomicon"); break;
X      case 18: strcpy(Str4,"scroll-Pnakotic Manuscript"); break;
X      case 19: strcpy(Str4,"scroll-Codex of Xalimar"); break;
X      case 20: strcpy(Str4,"scroll-The Mabinogion"); break;
X      case 21: strcpy(Str4,"scroll-Ginseng Shiatsu"); break;
X      case 22: strcpy(Str4,"scroll-Tome of Tromax"); break;
X      case 23: strcpy(Str4,"scroll-Book of the Dead "); break;
X      case 24: strcpy(Str4,"scroll-The Flame Tongue"); break;
X      case 25: strcpy(Str4,"scroll-Karst Khogar"); break;
X      case 26: strcpy(Str4,"scroll-The Yellow Sign"); break;
X      case 27: strcpy(Str4,"scroll-The Kevillist Manifesto"); break;
X      case 28: strcpy(Str4,"scroll-Goshtar Script"); break;
X      case 29: strcpy(Str4,"scroll-Pendragon Encryption"); break;
X      }
X  }
X  return(Str4);
X}
X#undef ids
X
X
Xchar *grotname()
X{
X  switch(random_range(20)) {
X    case 0: strcpy(Str4,"pot lid"); break;
X    case 1: strcpy(Str4,"mound of offal"); break;
X    case 2: strcpy(Str4,"sword that was broken"); break;
X    case 3: strcpy(Str4,"salted snail"); break;
X    case 4: strcpy(Str4,"key"); break;
X    case 5: strcpy(Str4,"toadstool"); break;
X    case 6: strcpy(Str4,"greenish spindle"); break;
X    case 7: strcpy(Str4,"tin soldier"); break;
X    case 8: strcpy(Str4,"broken yo-yo"); break;
X    case 9: strcpy(Str4,"NYC subway map"); break;
X    case 10: strcpy(Str4,"Nixon's the One! button"); break;
X    case 11: strcpy(Str4,"beer can (empty)"); break;
X    case 12: strcpy(Str4,"golden bejewelled falcon"); break;
X    case 13: strcpy(Str4,"hamster cage"); break;
X    case 14: strcpy(Str4,"wooden nickel"); break;
X    case 15: strcpy(Str4,"three-dollar bill"); break;
X    case 16: strcpy(Str4,"rosebud"); break;
X    case 17: strcpy(Str4,"water pistol"); break;
X    case 18: strcpy(Str4,"shattered skull"); break;
X    case 19: strcpy(Str4,"jawbone of an ass"); break;
X  }
X  return(Str4);
X}
X
X
X
X
Xchar *potionname(reset,id)
Xint reset,id;
X{
X#define ids potion_ids
X  int i,j,k;
X
X  if (reset) {
X    for(i=0;i<20;i++)
X      ids[i]=i;
X    for(i=0;i<500;i++) {
X      j = random_range(20);
X      k = ids[i % 20];
X      ids[i % 20]=ids[j];
X      ids[j]=k;
X    }
X  }
X  else {
X    switch (ids[id]) {
X      case 0: strcpy(Str4,"vial of dewy liquid"); break;
X      case 1: strcpy(Str4,"jug of tarry black substance"); break;
X      case 2: strcpy(Str4,"flask of cold smoking froth"); break;
X      case 3: strcpy(Str4,"phial of glowing fluid"); break;
X      case 4: strcpy(Str4,"bottle of sickening slime"); break;
X      case 5: strcpy(Str4,"sac of greenish gel"); break;
X      case 6: strcpy(Str4,"wineskin of odorous goo"); break;
X      case 7: strcpy(Str4,"canteen of sweet sap"); break;
X      case 8: strcpy(Str4,"urn of clear fluid"); break;
X      case 9: strcpy(Str4,"clotted grey ooze"); break;
X      case 10: strcpy(Str4,"keg of bubbly golden fluid"); break;
X      case 11: strcpy(Str4,"tube of minty paste"); break;
X      case 12: strcpy(Str4,"pitcher of aromatic liquid"); break;
X      case 13: strcpy(Str4,"pot of rancid grease"); break;
X      case 14: strcpy(Str4,"thermos of hot black liquid"); break;
X      case 15: strcpy(Str4,"magnum of deep red liquid"); break;
X      case 16: strcpy(Str4,"vase full of ichor"); break;
X      case 17: strcpy(Str4,"container of white cream"); break;
X      case 18: strcpy(Str4,"syringe of clear fluid"); break;
X      case 19: strcpy(Str4,"can of volatile essence"); break;
X      }      
X    return(Str4);
X  }
X}
X#undef ids
X
X
Xchar *stickname(reset,id)
Xint reset,id;
X{
X#define ids stick_ids
X  int i,j,k;
X
X  if (reset) {
X    for(i=0;i<20;i++)
X      ids[i]=i;
X    for(i=0;i<500;i++) {
X      j = random_range(20);
X      k = ids[i % 20];
X      ids[i % 20]=ids[j];
X      ids[j]=k;
X    }
X  }
X  else {
X    switch (ids[id]) {
X      case 0: strcpy(Str4,"oaken staff"); break;
X      case 1: strcpy(Str4,"heavy metal rod"); break;
X      case 2: strcpy(Str4,"shaft of congealed light"); break;
X      case 3: strcpy(Str4,"slender ceramic wand"); break;
X      case 4: strcpy(Str4,"rune-inscribed bone wand"); break;
X      case 5: strcpy(Str4,"knurly staff"); break;
X      case 6: strcpy(Str4,"steel knobbed rod");  break;
X      case 7: strcpy(Str4,"lucite wand"); break;
X      case 8: strcpy(Str4,"sturdy alpenstock"); break;
X      case 9: strcpy(Str4,"gem-studded ebony staff"); break;
X      case 10: strcpy(Str4,"chromed sequinned staff"); break;
X      case 11: strcpy(Str4,"old peeling stick"); break;
X      case 12: strcpy(Str4,"jointed metal rod"); break;
X      case 13: strcpy(Str4,"wand with lead ferrules"); break;
X      case 14: strcpy(Str4,"forked wooden stick"); break;
X      case 15: strcpy(Str4,"cane with gold eagle handle"); break;
X      case 16: strcpy(Str4,"crystalline wand");  break;
X      case 17: strcpy(Str4,"metal stick with trigger"); break;
X      case 18: strcpy(Str4,"leather-handled stone rod"); break;
X      case 19: strcpy(Str4,"tiny mithril wand"); break;
X      }      
X    return(Str4);
X  }
X}
X#undef ids
X
Xchar *ringname(reset,id)
Xint reset,id;
X{
X#define ids ring_ids
X  int i,j,k;
X
X  if (reset) {
X    for(i=0;i<20;i++)
X      ids[i]=i;
X    for(i=0;i<500;i++) {
X      j = random_range(20);
X      k = ids[i % 20];
X      ids[i % 20]=ids[j];
X      ids[j]=k;
X    }
X  }
X  else {
X    switch (ids[id]) {
X      case 0: strcpy(Str4,"gold ring with a blue gem"); break;
X      case 1: strcpy(Str4,"brass ring"); break;
X      case 2: strcpy(Str4,"mithril ring with a red gem"); break;
X      case 3: strcpy(Str4,"platinum ring");  break;
X      case 4: strcpy(Str4,"gold dragon's head ring"); break;
X      case 5: strcpy(Str4,"bronze ring"); break;
X      case 6: strcpy(Str4,"aardvark seal ring"); break;
X      case 7: strcpy(Str4,"grey metal ring"); break;
X      case 8: strcpy(Str4,"silver skull ring"); break;
X      case 9: strcpy(Str4,"onyx ring"); break;
X      case 10: strcpy(Str4,"Collegium Magii class ring"); break;
X      case 11: strcpy(Str4,"worn stone ring"); break;
X      case 12: strcpy(Str4,"diorite ring"); break;
X      case 13: strcpy(Str4,"ancient scarab ring");  break;
X      case 14: strcpy(Str4,"plastic charm ring"); break;
X      case 15: strcpy(Str4,"soapy gypsum ring"); break;
X      case 16: strcpy(Str4,"glass ring"); break;
X      case 17: strcpy(Str4,"glowing bluestone ring"); break;
X      case 18: strcpy(Str4,"ring with eye sigil"); break;
X      case 19: strcpy(Str4,"zirconium ring"); break;
X      }      
X    return(Str4);
X  }
X}
X#undef ids
X
X
Xchar *cloakname(reset,id)
Xint reset,id;
X{
X#define ids cloak_ids
X  int i,j,k;
X
X  if (reset) {
X    for(i=0;i<20;i++)
X      ids[i]=i;
X    for(i=0;i<500;i++) {
X      j = random_range(20);
X      k = ids[i % 20];
X      ids[i % 20]=ids[j];
X      ids[j]=k;
X    }
X  }
X  else {
X    switch (ids[id]) {
X      case 0: strcpy(Str4,"tattered piece of cloth"); break;
X      case 1: strcpy(Str4,"fuligin cloak"); break;
X      case 2: strcpy(Str4,"chintz cloak"); break;
X      case 3: strcpy(Str4,"diaphanous cape");  break;
X      case 4: strcpy(Str4,"red half-cloak"); break;
X      case 5: strcpy(Str4,"mouse-hide cloak"); break;
X      case 6: strcpy(Str4,"kelly green cloak"); break;
X      case 7: strcpy(Str4,"cloth-of-gold cloak"); break;
X      case 8: strcpy(Str4,"dirty old cloak"); break;
X      case 9: strcpy(Str4,"weightless cloak"); break;
X      case 10: strcpy(Str4,"boat cloak"); break;
X      case 11: strcpy(Str4,"greasy tarpaulin"); break;
X      case 12: strcpy(Str4,"sable cloak"); break;
X      case 13: strcpy(Str4,"soft velvet cloak");  break;
X      case 14: strcpy(Str4,"opera cape"); break;
X      case 15: strcpy(Str4,"elegant brocade cloak"); break;
X      case 16: strcpy(Str4,"cloak of many colors"); break;
X      case 17: strcpy(Str4,"grey-green rag"); break;
X      case 18: strcpy(Str4,"puce and chartreuse cloak"); break;
X      case 19: strcpy(Str4,"smoky cloak"); break;
X      }      
X    return(Str4);
X  }
X}
X#undef ids
X
Xchar *bootname(reset,id)
Xint reset,id;
X{
X#define ids boot_ids
X  int i,j,k;
X
X  if (reset) {
X    for(i=0;i<20;i++)
X      ids[i]=i;
X    for(i=0;i<500;i++) {
X      j = random_range(20);
X      k = ids[i % 20];
X      ids[i % 20]=ids[j];
X      ids[j]=k;
X    }
X  }
X  else {
X    switch (ids[id]) {
X      case 0: strcpy(Str4,"sturdy leather boots"); break;
X      case 1: strcpy(Str4,"calf-length moccasins"); break;
X      case 2: strcpy(Str4,"dark-colored tabi"); break;
X      case 3: strcpy(Str4,"patent-leather shoes");  break;
X      case 4: strcpy(Str4,"beaten-up gumshoes"); break;
X      case 5: strcpy(Str4,"alligator-hide boots"); break;
X      case 6: strcpy(Str4,"comfortable sandals"); break;
X      case 7: strcpy(Str4,"roller skates"); break;
X      case 8: strcpy(Str4,"purple suede gaiters"); break;
X      case 9: strcpy(Str4,"mirror-plated wingtips"); break;
X      case 10: strcpy(Str4,"heavy workboots"); break;
X      case 11: strcpy(Str4,"polyurethane-soled sneakers"); break;
X      case 12: strcpy(Str4,"clodhoppers"); break;
X      case 13: strcpy(Str4,"wooden shoes");  break;
X      case 14: strcpy(Str4,"ski boots"); break;
X      case 15: strcpy(Str4,"hob-nailed boots"); break;
X      case 16: strcpy(Str4,"elven boots"); break;
X      case 17: strcpy(Str4,"cowboy boots"); break;
X      case 18: strcpy(Str4,"flipflop slippers"); break;
X      case 19: strcpy(Str4,"riding boots"); break;
X    }      
X    return(Str4);
X  }
X}
X#undef ids
X
X
X
Xint itemplus()
X{
X  int p = 0;
X
X  while (random_range(2) == 0)
X    p++;
X  return(p);
X}
X
X
X
Xint itemcharge()
X{
X  return(random_range(20)+1);
X}
X
X
X
Xint itemblessing()
X{
X  switch(random_range(10)) {
X    case 0:
X    case 1:return(-1-random_range(10)); break;
X    case 8:
X    case 9:return(1+random_range(10)); break;
X    default: return(0);	   
X  }
X}
X
X    
Xint twohandedp(id)
Xint id;
X{
X  switch(id) {
X  case WEAPONID+5:
X  case WEAPONID+12:
X  case WEAPONID+18:
X  case WEAPONID+20:
X  case WEAPONID+26:
X  case WEAPONID+27:
X  case WEAPONID+32:
X  case WEAPONID+36:
X  case WEAPONID+38:
X  case WEAPONID+39:
X    return(TRUE); break;
X  default: return(FALSE); break;
X  }
X}
X
X
Xvoid item_use(o)
Xstruct object *o;
X{
X  clearmsg();
X  switch(o->usef) {
X    case -1:i_no_op(o); break;
X    case 0:i_nothing(o); break;
X
X    /* scrolls */	    
X    case I_SPELLS: i_spells(o); break;
X    case I_BLESS: i_bless(o); break;
X    case I_ACQUIRE: i_acquire(o); break;
X    case I_ENCHANT: i_enchant(o); break;
X    case I_TELEPORT: i_teleport(o); break;
X    case I_WISH: i_wish(o); break;
X    case I_CLAIRVOYANCE: i_clairvoyance(o); break;
X    case I_DISPLACE: i_displace(o); break;
X    case I_ID: i_id(o); break;
X    case I_JANE_T: i_jane_t(o); break;
X    case I_FLUX: i_flux(o); break;
X    case I_WARP: i_warp(o); break;
X    case I_ALERT: i_alert(o); break;
X    case I_CHARGE: i_charge(o); break;
X    case I_KNOWLEDGE: i_knowledge(o); break;
X    case I_LAW: i_law(o); break;
X    case I_HINT: hint(); break;
X    case I_HERO: i_hero(o); break;
X    case I_TRUESIGHT: i_truesight(o); break;
X    case I_ILLUMINATE: i_illuminate(o); break;
X    case I_DEFLECT: i_deflect(o); break;
X
X    /* potion functions */
X    case I_HEAL: i_heal(o); break;
X    case I_OBJDET: i_objdet(o); break;
X    case I_MONDET: i_mondet(o); break;
X    case I_SLEEP_SELF: i_sleep_self(o); break;
X    case I_NEUTRALIZE_POISON: i_neutralize_poison(o); break;
X    case I_RESTORE: i_restore(o); break;
X    case I_AZOTH: i_azoth(o); break;
X    case I_AUGMENT: i_augment(o); break;
X    case I_REGENERATE: i_regenerate(o); break;
X    case I_INVISIBLE: i_invisible(o); break;
X    case I_BREATHING: i_breathing(o); break;
X    case I_FEAR_RESIST: i_fear_resist(o); break;
X    case I_CHAOS: i_chaos(o); break;
X    case I_ACCURACY: i_accuracy(o); break;
X    case I_LEVITATION: i_levitate(o); break;
X    case I_CURE: i_cure(o); break;
X	    
X    /* stick functions */
X    case I_FIREBOLT: i_firebolt(o); break;
X    case I_LBOLT: i_lbolt(o); break;
X    case I_MISSILE: i_missile(o); break;
X    case I_SLEEP_OTHER: i_sleep_other(o); break;
X    case I_FIREBALL: i_fireball(o); break;
X    case I_LBALL: i_lball(o); break;    
X    case I_SNOWBALL: i_snowball(o); break;
X    case I_SUMMON: i_summon(o); break;
X    case I_HIDE: i_hide(o); break;
X    case I_DISRUPT: i_disrupt(o); break;
X    case I_DISINTEGRATE: i_disintegrate(o); break;
X    case I_APPORT: i_apport(o); break;
X    case I_DISPEL: i_dispel(o); break;
X    case I_POLYMORPH: i_polymorph(o); break;
X    case I_FEAR:i_fear(o); break;
X
X    /* food functions */
X    case I_FOOD: i_food(o); break;
X    case I_LEMBAS: i_lembas(o); break;
X    case I_STIM: i_stim(o); break;
X    case I_POW: i_pow(o); break;
X    case I_IMMUNE: i_immune(o); break;
X    case I_POISON_FOOD: i_poison_food(o); break;
X    case I_PEPPER_FOOD: i_pepper_food(o); break;
X    case I_CORPSE: i_corpse(o); break;
X
X    /* boots functions */
X    case I_PERM_SPEED: i_perm_speed(o); break;
X    case I_PERM_HERO: i_perm_hero(o); break;
X    case I_PERM_LEVITATE: i_perm_levitate(o); break;
X    case I_PERM_AGILITY: i_perm_agility(o); break;
X      
X    /* artifact functions */
X    case I_SCEPTRE:i_sceptre(o);break;
X    case I_PLANES:i_planes(o);break;
X    case I_STARGEM:i_stargem(o);break;
X    case I_SYMBOL:i_symbol(o); break;
X    case I_ORBMASTERY: i_orbmastery(o); break;
X    case I_ORBFIRE: i_orbfire(o); break;
X    case I_ORBWATER: i_orbwater(o); break;
X    case I_ORBEARTH: i_orbearth(o); break;
X    case I_ORBAIR: i_orbair(o); break;
X    case I_ORBDEAD: i_orbdead(o); break;
X    case I_CRYSTAL: i_crystal(o); break;
X    case I_LIFE: i_life(o); break;
X    case I_DEATH: i_death(o); break;
X    case I_ANTIOCH: i_antioch(o); break;
X    case I_HELM: i_helm(o); break;
X    case I_KOLWYNIA: i_kolwynia(o); break;
X    case I_ENCHANTMENT: i_enchantment(o); break;
X    case I_JUGGERNAUT: i_juggernaut(o); break;
X
X    /* cloak functions */
X    case I_PERM_DISPLACE: i_perm_displace(o); break;
X    case I_PERM_NEGIMMUNE: i_perm_negimmune(o); break;
X    case I_PERM_INVISIBLE: i_perm_invisible(o); break;
X    case I_PERM_PROTECTION: i_perm_protection(o);break;
X    case I_PERM_ACCURACY: i_perm_accuracy(o);break;
X    case I_PERM_TRUESIGHT: i_perm_truesight(o); break;
X
X    /* ring functions */
X    case I_PERM_BURDEN: i_perm_burden(o); break;
X    case I_PERM_STRENGTH: i_perm_strength(o); break;
X    case I_PERM_GAZE_IMMUNE: i_perm_gaze_immune(o); break;
X    case I_PERM_FIRE_RESIST: i_perm_fire_resist(o); break;
X    case I_PERM_POISON_RESIST: i_perm_poison_resist(o); break;
X    case I_PERM_REGENERATE: i_perm_regenerate(o); break;
X    case I_PERM_KNOWLEDGE: i_perm_knowledge(o); break;
X
X    /* armor functions */
X    case I_NORMAL_ARMOR: i_normal_armor(o); break;
X    case I_PERM_FEAR_RESIST: i_perm_fear_resist(o); break;
X    case I_PERM_ENERGY_RESIST: i_perm_energy_resist(o); break;
X    case I_PERM_BREATHING: i_perm_breathing(o); break;
X
X    /* weapons functions */
X    case I_NORMAL_WEAPON: i_normal_weapon(o); break;
X    case I_LIGHTSABRE: i_lightsabre(o); break;
X    case I_DEMONBLADE: i_demonblade(o); break;
X    case I_DESECRATE: i_desecrate(o); break;
X    case I_MACE_DISRUPT: i_mace_disrupt(o); break;
X    case I_DEFEND: i_defend(o); break;
X    case I_VICTRIX: i_victrix(o); break;
X
X    /* thing functions */	    
X    case I_PICK: i_pick(o); break;
X    case I_KEY: i_key(o); break;
X    case I_PERM_ILLUMINATE: i_perm_illuminate(o); break;
X    case I_TRAP: i_trap(o); break;
X    case I_RAISE_PORTCULLIS:i_raise_portcullis(o); break;
X
X    /* shield functions */
X    case I_NORMAL_SHIELD: i_normal_shield(o); break;
X    case I_PERM_DEFLECT: i_perm_deflect(o); break;
X  }
X}
X
END_OF_FILE
if test 22969 -ne `wc -c <'oitem.c'`; then
    echo shar: \"'oitem.c'\" unpacked with wrong size!
fi
# end of 'oitem.c'
fi
if test -f 'omotd.txt' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'omotd.txt'\"
else
echo shar: Extracting \"'omotd.txt'\" \(468 characters\)
sed "s/^X//" >'omotd.txt' <<'END_OF_FILE'
X			          *******
X			       *****   *****
X			    *****         *****
X                           ****   welcome   ****
X			  ***       t o       ***
X			   ***     omega     ***
X			    ****           ****
X			       ****    ****
X			    *    **    **    *
X			     *****      *****
X
X            omega version 0.75 is copyright (C) 1987,1988,1989 by:
X	       Laurence R. Brothers (brothers@paul.rutgers.edu)
X
X	 PC version comments, bugs, etc. to nathan@brokaw.lcs.mit.edu
END_OF_FILE
if test 468 -ne `wc -c <'omotd.txt'`; then
    echo shar: \"'omotd.txt'\" unpacked with wrong size!
fi
# end of 'omotd.txt'
fi
echo shar: End of archive 9 \(of 20\).
cp /dev/null ark9isdone
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