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