view xrogue/rogue.h @ 187:233be801aa81

srogue: replace unlink() with md_unlink(). md_unlink_open_file() might be needed eventually.
author John "Elwin" Edwards
date Mon, 03 Aug 2015 06:42:59 -0400
parents 3e1146666ae5
children f54901b9c39b
line wrap: on
line source

/*
    rogue.h - Rogue definitions and variable declarations
    
    XRogue: Expeditions into the Dungeons of Doom
    Copyright (C) 1991 Robert Pietkivitch
    All rights reserved.
    
    Based on "Advanced Rogue"
    Copyright (C) 1984, 1985 Michael Morgan, Ken Dalka and AT&T
    All rights reserved.

    Based on "Rogue: Exploring the Dungeons of Doom"
    Copyright (C) 1980, 1981 Michael Toy, Ken Arnold and Glenn Wichman
    All rights reserved.
    
    See the file LICENSE.TXT for full copyright and licensing information.
*/ 

#ifdef HAVE_CONFIG_H
#include "config.h"
#endif

/*
 * some compiler don't handle void pointers well so
 */
#include <assert.h>
#define reg  register
#define VOID long
#undef lines
#define ENCREAD encread
#define ENCWRITE encwrite
#undef SCROLL   /* UNIX/370 defines SCROLL for some bizarre reason */
#define exfork fork     /* Standard fork with no paging available */

/*
 * Maximum number of different things
 */

#define MINCOLS         70
#define MINLINES        22
#define MAXROOMS        9
#define MAXTHINGS       9
#define MAXOBJ          9
#define MAXSTATS        74      /* max total of all stats at startup */
#define MAXPACK         27      /* max number of items in pack */
#define MAXDOUBLE       14      /* max number of times exppts is doubled */
#define MAXCONTENTS     20      /* max number of things beaker/book can hold */
#define MAXENCHANT      30      /* max number of enchantments on an item */
#define MAXTREAS        25      /* number monsters/treasure in treasure room */
#define MAXTRAPS        20      /* max number of traps that may be on level */
#define MAXTRPTRY       15      /* attempts/level allowed for setting traps */
#define MAXDOORS        4       /* maximum doors to a room */
#define MAXCHANTS       16      /* maximum number of chants for a druid */
#define MAXPRAYERS      16      /* maximum number of prayers for cleric */
#define MAXSPELLS       16      /* maximum number of spells for magician */
#define MAXQUILL        14      /* scrolls the Quill of Nagrom can write */
#define QUILLCHARGES    300     /* max num of charges in the Quill of Nagrom */
#define NUM_CNAMES      26      /* number of names per character level */
#define NUMMONST        211     /* current number of monsters */
#define NUMUNIQUE       60      /* number of UNIQUEs (minus jacaranda) */
#define NUMDINOS        30      /* number of dinosaurs (for OUTSIDE level) */
#define NLEVMONS        3       /* number of new monsters per level */
#define NUMSCORE        20      /* number of entries in score file */
#define HARDER          40      /* at this level start making things harder */
#define LINELEN         256     /* characters in a buffer */
#define JUG_EMPTY       -1      /* signifys that the alchemy jug is empty */
#define MAXPURCH        (pstats.s_charisma/3) /* num of purchases at t.post */
#define MAXATT          50      /* charactor's attribute maximum number */

/* Movement penalties */
#define BACKPENALTY 3
#define SHOTPENALTY 2           /* In line of sight of missile */
#define DOORPENALTY 1           /* Moving out of current room */

/*
 * these defines are used in calls to get_item() to signify what
 * it is we want
 */

#define ALL             -1
#define WEARABLE        -2
#define CALLABLE        -3
#define WIELDABLE       -4
#define USEABLE         -5
#define IDENTABLE       -6
#define REMOVABLE       -7
#define PROTECTABLE     -8
#define ZAPPABLE        -9
#define READABLE        -10
#define QUAFFABLE       -11

/*
 * stuff to do with encumberance
 */

#define NORMENCB        1400    /* normal encumberance */
#define F_SATIATED       0      /* player's stomach is very full */
#define F_OKAY           1      /* have plenty of food in stomach */
#define F_HUNGRY         2      /* player is hungry */
#define F_WEAK           3      /* weak from lack of food */
#define F_FAINT          4      /* fainting from lack of food */

/*
 * actions a player/monster will take
 */

