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
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
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
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
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
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 */
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,
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 {
#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 */
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 ### */
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 *));
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 ### */
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));
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)
#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"
#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
** mextra.h -- collection of all monster extensions
*/
struct mextra {
- char *mname;
+ char *mgivenname;
struct egd *egd;
struct epri *epri;
struct eshk *eshk;
* 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)
#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))
#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 */
#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))
#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 */
* Incrementing EDITLEVEL can be used to force invalidation of old bones
* and save files.
*/
-#define EDITLEVEL 29
+#define EDITLEVEL 30
/*
* Development status possibilities.
#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 */
/* 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 */
#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);
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);
#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);
#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));
#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));
#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);
#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);
}; /* end of `struct you' */
#define Upolyd (u.umonnum != u.umonster)
+#define Ugender ((Upolyd ? u.mfemale : flags.female) ? 1 : 0)
#endif /* YOU_H */
humanoid(mptr) ? "person" : "creature");
what = buf;
} else {
- what = mptr->mname;
+ what = pmname(mptr, NEUTRAL);
if (!type_is_pname(mptr))
what = The(what);
}
|| 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;
} 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);
}
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" */
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);
}
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);
}
}
/* 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]))
} 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 },
#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)
* 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
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')
*/
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
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))
#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
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;
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
}
}
+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.
*/
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);
}
show_glyph(x, y, glyph)
int x, y, glyph;
{
+#ifndef UNBUFFERED_GLYPHMOD
+ unsigned glyphmod[NUM_GLYPHMOD];
+#endif
+
/*
* Check for bad positions and glyphs.
*/
text = "monster";
offset = glyph;
}
-
impossible("show_glyph: bad pos %d %d with glyph %d [%s %d].", x, y,
glyph, text, offset);
return;
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)
} \
}
+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.
*/
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--) {
{
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));
}
}
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;
}
}
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
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 ------------------------------------------------------------- */
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 *));
/* 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) */
{
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;
}
}
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;
/* 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;
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')
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;
{
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;
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
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));
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 *
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
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);
}
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
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;
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 *
/* 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");
} 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 */
char *code;
{
static char buf[BUFSZ];
- char *mname;
+ char *mnam;
int name;
#define BOGUSMONSIZE 100 /* arbitrary */
&& (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
}
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 */
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 */
/* 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 */
&& 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",
}
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;
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);
/* 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)
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++;
: 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 */
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])
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 */
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 */
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);
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;
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 */
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;
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]);
}
}
}
} 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]))
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]);
&& 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);
}
}
/* "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;
}
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
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) ? ""
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);
(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);
}
int en;
{
switch (Role_switch) {
- case PM_PRIEST:
+ case PM_CLERIC:
case PM_WIZARD:
return (2 * en);
case PM_HEALER:
type = 0;
}
switch (Role_switch) {
- case PM_PRIEST:
+ case PM_CLERIC:
case PM_MONK:
case PM_WIZARD:
damu /= 5;
/* 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
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)) {
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;
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, "");
}
}
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)
&& 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, "");
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)
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:
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;
/* 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
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:
/* 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
++n;
if (UniqCritterIndx(i))
impossible("unique creature '%d: %s' genocided?",
- i, mons[i].mname);
+ i, mons[i].pmnames[NEUTRAL]);
}
}
return n;
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,
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))
*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) {
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;
}
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))
}
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);
(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);
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));
}
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))
&& !(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;
}
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.
/* 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
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;
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 */
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);
(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"
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) {
/*
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)
/* 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)
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) {
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 */
{
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++;
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 */
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
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;
: "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 */
}
*/
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);
}
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;
}
}
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) */
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;
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;
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;
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;
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];
&& (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."))
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);
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)) {
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
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) {
/* 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);
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);
mndx = PM_ELF;
break;
case PM_VAMPIRE:
- case PM_VAMPIRE_LORD:
+ case PM_VAMPIRE_LEADER:
#if 0 /* DEFERRED */
case PM_VAMPIRE_MAGE:
#endif
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;
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;
(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;
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;
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 */
pudding_merge_message(obj, otmp);
obj = obj_meld(&obj, &otmp);
}
- free_mname(mtmp);
+ free_mgivenname(mtmp);
return obj;
default:
default_1:
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"
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))
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)
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.");
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';
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 */
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",
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.");
}
}
if (got_mad && !Hallucination) {
- const char *who = q_guardian->mname;
+ const char *who = q_guardian->pmnames[NEUTRAL];
if (got_mad > 1)
who = makeplural(who);
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;
mndx = pick_animal();
break;
case PM_VLAD_THE_IMPALER:
- case PM_VAMPIRE_LORD:
+ case PM_VAMPIRE_LEADER:
case PM_VAMPIRE:
mndx = pickvampshape(mon);
break;
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[]) */
}
/* 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) {
* 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 */
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;
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.");
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;
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
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;
{
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;
&& (!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] == ' '
len = m_i_len;
}
}
+ }
+ if (exact_match)
+ break;
}
if (mntmp == NON_PM)
mntmp = title_to_mon(str, (int *) 0, &len);
/* 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. */
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;
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;
{ 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 },
{ 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 },
{ 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 },
*/
#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()
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,
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),
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,
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
};
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
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,
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),
/* 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,
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),
#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),
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),
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,
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,
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;
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))
if (rn2(2))
shield = STRANGE_OBJECT;
break;
- case PM_PRIEST:
- case PM_PRIESTESS:
+ case PM_CLERIC:
if (rn2(2))
weapon = MACE;
if (rn2(2))
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)
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));
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:
You("destroy %s!",
mtmp->mtame
? x_monnam(mtmp, ARTICLE_THE, "poor",
- has_mname(mtmp)
+ has_mgivenname(mtmp)
? SUPPRESS_SADDLE : 0,
FALSE)
: mon_nam(mtmp));
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 */
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;
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
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);
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))
? ""
: 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;
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;
/* 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])
#endif
&& obj->otyp != FAKE_AMULET_OF_YENDOR
&& obj->otyp != AMULET_OF_YENDOR
- && !Role_if(PM_PRIEST)))
+ && !Role_if(PM_CLERIC)))
Strcat(prefix, "uncursed ");
}
#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)");
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]))
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;
= 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;
|| !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);
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 */
} 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;
}
}
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
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
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. */
|| !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);
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))
} 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)) {
: (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));
}
* 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);
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
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;
? 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);
/*
: 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();
}
}
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),
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);
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]))
} 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
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;
}
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;
}
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])) {
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))
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);
}
}
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)
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;
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 */
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
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];
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 */
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) {
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
{
if (!roamer->isminion)
return;
- if (roamer->data != &mons[PM_ALIGNED_PRIEST]
+ if (roamer->data != &mons[PM_ALIGNED_CLERIC]
&& roamer->data != &mons[PM_ANGEL])
return;
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;
}
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;
}
{
int i = g.urole.guardnum;
- return mons[i].mname;
+ return mons[i].pmnames[NEUTRAL];
}
static const char *
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++) {
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.
*/
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);
}
}
}
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++) {
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");
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) {
{
/* 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;
char *str;
struct _create_particular_data *d;
{
+ int gender_name_var = NEUTRAL;
char *bufp = str;
char *tmpp;
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);
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;
}
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)
"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,
"Pri",
"the Great Temple",
"the Temple of Nalzok",
- PM_PRIEST,
- PM_PRIESTESS,
+ PM_CLERIC,
+ NON_PM,
NON_PM,
PM_ARCH_PRIEST,
PM_ACOLYTE,
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)
(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;
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) */
* 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));
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
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) {
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))) {
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,
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;
}
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;
}
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;
}
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;
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) {
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
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;
}
}
}
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) {
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;
}
}
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 {
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;
}
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)
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)
/* 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)) {
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;
}
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);
skill_init(Skill_Mon);
break;
}
- case PM_PRIEST:
+ case PM_CLERIC:
ini_inv(Priest);
if (!rn2(10))
ini_inv(Magicmarker);
* 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))];
case PM_BARBARIAN:
skills = Skill_B;
break;
- case PM_CAVEMAN:
+ case PM_CAVE_DWELLER:
skills = Skill_C;
break;
case PM_HEALER:
case PM_MONK:
skills = Skill_Mon;
break;
- case PM_PRIEST:
+ case PM_CLERIC:
skills = Skill_P;
break;
case PM_RANGER:
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...) */
} 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));
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 */
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.");
} 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 {
&& !(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))
&& 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;
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;
}
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);
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 */
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);
}
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);
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) {
/* 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;
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) {
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;
}
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));
/*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;
}
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,
|| (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")
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);
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));
}
int col, row;
int attr;
int ry;
+ int tilenum = 0;
row = currow;
col = curcol;
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))
{
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) {
}
/* 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));
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.) */
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");
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')
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)
//{
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();
}
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(),
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) {
}
// 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;
}
// 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(),
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;
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) );
}
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(),
// 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();
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);
}
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
{
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();
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
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(),
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);
}
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;
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();
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();
{
}
- 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()));
#endif
)
{
- setGlyph(monnum_to_glyph(roles[id].malenum));
+ setGlyph(monnum_to_glyph(roles[id].malenum), false);
}
};
#endif
)
{
- setGlyph(monnum_to_glyph(races[id].malenum));
+ setGlyph(monnum_to_glyph(races[id].malenum), false);
}
};
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++)
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);
}
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);
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);
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);
}
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"); }
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;
/* 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;
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),
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));
/* 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
#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
/* 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;
}
}
/*
-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;
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')
Z = (195, 195, 195)
0 = (100, 100, 100)
1 = (72, 108, 108)
-# tile 0 (giant ant)
+# tile 0 (giant ant,male)
{
................
................
......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)
{
................
................
.....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)
{
................
................
..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)
{
................
................
......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)
{
................
................
................
................
}
-# 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.....
.....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)
{
................
................
..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)
{
................
................
................
................
}
-# tile 8 (gelatinous cube)
+# tile 16 (gelatinous cube,male)
+{
+ ................
+ ................
+ ................
+ ................
+ ................
+ .......LLL......
+ .....LLLLLLLL...
+ ...LLLLLLLLLD...
+ ...CLLLLLLLDDA..
+ ...CGGCLLLDDDAA.
+ ...CAGCGGDDDDAAA
+ ...CCCCAGDDDAAAA
+ .....CCCCDDAAAA.
+ .......CCDAAA...
+ ................
+ ................
+}
+# tile 17 (gelatinous cube,female)
{
................
................
................
................
}
-# tile 9 (chickatrice)
+# tile 18 (chickatrice,male)
+{
+ ................
+ ................
+ ................
+ ................
+ .......OO.......
+ ......HAOO......
+ .....HHOOH.HHA..
+ ........OOHOA...
+ ........OOFA....
+ ........FGGFA...
+ ........AGFGAA..
+ ...........GA...
+ .......F..FFA...
+ .......AFFAA....
+ ........AA......
+ ................
+}
+# tile 19 (chickatrice,female)
{
................
................
........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.........
.....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.........
.....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)
{
................
................
.....OO..OOA....
................
}
-# tile 13 (fox)
+# tile 26 (fox,male)
+{
+ ................
+ ................
+ ................
+ ................
+ ................
+ ................
+ ................
+ ................
+ ....C...........
+ ....C...........
+ ..CCAC...CCC....
+ ..ACCCCCCACCC...
+ ...AACCCC.ACC...
+ ....ACAAC..AA...
+ ...AC.ACA.......
+ ................
+}
+# tile 27 (fox,female)
{
................
................
...AC.ACA.......
................
}
-# tile 14 (coyote)
+# tile 28 (coyote,male)
{
................
................
................
................
}
-# 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..
...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)
{
................
................
.....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)
{
................
................
................
................
}
-# 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)
{
................
................
.....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)
{
................
................
.....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)
{
................
................
.....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)
{
................
................
...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)
{
................
................
.....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...
....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)
{
................
................
.....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)
{
................
................
.....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...
....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..........
.....JJAA...JA..
................
}
-# tile 28 (gas spore)
+# tile 56 (gas spore,male)
{
................
................
................
................
}
-# 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)
{
................
................
................
................
}
-# 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)
{
................
................
................
................
}
-# 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.......
......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.....
......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.
................
................
}
-# 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)
{
................
................
......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)
{
................
................
.....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)
{
................
................
.....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)
{
................
................
................
................
}
-# 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)
{
................
................
................
................
}
-# 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)
{
................
................
.....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)
{
................
................
.....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.......
...AE.AE.EA.EA..
................
}
-# tile 42 (gremlin)
+# tile 84 (gremlin,male)
{
................
................
...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
....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.....
....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)
{
................
................
....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)
{
................
................
................
................
}
-# 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)
{
................
................
........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)
{
................
................
................
................
}
-# 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)
{
................
................
................
................
}
-# 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....
......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....
...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)
{
................
................
................
................
}
-# tile 53 (homunculus)
+# tile 106 (homunculus,male)
+{
+ ................
+ ................
+ ................
+ ................
+ ................
+ ................
+ ................
+ ......JJJ.......
+ ......LLC.......
+ ......LLC.......
+ .....BBPPPAA....
+ ....L.BPPACAA...
+ ......BAPAAAA...
+ .....LLALCA.....
+ ................
+ ................
+}
+# tile 107 (homunculus,female)
{
................
................
................
................
}
-# tile 54 (imp)
+# tile 108 (imp,male)
+{
+ ................
+ ................
+ ................
+ ................
+ ................
+ ................
+ ................
+ .....O.D.O......
+ .....OCDDO......
+ ......CDD.......
+ .....GGFFFAA....
+ ....C.GFFADAA...
+ ......GAFAAAA...
+ .....CDADDA.....
+ ................
+ ................
+}
+# tile 109 (imp,female)
{
................
................
................
................
}
-# 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)
{
................
................
................
................
}
-# tile 56 (quasit)
+# tile 112 (quasit,male)
{
................
................
................
................
}
-# 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.......
.....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)
{
................
................
................
................
}
-# 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)
{
................
................
................
................
}
-# 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)
{
................
................
................
................
}
-# 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)
{
................
................
................
................
}
-# 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)
{
................
................
................
................
}
-# 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)
{
................
................
................
................
}
-# 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)
{
................
................
................
................
}
-# 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)
{
................
................
................
................
}
-# 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)
{
................
................
................
................
}
-# 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)
{
................
................
................
................
}
-# 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.......
...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)
{
................
................
....KJKJKJKJ....
................
}
-# tile 70 (water nymph)
+# tile 140 (water nymph,male)
{
................
................
....BPBPBPBP....
................
}
-# tile 71 (mountain nymph)
+# tile 141 (water nymph,female)
{
................
................
..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....
....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)
{
................
................
................
................
}
-# 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.........
................
................
}
-# 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)
{
................
................
................
................
}
-# 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)
{
................
................
................
................
}
-# 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)
{
................
................
................
................
}
-# 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)
{
................
................
................
................
}
-# 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)
{
................
................
................
................
}
-# 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)
{
................
................
................
................
}
-# 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..
................
................
}
-# 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..
................
................
}
-# 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..
................
................
}
-# 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....
................
................
}
-# tile 84 (mumak)
+# tile 168 (mumak,male)
{
................
...........P....
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..........
................
................
}
-# 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...
................
................
}
-# 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)
{
................
................
................
................
}
-# 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)
{
................
................
................
................
}
-# 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)
{
................
................
.......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)
{
................
................
.........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)
{
................
................
..........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)
{
................
................
.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)
{
................
................
..........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)
{
................
................
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)
{
................
................
.....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)
{
................
................
.....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)
{
................
................
...B............
................
}
-# tile 98 (giant spider)
+# tile 196 (giant spider,male)
{
................
................
.....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..
.......JAAJA....
................
}
-# tile 100 (lurker above)
+# tile 200 (lurker above,male)
+{
+ .AAAAAAAAAAAAAAA
+ ...AAGFAAGFAAA..
+ ...AAAAAAAAAAA..
+ ....AODODODOA...
+ ................
+ ................
+ ................
+ ................
+ ................
+ ................
+ ................
+ ................
+ ................
+ ................
+ ................
+ ................
+}
+# tile 201 (lurker above,female)
{
.AAAAAAAAAAAAAAA
...AAGFAAGFAAA..
................
................
}
-# tile 101 (trapper)
+# tile 202 (trapper,male)
+{
+ ................
+ ................
+ ................
+ ................
+ ................
+ ................
+ ................
+ ................
+ ................
+ ................
+ ................
+ ................
+ ....AODODODOA...
+ ...AAAAAAAAAAA..
+ ...AAGFAAGFAAA..
+ .AAAAAAAAAAAAAAA
+}
+# tile 203 (trapper,female)
{
................
................
...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)
{
................
................
.....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............
.....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............
.....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............
.....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)
{
................
................
.....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........
.....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........
..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)
{
................
................
....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)
{
................
................
....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)
{
................
................
....EEEE..E.....
................
}
-# tile 112 (steam vortex)
+# tile 224 (steam vortex,male)
{
................
................
....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)
{
................
................
....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)
{
................
................
................
................
}
-# 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)
{
................
................
................
................
}
-# 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)
{
................
................
................
................
}
-# 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)
{
................
................
................
................
}
-# 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)
{
................
................
................
................
}
-# 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)
{
................
................
..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........
................
................
}
-# 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........
................
................
}
-# 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......
................
................
}
-# 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)
{
................
................
................
................
}
-# 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...
..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)
{
................
................
....BNNNNNNP....
................
}
-# tile 126 (ki-rin)
+# tile 252 (ki-rin,male)
{
................
................
................
................
}
-# 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....
................
................
}
-# tile 128 (bat)
+# tile 256 (bat,male)
+{
+ ................
+ ................
+ ................
+ ................
+ ...JJJCACJJJ....
+ ..JJAAHJHAAJJ...
+ ..JA...JA..AJ...
+ ................
+ ................
+ ......AAAA......
+ ....AAAAAAAA....
+ ...AAA.AA.AAA...
+ .......AA.......
+ ................
+ ................
+ ................
+}
+# tile 257 (bat,female)
{
................
................
................
................
}
-# 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)
{
................
................
................
................
}
-# 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.....
................
................
}
-# 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)
{
................
................
................
................
}
-# 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..........
....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)
{
................
................
....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)
{
................
................
....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)
{
................
................
.....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)
{
................
................
.....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....
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)
{
................
................
.....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)
{
................
................
.....NOAA..OOAA.
...........OAA..
}
-# tile 140 (baby orange dragon)
+# tile 280 (baby orange dragon,male)
{
................
................
.....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)
{
................
................
.....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)
{
................
................
.....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)
{
................
................
.....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)
{
................
................
.....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....
....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....
....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
....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....
....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....
....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....
....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.....
....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....
....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....
....GFAA...FFJA.
........FFFFJA..
}
-# tile 154 (yellow dragon)
+# tile 308 (yellow dragon,male)
{
......NNNHA.....
.....DHDHHHA....
....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....
.....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.....
...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........
..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.....
..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.....
..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)
{
................
................
................
................
}
-# 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)
{
................
................
................
................
}
-# 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)
{
................
................
................
................
}
-# 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)
{
................
................
................
................
}
-# 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)
{
................
................
................
................
}
-# tile 165 (shrieker)
+# tile 330 (shrieker,male)
+{
+ ................
+ ................
+ ................
+ ................
+ .....GGGGFF.....
+ ...GGGGIGIDFF...
+ .GGGIIGGGIIFFFF.
+ GIIGIIGGGGGGGDDF
+ GIIGGGGIIGIIGIDF
+ GGGGIGGIIGIIGGFF
+ ..GGGGGGGGGGG...
+ ......FFF..AAAAA
+ ....AGGGFFAAAAAA
+ ...AGGGGGGFAAAA.
+ ...AAAAAAAAAA...
+ ................
+}
+# tile 331 (shrieker,female)
{
................
................
...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)
{
................
................
................
................
}
-# tile 167 (gnome)
+# tile 334 (gnome,male)
+{
+ ................
+ ................
+ ................
+ .....DF.........
+ ......G.........
+ .....GFF........
+ ....GGFFF.......
+ ....GLLLF.......
+ .....OLO...AAA..
+ ...FGOOOFFAAAA..
+ ...GAGOFAFAAAA..
+ ....LKNKFAAAA...
+ ....FGAFFAA.....
+ ....GFAFG.A.....
+ ................
+ ................
+}
+# tile 335 (gnome,female)
{
................
................
................
................
}
-# tile 168 (gnome lord)
+# tile 336 (gnome leader,male)
{
................
................
................
................
}
-# 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)
{
................
................
................
................
}
-# 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)
{
................
................
................
................
}
-# 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...
.....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...
.....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...
.....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...
.....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...
.....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...
.....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...
.....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...
.....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...
....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...........
...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...........
...FGAA..FG.....
................
}
-# tile 182 (Keystone Kop)
+# tile 364 (Keystone Kop,male)
{
................
....AA..........
..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..
..AA....AA......
................
}
-# tile 184 (Kop Lieutenant)
+# tile 369 (Kop Lieutenant,female)
{
................
....AA..........
..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.....
..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)
{
................
................
......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)
{
................
................
......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........
......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)
{
................
................
......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)
{
................
................
................
................
}
-# 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)
{
................
................
................
................
}
-# 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)
{
................
................
................
................
}
-# 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)
{
................
................
................
................
}
-# 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)
{
................
................
................
................
}
-# 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)
{
................
................
..NNN.NNNA......
................
}
-# tile 196 (ettin mummy)
+# tile 392 (ettin mummy,male)
{
.....NN..ONOO...
...NNOOONNOOOO..
.....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.
.....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)
{
................
................
....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)
{
................
................
....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)
{
................
................
....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)
{
................
................
....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..........
.....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..........
.....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..........
.....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..........
.....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)
{
................
................
....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)
{
................
................
....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......
....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)
{
................
................
.........KCCCJ..
................
}
-# tile 210 (brown pudding)
+# tile 420 (brown pudding,male)
{
................
................
................
................
}
-# 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)
{
................
................
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......
........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......
....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......
..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........
......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........
......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)
{
................
................
................
................
}
-# 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)
{
................
................
................
................
}
-# 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)
{
................
................
.....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)
{
................
................
.....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)
{
................
................
......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)
{
................
................
.....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........
..KJA..KA.......
................
}
-# tile 224 (ice troll)
+# tile 448 (ice troll,male)
{
................
..OONOOO........
..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.....
..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........
..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.......
..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........
.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)
{
................
................
................
................
}
-# 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.......
.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)
{
................
................
................
................
}
-# 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.......
..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)
{
................
................
.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)
{
................
................
................
................
}
-# 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)
{
................
................
......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)
{
................
................
................
................
}
-# tile 237 (monkey)
+# tile 474 (monkey,male)
+{
+ ................
+ ................
+ ................
+ ................
+ ................
+ .......KKA......
+ ......KLLJA.....
+ ......KLLJA.....
+ .......KJA......
+ .....KKKKKJAA...
+ ....KJKLLJJJAA..
+ ....LAKLLJALAA..
+ ......KJJJAAAA..
+ ......JAAJAAA...
+ .....JJA.JJA....
+ ................
+}
+# tile 475 (monkey,female)
{
................
................
.....JJA.JJA....
................
}
-# tile 238 (ape)
+# tile 476 (ape,male)
{
................
................
................
................
}
-# 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.....
...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........
..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)
{
................
................
................
................
}
-# 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.......
.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)
{
................
................
................
................
}
-# 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)
{
................
................
................
................
}
-# 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)
{
................
................
................
................
}
-# 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)
{
................
................
................
................
}
-# 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)
{
................
................
................
................
}
-# 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......
....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...
.....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......
....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...
....GFFAGFFAAAAA
...GFFAAGFFFAAAA
}
-# tile 252 (skeleton)
+# tile 504 (skeleton,male)
{
................
................
......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.
....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.......
....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)
{
................
................
...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.......
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......
...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......
....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)
{
................
................
..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)
{
................
................
..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)
{
................
................
...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....
..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.......
....PBP.APBP.A..
................
}
-# tile 264 (human)
+# tile 528 (human,male)
{
................
................
................
................
}
-# tile 265 (wererat)
+# tile 529 (human,female)
{
................
................
.......JJA......
......JJJJA.....
- ......GJGJA.....
+ ......ELELA.....
......LLLLA.....
......ALLA......
.....CLAALC.AAA.
................
................
}
-# tile 266 (werejackal)
+# tile 530 (wererat,male)
{
................
................
.......JJA......
......JJJJA.....
- ......IPIPA.....
+ ......GJGJA.....
......LLLLA.....
......ALLA......
.....CLAALC.AAA.
................
................
}
-# 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.
................
................
}
-# tile 269 (Woodland-elf)
+# tile 538 (Woodland-elf,male)
{
................
................
................
................
}
-# 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)
{
................
................
................
................
}
-# 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)
{
................
................
................
................
}
-# 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)
{
................
................
................
................
}
-# tile 273 (Elvenking)
+# tile 546 (Elvenmonarch,male)
{
................
................
................
................
}
-# 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...
..CD.LLAALLADC..
................
}
-# tile 275 (shopkeeper)
+# tile 550 (shopkeeper,male)
{
................
................
................
................
}
-# 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....
.....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)
{
................
................
.....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)
{
................
................
....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.............
.JACCCJJCCCAA...
................
}
-# tile 280 (high priest)
+# tile 560 (high priest,male)
{
.INI............
IIIII.KCCK......
..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.......
.....JJ.JJ......
................
}
-# tile 282 (sergeant)
+# tile 564 (sergeant,male)
{
.....J..........
.....JFFF.......
.....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.......
................
................
}
-# 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......
.....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......
.....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.......
....JJJ.JJJ.....
................
}
-# tile 287 (watch captain)
+# tile 574 (watch captain,male)
{
......PPP.......
.....PHHHP......
....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.......
..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.
.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.....
.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........
.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)
{
................
................
.O...P....P.....
........P.......
}
-# tile 293 (shade)
+# tile 586 (shade,male)
+{
+ ................
+ ................
+ ................
+ ................
+ ................
+ ................
+ ................
+ ................
+ ........AAAAAAA.
+ ....AAAAAAAA....
+ ..AAAAAAAAAAAA..
+ AAAAAAAAAAAAAAA.
+ ..AAAAAAAAAAAAAA
+ .AAAAAAAAAAAAA..
+ AAAA.AAAAJA.....
+ ................
+}
+# tile 587 (shade,female)
{
................
................
AAAA.AAAAJA.....
................
}
-# tile 294 (water demon)
+# tile 588 (water demon,male)
{
................
................
....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........
....DDAA..DDAA..
...DDJA...DDDA..
}
-# tile 296 (horned devil)
+# tile 592 (horned devil,male)
{
................
................
..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....
..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)
{
................
................
.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..
..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.....
.....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)
{
................
................
...........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)
{
................
................
..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)
{
................
................
..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)
{
................
................
................
................
}
-# 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..
...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.....
.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..
..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...
.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.......
...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..
...OOPPAOOPPAGA.
................
}
-# tile 312 (Geryon)
+# tile 624 (Geryon,male)
{
.K...........K..
.K....JJJ....KJ.
....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......
.....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......
.....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......
.....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....
..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.....
.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.....
..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......
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..
..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.....
.........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.......
..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)
{
................
................
.....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)
{
................
................
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)
{
................
................
...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)
{
................
................
...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)
{
................
................
EEEEEEE..EE.....
..EEE..EEE..E...
}
-# tile 328 (newt)
+# tile 656 (newt,male)
{
................
................
................
................
}
-# 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)
{
................
................
................
................
}
-# tile 330 (iguana)
+# tile 660 (iguana,male)
+{
+ ................
+ ................
+ ................
+ ................
+ ................
+ ....GPGPGGPF....
+ ..GPAAAAFFGPF...
+ .GPAA.PFFGPPPAA.
+ ......FGGPPFPPAA
+ .PFGGGGPPPFAAPPA
+ .FGPAPPPPFAAAAA.
+ .GPPPPFPFAAA.A..
+ .PPFFAFPPAA.....
+ D.AAAAAAPPA.....
+ ................
+ ................
+}
+# tile 661 (iguana,female)
{
................
................
................
................
}
-# tile 331 (baby crocodile)
+# tile 662 (baby crocodile,male)
+{
+ ................
+ ................
+ ................
+ ................
+ ................
+ .....FFOFOFA....
+ ....FOGFGGOFF...
+ ....GAAAAFOGFA..
+ ...FAA.GFOGGGFA.
+ ...GFOOOGGGFAGA.
+ ...FGAGGGGFAAA..
+ ..FGGGGFGFAA....
+ ..GGDFAFGGA.....
+ ...D............
+ ................
+ ................
+}
+# tile 663 (baby crocodile,female)
{
................
................
................
................
}
-# tile 332 (lizard)
+# tile 664 (lizard,male)
+{
+ ................
+ ................
+ ................
+ ................
+ ................
+ ................
+ ....FFFFGFJ.....
+ ..FFAAAJJGFJ....
+ ......JGFFJFAA..
+ ...JGGGFFJAAFA..
+ ..JFAFFFJAAAA...
+ ..FFFFJJAAA.....
+ .JFAAAAFAA......
+ .D..............
+ ................
+ ................
+}
+# tile 665 (lizard,female)
{
................
................
................
................
}
-# 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)
{
................
................
.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)
{
................
................
.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)
{
................
................
..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....
.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)
{
................
................
.....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)
{
................
................
.....LLA.LLA....
................
}
-# tile 339 (caveman)
+# tile 678 (cave dweller,male)
{
................
................
................
................
}
-# tile 340 (cavewoman)
+# tile 679 (cave dweller,female)
{
................
................
................
................
}
-# 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.......
................
................
}
-# 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)
{
................
................
................
................
}
-# tile 343 (monk)
+# tile 684 (monk,male)
+{
+ ................
+ ................
+ .......CCC......
+ ......JCJJJA....
+ ......CAAAJA....
+ ......CAAAJA....
+ ......CKLKCAAAA.
+ .....CDDDDDDAAAA
+ ....CDDLALDDDAAA
+ ....DALLALLADAA.
+ ....DDDDCDDDDAA.
+ .....AACCCDAAAA.
+ .....CDCCCDDA.A.
+ ....CCCCCCCDD...
+ ................
+ ................
+}
+# tile 685 (monk,female)
{
................
................
................
................
}
-# tile 344 (priest)
+# tile 686 (cleric,male)
{
................
................
......ALLJA.....
......IJJIAAAA..
.....ODDDDDAAAA.
- ....IDNDDDDDAAA.
- ...NLNNNDDALAA..
- ......NDDDAAAA..
+ ....INNDDDDDAAA.
+ ...NLNNDDDALAA..
+ ......DDDDAAAA..
......DIIDAAAA..
.....DDIIDDA.A..
....DIIIIIDD....
................
................
}
-# tile 345 (priestess)
+# tile 687 (cleric,female)
{
................
.......JJ.......
.....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)
{
................
................
................
................
}
-# 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)
{
................
................
.....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)
{
................
................
.....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)
{
................
................
.....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)
{
................
................
................
................
}
-# 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.....
....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......
.....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.......
.....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......
.....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...
.....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...
.....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......
.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)
{
................
................
....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.......
..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......
..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)
{
................
................
......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......
...JJA..JJA.....
................
}
-# tile 363 (Lord Sato)
+# tile 722 (Lord Sato,male)
{
.....AAA........
.....AAA........
..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)
{
................
................
.....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)
{
................
................
................
................
}
-# 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)
{
................
................
...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..
..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......
.....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....
....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)
{
................
................
................
................
}
-# 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.......
....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....
..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......
...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....
..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..
...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)
{
................
................
.....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)
{
................
................
.....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...
.....BPPABPPAAAA
...LLLLJ.BLLLKAA
}
-# tile 379 (Dark One)
+# tile 754 (Dark One,male)
{
................
......AAA.......
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)
{
................
................
.....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)
{
................
................
.....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)
{
................
................
................
................
}
-# 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......
......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)
{
................
................
................
................
}
-# 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)
{
................
................
................
................
}
-# tile 386 (abbot)
+# tile 768 (abbot,male)
+{
+ ................
+ ................
+ ................
+ ................
+ ................
+ ......KLK.......
+ ......LLL.......
+ ....CCLLLJJ.....
+ ....KCKLKKJAAA..
+ ....CDDDDDDAAAA.
+ ...CDDLALDDDAAA.
+ ...DALLALLADAA..
+ ...DDDDCDDDDAA..
+ ....AACCCDAAAA..
+ ....CDCCCDDA.A..
+ ...CCCCCCCDD....
+}
+# tile 769 (abbot,female)
{
................
................
....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)
{
................
................
....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)
{
................
................
....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)
{
................
................
.....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)
{
................
................
.....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)
{
................
................
.....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)
{
................
................
.....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.....
.....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)
{
................
................
....BPPPPPPE....
................
}
-# tile 395 (invisible monster)
+# tile 786 (invisible monster, nogender)
{
................
................
/* 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"
/*
* ***********************************************************
* 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;
}
#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
#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[] = {
{ 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
{ OBJ_GLYPH, SCR_STINKING_CLOUD + EXTRA_SCROLL_DESCR_COUNT,
"stamped / mail" },
#endif
- { 0, 0, 0 }
+ { TERMINATOR, 0, 0 }
};
/*
{ 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)
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 {
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[] = {
}
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);
}
tilenum += (NUM_ZAP << 2);
- i = entry - tilenum;
+ i = file_entry - tilenum;
if (i < WARNCOUNT) {
if (set == OTH_GLYPH) {
Sprintf(buf, "warning %d", i);
}
tilenum += WARNCOUNT;
- i = entry - tilenum;
+ i = file_entry - tilenum;
if (i < 1) {
if (set == OTH_GLYPH) {
Sprintf(buf, "unexplored");
}
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);
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
#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;
* 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
{
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)
}
}
- 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
}
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);
}
}
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()
{
char filename[30];
FILE *ofp;
+#ifdef OBTAIN_TILEMAP
+ objects_globals_init();
+ monst_globals_init();
+#endif
+
init_tilemap();
/*
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");
}
};
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*/
"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.] = " \
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++;
{
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++;
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;
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")
})
#endif /* __EMSCRIPTEN__ */
-#endif /* SHIM_GRAPHICS */
\ No newline at end of file
+#endif /* SHIM_GRAPHICS */
*/
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();
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);
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 */
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)
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: {
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;
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)
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];
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);
#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
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;
char ch;
WCHAR wch;
int color;
- unsigned special;
- int mgch;
+// unsigned special;
+// int mgch;
HBRUSH back_brush;
COLORREF OldFg;
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));
}
}
-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);
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);
XCHAR_P y;
int glyph;
int bkglyph;
+ int glyphmod[NUM_GLYPHMOD];
} MSNHMsgPrintGlyph, *PMSNHMsgPrintGlyph;
typedef struct mswin_nhmsg_cliparound {
}
/*
-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
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)) {
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);
}
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();