]> granicus.if.org Git - nethack/commitdiff
pmnames mons gender naming plus a window port interface change
authornhmall <nhmall@nethack.org>
Sat, 26 Dec 2020 16:23:23 +0000 (11:23 -0500)
committernhmall <nhmall@nethack.org>
Sat, 26 Dec 2020 16:23:23 +0000 (11:23 -0500)
add MALE, FEMALE, and gender-neutral names for individual monster species
to the mons array. The gender-neutral name (NEUTRAL) is mandatory, the
MALE and FEMALE versions are not.

replace code uses of the mname field of permonst with one of the three
potentially-available gender-specific names.

consolidate some separate mons entries that differed only by species into a
single mons entry (caveman, cavewoman and priest,priestess etc.)

consolidate several "* lord" and "* queen/* king" monst entries into
their single species, and allow both genders on some where it makes some
sense (there is probably more work and cleanup to come out of this at some
point, and the chosen gender-neutral name variations are not cast in stone
if someone has better suggestions).

related function or macro additions:
    pmname(pm, gender) to get the gender variation of the permonst name. It
    guards against monsters that haven't got anything except NEUTRAL naming
    and falls back to the NEUTRAL version if FEMALE and MALE versions are
    missing.

    Ugender to obtain the current hero gender.
    Mgender(mtmp) to obtain the gender of a monster

While the code can safely refer directly to pmnames[NEUTRAL] safely in the
code because it always exists, the other two (pmnames[MALE] and
pmnames[FEMALE] may not exist so use:
    pmname(ptr, gidx)
      where -ptr is a permonst *
            -gidx is an index into the pmnames array field of the
             permonst struct
pmname() checks for a valid index and checks for null-pointers for
pmnames[MALE] and pmnames[FEMALE], and will fall back to pmnames[NEUTRAL] if
the pointer requested if the requested variation is unavailable, or if the
gidx is out-of-range.

Allow code to specify makemon flags to request female or male (via MM_MALE
and MM_FEMALE flags respectively)to makedefs, since the species alone doesn't
distinguish male/female anymore. Specifying MM_MALE or MM_FEMALE won't
override the pm M2_MALE and M2_FEMALE flags on a mons[] entry.

male and female tiles have been added to win/share/monsters.txt.
The majority are duplicated placeholders except for those that were
separate mons entries before. Perhaps someone will contribute artwork in the
future to make the male and female variations visually distinguishable.

tilemapping via has the MALE tile indexes in the glyph2tile[]
array produced at build time. If a window port has information that the
FEMALE tile is required, it just has to increment the index returned
from the glyph2tile[] array by 1.

statues already preserved gender of the monster through STATUE_FEMALE
and STATUE_MALE, so ensure that pmnames takes that into consideration.

I expect some refinement will be required after broad play-testing puts it to
the test.

    consolidate caveman,cavewoman and priest,priestess monst.c entries etc

This commit will require a bump of editlevel in patchlevel.h because it alters
the index numbers of the monsters due to the consolidation of some. Those
index numbers are saved in some other structures, even though the mons[] array
itself is not part of the savefile.

Window Port Interface Change

Also add a parameter to print_glyph to convey additional information beyond
the glyph to the window ports. Every single window port was calling back to
mapglyph for the information anyway, so just included it in the interface and
produce the information right in the display core.

The mapglyph() function uses will be eliminated, although there are still some
in the code yet to be dealt with.

win32, tty, x11, Qt, msdos window ports have all had adjustments done to
utilize the new parameter instead of calling mapglyph, but some of those
window ports have not been thoroughly tested since the changes.

Interface change additional info:

    print_glyph(window, x, y, glyph, bkglyph, *glyphmod)
            -- Print the glyph at (x,y) on the given window.  Glyphs are
               integers at the interface, mapped to whatever the window-
               port wants (symbol, font, color, attributes, ...there's
               a 1-1 map between glyphs and distinct things on the map).
            -- bkglyph is a background glyph for potential use by some
               graphical or tiled environments to allow the depiction
               to fall against a background consistent with the grid
               around x,y. If bkglyph is NO_GLYPH, then the parameter
               should be ignored (do nothing with it).
                -- glyphmod provides extended information about the glyph
               that window ports can use to enhance the display in
               various ways.
                    unsigned int glyphmod[NUM_GLYPHMOD]
               where:
                    glyphmod[GM_TTYCHAR]  is the text characters associated
                                          with the original NetHack display.

                    glyphmod[GM_FLAGS]    are the special flags that denote
                                          additional information that window
                                          ports can use.

                    glyphmod[GM_COLOR] is the text character
                                       color associated with the original
                                       NetHack display.

Support for including the glyphmod info in the display glyph buffer
alongside the glyph itself was added and is the default operation.
That can be turned off by defining UNBUFFERED_GLYPHMOD at compile time.
With UNBUFFERED_GLYPHMOD operation, a call will be placed to map_glyphmod()
immediately prior to every print_glyph() call.

113 files changed:
doc/fixes37.0
doc/window.doc
include/artilist.h
include/decl.h
include/display.h
include/extern.h
include/hack.h
include/mextra.h
include/monflag.h
include/monst.h
include/patchlevel.h
include/permonst.h
include/winX.h
include/wincurs.h
include/wingem.h
include/winprocs.h
include/wintty.h
include/you.h
src/apply.c
src/attrib.c
src/bones.c
src/botl.c
src/cmd.c
src/detect.c
src/display.c
src/do_name.c
src/do_wear.c
src/dog.c
src/dogmove.c
src/dokick.c
src/dothrow.c
src/eat.c
src/end.c
src/exper.c
src/explode.c
src/files.c
src/hack.c
src/insight.c
src/invent.c
src/makemon.c
src/mapglyph.c
src/mhitu.c
src/minion.c
src/mkmaze.c
src/mkroom.c
src/mon.c
src/mondata.c
src/monst.c
src/mplayer.c
src/mthrowu.c
src/muse.c
src/music.c
src/nhlobj.c
src/objnam.c
src/options.c
src/pager.c
src/pickup.c
src/polyself.c
src/potion.c
src/pray.c
src/priest.c
src/questpgr.c
src/read.c
src/restore.c
src/role.c
src/save.c
src/shk.c
src/sounds.c
src/sp_lev.c
src/steal.c
src/steed.c
src/teleport.c
src/timeout.c
src/trap.c
src/u_init.c
src/uhitm.c
src/vault.c
src/weapon.c
src/were.c
src/windows.c
src/wizard.c
src/worn.c
src/zap.c
sys/msdos/vidvesa.c
sys/msdos/vidvga.c
util/makedefs.c
win/Qt/qt_bind.cpp
win/Qt/qt_bind.h
win/Qt/qt_glyph.cpp
win/Qt/qt_glyph.h
win/Qt/qt_map.cpp
win/Qt/qt_map.h
win/Qt/qt_plsel.cpp
win/Qt/qt_stat.cpp
win/Qt/qt_win.cpp
win/Qt/qt_win.h
win/X11/winmap.c
win/X11/winstat.c
win/chain/wc_chainin.c
win/chain/wc_chainout.c
win/chain/wc_trace.c
win/curses/cursmain.c
win/curses/cursstat.c
win/share/monsters.txt
win/share/safeproc.c
win/share/tilemap.c
win/share/tiletext.c
win/shim/winshim.c
win/tty/wintty.c
win/win32/mhmap.c
win/win32/mhmsg.h
win/win32/mswproc.c
win/win32/winMS.h

index f538e48a5932145ab511265b73dfc61c9b25fa1c..d86b9d5ec0dc751b457db28ea5d1745141128d4c 100644 (file)
@@ -703,6 +703,12 @@ include an indication of monsters' health during farlook feedback (including
        a monster: "killed by {an uninjured newt,a heavily injured mumak}"
 make DOAGAIN (^A) become unconditional; commenting it out in config.h makes
        it be bound to NUL, a no-op, but allows BIND=k:repeat to set it to k
+add support for a single monster species to have distinct male, female,
+       and gender-neutral naming terms
+add support for a single monster species to have distinct male and female
+       tiles
+consolidate several monsters that differed only by their gender into their
+       single species
 
 
 Platform- and/or Interface-Specific New Features
@@ -730,6 +736,10 @@ Qt: add Filter, Layout, and Reset buttons to the extended command selector;
        mode only"; Layout redisplays the grid of command buttons, toggling
        from down columns to across rows or vice versa; Reset puts both back
        to their default settings and clears any pending typed input
+tiles: male and female variations in monsters.txt; tested only with tile2bmp
+       conversion utility so far; also supported by tilemap utility to
+       generate tile.c; some window-port modifications still required to
+       integrate the male and female tile capability into the window port
 Unix: can define NOSUSPEND in config.h or src/Makefile's CFLAGS to prevent
        unixconf.h from enabling SUSPEND without need to modify unixconf.h
 
@@ -824,5 +834,8 @@ move 'restoring' to the program_state struct; add corresponding 'saving';
 unify special attack damages from separate you-hit-monster, monster-hits-you,
        and monster-hits-monster into functions by damage type
 unify trap effects for hero and monster stepping on the trap by trap type
-
-
+replace the single permonst mname field with male, female, and gender-neutral
+       names pmnames[NUM_MGENDERS] fields
+add a new glyphmod parameter to window interface *_print_glyph() to be used
+       to provide additional details to the window port beyond the glyph;
+       begin to phase out the mapglyph() calls from within windows ports
index 1f376a5bd76012b20e4036aee488d8fe8a10e95c..bd55a5ac04504fb5dab54362603a68787440b581 100644 (file)
@@ -192,7 +192,7 @@ int nh_poskey(int *x, int *y, int *mod)
 
 B.  High-level routines:
 
-print_glyph(window, x, y, glyph, bkglyph)
+print_glyph(window, x, y, glyph, bkglyph, glyphmod[3])
                -- Print the glyph at (x,y) on the given window.  Glyphs are
                   integers at the interface, mapped to whatever the window-
                   port wants (symbol, font, color, attributes, ...there's
@@ -202,7 +202,10 @@ print_glyph(window, x, y, glyph, bkglyph)
                   to fall against a background consistent with the grid 
                   around x,y. If bkglyph is NO_GLYPH, then the parameter
                   should be ignored (do nothing with it).
-                   
+                -- glyphmod (glyphmod[NUM_GLYPHNOD]) provides extended
+                   information about the glyph that window ports can use to
+                   enhance the display in various ways.
+
 char yn_function(const char *ques, const char *choices, char default)
                -- Print a prompt made up of ques, choices and default.
                   Read a single character response that is contained in
index d3a5e7ab2da7339eabe3bd1c1837f0f81c1ae5f3..c95f417759086dd4b644ba3ebc77bb96b9e6241a 100644 (file)
@@ -180,7 +180,7 @@ static NEARDATA struct artifact artilist[] = {
 
     A("The Sceptre of Might", MACE,
       (SPFX_NOGEN | SPFX_RESTR | SPFX_INTEL | SPFX_DALIGN), 0, 0, PHYS(5, 0),
-      DFNS(AD_MAGM), NO_CARY, CONFLICT, A_LAWFUL, PM_CAVEMAN, NON_PM, 2500L,
+      DFNS(AD_MAGM), NO_CARY, CONFLICT, A_LAWFUL, PM_CAVE_DWELLER, NON_PM, 2500L,
       NO_COLOR),
 
 #if 0 /* OBSOLETE */
@@ -210,7 +210,7 @@ A("The Palantir of Westernesse",        CRYSTAL_BALL,
     A("The Mitre of Holiness", HELM_OF_BRILLIANCE,
       (SPFX_NOGEN | SPFX_RESTR | SPFX_DFLAG2 | SPFX_INTEL | SPFX_PROTECT), 0,
       M2_UNDEAD, NO_ATTK, NO_DFNS, CARY(AD_FIRE), ENERGY_BOOST, A_LAWFUL,
-      PM_PRIEST, NON_PM, 2000L, NO_COLOR),
+      PM_CLERIC, NON_PM, 2000L, NO_COLOR),
 
     A("The Longbow of Diana", BOW,
       (SPFX_NOGEN | SPFX_RESTR | SPFX_INTEL | SPFX_REFLECT), SPFX_ESP, 0,
index 71147ce18fc6a3cd0c858ff1d43b5d7efd68d78a..0a9b61ba9a683c2d7ec4db648911bedc00d866b7 100644 (file)
@@ -524,6 +524,9 @@ struct trapinfo {
 typedef struct {
     xchar gnew; /* perhaps move this bit into the rm structure. */
     int glyph;
+#ifndef UNBUFFERED_GLYPHMOD
+    unsigned glyphmod[NUM_GLYPHMOD];
+#endif
 } gbuf_entry;
 
 enum vanq_order_modes {
index 28c02becde7b239da292f30c63ddfa7c96a139b1..1c944c27672178cb40e652a28426e21bc9b3dafc 100644 (file)
@@ -475,4 +475,27 @@ enum explosion_types {
 #define glyph_is_unexplored(glyph) ((glyph) == GLYPH_UNEXPLORED)
 #define glyph_is_nothing(glyph) ((glyph) == GLYPH_NOTHING)
 
+/* flags for map_glyphmod */
+
+/* mgflags for altering map_glyphmod() internal behaviour */
+#define MG_FLAG_NORMAL      0x00
+#define MG_FLAG_NOOVERRIDE  0x01
+#define MG_FLAG_RETURNIDX   0x02
+
+/* Special mapped glyph flags encoded in glyphmod[GM_FLAGS] by map_glyphmod() */
+#define MG_CORPSE  0x0001
+#define MG_INVIS   0x0002
+#define MG_DETECT  0x0004
+#define MG_PET     0x0008
+#define MG_RIDDEN  0x0010
+#define MG_STATUE  0x0020
+#define MG_OBJPILE 0x0040  /* more than one stack of objects */
+#define MG_BW_LAVA 0x0080  /* 'black & white lava': highlight lava if it
+                              can't be distringuished from water by color */
+#define MG_BW_ICE  0x0100  /* similar for ice vs floor */
+#define MG_NOTHING 0x0200  /* char represents GLYPH_NOTHING */
+#define MG_UNEXPL  0x0400  /* char represents GLYPH_UNEXPLORED */
+#define MG_FEMALE  0x0800  /* represents a female mon,detected mon,pet,ridden */
+#define MG_BADXY   0x1000  /* bad coordinates were passed */
+
 #endif /* DISPLAY_H */
index ac8b1e72356f02d5cb71a27095199acde53a32dd..cf66dd4ffe66ba9e1953c358ca91e38d2b26a6d6 100644 (file)
@@ -374,6 +374,7 @@ E void NDECL(reglyph_darkroom);
 E void NDECL(set_wall_state);
 E void FDECL(unset_seenv, (struct rm *, int, int, int, int));
 E int FDECL(warning_of, (struct monst *));
+E void FDECL(map_glyphmod, (XCHAR_P, XCHAR_P, int, unsigned, unsigned *));
 
 /* ### do.c ### */
 
@@ -415,8 +416,8 @@ E char *FDECL(coord_desc, (int, int, char *, CHAR_P));
 E boolean FDECL(getpos_menu, (coord *, int));
 E int FDECL(getpos, (coord *, BOOLEAN_P, const char *));
 E void FDECL(getpos_sethilite, (void (*f)(int), boolean (*d)(int,int)));
-E void FDECL(new_mname, (struct monst *, int));
-E void FDECL(free_mname, (struct monst *));
+E void FDECL(new_mgivenname, (struct monst *, int));
+E void FDECL(free_mgivenname, (struct monst *));
 E void FDECL(new_oname, (struct obj *, int));
 E void FDECL(free_oname, (struct obj *));
 E const char *FDECL(safe_oname, (struct obj *));
@@ -457,6 +458,10 @@ E struct monst *FDECL(christen_orc, (struct monst *, const char *,
                                      const char *));
 E const char *FDECL(noveltitle, (int *));
 E const char *FDECL(lookup_novel, (const char *, int *));
+#ifndef PMNAME_MACROS
+E int FDECL(Mgender, (struct monst *));
+E const char *FDECL(pmname, (struct permonst *, int));
+#endif /* PMNAME_MACROS */
 
 /* ### do_wear.c ### */
 
@@ -1516,8 +1521,8 @@ E boolean FDECL(dmgtype, (struct permonst *, int));
 E int FDECL(max_passive_dmg, (struct monst *, struct monst *));
 E boolean FDECL(same_race, (struct permonst *, struct permonst *));
 E int FDECL(monsndx, (struct permonst *));
-E int FDECL(name_to_mon, (const char *));
-E int FDECL(name_to_monplus, (const char *, const char **));
+E int FDECL(name_to_mon, (const char *, int *));
+E int FDECL(name_to_monplus, (const char *, const char **, int *));
 E int FDECL(name_to_monclass, (const char *, int *));
 E int FDECL(gender, (struct monst *));
 E int FDECL(pronoun_gender, (struct monst *, unsigned));
index 0917b93c472d9d2ca78d0c8d77a9ec2945486264..aa9b571063973be53f03a80ca054cb8224ff3292 100644 (file)
@@ -79,24 +79,6 @@ enum dismount_types {
     DISMOUNT_BYCHOICE = 6
 };
 
-/* mgflags for mapglyph() */
-#define MG_FLAG_NORMAL     0x00
-#define MG_FLAG_NOOVERRIDE 0x01
-
-/* Special returns from mapglyph() */
-#define MG_CORPSE  0x0001
-#define MG_INVIS   0x0002
-#define MG_DETECT  0x0004
-#define MG_PET     0x0008
-#define MG_RIDDEN  0x0010
-#define MG_STATUE  0x0020
-#define MG_OBJPILE 0x0040  /* more than one stack of objects */
-#define MG_BW_LAVA 0x0080  /* 'black & white lava': highlight lava if it
-                              can't be distringuished from water by color */
-#define MG_BW_ICE  0x0100  /* similar for ice vs floor */
-#define MG_NOTHING 0x0200  /* char represents GLYPH_NOTHING */
-#define MG_UNEXPL  0x0400  /* char represents GLYPH_UNEXPLORED */
-
 /* sellobj_state() states */
 #define SELL_NORMAL (0)
 #define SELL_DELIBERATE (1)
@@ -216,6 +198,9 @@ typedef struct {
 #define SYM_OFF_X (SYM_OFF_W + WARNCOUNT)
 #define SYM_MAX (SYM_OFF_X + MAXOTHER)
 
+/* glyphmod entries */
+enum { GM_FLAGS, GM_TTYCHAR, GM_COLOR, NUM_GLYPHMOD };
+
 #include "rect.h"
 #include "region.h"
 #include "decl.h"
@@ -293,10 +278,12 @@ typedef struct sortloot_item Loot;
 #define MM_ASLEEP   0x002000L /* monsters should be generated asleep */
 #define MM_NOGRP    0x004000L /* suppress creation of monster groups */
 #define MM_NOTAIL   0x008000L /* if a long worm, don't give it a tail */
+#define MM_MALE     0x010000L /* male variation */
+#define MM_FEMALE   0x020000L /* female variation */
 /* if more MM_ flag masks are added, skip or renumber the GP_ one(s) */
-#define GP_ALLOW_XY 0x010000L /* [actually used by enexto() to decide whether
+#define GP_ALLOW_XY 0x040000L /* [actually used by enexto() to decide whether
                                * to make an extra call to goodpos()]        */
-#define GP_ALLOW_U  0x020000L /* don't reject hero's location */
+#define GP_ALLOW_U  0x080000L /* don't reject hero's location */
 
 /* flags for make_corpse() and mkcorpstat() */
 #define CORPSTAT_NONE 0x00
index 0ade0adf7ad77c678e527fc0efd56ac8a44f425d..cc4d715ae62b511e5521578caeab32cb80eeb9ad 100644 (file)
@@ -175,7 +175,7 @@ struct edog {
  **     mextra.h -- collection of all monster extensions
  */
 struct mextra {
-    char *mname;
+    char *mgivenname;
     struct egd *egd;
     struct epri *epri;
     struct eshk *eshk;
@@ -186,7 +186,7 @@ struct mextra {
                     * or an alignment mask for one posing as an altar */
 };
 
-#define MNAME(mon) ((mon)->mextra->mname)
+#define MGIVENNAME(mon) ((mon)->mextra->mgivenname)
 #define EGD(mon) ((mon)->mextra->egd)
 #define EPRI(mon) ((mon)->mextra->epri)
 #define ESHK(mon) ((mon)->mextra->eshk)
@@ -194,7 +194,7 @@ struct mextra {
 #define EDOG(mon) ((mon)->mextra->edog)
 #define MCORPSENM(mon) ((mon)->mextra->mcorpsenm)
 
-#define has_mname(mon) ((mon)->mextra && MNAME(mon))
+#define has_mgivenname(mon) ((mon)->mextra && MGIVENNAME(mon))
 #define has_egd(mon)   ((mon)->mextra && EGD(mon))
 #define has_epri(mon)  ((mon)->mextra && EPRI(mon))
 #define has_eshk(mon)  ((mon)->mextra && ESHK(mon))
index a243dc8a4751eacf13fc92fe0d0ef9c154a852b6..d7a1a88f5e255f9c93dcad4aae493dfb94df0d87 100644 (file)
@@ -205,6 +205,9 @@ enum ms_sounds {
 #define G_GONE          (G_GENOD | G_EXTINCT)
 #define MV_KNOWS_EGG    0x08 /* player recognizes egg of this monster type */
 
+enum mgender { MALE, FEMALE, NEUTRAL,
+               NUM_MGENDERS };
+
 /* *INDENT-ON* */
 /* clang-format on */
 #endif /* MONFLAG_H */
index 6842162ca0181b610e425ca5e7f2ea4a18ea9ee8..66f51f469fb05be27cb7414472ab132581fcce97 100644 (file)
@@ -184,7 +184,7 @@ struct monst {
 #define DEADMONSTER(mon) ((mon)->mhp < 1)
 #define is_starting_pet(mon) ((mon)->m_id == g.context.startingpet_mid)
 #define is_vampshifter(mon)                                      \
-    ((mon)->cham == PM_VAMPIRE || (mon)->cham == PM_VAMPIRE_LORD \
+    ((mon)->cham == PM_VAMPIRE || (mon)->cham == PM_VAMPIRE_LEADER \
      || (mon)->cham == PM_VLAD_THE_IMPALER)
 #define vampshifted(mon) (is_vampshifter((mon)) && !is_vampire((mon)->data))
 
@@ -220,4 +220,8 @@ struct monst {
 #define montoostrong(monindx, lev) (mons[monindx].difficulty > lev)
 #define montooweak(monindx, lev) (mons[monindx].difficulty < lev)
 
+#ifdef PMNAME_MACROS
+#define Mgender(mon) ((mon)->female ? FEMALE : MALE)
+#endif
+
 #endif /* MONST_H */
index d6969198bbe889efba6eac1f52f15ec055e50a07..a7b4c2da8a1b81e17e875b7c0070d1c052e5852c 100644 (file)
@@ -17,7 +17,7 @@
  * Incrementing EDITLEVEL can be used to force invalidation of old bones
  * and save files.
  */
-#define EDITLEVEL 29
+#define EDITLEVEL 30
 
 /*
  * Development status possibilities.
index 5125f13390bb971b3d21267286974425d88d47c1..0a017c68a18b2c644fd7c8c1746c0b1a56fdfe71 100644 (file)
@@ -40,7 +40,7 @@ struct attack {
 #include "monflag.h"
 
 struct permonst {
-    const char *mname;          /* full name */
+    const char *pmnames[NUM_MGENDERS];
     char mlet;                  /* symbol */
     schar mlevel,               /* base monster level */
         mmove,                  /* move speed */
@@ -78,4 +78,8 @@ extern NEARDATA struct permonst mons[]; /* the master list of monster types */
 /* mons[SPECIAL_PM] through mons[NUMMONS-1], inclusive, are
    never generated randomly and cannot be polymorphed into */
 
+#ifdef PMNAME_MACROS
+#define pmname(pm,g) ((((g) == MALE || (g) == FEMALE) && (pm)->pmnames[g]) \
+                        ? (pm)->pmnames[g] : (pm)->pmnames[NEUTRAL])
+#endif
 #endif /* PERMONST_H */
index 7cf1c28852106d07745047d90b7734aebafb5ed3..3f29dce758500de1fbe07c772769cef194e34dd1 100644 (file)
@@ -453,7 +453,8 @@ E void NDECL(X11_wait_synch);
 #ifdef CLIPPING
 E void FDECL(X11_cliparound, (int, int));
 #endif
-E void FDECL(X11_print_glyph, (winid, XCHAR_P, XCHAR_P, int, int));
+E void FDECL(X11_print_glyph, (winid, XCHAR_P, XCHAR_P,
+                               int, int, unsigned *));
 E void FDECL(X11_raw_print, (const char *));
 E void FDECL(X11_raw_print_bold, (const char *));
 E int NDECL(X11_nhgetch);
index 4e5ce4e78645b548e054748f5e780d65b840d80c..001c813e686659e896d3ee1056ee337425434819 100644 (file)
@@ -90,7 +90,7 @@ extern void curses_mark_synch(void);
 extern void curses_wait_synch(void);
 extern void curses_cliparound(int x, int y);
 extern void curses_print_glyph(winid wid, XCHAR_P x, XCHAR_P y,
-                               int glyph, int bkglyph);
+                               int glyph, int bkglyph, unsigned *glyphmod);
 extern void curses_raw_print(const char *str);
 extern void curses_raw_print_bold(const char *str);
 extern int curses_nhgetch(void);
index 6a0a517f79e701275ac3411a9961f9efaaea14cd..f433e1cc6824f1f3526e20387db119a6d1543f33 100644 (file)
@@ -84,7 +84,8 @@ E void FDECL(Gem_cliparound, (int, int));
 #ifdef POSITIONBAR
 E void FDECL(Gem_update_positionbar, (char *));
 #endif
-E void FDECL(Gem_print_glyph, (winid, XCHAR_P, XCHAR_P, int, int));
+E void FDECL(Gem_print_glyph, (winid, XCHAR_P, XCHAR_P,
+                                int, int, unsigned *));
 E void FDECL(Gem_raw_print, (const char *));
 E void FDECL(Gem_raw_print_bold, (const char *));
 E int NDECL(Gem_nhgetch);
index fa6652c051c591fd765de8333ad2414fba4d9418..728e35067ae4f2ac78b8b3c49c7359dfe3177721 100644 (file)
@@ -45,7 +45,8 @@ struct window_procs {
 #ifdef POSITIONBAR
     void FDECL((*win_update_positionbar), (char *));
 #endif
-    void FDECL((*win_print_glyph), (winid, XCHAR_P, XCHAR_P, int, int));
+    void FDECL((*win_print_glyph), (winid, XCHAR_P, XCHAR_P,
+                                    int, int, unsigned *));
     void FDECL((*win_raw_print), (const char *));
     void FDECL((*win_raw_print_bold), (const char *));
     int NDECL((*win_nhgetch));
@@ -345,7 +346,8 @@ struct chain_procs {
 #ifdef POSITIONBAR
     void FDECL((*win_update_positionbar), (CARGS, char *));
 #endif
-    void FDECL((*win_print_glyph), (CARGS, winid, XCHAR_P, XCHAR_P, int, int));
+    void FDECL((*win_print_glyph), (CARGS, winid, XCHAR_P, XCHAR_P,
+                                    int, int, unsigned *));
     void FDECL((*win_raw_print), (CARGS, const char *));
     void FDECL((*win_raw_print_bold), (CARGS, const char *));
     int FDECL((*win_nhgetch), (CARGS));
@@ -420,7 +422,8 @@ extern void FDECL(safe_cliparound, (int, int));
 #ifdef POSITIONBAR
 extern void FDECL(safe_update_positionbar, (char *));
 #endif
-extern void FDECL(safe_print_glyph, (winid, XCHAR_P, XCHAR_P, int, int));
+extern void FDECL(safe_print_glyph, (winid, XCHAR_P, XCHAR_P,
+                                     int, int, unsigned *));
 extern void FDECL(safe_raw_print, (const char *));
 extern void FDECL(safe_raw_print_bold, (const char *));
 extern int NDECL(safe_nhgetch);
index 2d0b05fd2a350b237e50fb385db4f4e0a5166f95..5d1d444d06dd3e529046e83b4033ea4aa24032cb 100644 (file)
@@ -211,7 +211,7 @@ E void FDECL(tty_cliparound, (int, int));
 #ifdef POSITIONBAR
 E void FDECL(tty_update_positionbar, (char *));
 #endif
-E void FDECL(tty_print_glyph, (winid, XCHAR_P, XCHAR_P, int, int));
+E void FDECL(tty_print_glyph, (winid, XCHAR_P, XCHAR_P, int, int, unsigned *));
 E void FDECL(tty_raw_print, (const char *));
 E void FDECL(tty_raw_print_bold, (const char *));
 E int NDECL(tty_nhgetch);
index 0d9686f88be328d186266a2fe86e1f87dbe5e825..79d3737ff9f75f6a1fe94a867a4f992bb4c13042 100644 (file)
@@ -479,5 +479,6 @@ struct you {
 }; /* end of `struct you' */
 
 #define Upolyd (u.umonnum != u.umonster)
+#define Ugender ((Upolyd ? u.mfemale : flags.female) ? 1 : 0)
 
 #endif /* YOU_H */
index daa2b9c4bed07c0288a2205c2baf1326aa624320..737836f156f360fb999ab96b02ee05cc1ab7e62d 100644 (file)
@@ -272,7 +272,7 @@ int rx, ry, *resp;
                     humanoid(mptr) ? "person" : "creature");
             what = buf;
         } else {
-            what = mptr->mname;
+            what = pmname(mptr, NEUTRAL);
             if (!type_is_pname(mptr))
                 what = The(what);
         }
@@ -408,7 +408,7 @@ register struct obj *obj;
                               || odummy->otyp == LENSES);
                 break;
             case M_AP_MONSTER: /* ignore Hallucination here */
-                what = mons[mtmp->mappearance].mname;
+                what = pmname(&mons[mtmp->mappearance], Mgender(mtmp));
                 break;
             case M_AP_FURNITURE:
                 what = defsyms[mtmp->mappearance].explanation;
@@ -904,7 +904,7 @@ struct obj *obj;
             } else if (u.uhs >= WEAK) {
                 You(look_str, "undernourished");
             } else if (Upolyd) {
-                You("look like %s.", an(mons[u.umonnum].mname));
+                You("look like %s.", an(pmname(&mons[u.umonnum], Ugender)));
             } else {
                 You("look as %s as ever.", uvisage);
             }
@@ -985,8 +985,8 @@ struct obj *obj;
         if (vis)
             pline("%s confuses itself!", Monnam(mtmp));
         mtmp->mconf = 1;
-    } else if (monable && (mlet == S_NYMPH || mtmp->data == &mons[PM_SUCCUBUS]
-                           || mtmp->data == &mons[PM_INCUBUS])) {
+    } else if (monable &&
+               (mlet == S_NYMPH || mtmp->data == &mons[PM_AMOROUS_DEMON])) {
         if (vis) {
             char buf[BUFSZ]; /* "She" or "He" */
 
@@ -1951,12 +1951,12 @@ struct obj *obj;
 
         if (poly_when_stoned(g.youmonst.data))
             You("tin %s without wearing gloves.",
-                an(mons[corpse->corpsenm].mname));
+                an(mons[corpse->corpsenm].pmnames[NEUTRAL]));
         else {
             pline("Tinning %s without wearing gloves is a fatal mistake...",
-                  an(mons[corpse->corpsenm].mname));
+                  an(mons[corpse->corpsenm].pmnames[NEUTRAL]));
             Sprintf(kbuf, "trying to tin %s without gloves",
-                    an(mons[corpse->corpsenm].mname));
+                    an(mons[corpse->corpsenm].pmnames[NEUTRAL]));
         }
         instapetrify(kbuf);
     }
@@ -2895,7 +2895,7 @@ struct obj *obj;
                         char kbuf[BUFSZ];
 
                         Sprintf(kbuf, "%s corpse",
-                                an(mons[otmp->corpsenm].mname));
+                                an(mons[otmp->corpsenm].pmnames[NEUTRAL]));
                         pline("Snatching %s is a fatal mistake.", kbuf);
                         instapetrify(kbuf);
                     }
index 551992bf725e58d5cfa82e8e7f5d9f4968a0d21d..759296702c91b8c96e43888bd32d8d104e442379 100644 (file)
@@ -298,7 +298,7 @@ boolean thrown_weapon; /* thrown weapons are less deadly */
     }
 
     /* suppress killer prefix if it already has one */
-    i = name_to_mon(pkiller);
+    i = name_to_mon(pkiller, (int *) 0);
     if (i >= LOW_PM && (mons[i].geno & G_UNIQ)) {
         kprefix = KILLED_BY;
         if (!type_is_pname(&mons[i]))
@@ -709,11 +709,11 @@ int r;
     } roleabils[] = {
         { PM_ARCHEOLOGIST, arc_abil },
         { PM_BARBARIAN, bar_abil },
-        { PM_CAVEMAN, cav_abil },
+        { PM_CAVE_DWELLER, cav_abil },
         { PM_HEALER, hea_abil },
         { PM_KNIGHT, kni_abil },
         { PM_MONK, mon_abil },
-        { PM_PRIEST, pri_abil },
+        { PM_CLERIC, pri_abil },
         { PM_RANGER, ran_abil },
         { PM_ROGUE, rog_abil },
         { PM_SAMURAI, sam_abil },
@@ -1054,8 +1054,8 @@ int x;
 #endif
     } else if (x == A_CHA) {
         if (tmp < 18
-            && (g.youmonst.data->mlet == S_NYMPH || u.umonnum == PM_SUCCUBUS
-                || u.umonnum == PM_INCUBUS))
+            && (g.youmonst.data->mlet == S_NYMPH
+                || u.umonnum == PM_AMOROUS_DEMON))
             return (schar) 18;
     } else if (x == A_CON) {
         if (uwep && uwep->oartifact == ART_OGRESMASHER)
index ca5a818ccc096dd1c2a1a68bf69d1fe07b2dc1de..93c23b962f9301101ef233c695ebfbc02fd48085 100644 (file)
@@ -617,12 +617,12 @@ getbones()
              * set to the magic DEFUNCT_MONSTER cookie value.
              */
             for (mtmp = fmon; mtmp; mtmp = mtmp->nmon) {
-                if (has_mname(mtmp))
-                    sanitize_name(MNAME(mtmp));
+                if (has_mgivenname(mtmp))
+                    sanitize_name(MGIVENNAME(mtmp));
                 if (mtmp->mhpmax == DEFUNCT_MONSTER) {
                     if (wizard) {
                         debugpline1("Removing defunct monster %s from bones.",
-                                    mtmp->data->mname);
+                                    mtmp->data->pmnames[NEUTRAL]);
                     }
                     mongone(mtmp);
                 } else
index 23dd6906cfcf623c577f53f08b76ff378608a344..ab225740c45e6889961c7b8f543833b9f49be0e7 100644 (file)
@@ -67,7 +67,7 @@ do_statusline1()
         char mbot[BUFSZ];
         int k = 0;
 
-        Strcpy(mbot, mons[u.umonnum].mname);
+        Strcpy(mbot, pmname(&mons[u.umonnum], Ugender));
         while (mbot[k] != 0) {
             if ((k == 0 || (k > 0 && mbot[k - 1] == ' ')) && 'a' <= mbot[k]
                 && mbot[k] <= 'z')
@@ -719,7 +719,7 @@ bot_via_windowport()
      */
     Strcpy(nb = buf, g.plname);
     nb[0] = highc(nb[0]);
-    titl = !Upolyd ? rank() : mons[u.umonnum].mname;
+    titl = !Upolyd ? rank() : pmname(&mons[u.umonnum], Ugender);
     i = (int) (strlen(buf) + sizeof " the " + strlen(titl) - sizeof "");
     /* if "Name the Rank/monster" is too long, we truncate the name
        but always keep at least 10 characters of it; when hitpintbar is
index 493a10faa12cf67426b30af0352697044fa5020b..0ae12b0dba65fcbda01155895bfa60d33a70e333 100644 (file)
--- a/src/cmd.c
+++ b/src/cmd.c
@@ -2623,8 +2623,8 @@ boolean incl_wsegs;
 
     if (mtmp->mextra) {
         sz += (int) sizeof (struct mextra);
-        if (MNAME(mtmp))
-            sz += (int) strlen(MNAME(mtmp)) + 1;
+        if (MGIVENNAME(mtmp))
+            sz += (int) strlen(MGIVENNAME(mtmp)) + 1;
         if (EGD(mtmp))
             sz += (int) sizeof (struct egd);
         if (EPRI(mtmp))
@@ -4241,7 +4241,7 @@ boolean doit;
 #if 0
     if (Upolyd) { /* before objects */
         Sprintf(buf, "Use %s special ability",
-                s_suffix(mons[u.umonnum].mname));
+                s_suffix(pmname(&mons[u.umonnum], Ugender)));
         add_herecmd_menuitem(win, domonability, buf);
     }
 #endif
index ddf52e59f05854b3b39a24f347d9afa04e6369a3..db5e84895674b79995cc08cd659d3208222a80ed 100644 (file)
@@ -2005,12 +2005,13 @@ dump_map()
         blankrow = TRUE; /* assume blank until we discover otherwise */
         lastnonblank = -1; /* buf[] index rather than map's x */
         for (x = 1; x < COLNO; x++) {
-            int ch, color;
-            unsigned special;
+            int ch;
+            unsigned glyphmod[NUM_GLYPHMOD];
 
             glyph = reveal_terrain_getglyph(x, y, FALSE, u.uswallow,
                                             default_glyph, subset);
-            (void) mapglyph(glyph, &ch, &color, &special, x, y, 0);
+            map_glyphmod(x, y, glyph, 0, glyphmod);
+            ch = (int) glyphmod[GM_TTYCHAR];
             buf[x - 1] = ch;
             if (ch != ' ') {
                 blankrow = FALSE;
index 1e0ac89e702462bf541ea38f1164091c5f927a3a..8a98c8f556ad1c5bed8fc9a68acb5e923e0e557b 100644 (file)
@@ -132,6 +132,9 @@ static void FDECL(display_warning, (struct monst *));
 static int FDECL(check_pos, (int, int, int));
 static int FDECL(get_bk_glyph, (XCHAR_P, XCHAR_P));
 static int FDECL(tether_glyph, (int, int));
+#ifdef UNBUFFERED_GLYPHMOD
+static unsigned *FDECL(glyphmod_at, (XCHAR_P, XCHAR_P, int));
+#endif
 
 /*#define WA_VERBOSE*/ /* give (x,y) locations for all "bad" spots */
 #ifdef WA_VERBOSE
@@ -1367,6 +1370,17 @@ see_traps()
     }
 }
 
+static unsigned no_gm[NUM_GLYPHMOD] =
+            {MG_BADXY, (unsigned) ' ', (unsigned) NO_COLOR};
+#ifndef UNBUFFERED_GLYPHMOD
+#define Glyphmod_at(x,y,glyph) (                                               \
+                      ((x) < 0 || (y) < 0 || (x) >= COLNO || (y) >= ROWNO)     \
+                          ? &no_gm[0] : &g.gbuf[(y)][(x)].glyphmod[0])
+#else
+static unsigned gm[NUM_GLYPHMOD];
+#define Glyphmod_at(x,y,glyph) glyphmod_at(x, y, glyph)
+#endif
+
 /*
  * Put the cursor on the hero.  Flush all accumulated glyphs before doing it.
  */
@@ -1462,7 +1476,8 @@ redraw_map()
     for (y = 0; y < ROWNO; ++y)
         for (x = 1; x < COLNO; ++x) {
             glyph = glyph_at(x, y); /* not levl[x][y].glyph */
-            print_glyph(WIN_MAP, x, y, glyph, get_bk_glyph(x, y));
+            print_glyph(WIN_MAP, x, y, glyph, get_bk_glyph(x, y),
+                        Glyphmod_at(x, y, glyph));
         }
     flush_screen(1);
 }
@@ -1524,6 +1539,10 @@ void
 show_glyph(x, y, glyph)
 int x, y, glyph;
 {
+#ifndef UNBUFFERED_GLYPHMOD
+    unsigned glyphmod[NUM_GLYPHMOD];
+#endif
+
     /*
      * Check for bad positions and glyphs.
      */
@@ -1578,7 +1597,6 @@ int x, y, glyph;
             text = "monster";
             offset = glyph;
         }
-
         impossible("show_glyph:  bad pos %d %d with glyph %d [%s %d].", x, y,
                    glyph, text, offset);
         return;
@@ -1589,10 +1607,27 @@ int x, y, glyph;
                    MAX_GLYPH, x, y);
         return;
     }
+#ifndef UNBUFFERED_GLYPHMOD
+    /* without UNBUFFERED_GLYPHMOD defined the glyphmod values are buffered
+       alongside the glyphs themselves for better performance, increased
+       buffer size */
+    map_glyphmod(x, y, glyph, 0, glyphmod);
+#endif
 
-    if (g.gbuf[y][x].glyph != glyph || iflags.use_background_glyph) {
+    if (g.gbuf[y][x].glyph != glyph
+#ifndef UNBUFFERED_GLYPHMOD
+           /* I don't think we have to test for changes in TTYCHAR or COLOR
+              because they typically only change if the glyph changed */
+            || g.gbuf[y][x].glyphmod[GM_FLAGS] != glyphmod[GM_FLAGS]
+#endif
+            || iflags.use_background_glyph ) {
         g.gbuf[y][x].glyph = glyph;
         g.gbuf[y][x].gnew = 1;
+#ifndef UNBUFFERED_GLYPHMOD
+        g.gbuf[y][x].glyphmod[GM_FLAGS] = glyphmod[GM_FLAGS];
+        g.gbuf[y][x].glyphmod[GM_TTYCHAR] = glyphmod[GM_TTYCHAR];
+        g.gbuf[y][x].glyphmod[GM_COLOR] = glyphmod[GM_COLOR];
+#endif
         if (g.gbuf_start[y] > x)
             g.gbuf_start[y] = x;
         if (g.gbuf_stop[y] < x)
@@ -1614,6 +1649,14 @@ int x, y, glyph;
         }                                \
     }
 
+static gbuf_entry nul_gbuf = {
+        0,                      /* gnew */
+        GLYPH_UNEXPLORED,       /* glyph */
+#ifndef UNBUFFERED_GLYPHMOD
+        {(unsigned) ' ', (unsigned) NO_COLOR, MG_UNEXPL},
+#endif
+};
+
 /*
  * Turn the 3rd screen into UNEXPLORED that needs to be refreshed.
  */
@@ -1621,15 +1664,25 @@ void
 clear_glyph_buffer()
 {
     register int x, y;
-    register gbuf_entry *gptr, nul_gbuf;
-    int ch = ' ', color = NO_COLOR;
-    unsigned special = 0;
-
-    (void) mapglyph(GLYPH_UNEXPLORED, &ch, &color, &special, 0, 0, 0);
-    nul_gbuf.gnew = (ch != ' ' || color != NO_COLOR
-                     || (special & ~MG_UNEXPL) != 0) ? 1 : 0;
-    nul_gbuf.glyph = GLYPH_UNEXPLORED;
+    gbuf_entry *gptr = &g.gbuf[0][0];
+    unsigned *gmptr =
+#ifndef UNBUFFERED_GLYPHMOD
+                        &gptr->glyphmod[0];
+#else
+                        &gm[0];
 
+    map_glyphmod(0, 0, GLYPH_UNEXPLORED, 0, gmptr);
+#endif
+#ifndef UNBUFFERED_GLYPHMOD
+    nul_gbuf.gnew = (gmptr[GM_TTYCHAR] != nul_gbuf.glyphmod[GM_TTYCHAR]
+                     || gmptr[GM_COLOR] != nul_gbuf.glyphmod[GM_COLOR]
+                     || gmptr[GM_FLAGS] != nul_gbuf.glyphmod[GM_FLAGS])
+#else
+    nul_gbuf.gnew = (gmptr[GM_TTYCHAR] != ' '
+                     || gmptr[GM_COLOR] != NO_COLOR
+                     || (gmptr[GM_FLAGS] & ~MG_UNEXPL) != 0)
+#endif
+                         ? 1 : 0;
     for (y = 0; y < ROWNO; y++) {
         gptr = &g.gbuf[y][0];
         for (x = COLNO; x; x--) {
@@ -1648,16 +1701,31 @@ int start, stop, y;
 {
     register int x, glyph;
     register boolean force;
-    int ch = ' ', color = NO_COLOR;
-    unsigned special = 0;
-
-    (void) mapglyph(GLYPH_UNEXPLORED, &ch, &color, &special, 0, 0, 0);
-    force = (ch != ' ' || color != NO_COLOR || (special & ~MG_UNEXPL) != 0);
+    gbuf_entry *gptr = &g.gbuf[0][0];
+    unsigned *gmptr =
+#ifndef UNBUFFERED_GLYPHMOD
+                        &gptr->glyphmod[0];
+#else
+                        &gm[0];
 
+    map_glyphmod(0, 0, GLYPH_UNEXPLORED, 0, gmptr);
+#endif
+#ifndef UNBUFFERED_GLYPHMOD
+    force = (gmptr[GM_TTYCHAR] != nul_gbuf.glyphmod[GM_TTYCHAR]
+                 || gmptr[GM_COLOR] != nul_gbuf.glyphmod[GM_COLOR]
+                 || gmptr[GM_FLAGS] != nul_gbuf.glyphmod[GM_FLAGS])
+#else
+    force = (gmptr[GM_TTYCHAR] != ' '
+                 || gmptr[GM_COLOR] != NO_COLOR
+                 || (gmptr[GM_FLAGS] & ~MG_UNEXPL) != 0)
+#endif
+                 ? 1 : 0;
     for (x = start; x <= stop; x++) {
-        glyph = g.gbuf[y][x].glyph;
+        gptr = &g.gbuf[y][x];
+        glyph = gptr->glyph;
         if (force || glyph != GLYPH_UNEXPLORED)
-            print_glyph(WIN_MAP, x, y, glyph, get_bk_glyph(x, y));
+            print_glyph(WIN_MAP, x, y, glyph,
+                        get_bk_glyph(x, y), Glyphmod_at(x, y, glyph));
     }
 }
 
@@ -1712,7 +1780,8 @@ int cursor_on_u;
 
         for (; x <= g.gbuf_stop[y]; gptr++, x++)
             if (gptr->gnew) {
-                print_glyph(WIN_MAP, x, y, gptr->glyph, get_bk_glyph(x, y));
+                print_glyph(WIN_MAP, x, y, gptr->glyph,
+                            get_bk_glyph(x, y), Glyphmod_at(x, y, gptr->glyph));
                 gptr->gnew = 0;
             }
     }
@@ -1930,6 +1999,17 @@ xchar x, y;
     return g.gbuf[y][x].glyph;
 }
 
+#ifdef UNBUFFERED_GLYPHMOD
+unsigned *
+glyphmod_at(x, y, glyph)
+xchar x, y;
+int glyph;
+{
+    map_glyphmod(x, y, glyph, 0, gm);
+    return &gm[0];
+}
+#endif
+
 /*
  * This will be used to get the glyph for the background so that
  * it can potentially be merged into graphical window ports to
@@ -2002,6 +2082,361 @@ xchar x, y;
     return bkglyph;
 }
 
+#define HI_DOMESTIC CLR_WHITE /* monst.c */
+#ifdef TEXTCOLOR
+static const int explcolors[] = {
+    CLR_BLACK,   /* dark    */
+    CLR_GREEN,   /* noxious */
+    CLR_BROWN,   /* muddy   */
+    CLR_BLUE,    /* wet     */
+    CLR_MAGENTA, /* magical */
+    CLR_ORANGE,  /* fiery   */
+    CLR_WHITE,   /* frosty  */
+};
+
+#define zap_color(n) color = iflags.use_color ? zapcolors[n] : NO_COLOR
+#define cmap_color(n) color = iflags.use_color ? defsyms[n].color : NO_COLOR
+#define obj_color(n) color = iflags.use_color ? objects[n].oc_color : NO_COLOR
+#define mon_color(n) color = iflags.use_color ? mons[n].mcolor : NO_COLOR
+#define invis_color(n) color = NO_COLOR
+#define pet_color(n) color = iflags.use_color ? mons[n].mcolor : NO_COLOR
+#define warn_color(n) \
+    color = iflags.use_color ? def_warnsyms[n].color : NO_COLOR
+#define explode_color(n) color = iflags.use_color ? explcolors[n] : NO_COLOR
+
+#else /* no text color */
+
+#define zap_color(n)
+#define cmap_color(n)
+#define obj_color(n)
+#define mon_color(n)
+#define invis_color(n)
+#define pet_color(c)
+#define warn_color(n)
+#define explode_color(n)
+#endif
+
+#if defined(USE_TILES) && defined(MSDOS)
+#define HAS_ROGUE_IBM_GRAPHICS \
+    (g.currentgraphics == ROGUESET && SYMHANDLING(H_IBM) && !iflags.grmode)
+#else
+#define HAS_ROGUE_IBM_GRAPHICS \
+    (g.currentgraphics == ROGUESET && SYMHANDLING(H_IBM))
+#endif
+
+#define is_objpile(x,y) (!Hallucination && g.level.objects[(x)][(y)] \
+                         && g.level.objects[(x)][(y)]->nexthere)
+
+#define GMAP_SET                 0x00000001
+#define GMAP_ROGUELEVEL          0x00000002
+#define GMAP_ALTARCOLOR          0x00000004
+
+void
+map_glyphmod(x, y, glyph, mgflags, glyphmod)
+xchar x, y;
+int glyph;
+unsigned mgflags, *glyphmod;
+{
+    register int offset, idx;
+    int color = NO_COLOR;
+    unsigned special = 0;
+    struct obj *obj;        /* only used for STATUE */
+
+    /* condense multiple tests in macro version down to single */
+    boolean has_rogue_ibm_graphics = HAS_ROGUE_IBM_GRAPHICS,
+            is_you = (x == u.ux && y == u.uy),
+            has_rogue_color = (has_rogue_ibm_graphics
+                               && g.symset[g.currentgraphics].nocolor == 0),
+            do_mon_checks = FALSE;
+
+    if (x < 0 || y < 0 || x >= COLNO || y >= ROWNO) {
+        glyphmod[GM_FLAGS] = MG_BADXY;
+        glyphmod[GM_COLOR] = NO_COLOR;
+        glyphmod[GM_TTYCHAR] = ' ';
+        return;
+    }
+
+    if (!g.glyphmap_perlevel_flags) {
+        /*
+         *    GMAP_SET                0x00000001
+         *    GMAP_ROGUELEVEL         0x00000002
+         *    GMAP_ALTARCOLOR         0x00000004
+         */
+        g.glyphmap_perlevel_flags |= GMAP_SET;
+
+        if (Is_rogue_level(&u.uz)) {
+            g.glyphmap_perlevel_flags |= GMAP_ROGUELEVEL;
+        } else if ((Is_astralevel(&u.uz) || Is_sanctum(&u.uz))) {
+            g.glyphmap_perlevel_flags |= GMAP_ALTARCOLOR;
+        }
+    }
+
+    /*
+     *  Map the glyph to a character and color.
+     *
+     *  Warning:  For speed, this makes an assumption on the order of
+     *            offsets.  The order is set in display.h.
+     */
+    if ((offset = (glyph - GLYPH_NOTHING_OFF)) >= 0) {
+        idx = SYM_NOTHING + SYM_OFF_X;
+        color = NO_COLOR;
+        special |= MG_NOTHING;
+    } else if ((offset = (glyph - GLYPH_UNEXPLORED_OFF)) >= 0) {
+        idx = SYM_UNEXPLORED + SYM_OFF_X;
+        color = NO_COLOR;
+        special |= MG_UNEXPL;
+    } else if ((offset = (glyph - GLYPH_STATUE_OFF)) >= 0) { /* a statue */
+        idx = mons[offset].mlet + SYM_OFF_M;
+        if (has_rogue_color)
+            color = CLR_RED;
+        else
+            obj_color(STATUE);
+        special |= MG_STATUE;
+        if (is_objpile(x,y))
+            special |= MG_OBJPILE;
+        if ((obj = sobj_at(STATUE, x, y)) && (obj->spe & STATUE_FEMALE))
+            special |= MG_FEMALE;
+    } else if ((offset = (glyph - GLYPH_WARNING_OFF)) >= 0) { /* warn flash */
+        idx = offset + SYM_OFF_W;
+        if (has_rogue_color)
+            color = NO_COLOR;
+        else
+            warn_color(offset);
+    } else if ((offset = (glyph - GLYPH_SWALLOW_OFF)) >= 0) { /* swallow */
+        /* see swallow_to_glyph() in display.c */
+        idx = (S_sw_tl + (offset & 0x7)) + SYM_OFF_P;
+        if (has_rogue_color && iflags.use_color)
+            color = NO_COLOR;
+        else
+            mon_color(offset >> 3);
+    } else if ((offset = (glyph - GLYPH_ZAP_OFF)) >= 0) { /* zap beam */
+        /* see zapdir_to_glyph() in display.c */
+        idx = (S_vbeam + (offset & 0x3)) + SYM_OFF_P;
+        if (has_rogue_color && iflags.use_color)
+            color = NO_COLOR;
+        else
+            zap_color((offset >> 2));
+    } else if ((offset = (glyph - GLYPH_EXPLODE_OFF)) >= 0) { /* explosion */
+        idx = ((offset % MAXEXPCHARS) + S_explode1) + SYM_OFF_P;
+        explode_color(offset / MAXEXPCHARS);
+    } else if ((offset = (glyph - GLYPH_CMAP_OFF)) >= 0) { /* cmap */
+        idx = offset + SYM_OFF_P;
+        if (has_rogue_color && iflags.use_color) {
+            if (offset >= S_vwall && offset <= S_hcdoor)
+                color = CLR_BROWN;
+            else if (offset >= S_arrow_trap && offset <= S_polymorph_trap)
+                color = CLR_MAGENTA;
+            else if (offset == S_corr || offset == S_litcorr)
+                color = CLR_GRAY;
+            else if (offset >= S_room && offset <= S_water
+                     && offset != S_darkroom)
+                color = CLR_GREEN;
+            else
+                color = NO_COLOR;
+#ifdef TEXTCOLOR
+        /* provide a visible difference if normal and lit corridor
+           use the same symbol */
+        } else if (iflags.use_color && offset == S_litcorr
+                   && g.showsyms[idx] == g.showsyms[S_corr + SYM_OFF_P]) {
+            color = CLR_WHITE;
+#endif
+        /* try to provide a visible difference between water and lava
+           if they use the same symbol and color is disabled */
+        } else if (!iflags.use_color && offset == S_lava
+                   && (g.showsyms[idx] == g.showsyms[S_pool + SYM_OFF_P]
+                       || g.showsyms[idx]
+                          == g.showsyms[S_water + SYM_OFF_P])) {
+            special |= MG_BW_LAVA;
+        /* similar for floor [what about empty doorway?] and ice */
+        } else if (!iflags.use_color && offset == S_ice
+                   && (g.showsyms[idx] == g.showsyms[S_room + SYM_OFF_P]
+                       || g.showsyms[idx]
+                          == g.showsyms[S_darkroom + SYM_OFF_P])) {
+            special |= MG_BW_ICE;
+        } else if (offset == S_altar && iflags.use_color) {
+            int amsk = altarmask_at(x, y); /* might be a mimic */
+
+            if ((g.glyphmap_perlevel_flags & GMAP_ALTARCOLOR)
+                && (amsk & AM_SHRINE) != 0) {
+                /* high altar */
+                color = CLR_BRIGHT_MAGENTA;
+            } else {
+                switch (amsk & AM_MASK) {
+#if 0   /*
+         * On OSX with TERM=xterm-color256 these render as
+         *  white -> tty: gray, curses: ok
+         *  gray  -> both tty and curses: black
+         *  black -> both tty and curses: blue
+         *  red   -> both tty and curses: ok.
+         * Since the colors have specific associations (with the
+         * unicorns matched with each alignment), we shouldn't use
+         * scrambled colors and we don't have sufficient information
+         * to handle platform-specific color variations.
+         */
+                case AM_LAWFUL:  /* 4 */
+                    color = CLR_WHITE;
+                    break;
+                case AM_NEUTRAL: /* 2 */
+                    color = CLR_GRAY;
+                    break;
+                case AM_CHAOTIC: /* 1 */
+                    color = CLR_BLACK;
+                    break;
+#else /* !0: TEMP? */
+                case AM_LAWFUL:  /* 4 */
+                case AM_NEUTRAL: /* 2 */
+                case AM_CHAOTIC: /* 1 */
+                    cmap_color(S_altar); /* gray */
+                    break;
+#endif /* 0 */
+                case AM_NONE:    /* 0 */
+                    color = CLR_RED;
+                    break;
+                default: /* 3, 5..7 -- shouldn't happen but 3 was possible
+                          * prior to 3.6.3 (due to faulty sink polymorph) */
+                    color = NO_COLOR;
+                    break;
+                }
+            }
+        } else {
+            cmap_color(offset);
+        }
+    } else if ((offset = (glyph - GLYPH_OBJ_OFF)) >= 0) { /* object */
+        idx = objects[offset].oc_class + SYM_OFF_O;
+        if (offset == BOULDER)
+            idx = SYM_BOULDER + SYM_OFF_X;
+        if (has_rogue_color && iflags.use_color) {
+            switch (objects[offset].oc_class) {
+            case COIN_CLASS:
+                color = CLR_YELLOW;
+                break;
+            case FOOD_CLASS:
+                color = CLR_RED;
+                break;
+            default:
+                color = CLR_BRIGHT_BLUE;
+                break;
+            }
+        } else
+            obj_color(offset);
+        if (offset != BOULDER && is_objpile(x,y))
+            special |= MG_OBJPILE;
+    } else if ((offset = (glyph - GLYPH_RIDDEN_OFF)) >= 0) { /* mon ridden */
+        idx = mons[offset].mlet + SYM_OFF_M;
+        if (has_rogue_color)
+            /* This currently implies that the hero is here -- monsters */
+            /* don't ride (yet...).  Should we set it to yellow like in */
+            /* the monster case below?  There is no equivalent in rogue. */
+            color = NO_COLOR; /* no need to check iflags.use_color */
+        else
+            mon_color(offset);
+        special |= MG_RIDDEN;
+        do_mon_checks = TRUE;
+    } else if ((offset = (glyph - GLYPH_BODY_OFF)) >= 0) { /* a corpse */
+        idx = objects[CORPSE].oc_class + SYM_OFF_O;
+        if (has_rogue_color && iflags.use_color)
+            color = CLR_RED;
+        else
+            mon_color(offset);
+        special |= MG_CORPSE;
+        if (is_objpile(x,y))
+            special |= MG_OBJPILE;
+    } else if ((offset = (glyph - GLYPH_DETECT_OFF)) >= 0) { /* mon detect */
+        idx = mons[offset].mlet + SYM_OFF_M;
+        if (has_rogue_color)
+            color = NO_COLOR; /* no need to check iflags.use_color */
+        else
+            mon_color(offset);
+        /* Disabled for now; anyone want to get reverse video to work? */
+        /* is_reverse = TRUE; */
+        special |= MG_DETECT;
+        do_mon_checks = TRUE;
+    } else if ((offset = (glyph - GLYPH_INVIS_OFF)) >= 0) { /* invisible */
+        idx = SYM_INVISIBLE + SYM_OFF_X;
+        if (has_rogue_color)
+            color = NO_COLOR; /* no need to check iflags.use_color */
+        else
+            invis_color(offset);
+        special |= MG_INVIS;
+    } else if ((offset = (glyph - GLYPH_PET_OFF)) >= 0) { /* a pet */
+        idx = mons[offset].mlet + SYM_OFF_M;
+        if (has_rogue_color)
+            color = NO_COLOR; /* no need to check iflags.use_color */
+        else
+            pet_color(offset);
+        special |= MG_PET;
+        do_mon_checks = TRUE;
+    } else { /* a monster */
+        idx = mons[glyph].mlet + SYM_OFF_M;
+        if (has_rogue_color && iflags.use_color) {
+            if (is_you)
+                /* actually player should be yellow-on-gray if in corridor */
+                color = CLR_YELLOW;
+            else
+                color = NO_COLOR;
+        } else {
+            mon_color(glyph);
+#ifdef TEXTCOLOR
+            /* special case the hero for `showrace' option */
+            if (iflags.use_color && is_you && flags.showrace && !Upolyd)
+                color = HI_DOMESTIC;
+#endif
+        }
+        do_mon_checks = TRUE;
+    }
+
+    if (do_mon_checks) {
+        struct monst *m;
+
+        if (is_you) {
+            if (Ugender == FEMALE)
+                special |= MG_FEMALE;
+        } else {
+            /* when hero is riding, steed will be shown at hero's location
+               but has not been placed on the map so m_at() won't find it */
+            m = (x == u.ux && y == u.uy && u.usteed) ? u.usteed : m_at(x, y);
+            if (m) {
+                if (!Hallucination) {
+                    if (m->female)
+                        special |= MG_FEMALE;
+                } else if (rn2_on_display_rng(2)) {
+                        special |= MG_FEMALE;
+                }
+            }
+        }
+    }
+    /* These were requested by a blind player to enhance screen reader use */
+    if (sysopt.accessibility == 1 && !(mgflags & MG_FLAG_NOOVERRIDE)) {
+        int ovidx;
+
+        if ((special & MG_PET) != 0) {
+            ovidx = SYM_PET_OVERRIDE + SYM_OFF_X;
+            if ((g.glyphmap_perlevel_flags & GMAP_ROGUELEVEL)
+                    ? g.ov_rogue_syms[ovidx]
+                    : g.ov_primary_syms[ovidx])
+                idx = ovidx;
+        }
+        if (is_you) {
+            ovidx = SYM_HERO_OVERRIDE + SYM_OFF_X;
+            if ((g.glyphmap_perlevel_flags & GMAP_ROGUELEVEL)
+                    ? g.ov_rogue_syms[ovidx]
+                    : g.ov_primary_syms[ovidx])
+                idx = ovidx;
+        }
+    }
+
+    glyphmod[GM_TTYCHAR] = ((mgflags & MG_FLAG_RETURNIDX) != 0) ? idx : g.showsyms[idx];
+
+#ifdef TEXTCOLOR
+    /* Turn off color if no color defined, or rogue level w/o PC graphics. */
+    if (!has_color(color)
+        || ((g.glyphmap_perlevel_flags & GMAP_ROGUELEVEL) && !has_rogue_color))
+#endif
+        color = NO_COLOR;
+    glyphmod[GM_COLOR] = color;
+    glyphmod[GM_FLAGS] = special;
+}
+
 /* ------------------------------------------------------------------------ */
 /* Wall Angle ------------------------------------------------------------- */
 
index c4c2f654c7cae6c4ab702a12374a988cffca9b70..8a757fb7eef126b83cf91d9bf172f1de0f836846 100644 (file)
@@ -18,7 +18,7 @@ static void NDECL(gloc_filter_done);
 static boolean FDECL(gather_locs_interesting, (int, int, int));
 static void FDECL(gather_locs, (coord **, int *, int));
 static void FDECL(auto_describe, (int, int));
-static void NDECL(do_mname);
+static void NDECL(do_mgivenname);
 static boolean FDECL(alreadynamed, (struct monst *, char *, char *));
 static void FDECL(do_oname, (struct obj *));
 static char *FDECL(docall_xname, (struct obj *));
@@ -996,7 +996,7 @@ const char *goal;
 
 /* allocate space for a monster's name; removes old name if there is one */
 void
-new_mname(mon, lth)
+new_mgivenname(mon, lth)
 struct monst *mon;
 int lth; /* desired length (caller handles adding 1 for terminator) */
 {
@@ -1005,23 +1005,23 @@ int lth; /* desired length (caller handles adding 1 for terminator) */
         if (!mon->mextra)
             mon->mextra = newmextra();
         else
-            free_mname(mon); /* already has mextra, might also have name */
-        MNAME(mon) = (char *) alloc((unsigned) lth);
+            free_mgivenname(mon); /* already has mextra, might also have name */
+        MGIVENNAME(mon) = (char *) alloc((unsigned) lth);
     } else {
         /* zero length: the new name is empty; get rid of the old name */
-        if (has_mname(mon))
-            free_mname(mon);
+        if (has_mgivenname(mon))
+            free_mgivenname(mon);
     }
 }
 
 /* release a monster's name; retains mextra even if all fields are now null */
 void
-free_mname(mon)
+free_mgivenname(mon)
 struct monst *mon;
 {
-    if (has_mname(mon)) {
-        free((genericptr_t) MNAME(mon));
-        MNAME(mon) = (char *) 0;
+    if (has_mgivenname(mon)) {
+        free((genericptr_t) MGIVENNAME(mon));
+        MGIVENNAME(mon) = (char *) 0;
     }
 }
 
@@ -1087,14 +1087,14 @@ const char *name;
         name = strncpy(buf, name, PL_PSIZ - 1);
         buf[PL_PSIZ - 1] = '\0';
     }
-    new_mname(mtmp, lth); /* removes old name if one is present */
+    new_mgivenname(mtmp, lth); /* removes old name if one is present */
     if (lth)
-        Strcpy(MNAME(mtmp), name);
+        Strcpy(MGIVENNAME(mtmp), name);
     return mtmp;
 }
 
 /* check whether user-supplied name matches or nearly matches an unnameable
-   monster's name; if so, give an alternate reject message for do_mname() */
+   monster's name; if so, give an alternate reject message for do_mgivenname() */
 static boolean
 alreadynamed(mtmp, monnambuf, usrbuf)
 struct monst *mtmp;
@@ -1126,7 +1126,7 @@ char *monnambuf, *usrbuf;
 
 /* allow player to assign a name to some chosen monster */
 static void
-do_mname()
+do_mgivenname()
 {
     char buf[BUFSZ], monnambuf[BUFSZ], qbuf[QBUFSZ];
     coord cc;
@@ -1170,8 +1170,8 @@ do_mname()
     buf[0] = '\0';
 #ifdef EDIT_GETLIN
     /* if there's an existing name, make it be the default answer */
-    if (has_mname(mtmp))
-        Strcpy(buf, MNAME(mtmp));
+    if (has_mgivenname(mtmp))
+        Strcpy(buf, MGIVENNAME(mtmp));
 #endif
     getlin(qbuf, buf);
     if (!*buf || *buf == '\033')
@@ -1398,7 +1398,7 @@ docallcmd()
     case 'q':
         break;
     case 'm': /* name a visible monster */
-        do_mname();
+        do_mgivenname();
         break;
     case 'i': /* name an individual object in inventory */
         allowall[0] = ALL_CLASSES;
@@ -1661,7 +1661,7 @@ boolean called;
 {
     char *buf = nextmbuf();
     struct permonst *mdat = mtmp->data;
-    const char *pm_name = mdat->mname;
+    const char *pm_name = pmname(mdat, Mgender(mtmp));
     boolean do_hallu, do_invis, do_it, do_saddle, do_name;
     boolean name_at_start, has_adjectives;
     char *bp;
@@ -1706,12 +1706,14 @@ boolean called;
             name += 4;
         return strcpy(buf, name);
     }
+#if 0
     /* an "aligned priest" not flagged as a priest or minion should be
        "priest" or "priestess" (normally handled by priestname()) */
-    if (mdat == &mons[PM_ALIGNED_PRIEST])
+    if (mdat == &mons[PM_ALIGNED_CLERIC])
         pm_name = mtmp->female ? "priestess" : "priest";
-    else if (mdat == &mons[PM_HIGH_PRIEST] && mtmp->female)
+    else if (mdat == &mons[PM_HIGH_CLERIC] && mtmp->female)
         pm_name = "high priestess";
+#endif
 
     /* Shopkeepers: use shopkeeper name.  For normal shopkeepers, just
      * "Asidonhopo"; for unusual ones, "Asidonhopo the invisible
@@ -1755,8 +1757,8 @@ boolean called;
 
         Strcat(buf, rname);
         name_at_start = bogon_is_pname(rnamecode);
-    } else if (do_name && has_mname(mtmp)) {
-        char *name = MNAME(mtmp);
+    } else if (do_name && has_mgivenname(mtmp)) {
+        char *name = MGIVENNAME(mtmp);
 
         if (mdat == &mons[PM_GHOST]) {
             Sprintf(eos(buf), "%s ghost", s_suffix(name));
@@ -1829,7 +1831,7 @@ l_monnam(mtmp)
 struct monst *mtmp;
 {
     return x_monnam(mtmp, ARTICLE_NONE, (char *) 0,
-                    (has_mname(mtmp)) ? SUPPRESS_SADDLE : 0, TRUE);
+                    (has_mgivenname(mtmp)) ? SUPPRESS_SADDLE : 0, TRUE);
 }
 
 char *
@@ -1837,7 +1839,7 @@ mon_nam(mtmp)
 struct monst *mtmp;
 {
     return x_monnam(mtmp, ARTICLE_THE, (char *) 0,
-                    (has_mname(mtmp)) ? SUPPRESS_SADDLE : 0, FALSE);
+                    (has_mgivenname(mtmp)) ? SUPPRESS_SADDLE : 0, FALSE);
 }
 
 /* print the name as if mon_nam() was called, but assume that the player
@@ -1849,7 +1851,7 @@ noit_mon_nam(mtmp)
 struct monst *mtmp;
 {
     return x_monnam(mtmp, ARTICLE_THE, (char *) 0,
-                    (has_mname(mtmp)) ? (SUPPRESS_SADDLE | SUPPRESS_IT)
+                    (has_mgivenname(mtmp)) ? (SUPPRESS_SADDLE | SUPPRESS_IT)
                                       : SUPPRESS_IT,
                     FALSE);
 }
@@ -1900,7 +1902,7 @@ struct monst *mtmp;
     int prefix, suppression_flag;
 
     prefix = mtmp->mtame ? ARTICLE_YOUR : ARTICLE_THE;
-    suppression_flag = (has_mname(mtmp)
+    suppression_flag = (has_mgivenname(mtmp)
                         /* "saddled" is redundant when mounted */
                         || mtmp == u.usteed)
                            ? SUPPRESS_SADDLE
@@ -1915,7 +1917,7 @@ struct monst *mtmp;
 const char *adj;
 {
     char *bp = x_monnam(mtmp, ARTICLE_THE, adj,
-                        has_mname(mtmp) ? SUPPRESS_SADDLE : 0, FALSE);
+                        has_mgivenname(mtmp) ? SUPPRESS_SADDLE : 0, FALSE);
 
     *bp = highc(*bp);
     return  bp;
@@ -1926,7 +1928,7 @@ a_monnam(mtmp)
 struct monst *mtmp;
 {
     return x_monnam(mtmp, ARTICLE_A, (char *) 0,
-                    has_mname(mtmp) ? SUPPRESS_SADDLE : 0, FALSE);
+                    has_mgivenname(mtmp) ? SUPPRESS_SADDLE : 0, FALSE);
 }
 
 char *
@@ -1950,7 +1952,7 @@ char *outbuf;
     /* high priest(ess)'s identity is concealed on the Astral Plane,
        unless you're adjacent (overridden for hallucination which does
        its own obfuscation) */
-    if (mon->data == &mons[PM_HIGH_PRIEST] && !Hallucination
+    if (mon->data == &mons[PM_HIGH_CLERIC] && !Hallucination
         && Is_astralevel(&u.uz) && distu(mon->mx, mon->my) > 2) {
         Strcpy(outbuf, article == ARTICLE_THE ? "the " : "");
         Strcat(outbuf, mon->female ? "high priestess" : "high priest");
@@ -2048,37 +2050,65 @@ boolean ckloc;
     } else if (ckloc && ptr == &mons[PM_LONG_WORM]
                && g.level.monsters[mon->mx][mon->my] != mon) {
         Sprintf(outbuf, "%s <%d,%d>",
-                mons[PM_LONG_WORM_TAIL].mname, mon->mx, mon->my);
+                pmname(&mons[PM_LONG_WORM_TAIL], Mgender(mon)), mon->mx, mon->my);
     } else {
         Sprintf(outbuf, "%s%s <%d,%d>",
                 mon->mtame ? "tame " : mon->mpeaceful ? "peaceful " : "",
-                mon->data->mname, mon->mx, mon->my);
+                pmname(mon->data, Mgender(mon)), mon->mx, mon->my);
         if (mon->cham != NON_PM)
-            Sprintf(eos(outbuf), "{%s}", mons[mon->cham].mname);
+            Sprintf(eos(outbuf), "{%s}", pmname(&mons[mon->cham], Mgender(mon)));
     }
     return outbuf;
 }
 
+#ifndef PMNAME_MACROS
+int
+Mgender(mtmp)
+struct monst *mtmp;
+{
+    int mgender = MALE;
+
+    if (mtmp == &g.youmonst) {
+        if (Upolyd ? u.mfemale : flags.female)
+            mgender = FEMALE;
+    } else if (mtmp->female) {
+        mgender = FEMALE;
+    }
+    return mgender;
+}
+
+const char *
+pmname(pm, mgender)
+struct permonst *pm;
+int mgender;
+{
+    if ((mgender >= MALE && mgender < NUM_MGENDERS) && pm->pmnames[mgender])
+        return pm->pmnames[mgender];
+    else
+        return pm->pmnames[NEUTRAL];
+}
+#endif /* PMNAME_MACROS */
+
 /* fake monsters used to be in a hard-coded array, now in a data file */
 char *
 bogusmon(buf, code)
 char *buf, *code;
 {
     static const char bogon_codes[] = "-_+|="; /* see dat/bonusmon.txt */
-    char *mname = buf;
+    char *mnam = buf;
 
     if (code)
         *code = '\0';
     /* might fail (return empty buf[]) if the file isn't available */
     get_rnd_text(BOGUSMONFILE, buf, rn2_on_display_rng);
-    if (!*mname) {
+    if (!*mnam) {
         Strcpy(buf, "bogon");
-    } else if (index(bogon_codes, *mname)) { /* strip prefix if present */
+    } else if (index(bogon_codes, *mnam)) { /* strip prefix if present */
         if (code)
-            *code = *mname;
-        ++mname;
+            *code = *mnam;
+        ++mnam;
     }
-    return mname;
+    return mnam;
 }
 
 /* return a random monster name, for hallucination */
@@ -2087,7 +2117,7 @@ rndmonnam(code)
 char *code;
 {
     static char buf[BUFSZ];
-    char *mname;
+    char *mnam;
     int name;
 #define BOGUSMONSIZE 100 /* arbitrary */
 
@@ -2100,11 +2130,11 @@ char *code;
              && (type_is_pname(&mons[name]) || (mons[name].geno & G_NOGEN)));
 
     if (name >= SPECIAL_PM) {
-        mname = bogusmon(buf, code);
+        mnam = bogusmon(buf, code);
     } else {
-        mname = strcpy(buf, mons[name].mname);
+        mnam = strcpy(buf, pmname(&mons[name], rn2_on_display_rng(2)));
     }
-    return mname;
+    return mnam;
 #undef BOGUSMONSIZE
 }
 
index 670fc6aa84a53740c4ad861c4a5ddc94fd18956d..044b363d6ae41d97f36eb1f30347c2535dfd9e37 100644 (file)
@@ -428,7 +428,7 @@ Helmet_on(VOID_ARGS)
                inventory; do so now [set_bknown() calls update_inventory()] */
             if (Blind)
                 set_bknown(uarmh, 0); /* lose bknown if previously set */
-            else if (Role_if(PM_PRIEST))
+            else if (Role_if(PM_CLERIC))
                 set_bknown(uarmh, 1); /* (bknown should already be set) */
             else if (uarmh->bknown)
                 update_inventory(); /* keep bknown as-is; display the curse */
@@ -766,6 +766,8 @@ Amulet_on()
             You("are suddenly very %s!",
                 flags.female ? "feminine" : "masculine");
             g.context.botl = 1;
+            newsym(u.ux, u.uy); /* glyphmon flag and tile may have gone
+                                   from male to female or vice versa */
         } else
             /* already polymorphed into single-gender monster; only
                changed the character's base sex */
index 450996168fe707707717a7f7c1b9dca53ceecc4d..50ffd00c9903066ec6bb624edb1c2d96bacd338e 100644 (file)
--- a/src/dog.c
+++ b/src/dog.c
@@ -170,7 +170,7 @@ makedog()
     /* default pet names */
     if (!*petname && pettype == PM_LITTLE_DOG) {
         /* All of these names were for dogs. */
-        if (Role_if(PM_CAVEMAN))
+        if (Role_if(PM_CAVE_DWELLER))
             petname = "Slasher"; /* The Warrior */
         if (Role_if(PM_SAMURAI))
             petname = "Hachi"; /* Shibuya Station */
index 363bbcd5c6e899d983782b49c75ebd9297260b76..8d255ec3ea566cf934193dde7560e436a3168265 100644 (file)
@@ -1429,7 +1429,8 @@ struct monst *mtmp;
                          && OBJ_NAME(objects[mtmp->mappearance]))
                             ? an(OBJ_NAME(objects[mtmp->mappearance]))
                             : (M_AP_TYPE(mtmp) == M_AP_MONSTER)
-                                  ? an(mons[mtmp->mappearance].mname)
+                                  ? an(pmname(&mons[mtmp->mappearance],
+                                              Mgender(mtmp)))
                                   : something,
             cansee(mtmp->mx, mtmp->my) ? "" : "has ",
             cansee(mtmp->mx, mtmp->my) ? "" : "ed",
index 7653165229835187265d2ad49fe0da60f74a2cab..c685fa2011e634530a846027778eaa02ed0759a4 100644 (file)
@@ -1159,9 +1159,6 @@ dokick()
         }
         if (IS_SINK(g.maploc->typ)) {
             int gend = poly_gender();
-            short washerndx = (gend == 1 || (gend == 2 && rn2(2)))
-                                  ? PM_INCUBUS
-                                  : PM_SUCCUBUS;
 
             if (Levitation)
                 goto dumb;
@@ -1185,10 +1182,12 @@ dokick()
                 g.maploc->looted |= S_LPUDDING;
                 return 1;
             } else if (!(g.maploc->looted & S_LDWASHER) && !rn2(3)
-                       && !(g.mvitals[washerndx].mvflags & G_GONE)) {
+                       && !(g.mvitals[PM_AMOROUS_DEMON].mvflags & G_GONE)) {
                 /* can't resist... */
                 pline("%s returns!", (Blind ? Something : "The dish washer"));
-                if (makemon(&mons[washerndx], x, y, NO_MM_FLAGS))
+                if (makemon(&mons[PM_AMOROUS_DEMON], x, y,
+                            (gend == 1 || (gend == 2 && rn2(2)))
+                                  ? MM_FEMALE : MM_MALE))
                     newsym(x, y);
                 g.maploc->looted |= S_LDWASHER;
                 exercise(A_DEX, TRUE);
@@ -1746,7 +1745,7 @@ unsigned long deliverflags;
 
             /* special treatment for orcs and their kind */
             if ((otmp->corpsenm & M2_ORC) != 0 && has_oname(otmp)) {
-                if (!has_mname(mtmp)) {
+                if (!has_mgivenname(mtmp)) {
                     if (at_crime_scene || !rn2(2))
                         mtmp = christen_orc(mtmp,
                                             at_crime_scene ? ONAME(otmp)
index c3695658d708b489abd28ac4819f48c803adcd8a..8318bafb3ba3a9ca2befb4820a5bf0ec69fafc0d 100644 (file)
@@ -39,7 +39,7 @@ struct obj *launcher; /* can be NULL */
     schar skill = objects[ammo->otyp].oc_skill;
 
     switch (pm) {
-    case PM_CAVEMAN:
+    case PM_CAVE_DWELLER:
         /* give bonus for low-tech gear */
         if (skill == -P_SLING || skill == P_SPEAR)
             multishot++;
@@ -158,7 +158,7 @@ int shotlimit;
                          : obj->oclass == WEAPON_CLASS)
         && !(Confusion || Stunned)) {
         /* some roles don't get a volley bonus until becoming expert */
-        weakmultishot = (Role_if(PM_WIZARD) || Role_if(PM_PRIEST)
+        weakmultishot = (Role_if(PM_WIZARD) || Role_if(PM_CLERIC)
                          || (Role_if(PM_HEALER) && skill != P_KNIFE)
                          || (Role_if(PM_TOURIST) && skill != -P_DART)
                          /* poor dexterity also inhibits multishot */
index f73c4d1d5c48cdc7db138027b4c7d81f485470a3..13628642b626d13c63f4f3779636d328bd0ac530 100644 (file)
--- a/src/eat.c
+++ b/src/eat.c
@@ -40,7 +40,7 @@ static int FDECL(tin_variety, (struct obj *, BOOLEAN_P));
 static boolean FDECL(maybe_cannibal, (int, BOOLEAN_P));
 
 /* also used to see if you're allowed to eat cats and dogs */
-#define CANNIBAL_ALLOWED() (Role_if(PM_CAVEMAN) || Race_if(PM_ORC))
+#define CANNIBAL_ALLOWED() (Role_if(PM_CAVE_DWELLER) || Race_if(PM_ORC))
 
 /* monster types that cause hero to be turned into stone if eaten */
 #define flesh_petrifies(pm) (touch_petrifies(pm) || (pm) == &mons[PM_MEDUSA])
@@ -516,7 +516,8 @@ int *dmg_p; /* for dishing out extra damage in lieu of Int loss */
            tentacle-touch should have been caught before reaching this far) */
         if (magr == &g.youmonst) {
             if (!Stone_resistance && !Stoned)
-                make_stoned(5L, (char *) 0, KILLED_BY_AN, pd->mname);
+                make_stoned(5L, (char *) 0, KILLED_BY_AN,
+                            pmname(pd, Mgender(mdef)));
         } else {
             /* no need to check for poly_when_stoned or Stone_resistance;
                mind flayers don't have those capabilities */
@@ -546,7 +547,8 @@ int *dmg_p; /* for dishing out extra damage in lieu of Int loss */
             return MM_MISS;
         } else if (is_rider(pd)) {
             pline("Ingesting that is fatal.");
-            Sprintf(g.killer.name, "unwisely ate the brain of %s", pd->mname);
+            Sprintf(g.killer.name, "unwisely ate the brain of %s",
+                    pmname(pd, Mgender(mdef)));
             g.killer.format = NO_KILLER_PREFIX;
             done(DIED);
             /* life-saving needed to reach here */
@@ -676,7 +678,8 @@ register int pm;
         if (!Stone_resistance
             && !(poly_when_stoned(g.youmonst.data)
                  && polymon(PM_STONE_GOLEM))) {
-            Sprintf(g.killer.name, "tasting %s meat", mons[pm].mname);
+            Sprintf(g.killer.name, "tasting %s meat",
+                    mons[pm].pmnames[NEUTRAL]);
             g.killer.format = KILLED_BY;
             You("turn to stone.");
             done(STONING);
@@ -695,7 +698,8 @@ register int pm;
     case PM_LARGE_CAT:
         /* cannibals are allowed to eat domestic animals without penalty */
         if (!CANNIBAL_ALLOWED()) {
-            You_feel("that eating the %s was a bad idea.", mons[pm].mname);
+            You_feel("that eating the %s was a bad idea.",
+                     mons[pm].pmnames[NEUTRAL]);
             HAggravate_monster |= FROMOUTSIDE;
         }
         break;
@@ -707,7 +711,8 @@ register int pm;
     case PM_PESTILENCE:
     case PM_FAMINE: {
         pline("Eating that is instantly fatal.");
-        Sprintf(g.killer.name, "unwisely ate the body of %s", mons[pm].mname);
+        Sprintf(g.killer.name, "unwisely ate the body of %s",
+                mons[pm].pmnames[NEUTRAL]);
         g.killer.format = NO_KILLER_PREFIX;
         done(DIED);
         /* life-saving needed to reach here */
@@ -1033,7 +1038,7 @@ int pm;
                     Hallucination
                        ? "You suddenly dread being peeled and mimic %s again!"
                        : "You now prefer mimicking %s again.",
-                    an(Upolyd ? g.youmonst.data->mname : g.urace.noun));
+                    an(Upolyd ? pmname(g.youmonst.data, Ugender) : g.urace.noun));
             g.eatmbuf = dupstr(buf);
             g.nomovemsg = g.eatmbuf;
             g.afternmv = eatmdone;
@@ -1247,9 +1252,9 @@ char *buf;
                 Strcpy(eos(buf), " of ");
             }
             if (vegetarian(&mons[mnum]))
-                Sprintf(eos(buf), "%s", mons[mnum].mname);
+                Sprintf(eos(buf), "%s", mons[mnum].pmnames[NEUTRAL]);
             else
-                Sprintf(eos(buf), "%s meat", mons[mnum].mname);
+                Sprintf(eos(buf), "%s meat", mons[mnum].pmnames[NEUTRAL]);
         }
     }
 }
@@ -1343,7 +1348,7 @@ const char *mesg;
         } else if (Hallucination) {
             what = rndmonnam(NULL);
         } else {
-            what = mons[mnum].mname;
+            what = mons[mnum].pmnames[NEUTRAL];
             if (the_unique_pm(&mons[mnum]))
                 which = 2;
             else if (type_is_pname(&mons[mnum]))
@@ -1370,7 +1375,7 @@ const char *mesg;
         g.context.victual.fullwarn = g.context.victual.eating =
             g.context.victual.doreset = FALSE;
 
-        You("consume %s %s.", tintxts[r].txt, mons[mnum].mname);
+        You("consume %s %s.", tintxts[r].txt, mons[mnum].pmnames[NEUTRAL]);
 
         eating_conducts(&mons[mnum]);
 
@@ -2254,7 +2259,7 @@ struct obj *otmp;
                      && polymon(PM_STONE_GOLEM))) {
                 if (!Stoned) {
                     Sprintf(g.killer.name, "%s egg",
-                            mons[otmp->corpsenm].mname);
+                            mons[otmp->corpsenm].pmnames[NEUTRAL]);
                     make_stoned(5L, (char *) 0, KILLED_BY_AN, g.killer.name);
                 }
             }
index 50f5932801dc6fa55f6ca16cedb1b487db7a8d98..f362a07c6e3ccf6283e8af77577a173b4253a410 100644 (file)
--- a/src/end.c
+++ b/src/end.c
@@ -409,13 +409,13 @@ int how;
     /* "killed by the high priest of Crom" is okay,
        "killed by the high priest" alone isn't */
     if ((mptr->geno & G_UNIQ) != 0 && !(imitator && !mimicker)
-        && !(mptr == &mons[PM_HIGH_PRIEST] && !mtmp->ispriest)) {
+        && !(mptr == &mons[PM_HIGH_CLERIC] && !mtmp->ispriest)) {
         if (!type_is_pname(mptr))
             Strcat(buf, "the ");
         g.killer.format = KILLED_BY;
     }
     /* _the_ <invisible> <distorted> ghost of Dudley */
-    if (mptr == &mons[PM_GHOST] && has_mname(mtmp)) {
+    if (mptr == &mons[PM_GHOST] && has_mgivenname(mtmp)) {
         Strcat(buf, "the ");
         g.killer.format = KILLED_BY;
     }
@@ -427,14 +427,15 @@ int how;
 
     if (imitator) {
         char shape[BUFSZ];
-        const char *realnm = champtr->mname, *fakenm = mptr->mname;
+        const char *realnm = pmname(champtr, Mgender(mtmp)),
+                             *fakenm = pmname(mptr, Mgender(mtmp));
         boolean alt = is_vampshifter(mtmp);
 
         if (mimicker) {
             /* realnm is already correct because champtr==mptr;
                set up fake mptr for type_is_pname/the_unique_pm */
             mptr = &mons[mtmp->mappearance];
-            fakenm = mptr->mname;
+            fakenm = pmname(mptr, Mgender(mtmp));
         } else if (alt && strstri(realnm, "vampire")
                    && !strcmp(fakenm, "vampire bat")) {
             /* special case: use "vampire in bat form" in preference
@@ -459,8 +460,8 @@ int how;
         mptr = mtmp->data; /* reset for mimicker case */
     } else if (mptr == &mons[PM_GHOST]) {
         Strcat(buf, "ghost");
-        if (has_mname(mtmp))
-            Sprintf(eos(buf), " of %s", MNAME(mtmp));
+        if (has_mgivenname(mtmp))
+            Sprintf(eos(buf), " of %s", MGIVENNAME(mtmp));
     } else if (mtmp->isshk) {
         const char *shknm = shkname(mtmp),
                    *honorific = shkname_is_pname(mtmp) ? ""
@@ -473,9 +474,9 @@ int how;
            it overrides the effect of Hallucination on priestname() */
         Strcat(buf, m_monnam(mtmp));
     } else {
-        Strcat(buf, mptr->mname);
-        if (has_mname(mtmp))
-            Sprintf(eos(buf), " called %s", MNAME(mtmp));
+        Strcat(buf, pmname(mptr, Mgender(mtmp)));
+        if (has_mgivenname(mtmp))
+            Sprintf(eos(buf), " called %s", MGIVENNAME(mtmp));
     }
 
     Strcpy(g.killer.name, buf);
@@ -1414,7 +1415,7 @@ int how;
              (u.ugrave_arise != PM_GREEN_SLIME)
                  ? "body rises from the dead"
                  : "revenant persists",
-             an(mons[u.ugrave_arise].mname));
+             an(pmname(&mons[u.ugrave_arise], Ugender)));
         display_nhwindow(WIN_MESSAGE, FALSE);
     }
 
index de4404ab43f7ee861f1147bc2d91514673f69899..ea2dcc6bb1d0a9121a483a8616a2ba02b4166a95 100644 (file)
@@ -28,7 +28,7 @@ enermod(en)
 int en;
 {
     switch (Role_switch) {
-    case PM_PRIEST:
+    case PM_CLERIC:
     case PM_WIZARD:
         return (2 * en);
     case PM_HEALER:
index 8abe642fd4c95711f47b84dc04971bc55286540c..30dc6b92c997316e0c7b16af22c0f4b56c720491 100644 (file)
@@ -66,7 +66,7 @@ int expltype;
                 type = 0;
         }
         switch (Role_switch) {
-        case PM_PRIEST:
+        case PM_CLERIC:
         case PM_MONK:
         case PM_WIZARD:
             damu /= 5;
index dd72458611f874d99d5164fbd820489e79a81e76..f995f8d1a803bd542aa8c4061801484deb0f63a4 100644 (file)
@@ -3089,7 +3089,7 @@ struct obj *obj;
 
     /* subset of starting inventory pre-ID */
     obj->dknown = 1;
-    if (Role_if(PM_PRIEST))
+    if (Role_if(PM_CLERIC))
         obj->bknown = 1; /* ok to bypass set_bknown() */
     /* same criteria as lift_object()'s check for available inventory slot */
     if (obj->oclass != COIN_CLASS && inv_cnt(FALSE) >= 52
index 7d766ec31f989f7454384c160285a46b8b5a0304..30ea83a96c556f2dca0b495be8c215e4113f2cca 100644 (file)
@@ -1913,10 +1913,10 @@ domove_core()
             You("%s %s.", mtmp->mpeaceful ? "swap places with" : "frighten",
                 x_monnam(mtmp,
                          mtmp->mtame ? ARTICLE_YOUR
-                         : (!has_mname(mtmp) && !type_is_pname(mtmp->data))
+                         : (!has_mgivenname(mtmp) && !type_is_pname(mtmp->data))
                            ? ARTICLE_THE : ARTICLE_NONE,
                          (mtmp->mpeaceful && !mtmp->mtame) ? "peaceful" : 0,
-                         has_mname(mtmp) ? SUPPRESS_SADDLE : 0, FALSE));
+                         has_mgivenname(mtmp) ? SUPPRESS_SADDLE : 0, FALSE));
 
             /* check for displacing it into pools and traps */
             switch (minliquid(mtmp) ? 2 : mintrap(mtmp)) {
@@ -3071,7 +3071,8 @@ const char *msg_override;
            if life-saved while poly'd and Unchanging (explore or wizard mode
            declining to die since can't be both Unchanging and Lifesaved) */
         if (Upolyd && !strncmpi(g.nomovemsg, "You survived that ", 18))
-            You("are %s.", an(mons[u.umonnum].mname)); /* (ignore Hallu) */
+            You("are %s.",
+                an(pmname(&mons[u.umonnum], Ugender))); /* (ignore Hallu) */
     }
     g.nomovemsg = 0;
     u.usleep = 0;
index 57cd5596e3dde198041c500c144cafa491d8f5b0..fd5bbfd3efa03ed7a8da4a126bc28676e469b2e4 100644 (file)
@@ -327,10 +327,12 @@ int final;
         if (!is_male(uasmon) && !is_female(uasmon) && !is_neuter(uasmon))
             Sprintf(tmpbuf, "%s ", genders[flags.female ? 1 : 0].adj);
         if (altphrasing)
-            Sprintf(eos(tmpbuf), "%s in ", mons[g.youmonst.cham].mname);
+            Sprintf(eos(tmpbuf), "%s in ",
+                    pmname(&mons[g.youmonst.cham],
+                           flags.female ? FEMALE : MALE));
         Sprintf(buf, "%s%s%s%s form", !final ? "currently " : "",
                 altphrasing ? just_an(anbuf, tmpbuf) : "in ",
-                tmpbuf, uasmon->mname);
+                tmpbuf, pmname(uasmon, flags.female ? FEMALE : MALE));
         you_are(buf, "");
     }
 
@@ -1367,7 +1369,7 @@ int final;
     }
     if (Warn_of_mon && g.context.warntype.speciesidx >= LOW_PM) {
         Sprintf(buf, "aware of the presence of %s",
-                makeplural(mons[g.context.warntype.speciesidx].mname));
+             makeplural(mons[g.context.warntype.speciesidx].pmnames[NEUTRAL]));
         you_are(buf, from_what(WARN_OF_MON));
     }
     if (Undead_warning)
@@ -1574,10 +1576,14 @@ int final;
              && u.umonnum == PM_GREEN_SLIME && !Unchanging)) {
         /* foreign shape (except were-form which is handled below) */
         if (!vampshifted(&g.youmonst))
-            Sprintf(buf, "polymorphed into %s", an(g.youmonst.data->mname));
+            Sprintf(buf, "polymorphed into %s",
+                    an(pmname(g.youmonst.data,
+                              flags.female ? FEMALE : MALE)));
         else
             Sprintf(buf, "polymorphed into %s in %s form",
-                    an(mons[g.youmonst.cham].mname), g.youmonst.data->mname);
+                    an(pmname(&mons[g.youmonst.cham],
+                              flags.female ? FEMALE : MALE)),
+                    pmname(g.youmonst.data, flags.female ? FEMALE : MALE));
         if (wizard)
             Sprintf(eos(buf), " (%d)", u.mtimedone);
         you_are(buf, "");
@@ -1586,7 +1592,8 @@ int final;
         you_can("lay eggs", "");
     if (u.ulycn >= LOW_PM) {
         /* "you are a werecreature [in beast form]" */
-        Strcpy(buf, an(mons[u.ulycn].mname));
+        Strcpy(buf, an(pmname(&mons[u.ulycn],
+               flags.female ? FEMALE : MALE)));
         if (u.umonnum == u.ulycn) {
             Strcat(buf, " in beast form");
             if (wizard)
@@ -2226,15 +2233,16 @@ const genericptr vptr2;
         res = mstr2 - mstr1; /* monstr high to low */
         break;
     case VANQ_ALPHA_SEP:
-        uniq1 = ((mons[indx1].geno & G_UNIQ) && indx1 != PM_HIGH_PRIEST);
-        uniq2 = ((mons[indx2].geno & G_UNIQ) && indx2 != PM_HIGH_PRIEST);
+        uniq1 = ((mons[indx1].geno & G_UNIQ) && indx1 != PM_HIGH_CLERIC);
+        uniq2 = ((mons[indx2].geno & G_UNIQ) && indx2 != PM_HIGH_CLERIC);
         if (uniq1 ^ uniq2) { /* one or other uniq, but not both */
             res = uniq2 - uniq1;
             break;
         } /* else both unique or neither unique */
         /*FALLTHRU*/
     case VANQ_ALPHA_MIX:
-        name1 = mons[indx1].mname, name2 = mons[indx2].mname;
+        name1 = mons[indx1].pmnames[NEUTRAL],
+                name2 = mons[indx2].pmnames[NEUTRAL];
         res = strcmpi(name1, name2); /* caseblind alhpa, low to high */
         break;
     case VANQ_MCLS_HTOL:
@@ -2344,7 +2352,7 @@ doborn()
                     g.mvitals[i].died, g.mvitals[i].born,
                     ((g.mvitals[i].mvflags & G_GONE) == G_EXTINCT) ? 'E' :
                     ((g.mvitals[i].mvflags & G_GONE) == G_GENOD) ? 'G' : ' ',
-                    mons[i].mname);
+                    mons[i].pmnames[NEUTRAL]);
             putstr(datawin, 0, buf);
             nborn += g.mvitals[i].born;
             ndied += g.mvitals[i].died;
@@ -2361,7 +2369,7 @@ doborn()
 
 /* high priests aren't unique but are flagged as such to simplify something */
 #define UniqCritterIndx(mndx) ((mons[mndx].geno & G_UNIQ) \
-                               && mndx != PM_HIGH_PRIEST)
+                               && mndx != PM_HIGH_CLERIC)
 
 #define done_stopprint g.program_state.stopprint
 
@@ -2435,7 +2443,7 @@ boolean ask;
                 if (UniqCritterIndx(i)) {
                     Sprintf(buf, "%s%s",
                             !type_is_pname(&mons[i]) ? "the " : "",
-                            mons[i].mname);
+                            mons[i].pmnames[NEUTRAL]);
                     if (nkilled > 1) {
                         switch (nkilled) {
                         case 2:
@@ -2458,10 +2466,10 @@ boolean ask;
                     /* trolls or undead might have come back,
                        but we don't keep track of that */
                     if (nkilled == 1)
-                        Strcpy(buf, an(mons[i].mname));
+                        Strcpy(buf, an(mons[i].pmnames[NEUTRAL]));
                     else
                         Sprintf(buf, "%3d %s", nkilled,
-                                makeplural(mons[i].mname));
+                                makeplural(mons[i].pmnames[NEUTRAL]));
                 }
                 /* number of leading spaces to match 3 digit prefix */
                 pfx = !strncmpi(buf, "the ", 3) ? 0
@@ -2507,7 +2515,7 @@ num_genocides()
             ++n;
             if (UniqCritterIndx(i))
                 impossible("unique creature '%d: %s' genocided?",
-                           i, mons[i].mname);
+                           i, mons[i].pmnames[NEUTRAL]);
         }
     }
     return n;
@@ -2570,7 +2578,7 @@ boolean ask;
                 if (UniqCritterIndx(i))
                     continue;
                 if (g.mvitals[i].mvflags & G_GONE) {
-                    Sprintf(buf, " %s", makeplural(mons[i].mname));
+                    Sprintf(buf, " %s", makeplural(mons[i].pmnames[NEUTRAL]));
                     /*
                      * "Extinct" is unfortunate terminology.  A species
                      * is marked extinct when its birth limit is reached,
index 5f14e2f466bb003c7d6113640e6a67a59f7cc3cc..8b1a96287d46add6b5d96ee1d0244e7996464a72 100644 (file)
@@ -2980,7 +2980,7 @@ boolean FDECL((*filterfunc), (OBJ_P));
 
     for (; list; list = list->nobj) {
         /* priests always know bless/curse state */
-        if (Role_if(PM_PRIEST))
+        if (Role_if(PM_CLERIC))
             list->bknown = (list->oclass != COIN_CLASS);
         /* some actions exclude some or most items */
         if (filterfunc && !(*filterfunc)(list))
@@ -3020,7 +3020,7 @@ int *bcp, *ucp, *ccp, *xcp, *ocp;
     *bcp = *ucp = *ccp = *xcp = *ocp = 0;
     for ( ; list; list = (by_nexthere ? list->nexthere : list->nobj)) {
         /* priests always know bless/curse state */
-        if (Role_if(PM_PRIEST))
+        if (Role_if(PM_CLERIC))
             list->bknown = (list->oclass != COIN_CLASS);
         /* coins are either uncursed or unknown based upon option setting */
         if (list->oclass == COIN_CLASS) {
@@ -3731,7 +3731,7 @@ register struct obj *otmp, *obj;
         return FALSE;
 
     if (obj->dknown != otmp->dknown
-        || (obj->bknown != otmp->bknown && !Role_if(PM_PRIEST))
+        || (obj->bknown != otmp->bknown && !Role_if(PM_CLERIC))
         || obj->oeroded != otmp->oeroded || obj->oeroded2 != otmp->oeroded2
         || obj->greased != otmp->greased)
         return FALSE;
index b9bb36d5f875f934c6470e2f5c1e5ddd1159a816..27f9ad04977cae95056492e1377c3cffcaebb822 100644 (file)
@@ -247,14 +247,14 @@ register struct monst *mtmp;
                 }
                 break;
             }
-            if (mm == PM_ELVENKING) {
+            if (mm == PM_ELVENMONARCH) {
                 if (rn2(3) || (g.in_mklev && Is_earthlevel(&u.uz)))
                     (void) mongets(mtmp, PICK_AXE);
                 if (!rn2(50))
                     (void) mongets(mtmp, CRYSTAL_BALL);
             }
         } else if (ptr->msound == MS_PRIEST
-                   || quest_mon_represents_role(ptr, PM_PRIEST)) {
+                   || quest_mon_represents_role(ptr, PM_CLERIC)) {
             otmp = mksobj(MACE, FALSE, FALSE);
             otmp->spe = rnd(3);
             if (!rn2(2))
@@ -428,7 +428,7 @@ register struct monst *mtmp;
         }
         break;
     case S_OGRE:
-        if (!rn2(mm == PM_OGRE_KING ? 3 : mm == PM_OGRE_LORD ? 6 : 12))
+        if (!rn2(mm == PM_OGRE_TYRANT ? 3 : mm == PM_OGRE_LEADER ? 6 : 12))
             (void) mongets(mtmp, BATTLE_AXE);
         else
             (void) mongets(mtmp, CLUB);
@@ -700,7 +700,7 @@ register struct monst *mtmp;
                 (void) mongets(mtmp, WAN_STRIKING);
             }
         } else if (ptr->msound == MS_PRIEST
-                   || quest_mon_represents_role(ptr, PM_PRIEST)) {
+                   || quest_mon_represents_role(ptr, PM_CLERIC)) {
             (void) mongets(mtmp, rn2(7) ? ROBE
                                         : rn2(3) ? CLOAK_OF_PROTECTION
                                                  : CLOAK_OF_MAGIC_RESISTANCE);
@@ -882,8 +882,8 @@ xchar x, y; /* clone's preferred location or 0 (near mon) */
         new_light_source(m2->mx, m2->my, emits_light(m2->data), LS_MONSTER,
                          monst_to_any(m2));
     /* if 'parent' is named, give the clone the same name */
-    if (has_mname(mon)) {
-        m2 = christen_monst(m2, MNAME(mon));
+    if (has_mgivenname(mon)) {
+        m2 = christen_monst(m2, MGIVENNAME(mon));
     } else if (mon->isshk) {
         m2 = christen_monst(m2, shkname(mon));
     }
@@ -946,7 +946,7 @@ boolean ghostly;
     result = ((int) g.mvitals[mndx].born < lim && !gone) ? TRUE : FALSE;
 
     /* if it's unique, don't ever make it again */
-    if ((mons[mndx].geno & G_UNIQ) != 0 && mndx != PM_HIGH_PRIEST)
+    if ((mons[mndx].geno & G_UNIQ) != 0 && mndx != PM_HIGH_CLERIC)
         g.mvitals[mndx].mvflags |= G_EXTINCT;
 
     if (g.mvitals[mndx].born < 255 && tally && (!ghostly || result))
@@ -956,7 +956,7 @@ boolean ghostly;
         && !(g.mvitals[mndx].mvflags & G_EXTINCT)) {
         if (wizard) {
             debugpline1("Automatically extinguished %s.",
-                        makeplural(mons[mndx].mname));
+                        makeplural(mons[mndx].pmnames[NEUTRAL]));
         }
         g.mvitals[mndx].mvflags |= G_EXTINCT;
     }
@@ -1184,7 +1184,7 @@ long mmflags;
             return (struct monst *) 0;
         if (wizard && (g.mvitals[mndx].mvflags & G_EXTINCT)) {
             debugpline1("Explicitly creating extinct monster %s.",
-                        mons[mndx].mname);
+                        mons[mndx].pmnames[NEUTRAL]);
         }
     } else {
         /* make a random (common) monster that can survive here.
@@ -1236,9 +1236,9 @@ long mmflags;
     /* set up level and hit points */
     newmonhp(mtmp, mndx);
 
-    if (is_female(ptr))
+    if (is_female(ptr) || ((mmflags & MM_FEMALE) && !is_male(ptr)))
         mtmp->female = TRUE;
-    else if (is_male(ptr))
+    else if (is_male(ptr) || ((mmflags & MM_MALE) && !is_female(ptr)))
         mtmp->female = FALSE;
     /* leader and nemesis gender is usually hardcoded in mons[],
        but for ones which can be random, it has already been chosen
@@ -1369,7 +1369,7 @@ long mmflags;
        types; make sure their extended data is initialized to
        something sensible if caller hasn't specified MM_EPRI|MM_EMIN
        (when they're specified, caller intends to handle this itself) */
-    if ((mndx == PM_ALIGNED_PRIEST || mndx == PM_HIGH_PRIEST)
+    if ((mndx == PM_ALIGNED_CLERIC || mndx == PM_HIGH_CLERIC)
             ? !(mmflags & (MM_EPRI | MM_EMIN))
             : (mndx == PM_ANGEL && !(mmflags & MM_EMIN) && !rn2(3))) {
         struct emin *eminp;
@@ -1857,8 +1857,11 @@ struct monst *mtmp, *victim;
     oldtype = monsndx(ptr);
     newtype = (oldtype == PM_KILLER_BEE && !victim) ? PM_QUEEN_BEE
                                                     : little_to_big(oldtype);
+#if 0
+    /* gender-neutral PM_CLERIC now */
     if (newtype == PM_PRIEST && mtmp->female)
         newtype = PM_PRIESTESS;
+#endif
 
     /* growth limits differ depending on method of advancement */
     if (victim) {                       /* killed a monster */
@@ -1914,7 +1917,7 @@ struct monst *mtmp, *victim;
         if (g.mvitals[newtype].mvflags & G_GENOD) { /* allow G_EXTINCT */
             if (canspotmon(mtmp))
                 pline("As %s grows up into %s, %s %s!", mon_nam(mtmp),
-                      an(ptr->mname), mhe(mtmp),
+                      an(pmname(ptr, Mgender(mtmp))), mhe(mtmp),
                       nonliving(ptr) ? "expires" : "dies");
             set_mon_data(mtmp, ptr); /* keep g.mvitals[] accurate */
             mondied(mtmp);
@@ -1932,7 +1935,7 @@ struct monst *mtmp, *victim;
                            (can't happen with 3.6.0 mons[], but perhaps
                            slightly less sexist if prepared for it...) */
                       : (fem && !mtmp->female) ? "female " : "",
-                    ptr->mname);
+                    pmname(ptr, fem));
             pline("%s %s %s.", upstart(y_monnam(mtmp)),
                   (fem != mtmp->female) ? "changes into"
                                         : humanoid(ptr) ? "becomes"
index 291a11f364363945f62f9fe23989a0557f27ab70..a28c94670be3bcbca3024bbf2a10d64f222af220 100644 (file)
@@ -77,9 +77,10 @@ unsigned mgflags;
     unsigned special = 0;
     /* condense multiple tests in macro version down to single */
     boolean has_rogue_ibm_graphics = HAS_ROGUE_IBM_GRAPHICS,
-            is_you = (x == u.ux && y == u.uy),
+            is_you = (x == u.ux && y == u.uy && !u.usteed),
             has_rogue_color = (has_rogue_ibm_graphics
-                               && g.symset[g.currentgraphics].nocolor == 0);
+                               && g.symset[g.currentgraphics].nocolor == 0),
+            do_mon_checks = FALSE;
 
     if (!g.glyphmap_perlevel_flags) {
         /*
@@ -254,6 +255,7 @@ unsigned mgflags;
         else
             mon_color(offset);
         special |= MG_RIDDEN;
+        do_mon_checks = TRUE;
     } else if ((offset = (glyph - GLYPH_BODY_OFF)) >= 0) { /* a corpse */
         idx = objects[CORPSE].oc_class + SYM_OFF_O;
         if (has_rogue_color && iflags.use_color)
@@ -272,6 +274,7 @@ unsigned mgflags;
         /* Disabled for now; anyone want to get reverse video to work? */
         /* is_reverse = TRUE; */
         special |= MG_DETECT;
+        do_mon_checks = TRUE;
     } else if ((offset = (glyph - GLYPH_INVIS_OFF)) >= 0) { /* invisible */
         idx = SYM_INVISIBLE + SYM_OFF_X;
         if (has_rogue_color)
@@ -286,6 +289,7 @@ unsigned mgflags;
         else
             pet_color(offset);
         special |= MG_PET;
+        do_mon_checks = TRUE;
     } else { /* a monster */
         idx = mons[glyph].mlet + SYM_OFF_M;
         if (has_rogue_color && iflags.use_color) {
@@ -302,6 +306,21 @@ unsigned mgflags;
                 color = HI_DOMESTIC;
 #endif
         }
+        do_mon_checks = TRUE;
+    }
+    if (do_mon_checks) {
+        struct monst *m;
+
+        if (is_you) {
+            if (Ugender == FEMALE)
+                special |= MG_FEMALE;
+        } else {
+            /* when hero is riding, steed will be shown at hero's location
+               but has not been placed on the map so m_at() won't find it */
+            m = (x == u.ux && y == u.uy && u.usteed) ? u.usteed : m_at(x, y);
+            if (m && m->female)
+                special |= MG_FEMALE;
+        }
     }
 
     /* These were requested by a blind player to enhance screen reader use */
@@ -354,14 +373,14 @@ const char *str;
 {
     static const char hex[] = "00112233445566778899aAbBcCdDeEfF";
     char *put = buf;
+    unsigned glyphmod[NUM_GLYPHMOD];
 
     if (!str)
         return strcpy(buf, "");
 
     while (*str) {
         if (*str == '\\') {
-            int rndchk, dcount, so, gv, ch = 0, oc = 0;
-            unsigned os = 0;
+            int rndchk, dcount, so, gv;
             const char *dp, *save_str;
 
             save_str = str++;
@@ -380,7 +399,8 @@ const char *str;
                             gv = (gv * 16) + ((int) (dp - hex) / 2);
                         else
                             break;
-                    so = mapglyph(gv, &ch, &oc, &os, 0, 0, 0);
+                    map_glyphmod(0, 0, gv, MG_FLAG_RETURNIDX, glyphmod);
+                    so = glyphmod[GM_TTYCHAR];
                     *put++ = g.showsyms[so];
                     /* 'str' is ready for the next loop iteration and '*str'
                        should not be copied at the end of this iteration */
index 89d77dd2d65594c7a151c5dc61f096884b63c52b..f4260cbc128569a0c1afaab94e0ec843d361e852 100644 (file)
@@ -510,12 +510,12 @@ register struct monst *mtmp;
                         pline(
                              "Wait, %s!  There's a hidden %s named %s there!",
                               m_monnam(mtmp),
-                              g.youmonst.data->mname, g.plname);
+                              pmname(g.youmonst.data, Ugender), g.plname);
                     else
                         pline(
                           "Wait, %s!  There's a %s named %s hiding under %s!",
-                              m_monnam(mtmp), g.youmonst.data->mname, g.plname,
-                              doname(g.level.objects[u.ux][u.uy]));
+                              m_monnam(mtmp), pmname(g.youmonst.data, Ugender),
+                              g.plname, doname(g.level.objects[u.ux][u.uy]));
                     if (obj)
                         obj->spe = save_spe;
                 } else
@@ -537,7 +537,7 @@ register struct monst *mtmp;
             pline("It gets stuck on you.");
         else /* see note about m_monnam() above */
             pline("Wait, %s!  That's a %s named %s!", m_monnam(mtmp),
-                  g.youmonst.data->mname, g.plname);
+                  pmname(g.youmonst.data, Ugender), g.plname);
         if (sticky)
             set_ustuck(mtmp);
         g.youmonst.m_ap_type = M_AP_NOTHING;
@@ -557,13 +557,14 @@ register struct monst *mtmp;
                                            : "disturbs you");
         else /* see note about m_monnam() above */
             pline("Wait, %s!  That %s is really %s named %s!", m_monnam(mtmp),
-                  mimic_obj_name(&g.youmonst), an(mons[u.umonnum].mname),
-                  g.plname);
+                  mimic_obj_name(&g.youmonst),
+                  an(pmname(&mons[u.umonnum], Ugender)), g.plname);
         if (g.multi < 0) { /* this should always be the case */
             char buf[BUFSZ];
 
             Sprintf(buf, "You appear to be %s again.",
-                    Upolyd ? (const char *) an(g.youmonst.data->mname)
+                    Upolyd ? (const char *) an(pmname(g.youmonst.data,
+                                                      flags.female))
                            : (const char *) "yourself");
             unmul(buf); /* immediately stop mimicking */
         }
@@ -793,8 +794,7 @@ boolean youseeit;
      */
 
     if (is_demon(mdat)) {
-        if (mdat != &mons[PM_BALROG]
-            && mdat != &mons[PM_SUCCUBUS] && mdat != &mons[PM_INCUBUS]) {
+        if (mdat != &mons[PM_BALROG] && mdat != &mons[PM_AMOROUS_DEMON]) {
             if (!rn2(13))
                 (void) msummon(mtmp);
         }
@@ -861,7 +861,7 @@ struct permonst *mdat;
         return FALSE;
     } else {
         make_sick(Sick ? Sick / 3L + 1L : (long) rn1(ACURR(A_CON), 20),
-                  mdat->mname, TRUE, SICK_NONVOMITABLE);
+                  mdat->pmnames[NEUTRAL], TRUE, SICK_NONVOMITABLE);
         return TRUE;
     }
 }
@@ -915,7 +915,7 @@ struct monst *mon;
             via_amul = FALSE,
             gotprot = is_you ? (EProtection != 0L)
                              /* high priests have innate protection */
-                             : (mon->data == &mons[PM_HIGH_PRIEST]);
+                             : (mon->data == &mons[PM_HIGH_CLERIC]);
 
     for (o = is_you ? g.invent : mon->minvent; o; o = o->nobj) {
         /* a_can field is only applicable for armor (which must be worn) */
@@ -948,7 +948,7 @@ struct monst *mon;
            protection is too easy); it confers minimum mc 1 instead of 0 */
         if ((is_you && ((HProtection && u.ublessed > 0) || u.uspellprot))
             /* aligned priests and angels have innate intrinsic Protection */
-            || (mon->data == &mons[PM_ALIGNED_PRIEST] || is_minion(mon->data)))
+            || (mon->data == &mons[PM_ALIGNED_CLERIC] || is_minion(mon->data)))
             mc = 1;
     }
     return mc;
@@ -1034,7 +1034,7 @@ register struct attack *mattk;
     if (mhm.damage) {
         if (Half_physical_damage
             /* Mitre of Holiness */
-            || (Role_if(PM_PRIEST) && uarmh && is_quest_artifact(uarmh)
+            || (Role_if(PM_CLERIC) && uarmh && is_quest_artifact(uarmh)
                 && (is_undead(mtmp->data) || is_demon(mtmp->data)
                     || is_vampshifter(mtmp))))
             mhm.damage = (mhm.damage + 1) / 2;
@@ -1543,7 +1543,7 @@ struct attack *mattk;
                 break;
             You("turn to stone...");
             g.killer.format = KILLED_BY;
-            Strcpy(g.killer.name, mtmp->data->mname);
+            Strcpy(g.killer.name, pmname(mtmp->data, Mgender(mtmp)));
             done(STONING);
         }
         break;
@@ -1751,8 +1751,7 @@ struct attack *mattk; /* non-Null: current attack; Null: general capability */
        for seduction, both pass the could_seduce() test;
        incubi/succubi have three attacks, their claw attacks for damage
        don't pass the test */
-    if ((pagr->mlet != S_NYMPH
-         && pagr != &mons[PM_INCUBUS] && pagr != &mons[PM_SUCCUBUS])
+    if ((pagr->mlet != S_NYMPH && pagr != &mons[PM_AMOROUS_DEMON])
         || (adtyp != AD_SEDU && adtyp != AD_SSEX && adtyp != AD_SITM))
         return 0;
 
@@ -1765,7 +1764,8 @@ doseduce(mon)
 struct monst *mon;
 {
     struct obj *ring, *nring;
-    boolean fem = (mon->data == &mons[PM_SUCCUBUS]); /* otherwise incubus */
+    boolean fem = (mon->data == &mons[PM_AMOROUS_DEMON]
+                   && Mgender(mon) == FEMALE); /* otherwise incubus */
     boolean seewho, naked; /* True iff no armor */
     int attr_tot, tried_gloves = 0;
     char qbuf[QBUFSZ], Who[QBUFSZ];
@@ -2232,7 +2232,8 @@ struct attack *mattk;
                     && (perceives(mtmp->data) || !Invis)) {
                     if (Blind)
                         pline("As a blind %s, you cannot defend yourself.",
-                              g.youmonst.data->mname);
+                              pmname(g.youmonst.data,
+                                     flags.female ? FEMALE : MALE));
                     else {
                         if (mon_reflects(mtmp,
                                          "Your gaze is reflected by %s %s."))
index 03f0b27c0ce6f79af2817ccf5db7ecc36a5a74b8..c6a7dec5813b5b977321f26ebc77608b9561a6d8 100644 (file)
@@ -196,7 +196,7 @@ boolean talk;
             EMIN(mon)->renegade = FALSE;
         }
     } else if (mnum != PM_SHOPKEEPER && mnum != PM_GUARD
-               && mnum != PM_ALIGNED_PRIEST && mnum != PM_HIGH_PRIEST) {
+               && mnum != PM_ALIGNED_CLERIC && mnum != PM_HIGH_CLERIC) {
         /* This was mons[mnum].pxlth == 0 but is this restriction
            appropriate or necessary now that the structures are separate? */
         mon = makemon(&mons[mnum], u.ux, u.uy, MM_EMIN);
index 4b3e7c5885eac02c1ea27e00cefcc49d30acae35..c79068bf197fd7b5cac7193eda4facb76cb19b7f 100644 (file)
@@ -569,7 +569,7 @@ fixup_special()
                 set_corpsenm(otmp, rndmonnum());
             }
         }
-    } else if (Role_if(PM_PRIEST) && In_quest(&u.uz)) {
+    } else if (Role_if(PM_CLERIC) && In_quest(&u.uz)) {
         /* less chance for undead corpses (lured from lower morgues) */
         g.level.flags.graveyard = 1;
     } else if (Is_stronghold(&u.uz)) {
@@ -742,7 +742,7 @@ stolen_booty(VOID_ARGS)
         if (DEADMONSTER(mtmp))
             continue;
 
-        if (is_orc(mtmp->data) && !has_mname(mtmp) && rn2(10)) {
+        if (is_orc(mtmp->data) && !has_mgivenname(mtmp) && rn2(10)) {
             /*
              * We'll consider the orc captain from the level
              * description to be the captain of a rival orc horde
index d1e7c7cbb42a4c2607f50344ec15152add1f8c3c..405efb312dd13b377a791345a9439b990b839f09 100644 (file)
@@ -250,10 +250,10 @@ mk_zoo_thronemon(x,y)
 int x,y;
 {
     int i = rnd(level_difficulty());
-    int pm = (i > 9) ? PM_OGRE_KING
-        : (i > 5) ? PM_ELVENKING
-        : (i > 2) ? PM_DWARF_KING
-        : PM_GNOME_KING;
+    int pm = (i > 9) ? PM_OGRE_TYRANT
+        : (i > 5) ? PM_ELVENMONARCH
+        : (i > 2) ? PM_DWARF_RULER
+        : PM_GNOME_RULER;
     struct monst *mon = makemon(&mons[pm], x, y, NO_MM_FLAGS);
 
     if (mon) {
index 1676dc07267f7b3747c49044da24c397ad7d525c..c6136e779bc26c5bc5d3fdbf0763ca5b98a85951 100644 (file)
--- a/src/mon.c
+++ b/src/mon.c
@@ -84,14 +84,17 @@ const char *msg;
             /* bad if not fmons list or if not vault guard */
             if (strcmp(msg, "fmon") || !mtmp->isgd)
                 impossible("dead monster on %s; %s at <%d,%d>",
-                           msg, mons[mndx].mname, mx, my);
+                           msg, mons[mndx].pmnames[NEUTRAL],
+                           mx, my);
 #endif
             return;
         }
         if (chk_geno && (g.mvitals[mndx].mvflags & G_GENOD) != 0)
-            impossible("genocided %s in play (%s)", mons[mndx].mname, msg);
+            impossible("genocided %s in play (%s)",
+                        pmname(&mons[mndx], Mgender(mtmp)), msg);
         if (mtmp->mtame && !mtmp->mpeaceful)
-            impossible("tame %s is not peaceful (%s)", mons[mndx].mname, msg);
+            impossible("tame %s is not peaceful (%s)",
+                        pmname(&mons[mndx], Mgender(mtmp)), msg);
     }
     if (mtmp->isshk && !has_eshk(mtmp))
         impossible("shk without eshk (%s)", msg);
@@ -151,7 +154,7 @@ const char *msg;
            but only until the pet finishes eating a mimic corpse */
         if (!(is_mimic || mtmp->meating))
             impossible("non-mimic (%s) posing as %s (%s)",
-                       mptr->mname, what, msg);
+                       mptr->pmnames[NEUTRAL], what, msg);
         if (!(accessible(mx, my) || passes_walls(mptr))) {
             char buf[BUFSZ];
             const char *typnam = levltyp_to_name(levl[mx][my].typ);
@@ -337,7 +340,7 @@ int mndx;
         mndx = PM_ELF;
         break;
     case PM_VAMPIRE:
-    case PM_VAMPIRE_LORD:
+    case PM_VAMPIRE_LEADER:
 #if 0 /* DEFERRED */
     case PM_VAMPIRE_MAGE:
 #endif
@@ -378,7 +381,7 @@ int mndx, mode;
         mndx = mode ? PM_BARBARIAN : PM_HUMAN;
         break;
     case PM_NEANDERTHAL:
-        mndx = mode ? PM_CAVEMAN : PM_HUMAN;
+        mndx = mode ? PM_CAVE_DWELLER : PM_HUMAN;
         break;
     case PM_ATTENDANT:
         mndx = mode ? PM_HEALER : PM_HUMAN;
@@ -390,7 +393,7 @@ int mndx, mode;
         mndx = mode ? PM_MONK : PM_HUMAN;
         break;
     case PM_ACOLYTE:
-        mndx = mode ? PM_PRIEST : PM_HUMAN;
+        mndx = mode ? PM_CLERIC : PM_HUMAN;
         break;
     case PM_HUNTER:
         mndx = mode ? PM_RANGER : PM_HUMAN;
@@ -514,7 +517,7 @@ unsigned corpseflags;
         (void) mksobj_at(WORM_TOOTH, x, y, TRUE, FALSE);
         goto default_1;
     case PM_VAMPIRE:
-    case PM_VAMPIRE_LORD:
+    case PM_VAMPIRE_LEADER:
         /* include mtmp in the mkcorpstat() call */
         num = undead_to_corpse(mndx);
         corpstatflags |= CORPSTAT_INIT;
@@ -546,19 +549,19 @@ unsigned corpseflags;
         num = d(2, 6);
         while (num--)
             obj = mksobj_at(IRON_CHAIN, x, y, TRUE, FALSE);
-        free_mname(mtmp); /* don't christen obj */
+        free_mgivenname(mtmp); /* don't christen obj */
         break;
     case PM_GLASS_GOLEM:
         num = d(2, 4); /* very low chance of creating all glass gems */
         while (num--)
             obj = mksobj_at((LAST_GEM + rnd(9)), x, y, TRUE, FALSE);
-        free_mname(mtmp);
+        free_mgivenname(mtmp);
         break;
     case PM_CLAY_GOLEM:
         obj = mksobj_at(ROCK, x, y, FALSE, FALSE);
         obj->quan = (long) (rn2(20) + 50);
         obj->owt = weight(obj);
-        free_mname(mtmp);
+        free_mgivenname(mtmp);
         break;
     case PM_STONE_GOLEM:
         corpstatflags &= ~CORPSTAT_INIT;
@@ -570,24 +573,24 @@ unsigned corpseflags;
         while (num--) {
             obj = mksobj_at(QUARTERSTAFF, x, y, TRUE, FALSE);
         }
-        free_mname(mtmp);
+        free_mgivenname(mtmp);
         break;
     case PM_LEATHER_GOLEM:
         num = d(2, 4);
         while (num--)
             obj = mksobj_at(LEATHER_ARMOR, x, y, TRUE, FALSE);
-        free_mname(mtmp);
+        free_mgivenname(mtmp);
         break;
     case PM_GOLD_GOLEM:
         /* Good luck gives more coins */
         obj = mkgold((long) (200 - rnl(101)), x, y);
-        free_mname(mtmp);
+        free_mgivenname(mtmp);
         break;
     case PM_PAPER_GOLEM:
         num = rnd(4);
         while (num--)
             obj = mksobj_at(SCR_BLANK_PAPER, x, y, TRUE, FALSE);
-        free_mname(mtmp);
+        free_mgivenname(mtmp);
         break;
     /* expired puddings will congeal into a large blob;
        like dragons, relies on the order remaining consistent */
@@ -604,7 +607,7 @@ unsigned corpseflags;
             pudding_merge_message(obj, otmp);
             obj = obj_meld(&obj, &otmp);
         }
-        free_mname(mtmp);
+        free_mgivenname(mtmp);
         return obj;
     default:
  default_1:
@@ -635,8 +638,8 @@ unsigned corpseflags;
     if (g.context.bypasses)
         bypass_obj(obj);
 
-    if (has_mname(mtmp))
-        obj = oname(obj, MNAME(mtmp));
+    if (has_mgivenname(mtmp))
+        obj = oname(obj, MGIVENNAME(mtmp));
 
     /*  Avoid "It was hidden under a green mold corpse!"
      *  during Blind combat. An unseen monster referred to as "it"
@@ -2118,9 +2121,9 @@ struct monst *mtmp2, *mtmp1;
 
     if (!mtmp2->mextra)
         mtmp2->mextra = newmextra();
-    if (MNAME(mtmp1)) {
-        new_mname(mtmp2, (int) strlen(MNAME(mtmp1)) + 1);
-        Strcpy(MNAME(mtmp2), MNAME(mtmp1));
+    if (MGIVENNAME(mtmp1)) {
+        new_mgivenname(mtmp2, (int) strlen(MGIVENNAME(mtmp1)) + 1);
+        Strcpy(MGIVENNAME(mtmp2), MGIVENNAME(mtmp1));
     }
     if (EGD(mtmp1)) {
         if (!EGD(mtmp2))
@@ -2158,8 +2161,8 @@ struct monst *m;
     struct mextra *x = m->mextra;
 
     if (x) {
-        if (x->mname)
-            free((genericptr_t) x->mname);
+        if (x->mgivenname)
+            free((genericptr_t) x->mgivenname);
         if (x->egd)
             free((genericptr_t) x->egd);
         if (x->epri)
@@ -2514,7 +2517,7 @@ boolean was_swallowed; /* digestion */
                 if (magr == &g.youmonst) {
                     There("is an explosion in your %s!", body_part(STOMACH));
                     Sprintf(g.killer.name, "%s explosion",
-                            s_suffix(mdat->mname));
+                            s_suffix(pmname(mdat, Mgender(mon))));
                     losehp(Maybe_Half_Phys(tmp), g.killer.name, KILLED_BY_AN);
                 } else {
                     You_hear("an explosion.");
@@ -2531,7 +2534,8 @@ boolean was_swallowed; /* digestion */
                 return FALSE;
             }
 
-            Sprintf(g.killer.name, "%s explosion", s_suffix(mdat->mname));
+            Sprintf(g.killer.name, "%s explosion",
+                    s_suffix(pmname(mdat, Mgender(mon))));
             g.killer.format = KILLED_BY_AN;
             explode(mon->mx, mon->my, -1, tmp, MON_EXPLODE, EXPL_NOXIOUS);
             g.killer.name[0] = '\0';
@@ -2649,8 +2653,8 @@ struct monst *mdef;
            so that saved monster traits won't retain any stale
            item-conferred attributes */
         otmp = mkcorpstat(STATUE, mdef, mdef->data, x, y, CORPSTAT_NONE);
-        if (has_mname(mdef))
-            otmp = oname(otmp, MNAME(mdef));
+        if (has_mgivenname(mdef))
+            otmp = oname(otmp, MGIVENNAME(mdef));
         while ((obj = oldminvent) != 0) {
             oldminvent = obj->nobj;
             obj->nobj = 0; /* avoid merged-> obfree-> dealloc_obj-> panic */
@@ -2798,7 +2802,7 @@ int xkill_flags; /* 1: suppress message, 2: suppress corpse, 4: pacifist */
         u.uconduct.killer++;
 
     if (!nomsg) {
-        boolean namedpet = has_mname(mtmp) && !Hallucination;
+        boolean namedpet = has_mgivenname(mtmp) && !Hallucination;
 
         You("%s %s!",
             nonliving(mtmp->data) ? "destroy" : "kill",
@@ -2987,7 +2991,7 @@ struct monst *mtmp;
             pline("%s solidifies...", Monnam(mtmp));
         if (newcham(mtmp, &mons[PM_STONE_GOLEM], FALSE, FALSE)) {
             if (canseemon(mtmp))
-                pline("Now it's %s.", an(mtmp->data->mname));
+                pline("Now it's %s.", an(pmname(mtmp->data, Mgender(mtmp))));
         } else {
             if (canseemon(mtmp))
                 pline("... and returns to normal.");
@@ -3415,7 +3419,7 @@ boolean via_attack;
             }
         }
         if (got_mad && !Hallucination) {
-            const char *who = q_guardian->mname;
+            const char *who = q_guardian->pmnames[NEUTRAL];
 
             if (got_mad > 1)
                 who = makeplural(who);
@@ -3888,7 +3892,7 @@ struct monst *mon;
             break; /* leave mndx as is */
         wolfchance = 3;
     /*FALLTHRU*/
-    case PM_VAMPIRE_LORD: /* vampire lord or Vlad can become wolf */
+    case PM_VAMPIRE_LEADER: /* vampire lord or Vlad can become wolf */
         if (!rn2(wolfchance) && !uppercase_only) {
             mndx = PM_WOLF;
             break;
@@ -4039,7 +4043,7 @@ struct monst *mon;
             mndx = pick_animal();
         break;
     case PM_VLAD_THE_IMPALER:
-    case PM_VAMPIRE_LORD:
+    case PM_VAMPIRE_LEADER:
     case PM_VAMPIRE:
         mndx = pickvampshape(mon);
         break;
@@ -4097,7 +4101,7 @@ struct monst *mon;
                 mndx = NON_PM;
                 break;
             }
-            mndx = name_to_mon(buf);
+            mndx = name_to_mon(buf, (int *) 0);
             if (mndx == NON_PM) {
                 /* didn't get a type, so check whether it's a class
                    (single letter or text match with def_monsyms[]) */
@@ -4222,7 +4226,7 @@ boolean msg;      /* "The oldmon turns into a newmon!" */
     }
     /* we need this one whether msg is true or not */
     Strcpy(l_oldname, x_monnam(mtmp, ARTICLE_THE, (char *) 0,
-                               has_mname(mtmp) ? SUPPRESS_SADDLE : 0, FALSE));
+                               has_mgivenname(mtmp) ? SUPPRESS_SADDLE : 0, FALSE));
 
     /* mdat = 0 -> caller wants a random monster shape */
     if (mdat == 0) {
@@ -4255,7 +4259,7 @@ boolean msg;      /* "The oldmon turns into a newmon!" */
      * polymorphed, so dropping rank for mplayers seems reasonable.
      */
     if (In_endgame(&u.uz) && is_mplayer(olddata)
-        && has_mname(mtmp) && (p = strstr(MNAME(mtmp), " the ")) != 0)
+        && has_mgivenname(mtmp) && (p = strstr(MGIVENNAME(mtmp), " the ")) != 0)
         *p = '\0';
 
     if (mtmp->wormno) { /* throw tail away */
@@ -4646,9 +4650,9 @@ char *str;
 
     for (mtmp = fmon; mtmp; mtmp = mtmp->nmon) {
         if (DEADMONSTER(mtmp)
-            || mtmp->data != &mons[PM_GHOST] || !has_mname(mtmp))
+            || mtmp->data != &mons[PM_GHOST] || !has_mgivenname(mtmp))
             continue;
-        if (!strcmpi(MNAME(mtmp), str))
+        if (!strcmpi(MGIVENNAME(mtmp), str))
             return mtmp;
     }
     return (struct monst *) 0;
@@ -4694,8 +4698,7 @@ struct permonst *mdat;
             You("notice a bovine smell.");
             msg_given = TRUE;
             break;
-        case PM_CAVEMAN:
-        case PM_CAVEWOMAN:
+        case PM_CAVE_DWELLER:
         case PM_BARBARIAN:
         case PM_NEANDERTHAL:
             You("smell body odor.");
index e15fef59ac651cbe0d2036f554586a44c021d745..e78806dbe875e29570549d93a8e4e9993a0f6cd5 100644 (file)
@@ -681,15 +681,17 @@ struct permonst *ptr;
 struct alt_spl {
     const char *name;
     short pm_val;
+    int genderhint;
 };
 
 /* figure out what type of monster a user-supplied string is specifying;
    ingore anything past the monster name */
 int
-name_to_mon(in_str)
+name_to_mon(in_str, gender_name_var)
 const char *in_str;
+int *gender_name_var;
 {
-    return name_to_monplus(in_str, (const char **) 0);
+    return name_to_monplus(in_str, (const char **) 0, gender_name_var);
 }
 
 /* figure out what type of monster a user-supplied string is specifying;
@@ -697,9 +699,10 @@ const char *in_str;
    caller wants to strip off the name and it matches one of the alternate
    names rather the canonical mons[].mname */
 int
-name_to_monplus(in_str, remainder_p)
+name_to_monplus(in_str, remainder_p, gender_name_var)
 const char *in_str;
 const char **remainder_p;
+int *gender_name_var;
 {
     /* Be careful.  We must check the entire string in case it was
      * something such as "ettin zombie corpse".  The calling routine
@@ -717,7 +720,8 @@ const char **remainder_p;
     register int mntmp = NON_PM;
     register char *s, *str, *term;
     char buf[BUFSZ];
-    int len, slen;
+    int len, slen, mgend;
+    boolean exact_match = FALSE;
 
     if (remainder_p)
         *remainder_p = (const char *) 0;
@@ -749,70 +753,72 @@ const char **remainder_p;
     {
         static const struct alt_spl names[] = {
             /* Alternate spellings */
-            { "grey dragon", PM_GRAY_DRAGON },
-            { "baby grey dragon", PM_BABY_GRAY_DRAGON },
-            { "grey unicorn", PM_GRAY_UNICORN },
-            { "grey ooze", PM_GRAY_OOZE },
-            { "gray-elf", PM_GREY_ELF },
-            { "mindflayer", PM_MIND_FLAYER },
-            { "master mindflayer", PM_MASTER_MIND_FLAYER },
+            { "grey dragon", PM_GRAY_DRAGON, NEUTRAL },
+            { "baby grey dragon", PM_BABY_GRAY_DRAGON, NEUTRAL },
+            { "grey unicorn", PM_GRAY_UNICORN, NEUTRAL },
+            { "grey ooze", PM_GRAY_OOZE, NEUTRAL },
+            { "gray-elf", PM_GREY_ELF, NEUTRAL },
+            { "mindflayer", PM_MIND_FLAYER, NEUTRAL },
+            { "master mindflayer", PM_MASTER_MIND_FLAYER, NEUTRAL },
             /* More alternates; priest and priestess are separate monster
                types but that isn't the case for {aligned,high} priests */
-            { "aligned priestess", PM_ALIGNED_PRIEST },
-            { "high priestess", PM_HIGH_PRIEST },
+            { "aligned priestess", PM_ALIGNED_CLERIC, NEUTRAL },
+            { "high priestess", PM_HIGH_CLERIC, NEUTRAL },
             /* Inappropriate singularization by -ves check above */
-            { "master of thief", PM_MASTER_OF_THIEVES },
+            { "master of thief", PM_MASTER_OF_THIEVES, NEUTRAL },
             /* Potential misspellings where we want to avoid falling back
                to the rank title prefix (input has been singularized) */
-            { "master thief", PM_MASTER_OF_THIEVES },
-            { "master of assassin", PM_MASTER_ASSASSIN },
+            { "master thief", PM_MASTER_OF_THIEVES, NEUTRAL },
+            { "master of assassin", PM_MASTER_ASSASSIN, NEUTRAL },
             /* Outdated names */
-            { "invisible stalker", PM_STALKER },
-            { "high-elf", PM_ELVENKING }, /* PM_HIGH_ELF is obsolete */
+            { "invisible stalker", PM_STALKER, NEUTRAL },
+            { "high-elf", PM_ELVENMONARCH, NEUTRAL }, /* PM_HIGH_ELF is obsolete */
             /* other misspellings or incorrect words */
-            { "wood-elf", PM_WOODLAND_ELF },
-            { "wood elf", PM_WOODLAND_ELF },
-            { "woodland nymph", PM_WOOD_NYMPH },
-            { "halfling", PM_HOBBIT },    /* potential guess for polyself */
-            { "genie", PM_DJINNI }, /* potential guess for ^G/#wizgenesis */
+            { "wood-elf", PM_WOODLAND_ELF, NEUTRAL },
+            { "wood elf", PM_WOODLAND_ELF, NEUTRAL },
+            { "woodland nymph", PM_WOOD_NYMPH, NEUTRAL },
+            { "halfling", PM_HOBBIT, NEUTRAL },    /* potential guess for polyself */
+            { "genie", PM_DJINNI, NEUTRAL }, /* potential guess for ^G/#wizgenesis */
             /* prefix used to workaround duplicate monster names for
                monsters with alternate forms */
-            { "human wererat", PM_HUMAN_WERERAT },
-            { "human werejackal", PM_HUMAN_WEREJACKAL },
-            { "human werewolf", PM_HUMAN_WEREWOLF },
+            { "human wererat", PM_HUMAN_WERERAT, NEUTRAL },
+            { "human werejackal", PM_HUMAN_WEREJACKAL, NEUTRAL },
+            { "human werewolf", PM_HUMAN_WEREWOLF, NEUTRAL },
             /* for completeness */
-            { "rat wererat", PM_WERERAT },
-            { "jackal werejackal", PM_WEREJACKAL },
-            { "wolf werewolf", PM_WEREWOLF },
+            { "rat wererat", PM_WERERAT, NEUTRAL },
+            { "jackal werejackal", PM_WEREJACKAL, NEUTRAL },
+            { "wolf werewolf", PM_WEREWOLF, NEUTRAL },
             /* Hyphenated names -- it would be nice to handle these via
                fuzzymatch() but it isn't able to ignore trailing stuff */
-            { "ki rin", PM_KI_RIN },
-            { "kirin", PM_KI_RIN },
-            { "uruk hai", PM_URUK_HAI },
-            { "orc captain", PM_ORC_CAPTAIN },
-            { "woodland elf", PM_WOODLAND_ELF },
-            { "green elf", PM_GREEN_ELF },
-            { "grey elf", PM_GREY_ELF },
-            { "gray elf", PM_GREY_ELF },
-            { "elf lord", PM_ELF_LORD },
-            { "olog hai", PM_OLOG_HAI },
-            { "arch lich", PM_ARCH_LICH },
-            { "archlich", PM_ARCH_LICH },
+            { "ki rin", PM_KI_RIN, NEUTRAL },
+            { "kirin", PM_KI_RIN, NEUTRAL },
+            { "uruk hai", PM_URUK_HAI, NEUTRAL },
+            { "orc captain", PM_ORC_CAPTAIN, NEUTRAL },
+            { "woodland elf", PM_WOODLAND_ELF, NEUTRAL },
+            { "green elf", PM_GREEN_ELF, NEUTRAL },
+            { "grey elf", PM_GREY_ELF, NEUTRAL },
+            { "gray elf", PM_GREY_ELF, NEUTRAL },
+            { "elf lady", PM_ELF_NOBLE, FEMALE },
+            { "elf lord", PM_ELF_NOBLE, MALE },
+            { "elf noble", PM_ELF_NOBLE, NEUTRAL },
+            { "olog hai", PM_OLOG_HAI, NEUTRAL },
+            { "arch lich", PM_ARCH_LICH, NEUTRAL },
+            { "archlich", PM_ARCH_LICH, NEUTRAL },
             /* Some irregular plurals */
-            { "incubi", PM_INCUBUS },
-            { "succubi", PM_SUCCUBUS },
-            { "violet fungi", PM_VIOLET_FUNGUS },
-            { "homunculi", PM_HOMUNCULUS },
-            { "baluchitheria", PM_BALUCHITHERIUM },
-            { "lurkers above", PM_LURKER_ABOVE },
-            { "cavemen", PM_CAVEMAN },
-            { "cavewomen", PM_CAVEWOMAN },
-            { "watchmen", PM_WATCHMAN },
-            { "djinn", PM_DJINNI },
-            { "mumakil", PM_MUMAK },
-            { "erinyes", PM_ERINYS },
+            { "incubi", PM_AMOROUS_DEMON, MALE },
+            { "succubi", PM_AMOROUS_DEMON, FEMALE },
+            { "violet fungi", PM_VIOLET_FUNGUS, NEUTRAL },
+            { "homunculi", PM_HOMUNCULUS, NEUTRAL },
+            { "baluchitheria", PM_BALUCHITHERIUM, NEUTRAL },
+            { "lurkers above", PM_LURKER_ABOVE, NEUTRAL },
+            { "cavemen", PM_CAVE_DWELLER, MALE },
+            { "cavewomen", PM_CAVE_DWELLER, FEMALE },
+            { "watchmen", PM_WATCHMAN, NEUTRAL },
+            { "djinn", PM_DJINNI, NEUTRAL },
+            { "mumakil", PM_MUMAK, NEUTRAL },
+            { "erinyes", PM_ERINYS, NEUTRAL },
             /* end of list */
-            { 0, NON_PM }
+            { 0, NON_PM, NEUTRAL }
         };
         register const struct alt_spl *namep;
 
@@ -823,18 +829,28 @@ const char **remainder_p;
                 && (!str[len] || str[len] == ' ' || str[len] == '\'')) {
                 if (remainder_p)
                     *remainder_p = in_str + (&str[len] - buf);
+                if (gender_name_var != (int *) 0)
+                    *gender_name_var = namep->genderhint;
                 return namep->pm_val;
             }
         }
     }
 
     for (len = 0, i = LOW_PM; i < NUMMONS; i++) {
-        register int m_i_len = (int) strlen(mons[i].mname);
+      for (mgend = MALE; mgend < NUM_MGENDERS; mgend++) {
+        int m_i_len;
 
-        if (m_i_len > len && !strncmpi(mons[i].mname, str, m_i_len)) {
+        if (!mons[i].pmnames[mgend])
+            continue;
+
+        m_i_len = (int) strlen(mons[i].pmnames[mgend]);
+        if (m_i_len > len && !strncmpi(mons[i].pmnames[mgend], str, m_i_len)) {
             if (m_i_len == slen) {
                 mntmp = i;
                 len = m_i_len;
+                if (gender_name_var != (int *) 0)
+                    *gender_name_var = mgend;
+                exact_match = TRUE;
                 break; /* exact match */
             } else if (slen > m_i_len
                        && (str[m_i_len] == ' '
@@ -850,6 +866,9 @@ const char **remainder_p;
                 len = m_i_len;
             }
         }
+      }
+      if (exact_match)
+        break;
     }
     if (mntmp == NON_PM)
         mntmp = title_to_mon(str, (int *) 0, &len);
@@ -868,8 +887,8 @@ int *mndx_p;
     /* Single letters are matched against def_monsyms[].sym; words
        or phrases are first matched against def_monsyms[].explain
        to check class description; if not found there, then against
-       mons[].mname to test individual monster types.  Input can be a
-       substring of the full description or mname, but to be accepted,
+       mons[].pmnames[] to test individual monster types.  Input can be a
+       substring of the full description or pmname, but to be accepted,
        such partial matches must start at beginning of a word.  Some
        class descriptions include "foo or bar" and "foo or other foo"
        so we don't want to accept "or", "other", "or other" there. */
@@ -881,16 +900,16 @@ int *mndx_p;
     static NEARDATA const struct alt_spl truematch[] = {
         /* "long worm" won't match "worm" class but would accidentally match
            "long worm tail" class before the comparison with monster types */
-        { "long worm", PM_LONG_WORM },
+        { "long worm", PM_LONG_WORM, NEUTRAL },
         /* matches wrong--or at least suboptimal--class */
-        { "demon", -S_DEMON }, /* hits "imp or minor demon" */
+        { "demon", -S_DEMON, NEUTRAL }, /* hits "imp or minor demon" */
         /* matches specific monster (overly restrictive) */
-        { "devil", -S_DEMON }, /* always "horned devil" */
+        { "devil", -S_DEMON, NEUTRAL }, /* always "horned devil" */
         /* some plausible guesses which need help */
-        { "bug", -S_XAN },  /* would match bugbear... */
-        { "fish", -S_EEL }, /* wouldn't match anything */
+        { "bug", -S_XAN, NEUTRAL },  /* would match bugbear... */
+        { "fish", -S_EEL, NEUTRAL }, /* wouldn't match anything */
         /* end of list */
-        { 0, NON_PM }
+        { 0, NON_PM, NEUTRAL}
     };
     const char *p, *x;
     int i, len;
@@ -941,7 +960,7 @@ int *mndx_p;
                 return i;
         }
         /* check individual species names */
-        i = name_to_mon(in_str);
+        i = name_to_mon(in_str, (int *) 0);
         if (i != NON_PM) {
             if (mndx_p)
                 *mndx_p = i;
@@ -1014,11 +1033,11 @@ static const short grownups[][2] = {
     { PM_PONY, PM_HORSE },
     { PM_HORSE, PM_WARHORSE },
     { PM_KOBOLD, PM_LARGE_KOBOLD },
-    { PM_LARGE_KOBOLD, PM_KOBOLD_LORD },
-    { PM_GNOME, PM_GNOME_LORD },
-    { PM_GNOME_LORD, PM_GNOME_KING },
-    { PM_DWARF, PM_DWARF_LORD },
-    { PM_DWARF_LORD, PM_DWARF_KING },
+    { PM_LARGE_KOBOLD, PM_KOBOLD_LEADER },
+    { PM_GNOME, PM_GNOME_LEADER },
+    { PM_GNOME_LEADER, PM_GNOME_RULER },
+    { PM_DWARF, PM_DWARF_LEADER },
+    { PM_DWARF_LEADER, PM_DWARF_RULER },
     { PM_MIND_FLAYER, PM_MASTER_MIND_FLAYER },
     { PM_ORC, PM_ORC_CAPTAIN },
     { PM_HILL_ORC, PM_ORC_CAPTAIN },
@@ -1026,17 +1045,17 @@ static const short grownups[][2] = {
     { PM_URUK_HAI, PM_ORC_CAPTAIN },
     { PM_SEWER_RAT, PM_GIANT_RAT },
     { PM_CAVE_SPIDER, PM_GIANT_SPIDER },
-    { PM_OGRE, PM_OGRE_LORD },
-    { PM_OGRE_LORD, PM_OGRE_KING },
-    { PM_ELF, PM_ELF_LORD },
-    { PM_WOODLAND_ELF, PM_ELF_LORD },
-    { PM_GREEN_ELF, PM_ELF_LORD },
-    { PM_GREY_ELF, PM_ELF_LORD },
-    { PM_ELF_LORD, PM_ELVENKING },
+    { PM_OGRE, PM_OGRE_LEADER },
+    { PM_OGRE_LEADER, PM_OGRE_TYRANT },
+    { PM_ELF, PM_ELF_NOBLE },
+    { PM_WOODLAND_ELF, PM_ELF_NOBLE },
+    { PM_GREEN_ELF, PM_ELF_NOBLE },
+    { PM_GREY_ELF, PM_ELF_NOBLE },
+    { PM_ELF_NOBLE, PM_ELVENMONARCH },
     { PM_LICH, PM_DEMILICH },
     { PM_DEMILICH, PM_MASTER_LICH },
     { PM_MASTER_LICH, PM_ARCH_LICH },
-    { PM_VAMPIRE, PM_VAMPIRE_LORD },
+    { PM_VAMPIRE, PM_VAMPIRE_LEADER },
     { PM_BAT, PM_GIANT_BAT },
     { PM_BABY_GRAY_DRAGON, PM_GRAY_DRAGON },
     { PM_BABY_SILVER_DRAGON, PM_SILVER_DRAGON },
@@ -1063,11 +1082,11 @@ static const short grownups[][2] = {
     { PM_SERGEANT, PM_LIEUTENANT },
     { PM_LIEUTENANT, PM_CAPTAIN },
     { PM_WATCHMAN, PM_WATCH_CAPTAIN },
-    { PM_ALIGNED_PRIEST, PM_HIGH_PRIEST },
+    { PM_ALIGNED_CLERIC, PM_HIGH_CLERIC },
     { PM_STUDENT, PM_ARCHEOLOGIST },
     { PM_ATTENDANT, PM_HEALER },
     { PM_PAGE, PM_KNIGHT },
-    { PM_ACOLYTE, PM_PRIEST },
+    { PM_ACOLYTE, PM_CLERIC },
     { PM_APPRENTICE, PM_WIZARD },
     { PM_MANES, PM_LEMURE },
     { PM_KEYSTONE_KOP, PM_KOP_SERGEANT },
index 1955f37a0348d8af9d2f0525a8e7cb4e447bef98..2e44b5413e5837eee5ccac9077daec2c5f60ff23 100644 (file)
  */
 #define MON(nam, sym, lvl, gen, atk, siz, mr1, mr2, flg1, flg2, flg3, d, col) \
     {                                                                      \
-        nam, sym, lvl, gen, atk, siz, mr1, mr2, flg1, flg2, flg3, d, C(col)   \
+        {(const char *) 0, (const char *) 0, nam}, \
+        sym, lvl, gen, atk, siz, mr1, mr2, flg1, flg2, flg3, d, C(col)   \
+    }
+#define MON3(namm, namf, namn, sym, lvl, gen, atk, siz, mr1, mr2, flg1, flg2, flg3, d, col) \
+    {                                                                      \
+        {namm, namf, namn}, \
+        sym, lvl, gen, atk, siz, mr1, mr2, flg1, flg2, flg3, d, C(col)   \
     }
 /* LVL() and SIZ() collect several fields to cut down on number of args
  * for MON()
@@ -436,7 +442,8 @@ NEARDATA struct permonst mons_init[] = {
           NO_ATTK),
         SIZ(1250, 250, MS_GROWL, MZ_LARGE), 0, 0, M1_HUMANOID | M1_OMNIVORE,
         M2_STRONG | M2_COLLECT, M3_INFRAVISIBLE | M3_INFRAVISION, 5, CLR_BROWN),
-    MON("dwarf lord", S_HUMANOID, LVL(4, 6, 10, 10, 5), (G_GENO | 2),
+    MON3("dwarf lord", "dwarf lady", "dwarf leader",
+        S_HUMANOID, LVL(4, 6, 10, 10, 5), (G_GENO | 2),
         A(ATTK(AT_WEAP, AD_PHYS, 2, 4), ATTK(AT_WEAP, AD_PHYS, 2, 4), NO_ATTK,
           NO_ATTK, NO_ATTK, NO_ATTK),
         SIZ(900, 300, MS_HUMANOID, MZ_HUMAN), 0, 0,
@@ -444,12 +451,13 @@ NEARDATA struct permonst mons_init[] = {
         M2_DWARF | M2_STRONG | M2_LORD | M2_MALE | M2_GREEDY | M2_JEWELS
             | M2_COLLECT,
         M3_INFRAVISIBLE | M3_INFRAVISION, 6, CLR_BLUE),
-    MON("dwarf king", S_HUMANOID, LVL(6, 6, 10, 20, 6), (G_GENO | 1),
+    MON3("dwarf king", "dwarf queen", "dwarf ruler",
+        S_HUMANOID, LVL(6, 6, 10, 20, 6), (G_GENO | 1),
         A(ATTK(AT_WEAP, AD_PHYS, 2, 6), ATTK(AT_WEAP, AD_PHYS, 2, 6), NO_ATTK,
           NO_ATTK, NO_ATTK, NO_ATTK),
         SIZ(900, 300, MS_HUMANOID, MZ_HUMAN), 0, 0,
         M1_TUNNEL | M1_NEEDPICK | M1_HUMANOID | M1_OMNIVORE,
-        M2_DWARF | M2_STRONG | M2_PRINCE | M2_MALE | M2_GREEDY | M2_JEWELS
+        M2_DWARF | M2_STRONG | M2_PRINCE | M2_GREEDY | M2_JEWELS
             | M2_COLLECT,
         M3_INFRAVISIBLE | M3_INFRAVISION, 8, HI_LORD),
     MON("mind flayer", S_HUMANOID, LVL(9, 12, 5, 90, -8), (G_GENO | 1),
@@ -547,12 +555,13 @@ NEARDATA struct permonst mons_init[] = {
         SIZ(450, 150, MS_ORC, MZ_SMALL), MR_POISON, 0,
         M1_HUMANOID | M1_POIS | M1_OMNIVORE, M2_HOSTILE | M2_COLLECT,
         M3_INFRAVISIBLE | M3_INFRAVISION, 2, CLR_RED),
-    MON("kobold lord", S_KOBOLD, LVL(2, 6, 10, 0, -4), (G_GENO | 1),
+    MON3("kobold lord", "kobold lady", "kobold leader",
+        S_KOBOLD, LVL(2, 6, 10, 0, -4), (G_GENO | 1),
         A(ATTK(AT_WEAP, AD_PHYS, 2, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
           NO_ATTK),
         SIZ(500, 200, MS_ORC, MZ_SMALL), MR_POISON, 0,
         M1_HUMANOID | M1_POIS | M1_OMNIVORE,
-        M2_HOSTILE | M2_LORD | M2_MALE | M2_COLLECT,
+        M2_HOSTILE | M2_LORD | M2_COLLECT,
         M3_INFRAVISIBLE | M3_INFRAVISION, 3, HI_LORD),
     MON("kobold shaman", S_KOBOLD, LVL(2, 6, 6, 10, -4), (G_GENO | 1),
         A(ATTK(AT_MAGC, AD_SPEL, 0, 0), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
@@ -1359,22 +1368,24 @@ NEARDATA struct permonst mons_init[] = {
         SIZ(650, 100, MS_ORC, MZ_SMALL), 0, 0, M1_HUMANOID | M1_OMNIVORE,
         M2_NOPOLY | M2_GNOME | M2_COLLECT, M3_INFRAVISIBLE | M3_INFRAVISION,
         3, CLR_BROWN),
-    MON("gnome lord", S_GNOME, LVL(3, 8, 10, 4, 0), (G_GENO | 2),
+    MON3("gnome lord", "gnome lady", "gnome leader",
+        S_GNOME, LVL(3, 8, 10, 4, 0), (G_GENO | 2),
         A(ATTK(AT_WEAP, AD_PHYS, 1, 8), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
           NO_ATTK),
         SIZ(700, 120, MS_ORC, MZ_SMALL), 0, 0, M1_HUMANOID | M1_OMNIVORE,
-        M2_GNOME | M2_LORD | M2_MALE | M2_COLLECT,
+        M2_GNOME | M2_LORD | M2_COLLECT,
         M3_INFRAVISIBLE | M3_INFRAVISION, 4, CLR_BLUE),
     MON("gnomish wizard", S_GNOME, LVL(3, 10, 4, 10, 0), (G_GENO | 1),
         A(ATTK(AT_MAGC, AD_SPEL, 0, 0), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
           NO_ATTK),
         SIZ(700, 120, MS_ORC, MZ_SMALL), 0, 0, M1_HUMANOID | M1_OMNIVORE,
         M2_GNOME | M2_MAGIC, M3_INFRAVISIBLE | M3_INFRAVISION, 5, HI_ZAP),
-    MON("gnome king", S_GNOME, LVL(5, 10, 10, 20, 0), (G_GENO | 1),
+    MON3("gnome king", "gnome queen", "gnome ruler",
+        S_GNOME, LVL(5, 10, 10, 20, 0), (G_GENO | 1),
         A(ATTK(AT_WEAP, AD_PHYS, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
           NO_ATTK),
         SIZ(750, 150, MS_ORC, MZ_SMALL), 0, 0, M1_HUMANOID | M1_OMNIVORE,
-        M2_GNOME | M2_PRINCE | M2_MALE | M2_COLLECT,
+        M2_GNOME | M2_PRINCE | M2_COLLECT,
         M3_INFRAVISIBLE | M3_INFRAVISION, 6, HI_LORD),
 #ifdef SPLITMON_1
 };
@@ -1681,17 +1692,19 @@ struct permonst _mons2[] = {
         SIZ(1600, 500, MS_GRUNT, MZ_LARGE), 0, 0, M1_HUMANOID | M1_CARNIVORE,
         M2_STRONG | M2_GREEDY | M2_JEWELS | M2_COLLECT,
         M3_INFRAVISIBLE | M3_INFRAVISION, 7, CLR_BROWN),
-    MON("ogre lord", S_OGRE, LVL(7, 12, 3, 30, -5), (G_GENO | 2),
+    MON3("ogre lord", "ogre conqueress", "ogre leader",
+        S_OGRE, LVL(7, 12, 3, 30, -5), (G_GENO | 2),
         A(ATTK(AT_WEAP, AD_PHYS, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
           NO_ATTK),
         SIZ(1700, 700, MS_GRUNT, MZ_LARGE), 0, 0, M1_HUMANOID | M1_CARNIVORE,
-        M2_STRONG | M2_LORD | M2_MALE | M2_GREEDY | M2_JEWELS | M2_COLLECT,
+        M2_STRONG | M2_LORD | M2_GREEDY | M2_JEWELS | M2_COLLECT,
         M3_INFRAVISIBLE | M3_INFRAVISION, 9, CLR_RED),
-    MON("ogre king", S_OGRE, LVL(9, 14, 4, 60, -7), (G_GENO | 2),
+    MON3("ogre king", "ogre queen", "ogre tyrant",
+        S_OGRE, LVL(9, 14, 4, 60, -7), (G_GENO | 2),
         A(ATTK(AT_WEAP, AD_PHYS, 3, 5), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
           NO_ATTK),
         SIZ(1700, 750, MS_GRUNT, MZ_LARGE), 0, 0, M1_HUMANOID | M1_CARNIVORE,
-        M2_STRONG | M2_PRINCE | M2_MALE | M2_GREEDY | M2_JEWELS | M2_COLLECT,
+        M2_STRONG | M2_PRINCE | M2_GREEDY | M2_JEWELS | M2_COLLECT,
         M3_INFRAVISIBLE | M3_INFRAVISION, 11, HI_LORD),
     /*
      * Puddings
@@ -1871,14 +1884,15 @@ struct permonst _mons2[] = {
         M2_UNDEAD | M2_STALK | M2_HOSTILE | M2_STRONG | M2_NASTY
             | M2_SHAPESHIFTER,
         M3_INFRAVISIBLE, 12, CLR_RED),
-    MON("vampire lord", S_VAMPIRE, LVL(12, 14, 0, 50, -9),
+    MON3("vampire lord", "vampire lady", "vampire leader",
+        S_VAMPIRE, LVL(12, 14, 0, 50, -9),
         (G_GENO | G_NOCORPSE | 1),
         A(ATTK(AT_CLAW, AD_PHYS, 1, 8), ATTK(AT_BITE, AD_DRLI, 1, 8), NO_ATTK,
           NO_ATTK, NO_ATTK, NO_ATTK),
         SIZ(WT_HUMAN, 400, MS_VAMPIRE, MZ_HUMAN), MR_SLEEP | MR_POISON, 0,
         M1_FLY | M1_BREATHLESS | M1_HUMANOID | M1_POIS | M1_REGEN,
         M2_UNDEAD | M2_STALK | M2_HOSTILE | M2_STRONG | M2_NASTY | M2_LORD
-            | M2_MALE | M2_SHAPESHIFTER,
+            | M2_SHAPESHIFTER,
         M3_INFRAVISIBLE, 14, CLR_BLUE),
 #if 0 /* DEFERRED */
     MON("vampire mage", S_VAMPIRE,
@@ -2187,19 +2201,21 @@ struct permonst _mons2[] = {
         SIZ(WT_ELF, 350, MS_HUMANOID, MZ_HUMAN), MR_SLEEP, MR_SLEEP,
         M1_HUMANOID | M1_OMNIVORE | M1_SEE_INVIS, M2_ELF | M2_COLLECT,
         M3_INFRAVISIBLE | M3_INFRAVISION, 8, CLR_GRAY),
-    MON("elf-lord", S_HUMAN, LVL(8, 12, 10, 20, -9), (G_GENO | G_SGROUP | 2),
+    MON3("elf-lord", "elf-queen", "elf-noble",
+        S_HUMAN, LVL(8, 12, 10, 20, -9), (G_GENO | G_SGROUP | 2),
         A(ATTK(AT_WEAP, AD_PHYS, 2, 4), ATTK(AT_WEAP, AD_PHYS, 2, 4),
           NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
         SIZ(WT_ELF, 350, MS_HUMANOID, MZ_HUMAN), MR_SLEEP, MR_SLEEP,
         M1_HUMANOID | M1_OMNIVORE | M1_SEE_INVIS,
-        M2_ELF | M2_STRONG | M2_LORD | M2_MALE | M2_COLLECT,
+        M2_ELF | M2_STRONG | M2_LORD | M2_COLLECT,
         M3_INFRAVISIBLE | M3_INFRAVISION, 11, CLR_BRIGHT_BLUE),
-    MON("Elvenking", S_HUMAN, LVL(9, 12, 10, 25, -10), (G_GENO | 1),
+    MON3("Elvenking", "Elvenqueen", "Elvenmonarch",
+        S_HUMAN, LVL(9, 12, 10, 25, -10), (G_GENO | 1),
         A(ATTK(AT_WEAP, AD_PHYS, 2, 4), ATTK(AT_WEAP, AD_PHYS, 2, 4),
           NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
         SIZ(WT_ELF, 350, MS_HUMANOID, MZ_HUMAN), MR_SLEEP, MR_SLEEP,
         M1_HUMANOID | M1_OMNIVORE | M1_SEE_INVIS,
-        M2_ELF | M2_STRONG | M2_PRINCE | M2_MALE | M2_COLLECT,
+        M2_ELF | M2_STRONG | M2_PRINCE | M2_COLLECT,
         M3_INFRAVISIBLE | M3_INFRAVISION, 11, HI_LORD),
     MON("doppelganger", S_HUMAN, LVL(9, 12, 5, 20, 0), (G_GENO | 1),
         A(ATTK(AT_WEAP, AD_PHYS, 1, 12),
@@ -2242,7 +2258,8 @@ struct permonst _mons2[] = {
     /* aligned priests always have the epri extension attached;
        individual instantiations should always have either ispriest
        or isminion set */
-    MON("aligned priest", S_HUMAN, LVL(12, 12, 10, 50, 0), G_NOGEN,
+    MON3("priest", "priestess", "aligned cleric",
+        S_HUMAN, LVL(12, 12, 10, 50, 0), G_NOGEN,
         A(ATTK(AT_WEAP, AD_PHYS, 4, 10), ATTK(AT_KICK, AD_PHYS, 1, 4),
           ATTK(AT_MAGC, AD_CLRC, 0, 0), NO_ATTK, NO_ATTK, NO_ATTK),
         SIZ(WT_HUMAN, 400, MS_PRIEST, MZ_HUMAN), MR_ELEC, 0,
@@ -2250,7 +2267,8 @@ struct permonst _mons2[] = {
         M2_NOPOLY | M2_HUMAN | M2_LORD | M2_PEACEFUL | M2_COLLECT,
         M3_INFRAVISIBLE, 15, CLR_WHITE),
     /* high priests always have epri and always have ispriest set */
-    MON("high priest", S_HUMAN, LVL(25, 15, 7, 70, 0), (G_NOGEN | G_UNIQ),
+    MON3("high priest", "high priestess", "high cleric",
+        S_HUMAN, LVL(25, 15, 7, 70, 0), (G_NOGEN | G_UNIQ),
         A(ATTK(AT_WEAP, AD_PHYS, 4, 10), ATTK(AT_KICK, AD_PHYS, 2, 8),
           ATTK(AT_MAGC, AD_CLRC, 2, 8), ATTK(AT_MAGC, AD_CLRC, 2, 8), NO_ATTK,
           NO_ATTK),
@@ -2392,10 +2410,12 @@ struct permonst _mons2[] = {
 #define SEDUCTION_ATTACKS_NO                                      \
     A(ATTK(AT_CLAW, AD_PHYS, 1, 3), ATTK(AT_CLAW, AD_PHYS, 1, 3), \
       ATTK(AT_BITE, AD_DRLI, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK)
-    MON("succubus", S_DEMON, LVL(6, 12, 0, 70, -9), (G_NOCORPSE | 1),
+    /* incubus and succubus */
+    MON3("incubus", "succubus", "Amorous Demon",
+        S_DEMON, LVL(6, 12, 0, 70, -9), (G_NOCORPSE | 1),
         SEDUCTION_ATTACKS_YES, SIZ(WT_HUMAN, 400, MS_SEDUCE, MZ_HUMAN),
         MR_FIRE | MR_POISON, 0, M1_HUMANOID | M1_FLY | M1_POIS,
-        M2_DEMON | M2_STALK | M2_HOSTILE | M2_NASTY | M2_FEMALE,
+        M2_DEMON | M2_STALK | M2_HOSTILE | M2_NASTY,
         M3_INFRAVISIBLE | M3_INFRAVISION, 8, CLR_GRAY),
     MON("horned devil", S_DEMON, LVL(6, 9, -5, 50, 11),
         (G_HELL | G_NOCORPSE | 2),
@@ -2405,11 +2425,6 @@ struct permonst _mons2[] = {
         SIZ(WT_HUMAN, 400, MS_SILENT, MZ_HUMAN), MR_FIRE | MR_POISON, 0,
         M1_POIS | M1_THICK_HIDE, M2_DEMON | M2_STALK | M2_HOSTILE | M2_NASTY,
         M3_INFRAVISIBLE | M3_INFRAVISION, 9, CLR_BROWN),
-    MON("incubus", S_DEMON, LVL(6, 12, 0, 70, -9), (G_NOCORPSE | 1),
-        SEDUCTION_ATTACKS_YES, SIZ(WT_HUMAN, 400, MS_SEDUCE, MZ_HUMAN),
-        MR_FIRE | MR_POISON, 0, M1_HUMANOID | M1_FLY | M1_POIS,
-        M2_DEMON | M2_STALK | M2_HOSTILE | M2_NASTY | M2_MALE,
-        M3_INFRAVISIBLE | M3_INFRAVISION, 8, CLR_GRAY),
     /* Used by AD&D for a type of demon, originally one of the Furies
        and spelled this way */
     MON("erinys", S_DEMON, LVL(7, 12, 2, 30, 10),
@@ -2757,19 +2772,13 @@ struct permonst _mons2[] = {
         M1_HUMANOID | M1_OMNIVORE,
         M2_NOPOLY | M2_HUMAN | M2_STRONG | M2_COLLECT, M3_INFRAVISIBLE,
         12, HI_DOMESTIC),
-    MON("caveman", S_HUMAN, LVL(10, 12, 10, 0, 1), G_NOGEN,
+    MON3("caveman", "cavewoman", "cave dweller",
+        S_HUMAN, LVL(10, 12, 10, 0, 1), G_NOGEN,
         A(ATTK(AT_WEAP, AD_PHYS, 2, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
           NO_ATTK),
         SIZ(WT_HUMAN, 400, MS_HUMANOID, MZ_HUMAN), 0, 0,
         M1_HUMANOID | M1_OMNIVORE,
-        M2_NOPOLY | M2_HUMAN | M2_STRONG | M2_MALE | M2_COLLECT,
-        M3_INFRAVISIBLE, 12, HI_DOMESTIC),
-    MON("cavewoman", S_HUMAN, LVL(10, 12, 10, 0, 1), G_NOGEN,
-        A(ATTK(AT_WEAP, AD_PHYS, 2, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
-          NO_ATTK),
-        SIZ(WT_HUMAN, 400, MS_HUMANOID, MZ_HUMAN), 0, 0,
-        M1_HUMANOID | M1_OMNIVORE,
-        M2_NOPOLY | M2_HUMAN | M2_STRONG | M2_FEMALE | M2_COLLECT,
+        M2_NOPOLY | M2_HUMAN | M2_STRONG | M2_COLLECT,
         M3_INFRAVISIBLE, 12, HI_DOMESTIC),
     MON("healer", S_HUMAN, LVL(10, 12, 10, 1, 0), G_NOGEN,
         A(ATTK(AT_WEAP, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
@@ -2792,19 +2801,13 @@ struct permonst _mons2[] = {
         M1_HUMANOID | M1_HERBIVORE,
         M2_NOPOLY | M2_HUMAN | M2_STRONG | M2_COLLECT | M2_MALE,
         M3_INFRAVISIBLE, 11, HI_DOMESTIC),
-    MON("priest", S_HUMAN, LVL(10, 12, 10, 2, 0), G_NOGEN,
+    MON3("priest", "priestess", "cleric",
+        S_HUMAN, LVL(10, 12, 10, 2, 0), G_NOGEN,
         A(ATTK(AT_WEAP, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
           NO_ATTK),
         SIZ(WT_HUMAN, 400, MS_HUMANOID, MZ_HUMAN), 0, 0,
         M1_HUMANOID | M1_OMNIVORE,
-        M2_NOPOLY | M2_HUMAN | M2_STRONG | M2_MALE | M2_COLLECT,
-        M3_INFRAVISIBLE, 12, HI_DOMESTIC),
-    MON("priestess", S_HUMAN, LVL(10, 12, 10, 2, 0), G_NOGEN,
-        A(ATTK(AT_WEAP, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
-          NO_ATTK),
-        SIZ(WT_HUMAN, 400, MS_HUMANOID, MZ_HUMAN), 0, 0,
-        M1_HUMANOID | M1_OMNIVORE,
-        M2_NOPOLY | M2_HUMAN | M2_STRONG | M2_FEMALE | M2_COLLECT,
+        M2_NOPOLY | M2_HUMAN | M2_STRONG | M2_COLLECT,
         M3_INFRAVISIBLE, 12, HI_DOMESTIC),
     MON("ranger", S_HUMAN, LVL(10, 12, 10, 2, -3), G_NOGEN,
         A(ATTK(AT_WEAP, AD_PHYS, 1, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK,
index 80b995b5da0172521ae0a4e5e8a832428d3b48b9..78f8f84f3535426450a6e33eae5a904ef605cc91 100644 (file)
@@ -53,7 +53,8 @@ dev_name()
         for (mtmp = fmon; mtmp; mtmp = mtmp->nmon) {
             if (!is_mplayer(mtmp->data))
                 continue;
-            if (!strncmp(developers[i], (has_mname(mtmp)) ? MNAME(mtmp) : "",
+            if (!strncmp(developers[i],
+                         (has_mgivenname(mtmp)) ? MGIVENNAME(mtmp) : "",
                          strlen(developers[i]))) {
                 match = TRUE;
                 break;
@@ -176,8 +177,7 @@ register boolean special;
             if (helm == HELM_OF_BRILLIANCE)
                 helm = STRANGE_OBJECT;
             break;
-        case PM_CAVEMAN:
-        case PM_CAVEWOMAN:
+        case PM_CAVE_DWELLER:
             if (rn2(4))
                 weapon = MACE;
             else if (rn2(2))
@@ -208,8 +208,7 @@ register boolean special;
             if (rn2(2))
                 shield = STRANGE_OBJECT;
             break;
-        case PM_PRIEST:
-        case PM_PRIESTESS:
+        case PM_CLERIC:
             if (rn2(2))
                 weapon = MACE;
             if (rn2(2))
index c5064e37d9c4f1a844cda54ff7d2cd5de038b030..bba8fd939d156e6c9a72d06903b9bf95b0d53c77 100644 (file)
@@ -345,7 +345,8 @@ boolean verbose;    /* give message(s) even when you can't see what happened */
         if (vis) {
             if (otmp->otyp == EGG)
                 pline("Splat!  %s is hit with %s egg!", Monnam(mtmp),
-                      otmp->known ? an(mons[otmp->corpsenm].mname) : "an");
+                      otmp->known ? an(mons[otmp->corpsenm].pmnames[NEUTRAL])
+                                  : "an");
             else
                 hit(distant_name(otmp, mshot_xname), mtmp, exclam(damage));
         } else if (verbose && !g.mtarget)
index a9fadee8b8e4d2f73a7a21ee3f236d8dc00a5461..91aaa9c8e3fef9323f9ef46ad8486ab75c23de70 100644 (file)
@@ -241,7 +241,7 @@ struct obj *otmp;
     saverole = Role_switch;
     if (!vismon) {
         otmp->bknown = 0;
-        if (Role_if(PM_PRIEST))
+        if (Role_if(PM_CLERIC))
             Role_switch = 0;
     }
     Strcpy(onambuf, singular(otmp, doname));
@@ -2889,7 +2889,9 @@ struct monst *mon;
         return (ptr->mcolor == CLR_GREEN || ptr->mcolor == CLR_BRIGHT_GREEN);
 #endif
     /* approximation */
-    if (strstri(ptr->mname, "green"))
+    if (strstri(ptr->pmnames[NEUTRAL], "green")
+        || (ptr->pmnames[MALE] && strstri(ptr->pmnames[MALE], "green"))
+        || (ptr->pmnames[FEMALE] && strstri(ptr->pmnames[FEMALE], "green")))
         return TRUE;
     switch (monsndx(ptr)) {
     case PM_FOREST_CENTAUR:
index dd84b98c682b85afbb05107ddd7e7a304fd4ae71..3dc60efc33986289ac0e03d861f15ef728a2da33 100644 (file)
@@ -387,7 +387,7 @@ int force;
                                     You("destroy %s!",
                                         mtmp->mtame
                                          ? x_monnam(mtmp, ARTICLE_THE, "poor",
-                                                    has_mname(mtmp)
+                                                    has_mgivenname(mtmp)
                                                      ? SUPPRESS_SADDLE : 0,
                                                     FALSE)
                                          : mon_nam(mtmp));
index ca9567d8d53e9d425755f4a3b4313c8b671a9e89..03e07401de743243ae9d37efb32eed1be15a976e 100644 (file)
@@ -318,7 +318,8 @@ lua_State *L;
     if (obj->corpsenm != NON_PM
         && (obj->otyp == TIN || obj->otyp == CORPSE || obj->otyp == EGG
             || obj->otyp == FIGURINE || obj->otyp == STATUE))
-        nhl_add_table_entry_str(L, "corpsenm_name", mons[obj->corpsenm].mname);
+        nhl_add_table_entry_str(L, "corpsenm_name",
+                                mons[obj->corpsenm].pmnames[NEUTRAL]);
     /* TODO: leashmon, fromsink, novelidx, record_achieve_special */
     nhl_add_table_entry_int(L, "usecount", obj->usecount);
     /* TODO: spestudied */
index a99523ef5aea40dacc435b360fd2003207d7bf2a..2330fa4dcdf0a002051b855b3ad1e9f3fdfec929 100644 (file)
@@ -24,7 +24,7 @@ struct _readobjnam_data {
     int eroded, eroded2, erodeproof, locked, unlocked, broken, real, fake;
     int halfeaten, mntmp, contents;
     int islit, unlabeled, ishistoric, isdiluted, trapped;
-    int tmp, tinv, tvariety;
+    int tmp, tinv, tvariety, mgend;
     int wetness, gsize;
     int ftype;
     struct obj *otmp;
@@ -471,7 +471,7 @@ unsigned cxn_flags; /* bitmask of CXN_xxx values */
         obj->known = 0;
     if (!Blind && !g.distantname)
         obj->dknown = 1;
-    if (Role_if(PM_PRIEST))
+    if (Role_if(PM_CLERIC))
         obj->bknown = 1; /* actively avoid set_bknown();
                           * we mustn't call update_inventory() now because
                           * it would call xname() (via doname()) recursively
@@ -528,8 +528,8 @@ unsigned cxn_flags; /* bitmask of CXN_xxx values */
             char anbuf[10]; /* [4] would be enough: 'a','n',' ','\0' */
 
             Sprintf(eos(buf), " of %s%s",
-                    just_an(anbuf, mons[omndx].mname),
-                    mons[omndx].mname);
+                    just_an(anbuf, mons[omndx].pmnames[NEUTRAL]),
+                    mons[omndx].pmnames[NEUTRAL]);
         } else if (is_wet_towel(obj)) {
             if (wizard)
                 Sprintf(eos(buf), " (%d)", obj->spe);
@@ -617,6 +617,7 @@ unsigned cxn_flags; /* bitmask of CXN_xxx values */
     case ROCK_CLASS:
         if (typ == STATUE && omndx != NON_PM) {
             char anbuf[10];
+            int mgend = (obj->spe & STATUE_FEMALE) ? FEMALE : MALE;
 
             Sprintf(buf, "%s%s of %s%s",
                     (Role_if(PM_ARCHEOLOGIST) && (obj->spe & STATUE_HISTORIC))
@@ -627,8 +628,8 @@ unsigned cxn_flags; /* bitmask of CXN_xxx values */
                        ? ""
                        : the_unique_pm(&mons[omndx])
                           ? "the "
-                          : just_an(anbuf, mons[omndx].mname),
-                    mons[omndx].mname);
+                          : just_an(anbuf, pmname(&mons[omndx], mgend)),
+                    pmname(&mons[omndx], mgend));
         } else
             Strcpy(buf, actualn);
         break;
@@ -822,7 +823,7 @@ struct obj *obj;
 
     bufp = distant_name(&bareobj, xname); /* xname(&bareobj) */
     if (!strncmp(bufp, "uncursed ", 9))
-        bufp += 9; /* Role_if(PM_PRIEST) */
+        bufp += 9; /* Role_if(PM_CLERIC) */
 
     objects[otyp].oc_uname = saveobcls.oc_uname;
     objects[otyp].oc_name_known = saveobcls.oc_name_known;
@@ -878,7 +879,7 @@ struct permonst *ptr;
     /* high priest is unique if it includes "of <deity>", otherwise not
        (caller needs to handle the 1st possibility; we assume the 2nd);
        worm tail should be irrelevant but is included for completeness */
-    if (ptr == &mons[PM_HIGH_PRIEST] || ptr == &mons[PM_LONG_WORM_TAIL])
+    if (ptr == &mons[PM_HIGH_CLERIC] || ptr == &mons[PM_LONG_WORM_TAIL])
         uniq = FALSE;
     /* Wizard no longer needs this; he's flagged as unique these days */
     if (ptr == &mons[PM_WIZARD_OF_YENDOR])
@@ -1062,7 +1063,7 @@ unsigned doname_flags;
 #endif
                      && obj->otyp != FAKE_AMULET_OF_YENDOR
                      && obj->otyp != AMULET_OF_YENDOR
-                     && !Role_if(PM_PRIEST)))
+                     && !Role_if(PM_CLERIC)))
             Strcat(prefix, "uncursed ");
     }
 
@@ -1200,7 +1201,7 @@ unsigned doname_flags;
 #endif
             if (omndx >= LOW_PM
                 && (known || (g.mvitals[omndx].mvflags & MV_KNOWS_EGG))) {
-                Strcat(prefix, mons[omndx].mname);
+                Strcat(prefix, mons[omndx].pmnames[NEUTRAL]);
                 Strcat(prefix, " ");
                 if (obj->spe == 1)
                     Strcat(bp, " (laid by you)");
@@ -1433,21 +1434,21 @@ unsigned cxn_flags; /* bitmask of CXN_xxx values */
         omit_corpse = (cxn_flags & CXN_NOCORPSE) != 0,
         possessive = FALSE,
         glob = (otmp->otyp != CORPSE && otmp->globby);
-    const char *mname;
+    const char *mnam;
 
     if (glob) {
-        mname = OBJ_NAME(objects[otmp->otyp]); /* "glob of <monster>" */
+        mnam = OBJ_NAME(objects[otmp->otyp]); /* "glob of <monster>" */
     } else if (omndx == NON_PM) { /* paranoia */
-        mname = "thing";
+        mnam = "thing";
         /* [Possible enhancement:  check whether corpse has monster traits
             attached in order to use priestname() for priests and minions.] */
-    } else if (omndx == PM_ALIGNED_PRIEST) {
+    } else if (omndx == PM_ALIGNED_CLERIC) {
         /* avoid "aligned priest"; it just exposes internal details */
-        mname = "priest";
+        mnam = "priest";
     } else {
-        mname = mons[omndx].mname;
+        mnam = mons[omndx].pmnames[NEUTRAL];
         if (the_unique_pm(&mons[omndx]) || type_is_pname(&mons[omndx])) {
-            mname = s_suffix(mname);
+            mnam = s_suffix(mnam);
             possessive = TRUE;
             /* don't precede personal name like "Medusa" with an article */
             if (type_is_pname(&mons[omndx]))
@@ -1473,13 +1474,13 @@ unsigned cxn_flags; /* bitmask of CXN_xxx values */
 
     if (!adjective || !*adjective) {
         /* normal case:  newt corpse */
-        Strcat(nambuf, mname);
+        Strcat(nambuf, mnam);
     } else {
         /* adjective positioning depends upon format of monster name */
         if (possessive) /* Medusa's cursed partly eaten corpse */
-            Sprintf(eos(nambuf), "%s %s", mname, adjective);
+            Sprintf(eos(nambuf), "%s %s", mnam, adjective);
         else /* cursed partly eaten troll corpse */
-            Sprintf(eos(nambuf), "%s %s", adjective, mname);
+            Sprintf(eos(nambuf), "%s %s", adjective, mnam);
         /* in case adjective has a trailing space, squeeze it out */
         mungspaces(nambuf);
         /* doname() might include a count in the adjective argument;
@@ -3270,6 +3271,7 @@ struct _readobjnam_data *d;
         = d->ishistoric = d->isdiluted = d->trapped = d->locked
         = d->unlocked = d->broken = d->real = d->fake = 0;
     d->tvariety = RANDOM_TIN;
+    d->mgend = MALE;
     d->mntmp = NON_PM;
     d->contents = UNDEFINED;
     d->oclass = 0;
@@ -3597,7 +3599,8 @@ struct _readobjnam_data *d;
         || !strcmpi(d->bp, "globs") || !BSTRCMPI(d->bp, d->bp + i - 6, " globs")
         || (d->p = strstri(d->bp, "glob of ")) != 0
         || (d->p = strstri(d->bp, "globs of ")) != 0) {
-        d->mntmp = name_to_mon(!d->p ? d->bp : (strstri(d->p, " of ") + 4));
+        d->mntmp = name_to_mon(!d->p ? d->bp
+                                     : (strstri(d->p, " of ") + 4), (int *) 0);
         /* if we didn't recognize monster type, pick a valid one at random */
         if (d->mntmp == NON_PM)
             d->mntmp = rn1(PM_BLACK_PUDDING - PM_GRAY_OOZE, PM_GRAY_OOZE);
@@ -3605,7 +3608,7 @@ struct _readobjnam_data *d;
            variant (grey ooze) or player used inverted syntax (<foo> glob);
            if player has given a valid monster type but not valid glob type,
            object name lookup won't find it and wish attempt will fail */
-        Sprintf(d->globbuf, "glob of %s", mons[d->mntmp].mname);
+        Sprintf(d->globbuf, "glob of %s", mons[d->mntmp].pmnames[NEUTRAL]);
         d->bp = d->globbuf;
         d->mntmp = NON_PM; /* not useful for "glob of <foo>" object lookup */
         d->cnt = 0; /* globs don't stack */
@@ -3631,12 +3634,13 @@ struct _readobjnam_data *d;
                 } else {
                     d->tmp = tin_variety_txt(d->p + 7, &d->tinv);
                     d->tvariety = d->tinv;
-                    d->mntmp = name_to_mon(d->p + 7 + d->tmp);
+                    d->mntmp = name_to_mon(d->p + 7 + d->tmp, &d->mgend);
                 }
                 d->typ = TIN;
                 return 2; /*goto typfnd;*/
             } else if ((d->p = strstri(d->bp, " of ")) != 0
-                       && (d->mntmp = name_to_mon(d->p + 4)) >= LOW_PM)
+                       && (d->mntmp = name_to_mon(d->p + 4,
+                                                  &d->mgend)) >= LOW_PM)
                 *d->p = 0;
         }
     }
@@ -3649,7 +3653,8 @@ struct _readobjnam_data *d;
         const char *rest = 0;
 
         if (d->mntmp < LOW_PM && strlen(d->bp) > 2
-            && (d->mntmp = name_to_monplus(d->bp, &rest)) >= LOW_PM) {
+            && (d->mntmp = name_to_monplus(d->bp, &rest,
+                                           &d->mgend)) >= LOW_PM) {
             char *obp = d->bp;
 
             /* 'rest' is a pointer past the matching portion; if that was
@@ -4280,8 +4285,11 @@ struct obj *no_wish;
     case LARGE_BOX:
     case HEAVY_IRON_BALL:
     case IRON_CHAIN:
+        break;
     case STATUE:
         /* otmp->cobj already done in mksobj() */
+        if (d.mgend)
+            d.otmp->spe |= STATUE_FEMALE;
         break;
 #ifdef MAIL_STRUCTURES
     /* scroll of mail:  0: delivered in-game via external event (or randomly
@@ -4355,7 +4363,7 @@ struct obj *no_wish;
             d.otmp->corpsenm = d.mntmp;
             if (Has_contents(d.otmp) && verysmall(&mons[d.mntmp]))
                 delete_contents(d.otmp); /* no spellbook */
-            d.otmp->spe = d.ishistoric ? STATUE_HISTORIC : 0;
+            d.otmp->spe |= d.ishistoric ? STATUE_HISTORIC : 0;
             break;
         case SCALE_MAIL:
             /* Dragon mail - depends on the order of objects & dragons. */
index ed0101c4be9b536cc53bc6f801d380a32e5b98a6..d58c4e1f0bab8aa858651a11d7b6e8a4eca19ee8 100644 (file)
@@ -7376,13 +7376,13 @@ struct fruit *replace_fruit;
             || !strncmp(g.pl_fruit, "partly eaten ", 13)
             || (!strncmp(g.pl_fruit, "tin of ", 7)
                 && (!strcmp(g.pl_fruit + 7, "spinach")
-                    || name_to_mon(g.pl_fruit + 7) >= LOW_PM))
+                    || name_to_mon(g.pl_fruit + 7, (int *) 0) >= LOW_PM))
             || !strcmp(g.pl_fruit, "empty tin")
             || (!strcmp(g.pl_fruit, "glob")
                 || (globpfx > 0 && !strcmp("glob", &g.pl_fruit[globpfx])))
             || ((str_end_is(g.pl_fruit, " corpse")
                  || str_end_is(g.pl_fruit, " egg"))
-                && name_to_mon(g.pl_fruit) >= LOW_PM)) {
+                && name_to_mon(g.pl_fruit, (int *) 0) >= LOW_PM)) {
             Strcpy(buf, g.pl_fruit);
             Strcpy(g.pl_fruit, "candied ");
             nmcpy(g.pl_fruit + 8, buf, PL_FSIZ - 8);
index b573bb4aa27415fa43c1a5e447f5e0dba00b5973..197cd4b3c0751c305bbae0079257caa45e0d768d 100644 (file)
@@ -89,7 +89,7 @@ char *outbuf;
     Sprintf(outbuf, "%s%s%s called %s",
             /* being blinded may hide invisibility from self */
             (Invis && (senseself() || !Blind)) ? "invisible " : "", race,
-            mons[u.umonnum].mname, g.plname);
+            pmname(&mons[u.umonnum], Ugender), g.plname);
     if (u.usteed)
         Sprintf(eos(outbuf), ", mounted on %s", y_monnam(u.usteed));
     if (u.uundetected || (Upolyd && U_AP_TYPE))
@@ -167,7 +167,7 @@ char *outbuf;
     } else if (M_AP_TYPE(mon) == M_AP_MONSTER) {
         if (altmon)
             Sprintf(outbuf, ", masquerading as %s",
-                    an(mons[mon->mappearance].mname));
+                    an(pmname(&mons[mon->mappearance], Mgender(mon))));
     } else if (isyou ? u.uundetected : mon->mundetected) {
         Strcpy(outbuf, ", hiding");
         if (hides_under(mon->data)) {
@@ -403,7 +403,7 @@ int x, y;
                                         : (mW & M2_ELF & m2) ? "elf"
                                           : (mW & M2_ORC & m2) ? "orc"
                                             : (mW & M2_DEMON & m2) ? "demon"
-                                              : mtmp->data->mname);
+                                              : pmname(mtmp->data, Mgender(mtmp)));
 
                     Sprintf(eos(monbuf), "warned of %s", makeplural(whom));
                 }
@@ -616,7 +616,7 @@ char *supplemental_name;
      * user_typed_name and picked name.
      */
     if (pm != (struct permonst *) 0 && !user_typed_name)
-        dbase_str = strcpy(newstr, pm->mname);
+        dbase_str = strcpy(newstr, pm->pmnames[NEUTRAL]);
     else
         dbase_str = strcpy(newstr, inp);
     (void) lcase(dbase_str);
@@ -893,15 +893,14 @@ struct permonst **for_supplement;
             hallucinate = (Hallucination && !g.program_state.gameover);
     const char *x_str;
     nhsym tmpsym;
+    unsigned glyphmod[NUM_GLYPHMOD];
 
     gobbledygook[0] = '\0'; /* no hallucinatory liquid (yet) */
     if (looked) {
-        int oc;
-        unsigned os;
-
         glyph = glyph_at(cc.x, cc.y);
         /* Convert glyph at selected position to a symbol for use below. */
-        (void) mapglyph(glyph, &sym, &oc, &os, cc.x, cc.y, 0);
+        map_glyphmod(cc.x, cc.y, glyph, 0, glyphmod);
+        sym = glyphmod[GM_TTYCHAR];
 
         Sprintf(prefix, "%s        ", encglyph(glyph));
     } else
@@ -1154,12 +1153,9 @@ struct permonst **for_supplement;
                 break;
             case SYM_PET_OVERRIDE + SYM_OFF_X:
                 if (looked) {
-                    int oc = 0;
-                    unsigned os = 0;
-
                     /* convert to symbol without override in effect */
-                    (void) mapglyph(glyph, &sym, &oc, &os,
-                                    cc.x, cc.y, MG_FLAG_NOOVERRIDE);
+                    map_glyphmod(cc.x, cc.y, glyph, MG_FLAG_NOOVERRIDE, glyphmod);
+                    sym = (int) glyphmod[GM_TTYCHAR];                
                     goto check_monsters;
                 }
                 break;
index a8d7f3d88442db1b5a1e60ac9ce36fefefdf1dc5..f271d4c17b102684038eddf6732c2538a2168a65 100644 (file)
@@ -484,7 +484,7 @@ struct obj *obj;
                           ? TRUE : FALSE)
                        : TRUE; /* catchall: no filters specified, so accept */
 
-    if (Role_if(PM_PRIEST) && !obj->bknown)
+    if (Role_if(PM_CLERIC) && !obj->bknown)
         set_bknown(obj, 1);
 
     /*
index ccc076076ea9084d20bfc3a482739571fda1ef2f..3d898ec66cabbd1d5a92fc22cb054de87ad551c4 100644 (file)
@@ -263,10 +263,13 @@ change_sex()
                      : g.urole.malenum;
     if (!already_polyd) {
         u.umonnum = u.umonster;
-    } else if (u.umonnum == PM_SUCCUBUS || u.umonnum == PM_INCUBUS) {
+    } else if (u.umonnum == PM_AMOROUS_DEMON) {
         flags.female = !flags.female;
-        /* change monster type to match new sex */
+#if 0
+        /* change monster type to match new sex; disabled with PM_AMOROUS_DEMON */
+
         u.umonnum = (u.umonnum == PM_SUCCUBUS) ? PM_INCUBUS : PM_SUCCUBUS;
+#endif
         set_uasmon();
     }
 }
@@ -394,7 +397,7 @@ polyself(psflags)
 int psflags;
 {
     char buf[BUFSZ] = DUMMY;
-    int old_light, new_light, mntmp, class, tryct;
+    int old_light, new_light, mntmp, class, tryct, gvariant = NEUTRAL;
     boolean forcecontrol = (psflags == 1),
             monsterpoly = (psflags == 2),
             formrevert = (psflags == 3),
@@ -449,7 +452,7 @@ int psflags;
                 continue;  /* end do-while(--tryct > 0) loop */
             }
             class = 0;
-            mntmp = name_to_mon(buf);
+            mntmp = name_to_mon(buf, &gvariant);
             if (mntmp < LOW_PM) {
  by_class:
                 class = name_to_monclass(buf, &mntmp);
@@ -489,7 +492,7 @@ int psflags;
                        0 and trigger thats_enough_tries message */
                     ++tryct;
                 }
-                pm_name = mons[mntmp].mname;
+                pm_name = pmname(&mons[mntmp], flags.female ? FEMALE : MALE);
                 if (the_unique_pm(&mons[mntmp]))
                     pm_name = the(pm_name);
                 else if (!type_is_pname(&mons[mntmp]))
@@ -552,7 +555,7 @@ int psflags;
         } else if (isvamp) {
  do_vampyr:
             if (mntmp < LOW_PM || (mons[mntmp].geno & G_UNIQ)) {
-                mntmp = (g.youmonst.data == &mons[PM_VAMPIRE_LORD] && !rn2(10))
+                mntmp = (g.youmonst.data == &mons[PM_VAMPIRE_LEADER] && !rn2(10))
                             ? PM_WOLF
                             : !rn2(4) ? PM_FOG_CLOUD : PM_VAMPIRE_BAT;
                 if (g.youmonst.cham >= LOW_PM
@@ -560,7 +563,8 @@ int psflags;
                     mntmp = g.youmonst.cham;
             }
             if (controllable_poly) {
-                Sprintf(buf, "Become %s?", an(mons[mntmp].mname));
+                Sprintf(buf, "Become %s?",
+                        an(pmname(&mons[mntmp], gvariant)));
                 if (yn(buf) != 'y')
                     return;
             }
@@ -622,7 +626,8 @@ int mntmp;
     int mlvl;
 
     if (g.mvitals[mntmp].mvflags & G_GENOD) { /* allow G_EXTINCT */
-        You_feel("rather %s-ish.", mons[mntmp].mname);
+        You_feel("rather %s-ish.",
+                 pmname(&mons[mntmp], flags.female ? FEMALE : MALE));
         exercise(A_WIS, TRUE);
         return 0;
     }
@@ -676,7 +681,7 @@ int mntmp;
         Strcat(buf, (is_male(&mons[mntmp]) || is_female(&mons[mntmp]))
                        ? "" : flags.female ? "female " : "male ");
     }
-    Strcat(buf, mons[mntmp].mname);
+    Strcat(buf, pmname(&mons[mntmp], flags.female ? FEMALE : MALE));
     You("%s %s!", (u.umonnum != mntmp) ? "turn into" : "feel like", an(buf));
 
     if (Stoned && poly_when_stoned(&mons[mntmp])) {
@@ -774,7 +779,8 @@ int mntmp;
         if (touch_petrifies(u.usteed->data) && !Stone_resistance && rnl(3)) {
             pline("%s touch %s.", no_longer_petrify_resistant,
                   mon_nam(u.usteed));
-            Sprintf(buf, "riding %s", an(u.usteed->data->mname));
+            Sprintf(buf, "riding %s",
+                    an(pmname(u.usteed->data, Mgender(u.usteed))));
             instapetrify(buf);
         }
         if (!can_ride(u.usteed))
@@ -1576,7 +1582,8 @@ dopoly()
     if (is_vampire(g.youmonst.data) || is_vampshifter(&g.youmonst)) {
         polyself(2);
         if (savedat != g.youmonst.data) {
-            You("transform into %s.", an(g.youmonst.data->mname));
+            You("transform into %s.",
+                an(pmname(g.youmonst.data, Ugender)));
             newsym(u.ux, u.uy);
         }
     }
@@ -1764,7 +1771,7 @@ int part;
     if ((part == HAND || part == HANDED)
         && (humanoid(mptr) && attacktype(mptr, AT_CLAW)
             && !index(not_claws, mptr->mlet) && mptr != &mons[PM_STONE_GOLEM]
-            && mptr != &mons[PM_INCUBUS] && mptr != &mons[PM_SUCCUBUS]))
+            && mptr != &mons[PM_AMOROUS_DEMON]))
         return (part == HAND) ? "claw" : "clawed";
     if ((mptr == &mons[PM_MUMAK] || mptr == &mons[PM_MASTODON])
         && part == NOSE)
@@ -1926,7 +1933,7 @@ polysense()
         warnidx = PM_SHRIEKER;
         break;
     case PM_VAMPIRE:
-    case PM_VAMPIRE_LORD:
+    case PM_VAMPIRE_LEADER:
         g.context.warntype.polyd = M2_HUMAN | M2_ELF;
         HWarn_of_mon |= FROMRACE;
         return;
index bf2f2becd2cf4a934516629c8229366dbe58d3c1..4d3265c0da845b982d90468eb4f8147b6af87864 100644 (file)
@@ -660,7 +660,7 @@ register struct obj *otmp;
                 exercise(A_CON, FALSE);
                 if (u.ulycn >= LOW_PM) {
                     Your("affinity to %s disappears!",
-                         makeplural(mons[u.ulycn].mname));
+                         makeplural(mons[u.ulycn].pmnames[NEUTRAL]));
                     if (g.youmonst.data == &mons[u.ulycn])
                         you_unwere(FALSE);
                     set_ulycn(NON_PM); /* cure lycanthropy */
index f6ce19b1a4582e8769ecbd42866dbe0aeb8eb29c..fa95503aeabca6a687afd7d9210409773287d188 100644 (file)
@@ -1979,7 +1979,7 @@ doturn()
     const char *Gname;
     int once, range, xlev;
 
-    if (!Role_if(PM_PRIEST) && !Role_if(PM_KNIGHT)) {
+    if (!Role_if(PM_CLERIC) && !Role_if(PM_KNIGHT)) {
         /* Try to use the "turn undead" spell.
          *
          * This used to be based on whether hero knows the name of the
index 3b0c6c1e5bd57f16b5b93b2211cd4b9838250328..354cbc5a499049a95f67445eac2437e5eb9f6feb 100644 (file)
@@ -233,7 +233,7 @@ boolean sanctum; /* is it the seat of the high priest? */
     struct obj *otmp;
     int cnt;
     int px = 0, py = 0, i, si = rn2(8);
-    struct permonst *prim = &mons[sanctum ? PM_HIGH_PRIEST : PM_ALIGNED_PRIEST];
+    struct permonst *prim = &mons[sanctum ? PM_HIGH_CLERIC : PM_ALIGNED_CLERIC];
 
     for (i = 0; i < 8; i++) {
         px = sx + xdir[(i+si) % 8];
@@ -310,10 +310,11 @@ register struct monst *mon;
 char *pname; /* caller-supplied output buffer */
 {
     boolean do_hallu = Hallucination,
-            aligned_priest = mon->data == &mons[PM_ALIGNED_PRIEST],
-            high_priest = mon->data == &mons[PM_HIGH_PRIEST];
+            aligned_priest = mon->data == &mons[PM_ALIGNED_CLERIC],
+            high_priest = mon->data == &mons[PM_HIGH_CLERIC];
     char whatcode = '\0';
-    const char *what = do_hallu ? rndmonnam(&whatcode) : mon->data->mname;
+    const char *what = do_hallu ? rndmonnam(&whatcode)
+                                : pmname(mon->data, Mgender(mon));
 
     if (!mon->ispriest && !mon->isminion) /* should never happen...  */
         return strcpy(pname, what);       /* caller must be confused */
@@ -416,7 +417,7 @@ int roomno;
 
         epri_p = EPRI(priest);
         shrined = has_shrine(priest);
-        sanctum = (priest->data == &mons[PM_HIGH_PRIEST]
+        sanctum = (priest->data == &mons[PM_HIGH_CLERIC]
                    && (Is_sanctum(&u.uz) || In_endgame(&u.uz)));
         can_speak = (priest->mcanmove && !priest->msleeping);
         if (can_speak && !Deaf && g.moves >= epri_p->intone_time) {
@@ -668,7 +669,7 @@ boolean peaceful;
     register boolean coaligned = (u.ualign.type == alignment);
 
 #if 0 /* this was due to permonst's pxlth field which is now gone */
-    if (ptr != &mons[PM_ALIGNED_PRIEST] && ptr != &mons[PM_ANGEL])
+    if (ptr != &mons[PM_ALIGNED_CLERIC] && ptr != &mons[PM_ANGEL])
         return (struct monst *) 0;
 #endif
 
@@ -697,7 +698,7 @@ register struct monst *roamer;
 {
     if (!roamer->isminion)
         return;
-    if (roamer->data != &mons[PM_ALIGNED_PRIEST]
+    if (roamer->data != &mons[PM_ALIGNED_CLERIC]
         && roamer->data != &mons[PM_ANGEL])
         return;
 
index bfae12d0cd7f30a3f4b2cb5b9ad38d2b83a6a3eb..2a52de0f1908e92f33055a90202e3acb575ff6d6 100644 (file)
@@ -52,7 +52,7 @@ ldrname()
     int i = g.urole.ldrnum;
 
     Sprintf(g.nambuf, "%s%s", type_is_pname(&mons[i]) ? "" : "the ",
-            mons[i].mname);
+            mons[i].pmnames[NEUTRAL]);
     return g.nambuf;
 }
 
@@ -129,7 +129,7 @@ neminame()
     int i = g.urole.neminum;
 
     Sprintf(g.nambuf, "%s%s", type_is_pname(&mons[i]) ? "" : "the ",
-            mons[i].mname);
+            mons[i].pmnames[NEUTRAL]);
     return g.nambuf;
 }
 
@@ -138,7 +138,7 @@ guardname() /* return your role leader's guard monster name */
 {
     int i = g.urole.guardnum;
 
-    return mons[i].mname;
+    return mons[i].pmnames[NEUTRAL];
 }
 
 static const char *
index 30809567e6b7660b5adaa4a95f38aba0035455f0..e32dcdfbc9e3362d108fbd4df82e3da02807247e 100644 (file)
@@ -2059,7 +2059,7 @@ do_class_genocide()
             return;
 
         class = name_to_monclass(buf, (int *) 0);
-        if (class == 0 && (i = name_to_mon(buf)) != NON_PM)
+        if (class == 0 && (i = name_to_mon(buf, (int *) 0)) != NON_PM)
             class = mons[i].mlet;
         immunecnt = gonecnt = goodcnt = 0;
         for (i = LOW_PM; i < NUMMONS; i++) {
@@ -2101,7 +2101,7 @@ do_class_genocide()
             if (mons[i].mlet == class) {
                 char nam[BUFSZ];
 
-                Strcpy(nam, makeplural(mons[i].mname));
+                Strcpy(nam, makeplural(mons[i].pmnames[NEUTRAL]));
                 /* Although "genus" is Latin for race, the hero benefits
                  * from both race and role; thus genocide affects either.
                  */
@@ -2165,12 +2165,12 @@ do_class_genocide()
                         named = type_is_pname(&mons[i]) ? TRUE : FALSE;
                         uniq = (mons[i].geno & G_UNIQ) ? TRUE : FALSE;
                         /* one special case */
-                        if (i == PM_HIGH_PRIEST)
+                        if (i == PM_HIGH_CLERIC)
                             uniq = FALSE;
 
                         You("aren't permitted to genocide %s%s.",
                             (uniq && !named) ? "the " : "",
-                            (uniq || named) ? mons[i].mname : nam);
+                            (uniq || named) ? mons[i].pmnames[NEUTRAL] : nam);
                     }
                 }
             }
@@ -2205,7 +2205,7 @@ int how;
     if (how & PLAYER) {
         mndx = u.umonster; /* non-polymorphed mon num */
         ptr = &mons[mndx];
-        Strcpy(buf, ptr->mname);
+        Strcpy(buf, pmname(ptr, Ugender));
         killplayer++;
     } else {
         for (i = 0;; i++) {
@@ -2230,7 +2230,7 @@ int how;
                 return;
             }
 
-            mndx = name_to_mon(buf);
+            mndx = name_to_mon(buf, (int *) 0);
             if (mndx == NON_PM || (g.mvitals[mndx].mvflags & G_GENOD)) {
                 pline("Such creatures %s exist in this world.",
                       (mndx == NON_PM) ? "do not" : "no longer");
@@ -2276,15 +2276,15 @@ int how;
     which = "all ";
     if (Hallucination) {
         if (Upolyd)
-            Strcpy(buf, g.youmonst.data->mname);
+            Strcpy(buf, pmname(g.youmonst.data, flags.female ? FEMALE : MALE));
         else {
             Strcpy(buf, (flags.female && g.urole.name.f) ? g.urole.name.f
                                                        : g.urole.name.m);
             buf[0] = lowc(buf[0]);
         }
     } else {
-        Strcpy(buf, ptr->mname); /* make sure we have standard singular */
-        if ((ptr->geno & G_UNIQ) && ptr != &mons[PM_HIGH_PRIEST])
+        Strcpy(buf, ptr->pmnames[NEUTRAL]); /* make sure we have standard singular */
+        if ((ptr->geno & G_UNIQ) && ptr != &mons[PM_HIGH_CLERIC])
             which = !type_is_pname(ptr) ? "the " : "";
     }
     if (how & REALLY) {
@@ -2425,7 +2425,7 @@ struct obj *from_obj;
 {
     /* SHOPKEEPERS can be revived now */
     if (*mtype == PM_GUARD || (*mtype == PM_SHOPKEEPER && !revival)
-        || *mtype == PM_HIGH_PRIEST || *mtype == PM_ALIGNED_PRIEST
+        || *mtype == PM_HIGH_CLERIC || *mtype == PM_ALIGNED_CLERIC
         || *mtype == PM_ANGEL) {
         *mtype = PM_HUMAN_ZOMBIE;
         return TRUE;
@@ -2447,6 +2447,7 @@ create_particular_parse(str, d)
 char *str;
 struct _create_particular_data *d;
 {
+    int gender_name_var = NEUTRAL;
     char *bufp = str;
     char *tmpp;
 
@@ -2516,7 +2517,13 @@ struct _create_particular_data *d;
         d->randmonst = TRUE;
         return TRUE;
     }
-    d->which = name_to_mon(bufp);
+    d->which = name_to_mon(bufp, &gender_name_var);
+    /*
+     * With the introduction of male and female monster names
+     * in 3.7, preserve that detail.
+     */
+    if (gender_name_var != NEUTRAL)
+        d->fem = gender_name_var;
     if (d->which >= LOW_PM)
         return TRUE; /* got one */
     d->monclass = name_to_monclass(bufp, &d->which);
@@ -2556,7 +2563,8 @@ struct _create_particular_data *d;
             char buf[BUFSZ];
 
             Sprintf(buf, "Creating %s instead; force %s?",
-                    mons[d->which].mname, mons[firstchoice].mname);
+                    mons[d->which].pmnames[NEUTRAL],
+                    mons[firstchoice].pmnames[NEUTRAL]);
             if (yn(buf) == 'y')
                 d->which = firstchoice;
         }
index 528d76a0463c47caa8eb3eedcee00d8e9950d5ed..935c546307ef651ab024f50141997c7ab2e5a390 100644 (file)
@@ -333,13 +333,13 @@ struct monst *mtmp;
     if (mtmp->mextra) {
         mtmp->mextra = newmextra();
 
-        /* mname - monster's name */
+        /* mgivenname - monster's name */
         if (nhfp->structlevel)
             mread(nhfp->fd, (genericptr_t) &buflen, sizeof(buflen));
         if (buflen > 0) { /* includes terminating '\0' */
-            new_mname(mtmp, buflen);
+            new_mgivenname(mtmp, buflen);
             if (nhfp->structlevel)
-                mread(nhfp->fd, (genericptr_t) MNAME(mtmp), buflen);
+                mread(nhfp->fd, (genericptr_t) MGIVENNAME(mtmp), buflen);
         }
         /* egd - vault guard */
         if (nhfp->structlevel)
index 98854f3dc8c636eb8c3431da0e15d4123153ed2c..fe30684a14f030cdcd605b7355d765fa4ca03aaf 100644 (file)
@@ -123,8 +123,8 @@ const struct Role roles[NUM_ROLES+1] = {
       "Cav",
       "the Caves of the Ancestors",
       "the Dragon's Lair",
-      PM_CAVEMAN,
-      PM_CAVEWOMAN,
+      PM_CAVE_DWELLER,
+      NON_PM,
       PM_LITTLE_DOG,
       PM_SHAMAN_KARNOV,
       PM_NEANDERTHAL,
@@ -289,8 +289,8 @@ const struct Role roles[NUM_ROLES+1] = {
       "Pri",
       "the Great Temple",
       "the Temple of Nalzok",
-      PM_PRIEST,
-      PM_PRIESTESS,
+      PM_CLERIC,
+      NON_PM,
       NON_PM,
       PM_ARCH_PRIEST,
       PM_ACOLYTE,
index f463e8939db385be03b7abed19c94dc0ad2d9897..fe6001bbf4402bfc5521b1f0f3658d8dafc22c69 100644 (file)
@@ -814,12 +814,12 @@ struct monst *mtmp;
         bwrite(nhfp->fd, (genericptr_t) mtmp, buflen);
     }
     if (mtmp->mextra) {
-        buflen = MNAME(mtmp) ? (int) strlen(MNAME(mtmp)) + 1 : 0;
+        buflen = MGIVENNAME(mtmp) ? (int) strlen(MGIVENNAME(mtmp)) + 1 : 0;
         if (nhfp->structlevel)
             bwrite(nhfp->fd, (genericptr_t) &buflen, sizeof buflen);
         if (buflen > 0) {
             if (nhfp->structlevel)
-                bwrite(nhfp->fd, (genericptr_t) MNAME(mtmp), buflen);
+                bwrite(nhfp->fd, (genericptr_t) MGIVENNAME(mtmp), buflen);
         }
         buflen = EGD(mtmp) ? (int) sizeof (struct egd) : 0;
         if (nhfp->structlevel)
index 2d1eb5b3657ff69a6482c87c37997e235776df07..e12937de27be4047b1c9f5631baecdacbbf87b04 100644 (file)
--- a/src/shk.c
+++ b/src/shk.c
@@ -839,8 +839,8 @@ char rmno;
                        (int) rmno,
                        (int) g.rooms[rmno - ROOMOFFSET].rtype,
                        shkp->mnum,
-                       /* [real shopkeeper name is kept in ESHK, not MNAME] */
-                       has_mname(shkp) ? MNAME(shkp) : "anonymous");
+                       /* [real shopkeeper name is kept in ESHK, not MGIVENNAME] */
+                       has_mgivenname(shkp) ? MGIVENNAME(shkp) : "anonymous");
             /* not sure if this is appropriate, because it does nothing to
                correct the underlying g.rooms[].resident issue but... */
             return (struct monst *) 0;
index 75b0de790f3d3fe67d5811a659b11e07dc5f058b..6a4409b21a571d79c2f576918208187783f5d1bb 100644 (file)
@@ -184,8 +184,8 @@ dosounds()
                 continue;
             if (is_mercenary(mtmp->data)
 #if 0 /* don't bother excluding these */
-                && !strstri(mtmp->data->mname, "watch")
-                && !strstri(mtmp->data->mname, "guard")
+                && !strstri(mtmp->data->pmnames[NEUTRAL], "watch")
+                && !strstri(mtmp->data->pmnames[NEUTRAL], "guard")
 #endif
                 && mon_in_room(mtmp, BARRACKS)
                 /* sleeping implies not-yet-disturbed (usually) */
@@ -634,7 +634,7 @@ register struct monst *mtmp;
          * night */
         boolean isnight = night();
         boolean kindred = (Upolyd && (u.umonnum == PM_VAMPIRE
-                                      || u.umonnum == PM_VAMPIRE_LORD));
+                                      || u.umonnum == PM_VAMPIRE_LEADER));
         boolean nightchild =
             (Upolyd && (u.umonnum == PM_WOLF || u.umonnum == PM_WINTER_WOLF
                         || u.umonnum == PM_WINTER_WOLF_CUB));
@@ -696,7 +696,8 @@ register struct monst *mtmp;
                     verbl_msg = verbuf;
                 } else if (vampindex == 1) {
                     Sprintf(verbuf, vampmsg[vampindex],
-                            Upolyd ? an(mons[u.umonnum].mname)
+                            Upolyd ? an(pmname(&mons[u.umonnum],
+                                               flags.female ? FEMALE : MALE))
                                    : an(racenoun));
                     verbl_msg = verbuf;
                 } else
@@ -1086,7 +1087,8 @@ dochat()
     struct obj *otmp;
 
     if (is_silent(g.youmonst.data)) {
-        pline("As %s, you cannot speak.", an(g.youmonst.data->mname));
+        pline("As %s, you cannot speak.",
+              an(pmname(g.youmonst.data, flags.female ? FEMALE : MALE)));
         return 0;
     }
     if (Strangled) {
index 6d64c182cbf86ca99dc39994646f6169b22d325e..859945bbca93205543cf3a0700f3e93aba380b85 100755 (executable)
@@ -1965,12 +1965,12 @@ struct mkroom *croom;
                 break;
 
             case M_AP_MONSTER: {
-                int mndx;
+                int mndx, gender_name_var = NEUTRAL;
 
                 if (!strcmpi(m->appear_as.str, "random"))
                     mndx = select_newcham_form(mtmp);
                 else
-                    mndx = name_to_mon(m->appear_as.str);
+                    mndx = name_to_mon(m->appear_as.str, &gender_name_var);
 
                 if (mndx == NON_PM || (is_vampshifter(mtmp)
                                        && !validvamp(mtmp, &mndx, S_HUMAN))) {
@@ -1998,6 +1998,8 @@ struct mkroom *croom;
                     struct permonst *olddata = mtmp->data;
 
                     mgender_from_permonst(mtmp, mdat);
+                    if (gender_name_var != NEUTRAL)
+                        mtmp->female = gender_name_var;
                     set_mon_data(mtmp, mdat);
                     if (emits_light(olddata) != emits_light(mtmp->data)) {
                         /* used to give light, now doesn't, or vice versa,
@@ -3016,7 +3018,11 @@ const char *s;
     int i;
 
     for (i = LOW_PM; i < NUMMONS; i++)
-        if (!strcmpi(mons[i].mname, s))
+        if (!strcmpi(mons[i].pmnames[NEUTRAL], s)
+            || (mons[i].pmnames[MALE] != 0
+                    && !strcmpi(mons[i].pmnames[MALE], s))
+            || (mons[i].pmnames[FEMALE] != 0
+                    && !strcmpi(mons[i].pmnames[FEMALE], s)))
             return i;
     return NON_PM;
 }
@@ -3428,7 +3434,11 @@ lua_State *L;
                 pm = mkclass(def_char_to_monclass(*montype), G_NOGEN|G_IGNORE);
             } else {
                 for (i = LOW_PM; i < NUMMONS; i++)
-                    if (!strcmpi(mons[i].mname, montype)) {
+                    if (!strcmpi(mons[i].pmnames[NEUTRAL], montype)
+                        || (mons[i].pmnames[MALE] != 0
+                               && !strcmpi(mons[i].pmnames[MALE], montype))
+                        || (mons[i].pmnames[FEMALE] != 0
+                               && !strcmpi(mons[i].pmnames[FEMALE], montype))) {
                         pm = &mons[i];
                         break;
                     }
index 7ce86a9cead17ed41ad1600372e709ea0ded8d32..790a08128773f9f0f933078c1e14885d00283c79 100644 (file)
@@ -508,11 +508,11 @@ register struct obj *otmp;
 
     if (!otmp) {
         impossible("monster (%s) taking or picking up nothing?",
-                   mtmp->data->mname);
+                   pmname(mtmp->data, Mgender(mtmp)));
         return 1;
     } else if (otmp == uball || otmp == uchain) {
         impossible("monster (%s) taking or picking up attached %s (%s)?",
-                   mtmp->data->mname,
+                   pmname(mtmp->data, Mgender(mtmp)),
                    (otmp == uchain) ? "chain" : "ball", simpleonames(otmp));
         return 0;
     }
index e380a4c5c2711c1f35fcc23537d8f68633c21864..44dd33e9f83ef4201f4a390b3b187391b7de05dc 100644 (file)
@@ -70,11 +70,12 @@ struct obj *otmp;
 
         You("touch %s.", mon_nam(mtmp));
         if (!(poly_when_stoned(g.youmonst.data) && polymon(PM_STONE_GOLEM))) {
-            Sprintf(kbuf, "attempting to saddle %s", an(mtmp->data->mname));
+            Sprintf(kbuf, "attempting to saddle %s",
+                    an(pmname(mtmp->data, Mgender(mtmp))));
             instapetrify(kbuf);
         }
     }
-    if (ptr == &mons[PM_INCUBUS] || ptr == &mons[PM_SUCCUBUS]) {
+    if (ptr == &mons[PM_AMOROUS_DEMON]) {
         pline("Shame on you!");
         exercise(A_WIS, FALSE);
         return 1;
@@ -275,7 +276,8 @@ boolean force;      /* Quietly force this animal */
         char kbuf[BUFSZ];
 
         You("touch %s.", mon_nam(mtmp));
-        Sprintf(kbuf, "attempting to ride %s", an(mtmp->data->mname));
+        Sprintf(kbuf, "attempting to ride %s",
+                an(pmname(mtmp->data, Mgender(mtmp))));
         instapetrify(kbuf);
     }
     if (!mtmp->mtame || mtmp->isminion) {
@@ -535,9 +537,9 @@ int reason; /* Player was thrown off etc. */
             You("can't.  There isn't anywhere for you to stand.");
             return;
         }
-        if (!has_mname(mtmp)) {
+        if (!has_mgivenname(mtmp)) {
             pline("You've been through the dungeon on %s with no name.",
-                  an(mtmp->data->mname));
+                  an(pmname(mtmp->data, Mgender(mtmp))));
             if (Hallucination)
                 pline("It felt good to get out of the rain.");
         } else
index 7af0b7b15bdd9e78e6dd23916ea4e14d4dda879c..88bd395f725386c55bdcf599efad8ed82b1c18e8 100644 (file)
@@ -225,7 +225,8 @@ long entflags;
         if (allow_xx_yy && goodpos(xx, yy, &fakemon, entflags)) {
             return TRUE; /* 'cc' is set */
         } else {
-            debugpline3("enexto(\"%s\",%d,%d) failed", mdat->mname, xx, yy);
+            debugpline3("enexto(\"%s\",%d,%d) failed",
+                        mdat->pmnames[NEUTRAL], xx, yy);
             return FALSE;
         }
     }
index 66e56d295b7c712b7b23fd56b3d23e376d2e41b3..9f57fbf51c48eea4214e600f5905580905f2f0ff 100644 (file)
@@ -602,7 +602,8 @@ nh_timeout()
                 }
                 dealloc_killer(kptr);
 
-                if ((m_idx = name_to_mon(g.killer.name)) >= LOW_PM) {
+                if ((m_idx = name_to_mon(g.killer.name,
+                                         (int *) 0)) >= LOW_PM) {
                     if (type_is_pname(&mons[m_idx])) {
                         g.killer.format = KILLED_BY;
                     } else if (mons[m_idx].geno & G_UNIQ) {
@@ -706,7 +707,7 @@ nh_timeout()
                     g.context.warntype.speciesidx = NON_PM;
                     if (g.context.warntype.species) {
                         You("are no longer warned about %s.",
-                            makeplural(g.context.warntype.species->mname));
+                     makeplural(g.context.warntype.species->pmnames[NEUTRAL]));
                         g.context.warntype.species = (struct permonst *) 0;
                     }
                 }
@@ -1075,15 +1076,15 @@ slip_or_trip()
         if (!uarmf && otmp->otyp == CORPSE
             && touch_petrifies(&mons[otmp->corpsenm]) && !Stone_resistance) {
             Sprintf(g.killer.name, "tripping over %s corpse",
-                    an(mons[otmp->corpsenm].mname));
+                    an(mons[otmp->corpsenm].pmnames[NEUTRAL]));
             instapetrify(g.killer.name);
         }
     } else if (rn2(3) && is_ice(u.ux, u.uy)) {
         pline("%s %s%s on the ice.",
               u.usteed ? upstart(x_monnam(u.usteed,
-                                          (has_mname(u.usteed)) ? ARTICLE_NONE
-                                                                : ARTICLE_THE,
-                                          (char *) 0, SUPPRESS_SADDLE, FALSE))
+                                      (has_mgivenname(u.usteed)) ? ARTICLE_NONE
+                                                                 : ARTICLE_THE,
+                                      (char *) 0, SUPPRESS_SADDLE, FALSE))
                        : "You",
               rn2(2) ? "slip" : "slide", on_foot ? "" : "s");
     } else {
index 60bd409f8cf71681a31ec9be596a50f972d9236f..6b20f2596d94e921be115ed563a3ce7aba1ab30a 100644 (file)
@@ -2427,7 +2427,7 @@ unsigned trflags;
         u.usteed->mtrapseen |= (1 << (ttype - 1));
         /* suppress article in various steed messages when using its
            name (which won't occur when hallucinating) */
-        if (has_mname(u.usteed) && !Hallucination)
+        if (has_mgivenname(u.usteed) && !Hallucination)
             steed_article = ARTICLE_NONE;
     }
 
@@ -3133,8 +3133,10 @@ const char *arg;
 
     if (uwep && uwep->otyp == CORPSE && touch_petrifies(&mons[uwep->corpsenm])
         && !Stone_resistance) {
-        pline("%s touch the %s corpse.", arg, mons[uwep->corpsenm].mname);
-        Sprintf(kbuf, "%s corpse", an(mons[uwep->corpsenm].mname));
+        pline("%s touch the %s corpse.", arg,
+              mons[uwep->corpsenm].pmnames[NEUTRAL]);
+        Sprintf(kbuf, "%s corpse",
+              an(mons[uwep->corpsenm].pmnames[NEUTRAL]));
         instapetrify(kbuf);
         /* life-saved; unwield the corpse if we can't handle it */
         if (!uarmg && !Stone_resistance)
@@ -3144,8 +3146,10 @@ const char *arg;
        allow two-weapon combat when either weapon is a corpse] */
     if (u.twoweap && uswapwep && uswapwep->otyp == CORPSE
         && touch_petrifies(&mons[uswapwep->corpsenm]) && !Stone_resistance) {
-        pline("%s touch the %s corpse.", arg, mons[uswapwep->corpsenm].mname);
-        Sprintf(kbuf, "%s corpse", an(mons[uswapwep->corpsenm].mname));
+        pline("%s touch the %s corpse.", arg,
+              mons[uswapwep->corpsenm].pmnames[NEUTRAL]);
+        Sprintf(kbuf, "%s corpse",
+                an(mons[uswapwep->corpsenm].pmnames[NEUTRAL]));
         instapetrify(kbuf);
         /* life-saved; unwield the corpse */
         if (!uarmg && !Stone_resistance)
@@ -4672,7 +4676,8 @@ struct trap *ttmp;
 
     /* is it a cockatrice?... */
     if (touch_petrifies(mtmp->data) && !uarmg && !Stone_resistance) {
-        You("grab the trapped %s using your bare %s.", mtmp->data->mname,
+        You("grab the trapped %s using your bare %s.",
+            pmname(mtmp->data, Mgender(mtmp)),
             makeplural(body_part(HAND)));
 
         if (poly_when_stoned(g.youmonst.data) && polymon(PM_STONE_GOLEM)) {
@@ -4681,7 +4686,7 @@ struct trap *ttmp;
             char kbuf[BUFSZ];
 
             Sprintf(kbuf, "trying to help %s out of a pit",
-                    an(mtmp->data->mname));
+                    an(pmname(mtmp->data, Mgender(mtmp))));
             instapetrify(kbuf);
             return 1;
         }
index 81927ed9f07b849c06af48388ab8b77f1e6a1e10..99be2a44d6a0500f629bf2218901cc9d402c5c9a 100644 (file)
@@ -688,7 +688,7 @@ u_init()
         knows_class(ARMOR_CLASS);
         skill_init(Skill_B);
         break;
-    case PM_CAVEMAN:
+    case PM_CAVE_DWELLER:
         Cave_man[C_AMMO].trquan = rn1(11, 10); /* 10..20 */
         ini_inv(Cave_man);
         skill_init(Skill_C);
@@ -724,7 +724,7 @@ u_init()
         skill_init(Skill_Mon);
         break;
     }
-    case PM_PRIEST:
+    case PM_CLERIC:
         ini_inv(Priest);
         if (!rn2(10))
             ini_inv(Magicmarker);
@@ -811,7 +811,7 @@ u_init()
          * Non-warriors get an instrument.  We use a kludge to
          * get only non-magic instruments.
          */
-        if (Role_if(PM_PRIEST) || Role_if(PM_WIZARD)) {
+        if (Role_if(PM_CLERIC) || Role_if(PM_WIZARD)) {
             static int trotyp[] = { WOODEN_FLUTE, TOOLED_HORN, WOODEN_HARP,
                                     BELL,         BUGLE,       LEATHER_DRUM };
             Instrument[0].trotyp = trotyp[rn2(SIZE(trotyp))];
@@ -921,7 +921,7 @@ int otyp;
     case PM_BARBARIAN:
         skills = Skill_B;
         break;
-    case PM_CAVEMAN:
+    case PM_CAVE_DWELLER:
         skills = Skill_C;
         break;
     case PM_HEALER:
@@ -933,7 +933,7 @@ int otyp;
     case PM_MONK:
         skills = Skill_Mon;
         break;
-    case PM_PRIEST:
+    case PM_CLERIC:
         skills = Skill_P;
         break;
     case PM_RANGER:
index 5855962daa4a919749a5cf8bbe877dd3a06bd50d..34896bdd048fdf8b5cecf26a13a97357eb12f551 100644 (file)
@@ -958,7 +958,7 @@ int dieroll;
                         pline("Splat!  You hit %s with %s %s egg%s!",
                               mon_nam(mon),
                               obj->known ? "the" : cnt > 1L ? "some" : "a",
-                              obj->known ? mons[obj->corpsenm].mname
+                              obj->known ? mons[obj->corpsenm].pmnames[NEUTRAL]
                                          : "petrifying",
                               plur(cnt));
                         obj->known = 1; /* (not much point...) */
@@ -971,8 +971,8 @@ int dieroll;
                     } else { /* ordinary egg(s) */
                         const char *eggp = (obj->corpsenm != NON_PM
                                             && obj->known)
-                                           ? the(mons[obj->corpsenm].mname)
-                                           : (cnt > 1L) ? "some" : "an";
+                                    ? the(mons[obj->corpsenm].pmnames[NEUTRAL])
+                                    : (cnt > 1L) ? "some" : "an";
 
                         You("hit %s with %s egg%s.", mon_nam(mon), eggp,
                             plur(cnt));
@@ -2593,7 +2593,7 @@ struct mhitm_data *mhm;
         if (uncancelled && !rn2(8)) {
             Sprintf(buf, "%s %s", s_suffix(Monnam(magr)),
                     mpoisons_subj(magr, mattk));
-            poisoned(buf, ptmp, pa->mname, 30, FALSE);
+            poisoned(buf, ptmp, pmname(pa, Mgender(magr)), 30, FALSE);
         }
     } else {
         /* mhitm */
@@ -2814,7 +2814,7 @@ struct mhitm_data *mhm;
                     g.killer.format = KILLED_BY_AN;
                     Sprintf(g.killer.name, "%s by %s",
                             moat ? "moat" : "pool of water",
-                            an(magr->data->mname));
+                            an(pmname(magr->data, Mgender(magr))));
                     done(DROWNING);
                 } else if (mattk->aatyp == AT_HUGS) {
                     You("are being crushed.");
@@ -2992,7 +2992,8 @@ struct mhitm_data *mhm;
         } else if (!Slimed) {
             You("don't feel very well.");
             make_slimed(10L, (char *) 0);
-            delayed_killer(SLIMED, KILLED_BY_AN, magr->data->mname);
+            delayed_killer(SLIMED, KILLED_BY_AN,
+                           pmname(magr->data, Mgender(magr)));
         } else
             pline("Yuck!");
     } else {
@@ -3326,7 +3327,7 @@ struct monst *mtmp;
         && !(poly_when_stoned(g.youmonst.data)
              && polymon(PM_STONE_GOLEM))) {
         int kformat = KILLED_BY_AN;
-        const char *kname = mtmp->data->mname;
+        const char *kname = pmname(mtmp->data, Mgender(mtmp));
 
         if (mtmp->data->geno & G_UNIQ) {
             if (!type_is_pname(mtmp->data))
@@ -3446,7 +3447,7 @@ struct mhitm_data *mhm;
                     && touch_petrifies(&mons[otmp->corpsenm])) {
                     mhm->damage = 1;
                     pline("%s hits you with the %s corpse.", Monnam(magr),
-                          mons[otmp->corpsenm].mname);
+                          mons[otmp->corpsenm].pmnames[NEUTRAL]);
                     if (!Stoned) {
                         if (do_stone_u(magr)) {
                             mhm->hitflags = MM_HIT;
@@ -4200,8 +4201,7 @@ int specialdmg; /* blessed and/or silver bonus against various things */
     negated = !(rn2(10) >= 3 * armpro);
 
     if (is_demon(g.youmonst.data) && !rn2(13) && !uwep
-        && u.umonnum != PM_SUCCUBUS && u.umonnum != PM_INCUBUS
-        && u.umonnum != PM_BALROG) {
+        && u.umonnum != PM_AMOROUS_DEMON && u.umonnum != PM_BALROG) {
         demonpet();
         return MM_MISS;
     }
@@ -4358,12 +4358,12 @@ register struct attack *mattk;
 
         if (fatal_gulp && !is_rider(pd)) { /* petrification */
             char kbuf[BUFSZ];
-            const char *mname = pd->mname;
+            const char *mnam = pmname(pd, Mgender(mdef));
 
             if (!type_is_pname(pd))
-                mname = an(mname);
+                mnam = an(mnam);
             You("englut %s.", mon_nam(mdef));
-            Sprintf(kbuf, "swallowing %s whole", mname);
+            Sprintf(kbuf, "swallowing %s whole", mnam);
             instapetrify(kbuf);
         } else {
             start_engulf(mdef);
@@ -4374,7 +4374,7 @@ register struct attack *mattk;
                     pline("Unfortunately, digesting any of it is fatal.");
                     end_engulf();
                     Sprintf(g.killer.name, "unwisely tried to eat %s",
-                            pd->mname);
+                            pmname(pd, Mgender(mdef)));
                     g.killer.format = NO_KILLER_PREFIX;
                     done(DIED);
                     return MM_MISS; /* lifesaved */
@@ -4425,7 +4425,7 @@ register struct attack *mattk;
                         pline1(msgbuf);
                     if (pd == &mons[PM_GREEN_SLIME]) {
                         Sprintf(msgbuf, "%s isn't sitting well with you.",
-                                The(pd->mname));
+                                The(pmname(pd, Mgender(mdef))));
                         if (!Unchanging) {
                             make_slimed(5L, (char *) 0);
                         }
index c59ffd433e25cf8d1852789624a30be8cb2efc46..8fb059a9edae8c87023b61274ea90ec762fd08a6 100644 (file)
@@ -397,7 +397,7 @@ invault()
         gsensed = !canspotmon(guard);
         if (!gsensed)
             pline("Suddenly one of the Vault's %s enters!",
-                  makeplural(guard->data->mname));
+                  makeplural(pmname(guard->data, Mgender(guard))));
         else
             pline("Someone else has entered the Vault.");
         newsym(guard->mx, guard->my);
@@ -1091,7 +1091,8 @@ boolean silently;
         gx = g.rooms[EGD(grd)->vroom].lx + rn2(2);
         gy = g.rooms[EGD(grd)->vroom].ly + rn2(2);
         Sprintf(buf, "To Croesus: here's the gold recovered from %s the %s.",
-                g.plname, mons[u.umonster].mname);
+                g.plname,
+                pmname(&mons[u.umonster], flags.female ? FEMALE : MALE));
         make_grave(gx, gy, buf);
     }
     for (coins = g.invent; coins; coins = nextcoins) {
index 7abfcdbad9efc1fc8ef617be599e02cbbd825f7b..0ccefdf8cf82048ebf31edca74f251fe7a6ed7e8 100644 (file)
@@ -1672,7 +1672,7 @@ const struct def_skill *class_skill;
     /* set skills for magic */
     if (Role_if(PM_HEALER) || Role_if(PM_MONK)) {
         P_SKILL(P_HEALING_SPELL) = P_BASIC;
-    } else if (Role_if(PM_PRIEST)) {
+    } else if (Role_if(PM_CLERIC)) {
         P_SKILL(P_CLERIC_SPELL) = P_BASIC;
     } else if (Role_if(PM_WIZARD)) {
         P_SKILL(P_ATTACK_SPELL) = P_BASIC;
index c441ad6d14f8d16ab0bbb82a410cfa31b50ae326..e0e2081512512d6e53045f8a936b78d7813176b4 100644 (file)
@@ -99,13 +99,15 @@ register struct monst *mon;
 
     pm = counter_were(monsndx(mon->data));
     if (pm < LOW_PM) {
-        impossible("unknown lycanthrope %s.", mon->data->mname);
+        impossible("unknown lycanthrope %s.",
+                    mon->data->pmnames[NEUTRAL]);
         return;
     }
 
     if (canseemon(mon) && !Hallucination)
         pline("%s changes into a %s.", Monnam(mon),
-              is_human(&mons[pm]) ? "human" : mons[pm].mname + 4);
+              is_human(&mons[pm]) ? "human"
+                                  : pmname(&mons[pm], Mgender(mon)) + 4);
 
     set_mon_data(mon, &mons[pm]);
     if (mon->msleeping || !mon->mcanmove) {
@@ -183,7 +185,7 @@ you_were()
     if (controllable_poly) {
         /* `+4' => skip "were" prefix to get name of beast */
         Sprintf(qbuf, "Do you want to change into %s?",
-                an(mons[u.ulycn].mname + 4));
+                an(mons[u.ulycn].pmnames[NEUTRAL] + 4));
         if (!paranoid_query(ParanoidWerechange, qbuf))
             return;
     }
index f3af21f49079eddeb33bcba8175b22e4d4b8ccf8..1b95009cfcf2d528c0df82a4e9471ca9795d8435 100644 (file)
@@ -520,7 +520,7 @@ static void FDECL(hup_add_menu, (winid, int, const anything *, CHAR_P, CHAR_P,
                                  int, const char *, unsigned int));
 static void FDECL(hup_end_menu, (winid, const char *));
 static void FDECL(hup_putstr, (winid, int, const char *));
-static void FDECL(hup_print_glyph, (winid, XCHAR_P, XCHAR_P, int, int));
+static void FDECL(hup_print_glyph, (winid, XCHAR_P, XCHAR_P, int, int, unsigned *));
 static void FDECL(hup_outrip, (winid, int, time_t));
 static void FDECL(hup_curs, (winid, int, int));
 static void FDECL(hup_display_nhwindow, (winid, BOOLEAN_P));
@@ -736,11 +736,12 @@ const char *text UNUSED;
 
 /*ARGSUSED*/
 static void
-hup_print_glyph(window, x, y, glyph, bkglyph)
+hup_print_glyph(window, x, y, glyph, bkglyph, glyphmod)
 winid window UNUSED;
 xchar x UNUSED, y UNUSED;
 int glyph UNUSED;
 int bkglyph UNUSED;
+unsigned *glyphmod UNUSED;
 {
     return;
 }
index 0c6462888affe14492069d4d9859b3509b295cf0..a4e9d07f15336b9fd7263ecdcef34bf2a1b2b76d 100644 (file)
@@ -35,10 +35,10 @@ static NEARDATA const int nasties[] = {
     PM_IRON_GOLEM, PM_OCHRE_JELLY, PM_GREEN_SLIME,
     PM_DISPLACER_BEAST, PM_GENETIC_ENGINEER,
     /* chaotic */
-    PM_BLACK_DRAGON, PM_RED_DRAGON, PM_ARCH_LICH, PM_VAMPIRE_LORD,
+    PM_BLACK_DRAGON, PM_RED_DRAGON, PM_ARCH_LICH, PM_VAMPIRE_LEADER,
     PM_MASTER_MIND_FLAYER, PM_DISENCHANTER, PM_WINGED_GARGOYLE,
-    PM_STORM_GIANT, PM_OLOG_HAI, PM_ELF_LORD, PM_ELVENKING,
-    PM_OGRE_KING, PM_CAPTAIN, PM_GREMLIN,
+    PM_STORM_GIANT, PM_OLOG_HAI, PM_ELF_NOBLE, PM_ELVENMONARCH,
+    PM_OGRE_TYRANT, PM_CAPTAIN, PM_GREMLIN,
     /* lawful */
     PM_SILVER_DRAGON, PM_ORANGE_DRAGON, PM_GREEN_DRAGON,
     PM_YELLOW_DRAGON, PM_GUARDIAN_NAGA, PM_FIRE_GIANT,
@@ -543,11 +543,11 @@ int difcap; /* if non-zero, try to make difficulty be lower than this */
         || (mons[res].geno & (Inhell ? G_NOHELL : G_HELL)) != 0)
         alt = big_to_little(res);
     if (alt != res && (g.mvitals[alt].mvflags & G_GENOD) == 0) {
-        const char *mname = mons[alt].mname,
-                   *lastspace = rindex(mname, ' ');
+        const char *mnam = mons[alt].pmnames[NEUTRAL],
+                   *lastspace = rindex(mnam, ' ');
 
         /* only non-juveniles can become alternate choice */
-        if (strncmp(mname, "baby ", 5)
+        if (strncmp(mnam, "baby ", 5)
             && (!lastspace
                 || (strcmp(lastspace, " hatchling")
                     && strcmp(lastspace, " pup")
index 82abcf26c1ea355b048bff32ef2409fba9c79807..7da309a02a9ff65c9cbf25edb82f7f71ae160afd 100644 (file)
@@ -1019,7 +1019,8 @@ boolean polyspot;
             char buf[BUFSZ];
 
             You("touch %s.", mon_nam(u.usteed));
-            Sprintf(buf, "falling off %s", an(u.usteed->data->mname));
+            Sprintf(buf, "falling off %s",
+                    an(pmname(u.usteed->data, Mgender(u.usteed))));
             instapetrify(buf);
         }
         dismount_steed(DISMOUNT_FELL);
index 0b4f7f4bd5a690fe79cb8dd9a6d931a20b01fb2d..04ebb818167d2a3ee13d858016033410d9edc7f7 100644 (file)
--- a/src/zap.c
+++ b/src/zap.c
@@ -1022,7 +1022,7 @@ struct monst *mon;
                 pline("%s%s suddenly %s%s%s!", owner, corpse,
                       nonliving(mtmp2->data) ? "reanimates" : "comes alive",
                       different_type ? " as " : "",
-                      different_type ? an(mtmp2->data->mname) : "");
+                      different_type ? an(pmname(mtmp2->data, Mgender(mtmp2))) : "");
             else if (canseemon(mtmp2))
                 pline("%s suddenly appears!", Amonnam(mtmp2));
         }
index 747dd0ac0d1fb03d618be3fba5e4b922f6ea09f4..125cf712d56a3c6ba5c0cf2029933f27f925a44a 100644 (file)
@@ -700,6 +700,7 @@ unsigned special; /* special feature: corpse, invis, detected, pet, ridden -
     int col, row;
     int attr;
     int ry;
+    int tilenum = 0;
 
     row = currow;
     col = curcol;
@@ -721,7 +722,10 @@ unsigned special; /* special feature: corpse, invis, detected, pet, ridden -
             if (!iflags.over_view && map[ry][col].special)
                 decal_packed(packcell, special);
 #endif
-            vesa_DisplayCell(glyph2tile[glyphnum], col - clipx, ry - clipy);
+            tilenum = glyph2tile[glyphnum];
+            if (map[ry][col].special & MG_FEMALE)
+                tilenum++;
+            vesa_DisplayCell(tilenum, col - clipx, ry - clipy);
         }
     }
     if (col < (CO - 1))
index badff0432dd25368998973922f98af9a13d66a42..621cf1d9aa528e9fa128ac10b178d2a0a48aba87 100644 (file)
@@ -688,6 +688,7 @@ unsigned char (*indexes)[TILE_X];
 {
     const struct TileImage *tile;
     unsigned x, y;
+    int row, col, ry, tilenum = 0;
 
     /* We don't have enough colors to show the statues */
     if (glyph >= GLYPH_STATUE_OFF) {
@@ -695,7 +696,16 @@ unsigned char (*indexes)[TILE_X];
     }
 
     /* Get the tile from the image */
-    tile = get_tile(glyph2tile[glyph]);
+    tilenum = glyph2tile[glyph];
+    row = currow;
+    col = curcol;
+    if ((col < 0 || col >= COLNO)
+        || (row < TOP_MAP_ROW || row >= (ROWNO + TOP_MAP_ROW)))
+        return;
+    ry = row - TOP_MAP_ROW;
+    if (map[ry][col].special & MG_FEMALE)
+        tilenum++;
+    tile = get_tile(tilenum);
 
     /* Map to a 16 bit palette; assume colors laid out as in default tileset */
     memset(indexes, 0, sizeof(indexes));
index 3d81f4ab82610ae8ea4d4eef611e17f677cf84c6..65d7f4878eca37ba2ccdd65d056444d3c77c6410 100644 (file)
@@ -1888,14 +1888,14 @@ struct permonst *ptr;
         if ((tmp2 == AD_DRLI) || (tmp2 == AD_STON) || (tmp2 == AD_DRST)
             || (tmp2 == AD_DRDX) || (tmp2 == AD_DRCO) || (tmp2 == AD_WERE))
             n += 2;
-        else if (strcmp(ptr->mname, "grid bug"))
+        else if (strcmp(ptr->pmnames[NEUTRAL], "grid bug"))
             n += (tmp2 != AD_PHYS);
         n += ((int) (ptr->mattk[i].damd * ptr->mattk[i].damn) > 23);
     }
 
     /* Leprechauns are special cases.  They have many hit dice so they
        can hit and are hard to kill, but they don't really do much damage. */
-    if (!strcmp(ptr->mname, "leprechaun"))
+    if (!strcmp(ptr->pmnames[NEUTRAL], "leprechaun"))
         n -= 2;
 
     /* Finally, adjust the monster level  0 <= n <= 24 (approx.) */
@@ -1973,7 +1973,7 @@ do_monstr()
     Fprintf(ofp, "\n\n/*\n * default mons[].difficulty values\n *\n");
     for (ptr = &mons[0]; ptr->mlet; ptr++) {
         i = mstrength(ptr);
-        Fprintf(ofp, "%-24s %2u\n", ptr->mname, (unsigned int) (uchar) i);
+        Fprintf(ofp, "%-24s %2u\n", ptr->pmnames[NEUTRAL], (unsigned int) (uchar) i);
     }
     Fprintf(ofp, " *\n */\n\n");
 
@@ -2021,9 +2021,9 @@ do_permonst()
             Fprintf(ofp, "\n        PM_");
         else
             Fprintf(ofp, "\n#define\tPM_");
-        if (mons[i].mlet == S_HUMAN && !strncmp(mons[i].mname, "were", 4))
+        if (mons[i].mlet == S_HUMAN && !strncmp(mons[i].pmnames[NEUTRAL], "were", 4))
             Fprintf(ofp, "HUMAN_");
-        for (nam = c = tmpdup(mons[i].mname); *c; c++)
+        for (nam = c = tmpdup(mons[i].pmnames[NEUTRAL]); *c; c++)
             if (*c >= 'a' && *c <= 'z')
                 *c -= (char) ('a' - 'A');
             else if (*c < 'A' || *c > 'Z')
index 7f4926df52cb48f72beeb446e77f7681988f6db1..ba4c215679a5103e13fff9edbbca43196500b2f2 100644 (file)
@@ -474,11 +474,12 @@ void NetHackQtBind::qt_cliparound_window(winid wid, int x, int y)
     NetHackQtWindow* window=id_to_window[(int)wid];
     window->ClipAround(x,y);
 }
-void NetHackQtBind::qt_print_glyph(winid wid,XCHAR_P x,XCHAR_P y,int glyph,int bkglyph UNUSED)
+void NetHackQtBind::qt_print_glyph(winid wid,XCHAR_P x,XCHAR_P y,int glyph,
+                                    int bkglyph UNUSED, unsigned *glyphmod)
 {
     /* TODO: bkglyph */
     NetHackQtWindow* window=id_to_window[(int)wid];
-    window->PrintGlyph(x,y,glyph);
+    window->PrintGlyph(x,y,glyph,glyphmod);
 }
 //void NetHackQtBind::qt_print_glyph_compose(winid wid,xchar x,xchar y,int glyph1, int glyph2)
 //{
index bc3f2d647e5f9563e92f88fe946b3a01e3c0a685..73f4d4fa84919cade3ce46bb42cd1465e8a223c3 100644 (file)
@@ -64,7 +64,7 @@ public:
        static void qt_cliparound(int x, int y);
        static void qt_cliparound_window(winid wid, int x, int y);
         static void qt_print_glyph(winid wid, XCHAR_P x, XCHAR_P y,
-                                   int glyph, int bkglyph);
+                                   int glyph, int bkglyph, unsigned int *);
        static void qt_raw_print(const char *str);
        static void qt_raw_print_bold(const char *str);
        static int qt_nhgetch();
index bed3bd5a3f5f71199b508dc7396caec283988261..f807282f3d0b8fd34293aedc96ecfd18f870145a 100644 (file)
@@ -82,30 +82,32 @@ NetHackQtGlyphs::NetHackQtGlyphs()
 }
 
 void NetHackQtGlyphs::drawGlyph(QPainter& painter, int glyph, int x, int y,
-                                bool reversed)
+                                bool fem, bool reversed)
 {
     if (!reversed) {
         int tile = glyph2tile[glyph];
+        if (fem)
+            ++tile;
         int px = (tile % tiles_per_row) * width();
         int py = tile / tiles_per_row * height();
 
         painter.drawPixmap(x, y, pm, px, py, width(), height());
     } else {
         // for paper doll; mirrored image for left side of two-handed weapon
-        painter.drawPixmap(x, y, reversed_pixmap(glyph),
+        painter.drawPixmap(x, y, reversed_pixmap(glyph, fem),
                            0, 0, width(), height());
     }
 }
 
 void NetHackQtGlyphs::drawCell(QPainter& painter, int glyph,
-                               int cellx, int celly)
+                               int cellx, int celly, bool fem)
 {
-    drawGlyph(painter, glyph, cellx * width(), celly * height(), false);
+    drawGlyph(painter, glyph, cellx * width(), celly * height(), fem, false);
 }
 
 void NetHackQtGlyphs::drawBorderedCell(QPainter& painter, int glyph,
                                        int cellx, int celly, int border,
-                                       bool reversed)
+                                       bool reversed, bool fem)
 {
     int wd = width(),
         ht = height(),
@@ -113,7 +115,7 @@ void NetHackQtGlyphs::drawBorderedCell(QPainter& painter, int glyph,
         lox = cellx * (wd + 2),
         loy = celly * (ht + 2) + yoffset;
 
-    drawGlyph(painter, glyph, lox + 1, loy + 1, reversed);
+    drawGlyph(painter, glyph, lox + 1, loy + 1, fem, reversed);
 
 #ifdef TEXTCOLOR
     if (border != NO_BORDER) {
@@ -164,9 +166,11 @@ void NetHackQtGlyphs::drawBorderedCell(QPainter& painter, int glyph,
 }
 
 // mis-named routine to get the pixmap for a particular glyph
-QPixmap NetHackQtGlyphs::glyph(int glyphindx)
+QPixmap NetHackQtGlyphs::glyph(int glyphindx, bool fem)
 {
     int tile = glyph2tile[glyphindx];
+    if (fem)
+        ++tile;
     int px = (tile % tiles_per_row) * tilefile_tile_W;
     int py = tile / tiles_per_row * tilefile_tile_H;
 
@@ -175,9 +179,9 @@ QPixmap NetHackQtGlyphs::glyph(int glyphindx)
 }
 
 // transpose a glyph's tile horizontally, scaled for use in paper doll
-QPixmap NetHackQtGlyphs::reversed_pixmap(int glyphindx)
+QPixmap NetHackQtGlyphs::reversed_pixmap(int glyphindx, bool fem)
 {
-    QPixmap pxmp = glyph(glyphindx);
+    QPixmap pxmp = glyph(glyphindx, fem);
 #ifdef ENHANCED_PAPERDOLL
     qreal wid = (qreal) pxmp.width(),
           //hgt = (qreal) pxmp.height(),
index 39b0e3914f98eb97ca862ccd2d6f5576aaa92af9..afc2b92caee5eac9623d172f59d22f8b4bbbed27 100644 (file)
@@ -24,13 +24,13 @@ public:
        void setSize(int w, int h);
 
         void drawGlyph(QPainter &, int glyph, int pixelx, int pixely,
-                       bool reversed = false);
-        void drawCell(QPainter &, int glyph, int cellx, int celly);
+                       bool fem, bool reversed = false);
+        void drawCell(QPainter &, int glyph, int cellx, int celly, bool fem);
         void drawBorderedCell(QPainter &, int glyph,
                               int cellx, int celly, int bordercode,
-                              bool reversed);
-        QPixmap glyph(int glyphindx);
-        QPixmap reversed_pixmap(int glyphindx);
+                              bool reversed, bool fem = false);
+        QPixmap glyph(int glyphindx, bool fem = false);
+        QPixmap reversed_pixmap(int glyphindx, bool fem = false);
 
 private:
        QImage img;
index f55e023c8636d963b65ee5daf493766d90715fc4..b3681b1552bcca16dacbc73bf4d842a186eec4d7 100644 (file)
@@ -176,14 +176,19 @@ void NetHackQtMapViewport::paintEvent(QPaintEvent* event)
 
        for (int j=garea.top(); j<=garea.bottom(); j++) {
            for (int i=garea.left(); i<=garea.right(); i++) {
+#if 0
                unsigned short g=Glyph(i,j);
                int color;
                int ch;
                unsigned special;
-
+#else
+               int color = Glyphcolor(i,j);
+               int ch = Glyphttychar(i,j);
+               unsigned special = Glyphflags(i,j);
+#endif
                painter.setPen( Qt::green );
                /* map glyph to character and color */
-               mapglyph(g, &ch, &color, &special, i, j, 0);
+//             mapglyph(g, &ch, &color, &special, i, j, 0);
                ch = cp437(ch);
 #ifdef TEXTCOLOR
                painter.setPen( nhcolor_to_pen(color) );
@@ -220,15 +225,20 @@ void NetHackQtMapViewport::paintEvent(QPaintEvent* event)
         }
 
        painter.setFont(font());
-    } else {
+    } else { // tiles
        for (int j=garea.top(); j<=garea.bottom(); j++) {
            for (int i=garea.left(); i<=garea.right(); i++) {
                unsigned short g=Glyph(i,j);
+#if 0
                int color;
                int ch;
                unsigned special;
                mapglyph(g, &ch, &color, &special, i, j, 0);
-               qt_settings->glyphs().drawCell(painter, g, i, j);
+#else
+               unsigned special = Glyphflags(i, j);
+#endif
+                bool femflag = (special & MG_FEMALE) ? true : false;
+                qt_settings->glyphs().drawCell(painter, g, i, j, femflag);
 #ifdef TEXTCOLOR
                 if ((special & MG_PET) != 0 && ::iflags.hilite_pet) {
                     painter.drawPixmap(QPoint(i*qt_settings->glyphs().width(),
@@ -559,8 +569,14 @@ void NetHackQtMapViewport::Clear()
         // FIXME:  map column 0 should be surpressed from being displayed
         //
         Glyph(0, j) = GLYPH_NOTHING;
+        Glyphttychar(0, j) = ' ';
+        Glyphcolor(0, j) = NO_COLOR;
+        Glyphflags(0, j) = 0;
         for (int i = 1; i < COLNO; ++i)
             Glyph(i, j) = GLYPH_UNEXPLORED;
+            Glyphttychar(0, j) = ' ';
+            Glyphcolor(0, j) = NO_COLOR;
+            Glyphflags(0, j) = 0;
     }
 
     change.clear();
@@ -594,9 +610,12 @@ void NetHackQtMapViewport::CursorTo(int x,int y)
     Changed(cursor.x(),cursor.y());
 }
 
-void NetHackQtMapViewport::PrintGlyph(int x,int y,int theglyph)
+void NetHackQtMapViewport::PrintGlyph(int x,int y,int theglyph,unsigned *glyphmod)
 {
     Glyph(x,y)=theglyph;
+    Glyphttychar(x,y)=glyphmod[GM_TTYCHAR];
+    Glyphcolor(x,y)=glyphmod[GM_COLOR];
+    Glyphflags(x,y)=glyphmod[GM_FLAGS];
     Changed(x,y);
 }
 
@@ -701,9 +720,9 @@ void NetHackQtMapWindow2::ClipAround(int x,int y)
     ensureVisible(x,y,width()*0.45,height()*0.45);
 }
 
-void NetHackQtMapWindow2::PrintGlyph(int x,int y,int glyph)
+void NetHackQtMapWindow2::PrintGlyph(int x,int y,int glyph, unsigned *glyphmod)
 {
-    m_viewport->PrintGlyph(x, y, glyph);
+    m_viewport->PrintGlyph(x, y, glyph, glyphmod);
 }
 
 #if 0 //RLC
@@ -825,8 +844,15 @@ void NetHackQtMapWindow::Clear()
 {
     for (int j = 0; j < ROWNO; ++j) {
         Glyph(0, j) = GLYPH_NOTHING;
-        for (int i = 1; i < COLNO; ++i)
+        Glyphcolor(0, j) = NO_COLOR;
+        Glyphttychar(0, j) = ' ';
+        Glyphflags(0, j) = 0;
+        for (int i = 1; i < COLNO; ++i) {
             Glyph(i, j) = GLYPH_UNEXPLORED;
+            Glyphcolor(i, j) = NO_COLOR;
+            Glyphttychar(i, j) = ' ';
+            Glyphflags(i, j) = 0;
+        }
     }
 
     change.clear();
@@ -897,13 +923,18 @@ void NetHackQtMapWindow::paintEvent(QPaintEvent* event)
        for (int j=garea.top(); j<=garea.bottom(); j++) {
            for (int i=garea.left(); i<=garea.right(); i++) {
                unsigned short g=Glyph(i,j);
+#if 0
                int color;
                char32_t ch;
                unsigned special;
-
+#else
+               int color = Glyphcolor(i,j);
+               char32_t ch = Glyphttychar(i,j);
+               unsigned special = Glyphflags(i,j);
+#endif
                painter.setPen( Qt::green );
                /* map glyph to character and color */
-               mapglyph(g, &ch, &color, &special, i, j, 0);
+//             mapglyph(g, &ch, &color, &special, i, j, 0);
 #ifdef TEXTCOLOR
                painter.setPen( nhcolor_to_pen(color) );
 #endif
@@ -935,11 +966,18 @@ void NetHackQtMapWindow::paintEvent(QPaintEvent* event)
        for (int j=garea.top(); j<=garea.bottom(); j++) {
            for (int i=garea.left(); i<=garea.right(); i++) {
                unsigned short g=Glyph(i,j);
+#if 0
                int color;
                int ch;
                unsigned special;
                mapglyph(g, &ch, &color, &special, i, j, 0);
-               qt_settings->glyphs().drawCell(painter, g, i, j);
+#else
+               int color = Glyphcolor(i,j);
+               int ch = Glyphttychar(i,j);
+               unsigned special = Glyphflags(i,j);
+#endif
+                bool femflag = (special & MG_FEMALE) ? true : false;
+                qt_settings->glyphs().drawCell(painter, g, i, j, femflag);
 #ifdef TEXTCOLOR
                 if ((special & MG_PET) != 0 && ::iflags.hilite_pet) {
                     painter.drawPixmap(QPoint(i*qt_settings->glyphs().width(),
@@ -1048,9 +1086,12 @@ void NetHackQtMapWindow::ClipAround(int x,int y)
     viewport.center(x,y,0.45,0.45);
 }
 
-void NetHackQtMapWindow::PrintGlyph(int x,int y,int glyph)
+void NetHackQtMapWindow::PrintGlyph(int x,int y,int glyph, unsigned *glyphmod)
 {
     Glyph(x,y)=glyph;
+    Glyphttychar(x,y)=glyphmod[GM_TTYCHAR];
+    Glyphcolor(x,y)=glyphmod[GM_COLOR];
+    Glyphflags(x,y)=glyphmod[GM_FLAGS];
     Changed(x,y);
 }
 
index bf8afceb4386f544b6adea33c7247c7e17172a78..6200e04120cccbf4e317bb925321e8e00b0246d6 100644 (file)
@@ -32,6 +32,12 @@ private:
        QFont *rogue_font;
        unsigned short glyph[ROWNO][COLNO];
        unsigned short& Glyph(int x, int y) { return glyph[y][x]; }
+        unsigned int glyphttychar[ROWNO][COLNO];
+       unsigned int& Glyphttychar(int x, int y) { return glyphttychar[y][x]; }
+        unsigned int glyphcolor[ROWNO][COLNO];
+       unsigned int& Glyphcolor(int x, int y) { return glyphcolor[y][x]; }
+        unsigned int glyphflags[ROWNO][COLNO]; 
+       unsigned int& Glyphflags(int x, int y) { return glyphflags[y][x]; }
        QPoint cursor;
        QPixmap pet_annotation;
         QPixmap pile_annotation;
@@ -42,7 +48,7 @@ private:
        void Clear();
        void Display(bool block);
        void CursorTo(int x,int y);
-       void PrintGlyph(int x,int y,int glyph);
+       void PrintGlyph(int x,int y,int glyph,unsigned *glyphmod);
        void Changed(int x, int y);
        void updateTiles();
 
@@ -64,7 +70,7 @@ public:
        virtual void CursorTo(int x,int y);
        virtual void PutStr(int attr, const QString& text);
        virtual void ClipAround(int x,int y);
-       virtual void PrintGlyph(int x,int y,int glyph);
+       virtual void PrintGlyph(int x,int y,int glyph,unsigned *glyphmod);
 
 signals:
        void resized();
index bbc3132fa92a9fa911faec5fcbdb7b448722e575..e20735b56e69deecffe2ba258d4a64bc6f3672d6 100644 (file)
@@ -82,14 +82,14 @@ public:
     {
     }
 
-    void setGlyph(int g)
+    void setGlyph(int g, bool fem)
     {
        NetHackQtGlyphs& glyphs = qt_settings->glyphs();
        int gw = glyphs.width();
        int gh = glyphs.height();
        QPixmap pm(gw,gh);
        QPainter p(&pm);
-       glyphs.drawGlyph(p, g, 0, 0);
+       glyphs.drawGlyph(p, g, 0, 0, fem);
        p.end();
        setIcon(QIcon(pm));
        //RLC setHeight(std::max(pm.height()+1,height()));
@@ -124,7 +124,7 @@ public:
 #endif
        )
     {
-       setGlyph(monnum_to_glyph(roles[id].malenum));
+       setGlyph(monnum_to_glyph(roles[id].malenum), false);
     }
 };
 
@@ -139,7 +139,7 @@ public:
 #endif
        )
     {
-       setGlyph(monnum_to_glyph(races[id].malenum));
+       setGlyph(monnum_to_glyph(races[id].malenum), false);
     }
 };
 
@@ -257,6 +257,7 @@ NetHackQtPlayerSelector::NetHackQtPlayerSelector(NetHackQtKeyBuffer& ks UNUSED)
 
     chosen_gend = flags.initgend;
     chosen_align = flags.initalign;
+    bool fem = (chosen_gend > ROLE_NONE);
 
     // XXX QListView unsorted goes in rev.
     for (nrole=0; roles[nrole].name.m; nrole++)
@@ -264,8 +265,8 @@ NetHackQtPlayerSelector::NetHackQtPlayerSelector(NetHackQtKeyBuffer& ks UNUSED)
     role->setRowCount(nrole);
     for (i=0; roles[i].name.m; i++) {
        QTableWidgetItem *item = new QTableWidgetItem(
-               QIcon(qt_settings->glyphs().glyph(roles[i].malenum)),
-               roles[i].name.m);
+                QIcon(qt_settings->glyphs().glyph(roles[i].malenum, fem)),
+                roles[i].name.m);
        item->setFlags(Qt::ItemIsEnabled|Qt::ItemIsSelectable);
        role->setItem(i, 0, item);
     }
@@ -280,7 +281,7 @@ NetHackQtPlayerSelector::NetHackQtPlayerSelector(NetHackQtKeyBuffer& ks UNUSED)
     race->setRowCount(nrace);
     for (i=0; races[i].noun; i++) {
        QTableWidgetItem *item = new QTableWidgetItem(
-               QIcon(qt_settings->glyphs().glyph(races[i].malenum)),
+                QIcon(qt_settings->glyphs().glyph(races[i].malenum, fem)),
                races[i].noun);
        item->setFlags(Qt::ItemIsEnabled|Qt::ItemIsSelectable);
        race->setItem(i, 0, item);
@@ -290,9 +291,13 @@ NetHackQtPlayerSelector::NetHackQtPlayerSelector(NetHackQtKeyBuffer& ks UNUSED)
     race->setHorizontalHeaderLabels(QStringList("Race"));
     race->resizeColumnToContents(0);
 
-    // TODO: render the alignment and gender labels smaller to match the
-    // horizontal header labels for role and race; getting the font from
-    // race table above and setting it for labels below made no difference
+    // TODO:
+    //  Render the alignment and gender labels smaller to match the
+    //  horizontal header labels for role and race; getting the font from
+    //  race table above and setting it for labels below made no difference.
+    //
+    // Maybe, if the order of choosing becomes more dynamic:
+    //  Replace the role and race glyphs when gender gets set.
 
     QLabel *gendlabel = new QLabel("Gender");
     genderbox->layout()->addWidget(gendlabel);
index 88a6cfa8c5cfae605298a07c662b84d384554495..3fca92c89ddf0778f2f0854406968090bec96c03 100644 (file)
@@ -788,7 +788,8 @@ void NetHackQtStatusWindow::updateStats()
     if (u.usteed) ++k, ride.show(); else ride.hide();
 
     if (Upolyd) {
-       buf = nh_capitalize_words(mons[u.umonnum].mname);
+       buf = nh_capitalize_words(pmname(&mons[u.umonnum],
+                                  ::flags.female ? FEMALE : MALE));
     } else {
        buf = rank_of(u.ulevel, g.pl_character[0], ::flags.female);
     }
index 3fd51edf962ac3cca2b2c7c984f2347a97eff442..670ae8da8b7d09487c37b4230d16296b062b8f89 100644 (file)
@@ -109,7 +109,7 @@ void NetHackQtWindow::EndMenu(const QString& prompt UNUSED) { puts("unexpected E
 int NetHackQtWindow::SelectMenu(int how UNUSED, MENU_ITEM_P **menu_list UNUSED)
                                { puts("unexpected SelectMenu"); return 0; }
 void NetHackQtWindow::ClipAround(int x UNUSED,int y UNUSED) { puts("unexpected ClipAround"); }
-void NetHackQtWindow::PrintGlyph(int x UNUSED,int y UNUSED,int glyph UNUSED) { puts("unexpected PrintGlyph"); }
+void NetHackQtWindow::PrintGlyph(int x UNUSED,int y UNUSED,int glyph UNUSED, unsigned *glyphmod UNUSED) { puts("unexpected PrintGlyph"); }
 //void NetHackQtWindow::PrintGlyphCompose(int x,int y,int,int) { puts("unexpected PrintGlyphCompose"); }
 void NetHackQtWindow::UseRIP(int how UNUSED, time_t when UNUSED) { puts("unexpected UseRIP"); }
 
index daa6e0d1decb9ba58864303aa5d5bfd6ab10467f..681b06be1938079d5a47e5c8e4a6f2a2dbfcedc7 100644 (file)
@@ -40,7 +40,7 @@ public:
        virtual void EndMenu(const QString& prompt);
        virtual int SelectMenu(int how, MENU_ITEM_P **menu_list);
         virtual void ClipAround(int x, int y);
-        virtual void PrintGlyph(int x, int y, int glyph);
+        virtual void PrintGlyph(int x, int y, int glyph, unsigned *glyphmod);
        virtual void UseRIP(int how, time_t when);
 
        int nhid;
index 6e2d2aa7cc33b7d340e97500ff8057cbf4b2ed59..19cbe0400b0c968069ca12619feb504d59cdb77f 100644 (file)
@@ -73,11 +73,12 @@ static void FDECL(display_cursor, (struct xwindow *));
 /* Global functions ======================================================= */
 
 void
-X11_print_glyph(window, x, y, glyph, bkglyph)
+X11_print_glyph(window, x, y, glyph, bkglyph, glyphmod)
 winid window;
 xchar x, y;
 int glyph;
 int bkglyph UNUSED;
+unsigned *glyphmod UNUSED;
 {
     struct map_info_t *map_info;
     boolean update_bbox = FALSE;
@@ -1295,6 +1296,8 @@ boolean inverted;
                 int dest_x = (cur_col - COL0_OFFSET) * tile_map->square_width;
                 int dest_y = row * tile_map->square_height;
 
+                if ((tile_map->glyphs[row][cur_col].special & MG_FEMALE))
+                    tile++; /* advance to the female tile variation */
                 src_x = (tile % TILES_PER_ROW) * tile_width;
                 src_y = (tile / TILES_PER_ROW) * tile_height;
                 XCopyArea(dpy, tile_pixmap, XtWindow(wp->w),
index a30ed01e7088b458cd161b42186f8ab916581615..cbc0ce078d738f0022ac54ab17f1f1f45d7ee655 100644 (file)
@@ -1453,15 +1453,15 @@ long new_value;
             buf[0] = highc(buf[0]);
             Strcat(buf, " the ");
             if (Upolyd) {
-                char mname[BUFSZ];
+                char mnam[BUFSZ];
                 int k;
 
-                Strcpy(mname, mons[u.umonnum].mname);
-                for (k = 0; mname[k] != '\0'; k++) {
-                    if (k == 0 || mname[k - 1] == ' ')
-                        mname[k] = highc(mname[k]);
+                Strcpy(mnam, pmname(&mons[u.umonnum], Ugender));
+                for (k = 0; mnam[k] != '\0'; k++) {
+                    if (k == 0 || mnam[k - 1] == ' ')
+                        mnam[k] = highc(mnam[k]);
                 }
-                Strcat(buf, mname);
+                Strcat(buf, mnam);
             } else
                 Strcat(buf,
                        rank_of(u.ulevel, g.pl_character[0], flags.female));
index b6825632f21890d45833c44800cf21e5037cbc86..fb84ab32ae230c11dce1530d7bae41746c5de777 100644 (file)
@@ -272,12 +272,13 @@ char *posbar;
 
 /* XXX can we decode the glyph in a meaningful way? */
 void
-chainin_print_glyph(window, x, y, glyph, bkglyph)
+chainin_print_glyph(window, x, y, glyph, bkglyph, glyphmod)
 winid window;
 xchar x, y;
 int glyph, bkglyph;
+int glyphmod[NUM_GLYPHMOD];
 {
-    (*cibase->nprocs->win_print_glyph)(cibase->ndata, window, x, y, glyph, bkglyph);
+    (*cibase->nprocs->win_print_glyph)(cibase->ndata, window, x, y, glyph, bkglyph, glyphmod);
 }
 
 void
index a4401a1eb312178566f12de0895c124ee52177ca..3ad84aa453aaef70299e133c3c569fdaf812c06e 100644 (file)
@@ -336,15 +336,16 @@ char *posbar;
 #endif
 
 void
-chainout_print_glyph(vp, window, x, y, glyph, bkglyph)
+chainout_print_glyph(vp, window, x, y, glyph, bkglyph, glyphmod)
 void *vp;
 winid window;
 xchar x, y;
 int glyph, bkglyph;
+int glyphmod[NUM_GLYPHMOD];
 {
     struct chainout_data *tdp = vp;
 
-    (*tdp->nprocs->win_print_glyph)(window, x, y, glyph, bkglyph);
+    (*tdp->nprocs->win_print_glyph)(window, x, y, glyph, bkglyph, glyphmod);
 }
 
 void
index e2939549ebc32cbc2029ab33fb79c0087363a177..b6519e443268b339c304e714b63ef86cb11c4a7d 100644 (file)
@@ -578,19 +578,20 @@ char *posbar;
 /* XXX can we decode the glyph in a meaningful way? see mapglyph()?
  genl_putmixed?  */
 void
-trace_print_glyph(vp, window, x, y, glyph, bkglyph)
+trace_print_glyph(vp, window, x, y, glyph, bkglyph, glyphmod)
 void *vp;
 winid window;
 xchar x, y;
 int glyph, bkglyph;
+int glyphmod[NUM_GLYPHMOD];
 {
     struct trace_data *tdp = vp;
 
-    fprintf(wc_tracelogf, "%sprint_glyph(%d, %d, %d, %d, %d)\n", INDENT, window,
-            x, y, glyph, bkglyph);
+    fprintf(wc_tracelogf, "%sprint_glyph(%d, %d, %d, %d, %d, %lu)\n", INDENT, window,
+            x, y, glyph, bkglyph, glyphmod);
 
     PRE;
-    (*tdp->nprocs->win_print_glyph)(tdp->ndata, window, x, y, glyph, bkglyph);
+    (*tdp->nprocs->win_print_glyph)(tdp->ndata, window, x, y, glyph, bkglyph, glyphmod);
     POST;
 }
 
index 4035b3c9f42e08bca366dd0eaf332e2a7e0f318a..baceb89015230153cf5c7bb843ddd42b29f8b377 100644 (file)
@@ -646,17 +646,21 @@ curses_cliparound(int x, int y)
 }
 
 /*
-print_glyph(window, x, y, glyph, bkglyph)
+print_glyph(window, x, y, glyph, bkglyph, glyphmod)
                 -- Print the glyph at (x,y) on the given window.  Glyphs are
                    integers at the interface, mapped to whatever the window-
                    port wants (symbol, font, color, attributes, ...there's
                    a 1-1 map between glyphs and distinct things on the map).
                    bkglyph is to render the background behind the glyph.
                    It's not used here.
+                -- glyphmod (glyphmod[NUM_GLYPHNOD]) provides extended
+                   information about the glyph that window ports can use to
+                   enhance the display in various ways.
+
 */
 void
 curses_print_glyph(winid wid, XCHAR_P x, XCHAR_P y, int glyph,
-                   int bkglyph UNUSED)
+                   int bkglyph UNUSED, unsigned *glyphmod)
 {
     int ch;
     int color;
index 6a3a5d8333e47104a2a38ee06d45555e52160e9e..63c18888621b4f42cfc3eb8de26ce3dd0897e924 100644 (file)
@@ -1468,7 +1468,7 @@ get_playerrank(char *rank)
     if (Upolyd) {
         int k = 0;
 
-        Strcpy(buf, mons[u.umonnum].mname);
+        Strcpy(buf, pmname(&mons[u.umonnum], flags.female ? FEMALE : MALE));
         while(buf[k] != 0) {
             if ((k == 0 || (k > 0 && buf[k-1] == ' ')) &&
                 'a' <= buf[k] && buf[k] <= 'z')
index 6a69c8de6deef887fb6a2a66ffa83035123cd2f9..e14f4611fec07820dd2a5898b43cb4380a7bef13 100644 (file)
@@ -27,7 +27,7 @@ Y = (149, 149, 149)
 Z = (195, 195, 195)
 0 = (100, 100, 100)
 1 = (72, 108, 108)
-# tile 0 (giant ant)
+# tile 0 (giant ant,male)
 {
   ................
   ................
@@ -46,7 +46,45 @@ Z = (195, 195, 195)
   ......JA.JA.....
   ................
 }
-# tile 1 (killer bee)
+# tile 1 (giant ant,female)
+{
+  ................
+  ................
+  ................
+  ................
+  ................
+  ................
+  ................
+  .......JAJKKA...
+  .....JAAAKJJJA..
+  .....AKJJAJJAA..
+  ...KKAJJJAAA....
+  ..BJJAAAAAJJA...
+  ..JBJAJAJAA.....
+  .....AJA.JA.....
+  ......JA.JA.....
+  ................
+}
+# tile 2 (killer bee,male)
+{
+  ................
+  ................
+  .PPP.....PP.....
+  PPPPP...PBPP....
+  PBPPP..PBPPP....
+  .PPBP.PPLPLL....
+  ...PP.PLLALHAH..
+  ...AKKKLAHAAHH..
+  BBJJJJJJJAHHAA..
+  ABJBBJJJJAHAHH..
+  .JJABJAJ.J.HH...
+  .......J.J......
+  ................
+  ...AAAAAAAAAAA..
+  .....AAAAAA.....
+  ................
+}
+# tile 3 (killer bee,female)
 {
   ................
   ................
@@ -65,7 +103,26 @@ Z = (195, 195, 195)
   .....AAAAAA.....
   ................
 }
-# tile 2 (soldier ant)
+# tile 4 (soldier ant,male)
+{
+  ................
+  ................
+  ................
+  ................
+  ................
+  ................
+  ................
+  .......JAJKKA...
+  .....JAAAKJJJA..
+  .....AKJJAJJAA..
+  .JJKKAJJJAAA....
+  JBJJJAAAAAJJA...
+  JJJBJAJAJAA.....
+  JAAJJAJA.JA.....
+  ..JJAAJA.JA.....
+  ................
+}
+# tile 5 (soldier ant,female)
 {
   ................
   ................
@@ -84,7 +141,26 @@ Z = (195, 195, 195)
   ..JJAAJA.JA.....
   ................
 }
-# tile 3 (fire ant)
+# tile 6 (fire ant,male)
+{
+  ................
+  ................
+  ................
+  ................
+  ................
+  ................
+  ................
+  .......DACCCA...
+  .....DAAACDDDA..
+  .....ACDDADDAA..
+  ...CCADDDAAA....
+  ..GDDAAAAADDA...
+  ..DGDADADAA.....
+  .....ADA.DA.....
+  ......DA.DA.....
+  ................
+}
+# tile 7 (fire ant,female)
 {
   ................
   ................
@@ -103,7 +179,26 @@ Z = (195, 195, 195)
   ......DA.DA.....
   ................
 }
-# tile 4 (giant beetle)
+# tile 8 (giant beetle,male)
+{
+  ................
+  ................
+  ................
+  ................
+  ................
+  ................
+  ......KKDKK.....
+  ....KACLCJJD....
+  ...KCLCJJDDDK...
+  ...DCCJDADDAD...
+  ...ADJDDDDDDD...
+  ...BAKDDAADKAA..
+  ...ABAKDDK......
+  ......AA.AA.....
+  ................
+  ................
+}
+# tile 9 (giant beetle,female)
 {
   ................
   ................
@@ -122,7 +217,26 @@ Z = (195, 195, 195)
   ................
   ................
 }
-# tile 5 (queen bee)
+# tile 10 (queen bee,male)
+{
+  ................
+  .PPP.....PP.....
+  PPPPP...PPPP....
+  PPPPP..PPBPP....
+  PBPPP..PBPPP....
+  .PPBP.PPLPLL....
+  ...PP.PLLALHAH..
+  ...AKKKLAHAAHH..
+  BBJJJJJJJAHHAAH.
+  ABJBBJJJJAHAHHH.
+  .JJABJAJ.JHHHAA.
+  ...J...J.JAAAHH.
+  ..JJ..JJ.J.HHAH.
+  ..JAAAJAAJ..HH..
+  .....AAAAAA.....
+  ................
+}
+# tile 11 (queen bee,female)
 {
   ................
   .PPP.....PP.....
@@ -141,7 +255,26 @@ Z = (195, 195, 195)
   .....AAAAAA.....
   ................
 }
-# tile 6 (acid blob)
+# tile 12 (acid blob,male)
+{
+  ................
+  ................
+  ................
+  .....KDDA.......
+  ...DDKDDKA......
+  .DDDIIIDJDA.....
+  D.IIOOIIDAIA....
+  .DKNNNODIDA..IA.
+  IDJNANOJDDJA....
+  ADIDNOIDIDDDA...
+  ...JDIKIADKIA...
+  .IA.IDID.JDA....
+  ...I.DDA....DA..
+  .........IA.....
+  ..IA............
+  ................
+}
+# tile 13 (acid blob,female)
 {
   ................
   ................
@@ -160,7 +293,26 @@ Z = (195, 195, 195)
   ..IA............
   ................
 }
-# tile 7 (quivering blob)
+# tile 14 (quivering blob,male)
+{
+  ................
+  ................
+  .....PPPP.......
+  .........P......
+  .P.OOOPPE..AAA..
+  P.OPBBBPOEAEAA..
+  P.PBNNNP.OEAAEA.
+  P.PNNNNNPOEEAEA.
+  POPNAANNEO.OAEA.
+  .OPNAANNE..OAAA.
+  .OPBNNNEPP.OEAA.
+  BPOPEEEBBPO.EEA.
+  BBBPBBBBBBPPPPA.
+  ..BBBBBBBBBBPA..
+  ................
+  ................
+}
+# tile 15 (quivering blob,female)
 {
   ................
   ................
@@ -179,7 +331,26 @@ Z = (195, 195, 195)
   ................
   ................
 }
-# tile 8 (gelatinous cube)
+# tile 16 (gelatinous cube,male)
+{
+  ................
+  ................
+  ................
+  ................
+  ................
+  .......LLL......
+  .....LLLLLLLL...
+  ...LLLLLLLLLD...
+  ...CLLLLLLLDDA..
+  ...CGGCLLLDDDAA.
+  ...CAGCGGDDDDAAA
+  ...CCCCAGDDDAAAA
+  .....CCCCDDAAAA.
+  .......CCDAAA...
+  ................
+  ................
+}
+# tile 17 (gelatinous cube,female)
 {
   ................
   ................
@@ -198,7 +369,26 @@ Z = (195, 195, 195)
   ................
   ................
 }
-# tile 9 (chickatrice)
+# tile 18 (chickatrice,male)
+{
+  ................
+  ................
+  ................
+  ................
+  .......OO.......
+  ......HAOO......
+  .....HHOOH.HHA..
+  ........OOHOA...
+  ........OOFA....
+  ........FGGFA...
+  ........AGFGAA..
+  ...........GA...
+  .......F..FFA...
+  .......AFFAA....
+  ........AA......
+  ................
+}
+# tile 19 (chickatrice,female)
 {
   ................
   ................
@@ -217,7 +407,26 @@ Z = (195, 195, 195)
   ........AA......
   ................
 }
-# tile 10 (cockatrice)
+# tile 20 (cockatrice,male)
+{
+  ................
+  ...D.DD.........
+  ....DD..........
+  ....NL..AA......
+  ..HHAN.AAA......
+  .HH.NO..AAAA....
+  ...AOOLFFFAA....
+  ...OOLKGGFFAA...
+  ...AOAGGFGFFAA..
+  .......GFFGFAA..
+  .........FGGAA..
+  .....FA...FFA...
+  ....FA....FFA...
+  ....FA..FFFA....
+  .....FFFFA......
+  ................
+}
+# tile 21 (cockatrice,female)
 {
   ................
   ...D.DD.........
@@ -236,7 +445,26 @@ Z = (195, 195, 195)
   .....FFFFA......
   ................
 }
-# tile 11 (pyrolisk)
+# tile 22 (pyrolisk,male)
+{
+  ................
+  ...D.DD.........
+  ....DD..........
+  ....NB..AA......
+  ..HHAN.AAA......
+  .HH.NB..AAAA....
+  ...APBBJJJAA....
+  ...PPPKDDKJAA...
+  ...APADDKDKJAA..
+  .......DJKDJAA..
+  .........JDDAA..
+  .....JA...JJA...
+  ....JA....JJA...
+  ....KA..KKKA....
+  .....JKKKA......
+  ................
+}
+# tile 23 (pyrolisk,female)
 {
   ................
   ...D.DD.........
@@ -255,7 +483,26 @@ Z = (195, 195, 195)
   .....JKKKA......
   ................
 }
-# tile 12 (jackal)
+# tile 24 (jackal,male)
+{
+  ................
+  ................
+  ................
+  ................
+  ...O..O.........
+  ...O.OO...O.....
+  ..OOOO.....O....
+  ..IOIOO....O.A..
+  .OLLOOOL...O.A..
+  DOOOAOOOOOOOAA..
+  ..AAOOOOOOOOAA..
+  ....OJOOOOOLAA..
+  ....OJOLKALKAA..
+  ...OOAOAAAOAA...
+  .....OO..OOA....
+  ................
+}
+# tile 25 (jackal,female)
 {
   ................
   ................
@@ -274,7 +521,26 @@ Z = (195, 195, 195)
   .....OO..OOA....
   ................
 }
-# tile 13 (fox)
+# tile 26 (fox,male)
+{
+  ................
+  ................
+  ................
+  ................
+  ................
+  ................
+  ................
+  ................
+  ....C...........
+  ....C...........
+  ..CCAC...CCC....
+  ..ACCCCCCACCC...
+  ...AACCCC.ACC...
+  ....ACAAC..AA...
+  ...AC.ACA.......
+  ................
+}
+# tile 27 (fox,female)
 {
   ................
   ................
@@ -293,7 +559,7 @@ Z = (195, 195, 195)
   ...AC.ACA.......
   ................
 }
-# tile 14 (coyote)
+# tile 28 (coyote,male)
 {
   ................
   ................
@@ -312,15 +578,53 @@ Z = (195, 195, 195)
   ................
   ................
 }
-# tile 15 (werejackal)
+# tile 29 (coyote,female)
 {
   ................
   ................
   ................
-  ................
-  ...O..O.........
-  ...O.OO...O.....
-  ..OOOO.....O....
+  ...K..K.........
+  ...K.KK......KKK
+  ..KKKK......KKKA
+  ..NCNK.KKKKKAAA.
+  .KCCKKKKKKKKK...
+  KKCKAKKKKKKKK...
+  DKKKAKAKKKKAK...
+  ..AAKAAKAAAAK...
+  ....AKAKAAAAK...
+  ...AKKAKA.AKK...
+  .....AKK........
+  ................
+  ................
+}
+# tile 30 (werejackal,male)
+{
+  ................
+  ................
+  ................
+  ................
+  ...O..O.........
+  ...O.OO...O.....
+  ..OOOO.....O....
+  ..IOIOO....O.A..
+  .OLLOOOL...O.A..
+  DOOOALLOOOOOAA..
+  ..AALLLLOOOOAA..
+  ....LJLLLOOLAA..
+  ....LJLLKALKAA..
+  ..LLLALAAAOAA...
+  ...L.LL..OOA....
+  ......L.........
+}
+# tile 31 (werejackal,female)
+{
+  ................
+  ................
+  ................
+  ................
+  ...O..O.........
+  ...O.OO...O.....
+  ..OOOO.....O....
   ..IOIOO....O.A..
   .OLLOOOL...O.A..
   DOOOALLOOOOOAA..
@@ -331,7 +635,26 @@ Z = (195, 195, 195)
   ...L.LL..OOA....
   ......L.........
 }
-# tile 16 (little dog)
+# tile 32 (little dog,male)
+{
+  ................
+  ................
+  ................
+  ................
+  ...J..J.........
+  ...J.JJ...K.....
+  ..JJJJ.....K....
+  ..NJNKK....K.A..
+  .JJJCKK....K.A..
+  .PJJAKCKKCKKAA..
+  .DDAACKKCKKKAA..
+  ....KJKJCJKJAA..
+  ....KJKJJAJJAA..
+  ...KKAKAAAKAA...
+  .....KK...KA....
+  ................
+}
+# tile 33 (little dog,female)
 {
   ................
   ................
@@ -350,7 +673,26 @@ Z = (195, 195, 195)
   .....KK...KA....
   ................
 }
-# tile 17 (dingo)
+# tile 34 (dingo,male)
+{
+  ................
+  ................
+  ................
+  .............C..
+  ...C..C.......C.
+  ...C.CC.......CA
+  ..CCCCK.......CA
+  ..ACACCKCCCCCCAA
+  ..LLCCCKCCCLCCCA
+  .KCCACKCLLLLACCA
+  ..AACAACLLAAACCA
+  ....ACACAAAAAACA
+  ....CCACAAA..CCA
+  .....ACCA.......
+  ................
+  ................
+}
+# tile 35 (dingo,female)
 {
   ................
   ................
@@ -369,7 +711,26 @@ Z = (195, 195, 195)
   ................
   ................
 }
-# tile 18 (dog)
+# tile 36 (dog,male)
+{
+  ................
+  ................
+  ................
+  ...J..J.....K...
+  ...J.JJ......K..
+  ..JJJJ.......K..
+  ..NJNKK......K.A
+  .JJJCKKKK....K.A
+  .PJCAKCKKKKCKKAA
+  .DDAACKKKKCKKKAA
+  ..AAKJKKJJCJKJAA
+  ....KJKKJJJAJJAA
+  ....KAKJAAAAKJA.
+  ...KKAKAAAAAKAA.
+  .....KKAA...KA..
+  ................
+}
+# tile 37 (dog,female)
 {
   ................
   ................
@@ -388,7 +749,26 @@ Z = (195, 195, 195)
   .....KKAA...KA..
   ................
 }
-# tile 19 (large dog)
+# tile 38 (large dog,male)
+{
+  ................
+  ................
+  ...J..J.....K...
+  ...J.JJ......K..
+  ..JJJJ.......K..
+  ..NJNKKK.....K.A
+  .JJJCKKKKK..JK.A
+  .PJCAKCKKKKCKKAA
+  .DDAACKKKKCKKKAA
+  ..AAKJKKJJCJKJAA
+  ...JKJKKJJJAJJAA
+  ....KAKJAAAAKJA.
+  ....KAKJAAAAKJA.
+  ...KKAKAAAAAKAA.
+  .....KKAA...KA..
+  ................
+}
+# tile 39 (large dog,female)
 {
   ................
   ................
@@ -407,7 +787,26 @@ Z = (195, 195, 195)
   .....KKAA...KA..
   ................
 }
-# tile 20 (wolf)
+# tile 40 (wolf,male)
+{
+  ................
+  ................
+  ................
+  ...P..P.....P...
+  ...P.PP......P..
+  ..PPPP.......P..
+  ..N.NPP......P.A
+  .P..PPPPP....P.A
+  PP.PAPPPPPPPPPAA
+  DPPPAPPPPPPPPPAA
+  ..AAP.PP..P.P.AA
+  ....P.PP...A.PAA
+  ....PAP.AAAAP.A.
+  ...PPAPAAAAAPAA.
+  .....PPAA..PPA..
+  ................
+}
+# tile 41 (wolf,female)
 {
   ................
   ................
@@ -426,7 +825,26 @@ Z = (195, 195, 195)
   .....PPAA..PPA..
   ................
 }
-# tile 21 (werewolf)
+# tile 42 (werewolf,male)
+{
+  ................
+  ................
+  ................
+  ...P..P.....P...
+  ...P.PP......P..
+  ..PPPP.......P..
+  ..N.NPP......P.A
+  .P..PPPPP....P.A
+  PP.PAPPPPPPPPPAA
+  DPPPALPPPPPPPPAA
+  ..AALLPL..P.P.AA
+  ....L.LL...A.PAA
+  ....LAL.AAAAP.A.
+  ..LLLALAAAAAPPA.
+  ...L.LLAA..PP...
+  .....LL.........
+}
+# tile 43 (werewolf,female)
 {
   ................
   ................
@@ -445,7 +863,26 @@ Z = (195, 195, 195)
   ...L.LLAA..PP...
   .....LL.........
 }
-# tile 22 (winter wolf cub)
+# tile 44 (winter wolf cub,male)
+{
+  ................
+  ................
+  ................
+  ................
+  ...N..N.........
+  ...N.NB...N.....
+  ..NNNN.....N....
+  ..DNDNB....N.A..
+  ..NNNNB....N.A..
+  .NNNNNNNNNNNAA..
+  .DNBBNNNNNNBAA..
+  ....NNNNNNNBAA..
+  ....NNNBBANBAA..
+  ...NBANAAANAA...
+  .....NB..NBA....
+  ................
+}
+# tile 45 (winter wolf cub,female)
 {
   ................
   ................
@@ -464,7 +901,26 @@ Z = (195, 195, 195)
   .....NB..NBA....
   ................
 }
-# tile 23 (warg)
+# tile 46 (warg,male)
+{
+  ................
+  ...P..P....PP...
+  ...P.PP......P..
+  ..PPPP.......P.A
+  ..N.NPP......P.A
+  .P..PPPPP....P.A
+  PPPPDPPPPPPPPPAA
+  DPPNDPPPPPPPPPAA
+  ..DDDPPPPPPPPPAA
+  PNDNP.PPPPPPPPAA
+  .PPPPAPPPPAPP.A.
+  ...PAAPPAAAAPPAA
+  ...PAAP.AAAAP.A.
+  .PPPAAPAAAAAPAA.
+  ....PPPAA.PPPA..
+  ................
+}
+# tile 47 (warg,female)
 {
   ................
   ...P..P....PP...
@@ -483,7 +939,26 @@ Z = (195, 195, 195)
   ....PPPAA.PPPA..
   ................
 }
-# tile 24 (winter wolf)
+# tile 48 (winter wolf,male)
+{
+  ................
+  ................
+  ................
+  ...N..N.....N...
+  ...N.NN......N..
+  ..NNNN.......N..
+  ..DODNN......N.A
+  .NOONNNNN....N.A
+  NNONANNNNNNNNNAA
+  DNNBANNNNNNNNNAA
+  ..AANNNNNNNBNNAA
+  ....NBNNNBBANNAA
+  ....NANBAAAANBA.
+  ...NNANAAAAANAA.
+  .....NNAA..NNA..
+  ................
+}
+# tile 49 (winter wolf,female)
 {
   ................
   ................
@@ -502,7 +977,26 @@ Z = (195, 195, 195)
   .....NNAA..NNA..
   ................
 }
-# tile 25 (hell hound pup)
+# tile 50 (hell hound pup,male)
+{
+  ................
+  ................
+  ................
+  ................
+  ...C..C.........
+  ...C.CC...C.....
+  ..CCCC.....C....
+  ..DCDCC....C.A..
+  .CCCCCC....C.A..
+  .PCCACCCCCCCAA..
+  .CHAACCCCCCCAA..
+  CHC.CCCCCCCCAA..
+  .D..CCCCCACCAA..
+  ...CCACAAACAA...
+  .....CC...CA....
+  ................
+}
+# tile 51 (hell hound pup,female)
 {
   ................
   ................
@@ -521,7 +1015,26 @@ Z = (195, 195, 195)
   .....CC...CA....
   ................
 }
-# tile 26 (hell hound)
+# tile 52 (hell hound,male)
+{
+  ................
+  ...C..C....CC...
+  ...C.CC......C..
+  ..CCCC.......C.A
+  ..DJDCC......C.A
+  .CCCCCCCC....C.A
+  CCCCDCCCCCCCCCAA
+  .CHC.CCCCCCCCCAA
+  CHC..CCCCCCCCCAA
+  .D..CCCCCCCCCCAA
+  ...CCACCCCACC.A.
+  ...CAACCAAAACCAA
+  ...CAAC.AAAAC.A.
+  .CCCAACAAAAACAA.
+  ....CCCAA.CCCA..
+  ................
+}
+# tile 53 (hell hound,female)
 {
   ................
   ...C..C....CC...
@@ -540,7 +1053,26 @@ Z = (195, 195, 195)
   ....CCCAA.CCCA..
   ................
 }
-# tile 27 (Cerberus)
+# tile 54 (Cerberus,male)
+{
+  ................
+  ..J..J..........
+  ..JJJJ.J..J.....
+  .NJNJ..J.JJ.....
+  JJJJKAJJJJ....J.
+  PJJJJANJNKK...J.
+  DJKJAJJJKJJK..J.
+  ..AAJPJKAJKJKJJ.
+  ..JJJDDAJKJJJJJA
+  ..JJJAAJJJJJJJJA
+  .JKKKJJJKJJKJJAA
+  .JJAAKJJKJJJKJAA
+  JJAAAAJJAAAAJJA.
+  JAAAAAJAAAAAJAA.
+  .....JJAA...JA..
+  ................
+}
+# tile 55 (Cerberus,female)
 {
   ................
   ..J..J..........
@@ -559,7 +1091,7 @@ Z = (195, 195, 195)
   .....JJAA...JA..
   ................
 }
-# tile 28 (gas spore)
+# tile 56 (gas spore,male)
 {
   ................
   ................
@@ -578,7 +1110,45 @@ Z = (195, 195, 195)
   ................
   ................
 }
-# tile 29 (floating eye)
+# tile 57 (gas spore,female)
+{
+  ................
+  ................
+  ................
+  .....PFGGFP.....
+  ....PGFFFFFP....
+  ...PFFFFFGGFP...
+  ...FFGGFFGGFF...
+  ...GFGGFFFFFG...
+  ...GFFFFFFFFG...
+  ...FFFFGGFFFF...
+  ...PGGFGGFGGP...
+  ....PGFFFFGP....
+  .....PFGGFP.....
+  ................
+  ................
+  ................
+}
+# tile 58 (floating eye,male)
+{
+  ................
+  ................
+  ......ONNNO.....
+  ....PNNNNNNNP...
+  ....NNNNNNNNN...
+  ...ONNBBBBNNNO..
+  ...NNBBEEBBNNN..
+  ...NNBEAAEBNNN..
+  ...ONBEAAEBNNO..
+  ....NBBEEBBNN...
+  ....PNBBBBNNPAA.
+  ......ONNNOAAAA.
+  ......AAAAAAAAA.
+  .......AAAAAAA..
+  ................
+  ................
+}
+# tile 59 (floating eye,female)
 {
   ................
   ................
@@ -597,7 +1167,26 @@ Z = (195, 195, 195)
   ................
   ................
 }
-# tile 30 (freezing sphere)
+# tile 60 (freezing sphere,male)
+{
+  ................
+  ................
+  ......PBBBP.....
+  ....PBBBBBBBP...
+  ....BBBBBBBBB...
+  ...PBPPPBBBBBP..
+  ...BBNNBBPPPBB..
+  ...BBANPBNNBBB..
+  ...PBBPPBANPBP..
+  ....BBBBBBPPB...
+  ....PBBBBBBBPAA.
+  ......PBBBPAAAA.
+  ......AAAAAAAAA.
+  .......AAAAAAA..
+  ................
+  ................
+}
+# tile 61 (freezing sphere,female)
 {
   ................
   ................
@@ -616,7 +1205,26 @@ Z = (195, 195, 195)
   ................
   ................
 }
-# tile 31 (flaming sphere)
+# tile 62 (flaming sphere,male)
+{
+  ................
+  ....C...H.......
+  ....C....O...C..
+  ...C..H.CC...C..
+  ...C..C.CC..CC..
+  ...DCA.DDC.ACC..
+  .AHCDCADDCAADC..
+  .AACDCDDDDDADD..
+  ..ACDDDJJJDDDD..
+  ..ADDCAKDDACDD..
+  ...ADAKDDCDAD...
+  ...ADADHCHCAD...
+  ....DADDDCDAD...
+  .....DADDDAD....
+  ......JJJJJ.....
+  ................
+}
+# tile 63 (flaming sphere,female)
 {
   ................
   ....C...H.......
@@ -635,7 +1243,26 @@ Z = (195, 195, 195)
   ......JJJJJ.....
   ................
 }
-# tile 32 (shocking sphere)
+# tile 64 (shocking sphere,male)
+{
+  ................
+  .....PPPPPP.....
+  ...PPIAAADAPP...
+  ..PAAAIAAADDAP..
+  ..PHAAAPBOAAAP..
+  .PAHHAPBBBOAAAP.
+  .PHAAAPBBBBAHHP.
+  .PAAAAPPBBBAAAP.
+  .PAAAIAPPPAAAIP.
+  .PIIIAAAAAAIIAP.
+  ..PIAANAAPAAAIP.
+  ..PIAANAAAPAAP..
+  ...PANANAPAPAP..
+  ....PPAIAPAPP...
+  ......PPPPP.....
+  ................
+}
+# tile 65 (shocking sphere,female)
 {
   ................
   .....PPPPPP.....
@@ -654,7 +1281,26 @@ Z = (195, 195, 195)
   ......PPPPP.....
   ................
 }
-# tile 33 (beholder)
+# tile 66 (beholder,male)
+{
+  ....OA..OA......
+  ..OA.DADA.OA.OA.
+  ...DA.DADADADD..
+  ..OADDOOOODDADO.
+  ...DDHOAAOHDDA..
+  ...JDHOAAOHDDJ..
+  ...DDDOOOODDDD..
+  ...DDDDDDDDDDD..
+  ...JDAOAAAOADJ..
+  ....DDAAOAADD...
+  ....PDDDDDDDPAA.
+  ......JDDDJAAAA.
+  ......AAAAAAAAA.
+  .......AAAAAAA..
+  ................
+  ................
+}
+# tile 67 (beholder,female)
 {
   ....OA..OA......
   ..OA.DADA.OA.OA.
@@ -673,7 +1319,26 @@ Z = (195, 195, 195)
   ................
   ................
 }
-# tile 34 (kitten)
+# tile 68 (kitten,male)
+{
+  ................
+  ................
+  ................
+  ................
+  ................
+  ................
+  ...........K....
+  ............C...
+  ....C.C.....L.A.
+  ...CCCCJ....C.A.
+  ...NCNCJCCLCL.A.
+  ...CCCCJCCLCCAA.
+  ....IACCLLCCCAA.
+  .....CACCJCCJA..
+  ......CCA..CA...
+  ................
+}
+# tile 69 (kitten,female)
 {
   ................
   ................
@@ -692,7 +1357,26 @@ Z = (195, 195, 195)
   ......CCA..CA...
   ................
 }
-# tile 35 (housecat)
+# tile 70 (housecat,male)
+{
+  ................
+  ................
+  ................
+  ................
+  ................
+  ...........K....
+  ............C...
+  ...C.C......L.A.
+  ..CCCCJ.....C.A.
+  .CNCNCJCLCLCL.A.
+  .CCCCCJCLCLCCAA.
+  ..CICJCCLCLCLAA.
+  ...AACCLCLCCCAA.
+  ...CCACCJJCCJA..
+  .....CCA...CA...
+  ................
+}
+# tile 71 (housecat,female)
 {
   ................
   ................
@@ -711,7 +1395,26 @@ Z = (195, 195, 195)
   .....CCA...CA...
   ................
 }
-# tile 36 (jaguar)
+# tile 72 (jaguar,male)
+{
+  ................
+  ................
+  ................
+  ................
+  ..C..C......C...
+  ..CC.CJ......C.A
+  .CCCCCJ......C.A
+  .GCGCCJCAACCJC.A
+  .CCCCCJCCCCCCCAA
+  .CDDDJCAACCAJCAA
+  ..CCACCAJCCAACAA
+  ....CACCJJJCCJA.
+  ....CACAAAAACJA.
+  ...CKACAAAAACAA.
+  .....CCAA...CA..
+  ................
+}
+# tile 73 (jaguar,female)
 {
   ................
   ................
@@ -730,7 +1433,26 @@ Z = (195, 195, 195)
   .....CCAA...CA..
   ................
 }
-# tile 37 (lynx)
+# tile 74 (lynx,male)
+{
+  ................
+  ................
+  ................
+  ................
+  O....O..........
+  AC.CCA..........
+  .CCCA........CA.
+  .GCGCOAKKKKK.LA.
+  .CKCCAJCCCCCKA..
+  LLDDLLACLLLCCAA.
+  ..CC.AACLLLCCAA.
+  .......CAAAACAA.
+  ....CACAAAACCA..
+  ................
+  ................
+  ................
+}
+# tile 75 (lynx,female)
 {
   ................
   ................
@@ -749,7 +1471,26 @@ Z = (195, 195, 195)
   ................
   ................
 }
-# tile 38 (panther)
+# tile 76 (panther,male)
+{
+  ................
+  ................
+  ............AA..
+  ..............A.
+  ..............A.
+  .A...A........A.
+  .EA.AE........A.
+  .AAAAAEAAAAAAA..
+  .AAAAAEAAAAAAA..
+  .HAHAA.AAAAAAAA.
+  .AAAA.AAAAAEAAA.
+  .AAA..AAAAAEAAA.
+  .....AA....AAA..
+  ..AAAA..AAAA....
+  ................
+  ................
+}
+# tile 77 (panther,female)
 {
   ................
   ................
@@ -768,7 +1509,26 @@ Z = (195, 195, 195)
   ................
   ................
 }
-# tile 39 (large cat)
+# tile 78 (large cat,male)
+{
+  ................
+  ................
+  ................
+  ................
+  ............K...
+  .............C..
+  ...C.C.......L.A
+  ..CCCCJ......C.A
+  .CNCNCJCLCCLCL.A
+  .CCCCCJCLCCLCCAA
+  ..CDCJCCLCCLCLAA
+  ...AACCLCCLCCCAA
+  ....CACCJJJCCJA.
+  ...CKALAAAAACAA.
+  .....CCAA...CA..
+  ................
+}
+# tile 79 (large cat,female)
 {
   ................
   ................
@@ -787,7 +1547,26 @@ Z = (195, 195, 195)
   .....CCAA...CA..
   ................
 }
-# tile 40 (tiger)
+# tile 80 (tiger,male)
+{
+  ................
+  ................
+  ................
+  ................
+  ..C..C......C...
+  .CCJCC.......C.A
+  .CAACCJ......A.A
+  .GAGCCJACACAJC.A
+  .CCCCCACACACACAA
+  .ODOCACCACACACAA
+  .OCOACCJACACACAA
+  ....CACJAJAJCAA.
+  ....AACAAAAAAJA.
+  ...CKACAAAAACAA.
+  .....CCAA..CCA..
+  ................
+}
+# tile 81 (tiger,female)
 {
   ................
   ................
@@ -806,7 +1585,26 @@ Z = (195, 195, 195)
   .....CCAA..CCA..
   ................
 }
-# tile 41 (displacer beast)
+# tile 82 (displacer beast,male)
+{
+  ................
+  ........E.......
+  .......E.E..AA..
+  DEEEA..A.E....A.
+  ....EA.E.D....A.
+  .A...A.E......A.
+  .EA.AEAAA.....A.
+  .AAAAAAAAAA..A..
+  .AAAAEAAAAAAAA..
+  .HAHAEAAAAAAAAA.
+  .AAAAEAAAAAAAAA.
+  .AAA.AAAAAAAAAA.
+  .....AE.AEEA.EA.
+  ....AE.AE.EA.EA.
+  ...AE.AE.EA.EA..
+  ................
+}
+# tile 83 (displacer beast,female)
 {
   ................
   ........E.......
@@ -825,7 +1623,7 @@ Z = (195, 195, 195)
   ...AE.AE.EA.EA..
   ................
 }
-# tile 42 (gremlin)
+# tile 84 (gremlin,male)
 {
   ................
   ................
@@ -844,14 +1642,52 @@ Z = (195, 195, 195)
   ...GFA.FGA......
   ................
 }
-# tile 43 (gargoyle)
+# tile 85 (gremlin,female)
 {
   ................
   ................
-  ...PAPPPPAP.....
-  ..PA......AP....
-  ..P.DD..DDAP....
-  ....PD..DPA.....
+  ................
+  GGGA....AGGG....
+  .GGGFAAAGGG.....
+  ..FFFFFFFF......
+  ...NDFFDNA......
+  ...GNFFNGA......
+  ...GFFFFGA..AA..
+  ...AGFFFAFAAAAA.
+  ..GFAGFAFFFAAAA.
+  .GFGFAAFFAFAAAA.
+  .GF.GFAGAAFAAAA.
+  ....FFAGFAA.AA..
+  ...GFA.FGA......
+  ................
+}
+# tile 86 (gargoyle,male)
+{
+  ................
+  ................
+  ...PAPPPPAP.....
+  ..PA......AP....
+  ..P.DD..DDAP....
+  ....PD..DPA.....
+  ....P....PA..AA.
+  ....AP...A.AAAAA
+  ...P.AP.A...AAAA
+  ..P.P.AA..A.AAAA
+  ..PA.P.APAA.AAAA
+  ..PA.P....A.AA..
+  .....P....AAAA..
+  .....P.AP.AA....
+  ....PFA.FPA.....
+  ................
+}
+# tile 87 (gargoyle,female)
+{
+  ................
+  ................
+  ...PAPPPPAP.....
+  ..PA......AP....
+  ..P.DD..DDAP....
+  ....PD..DPA.....
   ....P....PA..AA.
   ....AP...A.AAAAA
   ...P.AP.A...AAAA
@@ -863,7 +1699,26 @@ Z = (195, 195, 195)
   ....PFA.FPA.....
   ................
 }
-# tile 44 (winged gargoyle)
+# tile 88 (winged gargoyle,male)
+{
+  ...K......K.....
+  ...KJ....KJ.....
+  ..KJAPPPPAJJ....
+  ..KJ......AJ....
+  ..KJDD..DDAJ....
+  .KJAPD..DPAJJ...
+  .KJAP....PAAJAA.
+  KJA.AP...A.AJJAA
+  J..P.AP.A...AJAA
+  ..P.P.AA..A.AAAA
+  ..PA.P.APAA.AAAA
+  ..PA.P....A.AA..
+  .....P....AAAA..
+  .....P.AP.AA....
+  ....PFA.FPA.....
+  ................
+}
+# tile 89 (winged gargoyle,female)
 {
   ...K......K.....
   ...KJ....KJ.....
@@ -882,7 +1737,26 @@ Z = (195, 195, 195)
   ....PFA.FPA.....
   ................
 }
-# tile 45 (hobbit)
+# tile 90 (hobbit,male)
+{
+  ................
+  ................
+  ................
+  ................
+  ......JJA.......
+  .....JJJJA......
+  ....JLFLFJ......
+  ....JLLLLJ......
+  ....JKLLKJJ.AA..
+  ...CLLLLLLCAAA..
+  ..CLALLLLALCA...
+  ..LLAJJKJALLA...
+  ...L.LKJLALAA...
+  .....LLALLA.A...
+  ....LLL.LLL.....
+  ................
+}
+# tile 91 (hobbit,female)
 {
   ................
   ................
@@ -901,7 +1775,26 @@ Z = (195, 195, 195)
   ....LLL.LLL.....
   ................
 }
-# tile 46 (dwarf)
+# tile 92 (dwarf,male)
+{
+  ................
+  ................
+  ................
+  ................
+  ......B.........
+  .....BEE........
+  ....BBEEE.......
+  ....BLLLE.......
+  .....OLO...AAA..
+  ...BBOOOEEAAAA..
+  ...BABOEAEAAAA..
+  ....LBBELAAAA...
+  ....EBAEEAA.....
+  ....BEAEB.A.....
+  ................
+  ................
+}
+# tile 93 (dwarf,female)
 {
   ................
   ................
@@ -920,7 +1813,26 @@ Z = (195, 195, 195)
   ................
   ................
 }
-# tile 47 (bugbear)
+# tile 94 (bugbear,male)
+{
+  ................
+  ................
+  ......K.........
+  .K..KKK.........
+  .KKKKKK.........
+  KADKADKKK.......
+  KKKKKKKJKK......
+  KAPAPAKJJKJ.....
+  KAAAAAKKJKJJ....
+  .KKKKKJKAKKJ....
+  ..KAJJCAKKKJ.AA.
+  ..KK.KKKKKJJAA..
+  ...C..KJAKJAA...
+  .....CCAAKJA....
+  ........CCA.....
+  ................
+}
+# tile 95 (bugbear,female)
 {
   ................
   ................
@@ -939,7 +1851,26 @@ Z = (195, 195, 195)
   ........CCA.....
   ................
 }
-# tile 48 (dwarf lord)
+# tile 96 (dwarf leader,male)
+{
+  ................
+  ................
+  ................
+  ................
+  ......B.........
+  .....BEE........
+  ....HHHHH.......
+  ....BLLLE.......
+  ....BOLOE..AAA..
+  ...BBOOOEEAAAA..
+  ...BABOEAEAAAA..
+  ....LBBELAAAA...
+  ....EBAEEAA.....
+  ....BEAEB.A.....
+  ................
+  ................
+}
+# tile 97 (dwarf leader,female)
 {
   ................
   ................
@@ -958,7 +1889,26 @@ Z = (195, 195, 195)
   ................
   ................
 }
-# tile 49 (dwarf king)
+# tile 98 (dwarf ruler,male)
+{
+  ................
+  ................
+  ................
+  ................
+  ....H.C.H.......
+  ....HCHCH.......
+  ....HHHHH.......
+  ....BLLLE...A...
+  .....OLO...AAAA.
+  ...EBOOOEEAAAA..
+  ...BABOEAEAAAA..
+  ....LBBELAAAA...
+  ....EBAEEAA.....
+  ....BEAEB.A.....
+  ................
+  ................
+}
+# tile 99 (dwarf ruler,female)
 {
   ................
   ................
@@ -977,7 +1927,26 @@ Z = (195, 195, 195)
   ................
   ................
 }
-# tile 50 (mind flayer)
+# tile 100 (mind flayer,male)
+{
+  ................
+  .......IIIIC....
+  .....IIIIIIC....
+  ....IIIIIIIC....
+  ...IGIIIIGC.....
+  ...IIGINGIC.....
+  ....IIIIIC......
+  ....IAIAIF......
+  ....IAIAIF......
+  ....IAIAIFI.....
+  .....FIFIFIC.AA.
+  ....CBIBBF.CAAA.
+  ...IIIBBFFACAAA.
+  ......BBFCAAAA..
+  ......CFFCAA....
+  ....IIC.IIA.....
+}
+# tile 101 (mind flayer,female)
 {
   ................
   .......IIIIC....
@@ -996,7 +1965,26 @@ Z = (195, 195, 195)
   ......CFFCAA....
   ....IIC.IIA.....
 }
-# tile 51 (master mind flayer)
+# tile 102 (master mind flayer,male)
+{
+  ................
+  .......IIIIC....
+  .....IIIIIIC....
+  ....IIIIIIIC....
+  ...IGIIIIGC.....
+  ...IIGINGIC.....
+  .EEEIIIIICEEEE..
+  ..EEIAIAIEEEE...
+  ...EIAIAIEEE....
+  ....IAIAIEEE....
+  ....EFIFIEEE.AA.
+  ....CBIBBEEEAAA.
+  ...IIIBBEEEEAAA.
+  ....EEBEEEEAAA..
+  ...EEECEEEAA....
+  ....IIC.IIA.....
+}
+# tile 103 (master mind flayer,female)
 {
   ................
   .......IIIIC....
@@ -1015,7 +2003,26 @@ Z = (195, 195, 195)
   ...EEECEEEAA....
   ....IIC.IIA.....
 }
-# tile 52 (manes)
+# tile 104 (manes,male)
+{
+  ................
+  ................
+  ....PP..........
+  ...PPPP.........
+  ..PAPAP.........
+  ..PPPPP.PPP.P...
+  ..P..PPPP.......
+  ..P..PPPPP...P..
+  ..PPPPP.PPP.....
+  ..P.P.P.PP.P....
+  .P...P.PPPP.....
+  .P....PPP.PP....
+  ..P....P.P.P.P..
+  ........P.......
+  ................
+  ................
+}
+# tile 105 (manes,female)
 {
   ................
   ................
@@ -1034,7 +2041,26 @@ Z = (195, 195, 195)
   ................
   ................
 }
-# tile 53 (homunculus)
+# tile 106 (homunculus,male)
+{
+  ................
+  ................
+  ................
+  ................
+  ................
+  ................
+  ................
+  ......JJJ.......
+  ......LLC.......
+  ......LLC.......
+  .....BBPPPAA....
+  ....L.BPPACAA...
+  ......BAPAAAA...
+  .....LLALCA.....
+  ................
+  ................
+}
+# tile 107 (homunculus,female)
 {
   ................
   ................
@@ -1053,7 +2079,26 @@ Z = (195, 195, 195)
   ................
   ................
 }
-# tile 54 (imp)
+# tile 108 (imp,male)
+{
+  ................
+  ................
+  ................
+  ................
+  ................
+  ................
+  ................
+  .....O.D.O......
+  .....OCDDO......
+  ......CDD.......
+  .....GGFFFAA....
+  ....C.GFFADAA...
+  ......GAFAAAA...
+  .....CDADDA.....
+  ................
+  ................
+}
+# tile 109 (imp,female)
 {
   ................
   ................
@@ -1072,7 +2117,26 @@ Z = (195, 195, 195)
   ................
   ................
 }
-# tile 55 (lemure)
+# tile 110 (lemure,male)
+{
+  ................
+  ................
+  ....PP..........
+  ...PPPP.........
+  ..PAPAP....P....
+  ..PPPPP..PP.P...
+  ..P..PPPPPPPP...
+  ..P..PPPPPPP....
+  ..PPPPPPPPP.....
+  ....PPPPPPPP....
+  ..PPPPPPPPPP....
+  ...PPPPPPPPPP...
+  ..P.P..PPPP.PP..
+  ........P.PP....
+  ................
+  ................
+}
+# tile 111 (lemure,female)
 {
   ................
   ................
@@ -1091,7 +2155,7 @@ Z = (195, 195, 195)
   ................
   ................
 }
-# tile 56 (quasit)
+# tile 112 (quasit,male)
 {
   ................
   ................
@@ -1110,7 +2174,45 @@ Z = (195, 195, 195)
   ................
   ................
 }
-# tile 57 (tengu)
+# tile 113 (quasit,female)
+{
+  ................
+  ................
+  ................
+  ................
+  ................
+  ................
+  .....O.D.O......
+  .....OCDDOD.....
+  ......CDD.D.....
+  .....GGFFFAA....
+  ....C.GFFAAADA..
+  ....C.GFFJJDA...
+  ......GAFAAAA...
+  .....CDADDA.....
+  ................
+  ................
+}
+# tile 114 (tengu,male)
+{
+  ................
+  .......PP.......
+  ......PPPP......
+  .....DPPNP......
+  ....DDDPPP......
+  ....DDPPPP......
+  ....D..PPA......
+  .....PIAAIP.AAA.
+  ....PPPIIPPPAAA.
+  ....PAPPPPAPAAA.
+  ....PAHHHHAPAAA.
+  ....LAPPPPALAAA.
+  ......PPPPAAAA..
+  ......PPPPAA.A..
+  .....LLA.LLA....
+  ................
+}
+# tile 115 (tengu,female)
 {
   ................
   .......PP.......
@@ -1129,7 +2231,26 @@ Z = (195, 195, 195)
   .....LLA.LLA....
   ................
 }
-# tile 58 (blue jelly)
+# tile 116 (blue jelly,male)
+{
+  ................
+  ................
+  ................
+  .......E........
+  ......OBE.......
+  ...BE.OBEBOE....
+  ..OBEOBBEOBBE...
+  ..OBEOBBEOBBE...
+  ..BBBGGBGGBEEE..
+  ..BBBAGBAGEEEEA.
+  ..BBBBBBEBEEEEAA
+  ...BBBBBBBEEEAAA
+  ....BBBBBEEEAAA.
+  ......BBBEEAA...
+  ................
+  ................
+}
+# tile 117 (blue jelly,female)
 {
   ................
   ................
@@ -1148,7 +2269,26 @@ Z = (195, 195, 195)
   ................
   ................
 }
-# tile 59 (spotted jelly)
+# tile 118 (spotted jelly,male)
+{
+  ................
+  ................
+  ................
+  .......E........
+  ......OBE.......
+  ...BE.OCEBOE....
+  ..OCEOCCEOBCE...
+  ..OCEOBCEOCBD...
+  ..BBBHHBHHBEDD..
+  ..CCBAHBAHEEEEA.
+  ..BBCBBBEBEEDEAA
+  ...BBBCBBBEEDAAA
+  ....BCCCBEEDAAA.
+  ......CCBEEAA...
+  ................
+  ................
+}
+# tile 119 (spotted jelly,female)
 {
   ................
   ................
@@ -1167,7 +2307,26 @@ Z = (195, 195, 195)
   ................
   ................
 }
-# tile 60 (ochre jelly)
+# tile 120 (ochre jelly,male)
+{
+  ................
+  ................
+  ................
+  .......D........
+  ......LCD.......
+  ...CD.LCDCLD....
+  ..LCDLCCDLCCD...
+  ..LCDLCCDLCCD...
+  ..CCCGGCGGCDDD..
+  ..CCCAGCAGDDDDA.
+  ..CCCCCCDCDDDDAA
+  ...CCCCCCCDDDAAA
+  ....CCCCCDDDAAA.
+  ......CCCDDAA...
+  ................
+  ................
+}
+# tile 121 (ochre jelly,female)
 {
   ................
   ................
@@ -1186,7 +2345,26 @@ Z = (195, 195, 195)
   ................
   ................
 }
-# tile 61 (kobold)
+# tile 122 (kobold,male)
+{
+  ................
+  ................
+  ................
+  ................
+  ...N...N........
+  ...NBPBN........
+  ...BABAB........
+  ....BBPA..A.....
+  ...BBABPA.AA.A..
+  ..BPBBBBPAAAAA..
+  ..BAPBPAPAAAAA..
+  ....PBPAAAAAA...
+  ....BABAAAA.....
+  ...BBABBA.......
+  ................
+  ................
+}
+# tile 123 (kobold,female)
 {
   ................
   ................
@@ -1205,7 +2383,26 @@ Z = (195, 195, 195)
   ................
   ................
 }
-# tile 62 (large kobold)
+# tile 124 (large kobold,male)
+{
+  ................
+  ................
+  ................
+  ...N...N........
+  ...NBPBN........
+  ...BABAB........
+  ....BBPA..A.....
+  ...BBABPA.AA....
+  ..BPBBBBPAAA.A..
+  ..BAPBPAPAAAAA..
+  ..BAPBPAPAAAAA..
+  ....PBPAAAAAA...
+  ....BABAAAA.....
+  ...BBABBA.......
+  ................
+  ................
+}
+# tile 125 (large kobold,female)
 {
   ................
   ................
@@ -1224,7 +2421,26 @@ Z = (195, 195, 195)
   ................
   ................
 }
-# tile 63 (kobold lord)
+# tile 126 (kobold leader,male)
+{
+  ................
+  ................
+  ................
+  ...N...N........
+  ...NCCCN........
+  ...CABAC........
+  ...CBBPC..A.....
+  ..CCBABCC.AA....
+  ..CCBBBCCAAA.A..
+  ..BCCBCCPAAAAA..
+  ..BACBCAPAAAAA..
+  ....BBBAAAAAA...
+  ....BABAAAA.....
+  ...BBABBA.......
+  ................
+  ................
+}
+# tile 127 (kobold leader,female)
 {
   ................
   ................
@@ -1243,7 +2459,26 @@ Z = (195, 195, 195)
   ................
   ................
 }
-# tile 64 (kobold shaman)
+# tile 128 (kobold shaman,male)
+{
+  ................
+  ................
+  ................
+  ...N...N........
+  ...NHHHN........
+  ...HABAH........
+  ...HBBPH..A.....
+  ..HHBABHH.AA....
+  .HHHBBBHHHAA.A..
+  .HBHHBHHPHAAAA..
+  ..BAHBHAPAAAAA..
+  ....BBBAAAAAA...
+  ....BABAAAA.....
+  ...BBABBA.......
+  ................
+  ................
+}
+# tile 129 (kobold shaman,female)
 {
   ................
   ................
@@ -1262,7 +2497,26 @@ Z = (195, 195, 195)
   ................
   ................
 }
-# tile 65 (leprechaun)
+# tile 130 (leprechaun,male)
+{
+  ................
+  ................
+  ................
+  ................
+  ......G.........
+  ......F....K....
+  .....GFF..KLK...
+  ....GFFFF..K....
+  .....KLKA.GLAA..
+  ...FGFJFFFAKA.A.
+  ...GAGFFAAAK.AA.
+  ....LKHKKJAKAA..
+  ....GFAGKJAKA...
+  ...GFAA.GFAK....
+  ................
+  ................
+}
+# tile 131 (leprechaun,female)
 {
   ................
   ................
@@ -1281,7 +2535,26 @@ Z = (195, 195, 195)
   ................
   ................
 }
-# tile 66 (small mimic)
+# tile 132 (small mimic,male)
+{
+  ................
+  ................
+  ................
+  ................
+  ......POP.......
+  ......NNO.......
+  ......NNO.......
+  .......OA.......
+  .....NNNNN..AA..
+  ....OONNNOO.AA..
+  ....NANOOANAAA..
+  ......NAOAAAA...
+  ......NAOAA.A...
+  .....NN.OOA.....
+  ................
+  ................
+}
+# tile 133 (small mimic,female)
 {
   ................
   ................
@@ -1300,7 +2573,26 @@ Z = (195, 195, 195)
   ................
   ................
 }
-# tile 67 (large mimic)
+# tile 134 (large mimic,male)
+{
+  ................
+  ................
+  ................
+  ......LLOA......
+  ......NNOA......
+  ......NNOA......
+  ......ONOA......
+  .....NNNNO..AAA.
+  ....OONNNOO.AAA.
+  ...NOANNNAOOAAA.
+  ...NAONONOANAAA.
+  .....NO.NOAAAA..
+  .....NO.NOAA.A..
+  ....NNO.NOOA....
+  ................
+  ................
+}
+# tile 135 (large mimic,female)
 {
   ................
   ................
@@ -1319,7 +2611,26 @@ Z = (195, 195, 195)
   ................
   ................
 }
-# tile 68 (giant mimic)
+# tile 136 (giant mimic,male)
+{
+  ................
+  ......NNO.......
+  .....NNNNOA.....
+  .....NNNNOA.....
+  .....NNNNOA.....
+  .....ONNNOA.....
+  ..PONNOOONOOPAAA
+  .PONONNNNOONOPAA
+  .ONOANNNNOAONOAA
+  .NNOANNNNOAOOOAA
+  ...AANNONNAAAAAA
+  ....PNO.NNPAAAAA
+  ....ONO.NNOAA..A
+  ....NNO.NNOAA..A
+  ...NNNO.NNOOA...
+  ................
+}
+# tile 137 (giant mimic,female)
 {
   ................
   ......NNO.......
@@ -1338,7 +2649,26 @@ Z = (195, 195, 195)
   ...NNNO.NNOOA...
   ................
 }
-# tile 69 (wood nymph)
+# tile 138 (wood nymph,male)
+{
+  ................
+  ................
+  ...OH...........
+  ..OHHL..........
+  ..OHLL..........
+  ..HHLA..........
+  .OHLLFKKKKLA....
+  .HKFLFKKKKA.....
+  OHKJFKKJJK.A....
+  HKKLJJGKAAAAAAA.
+  .JJAJGDKJAAAAA..
+  ..JA.KKJJAAAA...
+  ...J.KKKKJAA....
+  ....JKKKKKJA....
+  ....KJKJKJKJ....
+  ................
+}
+# tile 139 (wood nymph,female)
 {
   ................
   ................
@@ -1357,7 +2687,7 @@ Z = (195, 195, 195)
   ....KJKJKJKJ....
   ................
 }
-# tile 70 (water nymph)
+# tile 140 (water nymph,male)
 {
   ................
   ................
@@ -1376,7 +2706,7 @@ Z = (195, 195, 195)
   ....BPBPBPBP....
   ................
 }
-# tile 71 (mountain nymph)
+# tile 141 (water nymph,female)
 {
   ................
   ................
@@ -1384,10 +2714,48 @@ Z = (195, 195, 195)
   ..OHHL..........
   ..OHLL..........
   ..HHLA..........
-  .OHLLCOOOOLA....
-  .HOCLCOOOOA.....
-  OHOLCOOLLO.A....
-  HOOKLLIOAAAAAAA.
+  .OHLLJBBBBLA....
+  .HBJLJBBBBA.....
+  OHBPJBBPPB.A....
+  HBBLPPNBAAAAAAA.
+  .PPAPNDB.AAAAA..
+  ..PA.BBPPAAAA...
+  ...P.BBBBPAA....
+  ....PBBBBBPA....
+  ....BPBPBPBP....
+  ................
+}
+# tile 142 (mountain nymph,male)
+{
+  ................
+  ................
+  ...OH...........
+  ..OHHL..........
+  ..OHLL..........
+  ..HHLA..........
+  .OHLLCOOOOLA....
+  .HOCLCOOOOA.....
+  OHOLCOOLLO.A....
+  HOOKLLIOAAAAAAA.
+  .LLALIBOKAAAAA..
+  ..LA.OOLLAAAA...
+  ...L.OOOOLAA....
+  ....LOOOOOLA....
+  ....OLOLOLOL....
+  ................
+}
+# tile 143 (mountain nymph,female)
+{
+  ................
+  ................
+  ...OH...........
+  ..OHHL..........
+  ..OHLL..........
+  ..HHLA..........
+  .OHLLCOOOOLA....
+  .HOCLCOOOOA.....
+  OHOLCOOLLO.A....
+  HOOKLLIOAAAAAAA.
   .LLALIBOKAAAAA..
   ..LA.OOLLAAAA...
   ...L.OOOOLAA....
@@ -1395,7 +2763,26 @@ Z = (195, 195, 195)
   ....OLOLOLOL....
   ................
 }
-# tile 72 (goblin)
+# tile 144 (goblin,male)
+{
+  ................
+  ................
+  ................
+  ....LK..........
+  ...CJA..........
+  ..KJA...........
+  .JJA.IIK...AA...
+  .IK.IGIGIJAA....
+  J.ICKIIIJK......
+  ...IIJJJK.A.....
+  ....KICJAAAAA...
+  ....ICKKJA......
+  ....IKAIJA......
+  ...IKAA.IK......
+  ................
+  ................
+}
+# tile 145 (goblin,female)
 {
   ................
   ................
@@ -1414,7 +2801,26 @@ Z = (195, 195, 195)
   ................
   ................
 }
-# tile 73 (hobgoblin)
+# tile 146 (hobgoblin,male)
+{
+  ................
+  .....LK.........
+  ....CKA.........
+  ...CJA..........
+  ..KJA...........
+  .JJA.IIK...AA...
+  .IK.IHIHIJAA....
+  J.ICKIIIJK......
+  ...IIJJJK.A.....
+  ....KICCAAAAA...
+  ....IIIIJA......
+  ....ICKKJA......
+  ....IKAIJA......
+  ...IKAA.IK......
+  ................
+  ................
+}
+# tile 147 (hobgoblin,female)
 {
   ................
   .....LK.........
@@ -1433,7 +2839,26 @@ Z = (195, 195, 195)
   ................
   ................
 }
-# tile 74 (orc)
+# tile 148 (orc,male)
+{
+  ................
+  ................
+  ................
+  .....OA.........
+  ....NOPA........
+  ....LPLA........
+  .....P.A........
+  ..KCCAKKKA.AA...
+  ..BPCKJ.P.AAA...
+  ..BAGGFAAPNO....
+  ..BAJJPNOAAA....
+  ....BNOJAAAAAA..
+  ...BJACPAAAA....
+  ..BPPABPPA......
+  ................
+  ................
+}
+# tile 149 (orc,female)
 {
   ................
   ................
@@ -1452,7 +2877,26 @@ Z = (195, 195, 195)
   ................
   ................
 }
-# tile 75 (hill orc)
+# tile 150 (hill orc,male)
+{
+  ................
+  ................
+  ................
+  .....OA.........
+  ....NOPA........
+  ....LKLA........
+  .....K.A........
+  ..KGGAFFKA.AA...
+  ..JKGFF.K.AAA...
+  ..JAHHFAAKNO....
+  ..JAGFFNOAAA....
+  ....GNNFAAAAAA..
+  ...GGAGFAAAA....
+  ..KJJAKJJA......
+  ................
+  ................
+}
+# tile 151 (hill orc,female)
 {
   ................
   ................
@@ -1471,7 +2915,26 @@ Z = (195, 195, 195)
   ................
   ................
 }
-# tile 76 (Mordor orc)
+# tile 152 (Mordor orc,male)
+{
+  ................
+  ................
+  ................
+  .....OA.........
+  ....NOPA........
+  ....LPLA........
+  .....P.A........
+  ..KIIAIIKA.AA...
+  ..BPIDD.P.AAA...
+  ..BAGGFAAP.O....
+  ..BAIDDNOAAA....
+  ....BNOJAAAAAA..
+  ...BIAIPAAAA....
+  ..BPPABPPA......
+  ................
+  ................
+}
+# tile 153 (Mordor orc,female)
 {
   ................
   ................
@@ -1490,7 +2953,26 @@ Z = (195, 195, 195)
   ................
   ................
 }
-# tile 77 (Uruk-hai)
+# tile 154 (Uruk-hai,male)
+{
+  ................
+  ................
+  .....OA.........
+  ....NOPA........
+  ....LPLA........
+  .....P.A........
+  ..IIIAIIIA......
+  ..BPIKI.BAAAA...
+  ..BIG.PPPPAAA...
+  .NBAD.PDDPAA....
+  ..BNNJPDDPAA....
+  ....INPPPPAAAA..
+  ...BIAK.AAAA....
+  ..BPPABPPA......
+  ................
+  ................
+}
+# tile 155 (Uruk-hai,female)
 {
   ................
   ................
@@ -1509,7 +2991,26 @@ Z = (195, 195, 195)
   ................
   ................
 }
-# tile 78 (orc shaman)
+# tile 156 (orc shaman,male)
+{
+  ................
+  ................
+  .....OA.........
+  ....NOPA........
+  ....LPLA........
+  .....P.A........
+  ..CCCACCCA......
+  ..BPCKC.BAAAA...
+  ..BCGGFJBAAAA...
+  ..BAJJCJBAAA....
+  ..BAJJCJBAAA....
+  ....CACJAAAAAA..
+  ...BCACPAAAA....
+  ..BPPABPPA......
+  ................
+  ................
+}
+# tile 157 (orc shaman,female)
 {
   ................
   ................
@@ -1528,7 +3029,26 @@ Z = (195, 195, 195)
   ................
   ................
 }
-# tile 79 (orc-captain)
+# tile 158 (orc-captain,male)
+{
+  ................
+  ................
+  .....OA.........
+  ...NNOOPA.......
+  ....LPLA........
+  ...IPPPA........
+  ..DIIPADDA.AA...
+  ..BPIAD.P.AAA...
+  ..BAGGFAAP.O....
+  ..BAGGFAAP.O....
+  ..BAJJPNOAAA....
+  ....BNOJAAAAAA..
+  ...BDAIPAAAA....
+  ..BPPABPPA......
+  ................
+  ................
+}
+# tile 159 (orc-captain,female)
 {
   ................
   ................
@@ -1547,7 +3067,26 @@ Z = (195, 195, 195)
   ................
   ................
 }
-# tile 80 (rock piercer)
+# tile 160 (rock piercer,male)
+{
+  .JKKKKKKKKJAAA..
+  ..JJGKGKJJAAAA..
+  ...JKKKJJAAAA...
+  ...JJKKJJAAAA...
+  ....JKKJAAAA....
+  ....JJKJ.AAA....
+  ....JJKJ.AAA....
+  ....JJJJ..A.....
+  .....JJ...A.....
+  .....JJ...A.....
+  .....JJ.........
+  .....JJ.........
+  .....J..........
+  .....J..........
+  ................
+  ................
+}
+# tile 161 (rock piercer,female)
 {
   .JKKKKKKKKJAAA..
   ..JJGKGKJJAAAA..
@@ -1566,7 +3105,26 @@ Z = (195, 195, 195)
   ................
   ................
 }
-# tile 81 (iron piercer)
+# tile 162 (iron piercer,male)
+{
+  .BPPPPPPPP.AAA..
+  ..BBDPDP..AAAA..
+  ...BPPP..AAAA...
+  ...PBPP..AAAA...
+  ....BPP.AAAA....
+  ....BBP.AAAA....
+  ....PBP.AAAA....
+  ....PBP...A.....
+  .....BP...A.....
+  .....BP...A.....
+  .....BP.........
+  .....BP.........
+  .....B..........
+  .....P..........
+  ................
+  ................
+}
+# tile 163 (iron piercer,female)
 {
   .BPPPPPPPP.AAA..
   ..BBDPDP..AAAA..
@@ -1585,7 +3143,26 @@ Z = (195, 195, 195)
   ................
   ................
 }
-# tile 82 (glass piercer)
+# tile 164 (glass piercer,male)
+{
+  .NBBBBBBBBPAAA..
+  ..NNDBDBPPAAAA..
+  ...NBBBPPAAAA...
+  ...PNBBPPAAAA...
+  ....NBBPAAAA....
+  ....NNBPAAAA....
+  ....PNBPAAAA....
+  ....PNBP..A.....
+  .....NB...A.....
+  .....NB...A.....
+  .....NB.........
+  .....NB.........
+  .....N..........
+  .....P..........
+  ................
+  ................
+}
+# tile 165 (glass piercer,female)
 {
   .NBBBBBBBBPAAA..
   ..NNDBDBPPAAAA..
@@ -1604,7 +3181,26 @@ Z = (195, 195, 195)
   ................
   ................
 }
-# tile 83 (rothe)
+# tile 166 (rothe,male)
+{
+  ................
+  ...........K....
+  ............K...
+  ............K...
+  .......JJJKKJ...
+  .....JKKKKKKK...
+  ..AAAKKKKKKKK...
+  .AAAAAKKKKKKKA..
+  AAKKAAKKKKKAKA..
+  .KEKKAKKKJAAKA..
+  .KKKJAKKAJAAK...
+  ..KJAAAKAAA.....
+  ..AAKA.KA.......
+  ..A..A.K........
+  ................
+  ................
+}
+# tile 167 (rothe,female)
 {
   ................
   ...........K....
@@ -1623,7 +3219,7 @@ Z = (195, 195, 195)
   ................
   ................
 }
-# tile 84 (mumak)
+# tile 168 (mumak,male)
 {
   ................
   ...........P....
@@ -1642,7 +3238,45 @@ Z = (195, 195, 195)
   PPPA............
   .AA.............
 }
-# tile 85 (leocrotta)
+# tile 169 (mumak,female)
+{
+  ................
+  ...........P....
+  .PP.........P...
+  PPP...PPPPP.P...
+  PPPPPPPPP.PP....
+  PPPPBPPBBP.PP...
+  PPPBPPPPPP.PP...
+  .PDPPDDPP.PPP...
+  ..BPPDDP.PPPPA..
+  ..PPPPPPPPPPPA..
+  ..PPPPO..PAPPA..
+  .OOPPOOAPPAPPA..
+  OOPPOOAAPPA.....
+  .PPPAPA.PP......
+  PPPA............
+  .AA.............
+}
+# tile 170 (leocrotta,male)
+{
+  ................
+  ..A..A..........
+  ..AOOA....J.....
+  ..AOOAA....J....
+  .APOAFA....J....
+  .APOAAA.JJJJ....
+  .AOPAAJKKKKKJ...
+  .AOAAKJJKKJKJA..
+  ...JKKKKKJAKKA..
+  ...JKJKKJAAKKA..
+  ..JKJAKKAAPAPA..
+  ..KKAAKKAAPAPA..
+  .PAPAAPAPA......
+  .PAPA.PAPA......
+  ................
+  ................
+}
+# tile 171 (leocrotta,female)
 {
   ................
   ..A..A..........
@@ -1661,7 +3295,26 @@ Z = (195, 195, 195)
   ................
   ................
 }
-# tile 86 (wumpus)
+# tile 172 (wumpus,male)
+{
+  ................
+  ............B...
+  .............B..
+  .......BBBBB.B..
+  ....BBBPPBBBB...
+  ...BOOBBBPBBBB..
+  ...OOBBBBBPBBB..
+  ..DABBAABBPBBBA.
+  .BOOBBDABEBBEBAA
+  .BOBBBBBBEBEBBAA
+  .BBBBBBBEBBABBAA
+  .EBBBBBEABBABBAA
+  ..EEEEEAABBA....
+  .....BBA.BB.....
+  ................
+  ................
+}
+# tile 173 (wumpus,female)
 {
   ................
   ............B...
@@ -1680,7 +3333,26 @@ Z = (195, 195, 195)
   ................
   ................
 }
-# tile 87 (titanothere)
+# tile 174 (titanothere,male)
+{
+  ................
+  ................
+  ................
+  ..........PPP.P.
+  .......PPPPPPPAP
+  .....PPPPPPPPP.A
+  ..P.P.PPPPPPPP.A
+  ..PPP.PPPPPPPPPA
+  ..PPPP.PPPPPPPPA
+  .PPPPP.PPPPPPP..
+  .PPEPP.PPPP.PPA.
+  PBPPP.PPP.AAPPA.
+  PPPP.AAPPAA.....
+  .PP.PPAPPA......
+  ................
+  ................
+}
+# tile 175 (titanothere,female)
 {
   ................
   ................
@@ -1699,7 +3371,26 @@ Z = (195, 195, 195)
   ................
   ................
 }
-# tile 88 (baluchitherium)
+# tile 176 (baluchitherium,male)
+{
+  ................
+  ................
+  ................
+  ..........PPP.P.
+  .......PPPPPPPAP
+  .....PPPPPPPPP.A
+  ..P.P.PPPPPPPP.A
+  ..PPP.PPPPPPPPPA
+  ..PPPP.PPPPPPPPA
+  BPPPPP.PPPPPPP..
+  B.PEPP.PPPP.PPA.
+  PB.PP.PPP.AAPPA.
+  PPPP.AAPPAA.....
+  .PP.PPAPPA......
+  ................
+  ................
+}
+# tile 177 (baluchitherium,female)
 {
   ................
   ................
@@ -1718,7 +3409,26 @@ Z = (195, 195, 195)
   ................
   ................
 }
-# tile 89 (mastodon)
+# tile 178 (mastodon,male)
+{
+  ................
+  ................
+  ................
+  ................
+  ................
+  ..O...O.........
+  .N..POP.P.......
+  N..PNPPPPP......
+  O.PNPPPPPP.PP...
+  O.POPEPPP.PPPPP.
+  .OPOPOP..PPPPPAP
+  ..PPOPP.PPPPPPAA
+  ..PPAAAPPPPAPPA.
+  ..P...APPAAAPPA.
+  .......PPA......
+  ................
+}
+# tile 179 (mastodon,female)
 {
   ................
   ................
@@ -1737,7 +3447,26 @@ Z = (195, 195, 195)
   .......PPA......
   ................
 }
-# tile 90 (sewer rat)
+# tile 180 (sewer rat,male)
+{
+  ................
+  ................
+  ................
+  ................
+  ................
+  ................
+  ................
+  ..K..K.JKKKK....
+  ..KKKKJKKJKKK...
+  ..JAKAKJJJKKKJ..
+  ..GKGKJKAKKAKKA.
+  .KKJJJJKAKAAKKA.
+  .PJJAAKKAJAJKA..
+  ..AA.KKA..JKA...
+  .........JJA....
+  ................
+}
+# tile 181 (sewer rat,female)
 {
   ................
   ................
@@ -1756,7 +3485,26 @@ Z = (195, 195, 195)
   .........JJA....
   ................
 }
-# tile 91 (giant rat)
+# tile 182 (giant rat,male)
+{
+  ................
+  ................
+  ................
+  ................
+  ................
+  ................
+  ..K..K.JKKKKK...
+  ..KKKKJKKKJKKK..
+  ..JAKAKJKJJKKKJ.
+  ..GAGAKJKJJKKKK.
+  ..AKAKJKKAKKAKKA
+  .KKJJJJKAJKAAKKA
+  .PJJAAKKAJJAJKA.
+  ..AA.KKAA..JKA..
+  ..........JJA...
+  ................
+}
+# tile 183 (giant rat,female)
 {
   ................
   ................
@@ -1775,7 +3523,26 @@ Z = (195, 195, 195)
   ..........JJA...
   ................
 }
-# tile 92 (rabid rat)
+# tile 184 (rabid rat,male)
+{
+  ................
+  ................
+  ................
+  ................
+  ................
+  ................
+  ..K..K.JKKKKK...
+  ..KKKKJKKKJKKK..
+  ..JAKAKJKJJKKKJ.
+  ..GAGAKJKJJKKKK.
+  ..AKAKJKKAKKAKKA
+  .KKJOOOKAJKAAKKA
+  .PJOOAKKAJJAJKA.
+  ..AOOOKAA..JKA..
+  .OOOOOOOO.JJA...
+  ................
+}
+# tile 185 (rabid rat,female)
 {
   ................
   ................
@@ -1794,7 +3561,26 @@ Z = (195, 195, 195)
   .OOOOOOOO.JJA...
   ................
 }
-# tile 93 (wererat)
+# tile 186 (wererat,male)
+{
+  ................
+  ................
+  ................
+  ................
+  ................
+  ................
+  ..K..K.JKKKKK...
+  ..KKKKJKKKJKKK..
+  ..LLLLKJKJJKKKJ.
+  ..FLFLLJKJJKKKK.
+  ..LLLLJKKAKKAKKA
+  .KKJJJJKAJKAAKKA
+  .PJJAAKKAJJAJKA.
+  ..AA.KKAA..JKA..
+  ..........JJA...
+  ................
+}
+# tile 187 (wererat,female)
 {
   ................
   ................
@@ -1813,7 +3599,26 @@ Z = (195, 195, 195)
   ..........JJA...
   ................
 }
-# tile 94 (rock mole)
+# tile 188 (rock mole,male)
+{
+  ................
+  ................
+  ................
+  ................
+  ................
+  ................
+  ................
+  .......AAAAA....
+  ...AAAAAAAAAA...
+  ..AAAAAAAAAAAA..
+  ..JAJAAAAAAAAAA.
+  .AAAAAAAAAAAAAA.
+  AN.NAAAAAAAAAAA.
+  A...AAAA...AAA..
+  AN.NAA.AA...AA..
+  .AAAA...........
+}
+# tile 189 (rock mole,female)
 {
   ................
   ................
@@ -1832,7 +3637,26 @@ Z = (195, 195, 195)
   AN.NAA.AA...AA..
   .AAAA...........
 }
-# tile 95 (woodchuck)
+# tile 190 (woodchuck,male)
+{
+  ................
+  ................
+  ................
+  ................
+  ................
+  ................
+  .......KJA......
+  ......NKKNA.....
+  ......KNOJA.....
+  ......KNOJA.....
+  .....KKKKKJA....
+  ....JJKLLJJJAA..
+  ......KLLJAAAAA.
+  ......KJJJAAAA..
+  .....JJAAJJAA...
+  ................
+}
+# tile 191 (woodchuck,female)
 {
   ................
   ................
@@ -1851,7 +3675,26 @@ Z = (195, 195, 195)
   .....JJAAJJAA...
   ................
 }
-# tile 96 (cave spider)
+# tile 192 (cave spider,male)
+{
+  ................
+  ................
+  ................
+  ................
+  ................
+  ........PA......
+  .......PA.......
+  ......PAPBBA....
+  ...PA.APBPPPA...
+  ...ABBPPAPPAA.PA
+  ...GPPPPAAAPPPAA
+  ...PPGPAAPPAAAA.
+  ..D.PAPAPAAPPA..
+  ....D.PAAPA.APA.
+  .....PAA.APA....
+  ................
+}
+# tile 193 (cave spider,female)
 {
   ................
   ................
@@ -1870,7 +3713,26 @@ Z = (195, 195, 195)
   .....PAA.APA....
   ................
 }
-# tile 97 (centipede)
+# tile 194 (centipede,male)
+{
+  ................
+  ................
+  ......PBPP......
+  ....BBPAAA......
+  ..PPBAAA........
+  .PAPBBBPPPP.....
+  ..PAAPPBBBA.....
+  ....PAAPAPBPP...
+  ......AABBPP....
+  ......BB.PPAP...
+  ....PBBPPAP.A...
+  ...GPPPAP.AP....
+  ...PPGPAAP......
+  ..B.PAA.........
+  ...B............
+  ................
+}
+# tile 195 (centipede,female)
 {
   ................
   ................
@@ -1889,7 +3751,7 @@ Z = (195, 195, 195)
   ...B............
   ................
 }
-# tile 98 (giant spider)
+# tile 196 (giant spider,male)
 {
   ................
   ................
@@ -1908,14 +3770,52 @@ Z = (195, 195, 195)
   .....JAA.AJA....
   ................
 }
-# tile 99 (scorpion)
+# tile 197 (giant spider,female)
 {
   ................
   ................
-  .......JKJKJAA..
-  ......JA.JKJKKA.
-  .......KA...JJJA
-  ......JA....KKJA
+  ................
+  ................
+  ................
+  ........JA......
+  .......JA.......
+  ......JAJKKA....
+  ...JA.AJKJJJA...
+  ...AKKJJAJJAA.JA
+  ...GJJJJAAAJJJAA
+  ...JJGJAAJJAAAA.
+  ..D.JAJAJAAJJA..
+  ....D.JAAJA.AJA.
+  .....JAA.AJA....
+  ................
+}
+# tile 198 (scorpion,male)
+{
+  ................
+  ................
+  .......JKJKJAA..
+  ......JA.JKJKKA.
+  .......KA...JJJA
+  ......JA....KKJA
+  ...........JJJKA
+  .......AJKKAJJA.
+  .....AAJKJJJAA..
+  ...AKKJJAJJAA...
+  ...GJJJJAAAJJJA.
+  ...JJGJAAJJAAAJ.
+  ..D.JAJAJAAJJA..
+  ....D.JAAJA.JAA.
+  .......JAAJA....
+  ................
+}
+# tile 199 (scorpion,female)
+{
+  ................
+  ................
+  .......JKJKJAA..
+  ......JA.JKJKKA.
+  .......KA...JJJA
+  ......JA....KKJA
   ...........JJJKA
   .......AJKKAJJA.
   .....AAJKJJJAA..
@@ -1927,7 +3827,26 @@ Z = (195, 195, 195)
   .......JAAJA....
   ................
 }
-# tile 100 (lurker above)
+# tile 200 (lurker above,male)
+{
+  .AAAAAAAAAAAAAAA
+  ...AAGFAAGFAAA..
+  ...AAAAAAAAAAA..
+  ....AODODODOA...
+  ................
+  ................
+  ................
+  ................
+  ................
+  ................
+  ................
+  ................
+  ................
+  ................
+  ................
+  ................
+}
+# tile 201 (lurker above,female)
 {
   .AAAAAAAAAAAAAAA
   ...AAGFAAGFAAA..
@@ -1946,7 +3865,26 @@ Z = (195, 195, 195)
   ................
   ................
 }
-# tile 101 (trapper)
+# tile 202 (trapper,male)
+{
+  ................
+  ................
+  ................
+  ................
+  ................
+  ................
+  ................
+  ................
+  ................
+  ................
+  ................
+  ................
+  ....AODODODOA...
+  ...AAAAAAAAAAA..
+  ...AAGFAAGFAAA..
+  .AAAAAAAAAAAAAAA
+}
+# tile 203 (trapper,female)
 {
   ................
   ................
@@ -1965,7 +3903,26 @@ Z = (195, 195, 195)
   ...AAGFAAGFAAA..
   .AAAAAAAAAAAAAAA
 }
-# tile 102 (pony)
+# tile 204 (pony,male)
+{
+  ................
+  ................
+  .....JJ.........
+  ....KKKJ........
+  ...KKEKJ........
+  ..KKJKKJ........
+  ..JJAKKJAA......
+  ...AKKKJA.......
+  ...KKKKKKKJ.....
+  ...KKKKKKKJJAAA.
+  ...KJKJJJJJAJA..
+  ...JAJAAAAJAA...
+  ...JAJAAJAJA....
+  ...L.JAALAJ.....
+  .....LA...L.....
+  ................
+}
+# tile 205 (pony,female)
 {
   ................
   ................
@@ -1984,7 +3941,26 @@ Z = (195, 195, 195)
   .....LA...L.....
   ................
 }
-# tile 103 (white unicorn)
+# tile 206 (white unicorn,male)
+{
+  ................
+  ..HP............
+  ..PHO.NN........
+  ...PHNNB........
+  ...ONENB........
+  ..ONNNNB........
+  ..NOANNBAA......
+  ...AONNBA.......
+  ...ONNNONNN.....
+  ..NONNNNONNOAAA.
+  ..N.ONONNONAOA..
+  ..OAANAAAAOAA...
+  ...LAOAAOAOA....
+  .....OAALAO.....
+  .....LA...L.....
+  ................
+}
+# tile 207 (white unicorn,female)
 {
   ................
   ..HP............
@@ -2003,7 +3979,26 @@ Z = (195, 195, 195)
   .....LA...L.....
   ................
 }
-# tile 104 (gray unicorn)
+# tile 208 (gray unicorn,male)
+{
+  ................
+  ..HP............
+  ..PHO.PP........
+  ...PHPPN........
+  ....PGPN........
+  ...PPPPN........
+  ..PPAPPNAA......
+  ...APPPNA.......
+  ....PPP.PPP.....
+  ..P.PPPP.PP.AAA.
+  ..P..P.PP.PA.A..
+  ..PAAPAAAA.AA...
+  ...LA.AA.A.A....
+  ......AALA......
+  .....LA...L.....
+  ................
+}
+# tile 209 (gray unicorn,female)
 {
   ................
   ..HP............
@@ -2022,7 +4017,26 @@ Z = (195, 195, 195)
   .....LA...L.....
   ................
 }
-# tile 105 (black unicorn)
+# tile 210 (black unicorn,male)
+{
+  ................
+  ..HP............
+  ..PHO.AA........
+  ...PHAAJ........
+  ...AADAJ........
+  ..AAAAAJ........
+  ..AAPAAJPP......
+  ...PAAAJP.......
+  ...AAAAAAAA.....
+  ..AAAAAAAAAAPPP.
+  ..A.AAAAAAAPAP..
+  ..APPAPPAPAPP...
+  ...LPAPPAPAP....
+  .....APPLPA.....
+  .....LP...L.....
+  ................
+}
+# tile 211 (black unicorn,female)
 {
   ................
   ..HP............
@@ -2041,7 +4055,26 @@ Z = (195, 195, 195)
   .....LP...L.....
   ................
 }
-# tile 106 (horse)
+# tile 212 (horse,male)
+{
+  ................
+  ................
+  .....JJ.........
+  ....KKKJ........
+  ..KKKEKJ........
+  .KKKJKKJAA......
+  .JJJAKKJAA......
+  ...AKKKJA.......
+  ...KKKKKKKKJA...
+  ..KKKKKKKKKKJA..
+  ..KJJKJJJJJKAJA.
+  ..JAAJAAAAAJAJA.
+  ..JAAJAAAJAJAA..
+  ..LA.JAA.L.JA...
+  .....LA....L....
+  ................
+}
+# tile 213 (horse,female)
 {
   ................
   ................
@@ -2060,7 +4093,26 @@ Z = (195, 195, 195)
   .....LA....L....
   ................
 }
-# tile 107 (warhorse)
+# tile 214 (warhorse,male)
+{
+  ................
+  .....JJJ........
+  ...KKKKJJ.......
+  .KKKKEKJJ.......
+  KKKKKKKJJAA.....
+  JKKKJKKJJAA.....
+  .JJJAKKJJAA.....
+  ...AKKKJJA......
+  ...KKKKKKKKKJA..
+  ..KKKKKKKKKKKJA.
+  ..KKJKKJKKJKKJJA
+  ..KJAKJAKJAKJAJA
+  ..KJAKJAKJAKJA..
+  ..LC.KJALC.KJ...
+  .....LC....LC...
+  ................
+}
+# tile 215 (warhorse,female)
 {
   ................
   .....JJJ........
@@ -2079,7 +4131,26 @@ Z = (195, 195, 195)
   .....LC....LC...
   ................
 }
-# tile 108 (fog cloud)
+# tile 216 (fog cloud,male)
+{
+  .......P........
+  ....P..P........
+  .....P.P...P....
+  ...P.......P....
+  ..P..P.P.P......
+  ....PP.PP.P.P...
+  .P..APAPPP..P...
+  ...P.PPPP.PP....
+  ......PPPPP.P.P.
+  ...P.PPPPP..P...
+  ....P..P.PP.P...
+  .P...P.P...PPP..
+  ..P.P....PP.....
+  .......P....P...
+  ..P..P.P..P.....
+  ................
+}
+# tile 217 (fog cloud,female)
 {
   .......P........
   ....P..P........
@@ -2098,7 +4169,26 @@ Z = (195, 195, 195)
   ..P..P.P..P.....
   ................
 }
-# tile 109 (dust vortex)
+# tile 218 (dust vortex,male)
+{
+  ................
+  ................
+  ....K..KKKK.....
+  ...K..KKJJJK....
+  ..K..KJJJJ..K...
+  .KJ.KJJ.JKK..K..
+  .KJJKJ.JJJJK....
+  .KJJJJ....JJK...
+  .KKJ.J...J.JKK..
+  ..KJJ....JJJJK..
+  ...KJJJJ.JKJJK..
+  .K..KKJ.JJK.JK..
+  ..K..JJJJK..K...
+  ...KJJJKK..K....
+  ....KKKK..K.....
+  ................
+}
+# tile 219 (dust vortex,female)
 {
   ................
   ................
@@ -2117,7 +4207,26 @@ Z = (195, 195, 195)
   ....KKKK..K.....
   ................
 }
-# tile 110 (ice vortex)
+# tile 220 (ice vortex,male)
+{
+  ................
+  ................
+  ....N..NNNN.....
+  ...N..NNOOON....
+  ..N..NOOOO..N...
+  .NO.NOO.ONN..N..
+  .NOONO.OOOON....
+  .NOOOO....OON...
+  .NNO.O...O.ONN..
+  ..NOO....OOOON..
+  ...NOOOO.ONOON..
+  .N..NNO.OON.ON..
+  ..N..OOOON..N...
+  ...NOOONN..N....
+  ....NNNN..N.....
+  ................
+}
+# tile 221 (ice vortex,female)
 {
   ................
   ................
@@ -2136,7 +4245,26 @@ Z = (195, 195, 195)
   ....NNNN..N.....
   ................
 }
-# tile 111 (energy vortex)
+# tile 222 (energy vortex,male)
+{
+  ................
+  ................
+  ....E..EEEE.....
+  ...E..EEAAAE....
+  ..E..EAAAA..E...
+  .EA.EAAAAIE..E..
+  .EAAIAAAAAAE....
+  .EAAAAAAAAAAE...
+  .EEAAAAAAAAAEE..
+  ..EAAAAAAAAAAE..
+  ...EAAAAAAIAAE..
+  .E..EIAAAAE.AE..
+  ..E..AAAAE..E...
+  ...EAAAEE..E....
+  ....EEEE..E.....
+  ................
+}
+# tile 223 (energy vortex,female)
 {
   ................
   ................
@@ -2155,7 +4283,7 @@ Z = (195, 195, 195)
   ....EEEE..E.....
   ................
 }
-# tile 112 (steam vortex)
+# tile 224 (steam vortex,male)
 {
   ................
   ................
@@ -2174,7 +4302,45 @@ Z = (195, 195, 195)
   ....PPPP..P.....
   ................
 }
-# tile 113 (fire vortex)
+# tile 225 (steam vortex,female)
+{
+  ................
+  ................
+  ....P..PPPP.....
+  ...P..PPBBBP....
+  ..P..PBBBB..P...
+  .PB.PBBPBPP..P..
+  .PBBPBPBBBBP....
+  .PBBBBP.PPBBP...
+  .PPBPB...BPBPP..
+  ..PBBPP.PBBBBP..
+  ...PBBBBPBPBBP..
+  .P..PPBPBBP.BP..
+  ..P..BBBBP..P...
+  ...PBBBPP..P....
+  ....PPPP..P.....
+  ................
+}
+# tile 226 (fire vortex,male)
+{
+  ................
+  ................
+  ....D..DDDD.....
+  ...D..DDCCCD....
+  ..D..DCCCC..D...
+  .DC.DCCHCDD..D..
+  .DCCDCHCCCCD....
+  .DCCCCHHHHCCD...
+  .DDCHCHHHCHCDD..
+  ..DCCHHHHCCCCD..
+  ...DCCCCHCDCCD..
+  .D..DDCHCCD.CD..
+  ..D..CCCCD..D...
+  ...DCCCDD..D....
+  ....DDDD..D.....
+  ................
+}
+# tile 227 (fire vortex,female)
 {
   ................
   ................
@@ -2193,7 +4359,26 @@ Z = (195, 195, 195)
   ....DDDD..D.....
   ................
 }
-# tile 114 (baby long worm)
+# tile 228 (baby long worm,male)
+{
+  ................
+  ................
+  ................
+  ................
+  ......CLC.......
+  ......LLL.......
+  .....GGAGG.A....
+  .....GGAGGAAA...
+  ......LLLAAA.C..
+  ......LLLAA.CC..
+  ......CLLCCCCA..
+  .......LLLCCA...
+  ........CLL.....
+  ................
+  ................
+  ................
+}
+# tile 229 (baby long worm,female)
 {
   ................
   ................
@@ -2212,7 +4397,26 @@ Z = (195, 195, 195)
   ................
   ................
 }
-# tile 115 (baby purple worm)
+# tile 230 (baby purple worm,male)
+{
+  ................
+  ................
+  ................
+  .......I........
+  ......III.......
+  ......III.......
+  .....GGAGG.A....
+  .....GGAGGAAA...
+  ......IIIAAA.D..
+  ......IIIAA.DD..
+  ......IIIDDDDA..
+  .......IIIDDA...
+  ........III.....
+  ................
+  ................
+  ................
+}
+# tile 231 (baby purple worm,female)
 {
   ................
   ................
@@ -2231,7 +4435,26 @@ Z = (195, 195, 195)
   ................
   ................
 }
-# tile 116 (long worm)
+# tile 232 (long worm,male)
+{
+  ................
+  ................
+  .....CLC........
+  ....CLLLC.......
+  ....LLLLL.......
+  ...GGGLGGGAA....
+  ...GAGLGAGAAA...
+  ...GGGLGGGAAA...
+  ....LLLLLAAACC..
+  ....LLLLLAACCC..
+  ....CLLLLCCCCA..
+  .....LLLLLCCA...
+  ......CLLLL.....
+  ................
+  ................
+  ................
+}
+# tile 233 (long worm,female)
 {
   ................
   ................
@@ -2250,7 +4473,26 @@ Z = (195, 195, 195)
   ................
   ................
 }
-# tile 117 (purple worm)
+# tile 234 (purple worm,male)
+{
+  ................
+  ................
+  .....DID........
+  ....DIIID.......
+  ....IIIII.......
+  ...GGGIGGGAA....
+  ...GAGIGAGAAA...
+  ...GGGIGGGAAA...
+  ....IIIIIAAADD..
+  ....IIIIIAADDD..
+  ....DIIIIDDDDA..
+  .....IIIIIDDA...
+  ......DIIII.....
+  ................
+  ................
+  ................
+}
+# tile 235 (purple worm,female)
 {
   ................
   ................
@@ -2269,7 +4511,26 @@ Z = (195, 195, 195)
   ................
   ................
 }
-# tile 118 (grid bug)
+# tile 236 (grid bug,male)
+{
+  ................
+  ................
+  ................
+  ................
+  ..D....NHCN..D..
+  .D.D..NHDNCNDED.
+  D.D.D.NNHCND.DED
+  .D...D.NNHDND...
+  .DDD..ENNG.D.DE.
+  ..DDDDEEEEGD..DE
+  D.....DEHEE.D...
+  .D.......H......
+  ................
+  ................
+  ................
+  ................
+}
+# tile 237 (grid bug,female)
 {
   ................
   ................
@@ -2288,7 +4549,26 @@ Z = (195, 195, 195)
   ................
   ................
 }
-# tile 119 (xan)
+# tile 238 (xan,male)
+{
+  ................
+  ................
+  ..........GG....
+  ...HHH...GOGG...
+  .....HH..GGGG...
+  ...HHHHH.GGG....
+  .......GG...AAA.
+  .....GOGGHHAAAA.
+  ....GOGG..HHAAA.
+  NNNGOGG.AAHHHA..
+  NANGGGG.AAHAH...
+  NNNGGNNNAAAAAA..
+  ..GGGNANAA.AAA..
+  .GGGANNNAA.A.A..
+  ..G..AAAAAA.....
+  ......AA.AA.....
+}
+# tile 239 (xan,female)
 {
   ................
   ................
@@ -2307,7 +4587,26 @@ Z = (195, 195, 195)
   ..G..AAAAAA.....
   ......AA.AA.....
 }
-# tile 120 (yellow light)
+# tile 240 (yellow light,male)
+{
+  ................
+  ......NA........
+  ......HA........
+  ..NA.NHNA.NA....
+  ...LALHLALA.....
+  ....NHHHNA......
+  ..NLHHHHHLNA....
+  NHHHHHHHHHHHNA..
+  ..NLHHHHHLNA....
+  ....NHHHNA......
+  ...LALHLALA.....
+  ..NA.NNNA.NA....
+  ......HA........
+  ......NA........
+  ................
+  ................
+}
+# tile 241 (yellow light,female)
 {
   ................
   ......NA........
@@ -2326,7 +4625,26 @@ Z = (195, 195, 195)
   ................
   ................
 }
-# tile 121 (black light)
+# tile 242 (black light,male)
+{
+  ................
+  ......AA........
+  ......AA........
+  ..AA.AAAA.AA....
+  ...AAAAAAAA.....
+  ....AAAAAA......
+  ..AAAAAAAAAA....
+  AAAAAAAAAAAAAA..
+  ..AAAAAAAAAA....
+  ....AAAAAA......
+  ...AAAAAAAA.....
+  ..AA.AAAA.AA....
+  ......AA........
+  ......AA........
+  ................
+  ................
+}
+# tile 243 (black light,female)
 {
   ................
   ......AA........
@@ -2345,7 +4663,26 @@ Z = (195, 195, 195)
   ................
   ................
 }
-# tile 122 (zruty)
+# tile 244 (zruty,male)
+{
+  ................
+  ......FFGF......
+  ....OOFGFFFF....
+  ...AOFGFOOKFF...
+  ...FFGFAOAJKKF..
+  ..FFFFFFJAAJKK..
+  ..ODOFFJAJJKKJA.
+  ..DDDDJAJJKJJAA.
+  ..JODOAJJJAJJAAA
+  .KKJAJJJKJAJJAAA
+  .KKAAJKKKKJAAAAA
+  ...AJJKKKKJJAAAA
+  ...KJJAAAAKJAAA.
+  ..JKJJJAAJJJJ...
+  ................
+  ................
+}
+# tile 245 (zruty,female)
 {
   ................
   ......FFGF......
@@ -2364,7 +4701,26 @@ Z = (195, 195, 195)
   ................
   ................
 }
-# tile 123 (couatl)
+# tile 246 (couatl,male)
+{
+  ................
+  ................
+  ........I....I..
+  ....KKAIII..III.
+  ...NAOJAKI.IIIII
+  ...KKJAJJKKK..II
+  ...KKAAIJJJJJ..I
+  ...FAA.I...KJ..I
+  ..FAFA..AAAKJAA.
+  .......AAAJJAAA.
+  ......AKKJJAAA..
+  ......KJAAAAAJA.
+  .....JJAA...JA..
+  ......JJJJJJA...
+  ................
+  ................
+}
+# tile 247 (couatl,female)
 {
   ................
   ................
@@ -2383,7 +4739,26 @@ Z = (195, 195, 195)
   ................
   ................
 }
-# tile 124 (Aleax)
+# tile 248 (Aleax,male)
+{
+  ................
+  ......BBBB..I...
+  ..I..BF...B.....
+  ....BF.HHA.B....
+  ...BF.HHHHA.B.I.
+  ...BF.LFLFA.FB..
+  .I.BF.LLLLA.FB..
+  ...BF.ALLA.FB...
+  ..BF.LLAALL.ABA.
+  .BF.LLLLLLLLAFB.
+  .BF.LALLLLALAFB.
+  .BF.LAJJKJALAFB.
+  ..BF..LJJLAAABA.
+  ...BF.LLALAABA..
+  ..BF.LLAALLAFB..
+  ................
+}
+# tile 249 (Aleax,female)
 {
   ................
   ......BBBB..I...
@@ -2402,7 +4777,26 @@ Z = (195, 195, 195)
   ..BF.LLAALLAFB..
   ................
 }
-# tile 125 (Angel)
+# tile 250 (Angel,male)
+{
+  ................
+  ................
+  ......HHHH......
+  ................
+  .......CC.......
+  ......CLLC..AA..
+  ......PLLP....A.
+  ......NPPPA.A...
+  .....BBLLPPAAA..
+  .....NNLLPPAAA..
+  ......BNNPAAAA..
+  ......BNNPAAAA..
+  .....BNNNPAA.A..
+  .....BNNNNPA....
+  ....BNNNNNNP....
+  ................
+}
+# tile 251 (Angel,female)
 {
   ................
   ................
@@ -2421,7 +4815,7 @@ Z = (195, 195, 195)
   ....BNNNNNNP....
   ................
 }
-# tile 126 (ki-rin)
+# tile 252 (ki-rin,male)
 {
   ................
   ................
@@ -2440,13 +4834,51 @@ Z = (195, 195, 195)
   ................
   ................
 }
-# tile 127 (Archon)
+# tile 253 (ki-rin,female)
 {
   ................
-  ......OOOO......
-  .....OOOOOO.....
-  .....OJLLJO.....
-  .....OLLLLO.....
+  ................
+  ..LP............
+  ..PLO.C.C.......
+  ...PLCCD........
+  ...KCIKD........
+  ..KCCCCD........
+  ..CKACCDA.......
+  ...ACCCCCC...A..
+  ...KCCCKCCKAA...
+  ..CAKCKCKCAKA...
+  ..CAAKAKAKA.....
+  ...L.KALAK......
+  .....LA..L......
+  ................
+  ................
+}
+# tile 254 (Archon,male)
+{
+  ................
+  ......OOOO......
+  .....OOOOOO.....
+  .....OJLLJO.....
+  .....OLLLLO.....
+  ....OOJLLJOO....
+  ......AJJA......
+  .....AAAAAAA....
+  ....AAAAAAAAA...
+  ...OAAOAAAJLJ...
+  ..OOAOAAAACJC...
+  ....LAAAACCJCC..
+  .....AAAAAJJJ...
+  ....AAAAAAAA....
+  ................
+  ................
+}
+# tile 255 (Archon,female)
+{
+  ................
+  ......OOOO......
+  .....OOOOOO.....
+  .....OJLLJO.....
+  .....OLLLLO.....
   ....OOJLLJOO....
   ......AJJA......
   .....AAAAAAA....
@@ -2459,7 +4891,26 @@ Z = (195, 195, 195)
   ................
   ................
 }
-# tile 128 (bat)
+# tile 256 (bat,male)
+{
+  ................
+  ................
+  ................
+  ................
+  ...JJJCACJJJ....
+  ..JJAAHJHAAJJ...
+  ..JA...JA..AJ...
+  ................
+  ................
+  ......AAAA......
+  ....AAAAAAAA....
+  ...AAA.AA.AAA...
+  .......AA.......
+  ................
+  ................
+  ................
+}
+# tile 257 (bat,female)
 {
   ................
   ................
@@ -2478,7 +4929,26 @@ Z = (195, 195, 195)
   ................
   ................
 }
-# tile 129 (giant bat)
+# tile 258 (giant bat,male)
+{
+  ................
+  ................
+  ................
+  ...JK.J.J.JK....
+  ..KJJJCACJJKJ...
+  .JJJAAHJHAAJJK..
+  .KJA...JA..AJJ..
+  ..JA.......AJ...
+  ................
+  .....AAAAAA.....
+  ...AAAAAAAAAA...
+  ..AAAA.AA.AAAA..
+  .......AA.......
+  ................
+  ................
+  ................
+}
+# tile 259 (giant bat,female)
 {
   ................
   ................
@@ -2497,7 +4967,26 @@ Z = (195, 195, 195)
   ................
   ................
 }
-# tile 130 (raven)
+# tile 260 (raven,male)
+{
+  ..AAAA...AAA....
+  .AAAAAA.AAA.....
+  AAAAAAAAAAA.AA..
+  A...AAAAAAAAAAA.
+  ......AAAAAAAAA.
+  .....AAAA.....AA
+  .....ADA.......A
+  .....PA.........
+  .....P..........
+  .........P.P.P..
+  ........P.P.P.P.
+  .......P.P.P....
+  ........P.P.P...
+  ...........P....
+  ................
+  ................
+}
+# tile 261 (raven,female)
 {
   ..AAAA...AAA....
   .AAAAAA.AAA.....
@@ -2516,7 +5005,26 @@ Z = (195, 195, 195)
   ................
   ................
 }
-# tile 131 (vampire bat)
+# tile 262 (vampire bat,male)
+{
+  ................
+  ................
+  ................
+  ...AA.A.A.AA....
+  ..AAAAAAAAAAA...
+  .AAAA.DAD.AAAA..
+  .AAA...A...AAA..
+  ..A.........A...
+  ................
+  .....AAAAAA.....
+  ...AAAAAAAAAA...
+  ..AAAA.AA.AAAA..
+  .......AA.......
+  ................
+  ................
+  ................
+}
+# tile 263 (vampire bat,female)
 {
   ................
   ................
@@ -2535,7 +5043,26 @@ Z = (195, 195, 195)
   ................
   ................
 }
-# tile 132 (plains centaur)
+# tile 264 (plains centaur,male)
+{
+  ................
+  ...KKA..........
+  ...LLAA.........
+  .AAKKAA.........
+  .LLAALLA........
+  LALLLLALA.......
+  LALLLKALA.A.....
+  ..LKLKAAAAA.....
+  ..KLKJKJJKAA....
+  .KJKJKJKJAKAAAA.
+  .KAKJJJJKJAAA.A.
+  .KAAKAAAAKAA....
+  ..CAKAAJAKA.....
+  ....KAAKAK......
+  ....CA...C......
+  ................
+}
+# tile 265 (plains centaur,female)
 {
   ................
   ...KKA..........
@@ -2554,7 +5081,26 @@ Z = (195, 195, 195)
   ....CA...C......
   ................
 }
-# tile 133 (forest centaur)
+# tile 266 (forest centaur,male)
+{
+  ................
+  ................
+  ................
+  ...KKA..........
+  LA.LLAALA.......
+  LAALLAALA.......
+  .LLAALLA........
+  ..LLLLA.A.......
+  ..LKLKAAAAA.....
+  ..KLKJKJJKAA....
+  .KJKJKJKJAKA.A..
+  .KAKJJJJKJAAAA..
+  .KAAKAAJAKA.....
+  ..C.KAAKAK......
+  ....CA...C......
+  ................
+}
+# tile 267 (forest centaur,female)
 {
   ................
   ................
@@ -2573,7 +5119,26 @@ Z = (195, 195, 195)
   ....CA...C......
   ................
 }
-# tile 134 (mountain centaur)
+# tile 268 (mountain centaur,male)
+{
+  ................
+  ................
+  ...KKA..........
+  ...LLAA.........
+  ..AKKAA.........
+  .LJJJJLA........
+  LAJKKJALA.A.....
+  LAKKKKALAAA.....
+  ..JJJJKJJKAA....
+  .KJJJKJKJAKAAAA.
+  .KAKJJJJKJAAA.A.
+  .KAAKAAAAKAA....
+  ..CAKAAJAKA.....
+  ....KAAKAK......
+  ....CA...C......
+  ................
+}
+# tile 269 (mountain centaur,female)
 {
   ................
   ................
@@ -2592,7 +5157,26 @@ Z = (195, 195, 195)
   ....CA...C......
   ................
 }
-# tile 135 (baby gray dragon)
+# tile 270 (baby gray dragon,male)
+{
+  ................
+  ................
+  ................
+  .....BBBA.......
+  ....NPNPPA......
+  ...BPPPPPA......
+  ..CHHPABPA.AAA..
+  .CHCDA.BPAAAAAA.
+  ..D..BPPAAAAAAA.
+  ....BBPPPPPAAAA.
+  ...BOOPPPPPPAAA.
+  ..BPOBPPPPPPPAA.
+  ..BPPBPPOBPAPPA.
+  ..BPABP.ABPAPPA.
+  .....BPAA..PPAA.
+  ...........PAA..
+}
+# tile 271 (baby gray dragon,female)
 {
   ................
   ................
@@ -2611,7 +5195,26 @@ Z = (195, 195, 195)
   .....BPAA..PPAA.
   ...........PAA..
 }
-# tile 136 (baby silver dragon)
+# tile 272 (baby silver dragon,male)
+{
+  ................
+  ................
+  ................
+  .....PPPA.......
+  ....OBOBBA......
+  ...PBBBBBA......
+  ..CHHBAPBA.AAA..
+  .CHCDA.PBAAAAAA.
+  ..D..PBBAAAAAAA.
+  ....PPBBBBBAAAA.
+  ...PNNBBBBBBAAA.
+  ..PBNPBBBBBBBAA.
+  ..PBBPBBNPBABBA.
+  ..PBAPB.APBABBA.
+  .....PBAA..BBAA.
+  ...........BAA..
+}
+# tile 273 (baby silver dragon,female)
 {
   ................
   ................
@@ -2630,7 +5233,26 @@ Z = (195, 195, 195)
   .....PBAA..BBAA.
   ...........BAA..
 }
-# tile 137 (baby shimmering dragon)
+# tile 274 (baby shimmering dragon,male)
+{
+  .I..............
+  ...BBBBBBB.I....
+  ..BF.FFF.FB...I.
+  .BF..BBBA.FB....
+  BF..NPNPPAFB.I..
+  BF.BPPPPPA.B....
+  B.CHHPABPAFBAAI.
+  BCHCDA.BPAAFBAA.
+  B.D..BPPAAAAFBA.
+  B...BBPPPPPAAFB.
+  BF.BOOPPPPPPAAAB
+  BFBPOBPPPPPPPAFB
+  BFBPPBPPOBPAPPFB
+  B.BPABP.ABPAPPFB
+  B....BPAA..PPAAB
+  .B.........PAAB.
+}
+# tile 275 (baby shimmering dragon,female)
 {
   .I..............
   ...BBBBBBB.I....
@@ -2649,7 +5271,26 @@ Z = (195, 195, 195)
   B....BPAA..PPAAB
   .B.........PAAB.
 }
-# tile 138 (baby red dragon)
+# tile 276 (baby red dragon,male)
+{
+  ................
+  ................
+  ................
+  .....IIIA.......
+  ....NDNDDA......
+  ...IDDDDDA......
+  ..CHHDAIDA.AAA..
+  .CHCDA.IDAAAAAA.
+  ..D..IDDAAAAAAA.
+  ....IIDDDDDAAAA.
+  ...IHHDDDDDDAAA.
+  ..IDHIDDDDDDDAA.
+  ..IDDIDDHIDADDA.
+  ..IDAID.AIDADDA.
+  .....IDAA..DDAA.
+  ...........DAA..
+}
+# tile 277 (baby red dragon,female)
 {
   ................
   ................
@@ -2668,7 +5309,26 @@ Z = (195, 195, 195)
   .....IDAA..DDAA.
   ...........DAA..
 }
-# tile 139 (baby white dragon)
+# tile 278 (baby white dragon,male)
+{
+  ................
+  ................
+  ................
+  .....NNNA.......
+  ....IOIOOA......
+  ...NOOOOOA......
+  ..CHHOANOA.AAA..
+  .CHCDA.NOAAAAAA.
+  ..D..NOOAAAAAAA.
+  ....NNOOOOOAAAA.
+  ...NOOOOOOOOAAA.
+  ..NOONOOOOOOOAA.
+  ..NOONOOONOAOOA.
+  ..NOANO.ANOAOOA.
+  .....NOAA..OOAA.
+  ...........OAA..
+}
+# tile 279 (baby white dragon,female)
 {
   ................
   ................
@@ -2687,7 +5347,7 @@ Z = (195, 195, 195)
   .....NOAA..OOAA.
   ...........OAA..
 }
-# tile 140 (baby orange dragon)
+# tile 280 (baby orange dragon,male)
 {
   ................
   ................
@@ -2706,7 +5366,45 @@ Z = (195, 195, 195)
   .....LCAA..CCAA.
   ...........CAA..
 }
-# tile 141 (baby black dragon)
+# tile 281 (baby orange dragon,female)
+{
+  ................
+  ................
+  ................
+  .....LLLA.......
+  ....NCNCCA......
+  ...LCCCCCA......
+  ..CHHCALCA.AAA..
+  .CHCDA.LCAAAAAA.
+  ..D..LCCAAAAAAA.
+  ....LLCCCCCAAAA.
+  ...LOOCCCCCCAAA.
+  ..LCOLCCCCCCCAA.
+  ..LCCLCCOLCACCA.
+  ..LCALC.ALCACCA.
+  .....LCAA..CCAA.
+  ...........CAA..
+}
+# tile 282 (baby black dragon,male)
+{
+  ................
+  ................
+  ................
+  .....AAA........
+  ....NANAA.......
+  ...AAAAAA.......
+  ..CHHA.AA..PPP..
+  .CHCD..AA.PPPPP.
+  ..D..AAAPPP.PPP.
+  ....AAAAAAAPPPP.
+  ...AAAAAAAAAPPP.
+  ..AAAAAAAAAAAPP.
+  ..AAAAAAAAAPAAP.
+  ..AAPAA.PAAPAAP.
+  .....AAP...AAPP.
+  ...........APP..
+}
+# tile 283 (baby black dragon,female)
 {
   ................
   ................
@@ -2725,7 +5423,26 @@ Z = (195, 195, 195)
   .....AAP...AAPP.
   ...........APP..
 }
-# tile 142 (baby blue dragon)
+# tile 284 (baby blue dragon,male)
+{
+  ................
+  ................
+  ................
+  .....BBBA.......
+  ....NENEEA......
+  ...BEEEEEA......
+  ..CHHEABEA.AAA..
+  CCHCDA.BEAAAAAA.
+  ..D..BEEAAAAAAA.
+  ....BBEEEEEAAAA.
+  ...BOOEEEEEEAAA.
+  ..BEOBEEEEEEEAA.
+  ..BEEBEEOBEAEEA.
+  ..BEABE.ABEAEEA.
+  .....BEAA..EEAA.
+  ...........EAA..
+}
+# tile 285 (baby blue dragon,female)
 {
   ................
   ................
@@ -2744,7 +5461,26 @@ Z = (195, 195, 195)
   .....BEAA..EEAA.
   ...........EAA..
 }
-# tile 143 (baby green dragon)
+# tile 286 (baby green dragon,male)
+{
+  ................
+  ................
+  ................
+  .....GGGA.......
+  ....NFNFFA......
+  ...GFFFFFA......
+  ..CHHFAGFA.AAA..
+  .CHCDA.GFAAAAAA.
+  ..D..GFFAAAAAAA.
+  ....GGFFFFFAAAA.
+  ...GOOFFFFFFAAA.
+  ..GFOGFFFFFFFAA.
+  ..GFFGFFOGFAFFA.
+  ..GFAGF.AGFAFFA.
+  .....GFAA..FFAA.
+  ...........FAA..
+}
+# tile 287 (baby green dragon,female)
 {
   ................
   ................
@@ -2763,7 +5499,26 @@ Z = (195, 195, 195)
   .....GFAA..FFAA.
   ...........FAA..
 }
-# tile 144 (baby yellow dragon)
+# tile 288 (baby yellow dragon,male)
+{
+  ................
+  ................
+  ................
+  .....NNNA.......
+  ....DHDHHA......
+  ...NHHHHHA......
+  ..CHHHANHA.AAA..
+  .CHCDA.NHAAAAAA.
+  ..D..NHHAAAAAAA.
+  ....NNHHHHHAAAA.
+  ...NOOHHHHHHAAA.
+  ..NHONHHHHHHHAA.
+  ..NHHNHHONHAHHA.
+  ..NHANH.ANHAHHA.
+  .....NHAA..HHAA.
+  ...........HAA..
+}
+# tile 289 (baby yellow dragon,female)
 {
   ................
   ................
@@ -2782,7 +5537,26 @@ Z = (195, 195, 195)
   .....NHAA..HHAA.
   ...........HAA..
 }
-# tile 145 (gray dragon)
+# tile 290 (gray dragon,male)
+{
+  ......BBBPA.....
+  .....NPNPPPA....
+  ....BPPPPPPA....
+  ..DCHHP..PPA....
+  CHCHCD..BPPA....
+  HD.D...BPPA.....
+  ......OBPAAAAAA.
+  ....BOBPAAAAAAAA
+  ..BOOBPA.PP.AAA.
+  .BOOOBPPPPPP.AA.
+  .BOOOBPPPPPPPAA.
+  PPOOBBPPPPPPPPA.
+  BP.OBPPOOPP.P.A.
+  BPAABP.AAPPAPPA.
+  ....BPAA...PP.A.
+  ........PPPP.A..
+}
+# tile 291 (gray dragon,female)
 {
   ......BBBPA.....
   .....NPNPPPA....
@@ -2801,7 +5575,26 @@ Z = (195, 195, 195)
   ....BPAA...PP.A.
   ........PPPP.A..
 }
-# tile 146 (silver dragon)
+# tile 292 (silver dragon,male)
+{
+  ......PPPBA.....
+  .....OBOBBBA....
+  ....PBBBBBBA....
+  ..DCHHB..BBA....
+  CHCHCD..PBBA....
+  HD.D...PBBA.....
+  ......NPBAAAAAA.
+  ....PNPBAAAAAAAA
+  ..PNNPBA.BB.AAA.
+  .PNNNPBBBBBB.AA.
+  .PNNNPBBBBBBBAA.
+  BBNNPPBBBBBBBBA.
+  PB.NPBBNNBB.B.A.
+  PBAAPB.AABBABBA.
+  ....PBAA...BB.A.
+  ........BBBB.A..
+}
+# tile 293 (silver dragon,female)
 {
   ......PPPBA.....
   .....OBOBBBA....
@@ -2820,7 +5613,26 @@ Z = (195, 195, 195)
   ....PBAA...BB.A.
   ........BBBB.A..
 }
-# tile 147 (shimmering dragon)
+# tile 294 (shimmering dragon,male)
+{
+  .I.BF.BBBPAFB...
+  ..BF.NPNPPPAFB.I
+  .BF.BPPPPPPAFB..
+  .BDCHHP..PPAFBI.
+  CBCHCD..BPPAFB..
+  HDBB...BPPA.B..I
+  ..BF..OBPAAAABA.
+  .BF.BOBPAAAAAFBA
+  BFBOOBPA.PP.AAFB
+  .BOOOBPPPPPP.AFB
+  .BOOOBPPPPPPPAFB
+  PPOOBBPPPPPPPPFB
+  BP.OBPPOOPP.P.FB
+  BPAABP.AAPPAPPFB
+  ....BPAA...PP.AB
+  ........PPPP.AB.
+}
+# tile 295 (shimmering dragon,female)
 {
   .I.BF.BBBPAFB...
   ..BF.NPNPPPAFB.I
@@ -2839,7 +5651,26 @@ Z = (195, 195, 195)
   ....BPAA...PP.AB
   ........PPPP.AB.
 }
-# tile 148 (red dragon)
+# tile 296 (red dragon,male)
+{
+  ......IIIDA.....
+  .....NDNDDDA....
+  ....IDDDDDDA....
+  ..DCHHD..DDA....
+  CHCHCD..IDDA....
+  HD.D...IDDA.....
+  ......HIDAAAAAA.
+  ....IHIDAAAAAAAA
+  ..IHHIDAJDDJAAA.
+  .IHHHIDDDDDDJAA.
+  .IHHHIDDDDDDDAA.
+  DDHHIIDDDDDDDDA.
+  ID.HIDDHHDDJDJA.
+  IDAAID.AADDADDA.
+  ....IDAAJJJDDJA.
+  ........DDDDJA..
+}
+# tile 297 (red dragon,female)
 {
   ......IIIDA.....
   .....NDNDDDA....
@@ -2858,7 +5689,26 @@ Z = (195, 195, 195)
   ....IDAAJJJDDJA.
   ........DDDDJA..
 }
-# tile 149 (white dragon)
+# tile 298 (white dragon,male)
+{
+  ......NNNOA.....
+  .....IOIOOOA....
+  ....NOOOOOOA....
+  ..DCHHO..OOA....
+  CHCHCD..NOOA....
+  HD.D...NOOA.....
+  ......ONOAAAAAA.
+  ....NONOAAAAAAAA
+  ..NOONOA.OO.AAA.
+  .NOOONOOOOOOJAA.
+  .NOOONOOOOOOOAA.
+  OOOONNOOOOOOOOA.
+  NO.ONOOOOOO.OJA.
+  NOAANO.AAOOAOOA.
+  ....NOAA...OOJA.
+  ........OOOOJA..
+}
+# tile 299 (white dragon,female)
 {
   ......NNNOA.....
   .....IOIOOOA....
@@ -2877,7 +5727,26 @@ Z = (195, 195, 195)
   ....NOAA...OOJA.
   ........OOOOJA..
 }
-# tile 150 (orange dragon)
+# tile 300 (orange dragon,male)
+{
+  ......LLLCA.....
+  .....NCNCCCA....
+  ....LCCCCCCA....
+  ..DCHHC..CCA....
+  CHCHCD..LCCA....
+  HD.D...LCCA.....
+  ......OLCAAAAAA.
+  ....LOLCAAAAAAAA
+  ..LOOLCA.CCKAAA.
+  .LOOOLCCCCCCJAA.
+  .LOOOLCCCCCCCAA.
+  CCOOLLCCCCCCCCA.
+  LC.OLCCOOCCKCJA.
+  LCAALC.AACCACCA.
+  ....LCAA.KKCCJA.
+  ........CCCCJA..
+}
+# tile 301 (orange dragon,female)
 {
   ......LLLCA.....
   .....NCNCCCA....
@@ -2896,7 +5765,26 @@ Z = (195, 195, 195)
   ....LCAA.KKCCJA.
   ........CCCCJA..
 }
-# tile 151 (black dragon)
+# tile 302 (black dragon,male)
+{
+  ......AAAA......
+  .....NANAAA.....
+  ....AAAAAAA.....
+  ..DCHHA..AA.....
+  CHCHCD..AAA.....
+  HD.D...AAA......
+  ......AAA..PPPP.
+  ....AAAAPPPPPPPP
+  ..AAAAAAAAA.PPP.
+  .AAAAAAAAAAAAPP.
+  .AAAAAAAAAAAAPP.
+  AAAAAAAAAAAAAAP.
+  AA.AAAAAAAA.AAP.
+  AAPPAA.PPAAPAAP.
+  ....AAPP...AAAP.
+  ........AAAAA...
+}
+# tile 303 (black dragon,female)
 {
   ......AAAA......
   .....NANAAA.....
@@ -2915,7 +5803,26 @@ Z = (195, 195, 195)
   ....AAPP...AAAP.
   ........AAAAA...
 }
-# tile 152 (blue dragon)
+# tile 304 (blue dragon,male)
+{
+  ......BBBEA.....
+  .....NENEEEA....
+  ....BEEEEEEA....
+  ..DCHHE..EEA....
+  CHCHCD..BEEA....
+  HD.D...BEEA.....
+  ......OBEAAAAAA.
+  ....BOBEAAAAAAAA
+  ..BOOBEA.EE.AAA.
+  .BOOOBEEEEEEJAA.
+  .BOOOBEEEEEEEAA.
+  EEOOBBEEEEEEEEA.
+  BE.OBEEOOEE.EJA.
+  BEAABE.AAEEAEEA.
+  ....BEAA...EEJA.
+  ...P....EEEEJA..
+}
+# tile 305 (blue dragon,female)
 {
   ......BBBEA.....
   .....NENEEEA....
@@ -2934,7 +5841,26 @@ Z = (195, 195, 195)
   ....BEAA...EEJA.
   ...P....EEEEJA..
 }
-# tile 153 (green dragon)
+# tile 306 (green dragon,male)
+{
+  ......GGGFA.....
+  .....NFNFFFA....
+  ....GFFFFFFA....
+  ..DCHHF..FFA....
+  CHCHCD..GFFA....
+  HD.D...GFFA.....
+  ......OGFAAAAAA.
+  ....GOGFAAAAAAAA
+  ..GOOGFA.FF.AAA.
+  .GOOOGFFFFFFJAA.
+  .GOOOGFFFFFFFAA.
+  FFOOGGFFFFFFFFA.
+  GF.OGFFOOFF.FJA.
+  GFAAGF.AAFFAFFA.
+  ....GFAA...FFJA.
+  ........FFFFJA..
+}
+# tile 307 (green dragon,female)
 {
   ......GGGFA.....
   .....NFNFFFA....
@@ -2953,7 +5879,7 @@ Z = (195, 195, 195)
   ....GFAA...FFJA.
   ........FFFFJA..
 }
-# tile 154 (yellow dragon)
+# tile 308 (yellow dragon,male)
 {
   ......NNNHA.....
   .....DHDHHHA....
@@ -2972,12 +5898,50 @@ Z = (195, 195, 195)
   ....NHAAJJJHHJA.
   ........HHHHJA..
 }
-# tile 155 (stalker)
+# tile 309 (yellow dragon,female)
 {
-  ................
-  .......PPP......
-  ......P.P.P.....
-  .....PPPPPP.....
+  ......NNNHA.....
+  .....DHDHHHA....
+  ....NHHHHHHA....
+  ..DCHHH..HHA....
+  CHCHCD..NHHA....
+  HD.D...NHHA.....
+  ......ONHAAAAAA.
+  ....NONHAAAAAAAA
+  ..NOONHAJHHJAAA.
+  .NOOONHHHHHHJAA.
+  .NOOONHHHHHHHAA.
+  HHOONNHHHHHHHHA.
+  NH.ONHHOOHHJHJA.
+  NHAANH.AAHHAHHA.
+  ....NHAAJJJHHJA.
+  ........HHHHJA..
+}
+# tile 310 (stalker,male)
+{
+  ................
+  .......PPP......
+  ......P.P.P.....
+  .....PPPPPP.....
+  .....PP..PPP....
+  ....PPPPPP.P....
+  ....P.PPPP.P....
+  ....P.PPP..P....
+  ....P..PP..P....
+  ....P.PPPP.P....
+  ....P.P..P.P....
+  ....P.P..P.P....
+  ......P..P......
+  ......P..P......
+  .....PP..PP.....
+  ................
+}
+# tile 311 (stalker,female)
+{
+  ................
+  .......PPP......
+  ......P.P.P.....
+  .....PPPPPP.....
   .....PP..PPP....
   ....PPPPPP.P....
   ....P.PPPP.P....
@@ -2991,7 +5955,26 @@ Z = (195, 195, 195)
   .....PP..PP.....
   ................
 }
-# tile 156 (air elemental)
+# tile 312 (air elemental,male)
+{
+  ................
+  ...P.PPP..P.....
+  ..P.PAPA.P......
+  P..PPPPPP..P....
+  .P.PPAAPPP...P..
+  ..PPPAAP.P.P....
+  ..PAPAAPAP......
+  P.PAPPP.AP.P.AA.
+  ..PA.PP.AP.AAAA.
+  ..PAPPPPAPAAAA..
+  ..PAP.APAPAAAA..
+  ..PAP.APAPAAAAA.
+  ....P.APAAAAAAA.
+  ..P.P.APPAAAAAA.
+  ...PP.APPPA.....
+  ................
+}
+# tile 313 (air elemental,female)
 {
   ................
   ...P.PPP..P.....
@@ -3010,7 +5993,26 @@ Z = (195, 195, 195)
   ...PP.APPPA.....
   ................
 }
-# tile 157 (fire elemental)
+# tile 314 (fire elemental,male)
+{
+  ................
+  .H..LDDD........
+  ...LDADAC.H.....
+  H..DDDDDD..H.H..
+  ..LDDAADDD......
+  ..DDDAADCD.H....
+  ..DADAACAD......
+  H.DADDDCAD...AA.
+  ..DACDDCAD.AAAA.
+  ..DADDDDADAAAA..
+  ..DADCADADAAAA..
+  H.DADCADADAAAAA.
+  ....DCADAAAAAAA.
+  .H.LDCADDAAAAAA.
+  ..LDDCADDDA.....
+  ................
+}
+# tile 315 (fire elemental,female)
 {
   ................
   .H..LDDD........
@@ -3029,7 +6031,26 @@ Z = (195, 195, 195)
   ..LDDCADDDA.....
   ................
 }
-# tile 158 (earth elemental)
+# tile 316 (earth elemental,male)
+{
+  ..F.............
+  ....CKKK..F.....
+  ...CKAKAJ....F..
+  ...KKKKKK.......
+  ..CKKAAKKK.F..F.
+  .FKKKAAKJK......
+  ..KAKAAJAK..F...
+  ..KAKJJJAK...AA.
+  F.KAJKKJAK.AAAA.
+  ..KAKKKKAKAAAA..
+  ..KAKJAKAKAAAA..
+  ..KAKJAKAKAAAAA.
+  ....KJAKAAAAAAA.
+  .F.CKJAKKAAAAAA.
+  ..CKKJAKKKA.....
+  ................
+}
+# tile 317 (earth elemental,female)
 {
   ..F.............
   ....CKKK..F.....
@@ -3048,7 +6069,26 @@ Z = (195, 195, 195)
   ..CKKJAKKKA.....
   ................
 }
-# tile 159 (water elemental)
+# tile 318 (water elemental,male)
+{
+  ................
+  ....PBBB..E.....
+  .E.PBABAE...E...
+  ...BBBBBB.......
+  ..PBBAABBB.E..E.
+  E.BBBAABEB......
+  ..BABAABEB.E....
+  ..BABBBBEB...AA.
+  ..BAPBBEAB.AAAA.
+  E.BABBBBABAAAA..
+  ..BABEABABAAAA..
+  ..BABEABABAAAAA.
+  ....BEABAAAAAAA.
+  .E.PBEABBAAAAAA.
+  ..PBBEABBBA.....
+  ................
+}
+# tile 319 (water elemental,female)
 {
   ................
   ....PBBB..E.....
@@ -3067,7 +6107,26 @@ Z = (195, 195, 195)
   ..PBBEABBBA.....
   ................
 }
-# tile 160 (lichen)
+# tile 320 (lichen,male)
+{
+  ................
+  ................
+  ...FFF...FFF....
+  ..FCFFFFFCCFA...
+  .FCOOFFFCOFFFA..
+  .FCOOFFFCFFFFA..
+  ..FFFFFFFFFFA...
+  ...AFFFCCFFFA...
+  ...FFFFCOFFAA...
+  ..FCCFFCOFCFA...
+  ..FCOFFCFFOCFA..
+  ..FFCFFFCFFFFA..
+  ...FFFAAFFFFFA..
+  .....AA.AAAAA...
+  ................
+  ................
+}
+# tile 321 (lichen,female)
 {
   ................
   ................
@@ -3086,7 +6145,26 @@ Z = (195, 195, 195)
   ................
   ................
 }
-# tile 161 (brown mold)
+# tile 322 (brown mold,male)
+{
+  ................
+  ................
+  ...JJJ...JJJ....
+  ..JKJJJJJKKJA...
+  .JKCCJJJKCJJJA..
+  .JKCCJJJKJJJJA..
+  ..JJJJJJJJJJA...
+  ...AJJJKKJJJA...
+  ...JJJJKCJJAA...
+  ..JKKJJKCJKJA...
+  ..JKCJJKJJCKJA..
+  ..JJKJJJKJJJJA..
+  ...JJJAAJJJJJA..
+  .....AA.AAAAA...
+  ................
+  ................
+}
+# tile 323 (brown mold,female)
 {
   ................
   ................
@@ -3105,7 +6183,26 @@ Z = (195, 195, 195)
   ................
   ................
 }
-# tile 162 (yellow mold)
+# tile 324 (yellow mold,male)
+{
+  ................
+  ................
+  ...HHH...HHH....
+  ..HHHHHHHNHHA...
+  .HHNNOHHNNOHHA..
+  .HHNNOOHHOOHHA..
+  ..HHOOHHHHHHA...
+  ...AHHHHHHHHA...
+  ...HHHHNNOHAA...
+  ..HHHHHNNOHHA...
+  ..HNNOHHHONOHA..
+  ..HHOHHHHHOOHA..
+  ...HHHAAHHHHHA..
+  .....AA.AAAAA...
+  ................
+  ................
+}
+# tile 325 (yellow mold,female)
 {
   ................
   ................
@@ -3124,7 +6221,26 @@ Z = (195, 195, 195)
   ................
   ................
 }
-# tile 163 (green mold)
+# tile 326 (green mold,male)
+{
+  ................
+  ................
+  ...FFF...FFF....
+  ..FGFFFFFGGFA...
+  .FGOOFFFGOFFFA..
+  .FGOOFFFGFFFFA..
+  ..FFFFFFFFFFA...
+  ...AFFFGGFFFA...
+  ...FFFFGOFFAA...
+  ..FGGFFGOFGFA...
+  ..FGOFFGFFOGFA..
+  ..FFGFFFGFFFFA..
+  ...FFFAAFFFFFA..
+  .....AA.AAAAA...
+  ................
+  ................
+}
+# tile 327 (green mold,female)
 {
   ................
   ................
@@ -3143,7 +6259,26 @@ Z = (195, 195, 195)
   ................
   ................
 }
-# tile 164 (red mold)
+# tile 328 (red mold,male)
+{
+  ................
+  ................
+  ...DDD...DDD....
+  ..DCDDDDDCCDA...
+  .DLLCDDDCLDDDA..
+  .DCCCDDDCDDDDA..
+  ..DDDDDDDDDDA...
+  ...ADDDCCDDDA...
+  ...DDDDCLDDAA...
+  ..DCCDDCLDCDA...
+  ..DCLDDCDDLCDA..
+  ..DDCDDDCDDDDA..
+  ...DDDAADDDDDA..
+  .....AA.AAAAA...
+  ................
+  ................
+}
+# tile 329 (red mold,female)
 {
   ................
   ................
@@ -3162,7 +6297,26 @@ Z = (195, 195, 195)
   ................
   ................
 }
-# tile 165 (shrieker)
+# tile 330 (shrieker,male)
+{
+  ................
+  ................
+  ................
+  ................
+  .....GGGGFF.....
+  ...GGGGIGIDFF...
+  .GGGIIGGGIIFFFF.
+  GIIGIIGGGGGGGDDF
+  GIIGGGGIIGIIGIDF
+  GGGGIGGIIGIIGGFF
+  ..GGGGGGGGGGG...
+  ......FFF..AAAAA
+  ....AGGGFFAAAAAA
+  ...AGGGGGGFAAAA.
+  ...AAAAAAAAAA...
+  ................
+}
+# tile 331 (shrieker,female)
 {
   ................
   ................
@@ -3181,7 +6335,26 @@ Z = (195, 195, 195)
   ...AAAAAAAAAA...
   ................
 }
-# tile 166 (violet fungus)
+# tile 332 (violet fungus,male)
+{
+  ................
+  ................
+  ...III...III....
+  ..ILIIIIILLIA...
+  .IOOLIIILOIIIA..
+  .ILLLIIILIIIIA..
+  ..IIIIIIIIIIA...
+  ...AIIILLIIIA...
+  ...IIIILOIIAA...
+  ..ILLIILOILIA...
+  ..ILOIILIIOLIA..
+  ..IILIIILIIIIA..
+  ...IIIAAIIIIIA..
+  .....AA.AAAAA...
+  ................
+  ................
+}
+# tile 333 (violet fungus,female)
 {
   ................
   ................
@@ -3200,7 +6373,26 @@ Z = (195, 195, 195)
   ................
   ................
 }
-# tile 167 (gnome)
+# tile 334 (gnome,male)
+{
+  ................
+  ................
+  ................
+  .....DF.........
+  ......G.........
+  .....GFF........
+  ....GGFFF.......
+  ....GLLLF.......
+  .....OLO...AAA..
+  ...FGOOOFFAAAA..
+  ...GAGOFAFAAAA..
+  ....LKNKFAAAA...
+  ....FGAFFAA.....
+  ....GFAFG.A.....
+  ................
+  ................
+}
+# tile 335 (gnome,female)
 {
   ................
   ................
@@ -3219,7 +6411,7 @@ Z = (195, 195, 195)
   ................
   ................
 }
-# tile 168 (gnome lord)
+# tile 336 (gnome leader,male)
 {
   ................
   ................
@@ -3238,7 +6430,45 @@ Z = (195, 195, 195)
   ................
   ................
 }
-# tile 169 (gnomish wizard)
+# tile 337 (gnome leader,female)
+{
+  ................
+  ................
+  ......D.........
+  ......G.........
+  ......G.........
+  .....GFF........
+  ....HHHHH.......
+  ....GLLLF.....A.
+  .....OLO...AAA..
+  ...FGOOOFFAAAA..
+  ...GAGOFAFAAAA..
+  ....LKNKFAAAA...
+  ....FGAFFAA.....
+  ....GFAFG.A.....
+  ................
+  ................
+}
+# tile 338 (gnomish wizard,male)
+{
+  ................
+  ................
+  ................
+  ................
+  ......G.........
+  .....GFF........
+  ....GGFFF.......
+  ....GLLLF.......
+  ...FFOLOFF.AAA..
+  ...GFOOOFFAAAA..
+  ...FAGOFAFAAAA..
+  ...GLKNKFFAAA...
+  ...FFGFFFFA.....
+  ...GFFFFGFA.....
+  ................
+  ................
+}
+# tile 339 (gnomish wizard,female)
 {
   ................
   ................
@@ -3257,7 +6487,26 @@ Z = (195, 195, 195)
   ................
   ................
 }
-# tile 170 (gnome king)
+# tile 340 (gnome ruler,male)
+{
+  ................
+  ................
+  ................
+  ................
+  ....H.C.H.......
+  ....HCHCH.......
+  ....HHHHH.......
+  ....GLLLF...A...
+  .....OLO...AAAA.
+  ...FGOOOFFAAAA..
+  ...GAGOFAFAAAA..
+  ....LKNKFAAAA...
+  ....FGAFFAA.....
+  ....GFAFG.A.....
+  ................
+  ................
+}
+# tile 341 (gnome ruler,female)
 {
   ................
   ................
@@ -3276,7 +6525,26 @@ Z = (195, 195, 195)
   ................
   ................
 }
-# tile 171 (giant)
+# tile 342 (giant,male)
+{
+  ......JJJJAA....
+  ....JJJJJJJJA...
+  ....JJLLLLJJA...
+  ....JFFLLFFJA...
+  ....JLLLLLLJA...
+  ....ALLAALLAAA..
+  .....ALLLLJAAAA.
+  ..CCLLJJJJLLCCAA
+  .CLLLCCKCKCLLLCA
+  .LLLKLKCKCLKLLLA
+  .LLAALLCCLLAALLA
+  .LLAAJJJKKJAALLA
+  .CLC.JJJJJKKCLAA
+  ..LL.CLJACLJLLAA
+  .....CLJACLJAAAA
+  ...LLLLJ.CLLLKAA
+}
+# tile 343 (giant,female)
 {
   ......JJJJAA....
   ....JJJJJJJJA...
@@ -3295,7 +6563,26 @@ Z = (195, 195, 195)
   .....CLJACLJAAAA
   ...LLLLJ.CLLLKAA
 }
-# tile 172 (stone giant)
+# tile 344 (stone giant,male)
+{
+  ......JJJJAA....
+  ....JJJJJJJJA...
+  ....JJLLLLJJA...
+  ....JFFLLFFJA...
+  ....JLLLLLLJA...
+  ....ALLAALLAAA..
+  .....ALLLLJAAAA.
+  ..CCLLJJJJLLCCAA
+  .CLLLCCKCKCLLLCA
+  .LLLAAKCKCLKLLLA
+  .LLPPPACCLLAALLA
+  .LLPPPPAKKJAALLA
+  .CLCPPPAJJKKCLAA
+  ..LLPPALACLJLLAA
+  .....ALJACLJAAAA
+  ...LLLLJ.CLLLKAA
+}
+# tile 345 (stone giant,female)
 {
   ......JJJJAA....
   ....JJJJJJJJA...
@@ -3314,7 +6601,26 @@ Z = (195, 195, 195)
   .....ALJACLJAAAA
   ...LLLLJ.CLLLKAA
 }
-# tile 173 (hill giant)
+# tile 346 (hill giant,male)
+{
+  ......JJJJAA....
+  ....JJJJJJJJA...
+  ....JJLLLLJJA...
+  ....JFFLLFFJA...
+  ....JLLLLLLJA...
+  ....ALLAALLAAA..
+  .....ALLLLJAAAA.
+  ...JJKJJJJJJJAA.
+  ..LJJCCKCKCJJLA.
+  ..JLKKKCKCKKLJA.
+  ..LAAKKCCKJAALAA
+  ..LAAJJJKKJAALAA
+  ..LC.JJJJJKKCLAA
+  ..LL.CLJACLJLLAA
+  .....CLJACLJAAAA
+  ...LLLLJ.LLLLKAA
+}
+# tile 347 (hill giant,female)
 {
   ......JJJJAA....
   ....JJJJJJJJA...
@@ -3333,7 +6639,26 @@ Z = (195, 195, 195)
   .....CLJACLJAAAA
   ...LLLLJ.LLLLKAA
 }
-# tile 174 (fire giant)
+# tile 348 (fire giant,male)
+{
+  ....PPDDDDAA....
+  ....PDDDDDDDA...
+  ...PPDLLLLDDA...
+  ...PDPFLLFFDA...
+  ...PPPLLLLLDA...
+  ....PLLAALLAAA..
+  ...PPALLLLJAAAA.
+  ...JPDJJJJJJJAA.
+  ..LDDHDKCKCJJLA.
+  ..JLHDDCKCKKLJA.
+  ..LAHDHCCKJAALAA
+  JLAADDHJKKJAALAA
+  JJLJDHHJJJKKCLAA
+  ..LLJJJJACLJLLAA
+  .....CLJACLJAAAA
+  ...LLLLJ.LLLLKAA
+}
+# tile 349 (fire giant,female)
 {
   ....PPDDDDAA....
   ....PDDDDDDDA...
@@ -3352,7 +6677,26 @@ Z = (195, 195, 195)
   .....CLJACLJAAAA
   ...LLLLJ.LLLLKAA
 }
-# tile 175 (frost giant)
+# tile 350 (frost giant,male)
+{
+  .....KJJJJAA....
+  ....KJJJJJJJA...
+  ....JJLLLLJJA...
+  ....JEELLEEJA...
+  ....JLLLLLLJA...
+  ....AKJJJJJAAA..
+  .....KJAAJJAAAA.
+  ....KKJJJJAJAAAA
+  ...KJKJJJJAJJAAA
+  ..KJKKJJJJJKJJAA
+  ..KAAJKJJAJAAJAA
+  ..JAAJKKAKJAAJAA
+  ..LC.JJJJJKKCLAA
+  ..LL.CJJAJLJLLAA
+  .....CLJACLJAAAA
+  ...LLLLJ.CLLLKAA
+}
+# tile 351 (frost giant,female)
 {
   .....KJJJJAA....
   ....KJJJJJJJA...
@@ -3371,7 +6715,26 @@ Z = (195, 195, 195)
   .....CLJACLJAAAA
   ...LLLLJ.CLLLKAA
 }
-# tile 176 (ettin)
+# tile 352 (ettin,male)
+{
+  ....NN..ONOP....
+  ..NNOOPNNOOPP...
+  ..NPP..NPP..P...
+  ..ALPPLALPPLA...
+  ..APPPPAPPPPA...
+  ..APAAPAPAAPAA..
+  ..APPPPAPPPPAAA.
+  ..BIIIIJJJIIIBAA
+  .BPPPIIIIIIPPPBA
+  .PPPFPIIIIPFPPPA
+  .PPAAPIIIIPAAPPA
+  .PPAAIIIIIIAAPPA
+  .BPB.IIFFIIABPAA
+  ..PP.BPAABPAPPAA
+  .....BPAABPAAAAA
+  ...PPPPA.BPPPFAA
+}
+# tile 353 (ettin,female)
 {
   ....NN..ONOP....
   ..NNOOPNNOOPP...
@@ -3390,7 +6753,26 @@ Z = (195, 195, 195)
   .....BPAABPAAAAA
   ...PPPPA.BPPPFAA
 }
-# tile 177 (storm giant)
+# tile 354 (storm giant,male)
+{
+  ......JJJJAA....
+  ....JJJJJJJJA...
+  ....JJLLLLJJA...
+  ....JFFLLFFJA...
+  ....JLLLLLLJA...
+  ....ALLAALLAAH..
+  .....ALLLLJAHAA.
+  ...JJKJJJJJHHAA.
+  ..LJJCCKCKHHLAA.
+  ..JLKKKCKHHHHHH.
+  ..LAAKKCCKJAHHAA
+  ..LAAJJJKKJHHALA
+  ..LC.JJJJJKHAAAA
+  ..LL.CLJACHAAAAA
+  .....CLJACCJAAAA
+  ...LLLLJ.LLLLKAA
+}
+# tile 355 (storm giant,female)
 {
   ......JJJJAA....
   ....JJJJJJJJA...
@@ -3409,7 +6791,26 @@ Z = (195, 195, 195)
   .....CLJACCJAAAA
   ...LLLLJ.LLLLKAA
 }
-# tile 178 (titan)
+# tile 356 (titan,male)
+{
+  .....AAAAAAA....
+  ....AALLLLAAA...
+  ....A..LL..AA...
+  ....ALLLLLLAA...
+  ....ALLAALLAAA..
+  .....ALLLLJAAAA.
+  ..CCJJJJJJJJCCA.
+  .CLLLCCKCKCLLLCA
+  .LLLKJKCKCJKLLLA
+  .LLAAJJCCJJAALLA
+  .LLAAJJCCJJAALLA
+  .LLAAJJJKKJAALLA
+  .CLC.JJJJJKKCLAA
+  ..LL.CLJACLJLLAA
+  .....CLJACLJAAAA
+  ...LLLLJ.CLLLKAA
+}
+# tile 357 (titan,female)
 {
   .....AAAAAAA....
   ....AALLLLAAA...
@@ -3428,7 +6829,26 @@ Z = (195, 195, 195)
   .....CLJACLJAAAA
   ...LLLLJ.CLLLKAA
 }
-# tile 179 (minotaur)
+# tile 358 (minotaur,male)
+{
+  ................
+  .O..........O...
+  .OOOJJJJJJOOO...
+  ..OOJJKJJJOO....
+  ...JGAKJGAJA....
+  ...JJJKJJJJA....
+  ....JJKJJJAAA...
+  ....JKKKJAAAA...
+  ..CLJAJAKALCAA.A
+  .CLLJJJJJALLCAAA
+  .LLCLAAAALCLLAA.
+  .LAACLLLLCAALAA.
+  .LL.JJJJJJJLLAAA
+  .LL.JJJJJJJLLAAA
+  ....CLCACLCAAAAA
+  ..LLLLL.LLLLLAA.
+}
+# tile 359 (minotaur,female)
 {
   ................
   .O..........O...
@@ -3447,7 +6867,26 @@ Z = (195, 195, 195)
   ....CLCACLCAAAAA
   ..LLLLL.LLLLLAA.
 }
-# tile 180 (jabberwock)
+# tile 360 (jabberwock,male)
+{
+  ................
+  ...DP...........
+  ....DP.ADOO.....
+  ..DAIDADIPAD....
+  ...DIAPIPA......
+  ...DBDDDA.......
+  ..IBBDADDA..AA..
+  .DDDDAODDIAAAA..
+  ..OAOA.DDAIAAA..
+  ..IOAODDAAADDAA.
+  ..DDDADDDDAIDA..
+  ...AAADDIDIDDD..
+  ....IDDAIDDDDA..
+  ....IDAAIDAA....
+  ...IDAA..ID.....
+  ................
+}
+# tile 361 (jabberwock,female)
 {
   ................
   ...DP...........
@@ -3466,7 +6905,26 @@ Z = (195, 195, 195)
   ...IDAA..ID.....
   ................
 }
-# tile 181 (vorpal jabberwock)
+# tile 362 (vorpal jabberwock,male)
+{
+  ................
+  ...GP...........
+  ....GP.AGOO.....
+  ..GAFGAGFPAG....
+  ...GFAPFPA......
+  ...GHGGGA.......
+  ..FHHGAGGA..AA..
+  .GGGGAOGGFAAAA..
+  ..OAOA.GGAFAAA..
+  ..FOAOGGAAAGGAA.
+  ..GGGAGGGGAFGA..
+  ...AAAGGFGFGGG..
+  ....FGGAFGGGGA..
+  ....FGAAFGAA....
+  ...FGAA..FG.....
+  ................
+}
+# tile 363 (vorpal jabberwock,female)
 {
   ................
   ...GP...........
@@ -3485,7 +6943,7 @@ Z = (195, 195, 195)
   ...FGAA..FG.....
   ................
 }
-# tile 182 (Keystone Kop)
+# tile 364 (Keystone Kop,male)
 {
   ................
   ....AA..........
@@ -3504,17 +6962,74 @@ Z = (195, 195, 195)
   ..AA....AA......
   ................
 }
-# tile 183 (Kop Sergeant)
+# tile 365 (Keystone Kop,female)
 {
   ................
   ....AA..........
-  ...AOOA.........
-  ...AOOA...C.....
+  ...AAAA.........
+  ...AOAA...C.....
   ..AAAAAA..C.....
   ...LLLL...C.....
   ....LL....C.....
   ...AAAA.AAA.....
   ..AAAAAAAAC.P...
+  .AA.AAAAA.PPPP..
+  ..AAAAAA.PPPPPP.
+  ....AAAAPPPAPP..
+  .A.AAAAAAPAAA...
+  AAAAA.PAAAAA....
+  ..AA....AA......
+  ................
+}
+# tile 366 (Kop Sergeant,male)
+{
+  ................
+  ....AA..........
+  ...AOOA.........
+  ...AOOA...C.....
+  ..AAAAAA..C.....
+  ...LLLL...C.....
+  ....LL....C.....
+  ...AAAA.AAA.....
+  ..AAAAAAAAC.P...
+  .AA.AAAAA.CPPP..
+  ..AAAAAA.PPPPPP.
+  ....AAAAPPPAPP..
+  .A.AAAAAAPAAA...
+  AAAAA.PAAAAA....
+  ..AA....AA......
+  ................
+}
+# tile 367 (Kop Sergeant,female)
+{
+  ................
+  ....AA..........
+  ...AOOA.........
+  ...AOOA...C.....
+  ..AAAAAA..C.....
+  ...LLLL...C.....
+  ....LL....C.....
+  ...AAAA.AAA.....
+  ..AAAAAAAAC.P...
+  .AA.AAAAA.CPPP..
+  ..AAAAAA.PPPPPP.
+  ....AAAAPPPAPP..
+  .A.AAAAAAPAAA...
+  AAAAA.PAAAAA....
+  ..AA....AA......
+  ................
+}
+# tile 368 (Kop Lieutenant,male)
+{
+  ................
+  ....AA..........
+  ...AOOA...C.....
+  ...AOOA...C.....
+  ..AAAAAA..C.....
+  ...LLLL...C.....
+  ....LL....C.....
+  ..OAAAO.AAA.....
+  .OAAAAA.AAC.P...
   .AA.AAAAA.CPPP..
   ..AAAAAA.PPPPPP.
   ....AAAAPPPAPP..
@@ -3523,7 +7038,7 @@ Z = (195, 195, 195)
   ..AA....AA......
   ................
 }
-# tile 184 (Kop Lieutenant)
+# tile 369 (Kop Lieutenant,female)
 {
   ................
   ....AA..........
@@ -3542,7 +7057,26 @@ Z = (195, 195, 195)
   ..AA....AA......
   ................
 }
-# tile 185 (Kop Kaptain)
+# tile 370 (Kop Kaptain,male)
+{
+  ................
+  ....AA....C.....
+  ...AHHA...C.....
+  ...AHHA...C.....
+  ..AAAAAA..C.....
+  ...LLLL...C.....
+  ....LL....C.....
+  .HHAAAAHHAA.....
+  .AAAAHAAAACCC...
+  .AA.AHAAA.CPPP..
+  ..AAAHAA.PCPPPP.
+  ....AAAAPPPAPP..
+  .A.AAAAAAPAAA...
+  AAAAA.PAAAAA....
+  ..AA....AA......
+  ................
+}
+# tile 371 (Kop Kaptain,female)
 {
   ................
   ....AA....C.....
@@ -3561,7 +7095,26 @@ Z = (195, 195, 195)
   ..AA....AA......
   ................
 }
-# tile 186 (lich)
+# tile 372 (lich,male)
+{
+  ................
+  ................
+  ...OOO..........
+  ..AOAOO.........
+  ..OOOOO.........
+  ..OO.O..........
+  .....PPP........
+  ...OOPPP....AAA.
+  ..O.PPPPPA..AAA.
+  .O...PPPP.AAAAA.
+  ....O.PPPAAAA.A.
+  ......PPPAAA.A..
+  .....OPAP.A.....
+  ...OOOA.OA......
+  ......OOO.......
+  ................
+}
+# tile 373 (lich,female)
 {
   ................
   ................
@@ -3580,7 +7133,26 @@ Z = (195, 195, 195)
   ......OOO.......
   ................
 }
-# tile 187 (demilich)
+# tile 374 (demilich,male)
+{
+  ................
+  ................
+  ...OOO..........
+  ..AOAOO.........
+  ..OOOOO.........
+  ..OO.O..........
+  .....PPP........
+  ...OOPPP....AAA.
+  ..O.PPPPPA..AAA.
+  .O...PPPP.AAAAA.
+  ....L.PPPAAAA.A.
+  ......LPPAAA.A..
+  .....LLAL.A.....
+  ...LLLA.LA......
+  ......LLL.......
+  ................
+}
+# tile 375 (demilich,female)
 {
   ................
   ................
@@ -3599,7 +7171,26 @@ Z = (195, 195, 195)
   ......LLL.......
   ................
 }
-# tile 188 (master lich)
+# tile 376 (master lich,male)
+{
+  ...H............
+  ...HCH.H........
+  ...HHHCH........
+  ..AOAOHH........
+  ..OOOOO.........
+  ..OO.O..........
+  .....PPP........
+  ...PPPPP....AAA.
+  ..PPPPPPPA..AAA.
+  .O..PPPPP.AAAAA.
+  ....OPPPPAAAA.A.
+  ......PPPAAA.A..
+  .....OPAP.A.....
+  ...OOOA.OA......
+  ......OOO.......
+  ................
+}
+# tile 377 (master lich,female)
 {
   ...H............
   ...HCH.H........
@@ -3618,7 +7209,26 @@ Z = (195, 195, 195)
   ......OOO.......
   ................
 }
-# tile 189 (arch-lich)
+# tile 378 (arch-lich,male)
+{
+  ................
+  ................
+  ...OOO..........
+  ..DODOO.........
+  ..OOOOO.........
+  H.OO.O..........
+  A....PPP........
+  A..OOPPP....AAA.
+  .AO.PPPPPA..AAA.
+  .O...PPPP.AAAAA.
+  .A..O.PPPAAAA.A.
+  ..A...PPPAAA.A..
+  ..A..OPAP.A.....
+  ..AOOOA.OA......
+  ......OOO.......
+  ................
+}
+# tile 379 (arch-lich,female)
 {
   ................
   ................
@@ -3637,7 +7247,26 @@ Z = (195, 195, 195)
   ......OOO.......
   ................
 }
-# tile 190 (kobold mummy)
+# tile 380 (kobold mummy,male)
+{
+  ................
+  ................
+  ................
+  ...N...N........
+  ...NONONO.......
+  ...OAOAO.OP.....
+  ....ONN...A.....
+  ...ONODNA.AA....
+  ..OLONNONAAA.A..
+  ..NALONANAAAAA..
+  ..NAOLOAOAAAAA..
+  ....NOLAAAAAA...
+  ....NANAAAA.....
+  ...OOANOA.......
+  ................
+  ................
+}
+# tile 381 (kobold mummy,female)
 {
   ................
   ................
@@ -3656,7 +7285,26 @@ Z = (195, 195, 195)
   ................
   ................
 }
-# tile 191 (gnome mummy)
+# tile 382 (gnome mummy,male)
+{
+  ................
+  ................
+  ................
+  ................
+  ......G.........
+  .....GGFO.......
+  ....GGFFOOP.....
+  ....GDODF.......
+  .....ONO...AAA..
+  ...NONOONOAAAA..
+  ...OANLOAOAAAA..
+  ....NNOLOAAAA...
+  ....NOANDAA.....
+  ....NOAOO.A.....
+  ................
+  ................
+}
+# tile 383 (gnome mummy,female)
 {
   ................
   ................
@@ -3675,7 +7323,26 @@ Z = (195, 195, 195)
   ................
   ................
 }
-# tile 192 (orc mummy)
+# tile 384 (orc mummy,male)
+{
+  ................
+  ................
+  ................
+  .....OA.........
+  ....NOOP........
+  ....DODPOP......
+  ....OOOA........
+  ..OOOOOOOA.AA...
+  ..OOOOOOO.AAA...
+  ..OAOOOAACCC....
+  ..OAOOOCCAAA....
+  ....OCCOAAAAAA..
+  ...CCAOOAAAA....
+  ..OOOAOOOA......
+  ................
+  ................
+}
+# tile 385 (orc mummy,female)
 {
   ................
   ................
@@ -3694,7 +7361,26 @@ Z = (195, 195, 195)
   ................
   ................
 }
-# tile 193 (dwarf mummy)
+# tile 386 (dwarf mummy,male)
+{
+  ................
+  ................
+  ................
+  ................
+  ......B.........
+  .....BBEO.......
+  ....BBEEEOP.....
+  ....BDODE.......
+  .....ONO...AAA..
+  ...NONOONOAAAA..
+  ...OANLOAOAAAA..
+  ....NNOLOAAAA...
+  ....NOANDAA.....
+  ....NOAOO.A.....
+  ................
+  ................
+}
+# tile 387 (dwarf mummy,female)
 {
   ................
   ................
@@ -3713,7 +7399,26 @@ Z = (195, 195, 195)
   ................
   ................
 }
-# tile 194 (elf mummy)
+# tile 388 (elf mummy,male)
+{
+  ................
+  ................
+  .........O......
+  .......OOOP.....
+  ......OOOOP.....
+  ......OEOEAP....
+  ......OOOOA.....
+  ......AOOA....A.
+  ......OAAO..AAA.
+  .....OOOOOOAAAA.
+  ....OALOOLAOAAA.
+  ....OADOOOAOAA..
+  ......OOAOAA.A..
+  .....OOA.OOA....
+  ................
+  ................
+}
+# tile 389 (elf mummy,female)
 {
   ................
   ................
@@ -3732,7 +7437,26 @@ Z = (195, 195, 195)
   ................
   ................
 }
-# tile 195 (human mummy)
+# tile 390 (human mummy,male)
+{
+  ................
+  ................
+  ...ONNO.........
+  ...NNNNOP.......
+  ..PANAN.OPP.....
+  ..PNNNN.........
+  ..ONOONNP.......
+  .ONLNNOOO.......
+  .NJNOOOOO..AAA..
+  .OJOOOODN.AAAA..
+  .NJOLNOAOAAAAAA.
+  .OCNO.NKNAAAAA..
+  .N.OO.OLAAAAAAA.
+  ...OOAOOAAA.....
+  ..NNN.NNNA......
+  ................
+}
+# tile 391 (human mummy,female)
 {
   ................
   ................
@@ -3751,7 +7475,7 @@ Z = (195, 195, 195)
   ..NNN.NNNA......
   ................
 }
-# tile 196 (ettin mummy)
+# tile 392 (ettin mummy,male)
 {
   .....NN..ONOO...
   ...NNOOONNOOOO..
@@ -3770,12 +7494,50 @@ Z = (195, 195, 195)
   .....NOOANOOAAAA
   ...OOOOO.OOOOKAA
 }
-# tile 197 (giant mummy)
+# tile 393 (ettin mummy,female)
 {
-  ......ONOOAA....
-  ....ONNNOOOOA...
-  ....NNOOOOOOO...
-  ....NFFOOFFOOP..
+  .....NN..ONOO...
+  ...NNOOONNOOOO..
+  ...NOOOONOOOOOO.
+  ...OFOFOLOFOFO.O
+  ...OOOOOLOOOOO.P
+  ...NOOOOLNNOOOA.
+  ...ONOOOLOOOOAAA
+  ..OOOONNNNNNNOAA
+  .ONNNNNNOONOOOOA
+  .ONODNNOOOOOOOOA
+  .NNAAONNONOAAOOA
+  .NOAAONOONLAAOOA
+  .OOO.ONOONOOOOAA
+  ..OO.NNOANOLOOAA
+  .....NOOANOOAAAA
+  ...OOOOO.OOOOKAA
+}
+# tile 394 (giant mummy,male)
+{
+  ......ONOOAA....
+  ....ONNNOOOOA...
+  ....NNOOOOOOO...
+  ....NFFOOFFOOP..
+  ....NONOOOOOAOP.
+  ....AONOOOOAAAP.
+  .....ANOOODAAAA.
+  ..OOOONOOONNNOAA
+  .ONNNNNOOOOOOOOA
+  .ONODNNLOOOOOOOA
+  .NNAAONOLNOAAOOA
+  .NOAAONOONLAAOOA
+  .OOO.ONOONOOOOAA
+  ..OO.NNOANOLOOAA
+  .....NOOANOOAAAA
+  ...OOOOO.OOOOKAA
+}
+# tile 395 (giant mummy,female)
+{
+  ......ONOOAA....
+  ....ONNNOOOOA...
+  ....NNOOOOOOO...
+  ....NFFOOFFOOP..
   ....NONOOOOOAOP.
   ....AONOOOOAAAP.
   .....ANOOODAAAA.
@@ -3789,7 +7551,26 @@ Z = (195, 195, 195)
   .....NOOANOOAAAA
   ...OOOOO.OOOOKAA
 }
-# tile 198 (red naga hatchling)
+# tile 396 (red naga hatchling,male)
+{
+  ................
+  ................
+  ................
+  ................
+  ....K...........
+  ...KLK..........
+  ...LLLA.........
+  ...ALAA.........
+  ...LALA.........
+  ...LLLA.........
+  ...LLLAA........
+  ...LDLAA........
+  ...IDDAAAAADA...
+  ...IDDDAAADDA...
+  ....IIDDDDDA....
+  ................
+}
+# tile 397 (red naga hatchling,female)
 {
   ................
   ................
@@ -3808,7 +7589,26 @@ Z = (195, 195, 195)
   ....IIDDDDDA....
   ................
 }
-# tile 199 (black naga hatchling)
+# tile 398 (black naga hatchling,male)
+{
+  ................
+  ................
+  ................
+  ................
+  ....K...........
+  ...KLK..........
+  ...LLLA.........
+  ...ALAA.........
+  ...LALA.........
+  ...LLLA.........
+  ...LLLA.........
+  ...LALAA........
+  ...AAAPA..PAA...
+  ...AAAAPPPAAA...
+  ....AAAAAAAA....
+  ................
+}
+# tile 399 (black naga hatchling,female)
 {
   ................
   ................
@@ -3827,7 +7627,26 @@ Z = (195, 195, 195)
   ....AAAAAAAA....
   ................
 }
-# tile 200 (golden naga hatchling)
+# tile 400 (golden naga hatchling,male)
+{
+  ................
+  ................
+  ................
+  ................
+  ....K...........
+  ...KLK..........
+  ...LLLA.........
+  ...ALAA.........
+  ...LALA.........
+  ...LLLA.........
+  ...LLLAA........
+  ...LHLAA........
+  ...NHHAAAAAHA...
+  ...NHHHAAAHHA...
+  ....NNHHHHHA....
+  ................
+}
+# tile 401 (golden naga hatchling,female)
 {
   ................
   ................
@@ -3846,7 +7665,26 @@ Z = (195, 195, 195)
   ....NNHHHHHA....
   ................
 }
-# tile 201 (guardian naga hatchling)
+# tile 402 (guardian naga hatchling,male)
+{
+  ................
+  ................
+  ................
+  ................
+  ....K...........
+  ...KLK..........
+  ...LLLA.........
+  ...ALAA.........
+  ...LALA.........
+  ...LLLA.........
+  ...LLLAA........
+  ...LFLAA........
+  ...GFFAAAAAFA...
+  ...GFFFAAAFFA...
+  ....GGFFFFFA....
+  ................
+}
+# tile 403 (guardian naga hatchling,female)
 {
   ................
   ................
@@ -3865,7 +7703,26 @@ Z = (195, 195, 195)
   ....GGFFFFFA....
   ................
 }
-# tile 202 (red naga)
+# tile 404 (red naga,male)
+{
+  ................
+  ....KK..........
+  ...KLLK.........
+  ...LLLLA........
+  ...ALLAA........
+  ...LAALA........
+  ...LLLLA........
+  ...LLLDA..AA....
+  ...LDLDA.AAAA...
+  ...IDDDAAAIIA...
+  ...IDDDAIDDDIDA.
+  ...IDDDIDDDDDDDA
+  ...IDDDDDDAA.DDA
+  ....DDDDDA..DDA.
+  .....DDAA..DDA..
+  ..........DA....
+}
+# tile 405 (red naga,female)
 {
   ................
   ....KK..........
@@ -3884,7 +7741,26 @@ Z = (195, 195, 195)
   .....DDAA..DDA..
   ..........DA....
 }
-# tile 203 (black naga)
+# tile 406 (black naga,male)
+{
+  ................
+  ....KK..........
+  ...KLLK.........
+  ...LLLLA........
+  ...ALLAA........
+  ...LAALA........
+  ...LLLLA........
+  ...LLLAA........
+  ...LALAA..PPP...
+  ...AAAAPPPAAP...
+  ...AAAAPAAAAAAP.
+  ...AAAAAAAAAAAAP
+  ...AAAAAAAPP.AAP
+  ....AAAAAP..AAP.
+  .....AAPP..AAP..
+  ..........AP....
+}
+# tile 407 (black naga,female)
 {
   ................
   ....KK..........
@@ -3903,7 +7779,26 @@ Z = (195, 195, 195)
   .....AAPP..AAP..
   ..........AP....
 }
-# tile 204 (golden naga)
+# tile 408 (golden naga,male)
+{
+  ................
+  ....KK..........
+  ...KLLK.........
+  ...LLLLA........
+  ...ALLAA........
+  ...LAALA........
+  ...LLLLA........
+  ...LLLHA..AA....
+  ...LHLHA.AAAA...
+  ...NHHHAAANNA...
+  ...NHHHANHHHNHA.
+  ...NHHHNHHHHHHHA
+  ...NHHHHHHAA.HHA
+  ....HHHHHA..HHA.
+  .....HHAA..HHA..
+  ..........HA....
+}
+# tile 409 (golden naga,female)
 {
   ................
   ....KK..........
@@ -3922,7 +7817,26 @@ Z = (195, 195, 195)
   .....HHAA..HHA..
   ..........HA....
 }
-# tile 205 (guardian naga)
+# tile 410 (guardian naga,male)
+{
+  ................
+  ....KK..........
+  ...KLLK.........
+  ...LLLLA........
+  ...ALLAA........
+  ..CLAALC........
+  ..LLLLLL........
+  ..CLLCLC..AA....
+  ...CLLCA.AAAA...
+  ...GLFCAAAGGA...
+  ...GFFFAAFFFGFA.
+  ...GFFFGFFFFFFFA
+  ...GFFFFFFAA.FFA
+  ....FFFFFA..FFA.
+  .....FFAA..FFA..
+  ..........FA....
+}
+# tile 411 (guardian naga,female)
 {
   ................
   ....KK..........
@@ -3941,7 +7855,26 @@ Z = (195, 195, 195)
   .....FFAA..FFA..
   ..........FA....
 }
-# tile 206 (ogre)
+# tile 412 (ogre,male)
+{
+  ................
+  ................
+  ....CLLLC.......
+  ..LCKKLKKCL.....
+  ...LAALAALJA....
+  ...CLLLLLCJA....
+  ....CAAACJAAA...
+  ....LDDDLAAAA...
+  ..CLJLLLKALCAA.A
+  .CLLAJJJJALLCAAA
+  .LLCLAAAALCLLAA.
+  .LAACLLLLCAALAA.
+  .LC.HHHBHHACLAAA
+  .LL.JJJJJJALLAAA
+  ....CJJJCLAAAAAA
+  ..LLLLL.LLLLLAA.
+}
+# tile 413 (ogre,female)
 {
   ................
   ................
@@ -3960,7 +7893,26 @@ Z = (195, 195, 195)
   ....CJJJCLAAAAAA
   ..LLLLL.LLLLLAA.
 }
-# tile 207 (ogre lord)
+# tile 414 (ogre leader,male)
+{
+  ................
+  ................
+  ....CLLLC.......
+  ..LCKKLKKCL.....
+  ...LAALAALJA....
+  ...CLLLLLCJA....
+  ....CLLLCJAAA...
+  ....LAAALAAAA...
+  ..JKJLLLKAKJAA.A
+  .CLKAJJJJAKLCAAA
+  .LLJKAAAAKJLLAA.
+  .LAAJKKKKJAALAA.
+  .LC.HHHBHHACLAAA
+  .LL.JJJJJJALLAAA
+  ....CJJJCLAAAAAA
+  ..LLLLL.LLLLLAA.
+}
+# tile 415 (ogre leader,female)
 {
   ................
   ................
@@ -3979,7 +7931,26 @@ Z = (195, 195, 195)
   ....CJJJCLAAAAAA
   ..LLLLL.LLLLLAA.
 }
-# tile 208 (ogre king)
+# tile 416 (ogre tyrant,male)
+{
+  ...H..C..H......
+  ...HDCHCDH......
+  ...HHHHHHH......
+  ..LCKKLKKCL.....
+  ...LAALAALJA....
+  ...CLLLLLCJA....
+  ....CLLLCJAAA...
+  ....LAAALAAAA...
+  ..JKJLLLKAKJAA.A
+  .CJKAJJJJAKJCAAA
+  .LJJKAAAAKJJLAA.
+  .LAAJKKKKJAALAA.
+  .LC.HHHBHHACLAAA
+  .LL.JJJJJJALLAAA
+  ....CJJJCLAAAAAA
+  ..LLLLL.LLLLLAA.
+}
+# tile 417 (ogre tyrant,female)
 {
   ...H..C..H......
   ...HDCHCDH......
@@ -3998,7 +7969,26 @@ Z = (195, 195, 195)
   ....CJJJCLAAAAAA
   ..LLLLL.LLLLLAA.
 }
-# tile 209 (gray ooze)
+# tile 418 (gray ooze,male)
+{
+  ................
+  ................
+  ................
+  .....PBPA.......
+  ...PBBBPBA......
+  ..BBNNBPPBAA....
+  .BBNNPPPBBPAAA..
+  PBBBPPPBPBBAAA..
+  BBBPBPPPPPBPAAA.
+  BBPBPPPPPPPBAAA.
+  PBPPBPPPBBPPAAA.
+  .PBBPPPBAAPPPAA.
+  ...PBBBAAAKPPJ..
+  ........ACPPAK..
+  .........KCCCJ..
+  ................
+}
+# tile 419 (gray ooze,female)
 {
   ................
   ................
@@ -4017,7 +8007,7 @@ Z = (195, 195, 195)
   .........KCCCJ..
   ................
 }
-# tile 210 (brown pudding)
+# tile 420 (brown pudding,male)
 {
   ................
   ................
@@ -4036,7 +8026,45 @@ Z = (195, 195, 195)
   ................
   ................
 }
-# tile 211 (green slime)
+# tile 421 (brown pudding,female)
+{
+  ................
+  ................
+  ................
+  ................
+  ............J...
+  ....JKKJJJ..JJ..
+  ...KKKCJJJJJ....
+  ..KKNNJNNJJJ....
+  ..KJANJANJJJA...
+  ..KKJJJJJCJJAA..
+  ..JKJJCJJJJJAA..
+  ...JJJJJJJJAAA..
+  ....JJJJJJAAA...
+  .....AAAAAAA....
+  ................
+  ................
+}
+# tile 422 (green slime,male)
+{
+  ................
+  ................
+  ................
+  ................
+  ................
+  ................
+  ............G...
+  .....G......G..G
+  .G....G..G.NGN.G
+  ..NG.NGGNGGGGGGG
+  ..GGNGGNGGGFGGF.
+  GGNGGGGGGGGGFF.G
+  .NGGGGGFGFG.....
+  NGGGGFGGFG.G..GF
+  NGGFGGF..GF.....
+  ..GGF..GGF..G...
+}
+# tile 423 (green slime,female)
 {
   ................
   ................
@@ -4055,7 +8083,26 @@ Z = (195, 195, 195)
   NGGFGGF..GF.....
   ..GGF..GGF..G...
 }
-# tile 212 (black pudding)
+# tile 424 (black pudding,male)
+{
+  ........A.......
+  ........AA......
+  .....AAA........
+  ....AAAAA.......
+  ....CACAA.......
+  ....DADAA.......
+  ....AAAAA.......
+  ....AAAAA.......
+  ....AAAAA.......
+  .....AAAAA......
+  .....AAAAA......
+  ......AAAAA.....
+  ......AAAAAA....
+  .......AAAAAA.A.
+  ........AAAAAAAA
+  ..........AAAA..
+}
+# tile 425 (black pudding,female)
 {
   ........A.......
   ........AA......
@@ -4074,7 +8121,26 @@ Z = (195, 195, 195)
   ........AAAAAAAA
   ..........AAAA..
 }
-# tile 213 (quantum mechanic)
+# tile 426 (quantum mechanic,male)
+{
+  ................
+  ......LLLL......
+  ...FGGCLCGGF....
+  ...GNNGLGNNGL...
+  B.BGANGGGANGL...
+  B.BFGGCLCGGFL...
+  BIB..CLLLCCL....
+  BILN.LLAALLAAAA.
+  BILNN.LLLLJAAAA.
+  BIB.NNJJJJNAAA..
+  BIB.BNNNONNNAA..
+  .B...NNNONNLAA..
+  .....NBEBENA.A..
+  .....NBEBENN....
+  ....NAAEBAANN...
+  ................
+}
+# tile 427 (quantum mechanic,female)
 {
   ................
   ......LLLL......
@@ -4093,7 +8159,26 @@ Z = (195, 195, 195)
   ....NAAEBAANN...
   ................
 }
-# tile 214 (genetic engineer)
+# tile 428 (genetic engineer,male)
+{
+  ................
+  ......LLLL......
+  ...LAALLLAAL....
+  ...LNNLLLNNLL...
+  ...LANLLLANLL...
+  ...LLLLLLLLLL...
+  .....CLLLCCL....
+  ..LN.LLAALL.....
+  ..LNN.LLLLJ.....
+  ..A.NNLLLLN.....
+  .A.ABNNNONNN....
+  .AA..NNNONNL....
+  .A.A.NPEPENA....
+  .AA..NPEPENN....
+  ..AANAAEPAANN...
+  ................
+}
+# tile 429 (genetic engineer,female)
 {
   ................
   ......LLLL......
@@ -4112,7 +8197,26 @@ Z = (195, 195, 195)
   ..AANAAEPAANN...
   ................
 }
-# tile 215 (rust monster)
+# tile 430 (rust monster,male)
+{
+  ................
+  ....EEEE........
+  ...EEHEHE.......
+  ...EEEAEE.......
+  ...EEPAPE.......
+  ...EPEAEP...E...
+  ....EEEE.AAEE...
+  ....EEEEEAAEEE..
+  ...EEEEEEEAEAEE.
+  ..EEEEEEAAAAE...
+  ..EEAEEEEAEEEA..
+  ..AAEEEEEEEEEAA.
+  ....AEEEEEEEAAA.
+  .....EEEEEAA..A.
+  ......AAAA......
+  ................
+}
+# tile 431 (rust monster,female)
 {
   ................
   ....EEEE........
@@ -4131,7 +8235,26 @@ Z = (195, 195, 195)
   ......AAAA......
   ................
 }
-# tile 216 (disenchanter)
+# tile 432 (disenchanter,male)
+{
+  ................
+  ....PPPP........
+  ...PPDPDP.......
+  ...PPPAPP.......
+  ...PPOAOP.......
+  ...POPAPO...P...
+  ....PPPP.AAPP...
+  ....PPPPPAAPPP..
+  ...PPPPPPPAPAPP.
+  ..PPPPPPAAAAP...
+  ..PPAPPPPAPPPA..
+  ..AAPPPPPPPPPAA.
+  ....APPPPPPPAAA.
+  .....PPPPPAA..A.
+  ......AAAA......
+  ................
+}
+# tile 433 (disenchanter,female)
 {
   ................
   ....PPPP........
@@ -4150,7 +8273,26 @@ Z = (195, 195, 195)
   ......AAAA......
   ................
 }
-# tile 217 (garter snake)
+# tile 434 (garter snake,male)
+{
+  ................
+  ................
+  ................
+  ....KKA.........
+  ...NAOKA........
+  ...KKAKA........
+  ...KKAKA....KA..
+  ....APKAP..KAPP.
+  .....PKAPP.KAP..
+  .....KAAP..KAP..
+  ....KAAP..KAAP..
+  ....KAAPPKAAP...
+  ....KAAKKAAP....
+  .....KAAAAP.....
+  ................
+  ................
+}
+# tile 435 (garter snake,female)
 {
   ................
   ................
@@ -4169,7 +8311,26 @@ Z = (195, 195, 195)
   ................
   ................
 }
-# tile 218 (snake)
+# tile 436 (snake,male)
+{
+  ................
+  ................
+  ................
+  ....KKA.........
+  ...NAOJA........
+  ...KKJAJ........
+  ...KKAAJ....KK..
+  ...FAAKJ...KJAA.
+  ..FAFAKJAA.KJA..
+  .....KJAA..KJA..
+  ....KJAA..KJJA..
+  ....KJAAAKJJA...
+  ....KJJJJJJA....
+  .....KJJJJA.....
+  ................
+  ................
+}
+# tile 437 (snake,female)
 {
   ................
   ................
@@ -4188,7 +8349,26 @@ Z = (195, 195, 195)
   ................
   ................
 }
-# tile 219 (water moccasin)
+# tile 438 (water moccasin,male)
+{
+  ................
+  ................
+  ................
+  ....AAA.........
+  ...AAAAA...AA...
+  ...OAOAAA.AA....
+  ...AAA.AA.AA....
+  ...DA..AA.AA....
+  ..D.D.AAA..AA...
+  .....AAA...AA...
+  .....AAA...AA...
+  ....AAA...AAA...
+  ....AAAAAAAA....
+  ....AAAAAAA.....
+  .....AAAAA......
+  ................
+}
+# tile 439 (water moccasin,female)
 {
   ................
   ................
@@ -4207,7 +8387,26 @@ Z = (195, 195, 195)
   .....AAAAA......
   ................
 }
-# tile 220 (python)
+# tile 440 (python,male)
+{
+  ................
+  ................
+  ................
+  ...KKKA.....JJ..
+  ...GAGJA...JJJ..
+  ..JKKJAJ..KJJ...
+  ..KKKAJJ..KJJ.AA
+  ..KKAAKJA.KKJAA.
+  .....AKJAA.KJAA.
+  ....JKJAA..KJJA.
+  ...JJJAA..KJJJA.
+  ...JJJAAAKJJJA..
+  ...JJJJJJJJJAA..
+  ....JJJJJJJAA...
+  .....JJJJJAA....
+  ................
+}
+# tile 441 (python,female)
 {
   ................
   ................
@@ -4226,7 +8425,26 @@ Z = (195, 195, 195)
   .....JJJJJAA....
   ................
 }
-# tile 221 (pit viper)
+# tile 442 (pit viper,male)
+{
+  ................
+  ................
+  ................
+  ....AAA.........
+  ...AAAAA...AAA..
+  ...OAAAAA.AA.AA.
+  ...AA..AA.AA.AA.
+  ...D...AA.AA..A.
+  ......AAA..AA.A.
+  ......AA...AA...
+  .....AAA...AA...
+  .....AA...AAA...
+  .....AA..AAA....
+  .....AAAAAA.....
+  ......AAAA......
+  ................
+}
+# tile 443 (pit viper,female)
 {
   ................
   ................
@@ -4245,7 +8463,26 @@ Z = (195, 195, 195)
   ......AAAA......
   ................
 }
-# tile 222 (cobra)
+# tile 444 (cobra,male)
+{
+  ................
+  ................
+  ................
+  ....AAA.........
+  ...AAAAAA.......
+  ..PA..AAAA......
+  ..A..AAAAA..AA..
+  ..D..AAAAA....A.
+  ......AAA.....A.
+  ......AA..AAAA..
+  .....AA..AA.....
+  ....AA...AA.....
+  ....AA....AAAA..
+  ....AAA......AA.
+  .....AAAAAAAAA..
+  ................
+}
+# tile 445 (cobra,female)
 {
   ................
   ................
@@ -4264,7 +8501,26 @@ Z = (195, 195, 195)
   .....AAAAAAAAA..
   ................
 }
-# tile 223 (troll)
+# tile 446 (troll,male)
+{
+  ................
+  ..AAAAAA........
+  AAAANANA........
+  .AAKKKJJA.......
+  AAAKAAAKA.......
+  AKAKAAAKAA......
+  KJJAKKKAJKA.....
+  KJAJAAAJJJA.....
+  KJAJKKJJKJA.....
+  .KJJAFGFJJAAAA..
+  ..KJA.PFJAAAA...
+  ...AFAGFAAAAAA..
+  ...GFAGP.AA.AA..
+  ..KJJAKJAA.AA...
+  ..KJA..KA.......
+  ................
+}
+# tile 447 (troll,female)
 {
   ................
   ..AAAAAA........
@@ -4283,7 +8539,7 @@ Z = (195, 195, 195)
   ..KJA..KA.......
   ................
 }
-# tile 224 (ice troll)
+# tile 448 (ice troll,male)
 {
   ................
   ..OONOOO........
@@ -4302,13 +8558,51 @@ Z = (195, 195, 195)
   ..KJA..KA.......
   ................
 }
-# tile 225 (rock troll)
+# tile 449 (ice troll,female)
 {
   ................
-  ...AAAAA........
-  .AAANANAAAA.....
-  .AAKKKJJAA......
-  AAAKAAAKAAAA....
+  ..OONOOO........
+  NONOAOAOO.......
+  .NOKKKJJO.......
+  NOJKAAAKOO......
+  OKJKAAAKAO......
+  KJJAKKKAJKA.....
+  KJAJAAAJJJA.....
+  KJAJKKJJKJA.....
+  .KJJAEBEJJAAAA..
+  ..KJA.PEJAAAA...
+  ...AEABEAAAAAA..
+  ...BEABP.AA.AA..
+  ..KJJAKJAA.AA...
+  ..KJA..KA.......
+  ................
+}
+# tile 450 (rock troll,male)
+{
+  ................
+  ...AAAAA........
+  .AAANANAAAA.....
+  .AAKKKJJAA......
+  AAAKAAAKAAAA....
+  AKAKAAAKAAA.....
+  KJJAKKKAJKAA....
+  KJAJAAAJJJA.....
+  KJAPAKJJKJA.....
+  PKJPPAGFJJAAAA..
+  PPPPPAFFJAAAA...
+  .PPPAAGFAAAAAA..
+  ...AFAGF.AA.AA..
+  ..KJJAKJAA.AA...
+  ..KJA..KA.......
+  ................
+}
+# tile 451 (rock troll,female)
+{
+  ................
+  ...AAAAA........
+  .AAANANAAAA.....
+  .AAKKKJJAA......
+  AAAKAAAKAAAA....
   AKAKAAAKAAA.....
   KJJAKKKAJKAA....
   KJAJAAAJJJA.....
@@ -4321,7 +8615,26 @@ Z = (195, 195, 195)
   ..KJA..KA.......
   ................
 }
-# tile 226 (water troll)
+# tile 452 (water troll,male)
+{
+  ................
+  ...AAAAA........
+  ..AANANAA.......
+  .AAKKKJJAA......
+  .AAKAAAKAA......
+  .KAKAAAKAA......
+  KJJAKKKAJKA.....
+  KJAJAAAJJJA.....
+  KJAJKKJJKJA.....
+  .KJJAEBEJJAAAA..
+  ..KJA.PEJAAAA...
+  ...AEABEAAAAAA..
+  ...BEABP.AA.AA..
+  ..KJJAKJAA.AA...
+  ..KJA..KA.......
+  ................
+}
+# tile 453 (water troll,female)
 {
   ................
   ...AAAAA........
@@ -4340,7 +8653,26 @@ Z = (195, 195, 195)
   ..KJA..KA.......
   ................
 }
-# tile 227 (Olog-hai)
+# tile 454 (Olog-hai,male)
+{
+  ...PPPPP........
+  ..PPAAAPP.......
+  ..PANANAP.......
+  ..PAAAAAP.......
+  .PPAAAAAPP......
+  PPPAAAAAPPP.....
+  AAPPAAAPPAA.....
+  AAAPPPPPAAA.....
+  AAAPPPPPAAA.....
+  .AAAAPPPAAAPPP..
+  PONNNNNNAACPP...
+  ...APAPPAPPPPP..
+  ...PPAPP.PP.PP..
+  ..AAAAAAAP.PP...
+  ..AAA.AAA.......
+  ................
+}
+# tile 455 (Olog-hai,female)
 {
   ...PPPPP........
   ..PPAAAPP.......
@@ -4359,7 +8691,26 @@ Z = (195, 195, 195)
   ..AAA.AAA.......
   ................
 }
-# tile 228 (umber hulk)
+# tile 456 (umber hulk,male)
+{
+  ................
+  ...AAAAA........
+  ..AAAAAAA.......
+  .ADADADADA......
+  .AAAAAAAAA.A....
+  .AAAOAOAAA.AA...
+  .A.AOAOA.AAA....
+  .A.AAAAAPAA.....
+  .AAAAAAAP.......
+  .A.AAAAA.PPPPPP.
+  ...AA.AA.PPPPP..
+  ...AA.AAPPPPPPP.
+  ...AAPAAPPPP....
+  ..AAAPAAAPP.....
+  .AAAP..AAP......
+  ................
+}
+# tile 457 (umber hulk,female)
 {
   ................
   ...AAAAA........
@@ -4378,7 +8729,26 @@ Z = (195, 195, 195)
   .AAAP..AAP......
   ................
 }
-# tile 229 (vampire)
+# tile 458 (vampire,male)
+{
+  ................
+  ................
+  .....AAA........
+  ....AAOAA.......
+  .ADDAGAGADA.....
+  ..ADALLOAD......
+  .AAAAAAAAA......
+  ..AAAAAAAA......
+  ...AAAAAAA......
+  ..ADAAAAAAPPPPP.
+  ..ADDAAAAAPPPP..
+  ..AAAAAAAAPPP...
+  .....AAPAAPP....
+  ....AAP..AP.....
+  ................
+  ................
+}
+# tile 459 (vampire,female)
 {
   ................
   ................
@@ -4397,7 +8767,26 @@ Z = (195, 195, 195)
   ................
   ................
 }
-# tile 230 (vampire lord)
+# tile 460 (vampire leader,male)
+{
+  ................
+  .....AAAA.......
+  .N..AAOOAA......
+  .NDDAGAAGADA....
+  .NADALLLOAD.....
+  AAAAAAAAAAA.....
+  AAAAAAAAAAA.....
+  .AAAAAAAAAA.....
+  .NAAAAAAAAA.....
+  .N.AAAAAAAAPPPPP
+  .NADAAAAAAAPPPPP
+  .NADDAAAAAAPPPP.
+  .NAAAAAAAAAPPP..
+  .N...AAAPAAPP...
+  .N..AAPP..AP....
+  ................
+}
+# tile 461 (vampire leader,female)
 {
   ................
   .....AAAA.......
@@ -4416,7 +8805,26 @@ Z = (195, 195, 195)
   .N..AAPP..AP....
   ................
 }
-# tile 231 (vampire mage)
+# tile 462 (vampire mage,male)
+{
+  ................
+  ................
+  .....AAA........
+  ....AAOAA.......
+  .ADDAGAGADA.....
+  ..ADALLOAD......
+  .AAAA.A.AA......
+  ..AAAACAAA......
+  ...AAADAAA......
+  ..ADAAAAAAPPPPP.
+  ..ADDAAAAAPPPP..
+  ..AAAAAAAAPPP...
+  .....AAPAAPP....
+  ....AAP..AP.....
+  ................
+  ................
+}
+# tile 463 (vampire mage,female)
 {
   ................
   ................
@@ -4435,7 +8843,26 @@ Z = (195, 195, 195)
   ................
   ................
 }
-# tile 232 (Vlad the Impaler)
+# tile 464 (Vlad the Impaler,male)
+{
+  ................
+  ..N..AAAA.......
+  ADNDAAOOAADDDA..
+  .ANDAGAAGADDA...
+  ..NDALLLOADA....
+  ..NAAAAAAAAAAAAA
+  .HHHDAAAAADDDDDA
+  HEHEHJAAAADDDAA.
+  LLLLLJAAAADDAAPP
+  .LLLJAAAAADDAPPP
+  ..NJDAAAAADAPPPP
+  .ANDDAAAAAAAPPPP
+  .ANAAAAAAAAPPPP.
+  ..N..AAAPAAPPP..
+  ..N.AAPP..AP....
+  ................
+}
+# tile 465 (Vlad the Impaler,female)
 {
   ................
   ..N..AAAA.......
@@ -4454,7 +8881,26 @@ Z = (195, 195, 195)
   ..N.AAPP..AP....
   ................
 }
-# tile 233 (barrow wight)
+# tile 466 (barrow wight,male)
+{
+  ................
+  ................
+  ...LLO..........
+  ..DLDLO.........
+  ..LLLLO.........
+  ..LJL..P........
+  ..OOO.PP...AAAA.
+  ..POO.PP.AAAAAA.
+  .LPOO.PP.PAAAA..
+  .JJOO.PP.PAAAA..
+  .J.O..PL.PPAAA..
+  .J.O.PPPPPPAAA..
+  .J...PPPPPPPAA..
+  .J..LLPPPPPPA...
+  .J.....LLAA.....
+  ................
+}
+# tile 467 (barrow wight,female)
 {
   ................
   ................
@@ -4473,7 +8919,26 @@ Z = (195, 195, 195)
   .J.....LLAA.....
   ................
 }
-# tile 234 (wraith)
+# tile 468 (wraith,male)
+{
+  ................
+  ................
+  ...PPPPP........
+  ...PAAPPP.......
+  ....PAAPP.......
+  ....PAAPP.......
+  ..PP.PPP.P......
+  .OLAPPP.PP......
+  ..AAPPPPAP..AAA.
+  ..PPPPPOLPAAAAA.
+  ...A.PPAAAAPPA..
+  .....PPAPPPPA...
+  ......PPPPA.....
+  ................
+  ................
+  ................
+}
+# tile 469 (wraith,female)
 {
   ................
   ................
@@ -4492,7 +8957,26 @@ Z = (195, 195, 195)
   ................
   ................
 }
-# tile 235 (Nazgul)
+# tile 470 (Nazgul,male)
+{
+  ................
+  ................
+  ...PPPPP........
+  ...PAAPPP.......
+  ....PAAPP.......
+  ....PAAPP.......
+  ..PP.PPP.P......
+  .OLAPPP.PP......
+  .OPAPPPPAP..AAA.
+  ..PAPPPPAP..AAA.
+  ..PA.PPPLP..AAA.
+  ..PP.PPOLPAAAAA.
+  ...AAPPOAAAPPA..
+  .....PPAPPPPA...
+  ......PPPPA.....
+  ................
+}
+# tile 471 (Nazgul,female)
 {
   ................
   ................
@@ -4511,7 +8995,26 @@ Z = (195, 195, 195)
   ......PPPPA.....
   ................
 }
-# tile 236 (xorn)
+# tile 472 (xorn,male)
+{
+  ................
+  ................
+  ................
+  ...OB.OP.BP.....
+  ...BBBBPPPP.....
+  ...B............
+  ...DDBB.BDDA.A..
+  ...DDBB.PDDAAAA.
+  ...B.......AAAA.
+  ...BOB.BPP.AAAA.
+  ...BBB.PPP.AAAA.
+  ...B.......AAA..
+  ...BOBBPPBPAA...
+  ...BO.BP.PPA....
+  ................
+  ................
+}
+# tile 473 (xorn,female)
 {
   ................
   ................
@@ -4530,7 +9033,26 @@ Z = (195, 195, 195)
   ................
   ................
 }
-# tile 237 (monkey)
+# tile 474 (monkey,male)
+{
+  ................
+  ................
+  ................
+  ................
+  ................
+  .......KKA......
+  ......KLLJA.....
+  ......KLLJA.....
+  .......KJA......
+  .....KKKKKJAA...
+  ....KJKLLJJJAA..
+  ....LAKLLJALAA..
+  ......KJJJAAAA..
+  ......JAAJAAA...
+  .....JJA.JJA....
+  ................
+}
+# tile 475 (monkey,female)
 {
   ................
   ................
@@ -4549,7 +9071,7 @@ Z = (195, 195, 195)
   .....JJA.JJA....
   ................
 }
-# tile 238 (ape)
+# tile 476 (ape,male)
 {
   ................
   ................
@@ -4568,7 +9090,45 @@ Z = (195, 195, 195)
   ................
   ................
 }
-# tile 239 (owlbear)
+# tile 477 (ape,female)
+{
+  ................
+  ................
+  ......KKKJ......
+  .....JJJJJJ.....
+  ....KCELECJJ.AA.
+  ....KLLLLCAJAAAA
+  ...KKCLACCAJJAAA
+  ..KKKKCCCAJKJJAA
+  ..KKAKJAAJJAJJAA
+  ..KAAKJJJJJAAJAA
+  ..LC.KJJJJJKCLAA
+  ..LL.CJJAKLJLLAA
+  .....CLJACLJAAAA
+  ...LLLLJACLLLKA.
+  ................
+  ................
+}
+# tile 478 (owlbear,male)
+{
+  ................
+  ....K.....K.....
+  ....CK...KK.....
+  ....CKKKKKK.....
+  ...KOOOKOOOK....
+  ...KOOOKOOOKA..A
+  ...KOOAJAOOKAAAA
+  ..CKCJJHJJKAKAAA
+  .CKKKCKLKKAJJKAA
+  .KJJJJCKKJJJJJAA
+  .KJJJPAKJPJJJJAA
+  ..KJJJAKJJJJJAAA
+  ...JJPAKJPJJAAA.
+  ...JAAJAJAAJAA..
+  ...PJPJAJPJPA...
+  ................
+}
+# tile 479 (owlbear,female)
 {
   ................
   ....K.....K.....
@@ -4587,7 +9147,26 @@ Z = (195, 195, 195)
   ...PJPJAJPJPA...
   ................
 }
-# tile 240 (yeti)
+# tile 480 (yeti,male)
+{
+  ................
+  ....BNNN........
+  ...BNANAP.......
+  ..BNNNNNNP......
+  ..NNNADANN......
+  ..NNNNNNPN......
+  ..N.NNBPPNP.....
+  ..N.NNNNANP..AA.
+  ..NNBNNNPN.AAAA.
+  ....NNNNP.KAAA..
+  ....NN.NPAKKAA..
+  ....NB.NPAACKAA.
+  ....NNANPAAKKJA.
+  ...BNNANNPAACKA.
+  ..BNNA..NNA.....
+  ................
+}
+# tile 481 (yeti,female)
 {
   ................
   ....BNNN........
@@ -4606,7 +9185,26 @@ Z = (195, 195, 195)
   ..BNNA..NNA.....
   ................
 }
-# tile 241 (carnivorous ape)
+# tile 482 (carnivorous ape,male)
+{
+  ................
+  ................
+  ......KKKJ......
+  .....JJJJJJ.....
+  ....KCELECJJ.AA.
+  ....KLLLLCAJAAAA
+  ...KKCAAACAJJAAA
+  ..KKKCDDDCAKJJAA
+  ..KKAKCCCAJAJJAA
+  ..KAAKJAAJJAAJAA
+  ..LC.AJJJJJKCLAA
+  ..LLDDAJAKLJLLAA
+  ...DDALJACLJAAAA
+  ..DDALLJACLLLKA.
+  ................
+  ................
+}
+# tile 483 (carnivorous ape,female)
 {
   ................
   ................
@@ -4625,7 +9223,26 @@ Z = (195, 195, 195)
   ................
   ................
 }
-# tile 242 (sasquatch)
+# tile 484 (sasquatch,male)
+{
+  ................
+  ....CCCCC.......
+  ...CGAJGAJ......
+  ..CKKKKJJJ......
+  ..CKKAAAKJJ.....
+  .CKKKAAAKKJ.....
+  .CKJKKKKKKKJ....
+  .CKAJJJJJAKJ....
+  .CKAJKKKJAKJ.AA.
+  .CKJAJKJACKJAAAA
+  .CKJAJJJACKJAAA.
+  ..J.AJAKKAJAAAAA
+  ...CKJAKKJAAAAA.
+  .KCKJJACKJKJAA..
+  .CJJJKACKJJKA...
+  ................
+}
+# tile 485 (sasquatch,female)
 {
   ................
   ....CCCCC.......
@@ -4644,7 +9261,26 @@ Z = (195, 195, 195)
   .CJJJKACKJJKA...
   ................
 }
-# tile 243 (kobold zombie)
+# tile 486 (kobold zombie,male)
+{
+  ................
+  ................
+  ................
+  ...N...N........
+  ...NGFBN........
+  ...GABAB........
+  ....GBFA..A.....
+  ...GBABFA.AA....
+  ..GFBBBIKAAA.A..
+  ..BAFBFFEAAAAA..
+  ..BAFBFFAAAAAA..
+  ....FBFAAAAAA...
+  ....BABAAAA.....
+  ...BBABBA.......
+  ................
+  ................
+}
+# tile 487 (kobold zombie,female)
 {
   ................
   ................
@@ -4663,7 +9299,26 @@ Z = (195, 195, 195)
   ................
   ................
 }
-# tile 244 (gnome zombie)
+# tile 488 (gnome zombie,male)
+{
+  ................
+  ................
+  ................
+  ................
+  ......G.........
+  .....GFF........
+  ....GGFFF.......
+  ....GDFDF.......
+  .....PFP...AAA..
+  ...FGFPFEGAAAA..
+  ..GAAGFFFAGAAA..
+  ....AKNKFAAAA...
+  ....FGAFFAA.....
+  ....GFAFG.A.....
+  ................
+  ................
+}
+# tile 489 (gnome zombie,female)
 {
   ................
   ................
@@ -4682,7 +9337,26 @@ Z = (195, 195, 195)
   ................
   ................
 }
-# tile 245 (orc zombie)
+# tile 490 (orc zombie,male)
+{
+  ................
+  ................
+  ................
+  .....OA.........
+  ....NOPA........
+  ....GPGA........
+  .....PFA........
+  ..KCCAKKKA.AA...
+  .BBPCKJ.BBAAA...
+  BB.AGGFAABBA....
+  B..AJJPAAABA....
+  ....BAPPPAAAAA..
+  ...BJAAEPAAA....
+  ..BPPAAAPP......
+  ................
+  ................
+}
+# tile 491 (orc zombie,female)
 {
   ................
   ................
@@ -4701,7 +9375,26 @@ Z = (195, 195, 195)
   ................
   ................
 }
-# tile 246 (dwarf zombie)
+# tile 492 (dwarf zombie,male)
+{
+  ................
+  ................
+  ................
+  ................
+  ......B.........
+  .....BEE........
+  ....BBEEE.......
+  ....BFFFE.......
+  .....PFP...AAA..
+  ...BBPPPEEAAAA..
+  ..FBABPEAEAAAA..
+  ..F.EBBEFAAAA...
+  ....EBAEEAA.....
+  ....BEAEB.A.....
+  ................
+  ................
+}
+# tile 493 (dwarf zombie,female)
 {
   ................
   ................
@@ -4720,7 +9413,26 @@ Z = (195, 195, 195)
   ................
   ................
 }
-# tile 247 (elf zombie)
+# tile 494 (elf zombie,male)
+{
+  ................
+  ................
+  .........G......
+  .......GGF......
+  ......GGGGA.....
+  ......FEFEA.....
+  ......FFFFA.....
+  ......AFDA....A.
+  ......GAAG..AAA.
+  ....FFGGGFFFAAA.
+  ...FAAAGFAAAFAA.
+  .....AGGGFAAAA..
+  ......GFAFAA.A..
+  .....KDA.FKA....
+  ................
+  ................
+}
+# tile 495 (elf zombie,female)
 {
   ................
   ................
@@ -4739,7 +9451,26 @@ Z = (195, 195, 195)
   ................
   ................
 }
-# tile 248 (human zombie)
+# tile 496 (human zombie,male)
+{
+  ......AAA.......
+  .....FFGAA......
+  .....AGAFA......
+  .....FFGFA......
+  ....FKF..JJ.....
+  ....JJJFJKJ.....
+  ...FJ.KJJAKJ....
+  ..FK..KFJFFJ....
+  ..G...KKJG......
+  .....BP.BPAAAAA.
+  .....FPAPFAAAA..
+  .....BFABFAAAA..
+  .....PFABPAA....
+  .....BFABFA.....
+  ....GGAGGA......
+  ................
+}
+# tile 497 (human zombie,female)
 {
   ......AAA.......
   .....FFGAA......
@@ -4758,7 +9489,26 @@ Z = (195, 195, 195)
   ....GGAGGA......
   ................
 }
-# tile 249 (ettin zombie)
+# tile 498 (ettin zombie,male)
+{
+  ....NN..ONOP....
+  ..NNOOPNNOOPP...
+  ..NFF..NFF..P...
+  ..ADFFDADFFDA...
+  ..AFFFFAFFFFA...
+  ..AFAAFAFAAFAA..
+  ..AFFFFAFFFFAAA.
+  ..GIIIIJJJIIIGAA
+  .GFFFIIIIIIFFFGA
+  .GFFFFIIIIFFFFFA
+  .FFAAFIIIIFAAFFA
+  .FFAAIIIIIIAAFFA
+  .FFF.IIFFIIAGFAA
+  ..FF.GFAAGFAFFAA
+  .....GFAAGFAAAAA
+  ...FFFFA.GFFFFAA
+}
+# tile 499 (ettin zombie,female)
 {
   ....NN..ONOP....
   ..NNOOPNNOOPP...
@@ -4777,7 +9527,26 @@ Z = (195, 195, 195)
   .....GFAAGFAAAAA
   ...FFFFA.GFFFFAA
 }
-# tile 250 (ghoul)
+# tile 500 (ghoul,male)
+{
+  ......AAA.......
+  .....OOOAA......
+  .....DODOA......
+  .....OOOOA......
+  ....PPOOOPP.....
+  ....PPPPPPP.....
+  ...PP.PPPAPP....
+  ..PP..PPPOOP....
+  ..O...PPPO......
+  .....PP.PPAAAAA.
+  .....PPAPPAAAA..
+  .....PPAPPAAAA..
+  .....PPAPPAA....
+  .....PPAPPA.....
+  ....OOAOOA......
+  ................
+}
+# tile 501 (ghoul,female)
 {
   ......AAA.......
   .....OOOAA......
@@ -4796,7 +9565,26 @@ Z = (195, 195, 195)
   ....OOAOOA......
   ................
 }
-# tile 251 (giant zombie)
+# tile 502 (giant zombie,male)
+{
+  ......JJJJAA....
+  ....JJJJJJJJA...
+  ....JJFFFFJJA...
+  ....JDDFFDDJA...
+  ....JFFFFFFJA...
+  ....AFFAAFFAAA..
+  .....AFFFFJAAAA.
+  ..GGFFJJJJFFGGAA
+  .GFFFGGFFFFFFFCA
+  .FFFKFFFFFFKFFFA
+  FFFAAFFFFFFAAFFA
+  FFAA.JJJKKJAAFFA
+  FFA..JJJJJKAGFAA
+  .....GFAGFFAFFAA
+  ....GFFAGFFAAAAA
+  ...GFFAAGFFFAAAA
+}
+# tile 503 (giant zombie,female)
 {
   ......JJJJAA....
   ....JJJJJJJJA...
@@ -4815,7 +9603,7 @@ Z = (195, 195, 195)
   ....GFFAGFFAAAAA
   ...GFFAAGFFFAAAA
 }
-# tile 252 (skeleton)
+# tile 504 (skeleton,male)
 {
   ................
   ................
@@ -4834,12 +9622,50 @@ Z = (195, 195, 195)
   ......OOO.......
   ................
 }
-# tile 253 (straw golem)
+# tile 505 (skeleton,female)
 {
-  ......LJ........
-  ......LJHJ......
-  ....HJLJH...A...
-  ....AAAAAL.....A
+  ................
+  ................
+  ...OOO..........
+  ..AOAOO.........
+  ..OOOOO.........
+  ..OO.O..........
+  ......O.........
+  ....OOOOO...AAA.
+  ...OA.OOOA..AAA.
+  ..OA.OAAO.AAAAA.
+  ....OA.OOOAAA.A.
+  ......OOOAAA.A..
+  .....O.AO.A.....
+  ...OOOA.OA......
+  ......OOO.......
+  ................
+}
+# tile 506 (straw golem,male)
+{
+  ......LJ........
+  ......LJHJ......
+  ....HJLJH...A...
+  ....AAAAAL.....A
+  ....DAADAL.A.AA.
+  ....LJHJL..AAAA.
+  ....LLHJLHHCHHL.
+  ...HHLJL.AJLJL.A
+  .HHJJLLLLAAA.AA.
+  ..JL..LALHAAAAAA
+  .LL..CJLHJHAAAAA
+  .....HJLAHJHAAA.
+  .....HJAACALHAAA
+  ....CJLAAJHALHA.
+  ....HALA.AHAAL..
+  ..........L.....
+}
+# tile 507 (straw golem,female)
+{
+  ......LJ........
+  ......LJHJ......
+  ....HJLJH...A...
+  ....AAAAAL.....A
   ....DAADAL.A.AA.
   ....LJHJL..AAAA.
   ....LLHJLHHCHHL.
@@ -4853,7 +9679,26 @@ Z = (195, 195, 195)
   ....HALA.AHAAL..
   ..........L.....
 }
-# tile 254 (paper golem)
+# tile 508 (paper golem,male)
+{
+  ................
+  .......OA.......
+  .....NNNOA......
+  .....ONNNOA.....
+  ......ONNOA.....
+  .......NOA......
+  ..NNOA.NOA......
+  ..NONOAOAONNOA..
+  ..OAOANNOAOOOA..
+  ......NNNOAAAAA.
+  ......ONOAAAAAA.
+  .......OOAAAAAA.
+  .....NOAAOAAAAA.
+  .....NOA..NOAA..
+  ....OOA...OOA...
+  ................
+}
+# tile 509 (paper golem,female)
 {
   ................
   .......OA.......
@@ -4872,7 +9717,26 @@ Z = (195, 195, 195)
   ....OOA...OOA...
   ................
 }
-# tile 255 (rope golem)
+# tile 510 (rope golem,male)
+{
+  ................
+  ................
+  ......OOO.......
+  .....O...O......
+  .....O...O...AA.
+  .OO...O..O..A..A
+  O..O...LL..OO..A
+  ...O...LOOO.AOA.
+  ....OOOOOAAAAO..
+  .......OO..AA.A.
+  .......LO.AA...A
+  ......O..OOAA..A
+  ....OO..A..O.A..
+  ...O..AA...O.A..
+  ...O.A....OAA...
+  ....OA..........
+}
+# tile 511 (rope golem,female)
 {
   ................
   ................
@@ -4891,7 +9755,26 @@ Z = (195, 195, 195)
   ...O.A....OAA...
   ....OA..........
 }
-# tile 256 (gold golem)
+# tile 512 (gold golem,male)
+{
+  ................
+  ......HNH.......
+  ......DND...N...
+  ......HNH...JC..
+  ......HNH...NC..
+  ...HHHAAAAHANC..
+  ..HNJNHNHNJNAC.A
+  ..HHHHHHHHHHHA.A
+  .NCACCCCCCCCA..A
+  .HH.AAAAAAAAA.AA
+  .NH.ANC.AHNC.AAA
+  .NJ.AHC.AHHC.AAA
+  ..H.ANC.AHNC.AAA
+  ....HJC.AHJC.AA.
+  H...HNC.AHNC.A.H
+  ..H.............
+}
+# tile 513 (gold golem,female)
 {
   ................
   ......HNH.......
@@ -4910,7 +9793,26 @@ Z = (195, 195, 195)
   H...HNC.AHNC.A.H
   ..H.............
 }
-# tile 257 (leather golem)
+# tile 514 (leather golem,male)
+{
+  ......KKKK......
+  .....KHKHJ......
+  ....KAKKJJA.....
+  ...KKAJJJJAJ....
+  ..KKJJAJAAKJJ...
+  .KKKJJAAKKKJJJ..
+  ..KKJJJAKKJJJJ..
+  ...KKJJJA.AAA.A.
+  ....AAAA.KJAAAA.
+  ....KJAAAKKAAAAA
+  ...KJJAA.KJJAAA.
+  ...KKJA..KKJAAA.
+  ..KKJJJAKKJJJAA.
+  ..KKKJJAKKKJJA..
+  ...KJJA..KJJA...
+  ....KA....KA....
+}
+# tile 515 (leather golem,female)
 {
   ......KKKK......
   .....KHKHJ......
@@ -4929,7 +9831,26 @@ Z = (195, 195, 195)
   ...KJJA..KJJA...
   ....KA....KA....
 }
-# tile 258 (wood golem)
+# tile 516 (wood golem,male)
+{
+  ................
+  ......KCKJ......
+  ......HCHJ..C...
+  ......KCKJ..CK..
+  ......KCKJ..CKJ.
+  ...KKKAAAAKACKJ.
+  ..KCCCCCCCCCAKJA
+  ..KKKKKKKKKKKAJA
+  .CJAJJJJJJJJA..A
+  .CKJAAAAAAAAA.AA
+  .CKJACKJAKCKJAAA
+  .CKJACKJAKCKJAAA
+  ..KJACKJAKCKJAAA
+  ....KCKJAKCKJAA.
+  ....KCKJAKCKJA..
+  ................
+}
+# tile 517 (wood golem,female)
 {
   ................
   ......KCKJ......
@@ -4948,7 +9869,26 @@ Z = (195, 195, 195)
   ....KCKJAKCKJA..
   ................
 }
-# tile 259 (flesh golem)
+# tile 518 (flesh golem,male)
+{
+  ................
+  ................
+  ...D..DDC.......
+  .....DLDDL......
+  ..DD..LLLLC.D...
+  ...CDL.LLLLADL..
+  ..CLDLA.CLLA.LL.
+  ..LLLAA.LLCA..L.
+  .CLLAA.CLLAA..CA
+  .LLA..CLLALLAAAA
+  ..LA.CLCAALCAAAA
+  ...A..LLCACLCAAA
+  ....LLALLAALLAAA
+  ..CLLLAAAADLLA..
+  ..LLDDD..DDDDD..
+  ................
+}
+# tile 519 (flesh golem,female)
 {
   ................
   ................
@@ -4967,7 +9907,26 @@ Z = (195, 195, 195)
   ..LLDDD..DDDDD..
   ................
 }
-# tile 260 (clay golem)
+# tile 520 (clay golem,male)
+{
+  ................
+  ................
+  ................
+  ....LCCCCK......
+  ...LKKKKKKK.....
+  ...CKAKKAKK.....
+  ...CKAKKAKK.....
+  .LCKKKKKKKKLC...
+  CKKJKKKKKKCKKJ..
+  KKKJKKJJKKJKKJAA
+  .JJAKKJAKKAJJAAA
+  ..AKKKJAKKKAAAAA
+  ..CKKKKKKKKKAAAA
+  ..CKKKAACKKKAA..
+  ..CKKKA.CKKKAA..
+  ................
+}
+# tile 521 (clay golem,female)
 {
   ................
   ................
@@ -4986,7 +9945,26 @@ Z = (195, 195, 195)
   ..CKKKA.CKKKAA..
   ................
 }
-# tile 261 (stone golem)
+# tile 522 (stone golem,male)
+{
+  ................
+  ................
+  ................
+  ....BBBPP.......
+  ...BBPPPPP......
+  ...BHAPHAP......
+  ...PPPPPPP......
+  .BBPPPPPP.BPA...
+  BPPPP....PPPPAA.
+  BPP.BPPPP.PPPAAA
+  .PP.BP.PP.PPPAAA
+  ...BPP.PPPAAAAAA
+  ..BPPPAPPPAAAAA.
+  ..PPPPAPPPPAAA..
+  ...PPAA.PPPA....
+  ................
+}
+# tile 523 (stone golem,female)
 {
   ................
   ................
@@ -5005,7 +9983,26 @@ Z = (195, 195, 195)
   ...PPAA.PPPA....
   ................
 }
-# tile 262 (glass golem)
+# tile 524 (glass golem,male)
+{
+  ................
+  .....BBBBBBA....
+  .....BPNPPPA....
+  .....BNPPPNA....
+  .....NPPPNPA....
+  .....BPPNPPA....
+  .......BA...BA..
+  .BNBBABPBA.BPNA.
+  .NPPNABPNBBANPBA
+  .....BPNPPPAABAA
+  .....BNPPPAAAAAA
+  ......BPPNAAAAAA
+  ....BNABNABPAAA.
+  ...BNPA...BNAAA.
+  ..BNPA....NPAA..
+  ...BA.....BPA...
+}
+# tile 525 (glass golem,female)
 {
   ................
   .....BBBBBBA....
@@ -5024,7 +10021,26 @@ Z = (195, 195, 195)
   ..BNPA....NPAA..
   ...BA.....BPA...
 }
-# tile 263 (iron golem)
+# tile 526 (iron golem,male)
+{
+  ................
+  ......PBP.......
+  ......HBH...B...
+  ......PBP...JP..
+  ......PBP...BP..
+  ...PPPAAAAPABP..
+  ..PBJBBBBBJBAP.A
+  ..PPPPPPPPPPPA.A
+  .B.A........A..A
+  .BP.AAAAAAAAA.AA
+  .BP.ABP.APBP.AAA
+  .BJ.ABP.APBP.AAA
+  ..P.ABP.APBP.AAA
+  ....PJP.APJP.AA.
+  ....PBP.APBP.A..
+  ................
+}
+# tile 527 (iron golem,female)
 {
   ................
   ......PBP.......
@@ -5043,7 +10059,7 @@ Z = (195, 195, 195)
   ....PBP.APBP.A..
   ................
 }
-# tile 264 (human)
+# tile 528 (human,male)
 {
   ................
   ................
@@ -5062,13 +10078,13 @@ Z = (195, 195, 195)
   ................
   ................
 }
-# tile 265 (wererat)
+# tile 529 (human,female)
 {
   ................
   ................
   .......JJA......
   ......JJJJA.....
-  ......GJGJA.....
+  ......ELELA.....
   ......LLLLA.....
   ......ALLA......
   .....CLAALC.AAA.
@@ -5081,13 +10097,13 @@ Z = (195, 195, 195)
   ................
   ................
 }
-# tile 266 (werejackal)
+# tile 530 (wererat,male)
 {
   ................
   ................
   .......JJA......
   ......JJJJA.....
-  ......IPIPA.....
+  ......GJGJA.....
   ......LLLLA.....
   ......ALLA......
   .....CLAALC.AAA.
@@ -5100,32 +10116,127 @@ Z = (195, 195, 195)
   ................
   ................
 }
-# tile 267 (werewolf)
+# tile 531 (wererat,female)
 {
   ................
   ................
-  ......JJA.......
-  .....JJJJA......
-  .....NJNJA......
-  .....LLLLA......
-  .....ALLA.......
-  ....CLAALC.AAA..
-  ...CLLLLLLCAAA..
-  ...LACLLCALAAA..
-  ...LAJJKJALAAA..
-  .....JJJKAAAA...
-  .....JJAJAA.A...
-  ....KLA.LKA.....
+  .......JJA......
+  ......JJJJA.....
+  ......GJGJA.....
+  ......LLLLA.....
+  ......ALLA......
+  .....CLAALC.AAA.
+  ....CLLLLLLCAAA.
+  ....LACLLCALAAA.
+  ....LAJJKJALAAA.
+  ......JJJKAAAA..
+  ......JJAJAA.A..
+  .....KLA.LKA....
   ................
   ................
 }
-# tile 268 (elf)
+# tile 532 (werejackal,male)
 {
   ................
-  .........G......
-  .......GGF......
-  ......GGGGA.....
-  ......LELEA.....
+  ................
+  .......JJA......
+  ......JJJJA.....
+  ......IPIPA.....
+  ......LLLLA.....
+  ......ALLA......
+  .....CLAALC.AAA.
+  ....CLLLLLLCAAA.
+  ....LACLLCALAAA.
+  ....LAJJKJALAAA.
+  ......JJJKAAAA..
+  ......JJAJAA.A..
+  .....KLA.LKA....
+  ................
+  ................
+}
+# tile 533 (werejackal,female)
+{
+  ................
+  ................
+  .......JJA......
+  ......JJJJA.....
+  ......IPIPA.....
+  ......LLLLA.....
+  ......ALLA......
+  .....CLAALC.AAA.
+  ....CLLLLLLCAAA.
+  ....LACLLCALAAA.
+  ....LAJJKJALAAA.
+  ......JJJKAAAA..
+  ......JJAJAA.A..
+  .....KLA.LKA....
+  ................
+  ................
+}
+# tile 534 (werewolf,male)
+{
+  ................
+  ................
+  ......JJA.......
+  .....JJJJA......
+  .....NJNJA......
+  .....LLLLA......
+  .....ALLA.......
+  ....CLAALC.AAA..
+  ...CLLLLLLCAAA..
+  ...LACLLCALAAA..
+  ...LAJJKJALAAA..
+  .....JJJKAAAA...
+  .....JJAJAA.A...
+  ....KLA.LKA.....
+  ................
+  ................
+}
+# tile 535 (werewolf,female)
+{
+  ................
+  ................
+  ......JJA.......
+  .....JJJJA......
+  .....NJNJA......
+  .....LLLLA......
+  .....ALLA.......
+  ....CLAALC.AAA..
+  ...CLLLLLLCAAA..
+  ...LACLLCALAAA..
+  ...LAJJKJALAAA..
+  .....JJJKAAAA...
+  .....JJAJAA.A...
+  ....KLA.LKA.....
+  ................
+  ................
+}
+# tile 536 (elf,male)
+{
+  ................
+  .........G......
+  .......GGF......
+  ......GGGGA.....
+  ......LELEA.....
+  ......LLLLA.....
+  ......ALLA....A.
+  ......GAAG..AAA.
+  .....LGGGFLAAAA.
+  ....LAAGFAALAAA.
+  ....LAGGGFALAA..
+  ......GFAFAA.A..
+  ......GFAFAA.A..
+  .....KLA.LKA....
+  ................
+  ................
+}
+# tile 537 (elf,female)
+{
+  ................
+  .........G......
+  .......GGF......
+  ......GGGGA.....
+  ......LELEA.....
   ......LLLLA.....
   ......ALLA....A.
   ......GAAG..AAA.
@@ -5138,7 +10249,7 @@ Z = (195, 195, 195)
   ................
   ................
 }
-# tile 269 (Woodland-elf)
+# tile 538 (Woodland-elf,male)
 {
   ................
   ................
@@ -5157,7 +10268,45 @@ Z = (195, 195, 195)
   ................
   ................
 }
-# tile 270 (Green-elf)
+# tile 539 (Woodland-elf,female)
+{
+  ................
+  ................
+  .........K......
+  .......KKJ......
+  ......KKKKA.....
+  ......LELEA.....
+  ......LLLLA.....
+  ......ALLA....A.
+  ......KAAK..AAA.
+  .....LKKKJLAAAA.
+  ....LAPPJAALAAA.
+  ..KKLKKKKJALAA..
+  ......PPAJAA.A..
+  .....KLA.LKA....
+  ................
+  ................
+}
+# tile 540 (Green-elf,male)
+{
+  ................
+  ................
+  .........G......
+  .......GGF......
+  ......GGGGA.....
+  ......LELEA.....
+  ......LLLLA.....
+  ......ALLA....A.
+  ......GAAG..AAA.
+  .....LGGGFLAAAA.
+  ....LAAGFAALAAA.
+  ....LAGGGFALAA..
+  ......GFAFAA.A..
+  .....KLA.LKA....
+  ................
+  ................
+}
+# tile 541 (Green-elf,female)
 {
   ................
   ................
@@ -5176,7 +10325,26 @@ Z = (195, 195, 195)
   ................
   ................
 }
-# tile 271 (Grey-elf)
+# tile 542 (Grey-elf,male)
+{
+  ................
+  ................
+  .........P......
+  .......PP.......
+  ......PPPPA.....
+  ......LELEA.....
+  ......LLLLA.....
+  ......ALLA....A.
+  ......PAAP..AAA.
+  .....LPPP.LAAAA.
+  ....LAAP.AALAAA.
+  ....LAPPP.ALAA..
+  ......P.A.AA.A..
+  .....KLA.LKA....
+  ................
+  ................
+}
+# tile 543 (Grey-elf,female)
 {
   ................
   ................
@@ -5195,7 +10363,26 @@ Z = (195, 195, 195)
   ................
   ................
 }
-# tile 272 (elf-lord)
+# tile 544 (elf-leader,male)
+{
+  ................
+  ................
+  ........II......
+  .......HGF......
+  ......HGGGA.....
+  ......LELEA.....
+  ......LLLLA.....
+  ......ALLA....A.
+  ......HAAH..AAA.
+  .....LHHHFLAAAA.
+  ....LAAIIAALAAA.
+  ....LAHGGFALAA..
+  ......HFAFAA.A..
+  .....KLA.LKA....
+  ................
+  ................
+}
+# tile 545 (elf-leader,female)
 {
   ................
   ................
@@ -5214,7 +10401,7 @@ Z = (195, 195, 195)
   ................
   ................
 }
-# tile 273 (Elvenking)
+# tile 546 (Elvenmonarch,male)
 {
   ................
   ................
@@ -5233,7 +10420,45 @@ Z = (195, 195, 195)
   ................
   ................
 }
-# tile 274 (doppelganger)
+# tile 547 (Elvenmonarch,female)
+{
+  ................
+  ................
+  ......H..H......
+  ......HCHH......
+  ......HHHHA.....
+  ......LELEA.....
+  ......LLLLA.....
+  .....IALLAI...A.
+  ....IIIAAIDIAAA.
+  .....LIIGDLAAAAA
+  ....LADIFDALAAAA
+  ....LAIIGDALAAA.
+  .....IIFAFDAAA..
+  ...IIKLAILKDI...
+  ................
+  ................
+}
+# tile 548 (doppelganger,male)
+{
+  ................
+  ......CCCC..I...
+  ..I..CD...C.....
+  ....CD.HHA.C....
+  ...CD.HHHHA.C.I.
+  ...CD.LFLFA.DC..
+  .I.CD.LLLLA.DC..
+  ...CD.ALLA.DC...
+  ..CD.LLAALL.ACA.
+  .CD.LLLLLLLLADC.
+  .CD.LALLLLALADC.
+  .CD.LAJJKJALADC.
+  ..CD..LJJLAAACA.
+  ...CD.LLALAACA..
+  ..CD.LLAALLADC..
+  ................
+}
+# tile 549 (doppelganger,female)
 {
   ................
   ......CCCC..I...
@@ -5252,7 +10477,7 @@ Z = (195, 195, 195)
   ..CD.LLAALLADC..
   ................
 }
-# tile 275 (shopkeeper)
+# tile 550 (shopkeeper,male)
 {
   ................
   ................
@@ -5271,7 +10496,26 @@ Z = (195, 195, 195)
   ................
   ................
 }
-# tile 276 (guard)
+# tile 551 (shopkeeper,female)
+{
+  ................
+  ................
+  ......AAAA......
+  .....AAAAAA.....
+  ......JLJL......
+  ......LLLL......
+  ......ALLA......
+  .....EBAABEA.AA.
+  ....EBBBBBBEAAA.
+  ....BAEBBEABAAA.
+  ....LAGFFFALAAA.
+  ......GFAFAAAA..
+  ......GFAFAA.A..
+  .....JJA.JJA....
+  ................
+  ................
+}
+# tile 552 (guard,male)
 {
   ................
   .....BBPPPAA....
@@ -5290,7 +10534,45 @@ Z = (195, 195, 195)
   .....BPPABPPAAAA
   ....BPPP.BPPPAAA
 }
-# tile 277 (prisoner)
+# tile 553 (guard,female)
+{
+  ................
+  .....BBPPPAA....
+  ....BNPPPPPPA...
+  ....BPPBPPPPA...
+  ....BAABPAAPA...
+  ....BCLBPCLPA...
+  ....AKCPPCJAAA..
+  ....BKJJJJAPAAAA
+  ...BPKJAAJAPPAAA
+  ..BPPKJJJJAPPPAA
+  ..PPABKJJAPPAPPA
+  ..PPABPKAPPPAPPA
+  ..LC.BPPPPPPCLAA
+  ..LL.BPPABPPLLAA
+  .....BPPABPPAAAA
+  ....BPPP.BPPPAAA
+}
+# tile 554 (prisoner,male)
+{
+  ................
+  ................
+  .......NOA......
+  .......LLA......
+  .......LLA......
+  .......NOA......
+  ......NOONA.....
+  .....NOOOONA....
+  ....NANOOOANAA..
+  ....PANOOOAPAAA.
+  ....LANOOOALAAA.
+  ......NOOOAAAA..
+  ......NAANAAA...
+  ......PAAPAA....
+  .....LLA.LLA....
+  ................
+}
+# tile 555 (prisoner,female)
 {
   ................
   ................
@@ -5309,7 +10591,26 @@ Z = (195, 195, 195)
   .....LLA.LLA....
   ................
 }
-# tile 278 (Oracle)
+# tile 556 (Oracle,male)
+{
+  ................
+  ................
+  .......NN.......
+  LLL...GLLG...LLL
+  ..L..NLLLLN..L..
+  ...L.NLAALN.L...
+  ....LNLLLLNL....
+  .....LNLLNL..AA.
+  .....NBBEEN.AAAA
+  ......BBEEAAAAAA
+  .LLA..BBBEAAALL.
+  .LLLLBBBEBELLLLA
+  ..LLCLBLLELLCLAA
+  ...CLLLLLLLCLAA.
+  ....LELLLLELAA..
+  ................
+}
+# tile 557 (Oracle,female)
 {
   ................
   ................
@@ -5328,7 +10629,26 @@ Z = (195, 195, 195)
   ....LELLLLELAA..
   ................
 }
-# tile 279 (aligned priest)
+# tile 558 (aligned priest,male)
+{
+  ................
+  INI.............
+  III..KCCK.......
+  .J..KCCCCK......
+  .J..CAAKCC......
+  .LC.CAAACC......
+  CLLC.CAACJKC....
+  CJLACCCCJKCCC...
+  .JAACCJJCKCCCK..
+  .JKCCCJCCJCCK.AA
+  .J..CCJCCLJCAAAA
+  .J..CCJCLLCAAAA.
+  .J..KCJCCCJAAAA.
+  .J.ACCJCCCJAAA..
+  .JACCCJJCCCAA...
+  ................
+}
+# tile 559 (aligned priest,female)
 {
   ................
   INI.............
@@ -5347,7 +10667,7 @@ Z = (195, 195, 195)
   .JACCCJJCCCAA...
   ................
 }
-# tile 280 (high priest)
+# tile 560 (high priest,male)
 {
   .INI............
   IIIII.KCCK......
@@ -5366,7 +10686,45 @@ Z = (195, 195, 195)
   ..HACCCJJCCCAA..
   ................
 }
-# tile 281 (soldier)
+# tile 561 (high priest,female)
+{
+  .INI............
+  IIIII.KCCK......
+  .IHI.KCAACK.....
+  ..H..CGAGAC.....
+  ..LC.CAAAAC.....
+  .CLLC.CAACJCK...
+  .CHLACCCCJCCCK..
+  ..HAACCJJCCCCCK.
+  ..HCCCCJCCJCCC.A
+  ..H..CCJCCLJCAAA
+  ..H..CCJCLLCAAAA
+  ..H..KCJCCCJAAAA
+  ..H..KCJCCCJAAAA
+  ..H.ACCJCCCJAAA.
+  ..HACCCJJCCCAA..
+  ................
+}
+# tile 562 (soldier,male)
+{
+  .....J..........
+  .....JAAA.......
+  .....ALLLA......
+  .....LLLLC......
+  .....JLLC.......
+  .....JF..F......
+  ....FJFFFFF..A..
+  ....FJFFFAF.A...
+  ....FLFFFFFAAA..
+  ....FJFFAAAAAAA.
+  .....LFAFFAAAA..
+  .....FFAF.AAAA..
+  ......FAF.AA....
+  .....FFAFFA.....
+  .....JJ.JJ......
+  ................
+}
+# tile 563 (soldier,female)
 {
   .....J..........
   .....JAAA.......
@@ -5385,7 +10743,7 @@ Z = (195, 195, 195)
   .....JJ.JJ......
   ................
 }
-# tile 282 (sergeant)
+# tile 564 (sergeant,male)
 {
   .....J..........
   .....JFFF.......
@@ -5404,7 +10762,45 @@ Z = (195, 195, 195)
   .....AA.AA......
   ................
 }
-# tile 283 (nurse)
+# tile 565 (sergeant,female)
+{
+  .....J..........
+  .....JFFF.......
+  ....FFFFFF......
+  .....LLLLC......
+  .....JLLC.......
+  .....JF..G......
+  ....FJFFFFF..A..
+  ....FJFFFAF.A...
+  ....FLFFFFFAAA..
+  ....FJFFAAAAAAA.
+  .....LFAFFAAAA..
+  .....FFAF.AAAA..
+  ......FAF.AA....
+  .....FFAFFA.....
+  .....AA.AA......
+  ................
+}
+# tile 566 (nurse,male)
+{
+  ................
+  .......NO.......
+  ......NDDO......
+  ......NNOOA.....
+  .....DBLBLD.....
+  .....CLLLLDC....
+  .....DALLACD....
+  .....CNAAODCAAA.
+  .....NNNOOLAAAA.
+  ....LANNDOALAAA.
+  ....LANNOOALAAA.
+  ......NNOOAAAA..
+  ......NNAOAA.A..
+  .....LLA.LLA....
+  ................
+  ................
+}
+# tile 567 (nurse,female)
 {
   ................
   .......NO.......
@@ -5423,7 +10819,26 @@ Z = (195, 195, 195)
   ................
   ................
 }
-# tile 284 (lieutenant)
+# tile 568 (lieutenant,male)
+{
+  ................
+  .......FFF......
+  .....FFFFFF.....
+  ......LLLL......
+  .......LLCA.....
+  .....GF.FGA.....
+  ....FFFFFFFF....
+  ....FAFFFFAFAAA.
+  ....FAFFFFAFAAAA
+  ....FAFFFFAFAAA.
+  ....LFFAFFJLJA..
+  .....FFAFFJJJA..
+  ......FAF.AA....
+  .....FFAFFA.....
+  .....AA.AA......
+  ................
+}
+# tile 569 (lieutenant,female)
 {
   ................
   .......FFF......
@@ -5442,7 +10857,26 @@ Z = (195, 195, 195)
   .....AA.AA......
   ................
 }
-# tile 285 (captain)
+# tile 570 (captain,male)
+{
+  ................
+  ......FHHF......
+  .....FFFFFF.....
+  ......LLLL......
+  .......LLCA.....
+  .....HF.FHF.....
+  ....FFFFFFFFAA..
+  ....FAFFIFAFAAAA
+  ....FAFFFFAFAAA.
+  ....FAFFFFAFAAA.
+  ....LFFAFFJLJA..
+  .....FFAFFJJJA..
+  ......FAF.JJJA..
+  .....FFAFFJJJA..
+  .....AA.AAAAA...
+  ................
+}
+# tile 571 (captain,female)
 {
   ................
   ......FHHF......
@@ -5461,7 +10895,26 @@ Z = (195, 195, 195)
   .....AA.AAAAA...
   ................
 }
-# tile 286 (watchman)
+# tile 572 (watchman,male)
+{
+  ................
+  ......PPP.......
+  ....PPPPPP......
+  .....LLLLC......
+  ......LLC.......
+  .....PP..P......
+  ....PPPPPPP.....
+  ....PAPPHAPPA...
+  ....PAPPPANNAAA.
+  ....PJPPAPNNAAA.
+  ....JLPAPPAAAA..
+  .....JPAP.AAAA..
+  ......PAP.AA....
+  .....PPAPPA.....
+  ....JJJ.JJJ.....
+  ................
+}
+# tile 573 (watchman,female)
 {
   ................
   ......PPP.......
@@ -5480,7 +10933,7 @@ Z = (195, 195, 195)
   ....JJJ.JJJ.....
   ................
 }
-# tile 287 (watch captain)
+# tile 574 (watch captain,male)
 {
   ......PPP.......
   .....PHHHP......
@@ -5499,7 +10952,26 @@ Z = (195, 195, 195)
   ....JJJ.JJJ.....
   ................
 }
-# tile 288 (Medusa)
+# tile 575 (watch captain,female)
+{
+  ......PPP.......
+  .....PHHHP......
+  ....PPPPPPP.....
+  .....LLLLC......
+  ......LLC.......
+  .....HP..H......
+  ....PPPPPPP.....
+  ....PAPPHAPPA...
+  ....PAPPPANNAAA.
+  ....PJPPAPNNAAA.
+  ....JLPAPPAAAA..
+  .....JPAP.AAAA..
+  .....JPAP.AA....
+  .....PPAPPA.....
+  ....JJJ.JJJ.....
+  ................
+}
+# tile 576 (Medusa,male)
 {
   ................
   ..GA...GA.......
@@ -5518,7 +10990,26 @@ Z = (195, 195, 195)
   ..IIKIKIKIA.....
   ................
 }
-# tile 289 (Wizard of Yendor)
+# tile 577 (Medusa,female)
+{
+  ................
+  ..GA...GA.......
+  ...FA.FA..GA....
+  ....FJFFFF......
+  ..FAFLLFA....A..
+  .GAFLLLLA..A..A.
+  ....JLLKA.A.A.A.
+  ...KBLLBKAAAAA..
+  ..KIIBBIIIAAA.A.
+  ..IIIKKILLIAAA..
+  ..KIILLIALIAA...
+  ...KIALKAAIAA...
+  ...IKAAKIIAAA...
+  ...IIKKIIIAA....
+  ..IIKIKIKIA.....
+  ................
+}
+# tile 578 (Wizard of Yendor,male)
 {
   .EEE.......EEE..
   EFFAE..E..EAFFE.
@@ -5537,7 +11028,45 @@ Z = (195, 195, 195)
   .EEEEEEEEEEEAAA.
   EEEEEEEEEEEEEEA.
 }
-# tile 290 (Croesus)
+# tile 579 (Wizard of Yendor,female)
+{
+  .EEE.......EEE..
+  EFFAE..E..EAFFE.
+  EAAAE.EEE.EAAAE.
+  EAAAEEEAEEEAAAE.
+  EEAAEEDADEEAAEE.
+  .EEEEAAAAAEEEE..
+  ..EEEEAAAEEEE...
+  ..EEEEEEEEEE....
+  ...EEEEEEEE.....
+  ...EEEEEEEE....A
+  ....EEEEEE...AAA
+  ....EEEEEEAAAAAA
+  ...EEEEEEEEAAAAA
+  ..EEEEEEEEEAAAAA
+  .EEEEEEEEEEEAAA.
+  EEEEEEEEEEEEEEA.
+}
+# tile 580 (Croesus,male)
+{
+  ....H..H..H.....
+  ....HCHEHCH.....
+  ....HHHHHHH.....
+  ....ALLLLLA.....
+  ....LLALALL.....
+  .....LLLLL......
+  ....HLLDLLH.....
+  ...HIALLLAIH.A.A
+  ...HIHAAAHIHAAAA
+  ..IIIEHHHIIIIAAA
+  ..IIIIEHIIIIIAA.
+  ..ILLIHHHILLIAAA
+  ...LIIKHIIILAAAA
+  ..GIIIKJIIIIGAA.
+  .GIIIKJJKKIIIGG.
+  ................
+}
+# tile 581 (Croesus,female)
 {
   ....H..H..H.....
   ....HCHEHCH.....
@@ -5556,7 +11085,26 @@ Z = (195, 195, 195)
   .GIIIKJJKKIIIGG.
   ................
 }
-# tile 291 (Charon)
+# tile 582 (Charon,male)
+{
+  ................
+  .......J........
+  ......JJJ.......
+  ....JJJAJJJ.....
+  ....JJDADJJ.....
+  ...JJAAAAAJJ....
+  ...JJJAAAJJJ....
+  ..JJJJJJJJJJ....
+  .JJJJJJJJJJJJ...
+  JJJJJJJJJJJJJJ.A
+  .OO.JJJJJJ.OOAAA
+  ....JJJJJJAAAAAA
+  ...JJJJJJJJAAAAA
+  ..JJJJJJJJJAAAAA
+  .JJJJJJJJJJJAAA.
+  JJJJJJJJJJJJJJA.
+}
+# tile 583 (Charon,female)
 {
   ................
   .......J........
@@ -5575,7 +11123,26 @@ Z = (195, 195, 195)
   .JJJJJJJJJJJAAA.
   JJJJJJJJJJJJJJA.
 }
-# tile 292 (ghost)
+# tile 584 (ghost,male)
+{
+  ................
+  ................
+  ...NNN..........
+  ..NANANN........
+  .NNNNNNNNN......
+  .NNPAAPNNNNN....
+  .NNAAAANNNOONO..
+  .NNAAAANONNNPNNO
+  .NNPAAPNONNOOOP.
+  .NNNNNNONOPNPPO.
+  .NNONNOPNNOPOOP.
+  .NOPNNOOOPPOOP..
+  .OOOPOPPOPPP.PP.
+  .PP.PPOPPP...P..
+  .O...P....P.....
+  ........P.......
+}
+# tile 585 (ghost,female)
 {
   ................
   ................
@@ -5594,7 +11161,26 @@ Z = (195, 195, 195)
   .O...P....P.....
   ........P.......
 }
-# tile 293 (shade)
+# tile 586 (shade,male)
+{
+  ................
+  ................
+  ................
+  ................
+  ................
+  ................
+  ................
+  ................
+  ........AAAAAAA.
+  ....AAAAAAAA....
+  ..AAAAAAAAAAAA..
+  AAAAAAAAAAAAAAA.
+  ..AAAAAAAAAAAAAA
+  .AAAAAAAAAAAAA..
+  AAAA.AAAAJA.....
+  ................
+}
+# tile 587 (shade,female)
 {
   ................
   ................
@@ -5613,7 +11199,7 @@ Z = (195, 195, 195)
   AAAA.AAAAJA.....
   ................
 }
-# tile 294 (water demon)
+# tile 588 (water demon,male)
 {
   ................
   ................
@@ -5632,7 +11218,45 @@ Z = (195, 195, 195)
   ....EEAEEA......
   ................
 }
-# tile 295 (succubus)
+# tile 589 (water demon,female)
+{
+  ................
+  ................
+  ................
+  ................
+  ..EE.....EE.....
+  .E.EE...EE.E....
+  ....EEEEE.......
+  ....EBEBE..A....
+  ...EEEEEEEAAAA..
+  ..EEE...EEEAA.A.
+  ..EEEEEEEEEAAA..
+  ..EEAEEEAEEAAA..
+  ...AAEEEAAAAA...
+  ....EEAEEAA.....
+  ....EEAEEA......
+  ................
+}
+# tile 590 (Amorous Demon,male)
+{
+  DD.OHHD.........
+  DDOHHDGD........
+  DDOHDDDDD.......
+  DDHHDDDA........
+  DDDHDJADDDD.....
+  DDDJDDDDDDDD....
+  .DDDDDCDD.DDD...
+  .DDCDDDKK..DD...
+  ..DDKKDDDAADDA..
+  ...DDDDDDAAAAA..
+  ....DDDDDDDDDA..
+  ....DDJDJJAAAAAA
+  ....JDJJADKAA...
+  ....DDKAADDKA...
+  ...DDKAA..DDAA..
+  ..DDKAA...DDDA..
+}
+# tile 595 (Amorous Demon,female)
 {
   DD.OHHD.........
   DDOHHDGD........
@@ -5651,7 +11275,7 @@ Z = (195, 195, 195)
   ....DDAA..DDAA..
   ...DDJA...DDDA..
 }
-# tile 296 (horned devil)
+# tile 592 (horned devil,male)
 {
   ................
   ................
@@ -5670,26 +11294,45 @@ Z = (195, 195, 195)
   ..CDDAA.DDK.....
   ................
 }
-# tile 297 (incubus)
+# tile 593 (horned devil,female)
 {
-  DD.OHHD.........
-  DDOHHDGD........
-  DDOHDDDDD.......
-  DDHHDDDA........
-  DDDHDJADDDD.....
-  DDDJDDDDDDDD....
-  .DDDDDCDD.DDD...
-  .DDCDDDKK..DD...
-  ..DDKKDDDAADDA..
-  ...DDDDDDAAAAA..
-  ....DDDDDDDDDA..
-  ....DDJDJJAAAAAA
-  ....JDJJADKAA...
-  ....DDKAADDKA...
-  ...DDKAA..DDAA..
-  ..DDKAA...DDDA..
+  ................
+  ................
+  ..O.......O.....
+  ..OO.....OO.....
+  ...LOCDCOL......
+  ...CDDDDDC......
+  ...DAADAADA..D..
+  ...DDDDDDDA.D...
+  ..CCDDFDDCCAD.A.
+  ..CDKDDDKCDADA..
+  ..CDAKKKACDAAAA.
+  ..DDADDDADDAAAA.
+  ....CDDDKAAAAA..
+  ...CDDADDKAA....
+  ..CDDAA.DDK.....
+  ................
+}
+# tile 596 (erinys,male)
+{
+  ..GA...GA.......
+  ...FA.FA..GA....
+  ....FJFFFF......
+  ..FAFLLFA.......
+  .GAFDLDLA..A.A..
+  ....LLLEA.A.A.A.
+  ...EBLLBEAAAA.A.
+  ..EBBBBBBBAAAA..
+  ..BBBEBBLLBAA.A.
+  ..EBBLLBALBAAA..
+  ...EBALBAABAA...
+  ...BEAABBBAAA...
+  ...BBBBBBBAAA...
+  ...BBBBBBBAA....
+  ..BBEBEBEBA.....
+  ................
 }
-# tile 298 (erinys)
+# tile 597 (erinys,female)
 {
   ..GA...GA.......
   ...FA.FA..GA....
@@ -5708,7 +11351,26 @@ Z = (195, 195, 195)
   ..BBEBEBEBA.....
   ................
 }
-# tile 299 (barbed devil)
+# tile 598 (barbed devil,male)
+{
+  ................
+  ................
+  ..O.......O.....
+  ..OO.....OO.....
+  .O.LOCDCOL.O....
+  ...CDDDDDC....DD
+  ...DAADAADA..D.D
+  ...DDDDDDDA.D...
+  ..CCDDFDDCCAD.A.
+  ..CDKDDDKCDADA..
+  .C.DAKKKACDKAAA.
+  ..DDADDDADDAAAA.
+  ....CDDDKAAAAA..
+  .K.CDDADDKAAK...
+  .CCDDAA.DDKK....
+  ................
+}
+# tile 599 (barbed devil,female)
 {
   ................
   ................
@@ -5727,7 +11389,26 @@ Z = (195, 195, 195)
   .CCDDAA.DDKK....
   ................
 }
-# tile 300 (marilith)
+# tile 600 (marilith,male)
+{
+  .D..HHH.....D...
+  DD.HHHHHA...DD..
+  .DCHDDDHHAAD..A.
+  ..HDBDBDHDDAAAA.
+  .CHKDDDKHAAADD..
+  CDDDKKKDHDDDDFF.
+  D..CDDCDKAAFFFAA
+  D.KDDKDDDDDDFAA.
+  D.DKDDKDKAFDFAA.
+  ..D.GDDFAAFDFFAA
+  .D.GGFFFAAAFFFFA
+  ...GFFFFFAAAFFFA
+  ..FGFFFFFFAFFFFA
+  ..FGFFFFFFFFFFA.
+  ..FGFFFFFFFFFA..
+  ....GFFFFFFAA...
+}
+# tile 601 (marilith,female)
 {
   .D..HHH.....D...
   DD.HHHHHA...DD..
@@ -5746,7 +11427,26 @@ Z = (195, 195, 195)
   ..FGFFFFFFFFFA..
   ....GFFFFFFAA...
 }
-# tile 301 (vrock)
+# tile 602 (vrock,male)
+{
+  ................
+  ......OPP.O.....
+  ......PPPP......
+  .....CPPDP......
+  ....CCCPPP......
+  ....CCPPPP......
+  ....C..PPA......
+  .....DDAADD.AAA.
+  ....DDDDDDDDAAA.
+  ....DADDDDADAAA.
+  ....DADDDDADAAA.
+  ....DADDDDADAAA.
+  ......DAADAAAA..
+  ......DAADAA.A..
+  .....DDA.DDA....
+  ................
+}
+# tile 603 (vrock,female)
 {
   ................
   ......OPP.O.....
@@ -5765,7 +11465,26 @@ Z = (195, 195, 195)
   .....DDA.DDA....
   ................
 }
-# tile 302 (hezrou)
+# tile 604 (hezrou,male)
+{
+  ................
+  ................
+  ....GGGFF.......
+  ..NGFFNNFFF.....
+  .DFFFDDNFF.F....
+  .GFFFDNFF.FFFAA.
+  .AFAFFFFFFFFFFAA
+  .GFFFF.FFF.FGFAA
+  .GAAAFF..LFGFFAA
+  ..FFFF.FFLFGFFFA
+  ..LLA.FLLLJJG.FA
+  .LLAFFLLFJJGFFFA
+  ..LAFLLLAAGF.FAA
+  .....L.LAGFFFFAA
+  ...........FFFA.
+  ................
+}
+# tile 605 (hezrou,female)
 {
   ................
   ................
@@ -5784,7 +11503,26 @@ Z = (195, 195, 195)
   ...........FFFA.
   ................
 }
-# tile 303 (bone devil)
+# tile 606 (bone devil,male)
+{
+  ................
+  ................
+  ..O.......O.....
+  ..OO.....OO..O..
+  ...LNLOLOL....O.
+  ...LOOOOOL....O.
+  ...NAAOAAOA..O..
+  ...NOOOOOOA.O...
+  ..NOOOFOOOOAO.A.
+  ..OOKNOOKOOALA..
+  ..OOANOOAOOAKAA.
+  ..LLANOOALLAAAA.
+  ....NOOOLAAAAA..
+  ...NOOAOOLAA....
+  ..NOOAA.OOL.....
+  ................
+}
+# tile 607 (bone devil,female)
 {
   ................
   ................
@@ -5803,7 +11541,26 @@ Z = (195, 195, 195)
   ..NOOAA.OOL.....
   ................
 }
-# tile 304 (ice devil)
+# tile 608 (ice devil,male)
+{
+  ................
+  ................
+  ..N.......N.....
+  ..NN.....NN.....
+  ...PBPNPNP..BNB.
+  ...PNNNNNP..N.N.
+  ...BAANAANA...N.
+  ...BNNNNNNA.BNB.
+  ..BNNNFNNNNAN.A.
+  ..NNKBNNKNNABA..
+  ..NNABNNANNA.AA.
+  ..PPABNNAPPAAAA.
+  ....BNNNPAAAAA..
+  ...BNNANNPAA....
+  ..BNNAA.NNP.....
+  ................
+}
+# tile 609 (ice devil,female)
 {
   ................
   ................
@@ -5822,7 +11579,26 @@ Z = (195, 195, 195)
   ..BNNAA.NNP.....
   ................
 }
-# tile 305 (nalfeshnee)
+# tile 610 (nalfeshnee,male)
+{
+  ................
+  ................
+  ......BB...BB...
+  ..KKKKKBB.BB....
+  .KADKADKKKB.....
+  .KKKKKKKDKK.....
+  .OKDKOKKDDKD....
+  .OKDKOKKKDKDD...
+  .KAAAKKDKAKKD...
+  ..KKKDDLAKKKD.A.
+  ...KK.KKKKKDDA..
+  ....L..KDAKDAA..
+  ......LLAAKDA...
+  .........LLA....
+  ................
+  ................
+}
+# tile 611 (nalfeshnee,female)
 {
   ................
   ................
@@ -5841,7 +11617,26 @@ Z = (195, 195, 195)
   ................
   ................
 }
-# tile 306 (pit fiend)
+# tile 612 (pit fiend,male)
+{
+  ................
+  .K.O.......O.K..
+  .K.OO.....OO.KJ.
+  KJJ.LOCDCOL.KJJ.
+  KJJJKDDDDDKKJJJ.
+  KJJCKDNDNDKCJJJA
+  JJCCKDDDDDJCCJJA
+  JJCCCKDIDJDCCJJA
+  JACCDDKJJDDCDAJA
+  JACCKDDDDDKCDAJA
+  ...CDKDDDKCDDAAA
+  ....DKDDDKCDAAAA
+  .....CDDDKAAAA..
+  ....CDDADDKA....
+  ...CDDAA.DDK....
+  ................
+}
+# tile 613 (pit fiend,female)
 {
   ................
   .K.O.......O.K..
@@ -5860,7 +11655,26 @@ Z = (195, 195, 195)
   ...CDDAA.DDK....
   ................
 }
-# tile 307 (sandestin)
+# tile 614 (sandestin,male)
+{
+  .....CCCCC..I...
+  .I..CD....C.....
+  ...CD.DDD..C..I.
+  ..CD.DDDDD..C...
+  ..CD.DNDNDA.DC..
+  I.CD.DDDDDA.DC..
+  ..CD.ADDDA.DC..A
+  .CD.DDAAADD.DCAA
+  CD.DDDDDDDDDADCA
+  CD.DADDDDDADADCA
+  CD.DADDDDDADADCA
+  CD.DADDDDDADADC.
+  .CD..DDJDDAADCA.
+  ..CD.DDADDADCA..
+  .CD.DDAADDDADC..
+  ................
+}
+# tile 615 (sandestin,female)
 {
   .....CCCCC..I...
   .I..CD....C.....
@@ -5879,7 +11693,26 @@ Z = (195, 195, 195)
   .CD.DDAADDDADC..
   ................
 }
-# tile 308 (balrog)
+# tile 616 (balrog,male)
+{
+  ................
+  .K..O.....O..K..
+  .KJ.O.....O.KJ..
+  KJJLOOCDCOOLJJJ.
+  JJJDDDDDDDDDDKJ.
+  JCCDDDNDNDDDCCJA
+  CCDKDDDDDDDJCCCA
+  CDDKKKDIDJJDCCDA
+  CDDKDDKJJDDDCDDA
+  CCDKDDDDDDDKCDDA
+  JCCDKKDDDKKCDDDA
+  JJCDKKDDDKKCDDJA
+  JJ..CCDDDKKAAJJA
+  J..CDDDADDDKAAJA
+  ..CDDDAA.DDDK.AA
+  ................
+}
+# tile 617 (balrog,female)
 {
   ................
   .K..O.....O..K..
@@ -5898,7 +11731,26 @@ Z = (195, 195, 195)
   ..CDDDAA.DDDK.AA
   ................
 }
-# tile 309 (Juiblex)
+# tile 618 (Juiblex,male)
+{
+  ................
+  DD.........DD...
+  NDC.KKKKJ.CND...
+  .CCKCCCKKCCAA...
+  ..KCCCCKCCJAA...
+  ..KCCCCCK.JJAA..
+  ..KCCFCCK..JAA..
+  ..FKCFCCKK.JAAA.
+  .FKKFCCKFK..JAA.
+  .FKCFCCFKFK.JAA.
+  .FCFCCKFCFK.JAA.
+  FKCFCFCFCKK.JAA.
+  CKFCCFCCKKFKJJA.
+  CCKKCFCKFFKKKKA.
+  .CCCCCCCCCCCKA..
+  ................
+}
+# tile 619 (Juiblex,female)
 {
   ................
   DD.........DD...
@@ -5917,7 +11769,26 @@ Z = (195, 195, 195)
   .CCCCCCCCCCCKA..
   ................
 }
-# tile 310 (Yeenoghu)
+# tile 620 (Yeenoghu,male)
+{
+  ....B.HHP.......
+  ....BPPPP.......
+  ...BPLCPPH......
+  .KBPPCCPPH......
+  .PPPPPPP.H......
+  .PP...P.PH......
+  ....BPPPPPAAA...
+  ..BPPPPPPPPAAAA.
+  .BP.PPPPPAPPAAAA
+  .B...BPP.AAPAAAA
+  .B...BPP.AAPAAA.
+  .....BPPAAAAA.A.
+  ....BP.PPAA...A.
+  ...BP.AAPPA..A..
+  ...BPAA.PPA.....
+  ................
+}
+# tile 621 (Yeenoghu,female)
 {
   ....B.HHP.......
   ....BPPPP.......
@@ -5936,7 +11807,26 @@ Z = (195, 195, 195)
   ...BPAA.PPA.....
   ................
 }
-# tile 311 (Orcus)
+# tile 622 (Orcus,male)
+{
+  ................
+  .K..O.....O..K..
+  KJJO..BBB..O.KJ.
+  KJJLOBPPPPOLKJJ.
+  JKJJ.PGPGP.JJKJA
+  JJKJKPPPPPJJKJJJ
+  JBPPB.BPPABBPPJJ
+  PJJPP.BPPAPPJJPA
+  PJBPPP.AAPPPPJPA
+  .JBP.PPPP.P.PJAA
+  .JBPPPP.PPPPPJAA
+  ..PPP.PPP.PPPAAA
+  ...P.PPPPPPP.P.A
+  ...BPPPAPPPPAAPA
+  ...OOPPAOOPPAGA.
+  ................
+}
+# tile 623 (Orcus,female)
 {
   ................
   .K..O.....O..K..
@@ -5955,7 +11845,7 @@ Z = (195, 195, 195)
   ...OOPPAOOPPAGA.
   ................
 }
-# tile 312 (Geryon)
+# tile 624 (Geryon,male)
 {
   .K...........K..
   .K....JJJ....KJ.
@@ -5974,7 +11864,45 @@ Z = (195, 195, 195)
   ....FGGGFFFFFFFA
   .....FFFFFFFFFA.
 }
-# tile 313 (Dispater)
+# tile 625 (Geryon,female)
+{
+  .K...........K..
+  .K....JJJ....KJ.
+  KJJ..JJJJJ..KJJ.
+  KJJJKLLLLLKKJJJ.
+  KJJJKLBLBLKJJJJA
+  JJJJKLLLLLJJJJJA
+  JJALLKLLLJLLAJJA
+  JA.LLLKJJLLLAAJA
+  ...LJLLLLLKLAAAA
+  ...LCKLLLKCLAFGF
+  ...LLGLLFALLFFFA
+  .....GFFFAAAFFAA
+  ....GGGGFFAAFFAA
+  ....GFFFFFAAFGFA
+  ....FGGGFFFFFFFA
+  .....FFFFFFFFFA.
+}
+# tile 626 (Dispater,male)
+{
+  ................
+  ......OJJO......
+  ......JJJJA.....
+  ......BLBLA.....
+  ......LLLLA.....
+  ......ALLA......
+  .....CKAAKK.AAA.
+  ....CKKKKKKKAAA.
+  ....KACKKJAKAAA.
+  ....KACKKJAKAAJA
+  ....KACKKJAKAAJA
+  ....LACKKJJLAJA.
+  ......CKAJAJJA..
+  ......CKAPAAAA..
+  .....PPA.PPA....
+  ................
+}
+# tile 627 (Dispater,female)
 {
   ................
   ......OJJO......
@@ -5993,7 +11921,26 @@ Z = (195, 195, 195)
   .....PPA.PPA....
   ................
 }
-# tile 314 (Baalzebub)
+# tile 628 (Baalzebub,male)
+{
+  ......F...F.....
+  .......F.F......
+  ......BFFFB.....
+  .....BPPFBPP....
+  .....PPPFPPP....
+  ......PPFPP.....
+  .....CAFFFAK....
+  ....CKKAFAKKKAA.
+  ....CAKJFAKAKAA.
+  ....FACJDAJAFAA.
+  ....FACKJJJAFAA.
+  ....FACKKKJAFAA.
+  ......CKKKJAAA..
+  ......CKAKJA.A..
+  .....FFA..FF....
+  ................
+}
+# tile 629 (Baalzebub,female)
 {
   ......F...F.....
   .......F.F......
@@ -6012,7 +11959,26 @@ Z = (195, 195, 195)
   .....FFA..FF....
   ................
 }
-# tile 315 (Asmodeus)
+# tile 630 (Asmodeus,male)
+{
+  ................
+  ......OJJO......
+  ......JJJJA.....
+  ......BLBLA.....
+  ......LLLLA.....
+  ......ALLA......
+  .....CKAAKK.AAA.
+  ....CKKKKKKKAAA.
+  ...KKCKKKKJKKAA.
+  ...KKAKKKJAKKAJA
+  ...KA.CKKJAAKAJA
+  ...LA.CKKJJALJA.
+  ......CKAJAJJA..
+  ......CKAPAAAA..
+  .....PPA.PPA....
+  ................
+}
+# tile 631 (Asmodeus,female)
 {
   ................
   ......OJJO......
@@ -6031,7 +11997,26 @@ Z = (195, 195, 195)
   .....PPA.PPA....
   ................
 }
-# tile 316 (Demogorgon)
+# tile 632 (Demogorgon,male)
+{
+  ...KKK..KKK.....
+  ..KBKBK.BKBK....
+  ..KDKKK.KKDK....
+  ..DKKFA.GKKD....
+  ....GFAAGFAAA...
+  ...GFFFJFFFA.AAA
+  ..GFAGFFFAFFAAAA
+  .GJFAGJFJAFFFAA.
+  .GFAAGFFFAAFJA..
+  .GJA.GFJFAAFFAA.
+  .GFA.GFFFA.FJAA.
+  .GJA.GJFJA.FFAA.
+  .GFAGFAAFFAFFA..
+  ..GAGJAAJFAFAA..
+  ..GAGFAFFFAFA...
+  ................
+}
+# tile 633 (Demogorgon,female)
 {
   ...KKK..KKK.....
   ..KBKBK.BKBK....
@@ -6050,7 +12035,26 @@ Z = (195, 195, 195)
   ..GAGFAFFFAFA...
   ................
 }
-# tile 317 (Death)
+# tile 634 (Death,male)
+{
+  .BBBB....JJJ....
+  .BPPPP.JJJJ.....
+  .C....JJJJJ.....
+  .C....JAAAJ.....
+  .C...JADADAJ.AAA
+  OOJ..JAAAAAJAAA.
+  OOOJJJAAAAAJJJA.
+  OOJJJJAAAAJOOJJA
+  .CJJJJAAAJOOOOJA
+  .C.JJAAAAJAOAAJA
+  .C..JAAAAJAOAAJA
+  .C..JAAAAAJOAJAA
+  .C..JAAAAAJJJAAA
+  .C.JAAAAAAAJJAA.
+  .CJJAAAAAAAAJJA.
+  ACJAAAAAAAAAAAJ.
+}
+# tile 635 (Death,female)
 {
   .BBBB....JJJ....
   .BPPPP.JJJJ.....
@@ -6069,7 +12073,26 @@ Z = (195, 195, 195)
   .CJJAAAAAAAAJJA.
   ACJAAAAAAAAAAAJ.
 }
-# tile 318 (Pestilence)
+# tile 636 (Pestilence,male)
+{
+  F........JJJ....
+  ..F....JJJJ.....
+  B...F.JJJJJ.....
+  ...B..JAAAJ.....
+  .F...JADADAJ....
+  ...F.JAAAAAJ.AA.
+  .B..JFAAAAFJAA..
+  ...FJJAFABJJAA..
+  ..F.JFFBAJJJAAA.
+  ....FAFFJJJJAAA.
+  ....JABAJJJJAAA.
+  ...FJFFJJJJJJAA.
+  ...JJBFJJJJJJAA.
+  ...JAABFBJJJJAA.
+  ..JJFBFAFFAJJJA.
+  .JJAAFAFAAAAAAJ.
+}
+# tile 637 (Pestilence,female)
 {
   F........JJJ....
   ..F....JJJJ.....
@@ -6088,7 +12111,26 @@ Z = (195, 195, 195)
   ..JJFBFAFFAJJJA.
   .JJAAFAFAAAAAAJ.
 }
-# tile 319 (Famine)
+# tile 638 (Famine,male)
+{
+  .........JJJ....
+  .......JJJ......
+  K.....JJJJJ.....
+  K.....JAAAJ.....
+  K....JADADAJ....
+  K....JAAAAAJ...A
+  K.....JAAAJJ..AA
+  OOJJJJJJAAJAJ.AA
+  K...JJJAAJJAJAAA
+  K.....JAJJJOJAA.
+  K.....JAOOOAAA..
+  K.....JAJJAAA...
+  K.....JAJJAA....
+  K.....JAAJAA....
+  K...JJAAAJJAA...
+  K..JJAAAAAJJJA..
+}
+# tile 639 (Famine,female)
 {
   .........JJJ....
   .......JJJ......
@@ -6107,7 +12149,26 @@ Z = (195, 195, 195)
   K...JJAAAJJAA...
   K..JJAAAAAJJJA..
 }
-# tile 320 (mail daemon)
+# tile 640 (mail daemon,male)
+{
+  ...OP.BEEE.PO...
+  ...OOEBEEEEOOD..
+  ..DLOBEEEEOOLDD.
+  .DDDLDDDDDDLDDD.
+  .CCDDDNDDNDDDCC.
+  CCDKDDDDDDDDJCCC
+  CDDKKDDIIDDJJCCD
+  CDDK.KDAADJJECDD
+  CCDKEEKKKJEEKCDD
+  .CCDK.EEEE..CDDD
+  .CCDAE.EENNNCDD.
+  .DDDAEEEENDNDDD.
+  ....BBEEENNNNN..
+  ...BEEEAANNNNNA.
+  ..CDDDAAA.DDDK..
+  ................
+}
+# tile 641 (mail daemon,female)
 {
   ...OP.BEEE.PO...
   ...OOEBEEEEOOD..
@@ -6126,7 +12187,26 @@ Z = (195, 195, 195)
   ..CDDDAAA.DDDK..
   ................
 }
-# tile 321 (djinni)
+# tile 642 (djinni,male)
+{
+  .LL..NNN..LL....
+  ..L..NGNA.L.....
+  ..LAALLLAALA....
+  ..LAAKKKAALA....
+  ...LCKKKCLA.....
+  ....LCKCLA......
+  ....LICLIA..A...
+  ....IIIIEA.AA..A
+  ....EIEEIA.AAAAA
+  ....IEFEAAAAAAAA
+  .....DEAIAAAAA..
+  .....IGIFAAAA...
+  .......FEDAAA...
+  .......I.GEA.A..
+  .........IFED...
+  ................
+}
+# tile 643 (djinni,female)
 {
   .LL..NNN..LL....
   ..L..NGNA.L.....
@@ -6145,7 +12225,26 @@ Z = (195, 195, 195)
   .........IFED...
   ................
 }
-# tile 322 (jellyfish)
+# tile 644 (jellyfish,male)
+{
+  ................
+  .....PBPA.......
+  ...PBBBPBA......
+  ..BBNNBPPBAA....
+  .BBNNPPPBBPAA...
+  PBBBPPPBPBBAAA..
+  BBBPBPPPPPBPAAA.
+  BBPBPPPPPPPBAAA.
+  PBPPBPPPPEPEEE..
+  .PBBPPPEPEPPEE..
+  .PEPBBEEPEEPEE..
+  .PEEEPEEPEEPE...
+  ..PEEPE..PE.P...
+  ..P.EP.EEP..P...
+  ..PEE.P.E..E....
+  .P..E.P..E......
+}
+# tile 645 (jellyfish,female)
 {
   ................
   .....PBPA.......
@@ -6164,7 +12263,26 @@ Z = (195, 195, 195)
   ..PEE.P.E..E....
   .P..E.P..E......
 }
-# tile 323 (piranha)
+# tile 646 (piranha,male)
+{
+  ................
+  ................
+  ................
+  ................
+  ................
+  ....OPP.........
+  .....OPP........
+  ..O..PPAP.....E.
+  ..POPPPPPA...EEE
+  ..PPPPP.PPA.E...
+  ...PP..PPPAAAEE.
+  ..E.PPPPPPPPPE..
+  ..E...PPPPPAA.E.
+  .....E..PPAE....
+  .....E..P.......
+  ....E..E...E....
+}
+# tile 647 (piranha,female)
 {
   ................
   ................
@@ -6183,7 +12301,26 @@ Z = (195, 195, 195)
   .....E..P.......
   ....E..E...E....
 }
-# tile 324 (shark)
+# tile 648 (shark,male)
+{
+  ................
+  ................
+  ................
+  ...............P
+  ........P.....PP
+  ....E..PP....PP.
+  ...E...PPA..PPP.
+  ..EEEEPPPA.PPPPP
+  .E.EEPPP.PPPPPPE
+  ...EP.P.PPPPPEEE
+  ..PPPPPPPPPPEEE.
+  .APPPPPPPPEEEE.E
+  PPPPPPP..EE.....
+  NDPPAPEPPP.E..EE
+  PDNPPEE..EE.....
+  .PPPE..EEE..E...
+}
+# tile 649 (shark,female)
 {
   ................
   ................
@@ -6202,7 +12339,26 @@ Z = (195, 195, 195)
   PDNPPEE..EE.....
   .PPPE..EEE..E...
 }
-# tile 325 (giant eel)
+# tile 650 (giant eel,male)
+{
+  ................
+  ................
+  ................
+  ....AAA.........
+  ...AAOAA...AAA..
+  ..AAAAAAA.AA.AA.
+  ..AAAA.AA.AA.AA.
+  ...AA..AA.AA..A.
+  ......AAA..AA.A.
+  ......AA...AA...
+  .....AAA.E.AA.E.
+  ...E.AAEE.AAAE..
+  ...E.AAEEAAAEE..
+  ..E..AAAAAAE.E..
+  ...EE.AAAAE.E...
+  ..E...EE.E...E..
+}
+# tile 651 (giant eel,female)
 {
   ................
   ................
@@ -6221,7 +12377,26 @@ Z = (195, 195, 195)
   ...EE.AAAAE.E...
   ..E...EE.E...E..
 }
-# tile 326 (electric eel)
+# tile 652 (electric eel,male)
+{
+  ................
+  ................
+  ................
+  ....AAA.........
+  ...AAOAA........
+  ..AAAAAAA.......
+  ..AAAA.AA.......
+  ...AA..AA...DD..
+  ......AAA..DD...
+  ......AA...DD...
+  .....AAA.E.DD.E.
+  ...E.AAEE.DD.E..
+  ...E.AAEEDD.EE..
+  ..E..AAADDDE.E..
+  ...EE.AAADE.E...
+  ..E...EE.E...E..
+}
+# tile 653 (electric eel,female)
 {
   ................
   ................
@@ -6240,7 +12415,26 @@ Z = (195, 195, 195)
   ...EE.AAADE.E...
   ..E...EE.E...E..
 }
-# tile 327 (kraken)
+# tile 654 (kraken,male)
+{
+  ................
+  ................
+  ..FF..FF........
+  ..DDFDDF........
+  ..FFFFF.....GG..
+  ..NCNFF......GFA
+  ..CC.FF.....EGFA
+  ....GFAA.GFAEGFE
+  ...GFFAGFFFFAGFE
+  ...GFAAFFAGFAEEE
+  ..GFFAGFFAGFEEE.
+  EEGFFAGFFAEEEE.E
+  .EGFFAGFFEE.....
+  EEGFFEEEEE.E..EE
+  EEEEEEE..EE.....
+  ..EEE..EEE..E...
+}
+# tile 655 (kraken,female)
 {
   ................
   ................
@@ -6259,7 +12453,7 @@ Z = (195, 195, 195)
   EEEEEEE..EE.....
   ..EEE..EEE..E...
 }
-# tile 328 (newt)
+# tile 656 (newt,male)
 {
   ................
   ................
@@ -6278,7 +12472,45 @@ Z = (195, 195, 195)
   ................
   ................
 }
-# tile 329 (gecko)
+# tile 657 (newt,female)
+{
+  ................
+  ................
+  ................
+  ................
+  ................
+  ......JKKJ......
+  .....CLCCLLC....
+  ....LAAAACCLCA..
+  .......LCCLLLCA.
+  ....LCCCLLLAALA.
+  ....CALLLLAAAA..
+  ...LLLLCLAAA....
+  ...LLAAALLA.....
+  ................
+  ................
+  ................
+}
+# tile 658 (gecko,male)
+{
+  ................
+  ................
+  ...........LLP..
+  ..........LLOOA.
+  ......PO.LLOOOA.
+  ......OOALOOOA..
+  .......LLOOOA...
+  ...POALOOOAA....
+  ...OOLOOOOOOA...
+  ....ALOOOAOPA...
+  ...DOOOOA.AA....
+  ...OOOAOOA......
+  ...OODAOPA......
+  ..F.AA.AA.......
+  ................
+  ................
+}
+# tile 659 (gecko,female)
 {
   ................
   ................
@@ -6297,7 +12529,26 @@ Z = (195, 195, 195)
   ................
   ................
 }
-# tile 330 (iguana)
+# tile 660 (iguana,male)
+{
+  ................
+  ................
+  ................
+  ................
+  ................
+  ....GPGPGGPF....
+  ..GPAAAAFFGPF...
+  .GPAA.PFFGPPPAA.
+  ......FGGPPFPPAA
+  .PFGGGGPPPFAAPPA
+  .FGPAPPPPFAAAAA.
+  .GPPPPFPFAAA.A..
+  .PPFFAFPPAA.....
+  D.AAAAAAPPA.....
+  ................
+  ................
+}
+# tile 661 (iguana,female)
 {
   ................
   ................
@@ -6316,7 +12567,26 @@ Z = (195, 195, 195)
   ................
   ................
 }
-# tile 331 (baby crocodile)
+# tile 662 (baby crocodile,male)
+{
+  ................
+  ................
+  ................
+  ................
+  ................
+  .....FFOFOFA....
+  ....FOGFGGOFF...
+  ....GAAAAFOGFA..
+  ...FAA.GFOGGGFA.
+  ...GFOOOGGGFAGA.
+  ...FGAGGGGFAAA..
+  ..FGGGGFGFAA....
+  ..GGDFAFGGA.....
+  ...D............
+  ................
+  ................
+}
+# tile 663 (baby crocodile,female)
 {
   ................
   ................
@@ -6335,7 +12605,26 @@ Z = (195, 195, 195)
   ................
   ................
 }
-# tile 332 (lizard)
+# tile 664 (lizard,male)
+{
+  ................
+  ................
+  ................
+  ................
+  ................
+  ................
+  ....FFFFGFJ.....
+  ..FFAAAJJGFJ....
+  ......JGFFJFAA..
+  ...JGGGFFJAAFA..
+  ..JFAFFFJAAAA...
+  ..FFFFJJAAA.....
+  .JFAAAAFAA......
+  .D..............
+  ................
+  ................
+}
+# tile 665 (lizard,female)
 {
   ................
   ................
@@ -6354,7 +12643,26 @@ Z = (195, 195, 195)
   ................
   ................
 }
-# tile 333 (chameleon)
+# tile 666 (chameleon,male)
+{
+  ................
+  ................
+  ................
+  .....GGGG.......
+  ...GGGGGGGG.....
+  ...GGFFFFGGFA...
+  ..GPAAAGFFGGFA..
+  .GPAA.PFFGGGGAA.
+  ...GGGGGGGGFGGAA
+  .PGGBBGGGGFAAGGA
+  .FGGABGGGFAAAAA.
+  .GGGGGFGFAAA.A..
+  .DGFFAFGGAA.....
+  D.AAAAAAGGA.....
+  .DD.............
+  ................
+}
+# tile 667 (chameleon,female)
 {
   ................
   ................
@@ -6373,7 +12681,26 @@ Z = (195, 195, 195)
   .DD.............
   ................
 }
-# tile 334 (crocodile)
+# tile 668 (crocodile,male)
+{
+  ................
+  ................
+  ................
+  ................
+  ....FFOFOOFA....
+  ...FOGFGFGOFFA..
+  ..FGAAAAFFOGFFA.
+  .FFAA.GFFOGGGGFA
+  ......FOOGGGGGGA
+  .G.OOOOGGGGFAGGA
+  .FOGAGGGGGFAAAA.
+  FGGGGGFGGFAA....
+  GGDDFAFGGGA.....
+  GDDFAAAAGGA.....
+  .DF.............
+  ................
+}
+# tile 669 (crocodile,female)
 {
   ................
   ................
@@ -6392,7 +12719,26 @@ Z = (195, 195, 195)
   .DF.............
   ................
 }
-# tile 335 (salamander)
+# tile 670 (salamander,male)
+{
+  ................
+  ................
+  ................
+  ......CCC.......
+  ....CCCCCCC.....
+  ...CCDDDDCCDA...
+  ....AAAADDCCDA..
+  ......KDDCCCCAA.
+  ..LLLCCCCCCDCCAA
+  .KLCCCLLLCDAACCA
+  .DCEECLKKDAAAAA.
+  DCCAECDKDAAA.A..
+  CCCCCCDCCAA.....
+  .DAADAAACCA.....
+  ..ACCA..........
+  ...AAA..........
+}
+# tile 671 (salamander,female)
 {
   ................
   ................
@@ -6411,7 +12757,26 @@ Z = (195, 195, 195)
   ..ACCA..........
   ...AAA..........
 }
-# tile 336 (long worm tail)
+# tile 672 (long worm tail,male)
+{
+  ........ILLLL...
+  ......IILLAA....
+  .....ILLAA......
+  .....ILA........
+  .....ILA........
+  ......LLA...II..
+  .......LLIIILLLL
+  ........ILLAAA.L
+  ...IIIILLALL....
+  .ILLLLLAA..LL...
+  ILLAAAA.....LA..
+  ILA.........LA..
+  LLA........LLA..
+  LILA......LLA...
+  .LLLIIIILLLA....
+  ...LLLLLAAA.....
+}
+# tile 673 (long worm tail,female)
 {
   ........ILLLL...
   ......IILLAA....
@@ -6430,7 +12795,26 @@ Z = (195, 195, 195)
   .LLLIIIILLLA....
   ...LLLLLAAA.....
 }
-# tile 337 (archeologist)
+# tile 674 (archeologist,male)
+{
+  ................
+  ................
+  ......KJ.J......
+  ......KJJJ......
+  ....KCKKKJJJ....
+  ......LELEA.....
+  ......LLLLA.....
+  ......ALLA......
+  .....CKAAKJ.AAA.
+  ....CKKKJJJJAAA.
+  ....KACKJJAJAAA.
+  ....LACJKJALAAA.
+  ......CJJKAAAA..
+  .....KCJAJJA.A..
+  .....CJJ.JKJ....
+  ................
+}
+# tile 675 (archeologist,female)
 {
   ................
   ................
@@ -6449,7 +12833,26 @@ Z = (195, 195, 195)
   .....CJJ.JKJ....
   ................
 }
-# tile 338 (barbarian)
+# tile 676 (barbarian,male)
+{
+  ................
+  ................
+  .......HHA......
+  ......HHHHA.....
+  ......LFLFA.....
+  ......LLLLA.....
+  ......ALLA......
+  .....LLAALL.AAA.
+  ....LLLLLLLLAAA.
+  ....LALLLLALAAA.
+  ....LAALLAALAAA.
+  ....LAJJKJALAAA.
+  ......LJJLAAAA..
+  ......LLALAA.A..
+  .....LLA.LLA....
+  ................
+}
+# tile 677 (barbarian,female)
 {
   ................
   ................
@@ -6468,7 +12871,7 @@ Z = (195, 195, 195)
   .....LLA.LLA....
   ................
 }
-# tile 339 (caveman)
+# tile 678 (cave dweller,male)
 {
   ................
   ................
@@ -6487,7 +12890,7 @@ Z = (195, 195, 195)
   ................
   ................
 }
-# tile 340 (cavewoman)
+# tile 679 (cave dweller,female)
 {
   ................
   ................
@@ -6506,7 +12909,26 @@ Z = (195, 195, 195)
   ................
   ................
 }
-# tile 341 (healer)
+# tile 680 (healer,male)
+{
+  ................
+  .......NN.......
+  ......NDDO......
+  ......NNNN......
+  ......ELEP......
+  ......LLLP......
+  .......LLP......
+  ......O..PA.AAA.
+  .....NNOOPPAAAA.
+  ....OOONOPPPAA..
+  ....LANOOPALAA..
+  ......NOOPAAAA..
+  .....NOOOPAA.A..
+  ....NOOOOOPA....
+  ................
+  ................
+}
+# tile 681 (healer,female)
 {
   ................
   .......NN.......
@@ -6525,7 +12947,26 @@ Z = (195, 195, 195)
   ................
   ................
 }
-# tile 342 (knight)
+# tile 682 (knight,male)
+{
+  ................
+  ................
+  .......BPA......
+  ......BPPPA.....
+  ......PEEPA.....
+  ......PLLPA.....
+  ......ALLAA.....
+  .....BBAABB.AAA.
+  ....BPPPPPPPAAA.
+  ....PABPPPAPAAA.
+  ....LA.PP.ALAAA.
+  ......BP.PAAAA..
+  ......BPAPAA.A..
+  .....PPA.PPA....
+  ................
+  ................
+}
+# tile 683 (knight,female)
 {
   ................
   ................
@@ -6544,7 +12985,26 @@ Z = (195, 195, 195)
   ................
   ................
 }
-# tile 343 (monk)
+# tile 684 (monk,male)
+{
+  ................
+  ................
+  .......CCC......
+  ......JCJJJA....
+  ......CAAAJA....
+  ......CAAAJA....
+  ......CKLKCAAAA.
+  .....CDDDDDDAAAA
+  ....CDDLALDDDAAA
+  ....DALLALLADAA.
+  ....DDDDCDDDDAA.
+  .....AACCCDAAAA.
+  .....CDCCCDDA.A.
+  ....CCCCCCCDD...
+  ................
+  ................
+}
+# tile 685 (monk,female)
 {
   ................
   ................
@@ -6563,7 +13023,7 @@ Z = (195, 195, 195)
   ................
   ................
 }
-# tile 344 (priest)
+# tile 686 (cleric,male)
 {
   ................
   ................
@@ -6573,16 +13033,16 @@ Z = (195, 195, 195)
   ......ALLJA.....
   ......IJJIAAAA..
   .....ODDDDDAAAA.
-  ....IDNDDDDDAAA.
-  ...NLNNNDDALAA..
-  ......NDDDAAAA..
+  ....INNDDDDDAAA.
+  ...NLNNDDDALAA..
+  ......DDDDAAAA..
   ......DIIDAAAA..
   .....DDIIDDA.A..
   ....DIIIIIDD....
   ................
   ................
 }
-# tile 345 (priestess)
+# tile 687 (cleric,female)
 {
   ................
   .......JJ.......
@@ -6592,16 +13052,35 @@ Z = (195, 195, 195)
   .....JJLLJJ.....
   .....JEJJEJAAA..
   .....ODEEDDAAAA.
-  ....IDINDDDDAAA.
-  ....L.NNNDALAA..
-  ......INDDAAAA..
-  ......INDDAAAA..
+  ....IDINNDDDAAA.
+  ....L.DNNDALAA..
+  ......IDDDAAAA..
+  ......IDDDAAAA..
   .....DDIIDDA.A..
   ....DIIIIIDD....
   ................
   ................
 }
-# tile 346 (ranger)
+# tile 688 (ranger,male)
+{
+  ................
+  ................
+  ........CJA.....
+  .......CJJJA....
+  .......JEEJA....
+  .......JLLJA....
+  .......ALLAA....
+  ......GGAAGG.AAA
+  .....BPFFFFPPAAA
+  .....PAGFFFAPAAA
+  .....LA.FF.ALAAA
+  .......BP.PAAAA.
+  .......BPAPAA.A.
+  ......PPA.PPA...
+  ................
+  ................
+}
+# tile 689 (ranger,female)
 {
   ................
   ................
@@ -6620,7 +13099,26 @@ Z = (195, 195, 195)
   ................
   ................
 }
-# tile 347 (rogue)
+# tile 690 (rogue,male)
+{
+  ................
+  ................
+  ................
+  .....OA...OA....
+  .....OOIDPPA....
+  ......IDDDA.....
+  ......LKLKA.....
+  ......LLLLA.....
+  ......ALLA......
+  ......BAABAA..A.
+  .....KEBBEJAAAA.
+  ....KAAEEAAKAA..
+  ....LAJJHJALAA..
+  ......KKJKAAAA..
+  .....KKA.KKA....
+  ................
+}
+# tile 691 (rogue,female)
 {
   ................
   ................
@@ -6639,7 +13137,26 @@ Z = (195, 195, 195)
   .....KKA.KKA....
   ................
 }
-# tile 348 (samurai)
+# tile 692 (samurai,male)
+{
+  ................
+  ................
+  .........AA.....
+  .......AAA......
+  ......AAAAA.....
+  .....ALFLFA.....
+  .....ALLLLA.....
+  ......ALLA......
+  ....IIIAAIIIAAA.
+  ....LDIIIIDLAAA.
+  ....LABBBBALAAA.
+  ....LABBBBALAAA.
+  ......IDDDAAAA..
+  ......IDADAA.A..
+  .....IIA.IIA....
+  ................
+}
+# tile 693 (samurai,female)
 {
   ................
   ................
@@ -6658,7 +13175,26 @@ Z = (195, 195, 195)
   .....IIA.IIA....
   ................
 }
-# tile 349 (tourist)
+# tile 694 (tourist,male)
+{
+  ................
+  ................
+  ......JKJJA.....
+  ......KJJJA.....
+  ...JJJJJJJJJJ...
+  ......LFLFAA....
+  ......LLLLA.....
+  ......ALLA......
+  .....HGAAGH.AAA.
+  ....LLGHHGLLAAA.
+  ....LAHGHGALAAA.
+  ....LAHHGHALAAA.
+  ......JJJKAAAA..
+  ......LLALAA.A..
+  .....LLA.LLA....
+  ................
+}
+# tile 695 (tourist,female)
 {
   ................
   ................
@@ -6677,7 +13213,26 @@ Z = (195, 195, 195)
   .....LLA.LLA....
   ................
 }
-# tile 350 (valkyrie)
+# tile 696 (valkyrie,male)
+{
+  D..............D
+  .D............D.
+  ..D...LHHL...D..
+  ...D.HHHHHL.D...
+  ....DHELELHD....
+  ....HDLLLLD.....
+  ...HHHDLLD......
+  ...HJKJDDKJJAAA.
+  ..HHLJJDDJJLAAA.
+  ..H.LADKDCALAAA.
+  ....LDAKKDALAAA.
+  ....D.KKJKDAAA..
+  ...D..KJAJAD.A..
+  ..D..KLA.LKAD...
+  .D...........D..
+  D.............D.
+}
+# tile 697 (valkyrie,female)
 {
   ................
   ................
@@ -6696,7 +13251,26 @@ Z = (195, 195, 195)
   ................
   ................
 }
-# tile 351 (wizard)
+# tile 698 (wizard,male)
+{
+  ................
+  .........BP.....
+  .......BBPE.....
+  ......BPPEA.....
+  ......BAAEA.....
+  ......BAAEA.....
+  ......PLLE......
+  ......PAAEA.AAA.
+  .....BBPBEEAAAA.
+  ....PPPBEEEEAA..
+  ....LABPPEALAA..
+  ......BPPEAAAA..
+  .....BPPPEAA.A..
+  .....BPPPPEA....
+  ....BPPPPPPE....
+  ................
+}
+# tile 699 (wizard,female)
 {
   ................
   .........BP.....
@@ -6715,7 +13289,26 @@ Z = (195, 195, 195)
   ....BPPPPPPE....
   ................
 }
-# tile 352 (Lord Carnarvon)
+# tile 700 (Lord Carnarvon,male)
+{
+  .......JJ.......
+  ......KJJJ......
+  ....KCKKKJJJ....
+  ......LELEA.....
+  ......LLLLA.....
+  ......ALLA......
+  .....CIAAIK.AAA.
+  ....CKKIIKKKAAA.
+  ...KKCKKHKJKKAA.
+  ...KKAKHKJAKKAA.
+  ...KAIHKKJIAKA..
+  ...LAICKKJIALA..
+  .....ICKAJIAAA..
+  ......CKAPAAAA..
+  .....PPA.PPA....
+  ................
+}
+# tile 701 (Lord Carnarvon,female)
 {
   .......JJ.......
   ......KJJJ......
@@ -6734,7 +13327,26 @@ Z = (195, 195, 195)
   .....PPA.PPA....
   ................
 }
-# tile 353 (Pelias)
+# tile 702 (Pelias,male)
+{
+  ................
+  .......JJ.......
+  ......KKKJ......
+  ......LELEA.....
+  ......LLLLA.....
+  ......ALLA......
+  .....CKAAKK.AAA.
+  ....CKKKKKKKAAA.
+  ...KKCKKKKJKKAA.
+  ...KKAKKKKAKKAA.
+  ...KA.CKKJAAKA..
+  ...LA.CKAJAALA..
+  ......CKAJAAAA..
+  ......CKAPAAAA..
+  .....PPA.PPA....
+  ................
+}
+# tile 703 (Pelias,female)
 {
   ................
   .......JJ.......
@@ -6753,7 +13365,26 @@ Z = (195, 195, 195)
   .....PPA.PPA....
   ................
 }
-# tile 354 (Shaman Karnov)
+# tile 704 (Shaman Karnov,male)
+{
+  ................
+  .......JJA......
+  ......JJJJA.....
+  .....JFLFLJ.....
+  .....JLLLLJ.....
+  .....JJDDJA.....
+  ....LHAJJAHLAA..
+  ...LLLHAAHLLLAA.
+  ...LLLLHHLLLLAA.
+  ...LLALHHLALLAA.
+  ...LLALLLLALLAA.
+  ....LACKKJALAAA.
+  ......CKKJAAAA..
+  ......LA.LAA.A..
+  .....LLA.LLA....
+  ................
+}
+# tile 705 (Shaman Karnov,female)
 {
   ................
   .......JJA......
@@ -6772,7 +13403,26 @@ Z = (195, 195, 195)
   .....LLA.LLA....
   ................
 }
-# tile 355 (Earendil)
+# tile 706 (Earendil,male)
+{
+  .........G......
+  ....B..GGF..B...
+  ...BB.GGGGABB...
+  ..BPBPLELEABPB..
+  ..BBBPLLLLABBB..
+  ..PBPPALLAPPP...
+  ...PPBGAAGBBB...
+  ...BBLGGGFLBBB..
+  ..BBLAAGFAALBB..
+  ...BLAGGGFALB...
+  ......GFAF......
+  ......L..L.AAA..
+  ......AAAAAAAA..
+  ....AAAAAAAA....
+  .....AAAAAA.....
+  ................
+}
+# tile 707 (Earendil,female)
 {
   .........G......
   ....B..GGF..B...
@@ -6791,7 +13441,26 @@ Z = (195, 195, 195)
   .....AAAAAA.....
   ................
 }
-# tile 356 (Elwing)
+# tile 708 (Elwing,male)
+{
+  .........G......
+  ....B..GGF..B...
+  ...BB.GGGGABB...
+  ..BPBHLELEHBPB..
+  ..BBBHLLLLHBBB..
+  ..PBHHALLAHHP...
+  ...PHHGAAGHHB...
+  ...BBLGGGFLBBB..
+  ..BBLAAGFAALBB..
+  ...BLAGGGFALB...
+  ......GFAF......
+  ......L..L.AAA..
+  ......AAAAAAAA..
+  ....AAAAAAAA....
+  .....AAAAAA.....
+  ................
+}
+# tile 709 (Elwing,female)
 {
   .........G......
   ....B..GGF..B...
@@ -6810,7 +13479,26 @@ Z = (195, 195, 195)
   .....AAAAAA.....
   ................
 }
-# tile 357 (Hippocrates)
+# tile 710 (Hippocrates,male)
+{
+  ................
+  ....LLLCCD......
+  ...LLCCDDA......
+  ...LAAAADA......
+  ...LBABADA......
+  ...LAAAADA......
+  ...CCLLDD.B.....
+  ....CKKDDFBFAAA.
+  ..LLLCLDDDBFAAA.
+  .CCCCLDDDFBAAA..
+  .LALLCCDDFBDAA..
+  ...LCCCCDABFAA..
+  ...LCCCCDABAAA..
+  ..LLCCCCDAA.AA..
+  .LCCCCCCCDA.....
+  ................
+}
+# tile 711 (Hippocrates,female)
 {
   ................
   ....LLLCCD......
@@ -6829,7 +13517,26 @@ Z = (195, 195, 195)
   .LCCCCCCCDA.....
   ................
 }
-# tile 358 (King Arthur)
+# tile 712 (King Arthur,male)
+{
+  ................
+  ................
+  ......OHHA......
+  .....OHHHHA.....
+  .....HBLBHA.....
+  .....HLLLHA.....
+  .....ALLLAA.....
+  ....BBAAABB.AAA.
+  ...BPPPPPPPPAAA.
+  ...PABPPPPACPAA.
+  ..NNNNNNNNNCLCA.
+  .....BPP.PACAA..
+  .....BPAPPAA.A..
+  .....BPAPPAA.A..
+  ....PPAA.PPA....
+  ................
+}
+# tile 713 (King Arthur,female)
 {
   ................
   ................
@@ -6848,7 +13555,26 @@ Z = (195, 195, 195)
   ....PPAA.PPA....
   ................
 }
-# tile 359 (Grand Master)
+# tile 714 (Grand Master,male)
+{
+  ................
+  .......LL.......
+  ......LLLL......
+  ......LLLL......
+  ..LC.CALLAC.....
+  .CLLC.CAACCCC...
+  .CJLACCCCCCCCC..
+  ..JAACCCCCCCCCC.
+  ..JCCCCCCCCCCC.A
+  ..J..PPPPPLCCAAA
+  ..J..CCCCLLCAAAA
+  ..J..CCCCCCCAAAA
+  ..J..CCCCCCCAAAA
+  ..J.ACCCCCCCAAA.
+  ..JACCCCCCCCAA..
+  ................
+}
+# tile 715 (Grand Master,female)
 {
   ................
   .......LL.......
@@ -6867,7 +13593,26 @@ Z = (195, 195, 195)
   ..JACCCCCCCCAA..
   ................
 }
-# tile 360 (Arch Priest)
+# tile 716 (Arch Priest,male)
+{
+  ..N.............
+  .NNN..JLLJ......
+  ..N...JLLJ......
+  ..N...LLLL......
+  ..LC.CALLAC.....
+  .CLLC.CAACJDK...
+  .CHLACCCCJCCDK..
+  ..HAACCJJCCCCDK.
+  ..HCCCCJCCJCCC.A
+  ..H..DCJCCLJCAAA
+  ..H..DCJCLLCAAAA
+  ..H..KCJCCDJAAAA
+  ..H..KCJCCDJAAAA
+  ..H.ACCJCCDJAAA.
+  ..HACCCJJCCCAA..
+  ................
+}
+# tile 717 (Arch Priest,female)
 {
   ..N.............
   .NNN..JLLJ......
@@ -6886,7 +13631,26 @@ Z = (195, 195, 195)
   ..HACCCJJCCCAA..
   ................
 }
-# tile 361 (Orion)
+# tile 718 (Orion,male)
+{
+  ................
+  ................
+  .......CJA......
+  ......CJJJA.....
+  ......JEEJA.....
+  ......JLLJA.....
+  ......ALLAA.....
+  .....GGAAGG.....
+  ....BGFFFFFP....
+  ....BPFFFFPPAAA.
+  ....PAGFFFAPAAA.
+  ....LANNNNALAAA.
+  ......BP.PAAAAA.
+  ......BP.PAAAA..
+  ......BPAPAA.A..
+  .....PPA.PPA....
+}
+# tile 719 (Orion,female)
 {
   ................
   ................
@@ -6905,7 +13669,26 @@ Z = (195, 195, 195)
   ......BPAPAA.A..
   .....PPA.PPA....
 }
-# tile 362 (Master of Thieves)
+# tile 720 (Master of Thieves,male)
+{
+  ................
+  ...H.....H......
+  ...HHIDKHH......
+  ....IDDDD.......
+  ....LLLLLA......
+  ....LBLBLA......
+  ....LLLLLA......
+  .....LLLA.......
+  ....B.AABAA.....
+  ...KEBBBEJAAA...
+  ..KAEEEEEAJAAA..
+  ..LAJJHHJALAAA..
+  ....JKKKJAAAAA..
+  ....KJAJKAAAA...
+  ...JJA..JJA.....
+  ................
+}
+# tile 721 (Master of Thieves,female)
 {
   ................
   ...H.....H......
@@ -6924,7 +13707,7 @@ Z = (195, 195, 195)
   ...JJA..JJA.....
   ................
 }
-# tile 363 (Lord Sato)
+# tile 722 (Lord Sato,male)
 {
   .....AAA........
   .....AAA........
@@ -6943,7 +13726,45 @@ Z = (195, 195, 195)
   ..IIIA.IIIAA....
   ................
 }
-# tile 364 (Twoflower)
+# tile 723 (Lord Sato,female)
+{
+  .....AAA........
+  .....AAA........
+  ...AAAAAAA......
+  ..AALLLLLAA.....
+  ..ALFFLFFLA.....
+  ..ALLLLLLLA.....
+  ...AALLLA.......
+  IIIIIAAAIIIIAAA.
+  LLDIIIIIIDLLAAA.
+  LLABBBBBBALLAAA.
+  LLABBBBBBALLAAA.
+  LLABBBBBBALLAAA.
+  ...IIDDDDAAAAAA.
+  ...IIAAIDAAA..A.
+  ..IIIA.IIIAA....
+  ................
+}
+# tile 724 (Twoflower,male)
+{
+  ................
+  ................
+  ......JKJJA.....
+  ......KJJJA.....
+  ....JJJJJJJJ....
+  .....NNLNNA.....
+  ....NALNALNA....
+  .....NNANNAA....
+  .....AAAAAA.AAA.
+  ....LLHGHGLLAAA.
+  ....LAGGGGALAAA.
+  ....LAHGHGALAAA.
+  ......JJJKAAAA..
+  ......JJAKAA.A..
+  .....LLA.LLA....
+  ................
+}
+# tile 725 (Twoflower,female)
 {
   ................
   ................
@@ -6962,7 +13783,26 @@ Z = (195, 195, 195)
   .....LLA.LLA....
   ................
 }
-# tile 365 (Norn)
+# tile 726 (Norn,male)
+{
+  ................
+  ................
+  ......NNN.......
+  .....NNNNN......
+  .....NELELN.....
+  ....NNLLLLN.....
+  ...NNNALLA......
+  ...NJKJAAKJJAAA.
+  ..NNLJJKKJJLAAA.
+  ..N.LACKJCALAAA.
+  ....LAKKKKALAAA.
+  ......KKJKAAAA..
+  ......KJAJAA.A..
+  .....KLA.LKA....
+  ................
+  ................
+}
+# tile 727 (Norn,female)
 {
   ................
   ................
@@ -6981,7 +13821,26 @@ Z = (195, 195, 195)
   ................
   ................
 }
-# tile 366 (Neferet the Green)
+# tile 728 (Neferet the Green,male)
+{
+  ................
+  ................
+  ......GGG.......
+  .....GFFFG......
+  ....GFEFEG......
+  ....GFFFFEG.....
+  .N.GPEFFFEE.....
+  .I..BBEAAEA.AA..
+  .I.BBPPBBEEAAAA.
+  .IGBPPPPPEEEAA..
+  .I.PP.EPEAAGAA..
+  .I...BPPPAAAAA..
+  .N...BPPPEAA.A..
+  ....BPPPPPEA....
+  ...BPPPPPPPE....
+  ................
+}
+# tile 729 (Neferet the Green,female)
 {
   ................
   ................
@@ -7000,7 +13859,26 @@ Z = (195, 195, 195)
   ...BPPPPPPPE....
   ................
 }
-# tile 367 (Minion of Huhetotl)
+# tile 730 (Minion of Huhetotl,male)
+{
+  ...OP......PO...
+  ...OODDDDDDOOD..
+  ..DLOOCDDCOOLDD.
+  .DDDLDDDDDDLDDD.
+  .CCDDDNDDNDDDCC.
+  CCDKDDDDDDDDJCCC
+  CDDKKDDIIDDJJCCD
+  CDDKKKDAADJJDCDD
+  CCDKDDKKKJDDKCDD
+  .CCDKKDDDDKKCDDD
+  .CCDADKDDKDACDD.
+  .DDDADDDDDDADDD.
+  ....CCDDDDKKAA..
+  ...CDDDAADDDKAA.
+  ..CDDDAAA.DDDK..
+  ................
+}
+# tile 731 (Minion of Huhetotl,female)
 {
   ...OP......PO...
   ...OODDDDDDOOD..
@@ -7019,7 +13897,26 @@ Z = (195, 195, 195)
   ..CDDDAAA.DDDK..
   ................
 }
-# tile 368 (Thoth Amon)
+# tile 732 (Thoth Amon,male)
+{
+  ................
+  ......OJJO......
+  ......JJJJA.....
+  ......BLBLA.....
+  ......LLLLA.....
+  ......ALLA......
+  .....BPAAPP.AAA.
+  ....BPPPPPPPAAA.
+  ...PPBPPPPJPPAA.
+  ...PPAPPP.APPA.A
+  ...PA.BPP.AAPA.A
+  ...LA.BPP..AL.A.
+  ......BPA.A..A..
+  ......BPAPAAAA..
+  .....PPA.PPA....
+  ................
+}
+# tile 733 (Thoth Amon,female)
 {
   ................
   ......OJJO......
@@ -7038,7 +13935,26 @@ Z = (195, 195, 195)
   .....PPA.PPA....
   ................
 }
-# tile 369 (Chromatic Dragon)
+# tile 734 (Chromatic Dragon,male)
+{
+  ......GGGFA.....
+  .....NFNFEEA....
+  ....GFFFEECA....
+  ..DCHHF..CCA....
+  CHCHCD..BCCA....
+  HD.D...BFFA.....
+  ......OBFAAAAAA.
+  ....HOGFAAAAAAAA
+  ..HOOIEA.EF.AAA.
+  .HOOOIEEEEFFJAA.
+  .HOOOIEEFFFDDAA.
+  HBOOIIEFFFDDCCA.
+  HB.OIEFOODD.CJA.
+  HBAAGE.AADDACCA.
+  ....GFAA...CCJA.
+  ........FFFFJA..
+}
+# tile 735 (Chromatic Dragon,female)
 {
   ......GGGFA.....
   .....NFNFEEA....
@@ -7057,7 +13973,26 @@ Z = (195, 195, 195)
   ....GFAA...CCJA.
   ........FFFFJA..
 }
-# tile 370 (Goblin King)
+# tile 736 (Goblin King,male)
+{
+  ................
+  ................
+  .H..H...H.......
+  CLC.HCHCH.......
+  CLC.HHHHH.......
+  .H..IIIII.......
+  .HK.IHIHI.I.....
+  .HICKIIIJKK.....
+  .H.IIJJJK.AA....
+  .H..JICJJAAAAA..
+  .H..IIIIJAAAAA..
+  ....JIIJJAA.....
+  ....IJKJJA......
+  ...IKAA.IK......
+  ................
+  ................
+}
+# tile 737 (Goblin King,female)
 {
   ................
   ................
@@ -7076,7 +14011,26 @@ Z = (195, 195, 195)
   ................
   ................
 }
-# tile 371 (Cyclops)
+# tile 738 (Cyclops,male)
+{
+  ................
+  ....LLLLL.......
+  ...CLLLLLC......
+  ...LBABNNL......
+  ...LBBBNNLJA....
+  ...CLNNNLCJA....
+  ....LLLLLJAAA...
+  ....LAALLAAAA...
+  ..JKJLLLKAKJAA.A
+  .CLKAJJJJAKLCAAA
+  .LLJKAAAAKJLLAA.
+  .LAAJKKKKJAALAA.
+  .LC.GGGHGGACLAAA
+  .LL.JJJJJJALLAAA
+  ....CJJJCLAAAAAA
+  ..LLLLL.LLLLLAA.
+}
+# tile 739 (Cyclops,female)
 {
   ................
   ....LLLLL.......
@@ -7095,7 +14049,26 @@ Z = (195, 195, 195)
   ....CJJJCLAAAAAA
   ..LLLLL.LLLLLAA.
 }
-# tile 372 (Ixoth)
+# tile 740 (Ixoth,male)
+{
+  ....O......O....
+  ....O......O....
+  ...LOOCDDCOOL...
+  ...DDDDDDDDDDD..
+  .CCDDDGDDGDDDCC.
+  CCDKDDDDDDDDJCCC
+  CDDKKKDIIDJJDCCD
+  CDDKDDKJJJDDDCDD
+  CCDKDDDDDDDDKCDD
+  .CCDKKDDDDKKCDDD
+  .CCDADKDDKDACDD.
+  .DDDADDDDDDADDD.
+  ....CCDDDDKKAA..
+  ...CDDDAADDDKAA.
+  ..CDDDAAA.DDDK..
+  ................
+}
+# tile 741 (Ixoth,female)
 {
   ....O......O....
   ....O......O....
@@ -7114,7 +14087,26 @@ Z = (195, 195, 195)
   ..CDDDAAA.DDDK..
   ................
 }
-# tile 373 (Master Kaen)
+# tile 742 (Master Kaen,male)
+{
+  ................
+  .......KKA......
+  ......KJJKA.....
+  ..KKA.KAAKA.KKA.
+  .KAAKAKDDKAKAAKA
+  .KOOJKKOOKKKOOJA
+  .KJJJJJJJJJKJJJA
+  ..KJJJJJJJJJJJA.
+  ....KJJJJJJJA...
+  ......KJJJAAAAAA
+  .....KJJJJKAAAAA
+  .....KJJJJJAAAAA
+  ....KJJJJJJKAAA.
+  ...KJJJJJJJJKAA.
+  ...KJJJJJJJJJA..
+  ................
+}
+# tile 743 (Master Kaen,female)
 {
   ................
   .......KKA......
@@ -7133,7 +14125,26 @@ Z = (195, 195, 195)
   ...KJJJJJJJJJA..
   ................
 }
-# tile 374 (Nalzok)
+# tile 744 (Nalzok,male)
+{
+  ....O......O....
+  ....O......O....
+  ...LOOCDDCOOL...
+  ...DDDDDDDDDDD..
+  .CCDDDBDDBDDDCC.
+  CCDKDDDDDDDDJCCC
+  CDDKKKDIIDJJDCCD
+  CDDKDDKJJJDDDCDD
+  CCDKDDDDDDDDKCDD
+  .CCDKKDDDDKKCDDD
+  .CCDADKDDKDACDD.
+  .DDDADDDDDDADDD.
+  ....CCDDDDKKAA..
+  ...CDDDAADDDKAA.
+  ..CDDDAAA.DDDK..
+  ................
+}
+# tile 745 (Nalzok,female)
 {
   ....O......O....
   ....O......O....
@@ -7152,7 +14163,26 @@ Z = (195, 195, 195)
   ..CDDDAAA.DDDK..
   ................
 }
-# tile 375 (Scorpius)
+# tile 746 (Scorpius,male)
+{
+  .....JLJLJAA....
+  ....JA.JCJCKAA..
+  ....AJ.....JJJA.
+  ....LA......LCKA
+  .JAKJA......JJJA
+  ..JJA......ALCJA
+  .......ALLAJCJKA
+  ....JJALCCAAJJA.
+  .JJALLAJCJJJAA..
+  JA.LCCAJAJJAAAA.
+  ..JACJJJAAACCJAA
+  GGJJJJJAACCAAAJA
+  .JJGGAJACAAJJAAA
+  D.JJAAJAACA.JAA.
+  ...D...JAAJA.JJ.
+  ........JA.JA...
+}
+# tile 747 (Scorpius,female)
 {
   .....JLJLJAA....
   ....JA.JCJCKAA..
@@ -7171,7 +14201,26 @@ Z = (195, 195, 195)
   ...D...JAAJA.JJ.
   ........JA.JA...
 }
-# tile 376 (Master Assassin)
+# tile 748 (Master Assassin,male)
+{
+  ................
+  ................
+  ................
+  .......AA.......
+  ......AAAA......
+  .....ABLBLA.....
+  .....AAAAAA.....
+  ......AAAA......
+  .....AAAAAA..PP.
+  ....AAAAAAAAPPP.
+  ....AAAAAAAAPPP.
+  ....LAAAAAALPPP.
+  ......AAAAAPPP..
+  ......AAAAAP.P..
+  .....AAA.AAA....
+  ................
+}
+# tile 749 (Master Assassin,female)
 {
   ................
   ................
@@ -7190,7 +14239,26 @@ Z = (195, 195, 195)
   .....AAA.AAA....
   ................
 }
-# tile 377 (Ashikaga Takauji)
+# tile 750 (Ashikaga Takauji,male)
+{
+  ................
+  ................
+  ......AA........
+  .......AAA......
+  ......AAAAA.....
+  .....ALFLFA.....
+  .....ALLLLA.....
+  ......ALLA......
+  ....IIIAAIIIAAA.
+  ....LDIIIIDLAAA.
+  ....LAIIIIALAAA.
+  ....LALHHLALAAA.
+  ......IIIIAAAA..
+  ......IIAIAA.A..
+  .....IIA.IIA....
+  ................
+}
+# tile 751 (Ashikaga Takauji,female)
 {
   ................
   ................
@@ -7209,7 +14277,26 @@ Z = (195, 195, 195)
   .....IIA.IIA....
   ................
 }
-# tile 378 (Lord Surtur)
+# tile 752 (Lord Surtur,male)
+{
+  ....PPDDDDAA....
+  ....PDDDDDDDA...
+  ...PPDLLLLDDA...
+  ...PDPFLLFFDA...
+  ...PPPLLLLLDA...
+  ....PLLAALLAAA..
+  ...PPALLLLBAAAA.
+  ...PPDBBBBBBBAA.
+  ..BDDHDPBPPPPPA.
+  ..PPHDDPBPPPPPA.
+  ..LAHDHPBPPAALAA
+  JLAADDHBBBBAALAA
+  JJLJDHHPBPPPCLAA
+  ..LLJBPPABPPLLAA
+  .....BPPABPPAAAA
+  ...LLLLJ.BLLLKAA
+}
+# tile 753 (Lord Surtur,female)
 {
   ....PPDDDDAA....
   ....PDDDDDDDA...
@@ -7228,7 +14315,7 @@ Z = (195, 195, 195)
   .....BPPABPPAAAA
   ...LLLLJ.BLLLKAA
 }
-# tile 379 (Dark One)
+# tile 754 (Dark One,male)
 {
   ................
   ......AAA.......
@@ -7247,7 +14334,45 @@ Z = (195, 195, 195)
   AAAAAAAAAAAAAAAA
   ................
 }
-# tile 380 (student)
+# tile 755 (Dark One,female)
+{
+  ................
+  ......AAA.......
+  .....AAAAA......
+  .....ADADA......
+  .....AAAAA......
+  ....AAAAAAA.....
+  ....AAAAAAA.....
+  ...AAAAAAAAA....
+  ...AAAAAAAAA....
+  ..AAAAAAAAAAA...
+  ..AAAAAAAAAAA...
+  ...AAAAAAAAA....
+  ...AAAAAAAAAA...
+  ..AAAAAAAAAAAA..
+  AAAAAAAAAAAAAAAA
+  ................
+}
+# tile 756 (student,male)
+{
+  ................
+  ................
+  .....GGFGG......
+  .......G........
+  ......NDND......
+  ...DDDDDDDD.....
+  ......LELEA.....
+  ......LLLLA.....
+  ......ALLA......
+  .....CKAAKJ.AAA.
+  ....CKKKJJJJAAA.
+  ....KACKJJAJAAA.
+  ....LACJKJALAAA.
+  .....KCJAJJA.A..
+  .....CJJ.JKJ....
+  ................
+}
+# tile 757 (student,female)
 {
   ................
   ................
@@ -7266,7 +14391,26 @@ Z = (195, 195, 195)
   .....CJJ.JKJ....
   ................
 }
-# tile 381 (chieftain)
+# tile 758 (chieftain,male)
+{
+  ................
+  ................
+  .......HHA......
+  ......HHHHA.....
+  ......LFLFA.....
+  ......LLLLA.....
+  .....HALLAH.....
+  ....LLHAAHLLAAA.
+  ....LLLIILLLAAA.
+  ....LALIILALAAA.
+  ....LAALLAALAAA.
+  ....LAJJKJALAAA.
+  ......LJJLAAAA..
+  ......LLALAA.A..
+  .....LLA.LLA....
+  ................
+}
+# tile 759 (chieftain,female)
 {
   ................
   ................
@@ -7285,7 +14429,26 @@ Z = (195, 195, 195)
   .....LLA.LLA....
   ................
 }
-# tile 382 (neanderthal)
+# tile 760 (neanderthal,male)
+{
+  ................
+  ................
+  ................
+  ......JJJJ......
+  .....JJJJJJ.....
+  .....JFLFLJ.....
+  .....JLLLLJ.....
+  .....JJDDJA.....
+  ....JJAJJAJJ.AA.
+  ...JLLJAAJLLJAA.
+  ...LLALJJLALLAA.
+  ....LALCCLALAAA.
+  ......LA.LAA.A..
+  .....LLA.LLA....
+  ................
+  ................
+}
+# tile 761 (neanderthal,female)
 {
   ................
   ................
@@ -7304,7 +14467,26 @@ Z = (195, 195, 195)
   ................
   ................
 }
-# tile 383 (High-elf)
+# tile 762 (High-elf,male)
+{
+  .........G......
+  .......GGF......
+  ......GGGGA.....
+  ......LILIA.....
+  ......LLLLA.....
+  ......ALLA......
+  ......GAAG..AA..
+  .....LGGGFLAAAA.
+  ....LAAGFAALAAA.
+  ....LA.GFAALAA..
+  ....LA.GFAALAA..
+  ....LAGGGFAL.A..
+  ......GFAFAA.A..
+  ......GFAFAA....
+  ......GFAFAA....
+  .....KLA.LKA....
+}
+# tile 763 (High-elf,female)
 {
   .........G......
   .......GGF......
@@ -7323,7 +14505,26 @@ Z = (195, 195, 195)
   ......GFAFAA....
   .....KLA.LKA....
 }
-# tile 384 (attendant)
+# tile 764 (attendant,male)
+{
+  ................
+  ................
+  ................
+  ......JJJ.......
+  .....JLLLJ......
+  ......BLB.......
+  .....CLLLD......
+  .....CCKKDA.AAA.
+  .....LLCLDDAAAA.
+  ....CCCLDDDDAA..
+  ....LALCCDALAA..
+  ......LCCDAAAA..
+  .....LCCCDAA.A..
+  ....LCCCCCDA....
+  ................
+  ................
+}
+# tile 765 (attendant,female)
 {
   ................
   ................
@@ -7342,7 +14543,26 @@ Z = (195, 195, 195)
   ................
   ................
 }
-# tile 385 (page)
+# tile 766 (page,male)
+{
+  ................
+  ................
+  .......BPA......
+  ......BPPPA.....
+  ......PEEPA.....
+  ......PLLPA.....
+  .......LLAA.....
+  ......BAABA.AAA.
+  .....BPPPPPAAAA.
+  ....PABPPPAPAAA.
+  ....LA.PP.ALAAA.
+  ......BP.PAAAA..
+  ......LLALAA.A..
+  .....LLA.LLA....
+  ................
+  ................
+}
+# tile 767 (page,female)
 {
   ................
   ................
@@ -7361,7 +14581,26 @@ Z = (195, 195, 195)
   ................
   ................
 }
-# tile 386 (abbot)
+# tile 768 (abbot,male)
+{
+  ................
+  ................
+  ................
+  ................
+  ................
+  ......KLK.......
+  ......LLL.......
+  ....CCLLLJJ.....
+  ....KCKLKKJAAA..
+  ....CDDDDDDAAAA.
+  ...CDDLALDDDAAA.
+  ...DALLALLADAA..
+  ...DDDDCDDDDAA..
+  ....AACCCDAAAA..
+  ....CDCCCDDA.A..
+  ...CCCCCCCDD....
+}
+# tile 769 (abbot,female)
 {
   ................
   ................
@@ -7380,7 +14619,26 @@ Z = (195, 195, 195)
   ....CDCCCDDA.A..
   ...CCCCCCCDD....
 }
-# tile 387 (acolyte)
+# tile 770 (acolyte,male)
+{
+  ................
+  ................
+  ................
+  ......JJJJ......
+  ......JLLJA.....
+  ......LLLLA.....
+  ......ALLJA.....
+  ......CJJCAAAA..
+  .....LDDDDDAAAA.
+  ....CDCCDDDDAAA.
+  ....L.LCCDALAA..
+  ......LCCDAAAA..
+  ......LCCDAAAA..
+  .....LDCCDDA.A..
+  ....LCCCCCDD....
+  ................
+}
+# tile 771 (acolyte,female)
 {
   ................
   ................
@@ -7399,7 +14657,26 @@ Z = (195, 195, 195)
   ....LCCCCCDD....
   ................
 }
-# tile 388 (hunter)
+# tile 772 (hunter,male)
+{
+  ................
+  ................
+  ................
+  ....J..CJA......
+  ...J..CJJJA.....
+  ...J..JEEJA.....
+  ..J...JLLJA.....
+  ..J...ALLAA.....
+  ..J..GGAAGG.AAA.
+  ..LPBPFFFFPPAAA.
+  ..J..AGFFFAPAAA.
+  ..J....FF.ALAAA.
+  ...J..BP.PAAAA..
+  ...J..BPAPAA.A..
+  ....JPPA.PPA....
+  ................
+}
+# tile 773 (hunter,female)
 {
   ................
   ................
@@ -7418,7 +14695,26 @@ Z = (195, 195, 195)
   ....JPPA.PPA....
   ................
 }
-# tile 389 (thug)
+# tile 774 (thug,male)
+{
+  ................
+  ................
+  ................
+  .......ID.......
+  ......IDDDA.....
+  ......LKLKA.....
+  ......LLLLA.....
+  ......ALLA......
+  .....KKAAKKA..A.
+  ....KKJKKJJKAAA.
+  ....KAAJJAAKAA..
+  ....LAJJJJALAA..
+  ......KKJKAAAA..
+  ......KAAKAAAA..
+  .....KKA.KKA....
+  ................
+}
+# tile 775 (thug,female)
 {
   ................
   ................
@@ -7437,7 +14733,26 @@ Z = (195, 195, 195)
   .....KKA.KKA....
   ................
 }
-# tile 390 (ninja)
+# tile 776 (ninja,male)
+{
+  ................
+  ................
+  .........AA.....
+  .......AAA......
+  ......AAAAA.....
+  .....AFLFLA.....
+  .....AAAAAA.....
+  ......AAAA......
+  ....AAAAAAAA.PP.
+  ....AAAAAAAAPPP.
+  ....AAAAAAAAPPP.
+  ....LAAAAAALPPP.
+  ......AAAAAPPP..
+  ......AAAAAP.P..
+  .....AAA.AAA....
+  ................
+}
+# tile 777 (ninja,female)
 {
   ................
   ................
@@ -7456,7 +14771,26 @@ Z = (195, 195, 195)
   .....AAA.AAA....
   ................
 }
-# tile 391 (roshi)
+# tile 778 (roshi,male)
+{
+  ................
+  ................
+  ................
+  .......AAAAA....
+  ......AAAAA.....
+  .....ALFLFA.....
+  .....ALLLLA.....
+  ......ALLA......
+  ....PPPAAPPPAAA.
+  ....L.PPPP.LAAA.
+  ....LAOOOOALAAA.
+  ....LAOOOOALAAA.
+  ......P...AAAA..
+  ......P.A.AA.A..
+  .....PPA.PPA....
+  ................
+}
+# tile 779 (roshi,female)
 {
   ................
   ................
@@ -7475,7 +14809,26 @@ Z = (195, 195, 195)
   .....PPA.PPA....
   ................
 }
-# tile 392 (guide)
+# tile 780 (guide,male)
+{
+  ................
+  ................
+  ......JKJJA.....
+  ......KJJJA.....
+  ....JJJJJJJJ....
+  ......LFLFAA....
+  ......LLLLA.....
+  ......ALLA......
+  .....HHAAHH.AAA.
+  ....LLHHHHLLAAA.
+  ....LAHHHHALAAA.
+  ....LAHHHHALAAA.
+  ......JJJKAAAA..
+  ......JJAKAA.A..
+  .....LLA.LLA....
+  ................
+}
+# tile 781 (guide,female)
 {
   ................
   ................
@@ -7494,7 +14847,26 @@ Z = (195, 195, 195)
   .....LLA.LLA....
   ................
 }
-# tile 393 (warrior)
+# tile 782 (warrior,male)
+{
+  .....O....O.....
+  .....NO..ON.....
+  ......NPPN......
+  .....PPPPPP.....
+  .....PELELP.....
+  ....HHLLLLH.....
+  ...HHHALLA......
+  ...HJKJAAKJJAAA.
+  ..HHLJJKKJJLAAA.
+  ..H.LACKJCALAAA.
+  ....LAAKKAALAAA.
+  ......KKJKAAAA..
+  ......KJAJAA.A..
+  ......KJAJAA.A..
+  .....KLA.LKA....
+  ................
+}
+# tile 783 (warrior,female)
 {
   .....O....O.....
   .....NO..ON.....
@@ -7513,7 +14885,26 @@ Z = (195, 195, 195)
   .....KLA.LKA....
   ................
 }
-# tile 394 (apprentice)
+# tile 784 (apprentice,male)
+{
+  ................
+  ................
+  ................
+  ......JJJ.......
+  .....JLLLJ......
+  ......GLG.......
+  .....BLLLE......
+  .....BBEEEA.AAA.
+  .....BBPBEEAAAA.
+  ....PPPBEEEEAA..
+  ....LABPPEALAA..
+  ......BPPEAAAA..
+  .....BPPPEAA.A..
+  .....BPPPPEA....
+  ....BPPPPPPE....
+  ................
+}
+# tile 785 (apprentice,female)
 {
   ................
   ................
@@ -7532,7 +14923,7 @@ Z = (195, 195, 195)
   ....BPPPPPPE....
   ................
 }
-# tile 395 (invisible monster)
+# tile 786 (invisible monster, nogender)
 {
   ................
   ................
index 490a2c432ab2c4573a6d88157f82c1fddf3cd003..6811721e3395f4caf636e79ab94d071d2353d7e9 100644 (file)
@@ -3,10 +3,7 @@
 /* NetHack may be freely redistributed.  See license for details. */
 
 /* must #define SAFEPROCS in xxxconf.h or via CFLAGS or this won't compile */
-#include "config.h"
-#include "color.h"
-#include "wintype.h"
-#include "winprocs.h"
+#include "hack.h"
 
 /*
  * ***********************************************************
@@ -324,11 +321,12 @@ int x, y;
  *  Print the glyph to the output device.  Don't flush the output device.
  */
 void
-safe_print_glyph(window, x, y, glyph, bkglyph)
+safe_print_glyph(window, x, y, glyph, bkglyph, glyphmod)
 winid window;
 xchar x, y;
 int glyph;
 int bkglyph UNUSED;
+int glyphmod[NUM_GLYPHMOD] UNUSED;
 {
     return;
 }
index 0adefc332d569b68115f46c91a3f2d9ada4db0d6..c7766a63b14ca3c6444d0f44d2a54ac007464199 100644 (file)
 
 #define Fprintf (void) fprintf
 
-const char *FDECL(tilename, (int, int));
+/*
+ * Defining OBTAIN_TILEMAP to get a listing of the tile-mappings
+ * for debugging purposes requires that your link to produce
+ * the tilemap utility must also include:
+ *   objects.o, monst.o drawing.o
+ */
+/* #define OBTAIN_TILEMAP */
+
+#if defined(OBTAIN_TILEMAP) && !defined(TILETEXT)
+FILE *tilemap_file;
+#endif
+
+const char *FDECL(tilename, (int, int, int));
 void NDECL(init_tilemap);
 void FDECL(process_substitutions, (FILE *));
-boolean FDECL(acceptable_tilename, (int, const char *, const char *));
+boolean FDECL(acceptable_tilename, (int, int, const char *, const char *));
 
 #if defined(MICRO) || defined(WIN32)
 #undef exit
@@ -34,17 +46,14 @@ extern void FDECL(exit, (int));
 #define STATUES_LOOK_LIKE_MONSTERS
 #endif
 
-#define MON_GLYPH 1
-#define OBJ_GLYPH 2
-#define OTH_GLYPH 3 /* fortunately unnecessary */
-
+enum {MON_GLYPH, OBJ_GLYPH, OTH_GLYPH, TERMINATOR = -1};
 #define EXTRA_SCROLL_DESCR_COUNT ((SCR_BLANK_PAPER - SCR_STINKING_CLOUD) - 1)
 
 /* note that the ifdefs here should be the opposite sense from monst.c/
  * objects.c/rm.h
  */
 
-struct conditionals {
+struct conditionals_t {
     int sequence, predecessor;
     const char *name;
 } conditionals[] = {
@@ -56,7 +65,7 @@ struct conditionals {
     { MON_GLYPH, PM_BABY_SILVER_DRAGON, "baby shimmering dragon" },
     { MON_GLYPH, PM_SILVER_DRAGON, "shimmering dragon" },
     { MON_GLYPH, PM_JABBERWOCK, "vorpal jabberwock" },
-    { MON_GLYPH, PM_VAMPIRE_LORD, "vampire mage" },
+    { MON_GLYPH, PM_VAMPIRE_LEADER, "vampire mage" },
 #ifndef CHARON /* not supported yet */
     { MON_GLYPH, PM_CROESUS, "Charon" },
 #endif
@@ -79,7 +88,7 @@ struct conditionals {
     { OBJ_GLYPH, SCR_STINKING_CLOUD + EXTRA_SCROLL_DESCR_COUNT,
       "stamped / mail" },
 #endif
-    { 0, 0, 0 }
+    { TERMINATOR, 0, 0 }
 };
 
 /*
@@ -103,42 +112,42 @@ struct substitute {
                     { GLYPH_CMAP_OFF + S_vwall, GLYPH_CMAP_OFF + S_trwall,
                       "sokoban walls", "In_sokoban(plev)" } };
 
-#ifdef TILETEXT
-
+#if defined(TILETEXT) || defined(OBTAIN_TILEMAP)
 /*
- * entry is the position of the tile within the monsters/objects/other set
+ * file_entry is the position of the tile within the monsters/objects/other set
  */
 const char *
-tilename(set, entry)
-int set, entry;
+tilename(set, file_entry, gend)
+int set, file_entry, gend;
 {
-    int i, j, condnum, tilenum;
+    int i, j, condnum, tilenum, gendnum;
     static char buf[BUFSZ];
 
     (void) def_char_to_objclass(']');
 
-    condnum = tilenum = 0;
+    condnum = tilenum = gendnum = 0;
 
     for (i = 0; i < NUMMONS; i++) {
-        if (set == MON_GLYPH && tilenum == entry)
-            return mons[i].mname;
-        tilenum++;
-        while (conditionals[condnum].sequence == MON_GLYPH
-               && conditionals[condnum].predecessor == i) {
-            if (set == MON_GLYPH && tilenum == entry)
-                return conditionals[condnum].name;
-            condnum++;
-            tilenum++;
+        if (set == MON_GLYPH && tilenum == file_entry && gend == 0)
+            return mons[i].pmnames[NEUTRAL];
+        for (condnum = 0; conditionals[condnum].sequence != -1; ++condnum) {
+            if (conditionals[condnum].sequence == MON_GLYPH
+                && conditionals[condnum].predecessor == i) {
+                tilenum += 2;
+                if (set == MON_GLYPH && tilenum == file_entry)
+                    return conditionals[condnum].name;
+            }
         }
+        tilenum += 2;
     }
-    if (set == MON_GLYPH && tilenum == entry)
+    if (set == MON_GLYPH && tilenum == file_entry)
         return "invisible monster";
 
     tilenum = 0; /* set-relative number */
     for (i = 0; i < NUM_OBJECTS; i++) {
         /* prefer to give the description - that's all the tile's
          * appearance should reveal */
-        if (set == OBJ_GLYPH && tilenum == entry) {
+        if (set == OBJ_GLYPH && tilenum == file_entry) {
             if (!obj_descr[i].oc_descr)
                 return obj_descr[i].oc_name;
             if (!obj_descr[i].oc_name)
@@ -148,20 +157,20 @@ int set, entry;
                     obj_descr[i].oc_name);
             return buf;
         }
-
-        tilenum++;
-        while (conditionals[condnum].sequence == OBJ_GLYPH
-               && conditionals[condnum].predecessor == i) {
-            if (set == OBJ_GLYPH && tilenum == entry)
-                return conditionals[condnum].name;
-            condnum++;
-            tilenum++;
+       for (condnum = 0; conditionals[condnum].sequence != -1; ++condnum) {
+            if (conditionals[condnum].sequence == OBJ_GLYPH
+                && conditionals[condnum].predecessor == i) {
+                tilenum++;
+                if (set == OBJ_GLYPH && tilenum == file_entry)
+                    return conditionals[condnum].name;
+            }
         }
+        tilenum++;
     }
 
     tilenum = 0; /* set-relative number */
     for (i = 0; i < (MAXPCHARS - MAXEXPCHARS); i++) {
-        if (set == OTH_GLYPH && tilenum == entry) {
+        if (set == OTH_GLYPH && tilenum == file_entry) {
             if (*defsyms[i].explanation) {
                 return defsyms[i].explanation;
             } else {
@@ -169,18 +178,19 @@ int set, entry;
                 return buf;
             }
         }
-        tilenum++;
-        while (conditionals[condnum].sequence == OTH_GLYPH
-               && conditionals[condnum].predecessor == i) {
-            if (set == OTH_GLYPH && tilenum == entry)
-                return conditionals[condnum].name;
-            condnum++;
-            tilenum++;
+       for (condnum = 0; conditionals[condnum].sequence != -1; ++condnum) {
+            if (conditionals[condnum].sequence == OTH_GLYPH
+                && conditionals[condnum].predecessor == i) {
+                tilenum++;
+                if (set == OTH_GLYPH && tilenum == file_entry)
+                    return conditionals[condnum].name;
+            }
         }
+        tilenum++;
     }
     /* explosions */
     tilenum = MAXPCHARS - MAXEXPCHARS;
-    i = entry - tilenum;
+    i = file_entry - tilenum;
     if (i < (MAXEXPCHARS * EXPL_MAX)) {
         if (set == OTH_GLYPH) {
             static const char *explosion_types[] = {
@@ -195,7 +205,7 @@ int set, entry;
     }
     tilenum += (MAXEXPCHARS * EXPL_MAX);
 
-    i = entry - tilenum;
+    i = file_entry - tilenum;
     if (i < (NUM_ZAP << 2)) {
         if (set == OTH_GLYPH) {
             Sprintf(buf, "zap %d %d", i / 4, i % 4);
@@ -204,7 +214,7 @@ int set, entry;
     }
     tilenum += (NUM_ZAP << 2);
 
-    i = entry - tilenum;
+    i = file_entry - tilenum;
     if (i < WARNCOUNT) {
         if (set == OTH_GLYPH) {
             Sprintf(buf, "warning %d", i);
@@ -213,7 +223,7 @@ int set, entry;
     }
     tilenum += WARNCOUNT;
 
-    i = entry - tilenum;
+    i = file_entry - tilenum;
     if (i < 1) {
         if (set == OTH_GLYPH) {
             Sprintf(buf, "unexplored");
@@ -222,17 +232,17 @@ int set, entry;
     }
     tilenum += 1;
 
-    i = entry - tilenum;
+    i = file_entry - tilenum;
     if (i < 1) {
         if (set == OTH_GLYPH) {
             Sprintf(buf, "nothing");
             return buf;
         }
     }
-    tilenum += 1;
+    tilenum++;
 
     for (i = 0; i < SIZE(substitutes); i++) {
-        j = entry - tilenum;
+        j = file_entry - tilenum;
         if (j <= substitutes[i].last_glyph - substitutes[i].first_glyph) {
             if (set == OTH_GLYPH) {
                 Sprintf(buf, "sub %s %d", substitutes[i].sub_name, j);
@@ -242,12 +252,12 @@ int set, entry;
         tilenum += substitutes[i].last_glyph - substitutes[i].first_glyph + 1;
     }
 
-    Sprintf(buf, "unknown %d %d", set, entry);
+    Sprintf(buf, "unknown %d %d", set, file_entry);
     return buf;
 }
+#endif
 
-#else /* TILETEXT */
-
+#ifndef TILETEXT
 #define TILE_FILE "tile.c"
 
 #ifdef AMIGA
@@ -260,7 +270,14 @@ int set, entry;
 #endif
 #endif
 
-short tilemap[MAX_GLYPH];
+struct tilemap_t {
+    short tilenum;
+#ifdef OBTAIN_TILEMAP
+    char name[80];
+    int glyph;
+#endif
+} tilemap[MAX_GLYPH];
+
 
 #ifdef STATUES_LOOK_LIKE_MONSTERS
 int lastmontile, lastobjtile, lastothtile, laststatuetile;
@@ -275,7 +292,8 @@ int lastmontile, lastobjtile, lastothtile;
  * set up array to map glyph numbers to tile numbers
  *
  * assumes tiles are numbered sequentially through monsters/objects/other,
- * with entries for all supported compilation options
+ * with entries for all supported compilation options. monsters have two
+ * tiles for each (male + female).
  *
  * "other" contains cmap and zaps (the swallow sets are a repeated portion
  * of cmap), as well as the "flash" glyphs for the new warning system
@@ -286,20 +304,21 @@ init_tilemap()
 {
     int i, j, condnum, tilenum;
     int corpsetile, swallowbase;
+    int file_entry = 0;
 
     for (i = 0; i < MAX_GLYPH; i++) {
-        tilemap[i] = -1;
+        tilemap[i].tilenum = -1;
     }
 
-    corpsetile = NUMMONS + NUM_INVIS_TILES + CORPSE;
-    swallowbase = NUMMONS + NUM_INVIS_TILES + NUM_OBJECTS + S_sw_tl;
+    corpsetile =  NUMMONS + NUMMONS + NUM_INVIS_TILES + CORPSE;
+    swallowbase = NUMMONS + NUMMONS + NUM_INVIS_TILES + NUM_OBJECTS + S_sw_tl;
 
     /* add number compiled out */
-    for (i = 0; conditionals[i].sequence; i++) {
+    for (i = 0; conditionals[i].sequence != TERMINATOR; i++) {
         switch (conditionals[i].sequence) {
         case MON_GLYPH:
-            corpsetile++;
-            swallowbase++;
+            corpsetile += 2;
+            swallowbase += 2;
             break;
         case OBJ_GLYPH:
             if (conditionals[i].predecessor < CORPSE)
@@ -313,116 +332,238 @@ init_tilemap()
         }
     }
 
-    condnum = tilenum = 0;
+#ifdef OBTAIN_TILEMAP
+    tilemap_file = fopen("tilemappings.lst", "w");
+#endif
+    tilenum = 0;
     for (i = 0; i < NUMMONS; i++) {
-        tilemap[GLYPH_MON_OFF + i] = tilenum;
-        tilemap[GLYPH_PET_OFF + i] = tilenum;
-        tilemap[GLYPH_DETECT_OFF + i] = tilenum;
-        tilemap[GLYPH_RIDDEN_OFF + i] = tilenum;
-        tilemap[GLYPH_BODY_OFF + i] = corpsetile;
+#ifdef OBTAIN_TILEMAP
+        char buf[256];
+#endif
+        tilemap[GLYPH_MON_OFF + i].tilenum = tilenum;
+        tilemap[GLYPH_PET_OFF + i].tilenum = tilenum;
+        tilemap[GLYPH_DETECT_OFF + i].tilenum = tilenum;
+        tilemap[GLYPH_RIDDEN_OFF + i].tilenum = tilenum;
+        tilemap[GLYPH_BODY_OFF + i].tilenum = corpsetile;
         j = GLYPH_SWALLOW_OFF + 8 * i;
-        tilemap[j] = swallowbase;
-        tilemap[j + 1] = swallowbase + 1;
-        tilemap[j + 2] = swallowbase + 2;
-        tilemap[j + 3] = swallowbase + 3;
-        tilemap[j + 4] = swallowbase + 4;
-        tilemap[j + 5] = swallowbase + 5;
-        tilemap[j + 6] = swallowbase + 6;
-        tilemap[j + 7] = swallowbase + 7;
-        tilenum++;
-        while (conditionals[condnum].sequence == MON_GLYPH
-               && conditionals[condnum].predecessor == i) {
-            condnum++;
-            tilenum++;
+        tilemap[j].tilenum = swallowbase;
+        tilemap[j + 1].tilenum = swallowbase + 1;
+        tilemap[j + 2].tilenum = swallowbase + 2;
+        tilemap[j + 3].tilenum = swallowbase + 3;
+        tilemap[j + 4].tilenum = swallowbase + 4;
+        tilemap[j + 5].tilenum = swallowbase + 5;
+        tilemap[j + 6].tilenum = swallowbase + 6;
+        tilemap[j + 7].tilenum = swallowbase + 7;
+#ifdef OBTAIN_TILEMAP
+        Sprintf(buf, "%s (%d)", tilename(MON_GLYPH, file_entry, 0), file_entry);
+        Sprintf(tilemap[GLYPH_MON_OFF + i].name,
+                "%s (%d)", buf, i);
+        Sprintf(tilemap[GLYPH_PET_OFF + i].name,
+                "%s %s (%d)", buf, "pet", i);
+        Sprintf(tilemap[GLYPH_DETECT_OFF + i].name,
+                "%s %s (%d)", buf, "detected", i);
+        Sprintf(tilemap[GLYPH_RIDDEN_OFF + i].name,
+                "%s %s (%d)", buf, "ridden", i);
+        Sprintf(tilemap[GLYPH_BODY_OFF + i].name,
+                "%s %s (%d)", buf, "corpse", i);
+        Sprintf(tilemap[j + 0].name, "%s swallow0 (%d)", buf, i);
+        Sprintf(tilemap[j + 1].name, "%s swallow1 (%d)", buf, i);
+        Sprintf(tilemap[j + 2].name, "%s swallow2 (%d)", buf, i);
+        Sprintf(tilemap[j + 3].name, "%s swallow3 (%d)", buf, i);
+        Sprintf(tilemap[j + 4].name, "%s swallow4 (%d)", buf, i);
+        Sprintf(tilemap[j + 5].name, "%s swallow5 (%d)", buf, i);
+        Sprintf(tilemap[j + 6].name, "%s swallow6 (%d)", buf, i);
+        Sprintf(tilemap[j + 7].name, "%s swallow7 (%d)", buf, i);
+#endif
+        for (condnum = 0; conditionals[condnum].sequence != -1; condnum++) {
+            if (conditionals[condnum].sequence == MON_GLYPH
+                && conditionals[condnum].predecessor == i) {
+                tilenum += 2;
+                file_entry += 2;
+#ifdef OBTAIN_TILEMAP
+                Fprintf(tilemap_file, "skipping monst %s (%d)\n",
+                        tilename(MON_GLYPH, file_entry, 0), file_entry);
+#endif
+            }
         }
+        tilenum += 2;  /* male + female tiles for each */
+        file_entry += 2;
     }
-    tilemap[GLYPH_INVISIBLE] = tilenum++;
+    tilemap[GLYPH_INVISIBLE].tilenum = tilenum++;
+    file_entry++;
+#ifdef OBTAIN_TILEMAP
+    Sprintf(tilemap[GLYPH_INVISIBLE].name,
+            "%s (%d)", "invisible mon", file_entry);
+#endif
     lastmontile = tilenum - 1;
 
+    file_entry = 0;
     for (i = 0; i < NUM_OBJECTS; i++) {
-        tilemap[GLYPH_OBJ_OFF + i] = tilenum;
-        tilenum++;
-        while (conditionals[condnum].sequence == OBJ_GLYPH
-               && conditionals[condnum].predecessor == i) {
-            condnum++;
-            tilenum++;
+        tilemap[GLYPH_OBJ_OFF + i].tilenum = tilenum;
+#ifdef OBTAIN_TILEMAP
+        Sprintf(tilemap[GLYPH_OBJ_OFF + i].name, "%s (%d)",
+                tilename(OBJ_GLYPH, file_entry, 0), file_entry);
+#endif
+        for (condnum = 0; conditionals[condnum].sequence != -1; condnum++) {
+            if (conditionals[condnum].sequence == OBJ_GLYPH
+                && conditionals[condnum].predecessor == i) {
+                tilenum++;
+                file_entry++;
+#ifdef OBTAIN_TILEMAP
+                Fprintf(tilemap_file, "skipping obj %s (%d)\n",
+                        tilename(OBJ_GLYPH, file_entry, 0), file_entry);
+#endif
+            }
         }
+        tilenum++;
+        file_entry++;
     }
     lastobjtile = tilenum - 1;
 
+    file_entry = 0;
     for (i = 0; i < (MAXPCHARS - MAXEXPCHARS); i++) {
-        tilemap[GLYPH_CMAP_OFF + i] = tilenum;
+        tilemap[GLYPH_CMAP_OFF + i].tilenum = tilenum;
+#ifdef OBTAIN_TILEMAP
+        Sprintf(tilemap[GLYPH_CMAP_OFF + i].name, "cmap %s (%d)",
+                tilename(OTH_GLYPH, file_entry, 0), file_entry);
+#endif
         tilenum++;
-        while (conditionals[condnum].sequence == OTH_GLYPH
-               && conditionals[condnum].predecessor == i) {
-            condnum++;
-            tilenum++;
+        file_entry++;
+        for (condnum = 0; conditionals[condnum].sequence != -1; condnum++) {
+            if (conditionals[condnum].sequence == OTH_GLYPH
+                && conditionals[condnum].predecessor == i) {
+                tilenum++;
+                file_entry++;
+#ifdef OBTAIN_TILEMAP
+                Fprintf(tilemap_file, "skipping cmap %s (%d)\n",
+                        tilename(OTH_GLYPH, file_entry, 0), file_entry);
+#endif
+            }
         }
     }
 
     for (i = 0; i < (MAXEXPCHARS * EXPL_MAX); i++) {
-        tilemap[GLYPH_EXPLODE_OFF + i] = tilenum;
-        tilenum++;
-        while (conditionals[condnum].sequence == OTH_GLYPH
-               && conditionals[condnum].predecessor == (i + MAXPCHARS)) {
-            condnum++;
-            tilenum++;
+        tilemap[GLYPH_EXPLODE_OFF + i].tilenum = tilenum;
+#ifdef OBTAIN_TILEMAP
+        Sprintf(tilemap[GLYPH_EXPLODE_OFF + i].name, "explosion %s (%d)",
+                tilename(OTH_GLYPH, file_entry, 0), file_entry);
+#endif
+        for (condnum = 0; conditionals[condnum].sequence != -1; condnum++) {
+            if (conditionals[condnum].sequence == OTH_GLYPH
+                && conditionals[condnum].predecessor == i + MAXPCHARS) {
+                tilenum++;
+                file_entry++;
+#ifdef OBTAIN_TILEMAP
+                Fprintf(tilemap_file, "skipping explosion %s (%d)\n",
+                        tilename(OTH_GLYPH, file_entry, 0), file_entry);
+#endif
+            }
         }
+        tilenum++;
+        file_entry++;
     }
 
     for (i = 0; i < NUM_ZAP << 2; i++) {
-        tilemap[GLYPH_ZAP_OFF + i] = tilenum;
+        tilemap[GLYPH_ZAP_OFF + i].tilenum = tilenum;
+#ifdef OBTAIN_TILEMAP
+        Sprintf(tilemap[GLYPH_ZAP_OFF + i].name, "zap %s (%d)",
+                tilename(OTH_GLYPH, file_entry, 0), file_entry);
+#endif
         tilenum++;
-        while (conditionals[condnum].sequence == OTH_GLYPH
+        file_entry++;
+        for (condnum = 0; conditionals[condnum].sequence != -1; condnum++) {
+            if (conditionals[condnum].sequence == OTH_GLYPH
                && conditionals[condnum].predecessor == (i + MAXEXPCHARS)) {
-            condnum++;
-            tilenum++;
+#ifdef OBTAIN_TILEMAP
+                Fprintf(tilemap_file, "skipping zap %s (%d)\n",
+                        tilename(OTH_GLYPH, file_entry, 0), file_entry);
+#endif
+                file_entry++;
+                tilenum++;
+           }
         }
     }
 
     for (i = 0; i < WARNCOUNT; i++) {
-        tilemap[GLYPH_WARNING_OFF + i] = tilenum;
+        tilemap[GLYPH_WARNING_OFF + i].tilenum = tilenum;
+#ifdef OBTAIN_TILEMAP
+        Sprintf(tilemap[GLYPH_WARNING_OFF + i].name, "%s (%d)",
+                tilename(OTH_GLYPH, file_entry, 0), file_entry);
+#endif
         tilenum++;
+        file_entry++;
     }
 
     for (i = 0; i < 1; i++) {
-        tilemap[GLYPH_UNEXPLORED_OFF + i] = tilenum;
+        tilemap[GLYPH_UNEXPLORED_OFF + i].tilenum = tilenum;
+#ifdef OBTAIN_TILEMAP
+        Sprintf(tilemap[GLYPH_UNEXPLORED_OFF + i].name, "unexplored %s (%d)",
+                tilename(OTH_GLYPH, file_entry, 0), file_entry);
+#endif
         tilenum++;
+        file_entry++;
     }
 
     for (i = 0; i < 1; i++) {
-        tilemap[GLYPH_NOTHING + i] = tilenum;
+        tilemap[GLYPH_NOTHING + i].tilenum = tilenum;
+#ifdef OBTAIN_TILEMAP
+        Sprintf(tilemap[GLYPH_NOTHING + i].name, " nothing %s (%d)",
+                tilename(OTH_GLYPH, file_entry, 0), file_entry);
+#endif
         tilenum++;
+        file_entry++;
     }
 
 #ifndef STATUES_LOOK_LIKE_MONSTERS
     /* statue patch: statues still use the same glyph as in vanilla */
 
     for (i = 0; i < NUMMONS; i++) {
-        tilemap[GLYPH_STATUE_OFF + i] = tilemap[GLYPH_OBJ_OFF + STATUE];
+        tilemap[GLYPH_STATUE_OFF + i].tilenum = tilemap[GLYPH_OBJ_OFF + STATUE];
+#ifdef OBTAIN_TILEMAP
+        Sprintf(tilemap[GLYPH_STATUE_OFF + i].name, "%s (%d)",
+                tilename(OTH_GLYPH, file_entry, 0), file_entry);
+#endif
     }
 #endif
 
     lastothtile = tilenum - 1;
 
 #ifdef STATUES_LOOK_LIKE_MONSTERS
-    /* skip over the substitutes to get to the grayscale statues */
+    file_entry = 0;
+    /* fast-forward over the substitutes to grayscale statues loc */
     for (i = 0; i < SIZE(substitutes); i++) {
         tilenum += substitutes[i].last_glyph - substitutes[i].first_glyph + 1;
     }
 
     /* statue patch: statues look more like the monster */
-    condnum = 0; /* doing monsters again, so reset */
     for (i = 0; i < NUMMONS; i++) {
-        tilemap[GLYPH_STATUE_OFF + i] = tilenum;
-        tilenum++;
-        while (conditionals[condnum].sequence == MON_GLYPH
-               && conditionals[condnum].predecessor == i) {
-            condnum++;
-            tilenum++;
+        tilemap[GLYPH_STATUE_OFF + i].tilenum = tilenum;
+#ifdef OBTAIN_TILEMAP
+        Sprintf(tilemap[GLYPH_STATUE_OFF + i].name, "statue of %s (%d)",
+                tilename(MON_GLYPH, file_entry, 0), file_entry);
+#endif
+        for (condnum = 0; conditionals[condnum].sequence != -1; condnum++) {
+            if (conditionals[condnum].sequence == MON_GLYPH
+                && conditionals[condnum].predecessor == i) {
+                file_entry += 2;   /* skip female tile too */
+                tilenum += 2;
+#ifdef OBTAIN_TILEMAP
+                Fprintf(tilemap_file, "skipping statue of %s (%d)\n",
+                        tilename(MON_GLYPH, file_entry, 0), file_entry);
+#endif
+            }
         }
+        tilenum += 2;
+        file_entry += 2;
+    }
+    laststatuetile = tilenum - 2;
+#endif /* STATUES_LOOK_LIKE_MONSTERS */
+#ifdef OBTAIN_TILEMAP
+    for (i = 0; i < MAX_GLYPH; ++i) {
+        Fprintf(tilemap_file, "[%04d] [%04d] %-80s\n",
+                i, tilemap[i].tilenum, tilemap[i].name);
     }
-    laststatuetile = tilenum - 1;
+    fclose(tilemap_file);
 #endif
 }
 
@@ -451,8 +592,8 @@ FILE *ofp;
             Fprintf(ofp, "short std_tiles%d[] = { ", span);
             for (k = substitutes[i].first_glyph;
                  k < substitutes[i].last_glyph; k++)
-                Fprintf(ofp, "%d, ", tilemap[k]);
-            Fprintf(ofp, "%d };\n", tilemap[substitutes[i].last_glyph]);
+                Fprintf(ofp, "%d, ", tilemap[k].tilenum);
+            Fprintf(ofp, "%d };\n", tilemap[substitutes[i].last_glyph].tilenum);
         }
     }
 
@@ -503,6 +644,11 @@ FILE *ofp;
     Fprintf(ofp, "\nint total_tiles_used = %d;\n", start);
 }
 
+#ifdef OBTAIN_TILEMAP
+extern void NDECL(monst_globals_init);
+extern void NDECL(objects_globals_init);
+#endif
+
 int
 main()
 {
@@ -510,6 +656,11 @@ main()
     char filename[30];
     FILE *ofp;
 
+#ifdef OBTAIN_TILEMAP
+    objects_globals_init();
+    monst_globals_init();
+#endif
+
     init_tilemap();
 
     /*
@@ -526,7 +677,7 @@ main()
     Fprintf(ofp, "\nshort glyph2tile[MAX_GLYPH] = {\n");
 
     for (i = 0; i < MAX_GLYPH; i++) {
-        Fprintf(ofp, " %4d,", tilemap[i]);
+        Fprintf(ofp, " %4d,", tilemap[i].tilenum);
         if ((i % 12) == 11 || i == MAX_GLYPH - 1)
             Fprintf(ofp, "\n");
     }
@@ -654,17 +805,20 @@ struct {
 };
 
 boolean
-acceptable_tilename(idx, encountered, expected)
-int idx;
+acceptable_tilename(glyph_set, idx, encountered, expected)
+int glyph_set, idx;
 const char *encountered, *expected;
 {
-    if (idx >= 0 && idx < SIZE(altlabels)) {
-        if (!strcmp(altlabels[idx].expectedlabel, expected)) {
-            if (!strcmp(altlabels[idx].betterlabel, encountered))
-                return TRUE;
+    if (glyph_set == OTH_GLYPH) {
+        if (idx >= 0 && idx < SIZE(altlabels)) {
+            if (!strcmp(altlabels[idx].expectedlabel, expected)) {
+                if (!strcmp(altlabels[idx].betterlabel, encountered))
+                    return TRUE;
+            }
         }
+        return FALSE;
     }
-    return FALSE;
+    return TRUE;
 }
 
 /*tilemap.c*/
index d078c4e371be865563a47309f85e2bab3190f0a5..0970e0e14d3b36521d3b12db3aba11a8e7fc2ad2 100644 (file)
@@ -26,13 +26,15 @@ static const char *text_sets[] = { "monsters.txt", "objects.txt",
                                    "other.txt" };
 #endif
 
-extern const char *FDECL(tilename, (int, int));
-extern boolean FDECL(acceptable_tilename, (int, const char *, const char *));
+extern const char *FDECL(tilename, (int, int, int));
+extern boolean FDECL(acceptable_tilename, (int, int, const char *, const char *));
 static void FDECL(read_text_colormap, (FILE *));
 static boolean FDECL(write_text_colormap, (FILE *));
 static boolean FDECL(read_txttile, (FILE *, pixel (*)[TILE_X]));
 static void FDECL(write_txttile, (FILE *, pixel (*)[TILE_X]));
 
+enum { MONSTER_SET, OBJECT_SET, OTHER_SET};
+
 /* Ugh.  DICE doesn't like %[A-Z], so we have to spell it out... */
 #define FORMAT_STRING                                                       \
     "%[ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.] = " \
@@ -108,29 +110,37 @@ read_txttile(txtfile, pixels)
 FILE *txtfile;
 pixel (*pixels)[TILE_X];
 {
-    int ph, i, j, k;
-    char buf[BUFSZ], ttype[BUFSZ];
+    int ph, i, j, k, reslt;
+    char buf[BUFSZ], ttype[BUFSZ], gend[BUFSZ];
     const char *p;
     char c[2];
+    static int gidx = 0;
 
-    if (fscanf(txtfile, "# %s %d (%[^)])", ttype, &i, buf) <= 0)
+    gend[0] = '\0';
+    if (tile_set == MONSTER_SET)
+        reslt = fscanf(txtfile, "# %s %d (%[^,],%[^)])", ttype, &i, buf, gend);
+    else
+        reslt = fscanf(txtfile, "# %s %d (%[^)])", ttype, &i, buf);
+    if (reslt <= 0)
         return FALSE;
 
+    if (tile_set == MONSTER_SET && gend[0] == 'f')
+        gidx = 1;
+
     ph = strcmp(ttype, "placeholder") == 0;
 
     if (!ph && strcmp(ttype, "tile") != 0)
         Fprintf(stderr, "Keyword \"%s\" unexpected for entry %d\n", ttype, i);
 
-    if (tile_set != 0) {
-        /* check tile name, but not relative number, which will
-         * change when tiles are added
-         */
-        p = tilename(tile_set, tile_set_indx);
-        if (p && strcmp(p, buf) && !acceptable_tilename(tile_set_indx,buf,p)) {
-            Fprintf(stderr, "warning: for tile %d (numbered %d) of %s,\n",
-                    tile_set_indx, i, text_sets[tile_set - 1]);
-            Fprintf(stderr, "\tfound '%s' while expecting '%s'\n", buf, p);
-        }
+    /* check tile name, but not relative number, which will
+     * change when tiles are added
+     */
+    p = tilename(tile_set, tile_set_indx, gidx);
+    if (p && strcmp(p, buf)
+        && !acceptable_tilename(tile_set, tile_set_indx, buf, p)) {
+        Fprintf(stderr, "warning: for tile %d (numbered %d) of %s,\n",
+                tile_set_indx, i, text_sets[tile_set]);
+        Fprintf(stderr, "\tfound '%s' while expecting '%s'\n", buf, p);
     }
     tile_set_indx++;
 
@@ -196,21 +206,26 @@ pixel (*pixels)[TILE_X];
 {
     const char *p;
     const char *type;
-    int i, j, k;
+    int i = 0, j, k;
 
     if (memcmp(placeholder, pixels, sizeof(placeholder)) == 0)
         type = "placeholder";
     else
         type = "tile";
 
-    if (tile_set == 0)
-        Fprintf(txtfile, "# %s %d (unknown)\n", type, tile_set_indx);
-    else {
-        p = tilename(tile_set, tile_set_indx);
-        if (p)
-            Fprintf(txtfile, "# %s %d (%s)\n", type, tile_set_indx, p);
-        else
-            Fprintf(txtfile, "# %s %d (null)\n", type, tile_set_indx);
+    if (tile_set == MONSTER_SET) {
+        for (i = 0; i < 2; ++i) {
+            Fprintf(txtfile, "# %s %d (unknown,%s)\n", type, tile_set_indx,
+                    i ? "female" : "male");
+            if (i == 0)
+                tile_set_indx++;
+        }
+    } else {
+            p = tilename(tile_set, tile_set_indx, i);
+            if (p)
+                Fprintf(txtfile, "# %s %d (%s)\n", type, tile_set_indx, p);
+            else
+                Fprintf(txtfile, "# %s %d (null)\n", type, tile_set_indx);
     }
     tile_set_indx++;
 
@@ -302,7 +317,7 @@ const char *type;
     tile_set = 0;
     for (i = 0; i < SIZE(text_sets); i++) {
         if (!strcmp(p, text_sets[i]))
-            tile_set = i + 1;
+            tile_set = i;
     }
     tile_set_indx = 0;
 
index b37da9b118e610b349b1be89491cccc3a14b278a..c6e425d70ea6e1969de2b2adc11cb0c246a77610 100644 (file)
@@ -129,7 +129,7 @@ VDECLCB(shim_mark_synch,(void), "v")
 VDECLCB(shim_wait_synch,(void), "v")
 VDECLCB(shim_cliparound,(int x, int y), "vii", A2P x, A2P y)
 VDECLCB(shim_update_positionbar,(char *posbar), "vp", P2V posbar)
-VDECLCB(shim_print_glyph,(winid w, int x, int y, int glyph, int bkglyph), "viiiii", A2P w, A2P x, A2P y, A2P glyph, A2P bkglyph)
+VDECLCB(shim_print_glyph,(winid w, int x, int y, int glyph, int bkglyph, int glyphmod[NUM_GLYPHMOD]), "viiiii", A2P w, A2P x, A2P y, A2P glyph, A2P bkglyph, A2P glyphmod)
 VDECLCB(shim_raw_print,(const char *str), "vs", P2V str)
 VDECLCB(shim_raw_print_bold,(const char *str), "vs", P2V str)
 DECLCB(int, shim_nhgetch,(void), "i")
@@ -311,4 +311,4 @@ EM_JS(void, local_callback, (const char *cb_name, const char *shim_name, void *r
 })
 #endif /* __EMSCRIPTEN__ */
 
-#endif /* SHIM_GRAPHICS */
\ No newline at end of file
+#endif /* SHIM_GRAPHICS */
index a0ebef942c2ec3cd55674c6354f502c7cb1ca833..c59ea8fe5952fa850c177f2b2840fcc2895ea771 100644 (file)
@@ -3415,15 +3415,15 @@ int x, y;
  */
 
 void
-tty_print_glyph(window, x, y, glyph, bkglyph)
+tty_print_glyph(window, x, y, glyph, bkglyph, glyphmod)
 winid window;
 xchar x, y;
 int glyph;
 int bkglyph UNUSED;
+unsigned *glyphmod;     /* don't mark UNUSED as we need to revisit */
 {
-    int ch;
     boolean inverse_on = FALSE;
-    int color;
+    int ch, color;
     unsigned special;
 
     HUPSKIP();
@@ -3433,8 +3433,10 @@ int bkglyph UNUSED;
             return;
     }
 #endif
-    /* map glyph to character and color */
-    (void) mapglyph(glyph, &ch, &color, &special, x, y, 0);
+    /* get glyph ttychar, color, and special flags */
+    ch = (int) glyphmod[GM_TTYCHAR];
+    color = (int) glyphmod[GM_COLOR];
+    special = glyphmod[GM_FLAGS];
 
     print_vt_code2(AVTC_SELECT_WINDOW, window);
 
index 34cb1a9cbbe41a3492c41b1bea5968855040fc6a..4a84e190a6f8ec667c7cc4e710bd32aaa1d1dd53 100644 (file)
@@ -37,8 +37,8 @@ typedef struct mswin_nethack_map_window {
 
     int map[COLNO][ROWNO];      /* glyph map */
     int bkmap[COLNO][ROWNO];    /* backround glyph map */
+    unsigned glyphmod[COLNO][ROWNO][NUM_GLYPHMOD];
     boolean mapDirty[COLNO][ROWNO]; /* dirty flag for map */
-
     int mapMode;                /* current map mode */
     boolean bAsciiMode;         /* switch ASCII/tiled mode */
     boolean bFitToScreenMode;   /* switch Fit map to screen mode on/off */
@@ -86,7 +86,7 @@ static void nhcoord2display(PNHMapWindow data, int x, int y, LPRECT lpOut);
 static void paint(PNHMapWindow data, int i, int j);
 static void dirtyAll(PNHMapWindow data);
 static void dirty(PNHMapWindow data, int i, int j);
-static void setGlyph(PNHMapWindow data, int i, int j, int fg, int bg);
+static void setGlyph(PNHMapWindow data, int i, int j, int fg, int bg, unsigned *glyphmod);
 static void clearAll(PNHMapWindow data);
 
 #if (VERSION_MAJOR < 4) && (VERSION_MINOR < 4) && (PATCHLEVEL < 2)
@@ -639,7 +639,7 @@ onMSNHCommand(HWND hWnd, WPARAM wParam, LPARAM lParam)
     case MSNH_MSG_PRINT_GLYPH: {
         PMSNHMsgPrintGlyph msg_data = (PMSNHMsgPrintGlyph) lParam;
         setGlyph(data, msg_data->x, msg_data->y, 
-            msg_data->glyph, msg_data->bkglyph);
+            msg_data->glyph, msg_data->bkglyph, msg_data->glyphmod);
     } break;
 
     case MSNH_MSG_CLIPAROUND: {
@@ -708,8 +708,10 @@ onMSNHCommand(HWND hWnd, WPARAM wParam, LPARAM lParam)
         PMSNHMsgGetText msg_data = (PMSNHMsgGetText) lParam;
         size_t index;
         int col, row;
+#if 0
         int color;
-        unsigned special;
+        unsigned special = 0U;
+#endif
         int mgch;
 
         index = 0;
@@ -717,13 +719,14 @@ onMSNHCommand(HWND hWnd, WPARAM wParam, LPARAM lParam)
             for (col = 0; col < COLNO; col++) {
                 if (index >= msg_data->max_size)
                     break;
-                if (data->map[col][row] == NO_GLYPH) {
+                if (data->map[col][row] == NO_GLYPH)
                     mgch = ' ';
-                } else {
-                    (void) mapglyph(data->map[col][row], &mgch, &color,
-                                    &special, col, row, 0);
-                }
-                msg_data->buffer[index] = mgch;
+
+//                } else {
+//                    (void) mapglyph(data->map[col][row], &mgch, &color,
+//                                    &special, col, row, 0);
+//                }
+                msg_data->buffer[index] = data->glyphmod[col][row][GM_TTYCHAR];
                 index++;
             }
             if (index >= msg_data->max_size - 1)
@@ -785,9 +788,9 @@ paintTile(PNHMapWindow data, int i, int j, RECT * rect)
     int glyph, bkglyph;
     int layer;
 #ifdef USE_PILEMARK
-    int color;
-    unsigned special;
-    int mgch;
+//    int color;
+//    unsigned special = 0U;
+//    int mgch;
 #endif
     layer = 0;
     glyph = data->map[i][j];
@@ -811,8 +814,16 @@ paintTile(PNHMapWindow data, int i, int j, RECT * rect)
         layer++;
     }
 
+//    (void) mapglyph(glyph, &mgch, &color, &special, i, j, 0);
+//                      mgch = (int) data.glyphmod[GM_TTYCHAR];
+//                      color = (int) data.glyphmod[GM_COLOR];
+//                      special = glyphmod[GM_FLAGS];
+
     if ((glyph != NO_GLYPH) && (glyph != bkglyph)) {
+        /* rely on NetHack core helper routine */
         ntile = glyph2tile[glyph];
+        if (data->glyphmod[i][j][GM_FLAGS] & MG_FEMALE)
+            ntile++;
         t_x = TILEBMP_X(ntile);
         t_y = TILEBMP_Y(ntile);
 
@@ -834,9 +845,9 @@ paintTile(PNHMapWindow data, int i, int j, RECT * rect)
 
 #ifdef USE_PILEMARK
     /* rely on NetHack core helper routine */
-    (void) mapglyph(data->map[i][j], &mgch, &color, &special,
-                    i, j, 0);
-    if ((glyph != NO_GLYPH) && (special & MG_PET)
+//    (void) mapglyph(data->map[i][j], &mgch, &color, &special,
+//                    i, j, 0);
+    if ((glyph != NO_GLYPH) && (data->glyphmod[i][j][GM_FLAGS] & MG_PET)
 #else
     if ((glyph != NO_GLYPH) && glyph_is_pet(glyph)
 #endif
@@ -859,7 +870,7 @@ paintTile(PNHMapWindow data, int i, int j, RECT * rect)
         DeleteDC(hdcPetMark);
     }
 #ifdef USE_PILEMARK
-    if ((glyph != NO_GLYPH) && (special & MG_OBJPILE)
+    if ((glyph != NO_GLYPH) && (data->glyphmod[i][j][GM_FLAGS] & MG_OBJPILE)
         && iflags.hilite_pile) {
         /* apply pilemark transparently over other image */
         HDC hdcPileMark;
@@ -893,8 +904,8 @@ paintGlyph(PNHMapWindow data, int i, int j, RECT * rect)
         char ch;
         WCHAR wch;
         int color;
-        unsigned special;
-        int mgch;
+//        unsigned special;
+//        int mgch;
         HBRUSH back_brush;
         COLORREF OldFg;
 
@@ -909,11 +920,12 @@ paintGlyph(PNHMapWindow data, int i, int j, RECT * rect)
         OldFg = SetTextColor(hDC, nhcolor_to_RGB(color));
     #else
         /* rely on NetHack core helper routine */
-        (void) mapglyph(data->map[i][j], &mgch, &color,
-                        &special, i, j, 0);
-        ch = (char) mgch;
-        if (((special & MG_PET) && iflags.hilite_pet)
-            || ((special & (MG_DETECT | MG_BW_LAVA))
+//        (void) mapglyph(data->map[i][j], &mgch, &color,
+//                        &special, i, j, 0);
+        ch = (char) data->glyphmod[i][j][GM_TTYCHAR];
+        color = (int) data->glyphmod[i][j][GM_COLOR];
+        if (((data->glyphmod[i][j][GM_FLAGS] & MG_PET) && iflags.hilite_pet)
+            || ((data->glyphmod[i][j][GM_FLAGS] & (MG_DETECT | MG_BW_LAVA))
                 && iflags.use_inverse)) {
             back_brush =
                 CreateSolidBrush(nhcolor_to_RGB(CLR_GRAY));
@@ -972,13 +984,19 @@ paintGlyph(PNHMapWindow data, int i, int j, RECT * rect)
     }
 }
 
-static void setGlyph(PNHMapWindow data, int i, int j, int fg, int bg)
+static void setGlyph(PNHMapWindow data, int i, int j, int fg, int bg, unsigned *glyphmod)
 {
-    if ((data->map[i][j] != fg) || (data->bkmap[i][j] != bg)) {
+    int gm;
+
+    if ((data->map[i][j] != fg) || (data->bkmap[i][j] != bg)
+        || data->glyphmod[i][j][GM_TTYCHAR] != glyphmod[GM_TTYCHAR]
+        || data->glyphmod[i][j][GM_COLOR] != glyphmod[GM_COLOR]
+        || data->glyphmod[i][j][GM_FLAGS] != glyphmod[GM_FLAGS]) {
         data->map[i][j] = fg;
         data->bkmap[i][j] = bg;
         data->mapDirty[i][j] = TRUE;
-
+        for (gm = 0; gm < NUM_GLYPHMOD; ++gm)
+            data->glyphmod[i][j][gm] = glyphmod[gm];
         RECT rect;
         nhcoord2display(data, i, j, &rect);
         InvalidateRect(data->hWnd, &rect, FALSE);
@@ -991,6 +1009,9 @@ static void clearAll(PNHMapWindow data)
         for (int y = 0; y < ROWNO; y++) {
             data->map[x][y] = NO_GLYPH;
             data->bkmap[x][y] = NO_GLYPH;
+            data->glyphmod[x][y][GM_TTYCHAR] = ' ';
+            data->glyphmod[x][y][GM_COLOR] = NO_COLOR;
+            data->glyphmod[x][y][GM_FLAGS] = 0U;
             data->mapDirty[x][y] = TRUE;
         }
     InvalidateRect(data->hWnd, NULL, FALSE);
index 07fe86791aed3911f331cd2a0194d1477ed7f485..431d426ca61719e402e344704b4a3ca0e464d331 100644 (file)
@@ -38,6 +38,7 @@ typedef struct mswin_nhmsg_print_glyph {
     XCHAR_P y;
     int glyph;
     int bkglyph;
+    int glyphmod[NUM_GLYPHMOD];
 } MSNHMsgPrintGlyph, *PMSNHMsgPrintGlyph;
 
 typedef struct mswin_nhmsg_cliparound {
index a439deca5cbd177863ee917a561fdd7f0dff61d7..efebf6160d89a80e3518a9ce795cf3172ff401ef 100644 (file)
@@ -1281,7 +1281,7 @@ mswin_cliparound(int x, int y)
 }
 
 /*
-print_glyph(window, x, y, glyph, bkglyph)
+print_glyph(window, x, y, glyph, bkglyph, glyphmod)
                 -- Print the glyph at (x,y) on the given window.  Glyphs are
                    integers at the interface, mapped to whatever the window-
                    port wants (symbol, font, color, attributes, ...there's
@@ -1290,12 +1290,15 @@ print_glyph(window, x, y, glyph, bkglyph)
                   graphical or tiled environments to allow the depiction
                   to fall against a background consistent with the grid 
                   around x,y.
+                -- glyphmod provides extended information about the glyph
+                   that window ports can use to enhance the display in
+                   various ways.
                    
 */
 void
-mswin_print_glyph(winid wid, XCHAR_P x, XCHAR_P y, int glyph, int bkglyph)
+mswin_print_glyph(winid wid, XCHAR_P x, XCHAR_P y, int glyph, int bkglyph, unsigned *glyphmod)
 {
-    logDebug("mswin_print_glyph(%d, %d, %d, %d, %d)\n", wid, x, y, glyph, bkglyph);
+    logDebug("mswin_print_glyph(%d, %d, %d, %d, %d, %lu)\n", wid, x, y, glyph, bkglyph, glyphmod);
 
     if ((wid >= 0) && (wid < MAXWINDOWS)
         && (GetNHApp()->windowlist[wid].win != NULL)) {
@@ -1306,6 +1309,9 @@ mswin_print_glyph(winid wid, XCHAR_P x, XCHAR_P y, int glyph, int bkglyph)
         data.y = y;
         data.glyph = glyph;
         data.bkglyph = bkglyph;
+        data.glyphmod[GM_TTYCHAR] = glyphmod[GM_TTYCHAR];
+        data.glyphmod[GM_COLOR] = glyphmod[GM_COLOR];
+        data.glyphmod[GM_FLAGS] = glyphmod[GM_FLAGS];
         SendMessage(GetNHApp()->windowlist[wid].win, WM_MSNH_COMMAND,
                     (WPARAM) MSNH_MSG_PRINT_GLYPH, (LPARAM) &data);
     }
index 17cb8d2efe0130104296393f6977d2b84338824a..6ec4e9c3b1dd769f4cef2f6514190c99921699d0 100644 (file)
@@ -162,7 +162,7 @@ void mswin_update_inventory(void);
 void mswin_mark_synch(void);
 void mswin_wait_synch(void);
 void mswin_cliparound(int x, int y);
-void mswin_print_glyph(winid wid, XCHAR_P x, XCHAR_P y, int glyph, int bkglyph);
+void mswin_print_glyph(winid wid, XCHAR_P x, XCHAR_P y, int glyph, int bkglyph, unsigned *glyphmod);
 void mswin_raw_print(const char *str);
 void mswin_raw_print_bold(const char *str);
 void mswin_raw_print_flush();