#define A_MOVE          0200    /* normal movement */
#define A_FREEZE        0201    /* frozen in place */
#define A_ATTACK        0202    /* trying to hit */
#define A_SELL          0203    /* trying to sell goods */
#define A_NIL           0204    /* not doing anything */
#define A_BREATHE       0205    /* breathing */
#define A_MISSILE       0206    /* Firing magic missiles */
#define A_SONIC         0207    /* Sounding a sonic blast */
#define A_SUMMON        0210    /* Summoning help */
#define A_USERELIC      0211    /* Monster uses a relic */
#define A_SLOW          0212    /* monster slows the player */
#define A_ZAP           0213    /* monster shoots a wand */
#define A_PICKUP        0214    /* player is picking something up */
#define A_USEWAND       0215    /* monster is shooting a wand */
#define A_THROW         't'
#define C_CAST          'C'
#define C_COUNT         '*'
#define C_DIP           'D'
#define C_DROP          'd'
#define C_EAT           'e'
#define C_PRAY          'p'
#define C_CHANT         'c'
#define C_QUAFF         'q'
#define C_READ          'r'
#define C_SEARCH        's'
#define C_SETTRAP       '^'
#define C_TAKEOFF       'T'
#define C_USE           CTRL('U')
#define C_WEAR          'W'
#define C_WIELD         'w'
#define C_ZAP           'z'

/* Possible ways for the hero to move */

#define H_TELEPORT 0

/*
 * return values for get functions
 */

#define NORM    0       /* normal exit */
#define QUIT    1       /* quit option setting */
#define MINUS   2       /* back up one option */

/* 
 * The character types
 */

#define C_FIGHTER       0
#define C_RANGER        1
#define C_PALADIN       2
#define C_MAGICIAN      3
#define C_CLERIC        4
#define C_THIEF         5
#define C_ASSASSIN      6
#define C_DRUID         7
#define C_MONK          8
#define C_MONSTER       9
#define NUM_CHARTYPES   10

/*
 * define the ability types
 */

#define A_INTELLIGENCE  0
#define A_STRENGTH      1
#define A_WISDOM        2
#define A_DEXTERITY     3
#define A_CONSTITUTION  4
#define A_CHARISMA      5
#define NUMABILITIES    6

/*
 * values for games end
 */

#define UPDATE  -2
#define SCOREIT -1
#define KILLED   0
#define CHICKEN  1
#define WINNER   2

/*
 * definitions for function step_ok:
 *      MONSTOK indicates it is OK to step on a monster -- it
 *      is only OK when stepping diagonally AROUND a monster;
 *      it is also OK if the stepper is a friendly monster and
 *      is in a fighting mood.
 */

#define MONSTOK 1
#define NOMONST 2
#define FIGHTOK 3

/*
 * used for ring stuff
 */

#define LEFT_1          0
#define LEFT_2          1
#define LEFT_3          2
#define LEFT_4          3
#define RIGHT_1         4
#define RIGHT_2         5
#define RIGHT_3         6
#define RIGHT_4         7
#define NUM_FINGERS     8

/*
 * used for micellaneous magic (MM) stuff
 */

#define WEAR_BOOTS      0
#define WEAR_BRACERS    1
#define WEAR_CLOAK      2
#define WEAR_GAUNTLET   3
#define WEAR_JEWEL      4
#define WEAR_NECKLACE   5
#define NUM_MM          6

/*
    How to exit flags:
*/

#define EXIT_CLS        1    /* Clear screen first */
#define EXIT_ENDWIN     2    /* Shutdown Curses    */


/*
 * All the fun defines
 */

#define next(ptr) (*ptr).l_next
#define prev(ptr) (*ptr).l_prev
#define ldata(ptr) (*ptr).l_data
#define inroom(rp, cp) (\
    (cp)->x <= (rp)->r_pos.x + ((rp)->r_max.x - 1) && (rp)->r_pos.x <= (cp)->x \
 && (cp)->y <= (rp)->r_pos.y + ((rp)->r_max.y - 1) && (rp)->r_pos.y <= (cp)->y)
