/* NetHack 5.0	permonst.h	$NHDT-Date: 1725653014 2024/09/06 20:03:34 $  $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.26 $ */
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
/*-Copyright (c) Kenneth Lorber, Kensington, Maryland, 2015. */
/* NetHack may be freely redistributed.  See license for details. */

#ifndef PERMONST_H
#define PERMONST_H

enum monnums {
#define MONS_ENUM
#include "monsters.h"
#undef MONS_ENUM
        NUMMONS,
        NON_PM = -1,              /* "not a monster" */
        LOW_PM = NON_PM + 1,      /* first monster in mons */
        LEAVESTATUE = NON_PM - 1, /* leave statue instead of corpse;
                                   * there are two lower values assigned
                                   * in end.c so that (x == LEAVESTATUE)
                                   * will test FALSE in bones.c:
                                   *  (NON_PM - 2) for no corpse
                                   *  (NON_PM - 3) for no corpse, no grave */
        HIGH_PM = NUMMONS - 1,
        SPECIAL_PM = PM_LONG_WORM_TAIL  /* [normal] < ~ < [special] */
                /* mons[SPECIAL_PM] through mons[NUMMONS-1], inclusive, are
                   never generated randomly and cannot be polymorphed into */
};

/*     This structure covers all attack forms.
 *     aatyp is the gross attack type (eg. claw, bite, breath, ...)
 *     adtyp is the damage type (eg. physical, fire, cold, spell, ...)
 *     damn is the number of hit dice of damage from the attack.
 *     damd is the number of sides on each die.
 *
 *     Some attacks can do no points of damage.  Additionally, some can
 *     have special effects *and* do damage as well.  If damn and damd
 *     are set, they may have a special meaning.  For example, if set
 *     for a blinding attack, they determine the amount of time blinded.
 */

struct attack {
    uchar aatyp;
    uchar adtyp, damn, damd;
};

/*     Max # of attacks for any given monster.
 */

#define NATTK 6

#ifndef ALIGN_H
#include "align.h"
#endif
#include "monattk.h"
#include "monflag.h"

struct permonst {
    const char *pmnames[NUM_MGENDERS];
    const enum monnums pmidx;   /* mons array index aka PM_ identifier */
    char mlet;                  /* symbol */
    schar mlevel,               /* base monster level */
        mmove,                  /* move speed */
        ac,                     /* (base) armor class */
        mr;                     /* (base) magic resistance */
    aligntyp maligntyp;         /* basic monster alignment */
    unsigned short geno;        /* creation/geno mask value */
    struct attack mattk[NATTK]; /* attacks matrix */
    unsigned cwt;               /* weight of corpse */
    unsigned short cnutrit;     /* its nutritional value */
    uchar msound;               /* noise it makes (6 bits) */
    uchar msize;                /* physical size (3 bits) */
    uchar mresists;             /* resistances */
    uchar mconveys;             /* conveyed by eating */
    unsigned long mflags1,      /* boolean bitflags */
        mflags2;                /* more boolean bitflags */
    unsigned short mflags3;     /* yet more boolean bitflags */
    uchar difficulty;           /* toughness (formerly from  makedefs -m) */
    uchar mcolor;               /* color to use */
};

#define NORMAL_SPEED 12

extern NEARDATA struct permonst mons[NUMMONS + 1]; /* the master list of
                                                    * monster types */

#endif /* PERMONST_H */
