/* omega copyright (c) 1987,1988,1989 by Laurence Raphael Brothers */ /* This file is the header file for all omega modules */ /* defs.h */ /* omega will NOT function unless the implementor sets the appropriate definitions in the following section. */ /*--------------------------USER DEFINITIONS--------------------------*/ /* Some minor quote changes... This #define should be removed after some * public review, and the acceptable changes made permanent. */ #define NEW_QUOTES /* A few parody quotes... These have to be checked to make sure that they * make sense even if you don't know what they're parodying. */ #define TRADEMARK_VIOLATION /* Include the Monk guild. */ #define INCLUDE_MONKS /* Update the display every turn to center on the player. Rather heavy * on the bandwidth. */ /* #define CENTER_ON_PLAYER */ #define NEW_BANK /* Implementor should uncomment the following if his system uses string.h instead of strings.h (try man string) */ #define STRING /* Implementor should define int32 as the type of integer which uses * 32 bits. */ typedef int int32; /* Implementor should uncomment the following if getopt is not available */ /* #define NOGETOPT */ /* Implementor should uncomment the following if omega appears to redraw the screen excessively. */ #define EXCESSIVE_REDRAW /* The following definition is recommended. Remove it only if you have huge amounts of disk space and are annoyed at waiting a few more seconds on save and restore. */ /*#define COMPRESS_SAVE_FILES*/ /* If your system has gzip, I recommend using it instead of compress */ /* (try just typing 'gzip' at the shell prompt) */ #define USE_GZIP /* If your system doesn't have the usleep call, uncomment this line */ /* (try man usleep) */ /* #define NO_USLEEP */ /* Define the maximum length of a filename on your system. If you don't */ /* define, will try to make an educated guess. If you have one, */ /* /usr/include/limits.h is a good place to look for this value. */ /* DOS needn't worry; I'm forcing its FNAME_MAX_LENGTH to 8 elsewhere * in this file (we'll wait for LFN support). */ #define FNAME_MAX_LEN 48 /* OMEGALIB is where all the data files reside. Note the final / is necessary. msdos note: \ is the C string escape character, so you need \\ in the path given in OMEGALIB This might usually be "/usr/games/lib/omegalib/", for unix, or something like "c:\\games\\omega\\omegalib\\" for msdos */ #define OMEGALIB "./lib/" /* TILEFILE is the name of the file you want to use for graphics tiles. You */ /* aren't really free to use any file you want here. It should be the Omega */ /* distribution graphics files provided for your computer. Of course a file */ /* of the same format and size as the "correct" file will also work if you */ /* want to change things around. This file should be located in OMEGALIB */ #define TILEFILE "omegatiles.xpm" /* Comment the following line out if you want users to be able to override */ /* the OMEGALIB define, above, by setting the environment variable OMEGALIB */ /* (I recommend leaving this line uncommented, unless you're compiling */ /* for someone else and don't know where they'll be putting the omegalib */ /* directory, as is the case with compiling executables for home computers. */ /* It would be downright insecure to comment this line out in a multi-user */ /* environment, especially if you're going to run omega setuid.) */ #define FIXED_OMEGALIB /* set WIZARD to maintainers's username */ #define WIZARD "sheldon" /* If CATCH_SIGNALS is set to 1, will not dump core, nicer for players. */ /* dbx still intercepts the signals first, so it's ok for debugging */ #define CATCH_SIGNALS 1 /*---------------------------SYSTEM DEFINITIONS---------------------------*/ /* Don't change anything from here on (unless you know what you're doing) */ #define VERSION 9002 #define VERSIONSTRING "omega version 0.90" #ifndef AMIGA #ifndef MSDOS #ifndef BSD #ifndef SYSV ERROR! - One of these should be set - edit the makefile appropriately #endif #endif #endif #endif /* * WDT: according to my man page, getopt should be defined in unistd.h, * but my compiler seems to disagree unless this is set. I hope that * this doesn't break too many things. */ /*#define __USE_POSIX2*/ #if defined(MSDOS_SUPPORTED_ANTIQUE) #define SAVE_LEVELS #endif #ifdef COMPRESS_SAVE_FILES # ifdef USE_GZIP # define COMPRESSOR "gzip" # define UNCOMPRESSOR "gunzip" # define COMPRESS_EXT "gz" # define EXT_LENGTH 2 # else # define COMPRESSOR "compress" # define UNCOMPRESSOR "uncompress" # define COMPRESS_EXT "Z" # define EXT_LENGTH 1 # endif #else # define EXT_LENGTH 0 #endif #if !defined(FNAME_MAX_LEN) || defined(MSDOS) # ifdef MSDOS # undef FNAME_MAX_LEN # define FNAME_MAX_LEN 7 # else # define FNAME_MAX_LEN 14 # endif #endif #define VACANT 0 #define ABORT -1 #define CASHVALUE -2 /* moderately arbitrary but probably cannot be easily changed */ /*#define MAXWIDTH 64*/ #define MAXWIDTH 128 #define MAXLENGTH 64 #define SMALLSCREEN_LENGTH 16 #define SMALLSCREEN_WIDTH 64 #define STANDARD_LENGTH 64 #define STANDARD_WIDTH 64 #define ARENA_WIDTH SMALLSCREEN_WIDTH #define ARENA_LENGTH SMALLSCREEN_LENGTH #define ABYSS_WIDTH STANDARD_WIDTH #define ABYSS_LENGTH SMALLSCREEN_LENGTH #define ASTRAL_WIDTH STANDARD_WIDTH #define ASTRAL_LENGTH STANDARD_LENGTH #define CASTLE_WIDTH STANDARD_WIDTH #define CASTLE_LENGTH STANDARD_LENGTH #define CAVES_WIDTH STANDARD_WIDTH #define CAVES_LENGTH STANDARD_LENGTH #define CIRCLE_WIDTH SMALLSCREEN_WIDTH #define CIRCLE_LENGTH SMALLSCREEN_LENGTH #define COUNTRY_WIDTH STANDARD_WIDTH #define COUNTRY_LENGTH STANDARD_LENGTH #define COURT_WIDTH SMALLSCREEN_WIDTH #define COURT_LENGTH 24 #define DLAIR_WIDTH SMALLSCREEN_WIDTH #define DLAIR_LENGTH SMALLSCREEN_LENGTH #define HOUSE_WIDTH SMALLSCREEN_WIDTH #define HOUSE_LENGTH SMALLSCREEN_LENGTH #define HOVEL_WIDTH SMALLSCREEN_WIDTH #define HOVEL_LENGTH SMALLSCREEN_LENGTH #define MANSION_WIDTH SMALLSCREEN_WIDTH #define MANSION_LENGTH SMALLSCREEN_LENGTH #define MISLE_WIDTH SMALLSCREEN_WIDTH #define MISLE_LENGTH SMALLSCREEN_LENGTH #define PALACE_WIDTH STANDARD_WIDTH #define PALACE_LENGTH STANDARD_LENGTH #define RAMPART_WIDTH 128 #define RAMPART_LENGTH STANDARD_LENGTH #define SEWERS_WIDTH STANDARD_WIDTH #define SEWERS_LENGTH STANDARD_LENGTH #define SPEAK_WIDTH SMALLSCREEN_WIDTH #define SPEAK_LENGTH SMALLSCREEN_LENGTH #define TACTICAL_WIDTH SMALLSCREEN_WIDTH #define TACTICAL_LENGTH SMALLSCREEN_LENGTH #define TEMPLE_WIDTH SMALLSCREEN_WIDTH #define TEMPLE_LENGTH SMALLSCREEN_LENGTH #define VILLAGE_WIDTH SMALLSCREEN_WIDTH #define VILLAGE_LENGTH SMALLSCREEN_LENGTH #define VOLCANO_WIDTH STANDARD_WIDTH #define VOLCANO_LENGTH STANDARD_LENGTH /* number of slots in inventory. Cannot be changed without work */ #define MAXITEMS 16 /* number of slots in pack. Should be <= 26. */ #define MAXPACK 26 /* number of items in pawn shop. Should be <= 26 */ #define PAWNITEMS 20 /* DG -- the more the merrier. WDT -- I agree. */ /* number of lines back strings are recalled */ #define STRING_BUFFER_SIZE 25 /* number of rerolls allowed +1 */ /* added by dagibbs (DG) */ #define REROLLS -1 /* Verbosity levels */ #define TERSE 0 #define MEDIUM 1 #define VERBOSE 2 /* Arbitrary. Max of the levels in the dungeons */ #define MAXLEVELS 21 /* levels in each dungeon */ #define ASTRALLEVELS 5 #define SEWERLEVELS 18 #define CASTLELEVELS 16 #define CAVELEVELS 10 #define VOLCANOLEVELS 20 #define PALACELEVELS 14 /* Overall Game Progress Vector Bits */ /* Long had BETTER have at least 32 bits.... */ #define SPOKE_TO_DRUID 0x1 #define COMPLETED_CAVES 0x2 #define COMPLETED_SEWERS 0x4 #define COMPLETED_CASTLE 0x8 #define COMPLETED_ASTRAL 0x10 #define COMPLETED_VOLCANO 0x20 #define KILLED_DRAGONLORD 0x40 #define KILLED_EATER 0x80 #define KILLED_LAWBRINGER 0x100 #define COMPLETED_CHALLENGE 0x200 #define SOLD_CONDO 0x400 #define FAST_MOVE 0x800 #define SKIP_PLAYER 0x1000 #define SKIP_MONSTERS 0x2000 #define MOUNTED 0x4000 #define SUPPRESS_PRINTING 0x8000 #define LOST 0x10000 #define ARENA_MODE 0x20000 #define CHEATED 0x40000 #define BANK_BROKEN 0x80000 #define CLUB_MEMBER 0x100000 #define PREPARED_VOID 0x200000 #define DESTROYED_ORDER 0x400000 #define GAVE_STARGEM 0x800000 #define ATTACKED_ORACLE 0x1000000 #define UNDEAD_GUARDS 0x2000000 /* 26 so far... */ /* non-existant environments for the random number seeding routine */ /* added 12/30/98 (DG) */ #define E_RESTORE -2 #define E_RANDOM -1 /* general environment types */ #define E_NEVER_NEVER_LAND 0 #define E_COUNTRYSIDE 1 #define E_CITY 2 #define E_VILLAGE 3 #define E_TACTICAL_MAP 4 #define E_SEWERS 5 #define E_CASTLE 6 #define E_CAVES 7 #define E_VOLCANO 8 #define E_ASTRAL 9 #define E_ARENA 10 #define E_HOVEL 11 #define E_MANSION 12 #define E_HOUSE 13 #define E_DLAIR 14 #define E_ABYSS 15 #define E_STARPEAK 16 #define E_MAGIC_ISLE 17 #define E_TEMPLE 18 #define E_CIRCLE 19 #define E_COURT 20 #define E_PALACE 21 #define E_MAX E_PALACE /* player game status */ #define DEAD 1 #define QUIT 2 #define WIN 3 #define BIGWIN 4 /* kind of arbitrary */ #define MAXROOMS 48 #define MAXCONNECTIONS 4 #define STRING_LEN 100 /* some random characters */ #define ESCAPE 27 #define RETURN '\n' /* Aren't these backwards? WSS */ #define LINEFEED '\r' /* Aren't these backwards? WSS */ #define BACKSPACE '\b' #define DELETE 127 /* tac mode action definitions */ /* have to remember to find where these are used, mostly unused, now! */ #define DISENGAGE 10 #define BLOCK 20 #define CUT 30 #define THRUST 40 #define MAGIC 50 #define LUNGE 60 #define RIPOSTE 70 #define WIELD 80 #define PICK_UP 90 /* as in attack low, block high, etc. */ /* These values may be added to the ones above to get things like block high, cut low, etc. CLEVER is only used by some monsters to cheat with.... */ #define LOW 1 #define CENTER 2 #define HIGH 3 #define CLEVER 4 /* weapon types */ #define CUTTING 1 #define THRUSTING 2 #define STRIKING 3 #define MISSILE 4 /* random aux constants */ /* aux field for private residences in city */ #define BURGLED 2 #define LOCKED 3 #define UNLOCKED 0 /* cannot use M command on site with this aux value */ #define NOCITYMOVE 666 /* bow and crossbow object aux fields */ #define LOADED 1 #define UNLOADED 0 /* alignment used randomly throughout*/ #define LAWFUL 1 #define CHAOTIC 2 #define NEUTRAL 3 /* spells */ #define NUMSPELLS 42 #define S_MON_DET 0 #define S_OBJ_DET 1 #define S_MISSILE 2 #define S_FIREBOLT 3 #define S_TELEPORT 4 #define S_LBALL 5 #define S_SLEEP 6 #define S_DISRUPT 7 #define S_DISINTEGRATE 8 #define S_POLYMORPH 9 #define S_HEAL 10 #define S_DISPEL 11 #define S_IDENTIFY 12 #define S_BREATHE 13 #define S_INVISIBLE 14 #define S_WARP 15 #define S_ENCHANT 16 #define S_BLESS 17 #define S_RESTORE 18 #define S_CURE 19 #define S_TRUESIGHT 20 #define S_HELLFIRE 21 #define S_KNOWLEDGE 22 #define S_HERO 23 #define S_RETURN 24 #define S_DESECRATE 25 #define S_HASTE 26 #define S_SUMMON 27 #define S_SANCTUARY 28 #define S_ACCURACY 29 #define S_RITUAL 30 #define S_FEAR 31 #define S_APPORT 32 #define S_SHADOWFORM 33 #define S_ALERT 34 #define S_REGENERATE 35 #define S_SANCTIFY 36 #define S_CLAIRVOYANCE 37 #define S_DRAIN 38 #define S_LEVITATE 39 #define S_WISH 40 #define S_NUTRITION 41 /* ranks in guilds, etc */ #define NUMRANKS 10 #define LEGION 0 #define ARENA 1 #define COLLEGE 2 #define THIEVES 3 #define ORDER 4 #define CIRCLE 5 #define NOBILITY 6 #define PRIESTHOOD 7 #ifdef INCLUDE_MONKS #define MONKS 8 #endif #define ADEPT 9 #define LEGIONAIRE 1 #define CENTURION 2 #define FORCE_LEADER 3 #define COLONEL 4 #define COMMANDANT 5 #define TRAINEE 1 #define BESTIARIUS 2 #define RETIARIUS 3 #define GLADIATOR 4 #define CHAMPION 5 #define NOVICE 1 #define STUDENT 2 #define PRECEPTOR 3 #define MAGE 4 #define ARCHMAGE 5 #define TMEMBER 1 #define ATHIEF 2 #define THIEF 3 #define TMASTER 4 #define SHADOWLORD 5 #define GALLANT 1 #define GUARDIAN 2 #define CHEVALIER 3 #define PALADIN 4 #define JUSTICIAR 5 #define INITIATE 1 #define ENCHANTER 2 #define SORCEROR 3 #define HIGHSORCEROR 4 #define PRIME 5 #define COMMONER 1 #define ESQUIRE 2 #define KNIGHT 3 #define LORD 4 #define DUKE 5 #define LAY 1 #define ACOLYTE 2 #define PRIEST 3 #define SPRIEST 4 #define HIGHPRIEST 5 #ifdef INCLUDE_MONKS #define MONK_TRAINEE 1 #define MONK_MONK 2 #define MONK_MASTER 3 #define MONK_MASTER_SIGHS 4 #define MONK_MASTER_PAINS 5 #define MONK_MASTER_TEARS 6 #define MONK_GRANDMASTER 7 #endif /* different priesthoods */ #define ODIN 1 #define SET 2 #define ATHENA 3 #define HECATE 4 #define DRUID 5 #define DESTINY 6 /* MONSTER STATUS/ABILITY BITS */ /* currently a long */ #define AWAKE 1 #define MOBILE 2 #define HOSTILE 4 /* missing bit 3, 8 */ #define WANDERING 16 #define HUNGRY 32 #define GREEDY 64 #define NEEDY 128 #define ONLYSWIM 256 #define FLYING 512 #define INTANGIBLE 1024 #define M_INVISIBLE 2048 #define SWIMMING 4096 #define POISONOUS 8192 #define EDIBLE 16384 #define ALLOC 32768 /* allocated monstring & corpsestr */ /* PLAYER STATUS INDICES */ #define NUMSTATI 25 #define ACCURACY 0 #define BLINDED 1 #define SLOWED 2 #define DISPLACED 3 #define SLEPT 4 #define DISEASED 5 #define POISONED 6 #define HASTED 7 #define BREATHING 8 #define INVISIBLE 9 #define REGENERATING 10 #define VULNERABLE 11 #define BERSERK 12 #define IMMOBILE 13 #define ALERT 14 #define AFRAID 15 #define HERO 16 #define LEVITATING 17 #define ACCURATE 18 #define TRUESIGHT 19 #define SHADOWFORM 20 #define ILLUMINATION 21 #define DEFLECTION 22 #define PROTECTION 23 /* PROTECTION is deviant -- indicates protective value, not duration */ #define RETURNING 24 /* RETURNING is somewhat deviant--how many turns 'til RETURN spell goes off */ /* player immunity indices */ /* also monster immunity bits (2^n) */ /* also damage types */ #define NUMIMMUNITIES 14 #define UNSTOPPABLE 0 #define NORMAL_DAMAGE 1 #define FLAME 2 #define COLD 3 #define ELECTRICITY 4 #define POISON 5 #define ACID 6 #define FEAR 7 #define SLEEP 8 #define NEGENERGY 9 #define OTHER_MAGIC 10 #define THEFT 11 #define GAZE 12 #define INFECTION 13 #define EVERYTHING -1 /* location lstatus bits */ #define SEEN 1 #define LIT 2 #define SECRET 4 #define STOPS 8 #define CHANGED 16 /* room string id */ /* for use in roomname() */ /* number of rooms above ROOMBASE */ #define NUMROOMNAMES 30 #define RS_WALLSPACE 1 #define RS_CORRIDOR 2 #define RS_CAVERN 3 #define RS_GOBLINKING 4 #define RS_DRAGONLORD 5 #define RS_PONDS 6 #define RS_OCEAN 7 #define RS_WYRM 8 #define RS_ADEPT 9 #define RS_DESTINY 10 #define RS_ODIN 11 #define RS_SET 12 #define RS_ATHENA 13 #define RS_HECATE 14 #define RS_DRUID 15 #define RS_COUNTRYSIDE 16 #define RS_ARENA 17 #define RS_SEWER_DUCT 18 #define RS_DRAINED_SEWER 19 #define RS_DROWNED_SEWER 20 #define RS_KITCHEN 21 #define RS_BEDROOM 22 #define RS_BATHROOM 23 #define RS_DININGROOM 24 #define RS_SECRETPASSAGE 25 #define RS_CLOSET 26 #define RS_LOWERASTRAL 27 #define RS_EARTHPLANE 28 #define RS_WATERPLANE 29 #define RS_AIRPLANE 30 #define RS_FIREPLANE 31 #define RS_HIGHASTRAL 32 #define RS_VOLCANO 33 #define RS_STARPEAK 34 #define RS_MAGIC_ISLE 35 #define RS_CIRCLE 36 #define RS_ZORCH 37 #define RS_COURT 38 /* normal room name indices start after the RS_ constants */ #define ROOMBASE 39 #define RS_GARDEROBE ROOMBASE+0 #define RS_CELL ROOMBASE+1 #define RS_TILED ROOMBASE+2 #define RS_CRYSTAL_CAVE ROOMBASE+3 #define RS_BEDROOM2 ROOMBASE+4 #define RS_STOREROOM ROOMBASE+5 #define RS_CHARRED ROOMBASE+6 #define RS_MARBLE_HALL ROOMBASE+7 #define RS_EERIE_CAVE ROOMBASE+8 #define RS_TREASURE ROOMBASE+9 #define RS_SMOKEY ROOMBASE+10 #define RS_APARTMENT ROOMBASE+11 #define RS_ANTECHAMBER ROOMBASE+12 #define RS_HAREM ROOMBASE+13 #define RS_MULTIPURPOSE ROOMBASE+14 #define RS_STALACTITES ROOMBASE+15 #define RS_GREENHOUSE ROOMBASE+16 #define RS_WATERCLOSET ROOMBASE+17 #define RS_STUDY ROOMBASE+18 #define RS_LIVING_ROOM ROOMBASE+19 #define RS_DEN ROOMBASE+20 #define RS_ABATOIR ROOMBASE+21 #define RS_BOUDOIR ROOMBASE+22 #define RS_STAR_CHAMBER ROOMBASE+23 #define RS_MANMADE_CAVE ROOMBASE+24 #define RS_SEWER_CONTROL ROOMBASE+25 #define RS_SHRINE ROOMBASE+26 #define RS_MAGIC_LAB ROOMBASE+27 #define RS_PENTAGRAM ROOMBASE+28 #define RS_OMEGA_DAIS ROOMBASE+29 #if defined(MSDOS_SUPPORTED_ANTIQUE) || defined(AMIGA) #define CLR(fg) COL_##fg #define CLRS(fg,bg) COL_##fg|COL_BG_##bg #endif #if defined(MSDOS_SUPPORTED_ANTIQUE) #define COL_BLACK 0x0000 #define COL_BLUE 0x0100 #define COL_GREEN 0x0200 #define COL_CYAN 0x0300 #define COL_RED 0x0400 #define COL_PURPLE 0x0500 #define COL_BROWN 0x0600 #define COL_WHITE 0x0700 #define COL_GREY 0x0800 #define COL_LIGHT_BLUE 0x0900 #define COL_LIGHT_GREEN 0x0a00 #define COL_LIGHT_CYAN 0x0b00 #define COL_LIGHT_RED 0x0c00 #define COL_LIGHT_PURPLE 0x0d00 #define COL_YELLOW 0x0e00 #define COL_BRIGHT_WHITE 0x0f00 #define COL_BG_BLACK 0x0000 #define COL_BG_BLUE 0x1000 #define COL_BG_GREEN 0x2000 #define COL_BG_CYAN 0x3000 #define COL_BG_RED 0x4000 #define COL_BG_PURPLE 0x5000 #define COL_BG_BROWN 0x6000 #define COL_BG_WHITE 0x7000 #define COL_FG_BLINK 0x8000 #elif defined(AMIGA) #include /* unfortunately, this curses package only implements 8 colours... */ #define COL_WHITE 0x0100 #define COL_BLACK COL_WHITE /* this assumes that all things with black fg have white bg */ #define COL_BROWN 0x0200 #define COL_YELLOW 0x0300 #define COL_GREY 0x0400 #define COL_GREEN 0x0500 #define COL_BLUE 0x0600 #define COL_RED 0x0700 #define COL_CYAN 0x0500 /* = green */ #define COL_PURPLE 0x0700 /* = red */ #define COL_LIGHT_BLUE 0x0600 /* = blue */ #define COL_LIGHT_GREEN 0x0500 /* = green */ #define COL_LIGHT_CYAN 0x0500 /* = green */ #define COL_LIGHT_RED 0x0700 /* = red */ #define COL_LIGHT_PURPLE 0x0100 /* = white */ #define COL_BRIGHT_WHITE 0x0100 /* = white */ #define COL_BG_BLACK 0x0000 #define COL_BG_WHITE (A_REVERSE<<8) #define COL_BG_GREEN (A_REVERSE<<8) #define COL_BG_CYAN (A_REVERSE<<8) #define COL_BG_RED (A_REVERSE<<8) #define COL_BG_PURPLE (A_REVERSE<<8) #define COL_BG_BROWN (A_REVERSE<<8) #define COL_BG_BLUE (A_REVERSE<<8) #define COL_FG_BLINK 0x0000 /* not implemented :( */ /* WDT: thank goodness for that lack of implementation. */ #else /* !MSDOS_ANTIQUE && !AMIGA */ # ifdef USE_OPCURSES # include "../opcurses/curses.h" # else # include # endif # define COL_FG_BLINK A_BLINK # ifdef COLOR_PAIR # ifdef OMEGA_CLRGEN # define CLR(fg) OMEGA_CLRGEN1 fg # define CLRS(fg, bg) OMEGA_CLRGEN2 fg bg # else # include "clrgen.h" # define CLR(fg) CLR_##fg##_BLACK # define CLRS(fg, bg) CLR_##fg##_##bg # endif # else /* COLOR_PAIR */ # define CLR(fg) 0 # define CLRS(fg,bg) 0 # endif /* COLOR_PAIR */ #endif /* !MSDOS_ANTIQUE && !AMIGA */ /* objects, locations, and terrain; characters to draw */ #define NULL_ITEM '\0' #define SPACE (' ' | CLR(WHITE)) #define WALL ('#' | CLR(GREY)) #define PORTCULLIS ('7' | CLR(WHITE)) #define OPEN_DOOR ('|' | CLR(BROWN)) #define CLOSED_DOOR ('-' | CLR(BROWN)) #define WHIRLWIND ('6' | CLR(LIGHT_BLUE)) #define ABYSS ('0' | CLRS(BLACK,BROWN)) #define VOID_CHAR (' ' | CLR(WHITE)) #define LAVA ('`' | CLR(RED)) #define HEDGE ('\"' | CLR(GREEN)) #define WATER ('~' | CLR(BLUE)) #define FIRE (';' | CLR(LIGHT_RED)) #define TRAP ('^' | CLR(RED)) #define LIFT ('_' | CLR(BRIGHT_WHITE)) #define STAIRS_UP ('<' | CLR(WHITE)) #define STAIRS_DOWN ('>' | CLR(WHITE)) #define FLOOR ('.' | CLR(BROWN)) #define PLAYER ('@' | CLR(WHITE)) #define CORPSE ('+' | CLR(RED)) #define STATUE ('1' | CLR(GREY)) #define RUBBLE ('4' | CLR(GREY)) #define ALTAR ('8' | CLR(LIGHT_BLUE)) #define CASH ('$' | CLR(YELLOW)) /* various kinds of money */ #define PILE ('*' | CLR(BRIGHT_WHITE)) /* several objects in one place */ #define FOOD ('%' | CLR(BROWN)) #define WEAPON (')' | CLR(GREY)) #define MISSILEWEAPON ('(' | CLR(BROWN)) #define SCROLL ('?' | CLR(YELLOW)) #define POTION ('!' | CLR(LIGHT_GREEN)) #define ARMOR (']' | CLR(GREY)) #define SHIELD ('[' | CLR(BROWN)) #define CLOAK ('}' | CLR(CYAN)) #define BOOTS ('{' | CLR(BROWN)) #define STICK ('/' | CLR(BROWN)) #define RING ('=' | CLR(YELLOW)) #define THING ('\\' | CLR(WHITE)) #define ARTIFACT ('&' | CLR(YELLOW)) /* TERRAIN TYPES */ #define PLAINS ('-' | CLR(LIGHT_GREEN)) #define TUNDRA ('_' | CLR(GREY)) #define ROAD ('.' | CLR(BROWN)) #define MOUNTAINS ('^' | CLR(GREY)) #define PASS ('v' | CLR(BROWN)) #define RIVER ('~' | CLR(BLUE)) #define CITY ('O' | CLR(WHITE)) #define VILLAGE ('o' | CLR(WHITE)) #define FOREST ('(' | CLR(LIGHT_GREEN)) #define JUNGLE (')' | CLR(GREEN)) #define SWAMP ('=' | CLR(GREEN)) #define VOLCANO ('!' | CLR(RED)) #define CASTLE ('%' | CLR(GREY)) #define TEMPLE ('X' | CLR(BROWN)) #define CAVES ('*' | CLRS(BLACK,BROWN)) #define DESERT ('\"' | CLR(YELLOW)) #define CHAOS_SEA ('+' | CLR(LIGHT_PURPLE)) #define STARPEAK ('|' | CLR(LIGHT_BLUE)) #define DRAGONLAIR ('$' | CLR(BROWN)) #define MAGIC_ISLE ('&' | CLR(PURPLE)) #define PALACE ('K' | CLR(PURPLE)) #define CHAIR ('5' | CLR(BROWN)) #define SAFE ('3' | CLR(GREY)) #define FURNITURE ('2' | CLR(BROWN)) #define BED ('9' | CLR(CYAN)) /* wow, all characters used! */ /* total number of editable stats */ #define NUMSTATS 11 /* total number of player options */ #define NUMOPTIONS 11 /* number of options with TRUE/FALSE values */ #define NUMTFOPTIONS 9 /* The slot number of the two options not in Player.options */ #define VERBOSITY_LEVEL 10 #define SEARCH_DURATION 11 /* Player.options bits */ #define BELLICOSE 1 #define JUMPMOVE 2 #define RUNSTOP 4 #define PICKUP 8 #define CONFIRM 16 #define TOPINV 32 #define PACKADD 64 #define COMPRESS_OPTION 128 #define SHOW_COLOUR 256 /* This has to be changed whenever an item is added */ #define NUMSCROLLS 24 #define NUMPOTIONS 18 #define NUMFOODS 16 #define NUMTHINGS 31 /* DAG for mirror of self-knowledge */ /* WSS cards */ #define NUMCARDS 4 #define NUMWEAPONS 41 #define NUMARMOR 17 #define NUMSHIELDS 8 #define NUMCLOAKS 7 #define NUMBOOTS 7 #define NUMRINGS 9 /* DAG loss of ring of self-knowledge */ #define NUMSTICKS 17 #define NUMARTIFACTS 26 /* running sum of itemtypes, for indexing into Objects array */ #define THINGID 0 #define CARDID (THINGID+NUMTHINGS-NUMCARDS) #define FOODID NUMTHINGS /* 26 */ #define SCROLLID (FOODID + NUMFOODS) /* 42 */ #define POTIONID (SCROLLID + NUMSCROLLS) /* 66 */ #define WEAPONID (POTIONID + NUMPOTIONS) /* 84 */ #define ARMORID (WEAPONID + NUMWEAPONS) /* 125 */ #define SHIELDID (ARMORID + NUMARMOR) /* 142 */ #define CLOAKID (SHIELDID + NUMSHIELDS) /* 150 */ #define BOOTID (CLOAKID + NUMCLOAKS) /* 157 */ #define RINGID (BOOTID + NUMBOOTS) /* 164 */ #define STICKID (RINGID + NUMRINGS) /* 174 */ #define ARTIFACTID (STICKID + NUMSTICKS) /* 191 */ #define CASHID (ARTIFACTID+NUMARTIFACTS) /* 216 */ /* Corpse's aux field is monster id */ #define CORPSEID (CASHID+1) #define TOTALITEMS (CORPSEID+1) /* descriptive constants for various object ids */ #define OB_GARAGE_OPENER (THINGID+0) #define OB_LOCK_PICK (THINGID+2) #define OB_SALT_WATER (THINGID+6) #define OB_KEY (THINGID+7) #define OB_TORCH (THINGID+8) #define OB_JUSTICIAR_BADGE (THINGID+16) #define OB_TRAP_DART (THINGID+17) #define OB_TRAP_ACID (THINGID+18) #define OB_TRAP_SNARE (THINGID+19) #define OB_TRAP_FIRE (THINGID+20) #define OB_TRAP_TELEPORT (THINGID+21) #define OB_TRAP_SLEEP (THINGID+22) #define OB_TRAP_DISINTEGRATE (THINGID+23) #define OB_TRAP_ABYSS (THINGID+24) #define OB_TRAP_MANADRAIN (THINGID+25) #define OB_DEBIT_CARD (CARDID+0) #define OB_CREDIT_CARD (CARDID+1) #define OB_PREPAID_CARD (CARDID+2) #define OB_SMART_CARD (CARDID+3) #define OB_RATION (FOODID+0) #define OB_LEMBAS (FOODID+1) #define OB_GRAIN (FOODID+15) #define OB_BLANK_SCROLL (SCROLLID+0) #define OB_SPELLS_SCROLL (SCROLLID+1) #define OB_SCROLL_LAW (SCROLLID+17) #define OB_POTION_CHAOS (POTIONID+14) #define OB_SHORT_SWORD (WEAPONID+1) #define OB_GREAT_SWORD (WEAPONID+5) #define OB_GREAT_AXE (WEAPONID+12) #define OB_CLUB (WEAPONID+17) #define OB_QUARTERSTAFF (WEAPONID+18) #define OB_SPEAR (WEAPONID+19) #define OB_HALBERD (WEAPONID+20) #define OB_MACE_DISRUPT (WEAPONID+25) #define OB_LONGBOW (WEAPONID+26) #define OB_CROSSBOW (WEAPONID+27) #define OB_ARROW (WEAPONID+28) #define OB_BOLT (WEAPONID+29) #define OB_DESECRATOR (WEAPONID+32) #define OB_DEFENDER (WEAPONID+34) #define OB_VICTRIX (WEAPONID+35) #define OB_HEWER (WEAPONID+36) #define OB_GIANT_CLUB (WEAPONID+38) #define OB_SCYTHE_DEATH (WEAPONID+39) #define OB_LEATHER (ARMORID+1) #define OB_MITHRIL_PLATE (ARMORID+11) #define OB_DRAGONSCALE (ARMORID+12) #define OB_LRG_RND_SHIELD (SHIELDID+2) #define OB_DEFLECT (SHIELDID+7) #define OB_CLOAK_PROTECT (CLOAKID+4) #define OB_ORB_MASTERY (ARTIFACTID+0) #define OB_ORB_FIRE (ARTIFACTID+1) #define OB_ORB_WATER (ARTIFACTID+2) #define OB_ORB_EARTH (ARTIFACTID+3) #define OB_ORB_AIR (ARTIFACTID+4) #define OB_DEAD_ORB (ARTIFACTID+5) #define OB_ANTIOCH (ARTIFACTID+7) #define OB_YENDOR (ARTIFACTID+8) #define OB_KOLWYNIA (ARTIFACTID+9) #define OB_POTION_DEATH (ARTIFACTID+10) #define OB_POTION_LIFE (ARTIFACTID+13) #define OB_SYMBOL_ODIN (ARTIFACTID+14) #define OB_SYMBOL_SET (ARTIFACTID+15) #define OB_SYMBOL_ATHENA (ARTIFACTID+16) #define OB_SYMBOL_HECATE (ARTIFACTID+17) #define OB_SYMBOL_DRUID (ARTIFACTID+18) #define OB_SYMBOL_DESTINY (ARTIFACTID+19) #define OB_KARNAK (ARTIFACTID+20) #define OB_STARGEM (ARTIFACTID+21) #define OB_SCEPTRE (ARTIFACTID+22) #define OB_HOLDING (ARTIFACTID+24) /* describing unique items and monsters */ #define COMMON 0 #define UNIQUE_UNMADE 1 #define UNIQUE_MADE 2 #define UNIQUE_TAKEN 3 /* general item function id's */ #define I_NO_OP 0 #define I_NOTHING 1 /* note some of these functions are for other types of items too */ /* scroll functions */ #define I_BLESS 101 #define I_ACQUIRE 102 #define I_ENCHANT 103 #define I_TELEPORT 104 #define I_WISH 105 #define I_CLAIRVOYANCE 106 #define I_DISPLACE 107 #define I_ID 108 #define I_FIREFLASH 109 #define I_SPELLS 110 #define I_JANE_T 111 #define I_ALERT 112 #define I_FLUX 113 #define I_CHARGE 114 #define I_WARP 115 #define I_KNOWLEDGE 116 #define I_LAW 117 #define I_HINT 118 #define I_HERO 119 #define I_TRUESIGHT 120 #define I_ILLUMINATE 121 #define I_DEFLECT 122 /* potion functions */ #define I_HEAL 201 #define I_OBJDET 202 #define I_MONDET 203 #define I_SLEEP_SELF 204 #define I_RESTORE 205 #define I_NEUTRALIZE_POISON 206 #define I_SPEED 207 #define I_AZOTH 208 #define I_REGENERATE 210 #define I_INVISIBLE 211 #define I_BREATHING 212 #define I_FEAR_RESIST 213 #define I_AUGMENT 214 #define I_CHAOS 215 #define I_ACCURACY 216 #define I_LEVITATION 217 #define I_CURE 218 /* stick functions */ #define I_FIREBOLT 301 #define I_LBOLT 302 #define I_MISSILE 303 #define I_SLEEP_OTHER 304 #define I_FIREBALL 305 #define I_LBALL 306 #define I_SUMMON 307 #define I_HIDE 308 #define I_DISRUPT 309 #define I_DISINTEGRATE 310 #define I_SNOWBALL 311 #define I_APPORT 312 #define I_DISPEL 313 #define I_POLYMORPH 314 #define I_FEAR 315 /* food functions */ #define I_FOOD 401 #define I_LEMBAS 402 #define I_STIM 403 #define I_POW 404 #define I_IMMUNE 405 #define I_POISON_FOOD 406 #define I_CORPSE 407 #define I_PEPPER_FOOD 408 #define I_CANNIBAL 409 #define I_INEDIBLE 410 /* boots functions */ #define I_PERM_SPEED 501 #define I_PERM_HERO 502 #define I_PERM_LEVITATE 503 #define I_PERM_AGILITY 504 #define I_BOOTS_JUMPING 505 #define I_BOOTS_7LEAGUE 506 /* cloak functions */ #define I_PERM_DISPLACE 601 #define I_PERM_NEGIMMUNE 602 #define I_PERM_INVISIBLE 603 #define I_PERM_ACCURACY 604 #define I_PERM_PROTECTION 605 #define I_PERM_TRUESIGHT 606 /* ring functions */ #define I_PERM_VISION 701 #define I_PERM_BURDEN 702 #define I_PERM_STRENGTH 703 #define I_PERM_GAZE_IMMUNE 704 #define I_PERM_FIRE_RESIST 705 #define I_PERM_POISON_RESIST 706 #define I_PERM_REGENERATE 707 #define I_PERM_KNOWLEDGE 708 /* armor functions */ #define I_PERM_ENERGY_RESIST 801 #define I_PERM_BREATHING 802 #define I_PERM_FEAR_RESIST 803 #define I_NORMAL_ARMOR 804 /* artifact functions */ #define I_ORBFIRE 901 #define I_ORBWATER 902 #define I_ORBEARTH 903 #define I_ORBAIR 904 #define I_ORBMASTERY 905 #define I_ORBDEAD 906 #define I_CRYSTAL 907 #define I_ANTIOCH 908 #define I_KOLWYNIA 909 #define I_DEATH 910 #define I_ENCHANTMENT 911 #define I_HELM 912 #define I_LIFE 913 #define I_JUGGERNAUT 914 #define I_SYMBOL 915 #define I_STARGEM 916 #define I_SCEPTRE 917 #define I_PLANES 918 #define I_HOLDING 919 #define I_SERENITY 920 /* weapons functions */ #define I_NORMAL_WEAPON 1001 #define I_LIGHTSABRE 1002 #define I_DEMONBLADE 1003 #define I_MACE_DISRUPT 1004 #define I_TANGLE 1005 #define I_ARROW 1006 #define I_BOLT 1007 #define I_VORPAL 1008 #define I_DESECRATE 1009 #define I_FIRESTAR 1010 #define I_DEFEND 1011 #define I_VICTRIX 1012 #define I_EMPIRE 1013 #define I_SCYTHE 1014 #define I_ACIDWHIP 1015 /* thing functions */ #define I_PICK 1101 #define I_KEY 1102 #define I_SHOVEL 1103 /* unused */ #define I_EXCAVATOR 1104 /* unused */ #define I_PERM_ILLUMINATE 1105 #define I_TRAP 1106 #define I_RAISE_PORTCULLIS 1107 /* shield functions */ #define I_PERM_DEFLECT 1201 #define I_NORMAL_SHIELD 1202 /* monster function ids */ /* Its conceivable for a function of one type to be called when another would usually occur. A monster's special function may be an extra move, for example. */ #define M_NO_OP -1 /* talk functions */ #define M_TALK_STUPID 101 #define M_TALK_SILENT 102 #define M_TALK_HUNGRY 103 #define M_TALK_GREEDY 104 #define M_TALK_TITTER 105 #define M_TALK_MAN 106 #define M_TALK_ROBOT 107 #define M_TALK_EVIL 108 #define M_TALK_BURBLE 109 #define M_TALK_SLITHY 110 #define M_TALK_MIMSY 111 #define M_TALK_SEDUCTOR 112 #define M_TALK_MP 113 #define M_TALK_IM 114 #define M_TALK_GUARD 115 #define M_TALK_GHOST 116 #define M_TALK_HINT 117 #define M_TALK_BEG 118 #define M_TALK_EF 119 #define M_TALK_GF 120 #define M_TALK_MORGON 121 #define M_TALK_LB 122 #define M_TALK_DEMONLOVER 123 #define M_TALK_ASSASSIN 124 #define M_TALK_NINJA 125 #define M_TALK_THIEF 126 #define M_TALK_MERCHANT 127 #define M_TALK_HORSE 128 #define M_TALK_PARROT 129 #define M_TALK_ANIMAL 130 #define M_TALK_HYENA 131 #define M_TALK_SERVANT 132 #define M_TALK_SCREAM 133 #define M_TALK_DRUID 134 #define M_TALK_ARCHMAGE 135 #define M_TALK_PRIME 136 #define M_TALK_MAHARAJA 137 /* ability functions */ #define M_SP_SURPRISE 201 #define M_SP_MP 202 #define M_SP_THIEF 203 #define M_SP_AGGRAVATE 204 #define M_SP_POISON_CLOUD 205 #define M_SP_HUGE 206 #define M_SP_SUMMON 207 #define M_SP_ILLUSION 208 #define M_SP_FLUTTER 209 #define M_SP_ESCAPE 210 #define M_SP_SPELL 211 #define M_SP_EXPLODE 212 #define M_SP_DEMON 213 #define M_SP_ACID_CLOUD 214 #define M_SP_WHIRL 215 #define M_SP_GHOST 216 #define M_SP_WHISTLEBLOWER 217 #define M_SP_EATER 218 #define M_SP_LAWBRINGER 219 #define M_SP_DRAGONLORD 220 #define M_SP_DE 221 #define M_SP_DEMONLOVER 222 #define M_SP_SEDUCTOR 223 #define M_SP_MASTER 224 #define M_SP_WYRM 225 #define M_SP_BLACKOUT 226 #define M_SP_BOG 227 #define M_SP_MERCHANT 228 #define M_SP_WERE 229 #define M_SP_SERVANT 231 #define M_SP_AV 232 #define M_SP_LW 233 #define M_SP_SWARM 234 #define M_SP_ANGEL 235 #define M_SP_MB 236 #define M_SP_MIRROR 237 #define M_SP_RAISE 238 #define M_SP_DEATH 239 #define M_SP_COURT 240 #define M_SP_LAIR 241 #define M_SP_PRIME 242 /* rangestrike functions */ #define M_STRIKE_MISSILE 301 #define M_STRIKE_FBOLT 302 #define M_STRIKE_LBALL 303 #define M_STRIKE_FBALL 304 #define M_STRIKE_BLIND 305 #define M_STRIKE_SNOWBALL 306 #define M_STRIKE_MASTER 307 #define M_STRIKE_SONIC 308 /* combat functions */ #define M_MELEE_NORMAL 401 #define M_MELEE_FIRE 402 #define M_MELEE_DRAGON 403 #define M_MELEE_MP 404 #define M_MELEE_ELEC 405 #define M_MELEE_POISON 406 #define M_MELEE_NG 407 #define M_MELEE_SUCCUBUS 408 #define M_MELEE_SPIRIT 409 #define M_MELEE_DISEASE 410 #define M_MELEE_SLEEP 411 #define M_MELEE_COLD 412 #define M_MELEE_MASTER 413 #define M_MELEE_GRAPPLE 414 #define M_MELEE_DEATH 415 /* movement functions */ #define M_MOVE_NORMAL 501 #define M_MOVE_FLUTTER 502 #define M_MOVE_TELEPORT 503 #define M_MOVE_FOLLOW 504 #define M_MOVE_RANDOM 505 #define M_MOVE_SMART 506 #define M_MOVE_SPIRIT 507 #define M_MOVE_SCAREDY 508 #define M_MOVE_CONFUSED 509 #define M_MOVE_ANIMAL 510 #define M_MOVE_LEASH 230 /* MLx -> index to Monsters starting for level x */ /* MLx -> number of monsters of level x or less */ /* NML_x -> number of monsters of level x */ /* NML-X must be changed whenever a monster is added */ /* This whole thing MUST be repaired. Monster levels must * be represented elsewhere. */ #define ML0 0 #define NML_0 9 #define ML1 (ML0 + NML_0) /* 9 */ #define NML_1 22 #define ML2 (ML1 + NML_1) /* 31 */ #define NML_2 14 #define ML3 (ML2 + NML_2) /* 45 */ #define NML_3 15 #define ML4 (ML3 + NML_3) /* 60 */ #define NML_4 18 #define ML5 (ML4 + NML_4) /* 78 */ #define NML_5 14 #define ML6 (ML5 + NML_5) /* 92 */ #define NML_6 13 #define ML7 (ML6 + NML_6) /* 105 */ #define NML_7 15 #define ML8 (ML7 + NML_7) /* 120 */ #define NML_8 12 #define ML9 (ML8 + NML_8) /* 132 */ #define NML_9 8 #define ML10 (ML9 + NML_9) /* 140 */ #define NML_10 11 #define NUMMONSTERS (ML10 + NML_10) /* 151 */ /* Some monster ID's : (Those that are explicitly named in code) */ /* Actually, there are still many magic constants floating around. */ /* Eventually I'll get around to making each monster's id a constant.... */ /* done, thanks to David Gibbs. */ #define RANDOM -1 #define HORNET (ML0+0) #define MEND_PRIEST (ML0+1) #define ITIN_MERCH (ML0+2) #define GUARD (ML0+3) #define NPC (ML0+4) #define SHEEP (ML0+5) #define MERCHANT (ML0+6) #define ZERO_NPC (ML0+7) #define HISCORE_NPC (ML0+8) #define GRUNT (ML1+0) #define TSETSE (ML1+1) #define FNORD (ML1+2) #define SEWER_RAT (ML1+3) #define AGGRAVATOR (ML1+4) #define BLIPPER (ML1+5) #define GOBLIN (ML1+6) #define PHANTASTICON (ML1+7) #define ROBOT (ML1+8) #define GEEK (ML1+9) #define BOROGROVE (ML1+10) #define QUAIL (ML1+11) #define BADGER (ML1+12) #define HAWK (ML1+13) #define DEER (ML1+14) #define CAMEL (ML1+15) #define ANTEATER (ML1+16) #define BUNNY (ML1+17) #define TROUT (ML1+18) #define BASS (ML1+19) #define PARROT (ML1+20) #define HYENA (ML1+21) #define APPR_NINJA (ML2+0) #define NIGHT_GAUNT (ML2+1) #define SNEAK_THIEF (ML2+2) #define EYE (ML2+3) #define TOVE (ML2+4) #define NASTY (ML2+5) #define GHOST (ML2+6) #define ENCHANTOR (ML2+7) /* use 'OR' to avoid conflict with circle rank */ #define MURK (ML2+8) #define GOBLIN_CHIEF (ML2+9) #define WOLF (ML2+10) #define ANT (ML2+11) #define ELEPHANT (ML2+12) #define HORSE (ML2+13) #define SALAMANDER (ML3+0) #define CATOBLEPAS (ML3+1) #define L_FDEMON (ML3+2) #define ACID_CLOUD (ML3+3) #define PHANTOM (ML3+4) #define GOBLIN_KING (ML3+5) #define PTERODACTYL (ML3+6) #define GOBLIN_SHAMAN (ML3+7) #define LION (ML3+8) #define BRIGAND (ML3+9) #define BEAR (ML3+10) #define MAMBA (ML3+11) #define MANOWAR (ML3+12) #define WEREHUMAN (ML3+13) #define THOUGHTFORM (ML3+14) #define MANTICORE (ML4+0) #define TASMANIAN (ML4+1) #define AUTO_MINOR (ML4+2) #define DENEBIAN (ML4+3) #define JUBJUB (ML4+4) #define HAUNT (ML4+5) #define INCUBUS (ML4+6) #define SATYR (ML4+7) #define CROC (ML4+8) #define TORPOR (ML4+9) #define DOBERMAN (ML4+10) #define FUZZY (ML4+11) #define SERV_LAW (ML4+12) #define SERV_CHAOS (ML4+13) #define SWARM (ML4+14) #define BAN_SIDHE (ML4+15) #define GRUE (ML4+16) #define GENIN (ML4+17) #define DRAGONETTE (ML5+0) #define TESLA (ML5+1) #define WYVERN (ML5+2) #define CATEAGLE (ML5+3) #define FROST_DEMON (ML5+4) #define SPECTRE (ML5+5) #define NECROMANCER (ML5+6) #define SHADOW (ML5+7) #define BOGTHING (ML5+8) #define ASTRAL_VAMP (ML5+9) #define LAVA_WORM (ML5+10) #define MANABURST (ML5+11) #define OUTER_DEMON (ML5+12) #define MIRRORSHADE (ML5+13) #define FIRE_ELEM (ML6+0) #define AIR_ELEM (ML6+1) #define WATER_ELEM (ML6+2) #define EARTH_ELEM (ML6+3) #define BANDERSNATCH (ML6+4) #define LICHE (ML6+5) #define TRITON (ML6+6) #define MAST_THIEF (ML6+7) #define TRICER (ML6+8) #define RAKSHASA (ML6+9) #define DEMON_SERP (ML6+10) #define ANGEL (ML6+11) #define CHUNIN (ML6+12) #define BEHEMOTH (ML7+0) #define NAZGUL (ML7+1) #define UNICORN (ML7+2) #define ROUS (ML7+3) #define ILL_FIEND (ML7+4) #define GREAT_WYRM (ML7+5) #define FLAME_DEV (ML7+6) #define LURKER (ML7+7) #define SANDMAN (ML7+8) #define MIRRORMAST (ML7+9) #define ELDER_GRUE (ML7+10) #define LOATHLY (ML7+11) #define ZOMBIE (ML7+12) #define RICOCHET (ML7+13) #define INNER_DEMON (ML7+14) #define GOOD_FAIRY (ML8+0) #define BAD_FAIRY (ML8+1) #define AUTO_MAJOR (ML8+2) #define DRAGON (ML8+3) #define JABBERWOCK (ML8+4) #define FDEMON_L (ML8+5) #define TIGERSHARK (ML8+6) #define JONIN (ML8+7) #define SHADOW_SLAY (ML8+8) #define MIL_PRIEST (ML8+9) #define COMA (ML8+10) #define HIGH_ANGEL (ML8+11) #define JOTUN (ML9+0) #define INVIS_SLAY (ML9+1) #define KING_WYV (ML9+2) #define DEATHSTAR (ML9+3) #define THAUMATURGIST (ML9+4) #define VAMP_LORD (ML9+5) #define ARCHANGEL (ML9+6) #define DEMON_PRINCE (ML9+7) #define DEATH (ML10+0) #define EATER (ML10+1) #define LAWBRINGER (ML10+2) #define DRAGON_LORD (ML10+3) #define DEMON_EMP (ML10+4) #define LORD_EARTH (ML10+5) #define LORD_AIR (ML10+6) #define LORD_WATER (ML10+7) #define LORD_FIRE (ML10+8) #define ELEM_MASTER (ML10+9) #define MAHARAJA (ML10+10) /* location functions */ #define L_NO_OP 0 /* random sites, used many places */ #define L_LIFT 1 #define L_FIRE 2 #define L_ALTAR 3 #define L_TRIFID 4 #define L_RAISE_PORTCULLIS 5 /* spare entry: 6 */ /* city level shop and guild functions */ /* following are those in CitySiteList */ #define NUMCITYSITES 30 #define CITYSITEBASE 7 #define L_CHARITY 7 #define L_ARMORER 8 #define L_CLUB 9 #define L_GYM 10 #define L_THIEVES_GUILD 11 #define L_COLLEGE 12 #define L_HEALER 13 #define L_CASINO 14 #define L_TAVERN 15 #define L_MERC_GUILD 16 #define L_ALCHEMIST 17 #define L_SORCERORS 18 #define L_CASTLE 19 #define L_ARENA 20 #define L_DPW 21 #define L_LIBRARY 22 #define L_PAWN_SHOP 23 #define L_BANK 24 #define L_CONDO 25 #define L_ORACLE 26 #define L_ORDER 27 #define L_DINER 28 #define L_COMMANDANT 29 #define L_CRAP 30 #define L_TEMPLE 31 #define L_COUNTRYSIDE 32 #define L_BROTHEL 33 #define L_SEWER 34 #define L_TOURIST 35 #ifdef INCLUDE_MONKS #define L_MONASTERY 36 /* first available PGM */ #endif /* end of city sites */ /* gap for a few more city sites, could be either list: 37, 38, 39, 40 */ /* other city sites, not in move list */ #define L_GARDEN 41 #define L_JAIL 42 #define L_MAZE 43 /* city */ #define L_CEMETARY 44 /* city */ #define L_VAULT 45 /* city */ #define L_MANSION 46 /* city */ /* sites in villages */ #define L_CARTOGRAPHER 47 /* villages */ #define L_STABLES 48 /* villages */ #define L_COMMONS 49 /* villages */ #define L_GRANARY 50 /* villages */ #define L_LAWSTONE 51 #define L_CHAOSTONE 52 /* shouldn't this be CHAOSSTONE ?? :) DAG */ #define L_SACRIFICESTONE 53 #define L_VOIDSTONE 54 #define L_BALANCESTONE 55 #define L_MINDSTONE 56 /* gap for a few more village or combined city/village sites: 57, 58, 59, 60 */ /* sites in city & villages */ #define L_HOVEL 61 #define L_HOUSE 62 /* sites in the countryside */ #define L_TEMPLE_WARNING 63 /* country */ #define L_ADEPT 64 /* country */ #define L_TACTICAL_EXIT 65 /* country, sort of */ /* allow a couple more country sites: 66, 67, 68 */ /* final abyss sites; ignore levitation */ #define L_EARTH_STATION 69 #define L_FIRE_STATION 70 #define L_WATER_STATION 71 #define L_AIR_STATION 72 #define L_VOID_STATION 73 #define L_VOID 74 #define L_VOICE1 75 #define L_VOICE2 76 #define L_VOICE3 77 /* circle hq sites */ #define L_TOME1 78 #define L_TOME2 79 #define L_ENTER_CIRCLE 80 #define L_CIRCLE_LIBRARY 81 /* other site functions, particular dungeons or special levels */ #define L_ARENA_EXIT 82 /* arena */ #define L_ENTER_COURT 83 /* castle */ #define L_THRONE 84 /* court of the archmage */ #define L_ESCALATOR 85 /* court of the archmage */ #define L_WHIRLWIND 86 /* astral */ #define L_HOUSE_EXIT 87 /* house */ #define L_SAFE 88 /* house */ /* unused site functions, these were defined, so I left them defined -- DAG */ #define L_OMEGA 89 /* not currently used */ #define L_DRUID 90 /* not currently used */ #define L_WARNING 91 /* not currently used */ #define L_OCCUPIED_HOUSE 92 /* not currently used */ #define L_FINAL_ABYSS 93 /* not currently used */ /* hold for 94, 95, 96, 97, 98, 99 still in the affect player while levitating range */ /* greater than LEVITATION_AVOIDANCE, no effect if player is levitating */ #define LEVITATION_AVOIDANCE 100 /* traps */ #define NUMTRAPS 13 #define TRAP_BASE 101 #define L_TRAP_DART 101 #define L_TRAP_PIT 102 #define L_TRAP_DOOR 103 #define L_TRAP_SNARE 104 #define L_TRAP_BLADE 105 #define L_TRAP_FIRE 106 #define L_TRAP_TELEPORT 107 #define L_TRAP_DISINTEGRATE 108 #define L_TRAP_SLEEP_GAS 109 #define L_TRAP_ACID 110 #define L_TRAP_MANADRAIN 111 #define L_TRAP_ABYSS 112 #define L_TRAP_SIREN 113 #define NUM_SAFE_TRAPS 7 /* the first NUM_SAFE_TRAPS are non-insta-lethal */ /* leave head room for extra traps: 114, 115, 116, 117, 118, 119, 120 */ /* random sites */ #define L_CHAOS 121 #define L_WATER 122 #define L_LAVA 123 #define L_ABYSS 124 #define L_MAGIC_POOL 125 #define L_PORTCULLIS_TRAP 126 #define L_PORTCULLIS 127 #define L_STATUE_WAKE 128 #define L_HEDGE 129 #define L_RUBBLE 130 #define L_DROP_EVERY_PORTCULLIS 131 /* tested, but never set */ /* unused site functions, these were defined, so I left them defined -- DAG */ #define L_STATUE_RANDOM 132 /* not currently used */ /* player possession slots */ /* slot 0 should not be filled when out of inventory_control() */ #define O_UP_IN_AIR 0 #define O_READY_HAND 1 #define O_WEAPON_HAND 2 #define O_LEFT_SHOULDER 3 #define O_RIGHT_SHOULDER 4 #define O_BELT1 5 #define O_BELT2 6 #define O_BELT3 7 #define O_SHIELD 8 #define O_ARMOR 9 #define O_BOOTS 10 #define O_CLOAK 11 #define O_RING1 12 #define O_RING2 13 #define O_RING3 14 #define O_RING4 15 /* How depressingly stupid that there weren't already defined. WDT. */ #define VIL_STARVIEW 1 #define VIL_WOODMERE 2 #define VIL_STORMWAT 3 #define VIL_THAUMARI 4 #define VIL_SKORCH 5 #define VIL_WHORFEN 6 /* Changing these would currently require changing the maps as well (although * there should be no other side effects). I intend to remove the need for * this list later, by making the maps refer to each other (and thus removing * the need for the game to know about anything but map 0), but that comes * MUCH later. */ enum map_identifier { MAP_country=0, MAP_arena=1, MAP_circle=2, MAP_city=3, MAP_abyss=4, MAP_court=5, MAP_dlair=6, MAP_hedges=7, MAP_house=8, MAP_hovel=9, MAP_mansion=10, MAP_misle=11, MAP_skorch=12, MAP_speak=13, MAP_starview=14, MAP_stormwat=15, MAP_temple=16, MAP_thaumari=17, MAP_whorfen=18, MAP_woodmere=19, }; /* typedefs needed by structs */ /* I don't ever define map_type (except in the C file where it's used); this * means that you _must_ declare only pointers to it. I've defined, of * course, all of the needed accessor and mutator functions; see externs.h, * in the map.c section. */ struct map_type; typedef struct map_type map; #if defined(MSDOS_SUPPORTED_ANTIQUE) || defined(AMIGA) typedef short Symbol; #else typedef chtype Symbol; #endif /* structure definitions */ struct bank_account { short player; long balance; long number; char *password; struct bank_account * next_account; }; typedef struct bank_account bank_account; struct room { int lighted; int left,right,top,bottom; int rsi; /* index into roomname switch */ }; struct spell { char known; char id; char powerdrain; } ; struct monster { struct objectlist *possessions; unsigned char attacked; int aux1,aux2,x,y,click; int id,hp,hit,ac,dmg,sense,wakeup,level,speed; unsigned char sleep,treasure; long xpv; int corpseweight,corpsevalue,transformid,startthing; unsigned char uniqueness; int talkf,movef,meleef,strikef,specialf; long status,immunity; Symbol monchar; char *monstring,*corpsestr,*meleestr; }; struct monsterlist { struct monster *m; struct monsterlist *next; }; struct player { int str,con,dex,agi,iq,pow,maxstr,maxcon,maxdex,maxagi,maxiq,maxpow; long xp; int level,hp,maxhp,hit,dmg,absorption,speed,click; int defense,food,alignment; long mana,maxmana; long cash; int patron,birthday; char preference; int sx,sy; /* sanctuary coordinates */ int x,y; /* current player coordinates */ int itemweight,maxweight; int immunity[NUMIMMUNITIES]; int status[NUMSTATI]; long options; int rank[NUMRANKS]; long guildxp[NUMRANKS]; char name[64]; char meleestr[64]; struct object *possessions[MAXITEMS]; struct object *pack[MAXPACK]; int packptr; }; struct object { int id,weight,plus,charge,dmg,hit,aux,number,fragility; long basevalue; unsigned char known,used; int blessing; unsigned char type,uniqueness; int usef; unsigned char level; Symbol objchar; char *objstr,*truename,*cursestr; }; struct objectlist { struct object *thing; struct objectlist *next; }; /* terrain locations */ struct terrain { Symbol base_terrain_type; Symbol current_terrain_type; char aux; char status; }; /* dungeon locations */ struct location { unsigned char p_locf; /* function executed when moved on */ unsigned char lstatus; /* seen,stopsrun,lit,secret, */ unsigned char roomnumber; /* so room can be named */ Symbol locchar; /* terrain type */ Symbol showchar; /*char instantaneously drawn for site */ int aux; /* signifies various things */ unsigned char buildaux; /* used in constructing level */ struct objectlist *things; struct monster *creature; }; struct level { char depth; /* which level is this */ struct level *next; /* pointer to next level in dungeon */ #ifndef SAVE_LEVELS struct location site[MAXWIDTH][MAXLENGTH]; /* dungeon data */ #else /* Over 64K worth of data! */ struct location *site[MAXWIDTH]; /* dungeon data */ #endif char generated; /* has the level been made (visited) yet? */ char numrooms; /* number of rooms on level */ char tunnelled; /* amount of tunnelling done on this level */ struct monsterlist *mlist; /* List of monsters on level */ int environment; /* where kind of level is this? */ int last_visited; /* time player was last on this level */ int level_width; /* width of current level */ int level_length; /* length of current level */ }; /* random typedef's */ typedef struct monsterlist mltype; typedef mltype *pml; typedef struct monster montype; typedef montype *pmt; typedef struct location loctype; typedef loctype *plc; typedef struct level levtype; typedef levtype *plv; typedef struct object objtype; typedef objtype *pob; typedef struct objectlist oltype; typedef oltype *pol; /* random function declarations from system libraries */ #include /* The assert macro (for ANSI/ISO C). Hopefully this will always work! */ #include /* #ifdef MSDOS #include #define getlogin() "pcuser" #endif */ #undef sign #undef max #undef min #undef abs /* These must be made to work for both longs and ints */ #define sign(n) (((n) < 0) ? -1 : (((n) > 0) ? 1 : 0)) #define max(a,b) (((a) > (b)) ? (a) : (b)) #define min(a,b) (((a) < (b)) ? (a) : (b)) #define abs(n) (((n) < 0) ? (-(n)) : (n)) #define RANDFUNCTION genrand #define SRANDFUNCTION sgenrand /* WDT: This should be harmless under ANSI C, and will stop * some errors under bizarre platforms. */ #define pow2(n) (1L << (n)) /* these bit operations were functions, but are faster as macros... */ #define loc_statusp(x,y,stat) ((Level->site[x][y].lstatus&(stat))?1:0) #define lset(x,y,stat) (Level->site[x][y].lstatus |= (stat)) #define lreset(x,y,stat) (Level->site[x][y].lstatus &= ~(stat)) #define c_statusp(x,y,stat) ((Country[x][y].status&(stat))?1:0) #define c_set(x,y,stat) (Country[x][y].status |= (stat)) #define c_reset(x,y,stat) (Country[x][y].status &= ~(stat)) #define m_statusp(m,s) (((m)->status&(s))?1:0) #define m_status_set(m,s) ((m)->status |= (s)) #define m_status_reset(m,s) ((m)->status &= ~(s)) #define m_immunityp(m,s) (((m)->immunity&pow2(s))?1:0) #define gamestatusp(flag) ((GameStatus&(flag))?1:0) #define setgamestatus(flag) (GameStatus |= (flag)) #define resetgamestatus(flag) (GameStatus &= ~(flag)) #define optionp(o) ((Player.options&(o))?1:0) #define optionset(o) (Player.options |= (o)) #define optionreset(o) (Player.options &= ~(o)) /* systemV for some reason uses string.h instead of strings.h */ /* Also, random and srandom are unlikely to be found on system V... */ #ifdef STRING #include #endif #ifndef STRING #include #endif #include #ifndef TRUE #define TRUE 1 #define FALSE 0 #endif #ifdef SAVE_LEVELS plv msdos_changelevel(); #endif