#define winat(y, x) (mvwinch(mw, y, x)==' '?mvwinch(stdscr, y, x):winch(mw))
#define debug if (wizard) msg
#define RN (((seed = seed*11109+13849) & 0x7fff) >> 1)
#define unc(cp) (cp).y, (cp).x
#define cmov(xy) move((xy).y, (xy).x)
#define DISTANCE(y1, x1, y2, x2) ((x2 - x1)*(x2 - x1) + (y2 - y1)*(y2 - y1))
#define OBJPTR(what)    (struct object *)((*what).l_data)
#define THINGPTR(what)  (struct thing *)((*what).l_data)
#define DOORPTR(what)   (coord *)((*what).l_data)
#define when break;case
#define otherwise break;default
#define until(expr) while(!(expr))
#define ce(a, b) ((a).x == (b).x && (a).y == (b).y)
#define draw(window) wrefresh(window)
#define newfont(window) if (funfont) wattron(window, A_ALTCHARSET);
#define nofont(window) if (funfont) wattroff(window, A_ALTCHARSET);
#define hero player.t_pos
#define pstats player.t_stats
#define max_stats player.maxstats
#define pack player.t_pack
#define attach(a, b) _attach(&a, b)
#define detach(a, b) _detach(&a, b)
#define o_free_list(a) _o_free_list(&a)
#define r_free_list(a) _r_free_list(&a)
#define t_free_list(a) _t_free_list(&a)
#undef min
#undef max
#define max(a, b) ((a) > (b) ? (a) : (b))
#define min(a, b) ((a) < (b) ? (a) : (b))
#define on(thing, flag) \
    (((thing).t_flags[(flag >> FLAGSHIFT) & FLAGINDEX] & flag) != 0)
#define off(thing, flag) \
    (((thing).t_flags[(flag >> FLAGSHIFT) & FLAGINDEX] & flag) == 0)
#define turn_on(thing, flag) \
    ((thing).t_flags[(flag >> FLAGSHIFT) & FLAGINDEX] |= (flag & ~FLAGMASK))
#define turn_off(thing, flag) \
    ((thing).t_flags[(flag >> FLAGSHIFT) & FLAGINDEX] &= ~flag)

/* define the control character */

#undef CTRL
#define CTRL(ch) (ch & 037)

#define ALLOC(x) malloc((unsigned int) x)
#define FREE(x) free((char *) x)
#define EQSTR(a, b, c)  (strncmp(a, b, c) == 0)
#define EQUAL(a, b)     (strcmp(a, b) == 0)
#define GOLDCALC (rnd(50 + 10 * level) + 2)
#define ISRING(h, r) (cur_ring[h] != NULL && cur_ring[h]->o_which == r)
#define ISWEARING(r)    (ISRING(LEFT_1, r)  || ISRING(LEFT_2, r)  ||\
                         ISRING(LEFT_3, r)  || ISRING(LEFT_4, r)  ||\
                         ISRING(RIGHT_1, r) || ISRING(RIGHT_2, r) ||\
             ISRING(RIGHT_3, r) || ISRING(RIGHT_4, r))
#define newgrp() ++group
#define o_charges o_ac
#define o_kind o_ac
#define ISMULT(type) (type == FOOD)
#define isrock(ch) ((ch == WALL) || (ch == HORZWALL) || (ch == VERTWALL) || (ch == SECRETDOOR))
#define is_stealth(tp) \
    (rnd(25) < (tp)->t_stats.s_dext || (tp == &player && ISWEARING(R_STEALTH)))

#define has_light(rp) (((rp)->r_flags & HASFIRE) || ISWEARING(R_LIGHT))

#define mi_wght mi_worth
#define mi_food mi_curse

/*
 * Ways to die
 */

#define D_PETRIFY       -1
#define D_ARROW         -2
#define D_DART          -3
#define D_POISON        -4
#define D_BOLT          -5
#define D_SUFFOCATION   -6
#define D_POTION        -7
#define D_INFESTATION   -8
#define D_DROWN         -9
#define D_ROT           -10
#define D_CONSTITUTION  -11
#define D_STRENGTH      -12
#define D_SIGNAL        -13
#define D_CHOKE         -14
#define D_STRANGLE      -15
#define D_FALL          -16
#define D_RELIC         -17
#define D_STARVATION    -18
#define D_FOOD_CHOKE    -19
#define D_SCROLL        -20
#define D_FRIGHT        -21
#define D_CRYSTAL       -22
#define D_CARD          -23
#define DEATHNUM         23      /* number of ways to die */

/*
 * Things that appear on the screens
 */

#define WALL            ' '
#define PASSAGE         '#'
#define DOOR            '+'
#define FLOOR           '.'
#define HORZWALL        '-'
#define VERTWALL        '|'
#define VPLAYER         '@'
#define IPLAYER         '_'
#define POST            '^'
#define TRAPDOOR        '>'
#define ARROWTRAP       '{'
#define SLEEPTRAP       '$'
#define BEARTRAP        '}'
#define TELTRAP         '~'
#define DARTTRAP        '`'
#define WORMHOLE        '<'
#define POOL            '"'
#define MAZETRAP        '\''
#define SECRETDOOR      '&'
#define STAIRS          '%'
#define GOLD            '*'
#define POTION          '!'
#define SCROLL          '?'
#define MAGIC           '$'
#define BMAGIC          '>'     /*      Blessed magic   */
#define CMAGIC          '<'     /*      Cursed  magic   */
#define FOOD            ':'
#define WEAPON          ')'
#define MISSILE         '*'     /*      Magic Missile   */
#define ARMOR           ']'
#define MM              ';'
#define RELIC           ','
#define RING            '='
#define STICK           '/'
#define FOREST          '\\'

/*
 * Various constants
 * Crypt() returns a different string on the PC for some silly reason
 */

#define PASSWD          "mT5uKwhm5WDRs"
#define FIGHTBASE       10
#define BEFORE          1
#define AFTER           2
#define ESC             27
#define BOLT_LENGTH     12
#define MARKLEN         20
#define SLEEPTIME       (roll(15, 2))
#define BEARTIME        (roll(15, 2))
#define FREEZETIME      30
#define HEALTIME        40
#define SICKTIME        40
#define MORETIME        80
#define STOMACHSIZE     2100
#define PAINTIME        (roll(15, 2))
#define CLOAK_TIME      (roll(15, 2))
#define CHILLTIME       (roll(15, 2))
#define STONETIME       (roll(15, 2))
#define SMELLTIME       (50+rnd(30))
#define DUSTTIME        (50+rnd(30))
#define STINKTIME       (50+rnd(30))
#define HASTETIME       (50+rnd(30))
#define HUHDURATION     (50+rnd(30))
#define GONETIME        (50+rnd(30)) 
#define SKILLDURATION   (50+rnd(30))
#define SEEDURATION     (150+rnd(50))
#define CLRDURATION     (150+rnd(50))
#define FLYTIME         (150+rnd(50))
#define PHASEDURATION   (150+rnd(50))
#define ALCHEMYTIME     (250+rnd(100))
#define FIRETIME        (180+roll(20, 2))
#define COLDTIME        (180+roll(20, 2))
#define BOLTTIME        (180+roll(20, 2))
#define DAYLENGTH       700
#define LEVEL           700  /* make depth of dungeon equal to DAYLENGTH */
#define WANDERTIME      (max(5, (HARDER+rnd(25))-rnd(vlevel*2)))
#define SPELLTIME       ((max(30-pstats.s_lvl,5)))
#define vlevel          (max(level, turns/LEVEL + 1))

/*
 * Save against things
 */

#define VS_POISON               00
#define VS_PARALYZATION         00
#define VS_DEATH                00
#define VS_PETRIFICATION        01
#define VS_WAND                 02
#define VS_BREATH               03
#define VS_MAGIC                04

/*
 * attributes for treasures in dungeon
 */

#define ISCURSED               01
#define ISKNOW                 02
#define ISPOST                 04       /* object is in a trading post */
#define ISMETAL               010
#define ISPROT                020       /* object is protected */
#define ISBLESSED             040
#define ISPOISON             0100
#define ISMISL             020000
#define ISMANY             040000

/*
 * Various flag bits
 */

#define ISDARK                 01
#define ISGONE                 02
#define ISTREAS                04
#define ISFOUND               010
#define ISTHIEFSET            020
#define FORCEDARK             040

/*
 * 1st set of creature flags (this might include player)
 */

#define ISBLIND         0x00000001
#define ISINWALL        0x00000002
#define ISRUN           0x00000004
#define ISFLEE          0x00000008
#define ISINVIS         0x00000010
#define ISMEAN          0x00000020
#define ISGREED         0x00000040
#define CANSHOOT        0x00000080
#define ISHELD          0x00000100
#define ISHUH           0x00000200
#define ISREGEN         0x00000400
#define CANHUH          0x00000800
#define CANSEE          0x00001000
#define HASFIRE         0x00002000
#define ISSLOW          0x00004000
#define ISHASTE         0x00008000
#define ISCLEAR         0x00010000
#define CANINWALL       0x00020000
#define ISDISGUISE      0x00040000
#define CANBLINK        0x00080000
#define CANSNORE        0x00100000
#define HALFDAMAGE      0x00200000
#define CANSUCK         0x00400000
#define CANRUST         0x00800000
#define CANPOISON       0x01000000
#define CANDRAIN        0x02000000
#define ISUNIQUE        0x04000000
#define STEALGOLD       0x08000000

/* 
 * Second set of flags 
 */

#define STEALMAGIC      0x10000001
#define CANDISEASE      0x10000002
#define HASDISEASE      0x10000004
#define CANSUFFOCATE    0x10000008
#define DIDSUFFOCATE    0x10000010
#define BOLTDIVIDE      0x10000020
#define BLOWDIVIDE      0x10000040
#define NOCOLD          0x10000080
#define TOUCHFEAR       0x10000100
#define BMAGICHIT       0x10000200
#define NOFIRE          0x10000400
#define NOBOLT          0x10000800
#define CARRYGOLD       0x10001000
#define CANITCH         0x10002000
#define HASITCH         0x10004000
#define DIDDRAIN        0x10008000
#define WASTURNED       0x10010000
#define CANSELL         0x10020000
#define CANBLIND        0x10040000
#define NOACID          0x10080000
#define NOSLOW          0x10100000
#define NOFEAR          0x10200000
#define NOSLEEP         0x10400000
#define NOPARALYZE      0x10800000
#define NOGAS           0x11000000
#define CANMISSILE      0x12000000
#define CMAGICHIT       0x14000000
#define CANPAIN         0x18000000

/* 
 * Third set of flags 
 */

#define CANSLOW         0x20000001
#define CANTUNNEL       0x20000002
#define TAKEWISDOM      0x20000004
#define NOMETAL         0x20000008
#define MAGICHIT        0x20000010
#define CANINFEST       0x20000020
#define HASINFEST       0x20000040
#define NOMOVE          0x20000080
#define CANSHRIEK       0x20000100
#define CANDRAW         0x20000200
#define CANSMELL        0x20000400
#define CANPARALYZE     0x20000800
#define CANROT          0x20001000
#define ISSCAVENGE      0x20002000
#define DOROT           0x20004000
#define CANSTINK        0x20008000
#define HASSTINK        0x20010000
#define ISSHADOW        0x20020000
#define CANCHILL        0x20040000
#define CANHUG          0x20080000
#define CANSURPRISE     0x20100000
#define CANFRIGHTEN     0x20200000
#define CANSUMMON       0x20400000
#define TOUCHSTONE      0x20800000
#define LOOKSTONE       0x21000000
#define CANHOLD         0x22000000
#define DIDHOLD         0x24000000
#define DOUBLEDRAIN     0x28000000

/* 
 * Fourth set of flags 
 */

#define CANBRANDOM      0x30000001      /* Types of breath */
#define CANBACID        0x30000002      /* acid */
#define CANBFIRE        0x30000004      /* Fire */
#define CANBCGAS        0x30000008      /* confusion gas */
#define CANBBOLT        0x30000010      /* lightning bolt */
#define CANBGAS         0x30000020      /* chlorine gas */
#define CANBICE         0x30000040      /* ice */
#define CANBFGAS        0x30000080      /* Fear gas */
#define CANBPGAS        0x30000100      /* Paralyze gas */
#define CANBSGAS        0x30000200      /* Sleeping gas */
#define CANBSLGAS       0x30000400      /* Slow gas */
#define CANBREATHE      0x300007ff      /* Can it breathe at all? */

/*
 * Fifth set of flags
 */

#define ISUNDEAD        0x40000001
#define CANSONIC        0x40000002
#define TURNABLE        0x40000004
#define TAKEINTEL       0x40000008
#define NOSTAB          0x40000010
#define CANDISSOLVE     0x40000020
#define ISFLY           0x40000040      /* creature can fly */
#define CANTELEPORT     0x40000080      /* creature can teleport */
#define CANEXPLODE      0x40000100      /* creature explodes when hit */
#define CANDANCE        0x40000200      /* creature can make hero "dance" */
#define ISDANCE         0x40000400      /* creature (hero) is dancing */
#define CARRYFOOD       0x40000800
#define CARRYSCROLL     0x40001000
#define CARRYPOTION     0x40002000
#define CARRYRING       0x40004000
#define CARRYSTICK      0x40008000
#define CARRYMISC       0x40010000
#define CARRYMDAGGER    0x40020000      /* Dagger of Musty */
#define CARRYCLOAK      0x40040000      /* Cloak of Emori */
#define CARRYANKH       0x40080000      /* Ankh of Heil */
#define CARRYSTAFF      0x40100000      /* Staff of Ming */
#define CARRYWAND       0x40200000      /* Wand of Orcus */
#define CARRYROD        0x40400000      /* Rod of Asmodeus */
#define CARRYYAMULET    0x40800000      /* Amulet of Yendor */
#define CARRYMANDOLIN   0x41000000      /* Mandolin of Brian */
#define MISSEDDISP      0x42000000      /* Missed Cloak of Displacement */
#define CANBSTAB        0x44000000      /* Can backstab */
#define ISGUARDIAN      0x48000000      /* Guardian of a treasure room */

/*
 * Sixth set of flags
 */

#define CARRYHORN       0x50000001      /* Horn of Geryon */
#define CARRYMSTAR      0x50000002      /* Morning Star of Hruggek */
#define CARRYFLAIL      0x50000004      /* Flail of Yeenoghu */
#define CARRYWEAPON     0x50000008      /* A generic weapon */
#define CANAGE          0x50000010      /* can age you */
#define CARRYDAGGER     0x50000020      /* carry's a dumb old dagger */
#define AREMANY         0x50000040      /* they come in droves */
#define CARRYEYE        0x50000080      /* has the eye of Vecna */
#define HASSUMMONED     0x50000100      /* has already summoned */
#define ISSTONE         0x50000200      /* has been turned to stone */
#define NODETECT        0x50000400      /* detect monster will not show him */
#define NOSTONE         0x50000800      /* creature made its save vrs stone */
#define CARRYQUILL      0x50001000      /* has the quill of Nagrom */
#define CARRYAXE        0x50002000      /* has the axe of Aklad */
#define TOUCHSLOW       0x50004000      /* touch will slow hero */
#define WASDISRUPTED    0x50008000      /* creature was disrupted by player */
#define CARRYARMOR      0x50010000      /* creature will pick up armor */
#define CARRYBAMULET    0x50020000      /* amulet of skoraus stonebones */
#define CARRYSURTURRING 0x50040000      /* ring of Surtur */
#define CARRYCARD       0x50080000      /* carry the card of Alteran */
#define ISCHARMED       0x50100000      /* is the monster charmed? */
#define ISFRIENDLY      0x50100000      /* monster friendly for any reason? */

#define NEEDSTOACT      0x60000001      /* monster ready to act this turn n */
#define ISDEAD          0x60000002      /* monster is dead                  */
#define ISELSEWHERE     0x60000004      /* monster has been whisked away    */

/* Masks for choosing the right flag */

#define FLAGMASK     0xf0000000
#define FLAGINDEX    0x0000000f
#define FLAGSHIFT    28
#define MAXFLAGS     25                 /* max initial flags per creature */

/* 
 * Mask for cancelling special abilities 
 * The flags listed here will be the ones left on after the
 * cancellation takes place
 */

#define CANC0MASK (     ISBLIND         | ISINWALL      | ISRUN         | \
                        ISFLEE          | ISMEAN        | ISGREED       | \
                        CANSHOOT        | ISHELD        | ISHUH         | \
                        ISSLOW          | ISHASTE       | ISCLEAR       | \
                        ISUNIQUE )
#define CANC1MASK (     HASDISEASE      | DIDSUFFOCATE  | CARRYGOLD     | \
                        HASITCH         | CANSELL       | DIDDRAIN      | \
                        WASTURNED )
#define CANC2MASK (     HASINFEST       | NOMOVE        | ISSCAVENGE    | \
                        DOROT           | HASSTINK      | DIDHOLD )
#define CANC3MASK (     CANBREATHE )
#define CANC4MASK (     ISUNDEAD        | CANSONIC      | NOSTAB        | \
                        ISFLY           | CARRYFOOD     | CANEXPLODE    | \
                        ISDANCE         | CARRYSCROLL   | CARRYPOTION   | \
                        CARRYRING       | CARRYSTICK    | CARRYMISC     | \
                        CARRYMDAGGER    | CARRYCLOAK    | CARRYANKH     | \
                        CARRYSTAFF      | CARRYWAND     | CARRYROD      | \
                        CARRYYAMULET    | CARRYMANDOLIN | ISGUARDIAN )
#define CANC5MASK (     CARRYHORN       | CARRYMSTAR    | CARRYFLAIL    | \
                        CARRYEYE        | CARRYDAGGER   | HASSUMMONED   | \
                        AREMANY         | CARRYWEAPON   | NOSTONE       | \
                        CARRYQUILL      | CARRYAXE      | WASDISRUPTED  | \
                        CARRYARMOR      | CARRYBAMULET  | CARRYSURTURRING )
#define CANC6MASK (     CARRYCARD )
#define CANC7MASK ( 0 )
#define CANC8MASK ( 0 )
#define CANC9MASK ( 0 )
#define CANCAMASK ( 0 )
#define CANCBMASK ( 0 )
#define CANCCMASK ( 0 )
#define CANCDMASK ( 0 )
#define CANCEMASK ( 0 )
#define CANCFMASK ( 0 )

/* types of things */

#define TYP_POTION      0
#define TYP_SCROLL      1
#define TYP_FOOD        2
#define TYP_WEAPON      3
#define TYP_ARMOR       4
#define TYP_RING        5
#define TYP_STICK       6
#define TYP_MM          7
#define TYP_RELIC       8
#define NUMTHINGS       9

/*
 * food types
 */

#define E_RATION        0
#define E_APPLE         1
#define E_BANANA        2
#define E_BLUEBERRY     3
#define E_CANDLEBERRY   4
#define E_CAPRIFIG      5
#define E_DEWBERRY      6
#define E_ELDERBERRY    7
#define E_GOOSEBERRY    8
#define E_GUANABANA     9
#define E_HAGBERRY      10
#define E_JABOTICABA    11
#define E_PEACH         12
#define E_PITANGA       13
#define E_PRICKLEY      14
#define E_RAMBUTAN      15
#define E_SAPODILLA     16
#define E_SOURSOP       17
#define E_STRAWBERRY    18
#define E_SWEETSOP      19
#define E_WHORTLEBERRY  20
#define E_SLIMEMOLD     21
#define MAXFOODS        22

/*
 * Potion types
 */

#define P_CLEAR         0
#define P_ABIL          1
#define P_SEEINVIS      2
#define P_HEALING       3
#define P_MFIND         4
#define P_TFIND         5
#define P_RAISE         6
#define P_HASTE         7
#define P_RESTORE       8
#define P_PHASE         9
#define P_INVIS         10
#define P_FLY           11
#define P_FFIND         12
#define P_SKILL         13
#define P_FIRE          14
#define P_COLD          15
#define P_LIGHTNING     16
#define P_POISON        17
#define MAXPOTIONS      18

/*
 * Scroll types
 */

#define S_CONFUSE       0
#define S_MAP           1
#define S_LIGHT         2
#define S_HOLD          3
#define S_SLEEP         4
#define S_ALLENCH       5
#define S_IDENT         6
#define S_SCARE         7
#define S_GFIND         8
#define S_TELEP         9
#define S_CREATE        10
#define S_REMOVE        11
#define S_PETRIFY       12
#define S_GENOCIDE      13
#define S_CURING        14
#define S_MAKEIT        15
#define S_PROTECT       16
#define S_FINDTRAPS     17
#define S_RUNES         18
#define S_CHARM         19
#define MAXSCROLLS      20

/*
 * Weapon types
 */

#define MACE            0               /* mace */
#define SWORD           1               /* long sword */
#define BOW             2               /* short bow */
#define ARROW           3               /* arrow */
#define DAGGER          4               /* dagger */
#define ROCK            5               /* rocks */
#define TWOSWORD        6               /* two-handed sword */
#define SLING           7               /* sling */
#define DART            8               /* darts */
#define CROSSBOW        9               /* crossbow */
#define BOLT            10              /* crossbow bolt */
#define SPEAR           11              /* spear */
#define TRIDENT         12              /* trident */
#define SPETUM          13              /* spetum */
#define BARDICHE        14              /* bardiche */
#define PIKE            15              /* pike */