diff --git a/doc/fixes37.0 b/doc/fixes37.0 index f538e48a5..d86b9d5ec 100644 --- a/doc/fixes37.0 +++ b/doc/fixes37.0 @@ -703,6 +703,12 @@ include an indication of monsters' health during farlook feedback (including a monster: "killed by {an uninjured newt,a heavily injured mumak}" make DOAGAIN (^A) become unconditional; commenting it out in config.h makes it be bound to NUL, a no-op, but allows BIND=k:repeat to set it to k +add support for a single monster species to have distinct male, female, + and gender-neutral naming terms +add support for a single monster species to have distinct male and female + tiles +consolidate several monsters that differed only by their gender into their + single species Platform- and/or Interface-Specific New Features @@ -730,6 +736,10 @@ Qt: add Filter, Layout, and Reset buttons to the extended command selector; mode only"; Layout redisplays the grid of command buttons, toggling from down columns to across rows or vice versa; Reset puts both back to their default settings and clears any pending typed input +tiles: male and female variations in monsters.txt; tested only with tile2bmp + conversion utility so far; also supported by tilemap utility to + generate tile.c; some window-port modifications still required to + integrate the male and female tile capability into the window port Unix: can define NOSUSPEND in config.h or src/Makefile's CFLAGS to prevent unixconf.h from enabling SUSPEND without need to modify unixconf.h @@ -824,5 +834,8 @@ move 'restoring' to the program_state struct; add corresponding 'saving'; unify special attack damages from separate you-hit-monster, monster-hits-you, and monster-hits-monster into functions by damage type unify trap effects for hero and monster stepping on the trap by trap type - - +replace the single permonst mname field with male, female, and gender-neutral + names pmnames[NUM_MGENDERS] fields +add a new glyphmod parameter to window interface *_print_glyph() to be used + to provide additional details to the window port beyond the glyph; + begin to phase out the mapglyph() calls from within windows ports diff --git a/doc/window.doc b/doc/window.doc index 1f376a5bd..bd55a5ac0 100644 --- a/doc/window.doc +++ b/doc/window.doc @@ -192,7 +192,7 @@ int nh_poskey(int *x, int *y, int *mod) B. High-level routines: -print_glyph(window, x, y, glyph, bkglyph) +print_glyph(window, x, y, glyph, bkglyph, glyphmod[3]) -- Print the glyph at (x,y) on the given window. Glyphs are integers at the interface, mapped to whatever the window- port wants (symbol, font, color, attributes, ...there's @@ -202,7 +202,10 @@ print_glyph(window, x, y, glyph, bkglyph) to fall against a background consistent with the grid around x,y. If bkglyph is NO_GLYPH, then the parameter should be ignored (do nothing with it). - + -- glyphmod (glyphmod[NUM_GLYPHNOD]) provides extended + information about the glyph that window ports can use to + enhance the display in various ways. + char yn_function(const char *ques, const char *choices, char default) -- Print a prompt made up of ques, choices and default. Read a single character response that is contained in diff --git a/include/artilist.h b/include/artilist.h index d3a5e7ab2..c95f41775 100644 --- a/include/artilist.h +++ b/include/artilist.h @@ -180,7 +180,7 @@ static NEARDATA struct artifact artilist[] = { A("The Sceptre of Might", MACE, (SPFX_NOGEN | SPFX_RESTR | SPFX_INTEL | SPFX_DALIGN), 0, 0, PHYS(5, 0), - DFNS(AD_MAGM), NO_CARY, CONFLICT, A_LAWFUL, PM_CAVEMAN, NON_PM, 2500L, + DFNS(AD_MAGM), NO_CARY, CONFLICT, A_LAWFUL, PM_CAVE_DWELLER, NON_PM, 2500L, NO_COLOR), #if 0 /* OBSOLETE */ @@ -210,7 +210,7 @@ A("The Palantir of Westernesse", CRYSTAL_BALL, A("The Mitre of Holiness", HELM_OF_BRILLIANCE, (SPFX_NOGEN | SPFX_RESTR | SPFX_DFLAG2 | SPFX_INTEL | SPFX_PROTECT), 0, M2_UNDEAD, NO_ATTK, NO_DFNS, CARY(AD_FIRE), ENERGY_BOOST, A_LAWFUL, - PM_PRIEST, NON_PM, 2000L, NO_COLOR), + PM_CLERIC, NON_PM, 2000L, NO_COLOR), A("The Longbow of Diana", BOW, (SPFX_NOGEN | SPFX_RESTR | SPFX_INTEL | SPFX_REFLECT), SPFX_ESP, 0, diff --git a/include/decl.h b/include/decl.h index 71147ce18..0a9b61ba9 100644 --- a/include/decl.h +++ b/include/decl.h @@ -524,6 +524,9 @@ struct trapinfo { typedef struct { xchar gnew; /* perhaps move this bit into the rm structure. */ int glyph; +#ifndef UNBUFFERED_GLYPHMOD + unsigned glyphmod[NUM_GLYPHMOD]; +#endif } gbuf_entry; enum vanq_order_modes { diff --git a/include/display.h b/include/display.h index 28c02becd..1c944c276 100644 --- a/include/display.h +++ b/include/display.h @@ -475,4 +475,27 @@ enum explosion_types { #define glyph_is_unexplored(glyph) ((glyph) == GLYPH_UNEXPLORED) #define glyph_is_nothing(glyph) ((glyph) == GLYPH_NOTHING) +/* flags for map_glyphmod */ + +/* mgflags for altering map_glyphmod() internal behaviour */ +#define MG_FLAG_NORMAL 0x00 +#define MG_FLAG_NOOVERRIDE 0x01 +#define MG_FLAG_RETURNIDX 0x02 + +/* Special mapped glyph flags encoded in glyphmod[GM_FLAGS] by map_glyphmod() */ +#define MG_CORPSE 0x0001 +#define MG_INVIS 0x0002 +#define MG_DETECT 0x0004 +#define MG_PET 0x0008 +#define MG_RIDDEN 0x0010 +#define MG_STATUE 0x0020 +#define MG_OBJPILE 0x0040 /* more than one stack of objects */ +#define MG_BW_LAVA 0x0080 /* 'black & white lava': highlight lava if it + can't be distringuished from water by color */ +#define MG_BW_ICE 0x0100 /* similar for ice vs floor */ +#define MG_NOTHING 0x0200 /* char represents GLYPH_NOTHING */ +#define MG_UNEXPL 0x0400 /* char represents GLYPH_UNEXPLORED */ +#define MG_FEMALE 0x0800 /* represents a female mon,detected mon,pet,ridden */ +#define MG_BADXY 0x1000 /* bad coordinates were passed */ + #endif /* DISPLAY_H */ diff --git a/include/extern.h b/include/extern.h index ac8b1e723..cf66dd4ff 100644 --- a/include/extern.h +++ b/include/extern.h @@ -374,6 +374,7 @@ E void NDECL(reglyph_darkroom); E void NDECL(set_wall_state); E void FDECL(unset_seenv, (struct rm *, int, int, int, int)); E int FDECL(warning_of, (struct monst *)); +E void FDECL(map_glyphmod, (XCHAR_P, XCHAR_P, int, unsigned, unsigned *)); /* ### do.c ### */ @@ -415,8 +416,8 @@ E char *FDECL(coord_desc, (int, int, char *, CHAR_P)); E boolean FDECL(getpos_menu, (coord *, int)); E int FDECL(getpos, (coord *, BOOLEAN_P, const char *)); E void FDECL(getpos_sethilite, (void (*f)(int), boolean (*d)(int,int))); -E void FDECL(new_mname, (struct monst *, int)); -E void FDECL(free_mname, (struct monst *)); +E void FDECL(new_mgivenname, (struct monst *, int)); +E void FDECL(free_mgivenname, (struct monst *)); E void FDECL(new_oname, (struct obj *, int)); E void FDECL(free_oname, (struct obj *)); E const char *FDECL(safe_oname, (struct obj *)); @@ -457,6 +458,10 @@ E struct monst *FDECL(christen_orc, (struct monst *, const char *, const char *)); E const char *FDECL(noveltitle, (int *)); E const char *FDECL(lookup_novel, (const char *, int *)); +#ifndef PMNAME_MACROS +E int FDECL(Mgender, (struct monst *)); +E const char *FDECL(pmname, (struct permonst *, int)); +#endif /* PMNAME_MACROS */ /* ### do_wear.c ### */ @@ -1516,8 +1521,8 @@ E boolean FDECL(dmgtype, (struct permonst *, int)); E int FDECL(max_passive_dmg, (struct monst *, struct monst *)); E boolean FDECL(same_race, (struct permonst *, struct permonst *)); E int FDECL(monsndx, (struct permonst *)); -E int FDECL(name_to_mon, (const char *)); -E int FDECL(name_to_monplus, (const char *, const char **)); +E int FDECL(name_to_mon, (const char *, int *)); +E int FDECL(name_to_monplus, (const char *, const char **, int *)); E int FDECL(name_to_monclass, (const char *, int *)); E int FDECL(gender, (struct monst *)); E int FDECL(pronoun_gender, (struct monst *, unsigned)); diff --git a/include/hack.h b/include/hack.h index 0917b93c4..aa9b57106 100644 --- a/include/hack.h +++ b/include/hack.h @@ -79,24 +79,6 @@ enum dismount_types { DISMOUNT_BYCHOICE = 6 }; -/* mgflags for mapglyph() */ -#define MG_FLAG_NORMAL 0x00 -#define MG_FLAG_NOOVERRIDE 0x01 - -/* Special returns from mapglyph() */ -#define MG_CORPSE 0x0001 -#define MG_INVIS 0x0002 -#define MG_DETECT 0x0004 -#define MG_PET 0x0008 -#define MG_RIDDEN 0x0010 -#define MG_STATUE 0x0020 -#define MG_OBJPILE 0x0040 /* more than one stack of objects */ -#define MG_BW_LAVA 0x0080 /* 'black & white lava': highlight lava if it - can't be distringuished from water by color */ -#define MG_BW_ICE 0x0100 /* similar for ice vs floor */ -#define MG_NOTHING 0x0200 /* char represents GLYPH_NOTHING */ -#define MG_UNEXPL 0x0400 /* char represents GLYPH_UNEXPLORED */ - /* sellobj_state() states */ #define SELL_NORMAL (0) #define SELL_DELIBERATE (1) @@ -216,6 +198,9 @@ typedef struct { #define SYM_OFF_X (SYM_OFF_W + WARNCOUNT) #define SYM_MAX (SYM_OFF_X + MAXOTHER) +/* glyphmod entries */ +enum { GM_FLAGS, GM_TTYCHAR, GM_COLOR, NUM_GLYPHMOD }; + #include "rect.h" #include "region.h" #include "decl.h" @@ -293,10 +278,12 @@ typedef struct sortloot_item Loot; #define MM_ASLEEP 0x002000L /* monsters should be generated asleep */ #define MM_NOGRP 0x004000L /* suppress creation of monster groups */ #define MM_NOTAIL 0x008000L /* if a long worm, don't give it a tail */ +#define MM_MALE 0x010000L /* male variation */ +#define MM_FEMALE 0x020000L /* female variation */ /* if more MM_ flag masks are added, skip or renumber the GP_ one(s) */ -#define GP_ALLOW_XY 0x010000L /* [actually used by enexto() to decide whether +#define GP_ALLOW_XY 0x040000L /* [actually used by enexto() to decide whether * to make an extra call to goodpos()] */ -#define GP_ALLOW_U 0x020000L /* don't reject hero's location */ +#define GP_ALLOW_U 0x080000L /* don't reject hero's location */ /* flags for make_corpse() and mkcorpstat() */ #define CORPSTAT_NONE 0x00 diff --git a/include/mextra.h b/include/mextra.h index 0ade0adf7..cc4d715ae 100644 --- a/include/mextra.h +++ b/include/mextra.h @@ -175,7 +175,7 @@ struct edog { ** mextra.h -- collection of all monster extensions */ struct mextra { - char *mname; + char *mgivenname; struct egd *egd; struct epri *epri; struct eshk *eshk; @@ -186,7 +186,7 @@ struct mextra { * or an alignment mask for one posing as an altar */ }; -#define MNAME(mon) ((mon)->mextra->mname) +#define MGIVENNAME(mon) ((mon)->mextra->mgivenname) #define EGD(mon) ((mon)->mextra->egd) #define EPRI(mon) ((mon)->mextra->epri) #define ESHK(mon) ((mon)->mextra->eshk) @@ -194,7 +194,7 @@ struct mextra { #define EDOG(mon) ((mon)->mextra->edog) #define MCORPSENM(mon) ((mon)->mextra->mcorpsenm) -#define has_mname(mon) ((mon)->mextra && MNAME(mon)) +#define has_mgivenname(mon) ((mon)->mextra && MGIVENNAME(mon)) #define has_egd(mon) ((mon)->mextra && EGD(mon)) #define has_epri(mon) ((mon)->mextra && EPRI(mon)) #define has_eshk(mon) ((mon)->mextra && ESHK(mon)) diff --git a/include/monflag.h b/include/monflag.h index a243dc8a4..d7a1a88f5 100644 --- a/include/monflag.h +++ b/include/monflag.h @@ -205,6 +205,9 @@ enum ms_sounds { #define G_GONE (G_GENOD | G_EXTINCT) #define MV_KNOWS_EGG 0x08 /* player recognizes egg of this monster type */ +enum mgender { MALE, FEMALE, NEUTRAL, + NUM_MGENDERS }; + /* *INDENT-ON* */ /* clang-format on */ #endif /* MONFLAG_H */ diff --git a/include/monst.h b/include/monst.h index 6842162ca..66f51f469 100644 --- a/include/monst.h +++ b/include/monst.h @@ -184,7 +184,7 @@ struct monst { #define DEADMONSTER(mon) ((mon)->mhp < 1) #define is_starting_pet(mon) ((mon)->m_id == g.context.startingpet_mid) #define is_vampshifter(mon) \ - ((mon)->cham == PM_VAMPIRE || (mon)->cham == PM_VAMPIRE_LORD \ + ((mon)->cham == PM_VAMPIRE || (mon)->cham == PM_VAMPIRE_LEADER \ || (mon)->cham == PM_VLAD_THE_IMPALER) #define vampshifted(mon) (is_vampshifter((mon)) && !is_vampire((mon)->data)) @@ -220,4 +220,8 @@ struct monst { #define montoostrong(monindx, lev) (mons[monindx].difficulty > lev) #define montooweak(monindx, lev) (mons[monindx].difficulty < lev) +#ifdef PMNAME_MACROS +#define Mgender(mon) ((mon)->female ? FEMALE : MALE) +#endif + #endif /* MONST_H */ diff --git a/include/patchlevel.h b/include/patchlevel.h index d6969198b..a7b4c2da8 100644 --- a/include/patchlevel.h +++ b/include/patchlevel.h @@ -17,7 +17,7 @@ * Incrementing EDITLEVEL can be used to force invalidation of old bones * and save files. */ -#define EDITLEVEL 29 +#define EDITLEVEL 30 /* * Development status possibilities. diff --git a/include/permonst.h b/include/permonst.h index 5125f1339..0a017c68a 100644 --- a/include/permonst.h +++ b/include/permonst.h @@ -40,7 +40,7 @@ struct attack { #include "monflag.h" struct permonst { - const char *mname; /* full name */ + const char *pmnames[NUM_MGENDERS]; char mlet; /* symbol */ schar mlevel, /* base monster level */ mmove, /* move speed */ @@ -78,4 +78,8 @@ extern NEARDATA struct permonst mons[]; /* the master list of monster types */ /* mons[SPECIAL_PM] through mons[NUMMONS-1], inclusive, are never generated randomly and cannot be polymorphed into */ +#ifdef PMNAME_MACROS +#define pmname(pm,g) ((((g) == MALE || (g) == FEMALE) && (pm)->pmnames[g]) \ + ? (pm)->pmnames[g] : (pm)->pmnames[NEUTRAL]) +#endif #endif /* PERMONST_H */ diff --git a/include/winX.h b/include/winX.h index 7cf1c2885..3f29dce75 100644 --- a/include/winX.h +++ b/include/winX.h @@ -453,7 +453,8 @@ E void NDECL(X11_wait_synch); #ifdef CLIPPING E void FDECL(X11_cliparound, (int, int)); #endif -E void FDECL(X11_print_glyph, (winid, XCHAR_P, XCHAR_P, int, int)); +E void FDECL(X11_print_glyph, (winid, XCHAR_P, XCHAR_P, + int, int, unsigned *)); E void FDECL(X11_raw_print, (const char *)); E void FDECL(X11_raw_print_bold, (const char *)); E int NDECL(X11_nhgetch); diff --git a/include/wincurs.h b/include/wincurs.h index 4e5ce4e78..001c813e6 100644 --- a/include/wincurs.h +++ b/include/wincurs.h @@ -90,7 +90,7 @@ extern void curses_mark_synch(void); extern void curses_wait_synch(void); extern void curses_cliparound(int x, int y); extern void curses_print_glyph(winid wid, XCHAR_P x, XCHAR_P y, - int glyph, int bkglyph); + int glyph, int bkglyph, unsigned *glyphmod); extern void curses_raw_print(const char *str); extern void curses_raw_print_bold(const char *str); extern int curses_nhgetch(void); diff --git a/include/wingem.h b/include/wingem.h index 6a0a517f7..f433e1cc6 100644 --- a/include/wingem.h +++ b/include/wingem.h @@ -84,7 +84,8 @@ E void FDECL(Gem_cliparound, (int, int)); #ifdef POSITIONBAR E void FDECL(Gem_update_positionbar, (char *)); #endif -E void FDECL(Gem_print_glyph, (winid, XCHAR_P, XCHAR_P, int, int)); +E void FDECL(Gem_print_glyph, (winid, XCHAR_P, XCHAR_P, + int, int, unsigned *)); E void FDECL(Gem_raw_print, (const char *)); E void FDECL(Gem_raw_print_bold, (const char *)); E int NDECL(Gem_nhgetch); diff --git a/include/winprocs.h b/include/winprocs.h index fa6652c05..728e35067 100644 --- a/include/winprocs.h +++ b/include/winprocs.h @@ -45,7 +45,8 @@ struct window_procs { #ifdef POSITIONBAR void FDECL((*win_update_positionbar), (char *)); #endif - void FDECL((*win_print_glyph), (winid, XCHAR_P, XCHAR_P, int, int)); + void FDECL((*win_print_glyph), (winid, XCHAR_P, XCHAR_P, + int, int, unsigned *)); void FDECL((*win_raw_print), (const char *)); void FDECL((*win_raw_print_bold), (const char *)); int NDECL((*win_nhgetch)); @@ -345,7 +346,8 @@ struct chain_procs { #ifdef POSITIONBAR void FDECL((*win_update_positionbar), (CARGS, char *)); #endif - void FDECL((*win_print_glyph), (CARGS, winid, XCHAR_P, XCHAR_P, int, int)); + void FDECL((*win_print_glyph), (CARGS, winid, XCHAR_P, XCHAR_P, + int, int, unsigned *)); void FDECL((*win_raw_print), (CARGS, const char *)); void FDECL((*win_raw_print_bold), (CARGS, const char *)); int FDECL((*win_nhgetch), (CARGS)); @@ -420,7 +422,8 @@ extern void FDECL(safe_cliparound, (int, int)); #ifdef POSITIONBAR extern void FDECL(safe_update_positionbar, (char *)); #endif -extern void FDECL(safe_print_glyph, (winid, XCHAR_P, XCHAR_P, int, int)); +extern void FDECL(safe_print_glyph, (winid, XCHAR_P, XCHAR_P, + int, int, unsigned *)); extern void FDECL(safe_raw_print, (const char *)); extern void FDECL(safe_raw_print_bold, (const char *)); extern int NDECL(safe_nhgetch); diff --git a/include/wintty.h b/include/wintty.h index 2d0b05fd2..5d1d444d0 100644 --- a/include/wintty.h +++ b/include/wintty.h @@ -211,7 +211,7 @@ E void FDECL(tty_cliparound, (int, int)); #ifdef POSITIONBAR E void FDECL(tty_update_positionbar, (char *)); #endif -E void FDECL(tty_print_glyph, (winid, XCHAR_P, XCHAR_P, int, int)); +E void FDECL(tty_print_glyph, (winid, XCHAR_P, XCHAR_P, int, int, unsigned *)); E void FDECL(tty_raw_print, (const char *)); E void FDECL(tty_raw_print_bold, (const char *)); E int NDECL(tty_nhgetch); diff --git a/include/you.h b/include/you.h index 0d9686f88..79d3737ff 100644 --- a/include/you.h +++ b/include/you.h @@ -479,5 +479,6 @@ struct you { }; /* end of `struct you' */ #define Upolyd (u.umonnum != u.umonster) +#define Ugender ((Upolyd ? u.mfemale : flags.female) ? 1 : 0) #endif /* YOU_H */ diff --git a/src/apply.c b/src/apply.c index daa2b9c4b..737836f15 100644 --- a/src/apply.c +++ b/src/apply.c @@ -272,7 +272,7 @@ int rx, ry, *resp; humanoid(mptr) ? "person" : "creature"); what = buf; } else { - what = mptr->mname; + what = pmname(mptr, NEUTRAL); if (!type_is_pname(mptr)) what = The(what); } @@ -408,7 +408,7 @@ register struct obj *obj; || odummy->otyp == LENSES); break; case M_AP_MONSTER: /* ignore Hallucination here */ - what = mons[mtmp->mappearance].mname; + what = pmname(&mons[mtmp->mappearance], Mgender(mtmp)); break; case M_AP_FURNITURE: what = defsyms[mtmp->mappearance].explanation; @@ -904,7 +904,7 @@ struct obj *obj; } else if (u.uhs >= WEAK) { You(look_str, "undernourished"); } else if (Upolyd) { - You("look like %s.", an(mons[u.umonnum].mname)); + You("look like %s.", an(pmname(&mons[u.umonnum], Ugender))); } else { You("look as %s as ever.", uvisage); } @@ -985,8 +985,8 @@ struct obj *obj; if (vis) pline("%s confuses itself!", Monnam(mtmp)); mtmp->mconf = 1; - } else if (monable && (mlet == S_NYMPH || mtmp->data == &mons[PM_SUCCUBUS] - || mtmp->data == &mons[PM_INCUBUS])) { + } else if (monable && + (mlet == S_NYMPH || mtmp->data == &mons[PM_AMOROUS_DEMON])) { if (vis) { char buf[BUFSZ]; /* "She" or "He" */ @@ -1951,12 +1951,12 @@ struct obj *obj; if (poly_when_stoned(g.youmonst.data)) You("tin %s without wearing gloves.", - an(mons[corpse->corpsenm].mname)); + an(mons[corpse->corpsenm].pmnames[NEUTRAL])); else { pline("Tinning %s without wearing gloves is a fatal mistake...", - an(mons[corpse->corpsenm].mname)); + an(mons[corpse->corpsenm].pmnames[NEUTRAL])); Sprintf(kbuf, "trying to tin %s without gloves", - an(mons[corpse->corpsenm].mname)); + an(mons[corpse->corpsenm].pmnames[NEUTRAL])); } instapetrify(kbuf); } @@ -2895,7 +2895,7 @@ struct obj *obj; char kbuf[BUFSZ]; Sprintf(kbuf, "%s corpse", - an(mons[otmp->corpsenm].mname)); + an(mons[otmp->corpsenm].pmnames[NEUTRAL])); pline("Snatching %s is a fatal mistake.", kbuf); instapetrify(kbuf); } diff --git a/src/attrib.c b/src/attrib.c index 551992bf7..759296702 100644 --- a/src/attrib.c +++ b/src/attrib.c @@ -298,7 +298,7 @@ boolean thrown_weapon; /* thrown weapons are less deadly */ } /* suppress killer prefix if it already has one */ - i = name_to_mon(pkiller); + i = name_to_mon(pkiller, (int *) 0); if (i >= LOW_PM && (mons[i].geno & G_UNIQ)) { kprefix = KILLED_BY; if (!type_is_pname(&mons[i])) @@ -709,11 +709,11 @@ int r; } roleabils[] = { { PM_ARCHEOLOGIST, arc_abil }, { PM_BARBARIAN, bar_abil }, - { PM_CAVEMAN, cav_abil }, + { PM_CAVE_DWELLER, cav_abil }, { PM_HEALER, hea_abil }, { PM_KNIGHT, kni_abil }, { PM_MONK, mon_abil }, - { PM_PRIEST, pri_abil }, + { PM_CLERIC, pri_abil }, { PM_RANGER, ran_abil }, { PM_ROGUE, rog_abil }, { PM_SAMURAI, sam_abil }, @@ -1054,8 +1054,8 @@ int x; #endif } else if (x == A_CHA) { if (tmp < 18 - && (g.youmonst.data->mlet == S_NYMPH || u.umonnum == PM_SUCCUBUS - || u.umonnum == PM_INCUBUS)) + && (g.youmonst.data->mlet == S_NYMPH + || u.umonnum == PM_AMOROUS_DEMON)) return (schar) 18; } else if (x == A_CON) { if (uwep && uwep->oartifact == ART_OGRESMASHER) diff --git a/src/bones.c b/src/bones.c index ca5a818cc..93c23b962 100644 --- a/src/bones.c +++ b/src/bones.c @@ -617,12 +617,12 @@ getbones() * set to the magic DEFUNCT_MONSTER cookie value. */ for (mtmp = fmon; mtmp; mtmp = mtmp->nmon) { - if (has_mname(mtmp)) - sanitize_name(MNAME(mtmp)); + if (has_mgivenname(mtmp)) + sanitize_name(MGIVENNAME(mtmp)); if (mtmp->mhpmax == DEFUNCT_MONSTER) { if (wizard) { debugpline1("Removing defunct monster %s from bones.", - mtmp->data->mname); + mtmp->data->pmnames[NEUTRAL]); } mongone(mtmp); } else diff --git a/src/botl.c b/src/botl.c index 23dd6906c..ab225740c 100644 --- a/src/botl.c +++ b/src/botl.c @@ -67,7 +67,7 @@ do_statusline1() char mbot[BUFSZ]; int k = 0; - Strcpy(mbot, mons[u.umonnum].mname); + Strcpy(mbot, pmname(&mons[u.umonnum], Ugender)); while (mbot[k] != 0) { if ((k == 0 || (k > 0 && mbot[k - 1] == ' ')) && 'a' <= mbot[k] && mbot[k] <= 'z') @@ -719,7 +719,7 @@ bot_via_windowport() */ Strcpy(nb = buf, g.plname); nb[0] = highc(nb[0]); - titl = !Upolyd ? rank() : mons[u.umonnum].mname; + titl = !Upolyd ? rank() : pmname(&mons[u.umonnum], Ugender); i = (int) (strlen(buf) + sizeof " the " + strlen(titl) - sizeof ""); /* if "Name the Rank/monster" is too long, we truncate the name but always keep at least 10 characters of it; when hitpintbar is diff --git a/src/cmd.c b/src/cmd.c index 493a10faa..0ae12b0db 100644 --- a/src/cmd.c +++ b/src/cmd.c @@ -2623,8 +2623,8 @@ boolean incl_wsegs; if (mtmp->mextra) { sz += (int) sizeof (struct mextra); - if (MNAME(mtmp)) - sz += (int) strlen(MNAME(mtmp)) + 1; + if (MGIVENNAME(mtmp)) + sz += (int) strlen(MGIVENNAME(mtmp)) + 1; if (EGD(mtmp)) sz += (int) sizeof (struct egd); if (EPRI(mtmp)) @@ -4241,7 +4241,7 @@ boolean doit; #if 0 if (Upolyd) { /* before objects */ Sprintf(buf, "Use %s special ability", - s_suffix(mons[u.umonnum].mname)); + s_suffix(pmname(&mons[u.umonnum], Ugender))); add_herecmd_menuitem(win, domonability, buf); } #endif diff --git a/src/detect.c b/src/detect.c index ddf52e59f..db5e84895 100644 --- a/src/detect.c +++ b/src/detect.c @@ -2005,12 +2005,13 @@ dump_map() blankrow = TRUE; /* assume blank until we discover otherwise */ lastnonblank = -1; /* buf[] index rather than map's x */ for (x = 1; x < COLNO; x++) { - int ch, color; - unsigned special; + int ch; + unsigned glyphmod[NUM_GLYPHMOD]; glyph = reveal_terrain_getglyph(x, y, FALSE, u.uswallow, default_glyph, subset); - (void) mapglyph(glyph, &ch, &color, &special, x, y, 0); + map_glyphmod(x, y, glyph, 0, glyphmod); + ch = (int) glyphmod[GM_TTYCHAR]; buf[x - 1] = ch; if (ch != ' ') { blankrow = FALSE; diff --git a/src/display.c b/src/display.c index 1e0ac89e7..8a98c8f55 100644 --- a/src/display.c +++ b/src/display.c @@ -132,6 +132,9 @@ static void FDECL(display_warning, (struct monst *)); static int FDECL(check_pos, (int, int, int)); static int FDECL(get_bk_glyph, (XCHAR_P, XCHAR_P)); static int FDECL(tether_glyph, (int, int)); +#ifdef UNBUFFERED_GLYPHMOD +static unsigned *FDECL(glyphmod_at, (XCHAR_P, XCHAR_P, int)); +#endif /*#define WA_VERBOSE*/ /* give (x,y) locations for all "bad" spots */ #ifdef WA_VERBOSE @@ -1367,6 +1370,17 @@ see_traps() } } +static unsigned no_gm[NUM_GLYPHMOD] = + {MG_BADXY, (unsigned) ' ', (unsigned) NO_COLOR}; +#ifndef UNBUFFERED_GLYPHMOD +#define Glyphmod_at(x,y,glyph) ( \ + ((x) < 0 || (y) < 0 || (x) >= COLNO || (y) >= ROWNO) \ + ? &no_gm[0] : &g.gbuf[(y)][(x)].glyphmod[0]) +#else +static unsigned gm[NUM_GLYPHMOD]; +#define Glyphmod_at(x,y,glyph) glyphmod_at(x, y, glyph) +#endif + /* * Put the cursor on the hero. Flush all accumulated glyphs before doing it. */ @@ -1462,7 +1476,8 @@ redraw_map() for (y = 0; y < ROWNO; ++y) for (x = 1; x < COLNO; ++x) { glyph = glyph_at(x, y); /* not levl[x][y].glyph */ - print_glyph(WIN_MAP, x, y, glyph, get_bk_glyph(x, y)); + print_glyph(WIN_MAP, x, y, glyph, get_bk_glyph(x, y), + Glyphmod_at(x, y, glyph)); } flush_screen(1); } @@ -1524,6 +1539,10 @@ void show_glyph(x, y, glyph) int x, y, glyph; { +#ifndef UNBUFFERED_GLYPHMOD + unsigned glyphmod[NUM_GLYPHMOD]; +#endif + /* * Check for bad positions and glyphs. */ @@ -1578,7 +1597,6 @@ int x, y, glyph; text = "monster"; offset = glyph; } - impossible("show_glyph: bad pos %d %d with glyph %d [%s %d].", x, y, glyph, text, offset); return; @@ -1589,10 +1607,27 @@ int x, y, glyph; MAX_GLYPH, x, y); return; } +#ifndef UNBUFFERED_GLYPHMOD + /* without UNBUFFERED_GLYPHMOD defined the glyphmod values are buffered + alongside the glyphs themselves for better performance, increased + buffer size */ + map_glyphmod(x, y, glyph, 0, glyphmod); +#endif - if (g.gbuf[y][x].glyph != glyph || iflags.use_background_glyph) { + if (g.gbuf[y][x].glyph != glyph +#ifndef UNBUFFERED_GLYPHMOD + /* I don't think we have to test for changes in TTYCHAR or COLOR + because they typically only change if the glyph changed */ + || g.gbuf[y][x].glyphmod[GM_FLAGS] != glyphmod[GM_FLAGS] +#endif + || iflags.use_background_glyph ) { g.gbuf[y][x].glyph = glyph; g.gbuf[y][x].gnew = 1; +#ifndef UNBUFFERED_GLYPHMOD + g.gbuf[y][x].glyphmod[GM_FLAGS] = glyphmod[GM_FLAGS]; + g.gbuf[y][x].glyphmod[GM_TTYCHAR] = glyphmod[GM_TTYCHAR]; + g.gbuf[y][x].glyphmod[GM_COLOR] = glyphmod[GM_COLOR]; +#endif if (g.gbuf_start[y] > x) g.gbuf_start[y] = x; if (g.gbuf_stop[y] < x) @@ -1614,6 +1649,14 @@ int x, y, glyph; } \ } +static gbuf_entry nul_gbuf = { + 0, /* gnew */ + GLYPH_UNEXPLORED, /* glyph */ +#ifndef UNBUFFERED_GLYPHMOD + {(unsigned) ' ', (unsigned) NO_COLOR, MG_UNEXPL}, +#endif +}; + /* * Turn the 3rd screen into UNEXPLORED that needs to be refreshed. */ @@ -1621,15 +1664,25 @@ void clear_glyph_buffer() { register int x, y; - register gbuf_entry *gptr, nul_gbuf; - int ch = ' ', color = NO_COLOR; - unsigned special = 0; - - (void) mapglyph(GLYPH_UNEXPLORED, &ch, &color, &special, 0, 0, 0); - nul_gbuf.gnew = (ch != ' ' || color != NO_COLOR - || (special & ~MG_UNEXPL) != 0) ? 1 : 0; - nul_gbuf.glyph = GLYPH_UNEXPLORED; + gbuf_entry *gptr = &g.gbuf[0][0]; + unsigned *gmptr = +#ifndef UNBUFFERED_GLYPHMOD + &gptr->glyphmod[0]; +#else + &gm[0]; + map_glyphmod(0, 0, GLYPH_UNEXPLORED, 0, gmptr); +#endif +#ifndef UNBUFFERED_GLYPHMOD + nul_gbuf.gnew = (gmptr[GM_TTYCHAR] != nul_gbuf.glyphmod[GM_TTYCHAR] + || gmptr[GM_COLOR] != nul_gbuf.glyphmod[GM_COLOR] + || gmptr[GM_FLAGS] != nul_gbuf.glyphmod[GM_FLAGS]) +#else + nul_gbuf.gnew = (gmptr[GM_TTYCHAR] != ' ' + || gmptr[GM_COLOR] != NO_COLOR + || (gmptr[GM_FLAGS] & ~MG_UNEXPL) != 0) +#endif + ? 1 : 0; for (y = 0; y < ROWNO; y++) { gptr = &g.gbuf[y][0]; for (x = COLNO; x; x--) { @@ -1648,16 +1701,31 @@ int start, stop, y; { register int x, glyph; register boolean force; - int ch = ' ', color = NO_COLOR; - unsigned special = 0; - - (void) mapglyph(GLYPH_UNEXPLORED, &ch, &color, &special, 0, 0, 0); - force = (ch != ' ' || color != NO_COLOR || (special & ~MG_UNEXPL) != 0); + gbuf_entry *gptr = &g.gbuf[0][0]; + unsigned *gmptr = +#ifndef UNBUFFERED_GLYPHMOD + &gptr->glyphmod[0]; +#else + &gm[0]; + map_glyphmod(0, 0, GLYPH_UNEXPLORED, 0, gmptr); +#endif +#ifndef UNBUFFERED_GLYPHMOD + force = (gmptr[GM_TTYCHAR] != nul_gbuf.glyphmod[GM_TTYCHAR] + || gmptr[GM_COLOR] != nul_gbuf.glyphmod[GM_COLOR] + || gmptr[GM_FLAGS] != nul_gbuf.glyphmod[GM_FLAGS]) +#else + force = (gmptr[GM_TTYCHAR] != ' ' + || gmptr[GM_COLOR] != NO_COLOR + || (gmptr[GM_FLAGS] & ~MG_UNEXPL) != 0) +#endif + ? 1 : 0; for (x = start; x <= stop; x++) { - glyph = g.gbuf[y][x].glyph; + gptr = &g.gbuf[y][x]; + glyph = gptr->glyph; if (force || glyph != GLYPH_UNEXPLORED) - print_glyph(WIN_MAP, x, y, glyph, get_bk_glyph(x, y)); + print_glyph(WIN_MAP, x, y, glyph, + get_bk_glyph(x, y), Glyphmod_at(x, y, glyph)); } } @@ -1712,7 +1780,8 @@ int cursor_on_u; for (; x <= g.gbuf_stop[y]; gptr++, x++) if (gptr->gnew) { - print_glyph(WIN_MAP, x, y, gptr->glyph, get_bk_glyph(x, y)); + print_glyph(WIN_MAP, x, y, gptr->glyph, + get_bk_glyph(x, y), Glyphmod_at(x, y, gptr->glyph)); gptr->gnew = 0; } } @@ -1930,6 +1999,17 @@ xchar x, y; return g.gbuf[y][x].glyph; } +#ifdef UNBUFFERED_GLYPHMOD +unsigned * +glyphmod_at(x, y, glyph) +xchar x, y; +int glyph; +{ + map_glyphmod(x, y, glyph, 0, gm); + return &gm[0]; +} +#endif + /* * This will be used to get the glyph for the background so that * it can potentially be merged into graphical window ports to @@ -2002,6 +2082,361 @@ xchar x, y; return bkglyph; } +#define HI_DOMESTIC CLR_WHITE /* monst.c */ +#ifdef TEXTCOLOR +static const int explcolors[] = { + CLR_BLACK, /* dark */ + CLR_GREEN, /* noxious */ + CLR_BROWN, /* muddy */ + CLR_BLUE, /* wet */ + CLR_MAGENTA, /* magical */ + CLR_ORANGE, /* fiery */ + CLR_WHITE, /* frosty */ +}; + +#define zap_color(n) color = iflags.use_color ? zapcolors[n] : NO_COLOR +#define cmap_color(n) color = iflags.use_color ? defsyms[n].color : NO_COLOR +#define obj_color(n) color = iflags.use_color ? objects[n].oc_color : NO_COLOR +#define mon_color(n) color = iflags.use_color ? mons[n].mcolor : NO_COLOR +#define invis_color(n) color = NO_COLOR +#define pet_color(n) color = iflags.use_color ? mons[n].mcolor : NO_COLOR +#define warn_color(n) \ + color = iflags.use_color ? def_warnsyms[n].color : NO_COLOR +#define explode_color(n) color = iflags.use_color ? explcolors[n] : NO_COLOR + +#else /* no text color */ + +#define zap_color(n) +#define cmap_color(n) +#define obj_color(n) +#define mon_color(n) +#define invis_color(n) +#define pet_color(c) +#define warn_color(n) +#define explode_color(n) +#endif + +#if defined(USE_TILES) && defined(MSDOS) +#define HAS_ROGUE_IBM_GRAPHICS \ + (g.currentgraphics == ROGUESET && SYMHANDLING(H_IBM) && !iflags.grmode) +#else +#define HAS_ROGUE_IBM_GRAPHICS \ + (g.currentgraphics == ROGUESET && SYMHANDLING(H_IBM)) +#endif + +#define is_objpile(x,y) (!Hallucination && g.level.objects[(x)][(y)] \ + && g.level.objects[(x)][(y)]->nexthere) + +#define GMAP_SET 0x00000001 +#define GMAP_ROGUELEVEL 0x00000002 +#define GMAP_ALTARCOLOR 0x00000004 + +void +map_glyphmod(x, y, glyph, mgflags, glyphmod) +xchar x, y; +int glyph; +unsigned mgflags, *glyphmod; +{ + register int offset, idx; + int color = NO_COLOR; + unsigned special = 0; + struct obj *obj; /* only used for STATUE */ + + /* condense multiple tests in macro version down to single */ + boolean has_rogue_ibm_graphics = HAS_ROGUE_IBM_GRAPHICS, + is_you = (x == u.ux && y == u.uy), + has_rogue_color = (has_rogue_ibm_graphics + && g.symset[g.currentgraphics].nocolor == 0), + do_mon_checks = FALSE; + + if (x < 0 || y < 0 || x >= COLNO || y >= ROWNO) { + glyphmod[GM_FLAGS] = MG_BADXY; + glyphmod[GM_COLOR] = NO_COLOR; + glyphmod[GM_TTYCHAR] = ' '; + return; + } + + if (!g.glyphmap_perlevel_flags) { + /* + * GMAP_SET 0x00000001 + * GMAP_ROGUELEVEL 0x00000002 + * GMAP_ALTARCOLOR 0x00000004 + */ + g.glyphmap_perlevel_flags |= GMAP_SET; + + if (Is_rogue_level(&u.uz)) { + g.glyphmap_perlevel_flags |= GMAP_ROGUELEVEL; + } else if ((Is_astralevel(&u.uz) || Is_sanctum(&u.uz))) { + g.glyphmap_perlevel_flags |= GMAP_ALTARCOLOR; + } + } + + /* + * Map the glyph to a character and color. + * + * Warning: For speed, this makes an assumption on the order of + * offsets. The order is set in display.h. + */ + if ((offset = (glyph - GLYPH_NOTHING_OFF)) >= 0) { + idx = SYM_NOTHING + SYM_OFF_X; + color = NO_COLOR; + special |= MG_NOTHING; + } else if ((offset = (glyph - GLYPH_UNEXPLORED_OFF)) >= 0) { + idx = SYM_UNEXPLORED + SYM_OFF_X; + color = NO_COLOR; + special |= MG_UNEXPL; + } else if ((offset = (glyph - GLYPH_STATUE_OFF)) >= 0) { /* a statue */ + idx = mons[offset].mlet + SYM_OFF_M; + if (has_rogue_color) + color = CLR_RED; + else + obj_color(STATUE); + special |= MG_STATUE; + if (is_objpile(x,y)) + special |= MG_OBJPILE; + if ((obj = sobj_at(STATUE, x, y)) && (obj->spe & STATUE_FEMALE)) + special |= MG_FEMALE; + } else if ((offset = (glyph - GLYPH_WARNING_OFF)) >= 0) { /* warn flash */ + idx = offset + SYM_OFF_W; + if (has_rogue_color) + color = NO_COLOR; + else + warn_color(offset); + } else if ((offset = (glyph - GLYPH_SWALLOW_OFF)) >= 0) { /* swallow */ + /* see swallow_to_glyph() in display.c */ + idx = (S_sw_tl + (offset & 0x7)) + SYM_OFF_P; + if (has_rogue_color && iflags.use_color) + color = NO_COLOR; + else + mon_color(offset >> 3); + } else if ((offset = (glyph - GLYPH_ZAP_OFF)) >= 0) { /* zap beam */ + /* see zapdir_to_glyph() in display.c */ + idx = (S_vbeam + (offset & 0x3)) + SYM_OFF_P; + if (has_rogue_color && iflags.use_color) + color = NO_COLOR; + else + zap_color((offset >> 2)); + } else if ((offset = (glyph - GLYPH_EXPLODE_OFF)) >= 0) { /* explosion */ + idx = ((offset % MAXEXPCHARS) + S_explode1) + SYM_OFF_P; + explode_color(offset / MAXEXPCHARS); + } else if ((offset = (glyph - GLYPH_CMAP_OFF)) >= 0) { /* cmap */ + idx = offset + SYM_OFF_P; + if (has_rogue_color && iflags.use_color) { + if (offset >= S_vwall && offset <= S_hcdoor) + color = CLR_BROWN; + else if (offset >= S_arrow_trap && offset <= S_polymorph_trap) + color = CLR_MAGENTA; + else if (offset == S_corr || offset == S_litcorr) + color = CLR_GRAY; + else if (offset >= S_room && offset <= S_water + && offset != S_darkroom) + color = CLR_GREEN; + else + color = NO_COLOR; +#ifdef TEXTCOLOR + /* provide a visible difference if normal and lit corridor + use the same symbol */ + } else if (iflags.use_color && offset == S_litcorr + && g.showsyms[idx] == g.showsyms[S_corr + SYM_OFF_P]) { + color = CLR_WHITE; +#endif + /* try to provide a visible difference between water and lava + if they use the same symbol and color is disabled */ + } else if (!iflags.use_color && offset == S_lava + && (g.showsyms[idx] == g.showsyms[S_pool + SYM_OFF_P] + || g.showsyms[idx] + == g.showsyms[S_water + SYM_OFF_P])) { + special |= MG_BW_LAVA; + /* similar for floor [what about empty doorway?] and ice */ + } else if (!iflags.use_color && offset == S_ice + && (g.showsyms[idx] == g.showsyms[S_room + SYM_OFF_P] + || g.showsyms[idx] + == g.showsyms[S_darkroom + SYM_OFF_P])) { + special |= MG_BW_ICE; + } else if (offset == S_altar && iflags.use_color) { + int amsk = altarmask_at(x, y); /* might be a mimic */ + + if ((g.glyphmap_perlevel_flags & GMAP_ALTARCOLOR) + && (amsk & AM_SHRINE) != 0) { + /* high altar */ + color = CLR_BRIGHT_MAGENTA; + } else { + switch (amsk & AM_MASK) { +#if 0 /* + * On OSX with TERM=xterm-color256 these render as + * white -> tty: gray, curses: ok + * gray -> both tty and curses: black + * black -> both tty and curses: blue + * red -> both tty and curses: ok. + * Since the colors have specific associations (with the + * unicorns matched with each alignment), we shouldn't use + * scrambled colors and we don't have sufficient information + * to handle platform-specific color variations. + */ + case AM_LAWFUL: /* 4 */ + color = CLR_WHITE; + break; + case AM_NEUTRAL: /* 2 */ + color = CLR_GRAY; + break; + case AM_CHAOTIC: /* 1 */ + color = CLR_BLACK; + break; +#else /* !0: TEMP? */ + case AM_LAWFUL: /* 4 */ + case AM_NEUTRAL: /* 2 */ + case AM_CHAOTIC: /* 1 */ + cmap_color(S_altar); /* gray */ + break; +#endif /* 0 */ + case AM_NONE: /* 0 */ + color = CLR_RED; + break; + default: /* 3, 5..7 -- shouldn't happen but 3 was possible + * prior to 3.6.3 (due to faulty sink polymorph) */ + color = NO_COLOR; + break; + } + } + } else { + cmap_color(offset); + } + } else if ((offset = (glyph - GLYPH_OBJ_OFF)) >= 0) { /* object */ + idx = objects[offset].oc_class + SYM_OFF_O; + if (offset == BOULDER) + idx = SYM_BOULDER + SYM_OFF_X; + if (has_rogue_color && iflags.use_color) { + switch (objects[offset].oc_class) { + case COIN_CLASS: + color = CLR_YELLOW; + break; + case FOOD_CLASS: + color = CLR_RED; + break; + default: + color = CLR_BRIGHT_BLUE; + break; + } + } else + obj_color(offset); + if (offset != BOULDER && is_objpile(x,y)) + special |= MG_OBJPILE; + } else if ((offset = (glyph - GLYPH_RIDDEN_OFF)) >= 0) { /* mon ridden */ + idx = mons[offset].mlet + SYM_OFF_M; + if (has_rogue_color) + /* This currently implies that the hero is here -- monsters */ + /* don't ride (yet...). Should we set it to yellow like in */ + /* the monster case below? There is no equivalent in rogue. */ + color = NO_COLOR; /* no need to check iflags.use_color */ + else + mon_color(offset); + special |= MG_RIDDEN; + do_mon_checks = TRUE; + } else if ((offset = (glyph - GLYPH_BODY_OFF)) >= 0) { /* a corpse */ + idx = objects[CORPSE].oc_class + SYM_OFF_O; + if (has_rogue_color && iflags.use_color) + color = CLR_RED; + else + mon_color(offset); + special |= MG_CORPSE; + if (is_objpile(x,y)) + special |= MG_OBJPILE; + } else if ((offset = (glyph - GLYPH_DETECT_OFF)) >= 0) { /* mon detect */ + idx = mons[offset].mlet + SYM_OFF_M; + if (has_rogue_color) + color = NO_COLOR; /* no need to check iflags.use_color */ + else + mon_color(offset); + /* Disabled for now; anyone want to get reverse video to work? */ + /* is_reverse = TRUE; */ + special |= MG_DETECT; + do_mon_checks = TRUE; + } else if ((offset = (glyph - GLYPH_INVIS_OFF)) >= 0) { /* invisible */ + idx = SYM_INVISIBLE + SYM_OFF_X; + if (has_rogue_color) + color = NO_COLOR; /* no need to check iflags.use_color */ + else + invis_color(offset); + special |= MG_INVIS; + } else if ((offset = (glyph - GLYPH_PET_OFF)) >= 0) { /* a pet */ + idx = mons[offset].mlet + SYM_OFF_M; + if (has_rogue_color) + color = NO_COLOR; /* no need to check iflags.use_color */ + else + pet_color(offset); + special |= MG_PET; + do_mon_checks = TRUE; + } else { /* a monster */ + idx = mons[glyph].mlet + SYM_OFF_M; + if (has_rogue_color && iflags.use_color) { + if (is_you) + /* actually player should be yellow-on-gray if in corridor */ + color = CLR_YELLOW; + else + color = NO_COLOR; + } else { + mon_color(glyph); +#ifdef TEXTCOLOR + /* special case the hero for `showrace' option */ + if (iflags.use_color && is_you && flags.showrace && !Upolyd) + color = HI_DOMESTIC; +#endif + } + do_mon_checks = TRUE; + } + + if (do_mon_checks) { + struct monst *m; + + if (is_you) { + if (Ugender == FEMALE) + special |= MG_FEMALE; + } else { + /* when hero is riding, steed will be shown at hero's location + but has not been placed on the map so m_at() won't find it */ + m = (x == u.ux && y == u.uy && u.usteed) ? u.usteed : m_at(x, y); + if (m) { + if (!Hallucination) { + if (m->female) + special |= MG_FEMALE; + } else if (rn2_on_display_rng(2)) { + special |= MG_FEMALE; + } + } + } + } + /* These were requested by a blind player to enhance screen reader use */ + if (sysopt.accessibility == 1 && !(mgflags & MG_FLAG_NOOVERRIDE)) { + int ovidx; + + if ((special & MG_PET) != 0) { + ovidx = SYM_PET_OVERRIDE + SYM_OFF_X; + if ((g.glyphmap_perlevel_flags & GMAP_ROGUELEVEL) + ? g.ov_rogue_syms[ovidx] + : g.ov_primary_syms[ovidx]) + idx = ovidx; + } + if (is_you) { + ovidx = SYM_HERO_OVERRIDE + SYM_OFF_X; + if ((g.glyphmap_perlevel_flags & GMAP_ROGUELEVEL) + ? g.ov_rogue_syms[ovidx] + : g.ov_primary_syms[ovidx]) + idx = ovidx; + } + } + + glyphmod[GM_TTYCHAR] = ((mgflags & MG_FLAG_RETURNIDX) != 0) ? idx : g.showsyms[idx]; + +#ifdef TEXTCOLOR + /* Turn off color if no color defined, or rogue level w/o PC graphics. */ + if (!has_color(color) + || ((g.glyphmap_perlevel_flags & GMAP_ROGUELEVEL) && !has_rogue_color)) +#endif + color = NO_COLOR; + glyphmod[GM_COLOR] = color; + glyphmod[GM_FLAGS] = special; +} + /* ------------------------------------------------------------------------ */ /* Wall Angle ------------------------------------------------------------- */ diff --git a/src/do_name.c b/src/do_name.c index c4c2f654c..8a757fb7e 100644 --- a/src/do_name.c +++ b/src/do_name.c @@ -18,7 +18,7 @@ static void NDECL(gloc_filter_done); static boolean FDECL(gather_locs_interesting, (int, int, int)); static void FDECL(gather_locs, (coord **, int *, int)); static void FDECL(auto_describe, (int, int)); -static void NDECL(do_mname); +static void NDECL(do_mgivenname); static boolean FDECL(alreadynamed, (struct monst *, char *, char *)); static void FDECL(do_oname, (struct obj *)); static char *FDECL(docall_xname, (struct obj *)); @@ -996,7 +996,7 @@ const char *goal; /* allocate space for a monster's name; removes old name if there is one */ void -new_mname(mon, lth) +new_mgivenname(mon, lth) struct monst *mon; int lth; /* desired length (caller handles adding 1 for terminator) */ { @@ -1005,23 +1005,23 @@ int lth; /* desired length (caller handles adding 1 for terminator) */ if (!mon->mextra) mon->mextra = newmextra(); else - free_mname(mon); /* already has mextra, might also have name */ - MNAME(mon) = (char *) alloc((unsigned) lth); + free_mgivenname(mon); /* already has mextra, might also have name */ + MGIVENNAME(mon) = (char *) alloc((unsigned) lth); } else { /* zero length: the new name is empty; get rid of the old name */ - if (has_mname(mon)) - free_mname(mon); + if (has_mgivenname(mon)) + free_mgivenname(mon); } } /* release a monster's name; retains mextra even if all fields are now null */ void -free_mname(mon) +free_mgivenname(mon) struct monst *mon; { - if (has_mname(mon)) { - free((genericptr_t) MNAME(mon)); - MNAME(mon) = (char *) 0; + if (has_mgivenname(mon)) { + free((genericptr_t) MGIVENNAME(mon)); + MGIVENNAME(mon) = (char *) 0; } } @@ -1087,14 +1087,14 @@ const char *name; name = strncpy(buf, name, PL_PSIZ - 1); buf[PL_PSIZ - 1] = '\0'; } - new_mname(mtmp, lth); /* removes old name if one is present */ + new_mgivenname(mtmp, lth); /* removes old name if one is present */ if (lth) - Strcpy(MNAME(mtmp), name); + Strcpy(MGIVENNAME(mtmp), name); return mtmp; } /* check whether user-supplied name matches or nearly matches an unnameable - monster's name; if so, give an alternate reject message for do_mname() */ + monster's name; if so, give an alternate reject message for do_mgivenname() */ static boolean alreadynamed(mtmp, monnambuf, usrbuf) struct monst *mtmp; @@ -1126,7 +1126,7 @@ char *monnambuf, *usrbuf; /* allow player to assign a name to some chosen monster */ static void -do_mname() +do_mgivenname() { char buf[BUFSZ], monnambuf[BUFSZ], qbuf[QBUFSZ]; coord cc; @@ -1170,8 +1170,8 @@ do_mname() buf[0] = '\0'; #ifdef EDIT_GETLIN /* if there's an existing name, make it be the default answer */ - if (has_mname(mtmp)) - Strcpy(buf, MNAME(mtmp)); + if (has_mgivenname(mtmp)) + Strcpy(buf, MGIVENNAME(mtmp)); #endif getlin(qbuf, buf); if (!*buf || *buf == '\033') @@ -1398,7 +1398,7 @@ docallcmd() case 'q': break; case 'm': /* name a visible monster */ - do_mname(); + do_mgivenname(); break; case 'i': /* name an individual object in inventory */ allowall[0] = ALL_CLASSES; @@ -1661,7 +1661,7 @@ boolean called; { char *buf = nextmbuf(); struct permonst *mdat = mtmp->data; - const char *pm_name = mdat->mname; + const char *pm_name = pmname(mdat, Mgender(mtmp)); boolean do_hallu, do_invis, do_it, do_saddle, do_name; boolean name_at_start, has_adjectives; char *bp; @@ -1706,12 +1706,14 @@ boolean called; name += 4; return strcpy(buf, name); } +#if 0 /* an "aligned priest" not flagged as a priest or minion should be "priest" or "priestess" (normally handled by priestname()) */ - if (mdat == &mons[PM_ALIGNED_PRIEST]) + if (mdat == &mons[PM_ALIGNED_CLERIC]) pm_name = mtmp->female ? "priestess" : "priest"; - else if (mdat == &mons[PM_HIGH_PRIEST] && mtmp->female) + else if (mdat == &mons[PM_HIGH_CLERIC] && mtmp->female) pm_name = "high priestess"; +#endif /* Shopkeepers: use shopkeeper name. For normal shopkeepers, just * "Asidonhopo"; for unusual ones, "Asidonhopo the invisible @@ -1755,8 +1757,8 @@ boolean called; Strcat(buf, rname); name_at_start = bogon_is_pname(rnamecode); - } else if (do_name && has_mname(mtmp)) { - char *name = MNAME(mtmp); + } else if (do_name && has_mgivenname(mtmp)) { + char *name = MGIVENNAME(mtmp); if (mdat == &mons[PM_GHOST]) { Sprintf(eos(buf), "%s ghost", s_suffix(name)); @@ -1829,7 +1831,7 @@ l_monnam(mtmp) struct monst *mtmp; { return x_monnam(mtmp, ARTICLE_NONE, (char *) 0, - (has_mname(mtmp)) ? SUPPRESS_SADDLE : 0, TRUE); + (has_mgivenname(mtmp)) ? SUPPRESS_SADDLE : 0, TRUE); } char * @@ -1837,7 +1839,7 @@ mon_nam(mtmp) struct monst *mtmp; { return x_monnam(mtmp, ARTICLE_THE, (char *) 0, - (has_mname(mtmp)) ? SUPPRESS_SADDLE : 0, FALSE); + (has_mgivenname(mtmp)) ? SUPPRESS_SADDLE : 0, FALSE); } /* print the name as if mon_nam() was called, but assume that the player @@ -1849,7 +1851,7 @@ noit_mon_nam(mtmp) struct monst *mtmp; { return x_monnam(mtmp, ARTICLE_THE, (char *) 0, - (has_mname(mtmp)) ? (SUPPRESS_SADDLE | SUPPRESS_IT) + (has_mgivenname(mtmp)) ? (SUPPRESS_SADDLE | SUPPRESS_IT) : SUPPRESS_IT, FALSE); } @@ -1900,7 +1902,7 @@ struct monst *mtmp; int prefix, suppression_flag; prefix = mtmp->mtame ? ARTICLE_YOUR : ARTICLE_THE; - suppression_flag = (has_mname(mtmp) + suppression_flag = (has_mgivenname(mtmp) /* "saddled" is redundant when mounted */ || mtmp == u.usteed) ? SUPPRESS_SADDLE @@ -1915,7 +1917,7 @@ struct monst *mtmp; const char *adj; { char *bp = x_monnam(mtmp, ARTICLE_THE, adj, - has_mname(mtmp) ? SUPPRESS_SADDLE : 0, FALSE); + has_mgivenname(mtmp) ? SUPPRESS_SADDLE : 0, FALSE); *bp = highc(*bp); return bp; @@ -1926,7 +1928,7 @@ a_monnam(mtmp) struct monst *mtmp; { return x_monnam(mtmp, ARTICLE_A, (char *) 0, - has_mname(mtmp) ? SUPPRESS_SADDLE : 0, FALSE); + has_mgivenname(mtmp) ? SUPPRESS_SADDLE : 0, FALSE); } char * @@ -1950,7 +1952,7 @@ char *outbuf; /* high priest(ess)'s identity is concealed on the Astral Plane, unless you're adjacent (overridden for hallucination which does its own obfuscation) */ - if (mon->data == &mons[PM_HIGH_PRIEST] && !Hallucination + if (mon->data == &mons[PM_HIGH_CLERIC] && !Hallucination && Is_astralevel(&u.uz) && distu(mon->mx, mon->my) > 2) { Strcpy(outbuf, article == ARTICLE_THE ? "the " : ""); Strcat(outbuf, mon->female ? "high priestess" : "high priest"); @@ -2048,37 +2050,65 @@ boolean ckloc; } else if (ckloc && ptr == &mons[PM_LONG_WORM] && g.level.monsters[mon->mx][mon->my] != mon) { Sprintf(outbuf, "%s <%d,%d>", - mons[PM_LONG_WORM_TAIL].mname, mon->mx, mon->my); + pmname(&mons[PM_LONG_WORM_TAIL], Mgender(mon)), mon->mx, mon->my); } else { Sprintf(outbuf, "%s%s <%d,%d>", mon->mtame ? "tame " : mon->mpeaceful ? "peaceful " : "", - mon->data->mname, mon->mx, mon->my); + pmname(mon->data, Mgender(mon)), mon->mx, mon->my); if (mon->cham != NON_PM) - Sprintf(eos(outbuf), "{%s}", mons[mon->cham].mname); + Sprintf(eos(outbuf), "{%s}", pmname(&mons[mon->cham], Mgender(mon))); } return outbuf; } +#ifndef PMNAME_MACROS +int +Mgender(mtmp) +struct monst *mtmp; +{ + int mgender = MALE; + + if (mtmp == &g.youmonst) { + if (Upolyd ? u.mfemale : flags.female) + mgender = FEMALE; + } else if (mtmp->female) { + mgender = FEMALE; + } + return mgender; +} + +const char * +pmname(pm, mgender) +struct permonst *pm; +int mgender; +{ + if ((mgender >= MALE && mgender < NUM_MGENDERS) && pm->pmnames[mgender]) + return pm->pmnames[mgender]; + else + return pm->pmnames[NEUTRAL]; +} +#endif /* PMNAME_MACROS */ + /* fake monsters used to be in a hard-coded array, now in a data file */ char * bogusmon(buf, code) char *buf, *code; { static const char bogon_codes[] = "-_+|="; /* see dat/bonusmon.txt */ - char *mname = buf; + char *mnam = buf; if (code) *code = '\0'; /* might fail (return empty buf[]) if the file isn't available */ get_rnd_text(BOGUSMONFILE, buf, rn2_on_display_rng); - if (!*mname) { + if (!*mnam) { Strcpy(buf, "bogon"); - } else if (index(bogon_codes, *mname)) { /* strip prefix if present */ + } else if (index(bogon_codes, *mnam)) { /* strip prefix if present */ if (code) - *code = *mname; - ++mname; + *code = *mnam; + ++mnam; } - return mname; + return mnam; } /* return a random monster name, for hallucination */ @@ -2087,7 +2117,7 @@ rndmonnam(code) char *code; { static char buf[BUFSZ]; - char *mname; + char *mnam; int name; #define BOGUSMONSIZE 100 /* arbitrary */ @@ -2100,11 +2130,11 @@ char *code; && (type_is_pname(&mons[name]) || (mons[name].geno & G_NOGEN))); if (name >= SPECIAL_PM) { - mname = bogusmon(buf, code); + mnam = bogusmon(buf, code); } else { - mname = strcpy(buf, mons[name].mname); + mnam = strcpy(buf, pmname(&mons[name], rn2_on_display_rng(2))); } - return mname; + return mnam; #undef BOGUSMONSIZE } diff --git a/src/do_wear.c b/src/do_wear.c index 670fc6aa8..044b363d6 100644 --- a/src/do_wear.c +++ b/src/do_wear.c @@ -428,7 +428,7 @@ Helmet_on(VOID_ARGS) inventory; do so now [set_bknown() calls update_inventory()] */ if (Blind) set_bknown(uarmh, 0); /* lose bknown if previously set */ - else if (Role_if(PM_PRIEST)) + else if (Role_if(PM_CLERIC)) set_bknown(uarmh, 1); /* (bknown should already be set) */ else if (uarmh->bknown) update_inventory(); /* keep bknown as-is; display the curse */ @@ -766,6 +766,8 @@ Amulet_on() You("are suddenly very %s!", flags.female ? "feminine" : "masculine"); g.context.botl = 1; + newsym(u.ux, u.uy); /* glyphmon flag and tile may have gone + from male to female or vice versa */ } else /* already polymorphed into single-gender monster; only changed the character's base sex */ diff --git a/src/dog.c b/src/dog.c index 450996168..50ffd00c9 100644 --- a/src/dog.c +++ b/src/dog.c @@ -170,7 +170,7 @@ makedog() /* default pet names */ if (!*petname && pettype == PM_LITTLE_DOG) { /* All of these names were for dogs. */ - if (Role_if(PM_CAVEMAN)) + if (Role_if(PM_CAVE_DWELLER)) petname = "Slasher"; /* The Warrior */ if (Role_if(PM_SAMURAI)) petname = "Hachi"; /* Shibuya Station */ diff --git a/src/dogmove.c b/src/dogmove.c index 363bbcd5c..8d255ec3e 100644 --- a/src/dogmove.c +++ b/src/dogmove.c @@ -1429,7 +1429,8 @@ struct monst *mtmp; && OBJ_NAME(objects[mtmp->mappearance])) ? an(OBJ_NAME(objects[mtmp->mappearance])) : (M_AP_TYPE(mtmp) == M_AP_MONSTER) - ? an(mons[mtmp->mappearance].mname) + ? an(pmname(&mons[mtmp->mappearance], + Mgender(mtmp))) : something, cansee(mtmp->mx, mtmp->my) ? "" : "has ", cansee(mtmp->mx, mtmp->my) ? "" : "ed", diff --git a/src/dokick.c b/src/dokick.c index 765316522..c685fa201 100644 --- a/src/dokick.c +++ b/src/dokick.c @@ -1159,9 +1159,6 @@ dokick() } if (IS_SINK(g.maploc->typ)) { int gend = poly_gender(); - short washerndx = (gend == 1 || (gend == 2 && rn2(2))) - ? PM_INCUBUS - : PM_SUCCUBUS; if (Levitation) goto dumb; @@ -1185,10 +1182,12 @@ dokick() g.maploc->looted |= S_LPUDDING; return 1; } else if (!(g.maploc->looted & S_LDWASHER) && !rn2(3) - && !(g.mvitals[washerndx].mvflags & G_GONE)) { + && !(g.mvitals[PM_AMOROUS_DEMON].mvflags & G_GONE)) { /* can't resist... */ pline("%s returns!", (Blind ? Something : "The dish washer")); - if (makemon(&mons[washerndx], x, y, NO_MM_FLAGS)) + if (makemon(&mons[PM_AMOROUS_DEMON], x, y, + (gend == 1 || (gend == 2 && rn2(2))) + ? MM_FEMALE : MM_MALE)) newsym(x, y); g.maploc->looted |= S_LDWASHER; exercise(A_DEX, TRUE); @@ -1746,7 +1745,7 @@ unsigned long deliverflags; /* special treatment for orcs and their kind */ if ((otmp->corpsenm & M2_ORC) != 0 && has_oname(otmp)) { - if (!has_mname(mtmp)) { + if (!has_mgivenname(mtmp)) { if (at_crime_scene || !rn2(2)) mtmp = christen_orc(mtmp, at_crime_scene ? ONAME(otmp) diff --git a/src/dothrow.c b/src/dothrow.c index c3695658d..8318bafb3 100644 --- a/src/dothrow.c +++ b/src/dothrow.c @@ -39,7 +39,7 @@ struct obj *launcher; /* can be NULL */ schar skill = objects[ammo->otyp].oc_skill; switch (pm) { - case PM_CAVEMAN: + case PM_CAVE_DWELLER: /* give bonus for low-tech gear */ if (skill == -P_SLING || skill == P_SPEAR) multishot++; @@ -158,7 +158,7 @@ int shotlimit; : obj->oclass == WEAPON_CLASS) && !(Confusion || Stunned)) { /* some roles don't get a volley bonus until becoming expert */ - weakmultishot = (Role_if(PM_WIZARD) || Role_if(PM_PRIEST) + weakmultishot = (Role_if(PM_WIZARD) || Role_if(PM_CLERIC) || (Role_if(PM_HEALER) && skill != P_KNIFE) || (Role_if(PM_TOURIST) && skill != -P_DART) /* poor dexterity also inhibits multishot */ diff --git a/src/eat.c b/src/eat.c index f73c4d1d5..13628642b 100644 --- a/src/eat.c +++ b/src/eat.c @@ -40,7 +40,7 @@ static int FDECL(tin_variety, (struct obj *, BOOLEAN_P)); static boolean FDECL(maybe_cannibal, (int, BOOLEAN_P)); /* also used to see if you're allowed to eat cats and dogs */ -#define CANNIBAL_ALLOWED() (Role_if(PM_CAVEMAN) || Race_if(PM_ORC)) +#define CANNIBAL_ALLOWED() (Role_if(PM_CAVE_DWELLER) || Race_if(PM_ORC)) /* monster types that cause hero to be turned into stone if eaten */ #define flesh_petrifies(pm) (touch_petrifies(pm) || (pm) == &mons[PM_MEDUSA]) @@ -516,7 +516,8 @@ int *dmg_p; /* for dishing out extra damage in lieu of Int loss */ tentacle-touch should have been caught before reaching this far) */ if (magr == &g.youmonst) { if (!Stone_resistance && !Stoned) - make_stoned(5L, (char *) 0, KILLED_BY_AN, pd->mname); + make_stoned(5L, (char *) 0, KILLED_BY_AN, + pmname(pd, Mgender(mdef))); } else { /* no need to check for poly_when_stoned or Stone_resistance; mind flayers don't have those capabilities */ @@ -546,7 +547,8 @@ int *dmg_p; /* for dishing out extra damage in lieu of Int loss */ return MM_MISS; } else if (is_rider(pd)) { pline("Ingesting that is fatal."); - Sprintf(g.killer.name, "unwisely ate the brain of %s", pd->mname); + Sprintf(g.killer.name, "unwisely ate the brain of %s", + pmname(pd, Mgender(mdef))); g.killer.format = NO_KILLER_PREFIX; done(DIED); /* life-saving needed to reach here */ @@ -676,7 +678,8 @@ register int pm; if (!Stone_resistance && !(poly_when_stoned(g.youmonst.data) && polymon(PM_STONE_GOLEM))) { - Sprintf(g.killer.name, "tasting %s meat", mons[pm].mname); + Sprintf(g.killer.name, "tasting %s meat", + mons[pm].pmnames[NEUTRAL]); g.killer.format = KILLED_BY; You("turn to stone."); done(STONING); @@ -695,7 +698,8 @@ register int pm; case PM_LARGE_CAT: /* cannibals are allowed to eat domestic animals without penalty */ if (!CANNIBAL_ALLOWED()) { - You_feel("that eating the %s was a bad idea.", mons[pm].mname); + You_feel("that eating the %s was a bad idea.", + mons[pm].pmnames[NEUTRAL]); HAggravate_monster |= FROMOUTSIDE; } break; @@ -707,7 +711,8 @@ register int pm; case PM_PESTILENCE: case PM_FAMINE: { pline("Eating that is instantly fatal."); - Sprintf(g.killer.name, "unwisely ate the body of %s", mons[pm].mname); + Sprintf(g.killer.name, "unwisely ate the body of %s", + mons[pm].pmnames[NEUTRAL]); g.killer.format = NO_KILLER_PREFIX; done(DIED); /* life-saving needed to reach here */ @@ -1033,7 +1038,7 @@ int pm; Hallucination ? "You suddenly dread being peeled and mimic %s again!" : "You now prefer mimicking %s again.", - an(Upolyd ? g.youmonst.data->mname : g.urace.noun)); + an(Upolyd ? pmname(g.youmonst.data, Ugender) : g.urace.noun)); g.eatmbuf = dupstr(buf); g.nomovemsg = g.eatmbuf; g.afternmv = eatmdone; @@ -1247,9 +1252,9 @@ char *buf; Strcpy(eos(buf), " of "); } if (vegetarian(&mons[mnum])) - Sprintf(eos(buf), "%s", mons[mnum].mname); + Sprintf(eos(buf), "%s", mons[mnum].pmnames[NEUTRAL]); else - Sprintf(eos(buf), "%s meat", mons[mnum].mname); + Sprintf(eos(buf), "%s meat", mons[mnum].pmnames[NEUTRAL]); } } } @@ -1343,7 +1348,7 @@ const char *mesg; } else if (Hallucination) { what = rndmonnam(NULL); } else { - what = mons[mnum].mname; + what = mons[mnum].pmnames[NEUTRAL]; if (the_unique_pm(&mons[mnum])) which = 2; else if (type_is_pname(&mons[mnum])) @@ -1370,7 +1375,7 @@ const char *mesg; g.context.victual.fullwarn = g.context.victual.eating = g.context.victual.doreset = FALSE; - You("consume %s %s.", tintxts[r].txt, mons[mnum].mname); + You("consume %s %s.", tintxts[r].txt, mons[mnum].pmnames[NEUTRAL]); eating_conducts(&mons[mnum]); @@ -2254,7 +2259,7 @@ struct obj *otmp; && polymon(PM_STONE_GOLEM))) { if (!Stoned) { Sprintf(g.killer.name, "%s egg", - mons[otmp->corpsenm].mname); + mons[otmp->corpsenm].pmnames[NEUTRAL]); make_stoned(5L, (char *) 0, KILLED_BY_AN, g.killer.name); } } diff --git a/src/end.c b/src/end.c index 50f593280..f362a07c6 100644 --- a/src/end.c +++ b/src/end.c @@ -409,13 +409,13 @@ int how; /* "killed by the high priest of Crom" is okay, "killed by the high priest" alone isn't */ if ((mptr->geno & G_UNIQ) != 0 && !(imitator && !mimicker) - && !(mptr == &mons[PM_HIGH_PRIEST] && !mtmp->ispriest)) { + && !(mptr == &mons[PM_HIGH_CLERIC] && !mtmp->ispriest)) { if (!type_is_pname(mptr)) Strcat(buf, "the "); g.killer.format = KILLED_BY; } /* _the_ ghost of Dudley */ - if (mptr == &mons[PM_GHOST] && has_mname(mtmp)) { + if (mptr == &mons[PM_GHOST] && has_mgivenname(mtmp)) { Strcat(buf, "the "); g.killer.format = KILLED_BY; } @@ -427,14 +427,15 @@ int how; if (imitator) { char shape[BUFSZ]; - const char *realnm = champtr->mname, *fakenm = mptr->mname; + const char *realnm = pmname(champtr, Mgender(mtmp)), + *fakenm = pmname(mptr, Mgender(mtmp)); boolean alt = is_vampshifter(mtmp); if (mimicker) { /* realnm is already correct because champtr==mptr; set up fake mptr for type_is_pname/the_unique_pm */ mptr = &mons[mtmp->mappearance]; - fakenm = mptr->mname; + fakenm = pmname(mptr, Mgender(mtmp)); } else if (alt && strstri(realnm, "vampire") && !strcmp(fakenm, "vampire bat")) { /* special case: use "vampire in bat form" in preference @@ -459,8 +460,8 @@ int how; mptr = mtmp->data; /* reset for mimicker case */ } else if (mptr == &mons[PM_GHOST]) { Strcat(buf, "ghost"); - if (has_mname(mtmp)) - Sprintf(eos(buf), " of %s", MNAME(mtmp)); + if (has_mgivenname(mtmp)) + Sprintf(eos(buf), " of %s", MGIVENNAME(mtmp)); } else if (mtmp->isshk) { const char *shknm = shkname(mtmp), *honorific = shkname_is_pname(mtmp) ? "" @@ -473,9 +474,9 @@ int how; it overrides the effect of Hallucination on priestname() */ Strcat(buf, m_monnam(mtmp)); } else { - Strcat(buf, mptr->mname); - if (has_mname(mtmp)) - Sprintf(eos(buf), " called %s", MNAME(mtmp)); + Strcat(buf, pmname(mptr, Mgender(mtmp))); + if (has_mgivenname(mtmp)) + Sprintf(eos(buf), " called %s", MGIVENNAME(mtmp)); } Strcpy(g.killer.name, buf); @@ -1414,7 +1415,7 @@ int how; (u.ugrave_arise != PM_GREEN_SLIME) ? "body rises from the dead" : "revenant persists", - an(mons[u.ugrave_arise].mname)); + an(pmname(&mons[u.ugrave_arise], Ugender))); display_nhwindow(WIN_MESSAGE, FALSE); } diff --git a/src/exper.c b/src/exper.c index de4404ab4..ea2dcc6bb 100644 --- a/src/exper.c +++ b/src/exper.c @@ -28,7 +28,7 @@ enermod(en) int en; { switch (Role_switch) { - case PM_PRIEST: + case PM_CLERIC: case PM_WIZARD: return (2 * en); case PM_HEALER: diff --git a/src/explode.c b/src/explode.c index 8abe642fd..30dc6b92c 100644 --- a/src/explode.c +++ b/src/explode.c @@ -66,7 +66,7 @@ int expltype; type = 0; } switch (Role_switch) { - case PM_PRIEST: + case PM_CLERIC: case PM_MONK: case PM_WIZARD: damu /= 5; diff --git a/src/files.c b/src/files.c index dd7245861..f995f8d1a 100644 --- a/src/files.c +++ b/src/files.c @@ -3089,7 +3089,7 @@ struct obj *obj; /* subset of starting inventory pre-ID */ obj->dknown = 1; - if (Role_if(PM_PRIEST)) + if (Role_if(PM_CLERIC)) obj->bknown = 1; /* ok to bypass set_bknown() */ /* same criteria as lift_object()'s check for available inventory slot */ if (obj->oclass != COIN_CLASS && inv_cnt(FALSE) >= 52 diff --git a/src/hack.c b/src/hack.c index 7d766ec31..30ea83a96 100644 --- a/src/hack.c +++ b/src/hack.c @@ -1913,10 +1913,10 @@ domove_core() You("%s %s.", mtmp->mpeaceful ? "swap places with" : "frighten", x_monnam(mtmp, mtmp->mtame ? ARTICLE_YOUR - : (!has_mname(mtmp) && !type_is_pname(mtmp->data)) + : (!has_mgivenname(mtmp) && !type_is_pname(mtmp->data)) ? ARTICLE_THE : ARTICLE_NONE, (mtmp->mpeaceful && !mtmp->mtame) ? "peaceful" : 0, - has_mname(mtmp) ? SUPPRESS_SADDLE : 0, FALSE)); + has_mgivenname(mtmp) ? SUPPRESS_SADDLE : 0, FALSE)); /* check for displacing it into pools and traps */ switch (minliquid(mtmp) ? 2 : mintrap(mtmp)) { @@ -3071,7 +3071,8 @@ const char *msg_override; if life-saved while poly'd and Unchanging (explore or wizard mode declining to die since can't be both Unchanging and Lifesaved) */ if (Upolyd && !strncmpi(g.nomovemsg, "You survived that ", 18)) - You("are %s.", an(mons[u.umonnum].mname)); /* (ignore Hallu) */ + You("are %s.", + an(pmname(&mons[u.umonnum], Ugender))); /* (ignore Hallu) */ } g.nomovemsg = 0; u.usleep = 0; diff --git a/src/insight.c b/src/insight.c index 57cd5596e..fd5bbfd3e 100644 --- a/src/insight.c +++ b/src/insight.c @@ -327,10 +327,12 @@ int final; if (!is_male(uasmon) && !is_female(uasmon) && !is_neuter(uasmon)) Sprintf(tmpbuf, "%s ", genders[flags.female ? 1 : 0].adj); if (altphrasing) - Sprintf(eos(tmpbuf), "%s in ", mons[g.youmonst.cham].mname); + Sprintf(eos(tmpbuf), "%s in ", + pmname(&mons[g.youmonst.cham], + flags.female ? FEMALE : MALE)); Sprintf(buf, "%s%s%s%s form", !final ? "currently " : "", altphrasing ? just_an(anbuf, tmpbuf) : "in ", - tmpbuf, uasmon->mname); + tmpbuf, pmname(uasmon, flags.female ? FEMALE : MALE)); you_are(buf, ""); } @@ -1367,7 +1369,7 @@ int final; } if (Warn_of_mon && g.context.warntype.speciesidx >= LOW_PM) { Sprintf(buf, "aware of the presence of %s", - makeplural(mons[g.context.warntype.speciesidx].mname)); + makeplural(mons[g.context.warntype.speciesidx].pmnames[NEUTRAL])); you_are(buf, from_what(WARN_OF_MON)); } if (Undead_warning) @@ -1574,10 +1576,14 @@ int final; && u.umonnum == PM_GREEN_SLIME && !Unchanging)) { /* foreign shape (except were-form which is handled below) */ if (!vampshifted(&g.youmonst)) - Sprintf(buf, "polymorphed into %s", an(g.youmonst.data->mname)); + Sprintf(buf, "polymorphed into %s", + an(pmname(g.youmonst.data, + flags.female ? FEMALE : MALE))); else Sprintf(buf, "polymorphed into %s in %s form", - an(mons[g.youmonst.cham].mname), g.youmonst.data->mname); + an(pmname(&mons[g.youmonst.cham], + flags.female ? FEMALE : MALE)), + pmname(g.youmonst.data, flags.female ? FEMALE : MALE)); if (wizard) Sprintf(eos(buf), " (%d)", u.mtimedone); you_are(buf, ""); @@ -1586,7 +1592,8 @@ int final; you_can("lay eggs", ""); if (u.ulycn >= LOW_PM) { /* "you are a werecreature [in beast form]" */ - Strcpy(buf, an(mons[u.ulycn].mname)); + Strcpy(buf, an(pmname(&mons[u.ulycn], + flags.female ? FEMALE : MALE))); if (u.umonnum == u.ulycn) { Strcat(buf, " in beast form"); if (wizard) @@ -2226,15 +2233,16 @@ const genericptr vptr2; res = mstr2 - mstr1; /* monstr high to low */ break; case VANQ_ALPHA_SEP: - uniq1 = ((mons[indx1].geno & G_UNIQ) && indx1 != PM_HIGH_PRIEST); - uniq2 = ((mons[indx2].geno & G_UNIQ) && indx2 != PM_HIGH_PRIEST); + uniq1 = ((mons[indx1].geno & G_UNIQ) && indx1 != PM_HIGH_CLERIC); + uniq2 = ((mons[indx2].geno & G_UNIQ) && indx2 != PM_HIGH_CLERIC); if (uniq1 ^ uniq2) { /* one or other uniq, but not both */ res = uniq2 - uniq1; break; } /* else both unique or neither unique */ /*FALLTHRU*/ case VANQ_ALPHA_MIX: - name1 = mons[indx1].mname, name2 = mons[indx2].mname; + name1 = mons[indx1].pmnames[NEUTRAL], + name2 = mons[indx2].pmnames[NEUTRAL]; res = strcmpi(name1, name2); /* caseblind alhpa, low to high */ break; case VANQ_MCLS_HTOL: @@ -2344,7 +2352,7 @@ doborn() g.mvitals[i].died, g.mvitals[i].born, ((g.mvitals[i].mvflags & G_GONE) == G_EXTINCT) ? 'E' : ((g.mvitals[i].mvflags & G_GONE) == G_GENOD) ? 'G' : ' ', - mons[i].mname); + mons[i].pmnames[NEUTRAL]); putstr(datawin, 0, buf); nborn += g.mvitals[i].born; ndied += g.mvitals[i].died; @@ -2361,7 +2369,7 @@ doborn() /* high priests aren't unique but are flagged as such to simplify something */ #define UniqCritterIndx(mndx) ((mons[mndx].geno & G_UNIQ) \ - && mndx != PM_HIGH_PRIEST) + && mndx != PM_HIGH_CLERIC) #define done_stopprint g.program_state.stopprint @@ -2435,7 +2443,7 @@ boolean ask; if (UniqCritterIndx(i)) { Sprintf(buf, "%s%s", !type_is_pname(&mons[i]) ? "the " : "", - mons[i].mname); + mons[i].pmnames[NEUTRAL]); if (nkilled > 1) { switch (nkilled) { case 2: @@ -2458,10 +2466,10 @@ boolean ask; /* trolls or undead might have come back, but we don't keep track of that */ if (nkilled == 1) - Strcpy(buf, an(mons[i].mname)); + Strcpy(buf, an(mons[i].pmnames[NEUTRAL])); else Sprintf(buf, "%3d %s", nkilled, - makeplural(mons[i].mname)); + makeplural(mons[i].pmnames[NEUTRAL])); } /* number of leading spaces to match 3 digit prefix */ pfx = !strncmpi(buf, "the ", 3) ? 0 @@ -2507,7 +2515,7 @@ num_genocides() ++n; if (UniqCritterIndx(i)) impossible("unique creature '%d: %s' genocided?", - i, mons[i].mname); + i, mons[i].pmnames[NEUTRAL]); } } return n; @@ -2570,7 +2578,7 @@ boolean ask; if (UniqCritterIndx(i)) continue; if (g.mvitals[i].mvflags & G_GONE) { - Sprintf(buf, " %s", makeplural(mons[i].mname)); + Sprintf(buf, " %s", makeplural(mons[i].pmnames[NEUTRAL])); /* * "Extinct" is unfortunate terminology. A species * is marked extinct when its birth limit is reached, diff --git a/src/invent.c b/src/invent.c index 5f14e2f46..8b1a96287 100644 --- a/src/invent.c +++ b/src/invent.c @@ -2980,7 +2980,7 @@ boolean FDECL((*filterfunc), (OBJ_P)); for (; list; list = list->nobj) { /* priests always know bless/curse state */ - if (Role_if(PM_PRIEST)) + if (Role_if(PM_CLERIC)) list->bknown = (list->oclass != COIN_CLASS); /* some actions exclude some or most items */ if (filterfunc && !(*filterfunc)(list)) @@ -3020,7 +3020,7 @@ int *bcp, *ucp, *ccp, *xcp, *ocp; *bcp = *ucp = *ccp = *xcp = *ocp = 0; for ( ; list; list = (by_nexthere ? list->nexthere : list->nobj)) { /* priests always know bless/curse state */ - if (Role_if(PM_PRIEST)) + if (Role_if(PM_CLERIC)) list->bknown = (list->oclass != COIN_CLASS); /* coins are either uncursed or unknown based upon option setting */ if (list->oclass == COIN_CLASS) { @@ -3731,7 +3731,7 @@ register struct obj *otmp, *obj; return FALSE; if (obj->dknown != otmp->dknown - || (obj->bknown != otmp->bknown && !Role_if(PM_PRIEST)) + || (obj->bknown != otmp->bknown && !Role_if(PM_CLERIC)) || obj->oeroded != otmp->oeroded || obj->oeroded2 != otmp->oeroded2 || obj->greased != otmp->greased) return FALSE; diff --git a/src/makemon.c b/src/makemon.c index b9bb36d5f..27f9ad049 100644 --- a/src/makemon.c +++ b/src/makemon.c @@ -247,14 +247,14 @@ register struct monst *mtmp; } break; } - if (mm == PM_ELVENKING) { + if (mm == PM_ELVENMONARCH) { if (rn2(3) || (g.in_mklev && Is_earthlevel(&u.uz))) (void) mongets(mtmp, PICK_AXE); if (!rn2(50)) (void) mongets(mtmp, CRYSTAL_BALL); } } else if (ptr->msound == MS_PRIEST - || quest_mon_represents_role(ptr, PM_PRIEST)) { + || quest_mon_represents_role(ptr, PM_CLERIC)) { otmp = mksobj(MACE, FALSE, FALSE); otmp->spe = rnd(3); if (!rn2(2)) @@ -428,7 +428,7 @@ register struct monst *mtmp; } break; case S_OGRE: - if (!rn2(mm == PM_OGRE_KING ? 3 : mm == PM_OGRE_LORD ? 6 : 12)) + if (!rn2(mm == PM_OGRE_TYRANT ? 3 : mm == PM_OGRE_LEADER ? 6 : 12)) (void) mongets(mtmp, BATTLE_AXE); else (void) mongets(mtmp, CLUB); @@ -700,7 +700,7 @@ register struct monst *mtmp; (void) mongets(mtmp, WAN_STRIKING); } } else if (ptr->msound == MS_PRIEST - || quest_mon_represents_role(ptr, PM_PRIEST)) { + || quest_mon_represents_role(ptr, PM_CLERIC)) { (void) mongets(mtmp, rn2(7) ? ROBE : rn2(3) ? CLOAK_OF_PROTECTION : CLOAK_OF_MAGIC_RESISTANCE); @@ -882,8 +882,8 @@ xchar x, y; /* clone's preferred location or 0 (near mon) */ new_light_source(m2->mx, m2->my, emits_light(m2->data), LS_MONSTER, monst_to_any(m2)); /* if 'parent' is named, give the clone the same name */ - if (has_mname(mon)) { - m2 = christen_monst(m2, MNAME(mon)); + if (has_mgivenname(mon)) { + m2 = christen_monst(m2, MGIVENNAME(mon)); } else if (mon->isshk) { m2 = christen_monst(m2, shkname(mon)); } @@ -946,7 +946,7 @@ boolean ghostly; result = ((int) g.mvitals[mndx].born < lim && !gone) ? TRUE : FALSE; /* if it's unique, don't ever make it again */ - if ((mons[mndx].geno & G_UNIQ) != 0 && mndx != PM_HIGH_PRIEST) + if ((mons[mndx].geno & G_UNIQ) != 0 && mndx != PM_HIGH_CLERIC) g.mvitals[mndx].mvflags |= G_EXTINCT; if (g.mvitals[mndx].born < 255 && tally && (!ghostly || result)) @@ -956,7 +956,7 @@ boolean ghostly; && !(g.mvitals[mndx].mvflags & G_EXTINCT)) { if (wizard) { debugpline1("Automatically extinguished %s.", - makeplural(mons[mndx].mname)); + makeplural(mons[mndx].pmnames[NEUTRAL])); } g.mvitals[mndx].mvflags |= G_EXTINCT; } @@ -1184,7 +1184,7 @@ long mmflags; return (struct monst *) 0; if (wizard && (g.mvitals[mndx].mvflags & G_EXTINCT)) { debugpline1("Explicitly creating extinct monster %s.", - mons[mndx].mname); + mons[mndx].pmnames[NEUTRAL]); } } else { /* make a random (common) monster that can survive here. @@ -1236,9 +1236,9 @@ long mmflags; /* set up level and hit points */ newmonhp(mtmp, mndx); - if (is_female(ptr)) + if (is_female(ptr) || ((mmflags & MM_FEMALE) && !is_male(ptr))) mtmp->female = TRUE; - else if (is_male(ptr)) + else if (is_male(ptr) || ((mmflags & MM_MALE) && !is_female(ptr))) mtmp->female = FALSE; /* leader and nemesis gender is usually hardcoded in mons[], but for ones which can be random, it has already been chosen @@ -1369,7 +1369,7 @@ long mmflags; types; make sure their extended data is initialized to something sensible if caller hasn't specified MM_EPRI|MM_EMIN (when they're specified, caller intends to handle this itself) */ - if ((mndx == PM_ALIGNED_PRIEST || mndx == PM_HIGH_PRIEST) + if ((mndx == PM_ALIGNED_CLERIC || mndx == PM_HIGH_CLERIC) ? !(mmflags & (MM_EPRI | MM_EMIN)) : (mndx == PM_ANGEL && !(mmflags & MM_EMIN) && !rn2(3))) { struct emin *eminp; @@ -1857,8 +1857,11 @@ struct monst *mtmp, *victim; oldtype = monsndx(ptr); newtype = (oldtype == PM_KILLER_BEE && !victim) ? PM_QUEEN_BEE : little_to_big(oldtype); +#if 0 + /* gender-neutral PM_CLERIC now */ if (newtype == PM_PRIEST && mtmp->female) newtype = PM_PRIESTESS; +#endif /* growth limits differ depending on method of advancement */ if (victim) { /* killed a monster */ @@ -1914,7 +1917,7 @@ struct monst *mtmp, *victim; if (g.mvitals[newtype].mvflags & G_GENOD) { /* allow G_EXTINCT */ if (canspotmon(mtmp)) pline("As %s grows up into %s, %s %s!", mon_nam(mtmp), - an(ptr->mname), mhe(mtmp), + an(pmname(ptr, Mgender(mtmp))), mhe(mtmp), nonliving(ptr) ? "expires" : "dies"); set_mon_data(mtmp, ptr); /* keep g.mvitals[] accurate */ mondied(mtmp); @@ -1932,7 +1935,7 @@ struct monst *mtmp, *victim; (can't happen with 3.6.0 mons[], but perhaps slightly less sexist if prepared for it...) */ : (fem && !mtmp->female) ? "female " : "", - ptr->mname); + pmname(ptr, fem)); pline("%s %s %s.", upstart(y_monnam(mtmp)), (fem != mtmp->female) ? "changes into" : humanoid(ptr) ? "becomes" diff --git a/src/mapglyph.c b/src/mapglyph.c index 291a11f36..a28c94670 100644 --- a/src/mapglyph.c +++ b/src/mapglyph.c @@ -77,9 +77,10 @@ unsigned mgflags; unsigned special = 0; /* condense multiple tests in macro version down to single */ boolean has_rogue_ibm_graphics = HAS_ROGUE_IBM_GRAPHICS, - is_you = (x == u.ux && y == u.uy), + is_you = (x == u.ux && y == u.uy && !u.usteed), has_rogue_color = (has_rogue_ibm_graphics - && g.symset[g.currentgraphics].nocolor == 0); + && g.symset[g.currentgraphics].nocolor == 0), + do_mon_checks = FALSE; if (!g.glyphmap_perlevel_flags) { /* @@ -254,6 +255,7 @@ unsigned mgflags; else mon_color(offset); special |= MG_RIDDEN; + do_mon_checks = TRUE; } else if ((offset = (glyph - GLYPH_BODY_OFF)) >= 0) { /* a corpse */ idx = objects[CORPSE].oc_class + SYM_OFF_O; if (has_rogue_color && iflags.use_color) @@ -272,6 +274,7 @@ unsigned mgflags; /* Disabled for now; anyone want to get reverse video to work? */ /* is_reverse = TRUE; */ special |= MG_DETECT; + do_mon_checks = TRUE; } else if ((offset = (glyph - GLYPH_INVIS_OFF)) >= 0) { /* invisible */ idx = SYM_INVISIBLE + SYM_OFF_X; if (has_rogue_color) @@ -286,6 +289,7 @@ unsigned mgflags; else pet_color(offset); special |= MG_PET; + do_mon_checks = TRUE; } else { /* a monster */ idx = mons[glyph].mlet + SYM_OFF_M; if (has_rogue_color && iflags.use_color) { @@ -302,6 +306,21 @@ unsigned mgflags; color = HI_DOMESTIC; #endif } + do_mon_checks = TRUE; + } + if (do_mon_checks) { + struct monst *m; + + if (is_you) { + if (Ugender == FEMALE) + special |= MG_FEMALE; + } else { + /* when hero is riding, steed will be shown at hero's location + but has not been placed on the map so m_at() won't find it */ + m = (x == u.ux && y == u.uy && u.usteed) ? u.usteed : m_at(x, y); + if (m && m->female) + special |= MG_FEMALE; + } } /* These were requested by a blind player to enhance screen reader use */ @@ -354,14 +373,14 @@ const char *str; { static const char hex[] = "00112233445566778899aAbBcCdDeEfF"; char *put = buf; + unsigned glyphmod[NUM_GLYPHMOD]; if (!str) return strcpy(buf, ""); while (*str) { if (*str == '\\') { - int rndchk, dcount, so, gv, ch = 0, oc = 0; - unsigned os = 0; + int rndchk, dcount, so, gv; const char *dp, *save_str; save_str = str++; @@ -380,7 +399,8 @@ const char *str; gv = (gv * 16) + ((int) (dp - hex) / 2); else break; - so = mapglyph(gv, &ch, &oc, &os, 0, 0, 0); + map_glyphmod(0, 0, gv, MG_FLAG_RETURNIDX, glyphmod); + so = glyphmod[GM_TTYCHAR]; *put++ = g.showsyms[so]; /* 'str' is ready for the next loop iteration and '*str' should not be copied at the end of this iteration */ diff --git a/src/mhitu.c b/src/mhitu.c index 89d77dd2d..f4260cbc1 100644 --- a/src/mhitu.c +++ b/src/mhitu.c @@ -510,12 +510,12 @@ register struct monst *mtmp; pline( "Wait, %s! There's a hidden %s named %s there!", m_monnam(mtmp), - g.youmonst.data->mname, g.plname); + pmname(g.youmonst.data, Ugender), g.plname); else pline( "Wait, %s! There's a %s named %s hiding under %s!", - m_monnam(mtmp), g.youmonst.data->mname, g.plname, - doname(g.level.objects[u.ux][u.uy])); + m_monnam(mtmp), pmname(g.youmonst.data, Ugender), + g.plname, doname(g.level.objects[u.ux][u.uy])); if (obj) obj->spe = save_spe; } else @@ -537,7 +537,7 @@ register struct monst *mtmp; pline("It gets stuck on you."); else /* see note about m_monnam() above */ pline("Wait, %s! That's a %s named %s!", m_monnam(mtmp), - g.youmonst.data->mname, g.plname); + pmname(g.youmonst.data, Ugender), g.plname); if (sticky) set_ustuck(mtmp); g.youmonst.m_ap_type = M_AP_NOTHING; @@ -557,13 +557,14 @@ register struct monst *mtmp; : "disturbs you"); else /* see note about m_monnam() above */ pline("Wait, %s! That %s is really %s named %s!", m_monnam(mtmp), - mimic_obj_name(&g.youmonst), an(mons[u.umonnum].mname), - g.plname); + mimic_obj_name(&g.youmonst), + an(pmname(&mons[u.umonnum], Ugender)), g.plname); if (g.multi < 0) { /* this should always be the case */ char buf[BUFSZ]; Sprintf(buf, "You appear to be %s again.", - Upolyd ? (const char *) an(g.youmonst.data->mname) + Upolyd ? (const char *) an(pmname(g.youmonst.data, + flags.female)) : (const char *) "yourself"); unmul(buf); /* immediately stop mimicking */ } @@ -793,8 +794,7 @@ boolean youseeit; */ if (is_demon(mdat)) { - if (mdat != &mons[PM_BALROG] - && mdat != &mons[PM_SUCCUBUS] && mdat != &mons[PM_INCUBUS]) { + if (mdat != &mons[PM_BALROG] && mdat != &mons[PM_AMOROUS_DEMON]) { if (!rn2(13)) (void) msummon(mtmp); } @@ -861,7 +861,7 @@ struct permonst *mdat; return FALSE; } else { make_sick(Sick ? Sick / 3L + 1L : (long) rn1(ACURR(A_CON), 20), - mdat->mname, TRUE, SICK_NONVOMITABLE); + mdat->pmnames[NEUTRAL], TRUE, SICK_NONVOMITABLE); return TRUE; } } @@ -915,7 +915,7 @@ struct monst *mon; via_amul = FALSE, gotprot = is_you ? (EProtection != 0L) /* high priests have innate protection */ - : (mon->data == &mons[PM_HIGH_PRIEST]); + : (mon->data == &mons[PM_HIGH_CLERIC]); for (o = is_you ? g.invent : mon->minvent; o; o = o->nobj) { /* a_can field is only applicable for armor (which must be worn) */ @@ -948,7 +948,7 @@ struct monst *mon; protection is too easy); it confers minimum mc 1 instead of 0 */ if ((is_you && ((HProtection && u.ublessed > 0) || u.uspellprot)) /* aligned priests and angels have innate intrinsic Protection */ - || (mon->data == &mons[PM_ALIGNED_PRIEST] || is_minion(mon->data))) + || (mon->data == &mons[PM_ALIGNED_CLERIC] || is_minion(mon->data))) mc = 1; } return mc; @@ -1034,7 +1034,7 @@ register struct attack *mattk; if (mhm.damage) { if (Half_physical_damage /* Mitre of Holiness */ - || (Role_if(PM_PRIEST) && uarmh && is_quest_artifact(uarmh) + || (Role_if(PM_CLERIC) && uarmh && is_quest_artifact(uarmh) && (is_undead(mtmp->data) || is_demon(mtmp->data) || is_vampshifter(mtmp)))) mhm.damage = (mhm.damage + 1) / 2; @@ -1543,7 +1543,7 @@ struct attack *mattk; break; You("turn to stone..."); g.killer.format = KILLED_BY; - Strcpy(g.killer.name, mtmp->data->mname); + Strcpy(g.killer.name, pmname(mtmp->data, Mgender(mtmp))); done(STONING); } break; @@ -1751,8 +1751,7 @@ struct attack *mattk; /* non-Null: current attack; Null: general capability */ for seduction, both pass the could_seduce() test; incubi/succubi have three attacks, their claw attacks for damage don't pass the test */ - if ((pagr->mlet != S_NYMPH - && pagr != &mons[PM_INCUBUS] && pagr != &mons[PM_SUCCUBUS]) + if ((pagr->mlet != S_NYMPH && pagr != &mons[PM_AMOROUS_DEMON]) || (adtyp != AD_SEDU && adtyp != AD_SSEX && adtyp != AD_SITM)) return 0; @@ -1765,7 +1764,8 @@ doseduce(mon) struct monst *mon; { struct obj *ring, *nring; - boolean fem = (mon->data == &mons[PM_SUCCUBUS]); /* otherwise incubus */ + boolean fem = (mon->data == &mons[PM_AMOROUS_DEMON] + && Mgender(mon) == FEMALE); /* otherwise incubus */ boolean seewho, naked; /* True iff no armor */ int attr_tot, tried_gloves = 0; char qbuf[QBUFSZ], Who[QBUFSZ]; @@ -2232,7 +2232,8 @@ struct attack *mattk; && (perceives(mtmp->data) || !Invis)) { if (Blind) pline("As a blind %s, you cannot defend yourself.", - g.youmonst.data->mname); + pmname(g.youmonst.data, + flags.female ? FEMALE : MALE)); else { if (mon_reflects(mtmp, "Your gaze is reflected by %s %s.")) diff --git a/src/minion.c b/src/minion.c index 03f0b27c0..c6a7dec58 100644 --- a/src/minion.c +++ b/src/minion.c @@ -196,7 +196,7 @@ boolean talk; EMIN(mon)->renegade = FALSE; } } else if (mnum != PM_SHOPKEEPER && mnum != PM_GUARD - && mnum != PM_ALIGNED_PRIEST && mnum != PM_HIGH_PRIEST) { + && mnum != PM_ALIGNED_CLERIC && mnum != PM_HIGH_CLERIC) { /* This was mons[mnum].pxlth == 0 but is this restriction appropriate or necessary now that the structures are separate? */ mon = makemon(&mons[mnum], u.ux, u.uy, MM_EMIN); diff --git a/src/mkmaze.c b/src/mkmaze.c index 4b3e7c588..c79068bf1 100644 --- a/src/mkmaze.c +++ b/src/mkmaze.c @@ -569,7 +569,7 @@ fixup_special() set_corpsenm(otmp, rndmonnum()); } } - } else if (Role_if(PM_PRIEST) && In_quest(&u.uz)) { + } else if (Role_if(PM_CLERIC) && In_quest(&u.uz)) { /* less chance for undead corpses (lured from lower morgues) */ g.level.flags.graveyard = 1; } else if (Is_stronghold(&u.uz)) { @@ -742,7 +742,7 @@ stolen_booty(VOID_ARGS) if (DEADMONSTER(mtmp)) continue; - if (is_orc(mtmp->data) && !has_mname(mtmp) && rn2(10)) { + if (is_orc(mtmp->data) && !has_mgivenname(mtmp) && rn2(10)) { /* * We'll consider the orc captain from the level * description to be the captain of a rival orc horde diff --git a/src/mkroom.c b/src/mkroom.c index d1e7c7cbb..405efb312 100644 --- a/src/mkroom.c +++ b/src/mkroom.c @@ -250,10 +250,10 @@ mk_zoo_thronemon(x,y) int x,y; { int i = rnd(level_difficulty()); - int pm = (i > 9) ? PM_OGRE_KING - : (i > 5) ? PM_ELVENKING - : (i > 2) ? PM_DWARF_KING - : PM_GNOME_KING; + int pm = (i > 9) ? PM_OGRE_TYRANT + : (i > 5) ? PM_ELVENMONARCH + : (i > 2) ? PM_DWARF_RULER + : PM_GNOME_RULER; struct monst *mon = makemon(&mons[pm], x, y, NO_MM_FLAGS); if (mon) { diff --git a/src/mon.c b/src/mon.c index 1676dc072..c6136e779 100644 --- a/src/mon.c +++ b/src/mon.c @@ -84,14 +84,17 @@ const char *msg; /* bad if not fmons list or if not vault guard */ if (strcmp(msg, "fmon") || !mtmp->isgd) impossible("dead monster on %s; %s at <%d,%d>", - msg, mons[mndx].mname, mx, my); + msg, mons[mndx].pmnames[NEUTRAL], + mx, my); #endif return; } if (chk_geno && (g.mvitals[mndx].mvflags & G_GENOD) != 0) - impossible("genocided %s in play (%s)", mons[mndx].mname, msg); + impossible("genocided %s in play (%s)", + pmname(&mons[mndx], Mgender(mtmp)), msg); if (mtmp->mtame && !mtmp->mpeaceful) - impossible("tame %s is not peaceful (%s)", mons[mndx].mname, msg); + impossible("tame %s is not peaceful (%s)", + pmname(&mons[mndx], Mgender(mtmp)), msg); } if (mtmp->isshk && !has_eshk(mtmp)) impossible("shk without eshk (%s)", msg); @@ -151,7 +154,7 @@ const char *msg; but only until the pet finishes eating a mimic corpse */ if (!(is_mimic || mtmp->meating)) impossible("non-mimic (%s) posing as %s (%s)", - mptr->mname, what, msg); + mptr->pmnames[NEUTRAL], what, msg); if (!(accessible(mx, my) || passes_walls(mptr))) { char buf[BUFSZ]; const char *typnam = levltyp_to_name(levl[mx][my].typ); @@ -337,7 +340,7 @@ int mndx; mndx = PM_ELF; break; case PM_VAMPIRE: - case PM_VAMPIRE_LORD: + case PM_VAMPIRE_LEADER: #if 0 /* DEFERRED */ case PM_VAMPIRE_MAGE: #endif @@ -378,7 +381,7 @@ int mndx, mode; mndx = mode ? PM_BARBARIAN : PM_HUMAN; break; case PM_NEANDERTHAL: - mndx = mode ? PM_CAVEMAN : PM_HUMAN; + mndx = mode ? PM_CAVE_DWELLER : PM_HUMAN; break; case PM_ATTENDANT: mndx = mode ? PM_HEALER : PM_HUMAN; @@ -390,7 +393,7 @@ int mndx, mode; mndx = mode ? PM_MONK : PM_HUMAN; break; case PM_ACOLYTE: - mndx = mode ? PM_PRIEST : PM_HUMAN; + mndx = mode ? PM_CLERIC : PM_HUMAN; break; case PM_HUNTER: mndx = mode ? PM_RANGER : PM_HUMAN; @@ -514,7 +517,7 @@ unsigned corpseflags; (void) mksobj_at(WORM_TOOTH, x, y, TRUE, FALSE); goto default_1; case PM_VAMPIRE: - case PM_VAMPIRE_LORD: + case PM_VAMPIRE_LEADER: /* include mtmp in the mkcorpstat() call */ num = undead_to_corpse(mndx); corpstatflags |= CORPSTAT_INIT; @@ -546,19 +549,19 @@ unsigned corpseflags; num = d(2, 6); while (num--) obj = mksobj_at(IRON_CHAIN, x, y, TRUE, FALSE); - free_mname(mtmp); /* don't christen obj */ + free_mgivenname(mtmp); /* don't christen obj */ break; case PM_GLASS_GOLEM: num = d(2, 4); /* very low chance of creating all glass gems */ while (num--) obj = mksobj_at((LAST_GEM + rnd(9)), x, y, TRUE, FALSE); - free_mname(mtmp); + free_mgivenname(mtmp); break; case PM_CLAY_GOLEM: obj = mksobj_at(ROCK, x, y, FALSE, FALSE); obj->quan = (long) (rn2(20) + 50); obj->owt = weight(obj); - free_mname(mtmp); + free_mgivenname(mtmp); break; case PM_STONE_GOLEM: corpstatflags &= ~CORPSTAT_INIT; @@ -570,24 +573,24 @@ unsigned corpseflags; while (num--) { obj = mksobj_at(QUARTERSTAFF, x, y, TRUE, FALSE); } - free_mname(mtmp); + free_mgivenname(mtmp); break; case PM_LEATHER_GOLEM: num = d(2, 4); while (num--) obj = mksobj_at(LEATHER_ARMOR, x, y, TRUE, FALSE); - free_mname(mtmp); + free_mgivenname(mtmp); break; case PM_GOLD_GOLEM: /* Good luck gives more coins */ obj = mkgold((long) (200 - rnl(101)), x, y); - free_mname(mtmp); + free_mgivenname(mtmp); break; case PM_PAPER_GOLEM: num = rnd(4); while (num--) obj = mksobj_at(SCR_BLANK_PAPER, x, y, TRUE, FALSE); - free_mname(mtmp); + free_mgivenname(mtmp); break; /* expired puddings will congeal into a large blob; like dragons, relies on the order remaining consistent */ @@ -604,7 +607,7 @@ unsigned corpseflags; pudding_merge_message(obj, otmp); obj = obj_meld(&obj, &otmp); } - free_mname(mtmp); + free_mgivenname(mtmp); return obj; default: default_1: @@ -635,8 +638,8 @@ unsigned corpseflags; if (g.context.bypasses) bypass_obj(obj); - if (has_mname(mtmp)) - obj = oname(obj, MNAME(mtmp)); + if (has_mgivenname(mtmp)) + obj = oname(obj, MGIVENNAME(mtmp)); /* Avoid "It was hidden under a green mold corpse!" * during Blind combat. An unseen monster referred to as "it" @@ -2118,9 +2121,9 @@ struct monst *mtmp2, *mtmp1; if (!mtmp2->mextra) mtmp2->mextra = newmextra(); - if (MNAME(mtmp1)) { - new_mname(mtmp2, (int) strlen(MNAME(mtmp1)) + 1); - Strcpy(MNAME(mtmp2), MNAME(mtmp1)); + if (MGIVENNAME(mtmp1)) { + new_mgivenname(mtmp2, (int) strlen(MGIVENNAME(mtmp1)) + 1); + Strcpy(MGIVENNAME(mtmp2), MGIVENNAME(mtmp1)); } if (EGD(mtmp1)) { if (!EGD(mtmp2)) @@ -2158,8 +2161,8 @@ struct monst *m; struct mextra *x = m->mextra; if (x) { - if (x->mname) - free((genericptr_t) x->mname); + if (x->mgivenname) + free((genericptr_t) x->mgivenname); if (x->egd) free((genericptr_t) x->egd); if (x->epri) @@ -2514,7 +2517,7 @@ boolean was_swallowed; /* digestion */ if (magr == &g.youmonst) { There("is an explosion in your %s!", body_part(STOMACH)); Sprintf(g.killer.name, "%s explosion", - s_suffix(mdat->mname)); + s_suffix(pmname(mdat, Mgender(mon)))); losehp(Maybe_Half_Phys(tmp), g.killer.name, KILLED_BY_AN); } else { You_hear("an explosion."); @@ -2531,7 +2534,8 @@ boolean was_swallowed; /* digestion */ return FALSE; } - Sprintf(g.killer.name, "%s explosion", s_suffix(mdat->mname)); + Sprintf(g.killer.name, "%s explosion", + s_suffix(pmname(mdat, Mgender(mon)))); g.killer.format = KILLED_BY_AN; explode(mon->mx, mon->my, -1, tmp, MON_EXPLODE, EXPL_NOXIOUS); g.killer.name[0] = '\0'; @@ -2649,8 +2653,8 @@ struct monst *mdef; so that saved monster traits won't retain any stale item-conferred attributes */ otmp = mkcorpstat(STATUE, mdef, mdef->data, x, y, CORPSTAT_NONE); - if (has_mname(mdef)) - otmp = oname(otmp, MNAME(mdef)); + if (has_mgivenname(mdef)) + otmp = oname(otmp, MGIVENNAME(mdef)); while ((obj = oldminvent) != 0) { oldminvent = obj->nobj; obj->nobj = 0; /* avoid merged-> obfree-> dealloc_obj-> panic */ @@ -2798,7 +2802,7 @@ int xkill_flags; /* 1: suppress message, 2: suppress corpse, 4: pacifist */ u.uconduct.killer++; if (!nomsg) { - boolean namedpet = has_mname(mtmp) && !Hallucination; + boolean namedpet = has_mgivenname(mtmp) && !Hallucination; You("%s %s!", nonliving(mtmp->data) ? "destroy" : "kill", @@ -2987,7 +2991,7 @@ struct monst *mtmp; pline("%s solidifies...", Monnam(mtmp)); if (newcham(mtmp, &mons[PM_STONE_GOLEM], FALSE, FALSE)) { if (canseemon(mtmp)) - pline("Now it's %s.", an(mtmp->data->mname)); + pline("Now it's %s.", an(pmname(mtmp->data, Mgender(mtmp)))); } else { if (canseemon(mtmp)) pline("... and returns to normal."); @@ -3415,7 +3419,7 @@ boolean via_attack; } } if (got_mad && !Hallucination) { - const char *who = q_guardian->mname; + const char *who = q_guardian->pmnames[NEUTRAL]; if (got_mad > 1) who = makeplural(who); @@ -3888,7 +3892,7 @@ struct monst *mon; break; /* leave mndx as is */ wolfchance = 3; /*FALLTHRU*/ - case PM_VAMPIRE_LORD: /* vampire lord or Vlad can become wolf */ + case PM_VAMPIRE_LEADER: /* vampire lord or Vlad can become wolf */ if (!rn2(wolfchance) && !uppercase_only) { mndx = PM_WOLF; break; @@ -4039,7 +4043,7 @@ struct monst *mon; mndx = pick_animal(); break; case PM_VLAD_THE_IMPALER: - case PM_VAMPIRE_LORD: + case PM_VAMPIRE_LEADER: case PM_VAMPIRE: mndx = pickvampshape(mon); break; @@ -4097,7 +4101,7 @@ struct monst *mon; mndx = NON_PM; break; } - mndx = name_to_mon(buf); + mndx = name_to_mon(buf, (int *) 0); if (mndx == NON_PM) { /* didn't get a type, so check whether it's a class (single letter or text match with def_monsyms[]) */ @@ -4222,7 +4226,7 @@ boolean msg; /* "The oldmon turns into a newmon!" */ } /* we need this one whether msg is true or not */ Strcpy(l_oldname, x_monnam(mtmp, ARTICLE_THE, (char *) 0, - has_mname(mtmp) ? SUPPRESS_SADDLE : 0, FALSE)); + has_mgivenname(mtmp) ? SUPPRESS_SADDLE : 0, FALSE)); /* mdat = 0 -> caller wants a random monster shape */ if (mdat == 0) { @@ -4255,7 +4259,7 @@ boolean msg; /* "The oldmon turns into a newmon!" */ * polymorphed, so dropping rank for mplayers seems reasonable. */ if (In_endgame(&u.uz) && is_mplayer(olddata) - && has_mname(mtmp) && (p = strstr(MNAME(mtmp), " the ")) != 0) + && has_mgivenname(mtmp) && (p = strstr(MGIVENNAME(mtmp), " the ")) != 0) *p = '\0'; if (mtmp->wormno) { /* throw tail away */ @@ -4646,9 +4650,9 @@ char *str; for (mtmp = fmon; mtmp; mtmp = mtmp->nmon) { if (DEADMONSTER(mtmp) - || mtmp->data != &mons[PM_GHOST] || !has_mname(mtmp)) + || mtmp->data != &mons[PM_GHOST] || !has_mgivenname(mtmp)) continue; - if (!strcmpi(MNAME(mtmp), str)) + if (!strcmpi(MGIVENNAME(mtmp), str)) return mtmp; } return (struct monst *) 0; @@ -4694,8 +4698,7 @@ struct permonst *mdat; You("notice a bovine smell."); msg_given = TRUE; break; - case PM_CAVEMAN: - case PM_CAVEWOMAN: + case PM_CAVE_DWELLER: case PM_BARBARIAN: case PM_NEANDERTHAL: You("smell body odor."); diff --git a/src/mondata.c b/src/mondata.c index e15fef59a..e78806dbe 100644 --- a/src/mondata.c +++ b/src/mondata.c @@ -681,15 +681,17 @@ struct permonst *ptr; struct alt_spl { const char *name; short pm_val; + int genderhint; }; /* figure out what type of monster a user-supplied string is specifying; ingore anything past the monster name */ int -name_to_mon(in_str) +name_to_mon(in_str, gender_name_var) const char *in_str; +int *gender_name_var; { - return name_to_monplus(in_str, (const char **) 0); + return name_to_monplus(in_str, (const char **) 0, gender_name_var); } /* figure out what type of monster a user-supplied string is specifying; @@ -697,9 +699,10 @@ const char *in_str; caller wants to strip off the name and it matches one of the alternate names rather the canonical mons[].mname */ int -name_to_monplus(in_str, remainder_p) +name_to_monplus(in_str, remainder_p, gender_name_var) const char *in_str; const char **remainder_p; +int *gender_name_var; { /* Be careful. We must check the entire string in case it was * something such as "ettin zombie corpse". The calling routine @@ -717,7 +720,8 @@ const char **remainder_p; register int mntmp = NON_PM; register char *s, *str, *term; char buf[BUFSZ]; - int len, slen; + int len, slen, mgend; + boolean exact_match = FALSE; if (remainder_p) *remainder_p = (const char *) 0; @@ -749,70 +753,72 @@ const char **remainder_p; { static const struct alt_spl names[] = { /* Alternate spellings */ - { "grey dragon", PM_GRAY_DRAGON }, - { "baby grey dragon", PM_BABY_GRAY_DRAGON }, - { "grey unicorn", PM_GRAY_UNICORN }, - { "grey ooze", PM_GRAY_OOZE }, - { "gray-elf", PM_GREY_ELF }, - { "mindflayer", PM_MIND_FLAYER }, - { "master mindflayer", PM_MASTER_MIND_FLAYER }, + { "grey dragon", PM_GRAY_DRAGON, NEUTRAL }, + { "baby grey dragon", PM_BABY_GRAY_DRAGON, NEUTRAL }, + { "grey unicorn", PM_GRAY_UNICORN, NEUTRAL }, + { "grey ooze", PM_GRAY_OOZE, NEUTRAL }, + { "gray-elf", PM_GREY_ELF, NEUTRAL }, + { "mindflayer", PM_MIND_FLAYER, NEUTRAL }, + { "master mindflayer", PM_MASTER_MIND_FLAYER, NEUTRAL }, /* More alternates; priest and priestess are separate monster types but that isn't the case for {aligned,high} priests */ - { "aligned priestess", PM_ALIGNED_PRIEST }, - { "high priestess", PM_HIGH_PRIEST }, + { "aligned priestess", PM_ALIGNED_CLERIC, NEUTRAL }, + { "high priestess", PM_HIGH_CLERIC, NEUTRAL }, /* Inappropriate singularization by -ves check above */ - { "master of thief", PM_MASTER_OF_THIEVES }, + { "master of thief", PM_MASTER_OF_THIEVES, NEUTRAL }, /* Potential misspellings where we want to avoid falling back to the rank title prefix (input has been singularized) */ - { "master thief", PM_MASTER_OF_THIEVES }, - { "master of assassin", PM_MASTER_ASSASSIN }, + { "master thief", PM_MASTER_OF_THIEVES, NEUTRAL }, + { "master of assassin", PM_MASTER_ASSASSIN, NEUTRAL }, /* Outdated names */ - { "invisible stalker", PM_STALKER }, - { "high-elf", PM_ELVENKING }, /* PM_HIGH_ELF is obsolete */ + { "invisible stalker", PM_STALKER, NEUTRAL }, + { "high-elf", PM_ELVENMONARCH, NEUTRAL }, /* PM_HIGH_ELF is obsolete */ /* other misspellings or incorrect words */ - { "wood-elf", PM_WOODLAND_ELF }, - { "wood elf", PM_WOODLAND_ELF }, - { "woodland nymph", PM_WOOD_NYMPH }, - { "halfling", PM_HOBBIT }, /* potential guess for polyself */ - { "genie", PM_DJINNI }, /* potential guess for ^G/#wizgenesis */ + { "wood-elf", PM_WOODLAND_ELF, NEUTRAL }, + { "wood elf", PM_WOODLAND_ELF, NEUTRAL }, + { "woodland nymph", PM_WOOD_NYMPH, NEUTRAL }, + { "halfling", PM_HOBBIT, NEUTRAL }, /* potential guess for polyself */ + { "genie", PM_DJINNI, NEUTRAL }, /* potential guess for ^G/#wizgenesis */ /* prefix used to workaround duplicate monster names for monsters with alternate forms */ - { "human wererat", PM_HUMAN_WERERAT }, - { "human werejackal", PM_HUMAN_WEREJACKAL }, - { "human werewolf", PM_HUMAN_WEREWOLF }, + { "human wererat", PM_HUMAN_WERERAT, NEUTRAL }, + { "human werejackal", PM_HUMAN_WEREJACKAL, NEUTRAL }, + { "human werewolf", PM_HUMAN_WEREWOLF, NEUTRAL }, /* for completeness */ - { "rat wererat", PM_WERERAT }, - { "jackal werejackal", PM_WEREJACKAL }, - { "wolf werewolf", PM_WEREWOLF }, + { "rat wererat", PM_WERERAT, NEUTRAL }, + { "jackal werejackal", PM_WEREJACKAL, NEUTRAL }, + { "wolf werewolf", PM_WEREWOLF, NEUTRAL }, /* Hyphenated names -- it would be nice to handle these via fuzzymatch() but it isn't able to ignore trailing stuff */ - { "ki rin", PM_KI_RIN }, - { "kirin", PM_KI_RIN }, - { "uruk hai", PM_URUK_HAI }, - { "orc captain", PM_ORC_CAPTAIN }, - { "woodland elf", PM_WOODLAND_ELF }, - { "green elf", PM_GREEN_ELF }, - { "grey elf", PM_GREY_ELF }, - { "gray elf", PM_GREY_ELF }, - { "elf lord", PM_ELF_LORD }, - { "olog hai", PM_OLOG_HAI }, - { "arch lich", PM_ARCH_LICH }, - { "archlich", PM_ARCH_LICH }, + { "ki rin", PM_KI_RIN, NEUTRAL }, + { "kirin", PM_KI_RIN, NEUTRAL }, + { "uruk hai", PM_URUK_HAI, NEUTRAL }, + { "orc captain", PM_ORC_CAPTAIN, NEUTRAL }, + { "woodland elf", PM_WOODLAND_ELF, NEUTRAL }, + { "green elf", PM_GREEN_ELF, NEUTRAL }, + { "grey elf", PM_GREY_ELF, NEUTRAL }, + { "gray elf", PM_GREY_ELF, NEUTRAL }, + { "elf lady", PM_ELF_NOBLE, FEMALE }, + { "elf lord", PM_ELF_NOBLE, MALE }, + { "elf noble", PM_ELF_NOBLE, NEUTRAL }, + { "olog hai", PM_OLOG_HAI, NEUTRAL }, + { "arch lich", PM_ARCH_LICH, NEUTRAL }, + { "archlich", PM_ARCH_LICH, NEUTRAL }, /* Some irregular plurals */ - { "incubi", PM_INCUBUS }, - { "succubi", PM_SUCCUBUS }, - { "violet fungi", PM_VIOLET_FUNGUS }, - { "homunculi", PM_HOMUNCULUS }, - { "baluchitheria", PM_BALUCHITHERIUM }, - { "lurkers above", PM_LURKER_ABOVE }, - { "cavemen", PM_CAVEMAN }, - { "cavewomen", PM_CAVEWOMAN }, - { "watchmen", PM_WATCHMAN }, - { "djinn", PM_DJINNI }, - { "mumakil", PM_MUMAK }, - { "erinyes", PM_ERINYS }, + { "incubi", PM_AMOROUS_DEMON, MALE }, + { "succubi", PM_AMOROUS_DEMON, FEMALE }, + { "violet fungi", PM_VIOLET_FUNGUS, NEUTRAL }, + { "homunculi", PM_HOMUNCULUS, NEUTRAL }, + { "baluchitheria", PM_BALUCHITHERIUM, NEUTRAL }, + { "lurkers above", PM_LURKER_ABOVE, NEUTRAL }, + { "cavemen", PM_CAVE_DWELLER, MALE }, + { "cavewomen", PM_CAVE_DWELLER, FEMALE }, + { "watchmen", PM_WATCHMAN, NEUTRAL }, + { "djinn", PM_DJINNI, NEUTRAL }, + { "mumakil", PM_MUMAK, NEUTRAL }, + { "erinyes", PM_ERINYS, NEUTRAL }, /* end of list */ - { 0, NON_PM } + { 0, NON_PM, NEUTRAL } }; register const struct alt_spl *namep; @@ -823,18 +829,28 @@ const char **remainder_p; && (!str[len] || str[len] == ' ' || str[len] == '\'')) { if (remainder_p) *remainder_p = in_str + (&str[len] - buf); + if (gender_name_var != (int *) 0) + *gender_name_var = namep->genderhint; return namep->pm_val; } } } for (len = 0, i = LOW_PM; i < NUMMONS; i++) { - register int m_i_len = (int) strlen(mons[i].mname); + for (mgend = MALE; mgend < NUM_MGENDERS; mgend++) { + int m_i_len; - if (m_i_len > len && !strncmpi(mons[i].mname, str, m_i_len)) { + if (!mons[i].pmnames[mgend]) + continue; + + m_i_len = (int) strlen(mons[i].pmnames[mgend]); + if (m_i_len > len && !strncmpi(mons[i].pmnames[mgend], str, m_i_len)) { if (m_i_len == slen) { mntmp = i; len = m_i_len; + if (gender_name_var != (int *) 0) + *gender_name_var = mgend; + exact_match = TRUE; break; /* exact match */ } else if (slen > m_i_len && (str[m_i_len] == ' ' @@ -850,6 +866,9 @@ const char **remainder_p; len = m_i_len; } } + } + if (exact_match) + break; } if (mntmp == NON_PM) mntmp = title_to_mon(str, (int *) 0, &len); @@ -868,8 +887,8 @@ int *mndx_p; /* Single letters are matched against def_monsyms[].sym; words or phrases are first matched against def_monsyms[].explain to check class description; if not found there, then against - mons[].mname to test individual monster types. Input can be a - substring of the full description or mname, but to be accepted, + mons[].pmnames[] to test individual monster types. Input can be a + substring of the full description or pmname, but to be accepted, such partial matches must start at beginning of a word. Some class descriptions include "foo or bar" and "foo or other foo" so we don't want to accept "or", "other", "or other" there. */ @@ -881,16 +900,16 @@ int *mndx_p; static NEARDATA const struct alt_spl truematch[] = { /* "long worm" won't match "worm" class but would accidentally match "long worm tail" class before the comparison with monster types */ - { "long worm", PM_LONG_WORM }, + { "long worm", PM_LONG_WORM, NEUTRAL }, /* matches wrong--or at least suboptimal--class */ - { "demon", -S_DEMON }, /* hits "imp or minor demon" */ + { "demon", -S_DEMON, NEUTRAL }, /* hits "imp or minor demon" */ /* matches specific monster (overly restrictive) */ - { "devil", -S_DEMON }, /* always "horned devil" */ + { "devil", -S_DEMON, NEUTRAL }, /* always "horned devil" */ /* some plausible guesses which need help */ - { "bug", -S_XAN }, /* would match bugbear... */ - { "fish", -S_EEL }, /* wouldn't match anything */ + { "bug", -S_XAN, NEUTRAL }, /* would match bugbear... */ + { "fish", -S_EEL, NEUTRAL }, /* wouldn't match anything */ /* end of list */ - { 0, NON_PM } + { 0, NON_PM, NEUTRAL} }; const char *p, *x; int i, len; @@ -941,7 +960,7 @@ int *mndx_p; return i; } /* check individual species names */ - i = name_to_mon(in_str); + i = name_to_mon(in_str, (int *) 0); if (i != NON_PM) { if (mndx_p) *mndx_p = i; @@ -1014,11 +1033,11 @@ static const short grownups[][2] = { { PM_PONY, PM_HORSE }, { PM_HORSE, PM_WARHORSE }, { PM_KOBOLD, PM_LARGE_KOBOLD }, - { PM_LARGE_KOBOLD, PM_KOBOLD_LORD }, - { PM_GNOME, PM_GNOME_LORD }, - { PM_GNOME_LORD, PM_GNOME_KING }, - { PM_DWARF, PM_DWARF_LORD }, - { PM_DWARF_LORD, PM_DWARF_KING }, + { PM_LARGE_KOBOLD, PM_KOBOLD_LEADER }, + { PM_GNOME, PM_GNOME_LEADER }, + { PM_GNOME_LEADER, PM_GNOME_RULER }, + { PM_DWARF, PM_DWARF_LEADER }, + { PM_DWARF_LEADER, PM_DWARF_RULER }, { PM_MIND_FLAYER, PM_MASTER_MIND_FLAYER }, { PM_ORC, PM_ORC_CAPTAIN }, { PM_HILL_ORC, PM_ORC_CAPTAIN }, @@ -1026,17 +1045,17 @@ static const short grownups[][2] = { { PM_URUK_HAI, PM_ORC_CAPTAIN }, { PM_SEWER_RAT, PM_GIANT_RAT }, { PM_CAVE_SPIDER, PM_GIANT_SPIDER }, - { PM_OGRE, PM_OGRE_LORD }, - { PM_OGRE_LORD, PM_OGRE_KING }, - { PM_ELF, PM_ELF_LORD }, - { PM_WOODLAND_ELF, PM_ELF_LORD }, - { PM_GREEN_ELF, PM_ELF_LORD }, - { PM_GREY_ELF, PM_ELF_LORD }, - { PM_ELF_LORD, PM_ELVENKING }, + { PM_OGRE, PM_OGRE_LEADER }, + { PM_OGRE_LEADER, PM_OGRE_TYRANT }, + { PM_ELF, PM_ELF_NOBLE }, + { PM_WOODLAND_ELF, PM_ELF_NOBLE }, + { PM_GREEN_ELF, PM_ELF_NOBLE }, + { PM_GREY_ELF, PM_ELF_NOBLE }, + { PM_ELF_NOBLE, PM_ELVENMONARCH }, { PM_LICH, PM_DEMILICH }, { PM_DEMILICH, PM_MASTER_LICH }, { PM_MASTER_LICH, PM_ARCH_LICH }, - { PM_VAMPIRE, PM_VAMPIRE_LORD }, + { PM_VAMPIRE, PM_VAMPIRE_LEADER }, { PM_BAT, PM_GIANT_BAT }, { PM_BABY_GRAY_DRAGON, PM_GRAY_DRAGON }, { PM_BABY_SILVER_DRAGON, PM_SILVER_DRAGON }, @@ -1063,11 +1082,11 @@ static const short grownups[][2] = { { PM_SERGEANT, PM_LIEUTENANT }, { PM_LIEUTENANT, PM_CAPTAIN }, { PM_WATCHMAN, PM_WATCH_CAPTAIN }, - { PM_ALIGNED_PRIEST, PM_HIGH_PRIEST }, + { PM_ALIGNED_CLERIC, PM_HIGH_CLERIC }, { PM_STUDENT, PM_ARCHEOLOGIST }, { PM_ATTENDANT, PM_HEALER }, { PM_PAGE, PM_KNIGHT }, - { PM_ACOLYTE, PM_PRIEST }, + { PM_ACOLYTE, PM_CLERIC }, { PM_APPRENTICE, PM_WIZARD }, { PM_MANES, PM_LEMURE }, { PM_KEYSTONE_KOP, PM_KOP_SERGEANT }, diff --git a/src/monst.c b/src/monst.c index 1955f37a0..2e44b5413 100644 --- a/src/monst.c +++ b/src/monst.c @@ -45,7 +45,13 @@ */ #define MON(nam, sym, lvl, gen, atk, siz, mr1, mr2, flg1, flg2, flg3, d, col) \ { \ - nam, sym, lvl, gen, atk, siz, mr1, mr2, flg1, flg2, flg3, d, C(col) \ + {(const char *) 0, (const char *) 0, nam}, \ + sym, lvl, gen, atk, siz, mr1, mr2, flg1, flg2, flg3, d, C(col) \ + } +#define MON3(namm, namf, namn, sym, lvl, gen, atk, siz, mr1, mr2, flg1, flg2, flg3, d, col) \ + { \ + {namm, namf, namn}, \ + sym, lvl, gen, atk, siz, mr1, mr2, flg1, flg2, flg3, d, C(col) \ } /* LVL() and SIZ() collect several fields to cut down on number of args * for MON() @@ -436,7 +442,8 @@ NEARDATA struct permonst mons_init[] = { NO_ATTK), SIZ(1250, 250, MS_GROWL, MZ_LARGE), 0, 0, M1_HUMANOID | M1_OMNIVORE, M2_STRONG | M2_COLLECT, M3_INFRAVISIBLE | M3_INFRAVISION, 5, CLR_BROWN), - MON("dwarf lord", S_HUMANOID, LVL(4, 6, 10, 10, 5), (G_GENO | 2), + MON3("dwarf lord", "dwarf lady", "dwarf leader", + S_HUMANOID, LVL(4, 6, 10, 10, 5), (G_GENO | 2), A(ATTK(AT_WEAP, AD_PHYS, 2, 4), ATTK(AT_WEAP, AD_PHYS, 2, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(900, 300, MS_HUMANOID, MZ_HUMAN), 0, 0, @@ -444,12 +451,13 @@ NEARDATA struct permonst mons_init[] = { M2_DWARF | M2_STRONG | M2_LORD | M2_MALE | M2_GREEDY | M2_JEWELS | M2_COLLECT, M3_INFRAVISIBLE | M3_INFRAVISION, 6, CLR_BLUE), - MON("dwarf king", S_HUMANOID, LVL(6, 6, 10, 20, 6), (G_GENO | 1), + MON3("dwarf king", "dwarf queen", "dwarf ruler", + S_HUMANOID, LVL(6, 6, 10, 20, 6), (G_GENO | 1), A(ATTK(AT_WEAP, AD_PHYS, 2, 6), ATTK(AT_WEAP, AD_PHYS, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(900, 300, MS_HUMANOID, MZ_HUMAN), 0, 0, M1_TUNNEL | M1_NEEDPICK | M1_HUMANOID | M1_OMNIVORE, - M2_DWARF | M2_STRONG | M2_PRINCE | M2_MALE | M2_GREEDY | M2_JEWELS + M2_DWARF | M2_STRONG | M2_PRINCE | M2_GREEDY | M2_JEWELS | M2_COLLECT, M3_INFRAVISIBLE | M3_INFRAVISION, 8, HI_LORD), MON("mind flayer", S_HUMANOID, LVL(9, 12, 5, 90, -8), (G_GENO | 1), @@ -547,12 +555,13 @@ NEARDATA struct permonst mons_init[] = { SIZ(450, 150, MS_ORC, MZ_SMALL), MR_POISON, 0, M1_HUMANOID | M1_POIS | M1_OMNIVORE, M2_HOSTILE | M2_COLLECT, M3_INFRAVISIBLE | M3_INFRAVISION, 2, CLR_RED), - MON("kobold lord", S_KOBOLD, LVL(2, 6, 10, 0, -4), (G_GENO | 1), + MON3("kobold lord", "kobold lady", "kobold leader", + S_KOBOLD, LVL(2, 6, 10, 0, -4), (G_GENO | 1), A(ATTK(AT_WEAP, AD_PHYS, 2, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(500, 200, MS_ORC, MZ_SMALL), MR_POISON, 0, M1_HUMANOID | M1_POIS | M1_OMNIVORE, - M2_HOSTILE | M2_LORD | M2_MALE | M2_COLLECT, + M2_HOSTILE | M2_LORD | M2_COLLECT, M3_INFRAVISIBLE | M3_INFRAVISION, 3, HI_LORD), MON("kobold shaman", S_KOBOLD, LVL(2, 6, 6, 10, -4), (G_GENO | 1), A(ATTK(AT_MAGC, AD_SPEL, 0, 0), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, @@ -1359,22 +1368,24 @@ NEARDATA struct permonst mons_init[] = { SIZ(650, 100, MS_ORC, MZ_SMALL), 0, 0, M1_HUMANOID | M1_OMNIVORE, M2_NOPOLY | M2_GNOME | M2_COLLECT, M3_INFRAVISIBLE | M3_INFRAVISION, 3, CLR_BROWN), - MON("gnome lord", S_GNOME, LVL(3, 8, 10, 4, 0), (G_GENO | 2), + MON3("gnome lord", "gnome lady", "gnome leader", + S_GNOME, LVL(3, 8, 10, 4, 0), (G_GENO | 2), A(ATTK(AT_WEAP, AD_PHYS, 1, 8), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(700, 120, MS_ORC, MZ_SMALL), 0, 0, M1_HUMANOID | M1_OMNIVORE, - M2_GNOME | M2_LORD | M2_MALE | M2_COLLECT, + M2_GNOME | M2_LORD | M2_COLLECT, M3_INFRAVISIBLE | M3_INFRAVISION, 4, CLR_BLUE), MON("gnomish wizard", S_GNOME, LVL(3, 10, 4, 10, 0), (G_GENO | 1), A(ATTK(AT_MAGC, AD_SPEL, 0, 0), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(700, 120, MS_ORC, MZ_SMALL), 0, 0, M1_HUMANOID | M1_OMNIVORE, M2_GNOME | M2_MAGIC, M3_INFRAVISIBLE | M3_INFRAVISION, 5, HI_ZAP), - MON("gnome king", S_GNOME, LVL(5, 10, 10, 20, 0), (G_GENO | 1), + MON3("gnome king", "gnome queen", "gnome ruler", + S_GNOME, LVL(5, 10, 10, 20, 0), (G_GENO | 1), A(ATTK(AT_WEAP, AD_PHYS, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(750, 150, MS_ORC, MZ_SMALL), 0, 0, M1_HUMANOID | M1_OMNIVORE, - M2_GNOME | M2_PRINCE | M2_MALE | M2_COLLECT, + M2_GNOME | M2_PRINCE | M2_COLLECT, M3_INFRAVISIBLE | M3_INFRAVISION, 6, HI_LORD), #ifdef SPLITMON_1 }; @@ -1681,17 +1692,19 @@ struct permonst _mons2[] = { SIZ(1600, 500, MS_GRUNT, MZ_LARGE), 0, 0, M1_HUMANOID | M1_CARNIVORE, M2_STRONG | M2_GREEDY | M2_JEWELS | M2_COLLECT, M3_INFRAVISIBLE | M3_INFRAVISION, 7, CLR_BROWN), - MON("ogre lord", S_OGRE, LVL(7, 12, 3, 30, -5), (G_GENO | 2), + MON3("ogre lord", "ogre conqueress", "ogre leader", + S_OGRE, LVL(7, 12, 3, 30, -5), (G_GENO | 2), A(ATTK(AT_WEAP, AD_PHYS, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(1700, 700, MS_GRUNT, MZ_LARGE), 0, 0, M1_HUMANOID | M1_CARNIVORE, - M2_STRONG | M2_LORD | M2_MALE | M2_GREEDY | M2_JEWELS | M2_COLLECT, + M2_STRONG | M2_LORD | M2_GREEDY | M2_JEWELS | M2_COLLECT, M3_INFRAVISIBLE | M3_INFRAVISION, 9, CLR_RED), - MON("ogre king", S_OGRE, LVL(9, 14, 4, 60, -7), (G_GENO | 2), + MON3("ogre king", "ogre queen", "ogre tyrant", + S_OGRE, LVL(9, 14, 4, 60, -7), (G_GENO | 2), A(ATTK(AT_WEAP, AD_PHYS, 3, 5), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(1700, 750, MS_GRUNT, MZ_LARGE), 0, 0, M1_HUMANOID | M1_CARNIVORE, - M2_STRONG | M2_PRINCE | M2_MALE | M2_GREEDY | M2_JEWELS | M2_COLLECT, + M2_STRONG | M2_PRINCE | M2_GREEDY | M2_JEWELS | M2_COLLECT, M3_INFRAVISIBLE | M3_INFRAVISION, 11, HI_LORD), /* * Puddings @@ -1871,14 +1884,15 @@ struct permonst _mons2[] = { M2_UNDEAD | M2_STALK | M2_HOSTILE | M2_STRONG | M2_NASTY | M2_SHAPESHIFTER, M3_INFRAVISIBLE, 12, CLR_RED), - MON("vampire lord", S_VAMPIRE, LVL(12, 14, 0, 50, -9), + MON3("vampire lord", "vampire lady", "vampire leader", + S_VAMPIRE, LVL(12, 14, 0, 50, -9), (G_GENO | G_NOCORPSE | 1), A(ATTK(AT_CLAW, AD_PHYS, 1, 8), ATTK(AT_BITE, AD_DRLI, 1, 8), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 400, MS_VAMPIRE, MZ_HUMAN), MR_SLEEP | MR_POISON, 0, M1_FLY | M1_BREATHLESS | M1_HUMANOID | M1_POIS | M1_REGEN, M2_UNDEAD | M2_STALK | M2_HOSTILE | M2_STRONG | M2_NASTY | M2_LORD - | M2_MALE | M2_SHAPESHIFTER, + | M2_SHAPESHIFTER, M3_INFRAVISIBLE, 14, CLR_BLUE), #if 0 /* DEFERRED */ MON("vampire mage", S_VAMPIRE, @@ -2187,19 +2201,21 @@ struct permonst _mons2[] = { SIZ(WT_ELF, 350, MS_HUMANOID, MZ_HUMAN), MR_SLEEP, MR_SLEEP, M1_HUMANOID | M1_OMNIVORE | M1_SEE_INVIS, M2_ELF | M2_COLLECT, M3_INFRAVISIBLE | M3_INFRAVISION, 8, CLR_GRAY), - MON("elf-lord", S_HUMAN, LVL(8, 12, 10, 20, -9), (G_GENO | G_SGROUP | 2), + MON3("elf-lord", "elf-queen", "elf-noble", + S_HUMAN, LVL(8, 12, 10, 20, -9), (G_GENO | G_SGROUP | 2), A(ATTK(AT_WEAP, AD_PHYS, 2, 4), ATTK(AT_WEAP, AD_PHYS, 2, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_ELF, 350, MS_HUMANOID, MZ_HUMAN), MR_SLEEP, MR_SLEEP, M1_HUMANOID | M1_OMNIVORE | M1_SEE_INVIS, - M2_ELF | M2_STRONG | M2_LORD | M2_MALE | M2_COLLECT, + M2_ELF | M2_STRONG | M2_LORD | M2_COLLECT, M3_INFRAVISIBLE | M3_INFRAVISION, 11, CLR_BRIGHT_BLUE), - MON("Elvenking", S_HUMAN, LVL(9, 12, 10, 25, -10), (G_GENO | 1), + MON3("Elvenking", "Elvenqueen", "Elvenmonarch", + S_HUMAN, LVL(9, 12, 10, 25, -10), (G_GENO | 1), A(ATTK(AT_WEAP, AD_PHYS, 2, 4), ATTK(AT_WEAP, AD_PHYS, 2, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_ELF, 350, MS_HUMANOID, MZ_HUMAN), MR_SLEEP, MR_SLEEP, M1_HUMANOID | M1_OMNIVORE | M1_SEE_INVIS, - M2_ELF | M2_STRONG | M2_PRINCE | M2_MALE | M2_COLLECT, + M2_ELF | M2_STRONG | M2_PRINCE | M2_COLLECT, M3_INFRAVISIBLE | M3_INFRAVISION, 11, HI_LORD), MON("doppelganger", S_HUMAN, LVL(9, 12, 5, 20, 0), (G_GENO | 1), A(ATTK(AT_WEAP, AD_PHYS, 1, 12), @@ -2242,7 +2258,8 @@ struct permonst _mons2[] = { /* aligned priests always have the epri extension attached; individual instantiations should always have either ispriest or isminion set */ - MON("aligned priest", S_HUMAN, LVL(12, 12, 10, 50, 0), G_NOGEN, + MON3("priest", "priestess", "aligned cleric", + S_HUMAN, LVL(12, 12, 10, 50, 0), G_NOGEN, A(ATTK(AT_WEAP, AD_PHYS, 4, 10), ATTK(AT_KICK, AD_PHYS, 1, 4), ATTK(AT_MAGC, AD_CLRC, 0, 0), NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 400, MS_PRIEST, MZ_HUMAN), MR_ELEC, 0, @@ -2250,7 +2267,8 @@ struct permonst _mons2[] = { M2_NOPOLY | M2_HUMAN | M2_LORD | M2_PEACEFUL | M2_COLLECT, M3_INFRAVISIBLE, 15, CLR_WHITE), /* high priests always have epri and always have ispriest set */ - MON("high priest", S_HUMAN, LVL(25, 15, 7, 70, 0), (G_NOGEN | G_UNIQ), + MON3("high priest", "high priestess", "high cleric", + S_HUMAN, LVL(25, 15, 7, 70, 0), (G_NOGEN | G_UNIQ), A(ATTK(AT_WEAP, AD_PHYS, 4, 10), ATTK(AT_KICK, AD_PHYS, 2, 8), ATTK(AT_MAGC, AD_CLRC, 2, 8), ATTK(AT_MAGC, AD_CLRC, 2, 8), NO_ATTK, NO_ATTK), @@ -2392,10 +2410,12 @@ struct permonst _mons2[] = { #define SEDUCTION_ATTACKS_NO \ A(ATTK(AT_CLAW, AD_PHYS, 1, 3), ATTK(AT_CLAW, AD_PHYS, 1, 3), \ ATTK(AT_BITE, AD_DRLI, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK) - MON("succubus", S_DEMON, LVL(6, 12, 0, 70, -9), (G_NOCORPSE | 1), + /* incubus and succubus */ + MON3("incubus", "succubus", "Amorous Demon", + S_DEMON, LVL(6, 12, 0, 70, -9), (G_NOCORPSE | 1), SEDUCTION_ATTACKS_YES, SIZ(WT_HUMAN, 400, MS_SEDUCE, MZ_HUMAN), MR_FIRE | MR_POISON, 0, M1_HUMANOID | M1_FLY | M1_POIS, - M2_DEMON | M2_STALK | M2_HOSTILE | M2_NASTY | M2_FEMALE, + M2_DEMON | M2_STALK | M2_HOSTILE | M2_NASTY, M3_INFRAVISIBLE | M3_INFRAVISION, 8, CLR_GRAY), MON("horned devil", S_DEMON, LVL(6, 9, -5, 50, 11), (G_HELL | G_NOCORPSE | 2), @@ -2405,11 +2425,6 @@ struct permonst _mons2[] = { SIZ(WT_HUMAN, 400, MS_SILENT, MZ_HUMAN), MR_FIRE | MR_POISON, 0, M1_POIS | M1_THICK_HIDE, M2_DEMON | M2_STALK | M2_HOSTILE | M2_NASTY, M3_INFRAVISIBLE | M3_INFRAVISION, 9, CLR_BROWN), - MON("incubus", S_DEMON, LVL(6, 12, 0, 70, -9), (G_NOCORPSE | 1), - SEDUCTION_ATTACKS_YES, SIZ(WT_HUMAN, 400, MS_SEDUCE, MZ_HUMAN), - MR_FIRE | MR_POISON, 0, M1_HUMANOID | M1_FLY | M1_POIS, - M2_DEMON | M2_STALK | M2_HOSTILE | M2_NASTY | M2_MALE, - M3_INFRAVISIBLE | M3_INFRAVISION, 8, CLR_GRAY), /* Used by AD&D for a type of demon, originally one of the Furies and spelled this way */ MON("erinys", S_DEMON, LVL(7, 12, 2, 30, 10), @@ -2757,19 +2772,13 @@ struct permonst _mons2[] = { M1_HUMANOID | M1_OMNIVORE, M2_NOPOLY | M2_HUMAN | M2_STRONG | M2_COLLECT, M3_INFRAVISIBLE, 12, HI_DOMESTIC), - MON("caveman", S_HUMAN, LVL(10, 12, 10, 0, 1), G_NOGEN, + MON3("caveman", "cavewoman", "cave dweller", + S_HUMAN, LVL(10, 12, 10, 0, 1), G_NOGEN, A(ATTK(AT_WEAP, AD_PHYS, 2, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 400, MS_HUMANOID, MZ_HUMAN), 0, 0, M1_HUMANOID | M1_OMNIVORE, - M2_NOPOLY | M2_HUMAN | M2_STRONG | M2_MALE | M2_COLLECT, - M3_INFRAVISIBLE, 12, HI_DOMESTIC), - MON("cavewoman", S_HUMAN, LVL(10, 12, 10, 0, 1), G_NOGEN, - A(ATTK(AT_WEAP, AD_PHYS, 2, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, - NO_ATTK), - SIZ(WT_HUMAN, 400, MS_HUMANOID, MZ_HUMAN), 0, 0, - M1_HUMANOID | M1_OMNIVORE, - M2_NOPOLY | M2_HUMAN | M2_STRONG | M2_FEMALE | M2_COLLECT, + M2_NOPOLY | M2_HUMAN | M2_STRONG | M2_COLLECT, M3_INFRAVISIBLE, 12, HI_DOMESTIC), MON("healer", S_HUMAN, LVL(10, 12, 10, 1, 0), G_NOGEN, A(ATTK(AT_WEAP, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, @@ -2792,19 +2801,13 @@ struct permonst _mons2[] = { M1_HUMANOID | M1_HERBIVORE, M2_NOPOLY | M2_HUMAN | M2_STRONG | M2_COLLECT | M2_MALE, M3_INFRAVISIBLE, 11, HI_DOMESTIC), - MON("priest", S_HUMAN, LVL(10, 12, 10, 2, 0), G_NOGEN, + MON3("priest", "priestess", "cleric", + S_HUMAN, LVL(10, 12, 10, 2, 0), G_NOGEN, A(ATTK(AT_WEAP, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(WT_HUMAN, 400, MS_HUMANOID, MZ_HUMAN), 0, 0, M1_HUMANOID | M1_OMNIVORE, - M2_NOPOLY | M2_HUMAN | M2_STRONG | M2_MALE | M2_COLLECT, - M3_INFRAVISIBLE, 12, HI_DOMESTIC), - MON("priestess", S_HUMAN, LVL(10, 12, 10, 2, 0), G_NOGEN, - A(ATTK(AT_WEAP, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, - NO_ATTK), - SIZ(WT_HUMAN, 400, MS_HUMANOID, MZ_HUMAN), 0, 0, - M1_HUMANOID | M1_OMNIVORE, - M2_NOPOLY | M2_HUMAN | M2_STRONG | M2_FEMALE | M2_COLLECT, + M2_NOPOLY | M2_HUMAN | M2_STRONG | M2_COLLECT, M3_INFRAVISIBLE, 12, HI_DOMESTIC), MON("ranger", S_HUMAN, LVL(10, 12, 10, 2, -3), G_NOGEN, A(ATTK(AT_WEAP, AD_PHYS, 1, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, diff --git a/src/mplayer.c b/src/mplayer.c index 80b995b5d..78f8f84f3 100644 --- a/src/mplayer.c +++ b/src/mplayer.c @@ -53,7 +53,8 @@ dev_name() for (mtmp = fmon; mtmp; mtmp = mtmp->nmon) { if (!is_mplayer(mtmp->data)) continue; - if (!strncmp(developers[i], (has_mname(mtmp)) ? MNAME(mtmp) : "", + if (!strncmp(developers[i], + (has_mgivenname(mtmp)) ? MGIVENNAME(mtmp) : "", strlen(developers[i]))) { match = TRUE; break; @@ -176,8 +177,7 @@ register boolean special; if (helm == HELM_OF_BRILLIANCE) helm = STRANGE_OBJECT; break; - case PM_CAVEMAN: - case PM_CAVEWOMAN: + case PM_CAVE_DWELLER: if (rn2(4)) weapon = MACE; else if (rn2(2)) @@ -208,8 +208,7 @@ register boolean special; if (rn2(2)) shield = STRANGE_OBJECT; break; - case PM_PRIEST: - case PM_PRIESTESS: + case PM_CLERIC: if (rn2(2)) weapon = MACE; if (rn2(2)) diff --git a/src/mthrowu.c b/src/mthrowu.c index c5064e37d..bba8fd939 100644 --- a/src/mthrowu.c +++ b/src/mthrowu.c @@ -345,7 +345,8 @@ boolean verbose; /* give message(s) even when you can't see what happened */ if (vis) { if (otmp->otyp == EGG) pline("Splat! %s is hit with %s egg!", Monnam(mtmp), - otmp->known ? an(mons[otmp->corpsenm].mname) : "an"); + otmp->known ? an(mons[otmp->corpsenm].pmnames[NEUTRAL]) + : "an"); else hit(distant_name(otmp, mshot_xname), mtmp, exclam(damage)); } else if (verbose && !g.mtarget) diff --git a/src/muse.c b/src/muse.c index a9fadee8b..91aaa9c8e 100644 --- a/src/muse.c +++ b/src/muse.c @@ -241,7 +241,7 @@ struct obj *otmp; saverole = Role_switch; if (!vismon) { otmp->bknown = 0; - if (Role_if(PM_PRIEST)) + if (Role_if(PM_CLERIC)) Role_switch = 0; } Strcpy(onambuf, singular(otmp, doname)); @@ -2889,7 +2889,9 @@ struct monst *mon; return (ptr->mcolor == CLR_GREEN || ptr->mcolor == CLR_BRIGHT_GREEN); #endif /* approximation */ - if (strstri(ptr->mname, "green")) + if (strstri(ptr->pmnames[NEUTRAL], "green") + || (ptr->pmnames[MALE] && strstri(ptr->pmnames[MALE], "green")) + || (ptr->pmnames[FEMALE] && strstri(ptr->pmnames[FEMALE], "green"))) return TRUE; switch (monsndx(ptr)) { case PM_FOREST_CENTAUR: diff --git a/src/music.c b/src/music.c index dd84b98c6..3dc60efc3 100644 --- a/src/music.c +++ b/src/music.c @@ -387,7 +387,7 @@ int force; You("destroy %s!", mtmp->mtame ? x_monnam(mtmp, ARTICLE_THE, "poor", - has_mname(mtmp) + has_mgivenname(mtmp) ? SUPPRESS_SADDLE : 0, FALSE) : mon_nam(mtmp)); diff --git a/src/nhlobj.c b/src/nhlobj.c index ca9567d8d..03e07401d 100644 --- a/src/nhlobj.c +++ b/src/nhlobj.c @@ -318,7 +318,8 @@ lua_State *L; if (obj->corpsenm != NON_PM && (obj->otyp == TIN || obj->otyp == CORPSE || obj->otyp == EGG || obj->otyp == FIGURINE || obj->otyp == STATUE)) - nhl_add_table_entry_str(L, "corpsenm_name", mons[obj->corpsenm].mname); + nhl_add_table_entry_str(L, "corpsenm_name", + mons[obj->corpsenm].pmnames[NEUTRAL]); /* TODO: leashmon, fromsink, novelidx, record_achieve_special */ nhl_add_table_entry_int(L, "usecount", obj->usecount); /* TODO: spestudied */ diff --git a/src/objnam.c b/src/objnam.c index a99523ef5..2330fa4dc 100644 --- a/src/objnam.c +++ b/src/objnam.c @@ -24,7 +24,7 @@ struct _readobjnam_data { int eroded, eroded2, erodeproof, locked, unlocked, broken, real, fake; int halfeaten, mntmp, contents; int islit, unlabeled, ishistoric, isdiluted, trapped; - int tmp, tinv, tvariety; + int tmp, tinv, tvariety, mgend; int wetness, gsize; int ftype; struct obj *otmp; @@ -471,7 +471,7 @@ unsigned cxn_flags; /* bitmask of CXN_xxx values */ obj->known = 0; if (!Blind && !g.distantname) obj->dknown = 1; - if (Role_if(PM_PRIEST)) + if (Role_if(PM_CLERIC)) obj->bknown = 1; /* actively avoid set_bknown(); * we mustn't call update_inventory() now because * it would call xname() (via doname()) recursively @@ -528,8 +528,8 @@ unsigned cxn_flags; /* bitmask of CXN_xxx values */ char anbuf[10]; /* [4] would be enough: 'a','n',' ','\0' */ Sprintf(eos(buf), " of %s%s", - just_an(anbuf, mons[omndx].mname), - mons[omndx].mname); + just_an(anbuf, mons[omndx].pmnames[NEUTRAL]), + mons[omndx].pmnames[NEUTRAL]); } else if (is_wet_towel(obj)) { if (wizard) Sprintf(eos(buf), " (%d)", obj->spe); @@ -617,6 +617,7 @@ unsigned cxn_flags; /* bitmask of CXN_xxx values */ case ROCK_CLASS: if (typ == STATUE && omndx != NON_PM) { char anbuf[10]; + int mgend = (obj->spe & STATUE_FEMALE) ? FEMALE : MALE; Sprintf(buf, "%s%s of %s%s", (Role_if(PM_ARCHEOLOGIST) && (obj->spe & STATUE_HISTORIC)) @@ -627,8 +628,8 @@ unsigned cxn_flags; /* bitmask of CXN_xxx values */ ? "" : the_unique_pm(&mons[omndx]) ? "the " - : just_an(anbuf, mons[omndx].mname), - mons[omndx].mname); + : just_an(anbuf, pmname(&mons[omndx], mgend)), + pmname(&mons[omndx], mgend)); } else Strcpy(buf, actualn); break; @@ -822,7 +823,7 @@ struct obj *obj; bufp = distant_name(&bareobj, xname); /* xname(&bareobj) */ if (!strncmp(bufp, "uncursed ", 9)) - bufp += 9; /* Role_if(PM_PRIEST) */ + bufp += 9; /* Role_if(PM_CLERIC) */ objects[otyp].oc_uname = saveobcls.oc_uname; objects[otyp].oc_name_known = saveobcls.oc_name_known; @@ -878,7 +879,7 @@ struct permonst *ptr; /* high priest is unique if it includes "of ", otherwise not (caller needs to handle the 1st possibility; we assume the 2nd); worm tail should be irrelevant but is included for completeness */ - if (ptr == &mons[PM_HIGH_PRIEST] || ptr == &mons[PM_LONG_WORM_TAIL]) + if (ptr == &mons[PM_HIGH_CLERIC] || ptr == &mons[PM_LONG_WORM_TAIL]) uniq = FALSE; /* Wizard no longer needs this; he's flagged as unique these days */ if (ptr == &mons[PM_WIZARD_OF_YENDOR]) @@ -1062,7 +1063,7 @@ unsigned doname_flags; #endif && obj->otyp != FAKE_AMULET_OF_YENDOR && obj->otyp != AMULET_OF_YENDOR - && !Role_if(PM_PRIEST))) + && !Role_if(PM_CLERIC))) Strcat(prefix, "uncursed "); } @@ -1200,7 +1201,7 @@ unsigned doname_flags; #endif if (omndx >= LOW_PM && (known || (g.mvitals[omndx].mvflags & MV_KNOWS_EGG))) { - Strcat(prefix, mons[omndx].mname); + Strcat(prefix, mons[omndx].pmnames[NEUTRAL]); Strcat(prefix, " "); if (obj->spe == 1) Strcat(bp, " (laid by you)"); @@ -1433,21 +1434,21 @@ unsigned cxn_flags; /* bitmask of CXN_xxx values */ omit_corpse = (cxn_flags & CXN_NOCORPSE) != 0, possessive = FALSE, glob = (otmp->otyp != CORPSE && otmp->globby); - const char *mname; + const char *mnam; if (glob) { - mname = OBJ_NAME(objects[otmp->otyp]); /* "glob of " */ + mnam = OBJ_NAME(objects[otmp->otyp]); /* "glob of " */ } else if (omndx == NON_PM) { /* paranoia */ - mname = "thing"; + mnam = "thing"; /* [Possible enhancement: check whether corpse has monster traits attached in order to use priestname() for priests and minions.] */ - } else if (omndx == PM_ALIGNED_PRIEST) { + } else if (omndx == PM_ALIGNED_CLERIC) { /* avoid "aligned priest"; it just exposes internal details */ - mname = "priest"; + mnam = "priest"; } else { - mname = mons[omndx].mname; + mnam = mons[omndx].pmnames[NEUTRAL]; if (the_unique_pm(&mons[omndx]) || type_is_pname(&mons[omndx])) { - mname = s_suffix(mname); + mnam = s_suffix(mnam); possessive = TRUE; /* don't precede personal name like "Medusa" with an article */ if (type_is_pname(&mons[omndx])) @@ -1473,13 +1474,13 @@ unsigned cxn_flags; /* bitmask of CXN_xxx values */ if (!adjective || !*adjective) { /* normal case: newt corpse */ - Strcat(nambuf, mname); + Strcat(nambuf, mnam); } else { /* adjective positioning depends upon format of monster name */ if (possessive) /* Medusa's cursed partly eaten corpse */ - Sprintf(eos(nambuf), "%s %s", mname, adjective); + Sprintf(eos(nambuf), "%s %s", mnam, adjective); else /* cursed partly eaten troll corpse */ - Sprintf(eos(nambuf), "%s %s", adjective, mname); + Sprintf(eos(nambuf), "%s %s", adjective, mnam); /* in case adjective has a trailing space, squeeze it out */ mungspaces(nambuf); /* doname() might include a count in the adjective argument; @@ -3270,6 +3271,7 @@ struct _readobjnam_data *d; = d->ishistoric = d->isdiluted = d->trapped = d->locked = d->unlocked = d->broken = d->real = d->fake = 0; d->tvariety = RANDOM_TIN; + d->mgend = MALE; d->mntmp = NON_PM; d->contents = UNDEFINED; d->oclass = 0; @@ -3597,7 +3599,8 @@ struct _readobjnam_data *d; || !strcmpi(d->bp, "globs") || !BSTRCMPI(d->bp, d->bp + i - 6, " globs") || (d->p = strstri(d->bp, "glob of ")) != 0 || (d->p = strstri(d->bp, "globs of ")) != 0) { - d->mntmp = name_to_mon(!d->p ? d->bp : (strstri(d->p, " of ") + 4)); + d->mntmp = name_to_mon(!d->p ? d->bp + : (strstri(d->p, " of ") + 4), (int *) 0); /* if we didn't recognize monster type, pick a valid one at random */ if (d->mntmp == NON_PM) d->mntmp = rn1(PM_BLACK_PUDDING - PM_GRAY_OOZE, PM_GRAY_OOZE); @@ -3605,7 +3608,7 @@ struct _readobjnam_data *d; variant (grey ooze) or player used inverted syntax ( 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 " object lookup */ d->cnt = 0; /* globs don't stack */ @@ -3631,12 +3634,13 @@ struct _readobjnam_data *d; } else { d->tmp = tin_variety_txt(d->p + 7, &d->tinv); d->tvariety = d->tinv; - d->mntmp = name_to_mon(d->p + 7 + d->tmp); + d->mntmp = name_to_mon(d->p + 7 + d->tmp, &d->mgend); } d->typ = TIN; return 2; /*goto typfnd;*/ } else if ((d->p = strstri(d->bp, " of ")) != 0 - && (d->mntmp = name_to_mon(d->p + 4)) >= LOW_PM) + && (d->mntmp = name_to_mon(d->p + 4, + &d->mgend)) >= LOW_PM) *d->p = 0; } } @@ -3649,7 +3653,8 @@ struct _readobjnam_data *d; const char *rest = 0; if (d->mntmp < LOW_PM && strlen(d->bp) > 2 - && (d->mntmp = name_to_monplus(d->bp, &rest)) >= LOW_PM) { + && (d->mntmp = name_to_monplus(d->bp, &rest, + &d->mgend)) >= LOW_PM) { char *obp = d->bp; /* 'rest' is a pointer past the matching portion; if that was @@ -4280,8 +4285,11 @@ struct obj *no_wish; case LARGE_BOX: case HEAVY_IRON_BALL: case IRON_CHAIN: + break; case STATUE: /* otmp->cobj already done in mksobj() */ + if (d.mgend) + d.otmp->spe |= STATUE_FEMALE; break; #ifdef MAIL_STRUCTURES /* scroll of mail: 0: delivered in-game via external event (or randomly @@ -4355,7 +4363,7 @@ struct obj *no_wish; d.otmp->corpsenm = d.mntmp; if (Has_contents(d.otmp) && verysmall(&mons[d.mntmp])) delete_contents(d.otmp); /* no spellbook */ - d.otmp->spe = d.ishistoric ? STATUE_HISTORIC : 0; + d.otmp->spe |= d.ishistoric ? STATUE_HISTORIC : 0; break; case SCALE_MAIL: /* Dragon mail - depends on the order of objects & dragons. */ diff --git a/src/options.c b/src/options.c index ed0101c4b..d58c4e1f0 100644 --- a/src/options.c +++ b/src/options.c @@ -7376,13 +7376,13 @@ struct fruit *replace_fruit; || !strncmp(g.pl_fruit, "partly eaten ", 13) || (!strncmp(g.pl_fruit, "tin of ", 7) && (!strcmp(g.pl_fruit + 7, "spinach") - || name_to_mon(g.pl_fruit + 7) >= LOW_PM)) + || name_to_mon(g.pl_fruit + 7, (int *) 0) >= LOW_PM)) || !strcmp(g.pl_fruit, "empty tin") || (!strcmp(g.pl_fruit, "glob") || (globpfx > 0 && !strcmp("glob", &g.pl_fruit[globpfx]))) || ((str_end_is(g.pl_fruit, " corpse") || str_end_is(g.pl_fruit, " egg")) - && name_to_mon(g.pl_fruit) >= LOW_PM)) { + && name_to_mon(g.pl_fruit, (int *) 0) >= LOW_PM)) { Strcpy(buf, g.pl_fruit); Strcpy(g.pl_fruit, "candied "); nmcpy(g.pl_fruit + 8, buf, PL_FSIZ - 8); diff --git a/src/pager.c b/src/pager.c index b573bb4aa..197cd4b3c 100644 --- a/src/pager.c +++ b/src/pager.c @@ -89,7 +89,7 @@ char *outbuf; Sprintf(outbuf, "%s%s%s called %s", /* being blinded may hide invisibility from self */ (Invis && (senseself() || !Blind)) ? "invisible " : "", race, - mons[u.umonnum].mname, g.plname); + pmname(&mons[u.umonnum], Ugender), g.plname); if (u.usteed) Sprintf(eos(outbuf), ", mounted on %s", y_monnam(u.usteed)); if (u.uundetected || (Upolyd && U_AP_TYPE)) @@ -167,7 +167,7 @@ char *outbuf; } else if (M_AP_TYPE(mon) == M_AP_MONSTER) { if (altmon) Sprintf(outbuf, ", masquerading as %s", - an(mons[mon->mappearance].mname)); + an(pmname(&mons[mon->mappearance], Mgender(mon)))); } else if (isyou ? u.uundetected : mon->mundetected) { Strcpy(outbuf, ", hiding"); if (hides_under(mon->data)) { @@ -403,7 +403,7 @@ int x, y; : (mW & M2_ELF & m2) ? "elf" : (mW & M2_ORC & m2) ? "orc" : (mW & M2_DEMON & m2) ? "demon" - : mtmp->data->mname); + : pmname(mtmp->data, Mgender(mtmp))); Sprintf(eos(monbuf), "warned of %s", makeplural(whom)); } @@ -616,7 +616,7 @@ char *supplemental_name; * user_typed_name and picked name. */ if (pm != (struct permonst *) 0 && !user_typed_name) - dbase_str = strcpy(newstr, pm->mname); + dbase_str = strcpy(newstr, pm->pmnames[NEUTRAL]); else dbase_str = strcpy(newstr, inp); (void) lcase(dbase_str); @@ -893,15 +893,14 @@ struct permonst **for_supplement; hallucinate = (Hallucination && !g.program_state.gameover); const char *x_str; nhsym tmpsym; + unsigned glyphmod[NUM_GLYPHMOD]; gobbledygook[0] = '\0'; /* no hallucinatory liquid (yet) */ if (looked) { - int oc; - unsigned os; - glyph = glyph_at(cc.x, cc.y); /* Convert glyph at selected position to a symbol for use below. */ - (void) mapglyph(glyph, &sym, &oc, &os, cc.x, cc.y, 0); + map_glyphmod(cc.x, cc.y, glyph, 0, glyphmod); + sym = glyphmod[GM_TTYCHAR]; Sprintf(prefix, "%s ", encglyph(glyph)); } else @@ -1154,12 +1153,9 @@ struct permonst **for_supplement; break; case SYM_PET_OVERRIDE + SYM_OFF_X: if (looked) { - int oc = 0; - unsigned os = 0; - /* convert to symbol without override in effect */ - (void) mapglyph(glyph, &sym, &oc, &os, - cc.x, cc.y, MG_FLAG_NOOVERRIDE); + map_glyphmod(cc.x, cc.y, glyph, MG_FLAG_NOOVERRIDE, glyphmod); + sym = (int) glyphmod[GM_TTYCHAR]; goto check_monsters; } break; diff --git a/src/pickup.c b/src/pickup.c index a8d7f3d88..f271d4c17 100644 --- a/src/pickup.c +++ b/src/pickup.c @@ -484,7 +484,7 @@ struct obj *obj; ? TRUE : FALSE) : TRUE; /* catchall: no filters specified, so accept */ - if (Role_if(PM_PRIEST) && !obj->bknown) + if (Role_if(PM_CLERIC) && !obj->bknown) set_bknown(obj, 1); /* diff --git a/src/polyself.c b/src/polyself.c index ccc076076..3d898ec66 100644 --- a/src/polyself.c +++ b/src/polyself.c @@ -263,10 +263,13 @@ change_sex() : g.urole.malenum; if (!already_polyd) { u.umonnum = u.umonster; - } else if (u.umonnum == PM_SUCCUBUS || u.umonnum == PM_INCUBUS) { + } else if (u.umonnum == PM_AMOROUS_DEMON) { flags.female = !flags.female; - /* change monster type to match new sex */ +#if 0 + /* change monster type to match new sex; disabled with PM_AMOROUS_DEMON */ + u.umonnum = (u.umonnum == PM_SUCCUBUS) ? PM_INCUBUS : PM_SUCCUBUS; +#endif set_uasmon(); } } @@ -394,7 +397,7 @@ polyself(psflags) int psflags; { char buf[BUFSZ] = DUMMY; - int old_light, new_light, mntmp, class, tryct; + int old_light, new_light, mntmp, class, tryct, gvariant = NEUTRAL; boolean forcecontrol = (psflags == 1), monsterpoly = (psflags == 2), formrevert = (psflags == 3), @@ -449,7 +452,7 @@ int psflags; continue; /* end do-while(--tryct > 0) loop */ } class = 0; - mntmp = name_to_mon(buf); + mntmp = name_to_mon(buf, &gvariant); if (mntmp < LOW_PM) { by_class: class = name_to_monclass(buf, &mntmp); @@ -489,7 +492,7 @@ int psflags; 0 and trigger thats_enough_tries message */ ++tryct; } - pm_name = mons[mntmp].mname; + pm_name = pmname(&mons[mntmp], flags.female ? FEMALE : MALE); if (the_unique_pm(&mons[mntmp])) pm_name = the(pm_name); else if (!type_is_pname(&mons[mntmp])) @@ -552,7 +555,7 @@ int psflags; } else if (isvamp) { do_vampyr: if (mntmp < LOW_PM || (mons[mntmp].geno & G_UNIQ)) { - mntmp = (g.youmonst.data == &mons[PM_VAMPIRE_LORD] && !rn2(10)) + mntmp = (g.youmonst.data == &mons[PM_VAMPIRE_LEADER] && !rn2(10)) ? PM_WOLF : !rn2(4) ? PM_FOG_CLOUD : PM_VAMPIRE_BAT; if (g.youmonst.cham >= LOW_PM @@ -560,7 +563,8 @@ int psflags; mntmp = g.youmonst.cham; } if (controllable_poly) { - Sprintf(buf, "Become %s?", an(mons[mntmp].mname)); + Sprintf(buf, "Become %s?", + an(pmname(&mons[mntmp], gvariant))); if (yn(buf) != 'y') return; } @@ -622,7 +626,8 @@ int mntmp; int mlvl; if (g.mvitals[mntmp].mvflags & G_GENOD) { /* allow G_EXTINCT */ - You_feel("rather %s-ish.", mons[mntmp].mname); + You_feel("rather %s-ish.", + pmname(&mons[mntmp], flags.female ? FEMALE : MALE)); exercise(A_WIS, TRUE); return 0; } @@ -676,7 +681,7 @@ int mntmp; Strcat(buf, (is_male(&mons[mntmp]) || is_female(&mons[mntmp])) ? "" : flags.female ? "female " : "male "); } - Strcat(buf, mons[mntmp].mname); + Strcat(buf, pmname(&mons[mntmp], flags.female ? FEMALE : MALE)); You("%s %s!", (u.umonnum != mntmp) ? "turn into" : "feel like", an(buf)); if (Stoned && poly_when_stoned(&mons[mntmp])) { @@ -774,7 +779,8 @@ int mntmp; if (touch_petrifies(u.usteed->data) && !Stone_resistance && rnl(3)) { pline("%s touch %s.", no_longer_petrify_resistant, mon_nam(u.usteed)); - Sprintf(buf, "riding %s", an(u.usteed->data->mname)); + Sprintf(buf, "riding %s", + an(pmname(u.usteed->data, Mgender(u.usteed)))); instapetrify(buf); } if (!can_ride(u.usteed)) @@ -1576,7 +1582,8 @@ dopoly() if (is_vampire(g.youmonst.data) || is_vampshifter(&g.youmonst)) { polyself(2); if (savedat != g.youmonst.data) { - You("transform into %s.", an(g.youmonst.data->mname)); + You("transform into %s.", + an(pmname(g.youmonst.data, Ugender))); newsym(u.ux, u.uy); } } @@ -1764,7 +1771,7 @@ int part; if ((part == HAND || part == HANDED) && (humanoid(mptr) && attacktype(mptr, AT_CLAW) && !index(not_claws, mptr->mlet) && mptr != &mons[PM_STONE_GOLEM] - && mptr != &mons[PM_INCUBUS] && mptr != &mons[PM_SUCCUBUS])) + && mptr != &mons[PM_AMOROUS_DEMON])) return (part == HAND) ? "claw" : "clawed"; if ((mptr == &mons[PM_MUMAK] || mptr == &mons[PM_MASTODON]) && part == NOSE) @@ -1926,7 +1933,7 @@ polysense() warnidx = PM_SHRIEKER; break; case PM_VAMPIRE: - case PM_VAMPIRE_LORD: + case PM_VAMPIRE_LEADER: g.context.warntype.polyd = M2_HUMAN | M2_ELF; HWarn_of_mon |= FROMRACE; return; diff --git a/src/potion.c b/src/potion.c index bf2f2becd..4d3265c0d 100644 --- a/src/potion.c +++ b/src/potion.c @@ -660,7 +660,7 @@ register struct obj *otmp; exercise(A_CON, FALSE); if (u.ulycn >= LOW_PM) { Your("affinity to %s disappears!", - makeplural(mons[u.ulycn].mname)); + makeplural(mons[u.ulycn].pmnames[NEUTRAL])); if (g.youmonst.data == &mons[u.ulycn]) you_unwere(FALSE); set_ulycn(NON_PM); /* cure lycanthropy */ diff --git a/src/pray.c b/src/pray.c index f6ce19b1a..fa95503ae 100644 --- a/src/pray.c +++ b/src/pray.c @@ -1979,7 +1979,7 @@ doturn() const char *Gname; int once, range, xlev; - if (!Role_if(PM_PRIEST) && !Role_if(PM_KNIGHT)) { + if (!Role_if(PM_CLERIC) && !Role_if(PM_KNIGHT)) { /* Try to use the "turn undead" spell. * * This used to be based on whether hero knows the name of the diff --git a/src/priest.c b/src/priest.c index 3b0c6c1e5..354cbc5a4 100644 --- a/src/priest.c +++ b/src/priest.c @@ -233,7 +233,7 @@ boolean sanctum; /* is it the seat of the high priest? */ struct obj *otmp; int cnt; int px = 0, py = 0, i, si = rn2(8); - struct permonst *prim = &mons[sanctum ? PM_HIGH_PRIEST : PM_ALIGNED_PRIEST]; + struct permonst *prim = &mons[sanctum ? PM_HIGH_CLERIC : PM_ALIGNED_CLERIC]; for (i = 0; i < 8; i++) { px = sx + xdir[(i+si) % 8]; @@ -310,10 +310,11 @@ register struct monst *mon; char *pname; /* caller-supplied output buffer */ { boolean do_hallu = Hallucination, - aligned_priest = mon->data == &mons[PM_ALIGNED_PRIEST], - high_priest = mon->data == &mons[PM_HIGH_PRIEST]; + aligned_priest = mon->data == &mons[PM_ALIGNED_CLERIC], + high_priest = mon->data == &mons[PM_HIGH_CLERIC]; char whatcode = '\0'; - const char *what = do_hallu ? rndmonnam(&whatcode) : mon->data->mname; + const char *what = do_hallu ? rndmonnam(&whatcode) + : pmname(mon->data, Mgender(mon)); if (!mon->ispriest && !mon->isminion) /* should never happen... */ return strcpy(pname, what); /* caller must be confused */ @@ -416,7 +417,7 @@ int roomno; epri_p = EPRI(priest); shrined = has_shrine(priest); - sanctum = (priest->data == &mons[PM_HIGH_PRIEST] + sanctum = (priest->data == &mons[PM_HIGH_CLERIC] && (Is_sanctum(&u.uz) || In_endgame(&u.uz))); can_speak = (priest->mcanmove && !priest->msleeping); if (can_speak && !Deaf && g.moves >= epri_p->intone_time) { @@ -668,7 +669,7 @@ boolean peaceful; register boolean coaligned = (u.ualign.type == alignment); #if 0 /* this was due to permonst's pxlth field which is now gone */ - if (ptr != &mons[PM_ALIGNED_PRIEST] && ptr != &mons[PM_ANGEL]) + if (ptr != &mons[PM_ALIGNED_CLERIC] && ptr != &mons[PM_ANGEL]) return (struct monst *) 0; #endif @@ -697,7 +698,7 @@ register struct monst *roamer; { if (!roamer->isminion) return; - if (roamer->data != &mons[PM_ALIGNED_PRIEST] + if (roamer->data != &mons[PM_ALIGNED_CLERIC] && roamer->data != &mons[PM_ANGEL]) return; diff --git a/src/questpgr.c b/src/questpgr.c index bfae12d0c..2a52de0f1 100644 --- a/src/questpgr.c +++ b/src/questpgr.c @@ -52,7 +52,7 @@ ldrname() int i = g.urole.ldrnum; Sprintf(g.nambuf, "%s%s", type_is_pname(&mons[i]) ? "" : "the ", - mons[i].mname); + mons[i].pmnames[NEUTRAL]); return g.nambuf; } @@ -129,7 +129,7 @@ neminame() int i = g.urole.neminum; Sprintf(g.nambuf, "%s%s", type_is_pname(&mons[i]) ? "" : "the ", - mons[i].mname); + mons[i].pmnames[NEUTRAL]); return g.nambuf; } @@ -138,7 +138,7 @@ guardname() /* return your role leader's guard monster name */ { int i = g.urole.guardnum; - return mons[i].mname; + return mons[i].pmnames[NEUTRAL]; } static const char * diff --git a/src/read.c b/src/read.c index 30809567e..e32dcdfbc 100644 --- a/src/read.c +++ b/src/read.c @@ -2059,7 +2059,7 @@ do_class_genocide() return; class = name_to_monclass(buf, (int *) 0); - if (class == 0 && (i = name_to_mon(buf)) != NON_PM) + if (class == 0 && (i = name_to_mon(buf, (int *) 0)) != NON_PM) class = mons[i].mlet; immunecnt = gonecnt = goodcnt = 0; for (i = LOW_PM; i < NUMMONS; i++) { @@ -2101,7 +2101,7 @@ do_class_genocide() if (mons[i].mlet == class) { char nam[BUFSZ]; - Strcpy(nam, makeplural(mons[i].mname)); + Strcpy(nam, makeplural(mons[i].pmnames[NEUTRAL])); /* Although "genus" is Latin for race, the hero benefits * from both race and role; thus genocide affects either. */ @@ -2165,12 +2165,12 @@ do_class_genocide() named = type_is_pname(&mons[i]) ? TRUE : FALSE; uniq = (mons[i].geno & G_UNIQ) ? TRUE : FALSE; /* one special case */ - if (i == PM_HIGH_PRIEST) + if (i == PM_HIGH_CLERIC) uniq = FALSE; You("aren't permitted to genocide %s%s.", (uniq && !named) ? "the " : "", - (uniq || named) ? mons[i].mname : nam); + (uniq || named) ? mons[i].pmnames[NEUTRAL] : nam); } } } @@ -2205,7 +2205,7 @@ int how; if (how & PLAYER) { mndx = u.umonster; /* non-polymorphed mon num */ ptr = &mons[mndx]; - Strcpy(buf, ptr->mname); + Strcpy(buf, pmname(ptr, Ugender)); killplayer++; } else { for (i = 0;; i++) { @@ -2230,7 +2230,7 @@ int how; return; } - mndx = name_to_mon(buf); + mndx = name_to_mon(buf, (int *) 0); if (mndx == NON_PM || (g.mvitals[mndx].mvflags & G_GENOD)) { pline("Such creatures %s exist in this world.", (mndx == NON_PM) ? "do not" : "no longer"); @@ -2276,15 +2276,15 @@ int how; which = "all "; if (Hallucination) { if (Upolyd) - Strcpy(buf, g.youmonst.data->mname); + Strcpy(buf, pmname(g.youmonst.data, flags.female ? FEMALE : MALE)); else { Strcpy(buf, (flags.female && g.urole.name.f) ? g.urole.name.f : g.urole.name.m); buf[0] = lowc(buf[0]); } } else { - Strcpy(buf, ptr->mname); /* make sure we have standard singular */ - if ((ptr->geno & G_UNIQ) && ptr != &mons[PM_HIGH_PRIEST]) + Strcpy(buf, ptr->pmnames[NEUTRAL]); /* make sure we have standard singular */ + if ((ptr->geno & G_UNIQ) && ptr != &mons[PM_HIGH_CLERIC]) which = !type_is_pname(ptr) ? "the " : ""; } if (how & REALLY) { @@ -2425,7 +2425,7 @@ struct obj *from_obj; { /* SHOPKEEPERS can be revived now */ if (*mtype == PM_GUARD || (*mtype == PM_SHOPKEEPER && !revival) - || *mtype == PM_HIGH_PRIEST || *mtype == PM_ALIGNED_PRIEST + || *mtype == PM_HIGH_CLERIC || *mtype == PM_ALIGNED_CLERIC || *mtype == PM_ANGEL) { *mtype = PM_HUMAN_ZOMBIE; return TRUE; @@ -2447,6 +2447,7 @@ create_particular_parse(str, d) char *str; struct _create_particular_data *d; { + int gender_name_var = NEUTRAL; char *bufp = str; char *tmpp; @@ -2516,7 +2517,13 @@ struct _create_particular_data *d; d->randmonst = TRUE; return TRUE; } - d->which = name_to_mon(bufp); + d->which = name_to_mon(bufp, &gender_name_var); + /* + * With the introduction of male and female monster names + * in 3.7, preserve that detail. + */ + if (gender_name_var != NEUTRAL) + d->fem = gender_name_var; if (d->which >= LOW_PM) return TRUE; /* got one */ d->monclass = name_to_monclass(bufp, &d->which); @@ -2556,7 +2563,8 @@ struct _create_particular_data *d; char buf[BUFSZ]; Sprintf(buf, "Creating %s instead; force %s?", - mons[d->which].mname, mons[firstchoice].mname); + mons[d->which].pmnames[NEUTRAL], + mons[firstchoice].pmnames[NEUTRAL]); if (yn(buf) == 'y') d->which = firstchoice; } diff --git a/src/restore.c b/src/restore.c index 528d76a04..935c54630 100644 --- a/src/restore.c +++ b/src/restore.c @@ -333,13 +333,13 @@ struct monst *mtmp; if (mtmp->mextra) { mtmp->mextra = newmextra(); - /* mname - monster's name */ + /* mgivenname - monster's name */ if (nhfp->structlevel) mread(nhfp->fd, (genericptr_t) &buflen, sizeof(buflen)); if (buflen > 0) { /* includes terminating '\0' */ - new_mname(mtmp, buflen); + new_mgivenname(mtmp, buflen); if (nhfp->structlevel) - mread(nhfp->fd, (genericptr_t) MNAME(mtmp), buflen); + mread(nhfp->fd, (genericptr_t) MGIVENNAME(mtmp), buflen); } /* egd - vault guard */ if (nhfp->structlevel) diff --git a/src/role.c b/src/role.c index 98854f3dc..fe30684a1 100644 --- a/src/role.c +++ b/src/role.c @@ -123,8 +123,8 @@ const struct Role roles[NUM_ROLES+1] = { "Cav", "the Caves of the Ancestors", "the Dragon's Lair", - PM_CAVEMAN, - PM_CAVEWOMAN, + PM_CAVE_DWELLER, + NON_PM, PM_LITTLE_DOG, PM_SHAMAN_KARNOV, PM_NEANDERTHAL, @@ -289,8 +289,8 @@ const struct Role roles[NUM_ROLES+1] = { "Pri", "the Great Temple", "the Temple of Nalzok", - PM_PRIEST, - PM_PRIESTESS, + PM_CLERIC, + NON_PM, NON_PM, PM_ARCH_PRIEST, PM_ACOLYTE, diff --git a/src/save.c b/src/save.c index f463e8939..fe6001bbf 100644 --- a/src/save.c +++ b/src/save.c @@ -814,12 +814,12 @@ struct monst *mtmp; bwrite(nhfp->fd, (genericptr_t) mtmp, buflen); } if (mtmp->mextra) { - buflen = MNAME(mtmp) ? (int) strlen(MNAME(mtmp)) + 1 : 0; + buflen = MGIVENNAME(mtmp) ? (int) strlen(MGIVENNAME(mtmp)) + 1 : 0; if (nhfp->structlevel) bwrite(nhfp->fd, (genericptr_t) &buflen, sizeof buflen); if (buflen > 0) { if (nhfp->structlevel) - bwrite(nhfp->fd, (genericptr_t) MNAME(mtmp), buflen); + bwrite(nhfp->fd, (genericptr_t) MGIVENNAME(mtmp), buflen); } buflen = EGD(mtmp) ? (int) sizeof (struct egd) : 0; if (nhfp->structlevel) diff --git a/src/shk.c b/src/shk.c index 2d1eb5b36..e12937de2 100644 --- a/src/shk.c +++ b/src/shk.c @@ -839,8 +839,8 @@ char rmno; (int) rmno, (int) g.rooms[rmno - ROOMOFFSET].rtype, shkp->mnum, - /* [real shopkeeper name is kept in ESHK, not MNAME] */ - has_mname(shkp) ? MNAME(shkp) : "anonymous"); + /* [real shopkeeper name is kept in ESHK, not MGIVENNAME] */ + has_mgivenname(shkp) ? MGIVENNAME(shkp) : "anonymous"); /* not sure if this is appropriate, because it does nothing to correct the underlying g.rooms[].resident issue but... */ return (struct monst *) 0; diff --git a/src/sounds.c b/src/sounds.c index 75b0de790..6a4409b21 100644 --- a/src/sounds.c +++ b/src/sounds.c @@ -184,8 +184,8 @@ dosounds() continue; if (is_mercenary(mtmp->data) #if 0 /* don't bother excluding these */ - && !strstri(mtmp->data->mname, "watch") - && !strstri(mtmp->data->mname, "guard") + && !strstri(mtmp->data->pmnames[NEUTRAL], "watch") + && !strstri(mtmp->data->pmnames[NEUTRAL], "guard") #endif && mon_in_room(mtmp, BARRACKS) /* sleeping implies not-yet-disturbed (usually) */ @@ -634,7 +634,7 @@ register struct monst *mtmp; * night */ boolean isnight = night(); boolean kindred = (Upolyd && (u.umonnum == PM_VAMPIRE - || u.umonnum == PM_VAMPIRE_LORD)); + || u.umonnum == PM_VAMPIRE_LEADER)); boolean nightchild = (Upolyd && (u.umonnum == PM_WOLF || u.umonnum == PM_WINTER_WOLF || u.umonnum == PM_WINTER_WOLF_CUB)); @@ -696,7 +696,8 @@ register struct monst *mtmp; verbl_msg = verbuf; } else if (vampindex == 1) { Sprintf(verbuf, vampmsg[vampindex], - Upolyd ? an(mons[u.umonnum].mname) + Upolyd ? an(pmname(&mons[u.umonnum], + flags.female ? FEMALE : MALE)) : an(racenoun)); verbl_msg = verbuf; } else @@ -1086,7 +1087,8 @@ dochat() struct obj *otmp; if (is_silent(g.youmonst.data)) { - pline("As %s, you cannot speak.", an(g.youmonst.data->mname)); + pline("As %s, you cannot speak.", + an(pmname(g.youmonst.data, flags.female ? FEMALE : MALE))); return 0; } if (Strangled) { diff --git a/src/sp_lev.c b/src/sp_lev.c index 6d64c182c..859945bbc 100755 --- a/src/sp_lev.c +++ b/src/sp_lev.c @@ -1965,12 +1965,12 @@ struct mkroom *croom; break; case M_AP_MONSTER: { - int mndx; + int mndx, gender_name_var = NEUTRAL; if (!strcmpi(m->appear_as.str, "random")) mndx = select_newcham_form(mtmp); else - mndx = name_to_mon(m->appear_as.str); + mndx = name_to_mon(m->appear_as.str, &gender_name_var); if (mndx == NON_PM || (is_vampshifter(mtmp) && !validvamp(mtmp, &mndx, S_HUMAN))) { @@ -1998,6 +1998,8 @@ struct mkroom *croom; struct permonst *olddata = mtmp->data; mgender_from_permonst(mtmp, mdat); + if (gender_name_var != NEUTRAL) + mtmp->female = gender_name_var; set_mon_data(mtmp, mdat); if (emits_light(olddata) != emits_light(mtmp->data)) { /* used to give light, now doesn't, or vice versa, @@ -3016,7 +3018,11 @@ const char *s; int i; for (i = LOW_PM; i < NUMMONS; i++) - if (!strcmpi(mons[i].mname, s)) + if (!strcmpi(mons[i].pmnames[NEUTRAL], s) + || (mons[i].pmnames[MALE] != 0 + && !strcmpi(mons[i].pmnames[MALE], s)) + || (mons[i].pmnames[FEMALE] != 0 + && !strcmpi(mons[i].pmnames[FEMALE], s))) return i; return NON_PM; } @@ -3428,7 +3434,11 @@ lua_State *L; pm = mkclass(def_char_to_monclass(*montype), G_NOGEN|G_IGNORE); } else { for (i = LOW_PM; i < NUMMONS; i++) - if (!strcmpi(mons[i].mname, montype)) { + if (!strcmpi(mons[i].pmnames[NEUTRAL], montype) + || (mons[i].pmnames[MALE] != 0 + && !strcmpi(mons[i].pmnames[MALE], montype)) + || (mons[i].pmnames[FEMALE] != 0 + && !strcmpi(mons[i].pmnames[FEMALE], montype))) { pm = &mons[i]; break; } diff --git a/src/steal.c b/src/steal.c index 7ce86a9ce..790a08128 100644 --- a/src/steal.c +++ b/src/steal.c @@ -508,11 +508,11 @@ register struct obj *otmp; if (!otmp) { impossible("monster (%s) taking or picking up nothing?", - mtmp->data->mname); + pmname(mtmp->data, Mgender(mtmp))); return 1; } else if (otmp == uball || otmp == uchain) { impossible("monster (%s) taking or picking up attached %s (%s)?", - mtmp->data->mname, + pmname(mtmp->data, Mgender(mtmp)), (otmp == uchain) ? "chain" : "ball", simpleonames(otmp)); return 0; } diff --git a/src/steed.c b/src/steed.c index e380a4c5c..44dd33e9f 100644 --- a/src/steed.c +++ b/src/steed.c @@ -70,11 +70,12 @@ struct obj *otmp; You("touch %s.", mon_nam(mtmp)); if (!(poly_when_stoned(g.youmonst.data) && polymon(PM_STONE_GOLEM))) { - Sprintf(kbuf, "attempting to saddle %s", an(mtmp->data->mname)); + Sprintf(kbuf, "attempting to saddle %s", + an(pmname(mtmp->data, Mgender(mtmp)))); instapetrify(kbuf); } } - if (ptr == &mons[PM_INCUBUS] || ptr == &mons[PM_SUCCUBUS]) { + if (ptr == &mons[PM_AMOROUS_DEMON]) { pline("Shame on you!"); exercise(A_WIS, FALSE); return 1; @@ -275,7 +276,8 @@ boolean force; /* Quietly force this animal */ char kbuf[BUFSZ]; You("touch %s.", mon_nam(mtmp)); - Sprintf(kbuf, "attempting to ride %s", an(mtmp->data->mname)); + Sprintf(kbuf, "attempting to ride %s", + an(pmname(mtmp->data, Mgender(mtmp)))); instapetrify(kbuf); } if (!mtmp->mtame || mtmp->isminion) { @@ -535,9 +537,9 @@ int reason; /* Player was thrown off etc. */ You("can't. There isn't anywhere for you to stand."); return; } - if (!has_mname(mtmp)) { + if (!has_mgivenname(mtmp)) { pline("You've been through the dungeon on %s with no name.", - an(mtmp->data->mname)); + an(pmname(mtmp->data, Mgender(mtmp)))); if (Hallucination) pline("It felt good to get out of the rain."); } else diff --git a/src/teleport.c b/src/teleport.c index 7af0b7b15..88bd395f7 100644 --- a/src/teleport.c +++ b/src/teleport.c @@ -225,7 +225,8 @@ long entflags; if (allow_xx_yy && goodpos(xx, yy, &fakemon, entflags)) { return TRUE; /* 'cc' is set */ } else { - debugpline3("enexto(\"%s\",%d,%d) failed", mdat->mname, xx, yy); + debugpline3("enexto(\"%s\",%d,%d) failed", + mdat->pmnames[NEUTRAL], xx, yy); return FALSE; } } diff --git a/src/timeout.c b/src/timeout.c index 66e56d295..9f57fbf51 100644 --- a/src/timeout.c +++ b/src/timeout.c @@ -602,7 +602,8 @@ nh_timeout() } dealloc_killer(kptr); - if ((m_idx = name_to_mon(g.killer.name)) >= LOW_PM) { + if ((m_idx = name_to_mon(g.killer.name, + (int *) 0)) >= LOW_PM) { if (type_is_pname(&mons[m_idx])) { g.killer.format = KILLED_BY; } else if (mons[m_idx].geno & G_UNIQ) { @@ -706,7 +707,7 @@ nh_timeout() g.context.warntype.speciesidx = NON_PM; if (g.context.warntype.species) { You("are no longer warned about %s.", - makeplural(g.context.warntype.species->mname)); + makeplural(g.context.warntype.species->pmnames[NEUTRAL])); g.context.warntype.species = (struct permonst *) 0; } } @@ -1075,15 +1076,15 @@ slip_or_trip() if (!uarmf && otmp->otyp == CORPSE && touch_petrifies(&mons[otmp->corpsenm]) && !Stone_resistance) { Sprintf(g.killer.name, "tripping over %s corpse", - an(mons[otmp->corpsenm].mname)); + an(mons[otmp->corpsenm].pmnames[NEUTRAL])); instapetrify(g.killer.name); } } else if (rn2(3) && is_ice(u.ux, u.uy)) { pline("%s %s%s on the ice.", u.usteed ? upstart(x_monnam(u.usteed, - (has_mname(u.usteed)) ? ARTICLE_NONE - : ARTICLE_THE, - (char *) 0, SUPPRESS_SADDLE, FALSE)) + (has_mgivenname(u.usteed)) ? ARTICLE_NONE + : ARTICLE_THE, + (char *) 0, SUPPRESS_SADDLE, FALSE)) : "You", rn2(2) ? "slip" : "slide", on_foot ? "" : "s"); } else { diff --git a/src/trap.c b/src/trap.c index 60bd409f8..6b20f2596 100644 --- a/src/trap.c +++ b/src/trap.c @@ -2427,7 +2427,7 @@ unsigned trflags; u.usteed->mtrapseen |= (1 << (ttype - 1)); /* suppress article in various steed messages when using its name (which won't occur when hallucinating) */ - if (has_mname(u.usteed) && !Hallucination) + if (has_mgivenname(u.usteed) && !Hallucination) steed_article = ARTICLE_NONE; } @@ -3133,8 +3133,10 @@ const char *arg; if (uwep && uwep->otyp == CORPSE && touch_petrifies(&mons[uwep->corpsenm]) && !Stone_resistance) { - pline("%s touch the %s corpse.", arg, mons[uwep->corpsenm].mname); - Sprintf(kbuf, "%s corpse", an(mons[uwep->corpsenm].mname)); + pline("%s touch the %s corpse.", arg, + mons[uwep->corpsenm].pmnames[NEUTRAL]); + Sprintf(kbuf, "%s corpse", + an(mons[uwep->corpsenm].pmnames[NEUTRAL])); instapetrify(kbuf); /* life-saved; unwield the corpse if we can't handle it */ if (!uarmg && !Stone_resistance) @@ -3144,8 +3146,10 @@ const char *arg; allow two-weapon combat when either weapon is a corpse] */ if (u.twoweap && uswapwep && uswapwep->otyp == CORPSE && touch_petrifies(&mons[uswapwep->corpsenm]) && !Stone_resistance) { - pline("%s touch the %s corpse.", arg, mons[uswapwep->corpsenm].mname); - Sprintf(kbuf, "%s corpse", an(mons[uswapwep->corpsenm].mname)); + pline("%s touch the %s corpse.", arg, + mons[uswapwep->corpsenm].pmnames[NEUTRAL]); + Sprintf(kbuf, "%s corpse", + an(mons[uswapwep->corpsenm].pmnames[NEUTRAL])); instapetrify(kbuf); /* life-saved; unwield the corpse */ if (!uarmg && !Stone_resistance) @@ -4672,7 +4676,8 @@ struct trap *ttmp; /* is it a cockatrice?... */ if (touch_petrifies(mtmp->data) && !uarmg && !Stone_resistance) { - You("grab the trapped %s using your bare %s.", mtmp->data->mname, + You("grab the trapped %s using your bare %s.", + pmname(mtmp->data, Mgender(mtmp)), makeplural(body_part(HAND))); if (poly_when_stoned(g.youmonst.data) && polymon(PM_STONE_GOLEM)) { @@ -4681,7 +4686,7 @@ struct trap *ttmp; char kbuf[BUFSZ]; Sprintf(kbuf, "trying to help %s out of a pit", - an(mtmp->data->mname)); + an(pmname(mtmp->data, Mgender(mtmp)))); instapetrify(kbuf); return 1; } diff --git a/src/u_init.c b/src/u_init.c index 81927ed9f..99be2a44d 100644 --- a/src/u_init.c +++ b/src/u_init.c @@ -688,7 +688,7 @@ u_init() knows_class(ARMOR_CLASS); skill_init(Skill_B); break; - case PM_CAVEMAN: + case PM_CAVE_DWELLER: Cave_man[C_AMMO].trquan = rn1(11, 10); /* 10..20 */ ini_inv(Cave_man); skill_init(Skill_C); @@ -724,7 +724,7 @@ u_init() skill_init(Skill_Mon); break; } - case PM_PRIEST: + case PM_CLERIC: ini_inv(Priest); if (!rn2(10)) ini_inv(Magicmarker); @@ -811,7 +811,7 @@ u_init() * Non-warriors get an instrument. We use a kludge to * get only non-magic instruments. */ - if (Role_if(PM_PRIEST) || Role_if(PM_WIZARD)) { + if (Role_if(PM_CLERIC) || Role_if(PM_WIZARD)) { static int trotyp[] = { WOODEN_FLUTE, TOOLED_HORN, WOODEN_HARP, BELL, BUGLE, LEATHER_DRUM }; Instrument[0].trotyp = trotyp[rn2(SIZE(trotyp))]; @@ -921,7 +921,7 @@ int otyp; case PM_BARBARIAN: skills = Skill_B; break; - case PM_CAVEMAN: + case PM_CAVE_DWELLER: skills = Skill_C; break; case PM_HEALER: @@ -933,7 +933,7 @@ int otyp; case PM_MONK: skills = Skill_Mon; break; - case PM_PRIEST: + case PM_CLERIC: skills = Skill_P; break; case PM_RANGER: diff --git a/src/uhitm.c b/src/uhitm.c index 5855962da..34896bdd0 100644 --- a/src/uhitm.c +++ b/src/uhitm.c @@ -958,7 +958,7 @@ int dieroll; pline("Splat! You hit %s with %s %s egg%s!", mon_nam(mon), obj->known ? "the" : cnt > 1L ? "some" : "a", - obj->known ? mons[obj->corpsenm].mname + obj->known ? mons[obj->corpsenm].pmnames[NEUTRAL] : "petrifying", plur(cnt)); obj->known = 1; /* (not much point...) */ @@ -971,8 +971,8 @@ int dieroll; } else { /* ordinary egg(s) */ const char *eggp = (obj->corpsenm != NON_PM && obj->known) - ? the(mons[obj->corpsenm].mname) - : (cnt > 1L) ? "some" : "an"; + ? the(mons[obj->corpsenm].pmnames[NEUTRAL]) + : (cnt > 1L) ? "some" : "an"; You("hit %s with %s egg%s.", mon_nam(mon), eggp, plur(cnt)); @@ -2593,7 +2593,7 @@ struct mhitm_data *mhm; if (uncancelled && !rn2(8)) { Sprintf(buf, "%s %s", s_suffix(Monnam(magr)), mpoisons_subj(magr, mattk)); - poisoned(buf, ptmp, pa->mname, 30, FALSE); + poisoned(buf, ptmp, pmname(pa, Mgender(magr)), 30, FALSE); } } else { /* mhitm */ @@ -2814,7 +2814,7 @@ struct mhitm_data *mhm; g.killer.format = KILLED_BY_AN; Sprintf(g.killer.name, "%s by %s", moat ? "moat" : "pool of water", - an(magr->data->mname)); + an(pmname(magr->data, Mgender(magr)))); done(DROWNING); } else if (mattk->aatyp == AT_HUGS) { You("are being crushed."); @@ -2992,7 +2992,8 @@ struct mhitm_data *mhm; } else if (!Slimed) { You("don't feel very well."); make_slimed(10L, (char *) 0); - delayed_killer(SLIMED, KILLED_BY_AN, magr->data->mname); + delayed_killer(SLIMED, KILLED_BY_AN, + pmname(magr->data, Mgender(magr))); } else pline("Yuck!"); } else { @@ -3326,7 +3327,7 @@ struct monst *mtmp; && !(poly_when_stoned(g.youmonst.data) && polymon(PM_STONE_GOLEM))) { int kformat = KILLED_BY_AN; - const char *kname = mtmp->data->mname; + const char *kname = pmname(mtmp->data, Mgender(mtmp)); if (mtmp->data->geno & G_UNIQ) { if (!type_is_pname(mtmp->data)) @@ -3446,7 +3447,7 @@ struct mhitm_data *mhm; && touch_petrifies(&mons[otmp->corpsenm])) { mhm->damage = 1; pline("%s hits you with the %s corpse.", Monnam(magr), - mons[otmp->corpsenm].mname); + mons[otmp->corpsenm].pmnames[NEUTRAL]); if (!Stoned) { if (do_stone_u(magr)) { mhm->hitflags = MM_HIT; @@ -4200,8 +4201,7 @@ int specialdmg; /* blessed and/or silver bonus against various things */ negated = !(rn2(10) >= 3 * armpro); if (is_demon(g.youmonst.data) && !rn2(13) && !uwep - && u.umonnum != PM_SUCCUBUS && u.umonnum != PM_INCUBUS - && u.umonnum != PM_BALROG) { + && u.umonnum != PM_AMOROUS_DEMON && u.umonnum != PM_BALROG) { demonpet(); return MM_MISS; } @@ -4358,12 +4358,12 @@ register struct attack *mattk; if (fatal_gulp && !is_rider(pd)) { /* petrification */ char kbuf[BUFSZ]; - const char *mname = pd->mname; + const char *mnam = pmname(pd, Mgender(mdef)); if (!type_is_pname(pd)) - mname = an(mname); + mnam = an(mnam); You("englut %s.", mon_nam(mdef)); - Sprintf(kbuf, "swallowing %s whole", mname); + Sprintf(kbuf, "swallowing %s whole", mnam); instapetrify(kbuf); } else { start_engulf(mdef); @@ -4374,7 +4374,7 @@ register struct attack *mattk; pline("Unfortunately, digesting any of it is fatal."); end_engulf(); Sprintf(g.killer.name, "unwisely tried to eat %s", - pd->mname); + pmname(pd, Mgender(mdef))); g.killer.format = NO_KILLER_PREFIX; done(DIED); return MM_MISS; /* lifesaved */ @@ -4425,7 +4425,7 @@ register struct attack *mattk; pline1(msgbuf); if (pd == &mons[PM_GREEN_SLIME]) { Sprintf(msgbuf, "%s isn't sitting well with you.", - The(pd->mname)); + The(pmname(pd, Mgender(mdef)))); if (!Unchanging) { make_slimed(5L, (char *) 0); } diff --git a/src/vault.c b/src/vault.c index c59ffd433..8fb059a9e 100644 --- a/src/vault.c +++ b/src/vault.c @@ -397,7 +397,7 @@ invault() gsensed = !canspotmon(guard); if (!gsensed) pline("Suddenly one of the Vault's %s enters!", - makeplural(guard->data->mname)); + makeplural(pmname(guard->data, Mgender(guard)))); else pline("Someone else has entered the Vault."); newsym(guard->mx, guard->my); @@ -1091,7 +1091,8 @@ boolean silently; gx = g.rooms[EGD(grd)->vroom].lx + rn2(2); gy = g.rooms[EGD(grd)->vroom].ly + rn2(2); Sprintf(buf, "To Croesus: here's the gold recovered from %s the %s.", - g.plname, mons[u.umonster].mname); + g.plname, + pmname(&mons[u.umonster], flags.female ? FEMALE : MALE)); make_grave(gx, gy, buf); } for (coins = g.invent; coins; coins = nextcoins) { diff --git a/src/weapon.c b/src/weapon.c index 7abfcdbad..0ccefdf8c 100644 --- a/src/weapon.c +++ b/src/weapon.c @@ -1672,7 +1672,7 @@ const struct def_skill *class_skill; /* set skills for magic */ if (Role_if(PM_HEALER) || Role_if(PM_MONK)) { P_SKILL(P_HEALING_SPELL) = P_BASIC; - } else if (Role_if(PM_PRIEST)) { + } else if (Role_if(PM_CLERIC)) { P_SKILL(P_CLERIC_SPELL) = P_BASIC; } else if (Role_if(PM_WIZARD)) { P_SKILL(P_ATTACK_SPELL) = P_BASIC; diff --git a/src/were.c b/src/were.c index c441ad6d1..e0e208151 100644 --- a/src/were.c +++ b/src/were.c @@ -99,13 +99,15 @@ register struct monst *mon; pm = counter_were(monsndx(mon->data)); if (pm < LOW_PM) { - impossible("unknown lycanthrope %s.", mon->data->mname); + impossible("unknown lycanthrope %s.", + mon->data->pmnames[NEUTRAL]); return; } if (canseemon(mon) && !Hallucination) pline("%s changes into a %s.", Monnam(mon), - is_human(&mons[pm]) ? "human" : mons[pm].mname + 4); + is_human(&mons[pm]) ? "human" + : pmname(&mons[pm], Mgender(mon)) + 4); set_mon_data(mon, &mons[pm]); if (mon->msleeping || !mon->mcanmove) { @@ -183,7 +185,7 @@ you_were() if (controllable_poly) { /* `+4' => skip "were" prefix to get name of beast */ Sprintf(qbuf, "Do you want to change into %s?", - an(mons[u.ulycn].mname + 4)); + an(mons[u.ulycn].pmnames[NEUTRAL] + 4)); if (!paranoid_query(ParanoidWerechange, qbuf)) return; } diff --git a/src/windows.c b/src/windows.c index f3af21f49..1b95009cf 100644 --- a/src/windows.c +++ b/src/windows.c @@ -520,7 +520,7 @@ static void FDECL(hup_add_menu, (winid, int, const anything *, CHAR_P, CHAR_P, int, const char *, unsigned int)); static void FDECL(hup_end_menu, (winid, const char *)); static void FDECL(hup_putstr, (winid, int, const char *)); -static void FDECL(hup_print_glyph, (winid, XCHAR_P, XCHAR_P, int, int)); +static void FDECL(hup_print_glyph, (winid, XCHAR_P, XCHAR_P, int, int, unsigned *)); static void FDECL(hup_outrip, (winid, int, time_t)); static void FDECL(hup_curs, (winid, int, int)); static void FDECL(hup_display_nhwindow, (winid, BOOLEAN_P)); @@ -736,11 +736,12 @@ const char *text UNUSED; /*ARGSUSED*/ static void -hup_print_glyph(window, x, y, glyph, bkglyph) +hup_print_glyph(window, x, y, glyph, bkglyph, glyphmod) winid window UNUSED; xchar x UNUSED, y UNUSED; int glyph UNUSED; int bkglyph UNUSED; +unsigned *glyphmod UNUSED; { return; } diff --git a/src/wizard.c b/src/wizard.c index 0c6462888..a4e9d07f1 100644 --- a/src/wizard.c +++ b/src/wizard.c @@ -35,10 +35,10 @@ static NEARDATA const int nasties[] = { PM_IRON_GOLEM, PM_OCHRE_JELLY, PM_GREEN_SLIME, PM_DISPLACER_BEAST, PM_GENETIC_ENGINEER, /* chaotic */ - PM_BLACK_DRAGON, PM_RED_DRAGON, PM_ARCH_LICH, PM_VAMPIRE_LORD, + PM_BLACK_DRAGON, PM_RED_DRAGON, PM_ARCH_LICH, PM_VAMPIRE_LEADER, PM_MASTER_MIND_FLAYER, PM_DISENCHANTER, PM_WINGED_GARGOYLE, - PM_STORM_GIANT, PM_OLOG_HAI, PM_ELF_LORD, PM_ELVENKING, - PM_OGRE_KING, PM_CAPTAIN, PM_GREMLIN, + PM_STORM_GIANT, PM_OLOG_HAI, PM_ELF_NOBLE, PM_ELVENMONARCH, + PM_OGRE_TYRANT, PM_CAPTAIN, PM_GREMLIN, /* lawful */ PM_SILVER_DRAGON, PM_ORANGE_DRAGON, PM_GREEN_DRAGON, PM_YELLOW_DRAGON, PM_GUARDIAN_NAGA, PM_FIRE_GIANT, @@ -543,11 +543,11 @@ int difcap; /* if non-zero, try to make difficulty be lower than this */ || (mons[res].geno & (Inhell ? G_NOHELL : G_HELL)) != 0) alt = big_to_little(res); if (alt != res && (g.mvitals[alt].mvflags & G_GENOD) == 0) { - const char *mname = mons[alt].mname, - *lastspace = rindex(mname, ' '); + const char *mnam = mons[alt].pmnames[NEUTRAL], + *lastspace = rindex(mnam, ' '); /* only non-juveniles can become alternate choice */ - if (strncmp(mname, "baby ", 5) + if (strncmp(mnam, "baby ", 5) && (!lastspace || (strcmp(lastspace, " hatchling") && strcmp(lastspace, " pup") diff --git a/src/worn.c b/src/worn.c index 82abcf26c..7da309a02 100644 --- a/src/worn.c +++ b/src/worn.c @@ -1019,7 +1019,8 @@ boolean polyspot; char buf[BUFSZ]; You("touch %s.", mon_nam(u.usteed)); - Sprintf(buf, "falling off %s", an(u.usteed->data->mname)); + Sprintf(buf, "falling off %s", + an(pmname(u.usteed->data, Mgender(u.usteed)))); instapetrify(buf); } dismount_steed(DISMOUNT_FELL); diff --git a/src/zap.c b/src/zap.c index 0b4f7f4bd..04ebb8181 100644 --- a/src/zap.c +++ b/src/zap.c @@ -1022,7 +1022,7 @@ struct monst *mon; pline("%s%s suddenly %s%s%s!", owner, corpse, nonliving(mtmp2->data) ? "reanimates" : "comes alive", different_type ? " as " : "", - different_type ? an(mtmp2->data->mname) : ""); + different_type ? an(pmname(mtmp2->data, Mgender(mtmp2))) : ""); else if (canseemon(mtmp2)) pline("%s suddenly appears!", Amonnam(mtmp2)); } diff --git a/sys/msdos/vidvesa.c b/sys/msdos/vidvesa.c index 747dd0ac0..125cf712d 100644 --- a/sys/msdos/vidvesa.c +++ b/sys/msdos/vidvesa.c @@ -700,6 +700,7 @@ unsigned special; /* special feature: corpse, invis, detected, pet, ridden - int col, row; int attr; int ry; + int tilenum = 0; row = currow; col = curcol; @@ -721,7 +722,10 @@ unsigned special; /* special feature: corpse, invis, detected, pet, ridden - if (!iflags.over_view && map[ry][col].special) decal_packed(packcell, special); #endif - vesa_DisplayCell(glyph2tile[glyphnum], col - clipx, ry - clipy); + tilenum = glyph2tile[glyphnum]; + if (map[ry][col].special & MG_FEMALE) + tilenum++; + vesa_DisplayCell(tilenum, col - clipx, ry - clipy); } } if (col < (CO - 1)) diff --git a/sys/msdos/vidvga.c b/sys/msdos/vidvga.c index badff0432..621cf1d9a 100644 --- a/sys/msdos/vidvga.c +++ b/sys/msdos/vidvga.c @@ -688,6 +688,7 @@ unsigned char (*indexes)[TILE_X]; { const struct TileImage *tile; unsigned x, y; + int row, col, ry, tilenum = 0; /* We don't have enough colors to show the statues */ if (glyph >= GLYPH_STATUE_OFF) { @@ -695,7 +696,16 @@ unsigned char (*indexes)[TILE_X]; } /* Get the tile from the image */ - tile = get_tile(glyph2tile[glyph]); + tilenum = glyph2tile[glyph]; + row = currow; + col = curcol; + if ((col < 0 || col >= COLNO) + || (row < TOP_MAP_ROW || row >= (ROWNO + TOP_MAP_ROW))) + return; + ry = row - TOP_MAP_ROW; + if (map[ry][col].special & MG_FEMALE) + tilenum++; + tile = get_tile(tilenum); /* Map to a 16 bit palette; assume colors laid out as in default tileset */ memset(indexes, 0, sizeof(indexes)); diff --git a/util/makedefs.c b/util/makedefs.c index 3d81f4ab8..65d7f4878 100644 --- a/util/makedefs.c +++ b/util/makedefs.c @@ -1888,14 +1888,14 @@ struct permonst *ptr; if ((tmp2 == AD_DRLI) || (tmp2 == AD_STON) || (tmp2 == AD_DRST) || (tmp2 == AD_DRDX) || (tmp2 == AD_DRCO) || (tmp2 == AD_WERE)) n += 2; - else if (strcmp(ptr->mname, "grid bug")) + else if (strcmp(ptr->pmnames[NEUTRAL], "grid bug")) n += (tmp2 != AD_PHYS); n += ((int) (ptr->mattk[i].damd * ptr->mattk[i].damn) > 23); } /* Leprechauns are special cases. They have many hit dice so they can hit and are hard to kill, but they don't really do much damage. */ - if (!strcmp(ptr->mname, "leprechaun")) + if (!strcmp(ptr->pmnames[NEUTRAL], "leprechaun")) n -= 2; /* Finally, adjust the monster level 0 <= n <= 24 (approx.) */ @@ -1973,7 +1973,7 @@ do_monstr() Fprintf(ofp, "\n\n/*\n * default mons[].difficulty values\n *\n"); for (ptr = &mons[0]; ptr->mlet; ptr++) { i = mstrength(ptr); - Fprintf(ofp, "%-24s %2u\n", ptr->mname, (unsigned int) (uchar) i); + Fprintf(ofp, "%-24s %2u\n", ptr->pmnames[NEUTRAL], (unsigned int) (uchar) i); } Fprintf(ofp, " *\n */\n\n"); @@ -2021,9 +2021,9 @@ do_permonst() Fprintf(ofp, "\n PM_"); else Fprintf(ofp, "\n#define\tPM_"); - if (mons[i].mlet == S_HUMAN && !strncmp(mons[i].mname, "were", 4)) + if (mons[i].mlet == S_HUMAN && !strncmp(mons[i].pmnames[NEUTRAL], "were", 4)) Fprintf(ofp, "HUMAN_"); - for (nam = c = tmpdup(mons[i].mname); *c; c++) + for (nam = c = tmpdup(mons[i].pmnames[NEUTRAL]); *c; c++) if (*c >= 'a' && *c <= 'z') *c -= (char) ('a' - 'A'); else if (*c < 'A' || *c > 'Z') diff --git a/win/Qt/qt_bind.cpp b/win/Qt/qt_bind.cpp index 7f4926df5..ba4c21567 100644 --- a/win/Qt/qt_bind.cpp +++ b/win/Qt/qt_bind.cpp @@ -474,11 +474,12 @@ void NetHackQtBind::qt_cliparound_window(winid wid, int x, int y) NetHackQtWindow* window=id_to_window[(int)wid]; window->ClipAround(x,y); } -void NetHackQtBind::qt_print_glyph(winid wid,XCHAR_P x,XCHAR_P y,int glyph,int bkglyph UNUSED) +void NetHackQtBind::qt_print_glyph(winid wid,XCHAR_P x,XCHAR_P y,int glyph, + int bkglyph UNUSED, unsigned *glyphmod) { /* TODO: bkglyph */ NetHackQtWindow* window=id_to_window[(int)wid]; - window->PrintGlyph(x,y,glyph); + window->PrintGlyph(x,y,glyph,glyphmod); } //void NetHackQtBind::qt_print_glyph_compose(winid wid,xchar x,xchar y,int glyph1, int glyph2) //{ diff --git a/win/Qt/qt_bind.h b/win/Qt/qt_bind.h index bc3f2d647..73f4d4fa8 100644 --- a/win/Qt/qt_bind.h +++ b/win/Qt/qt_bind.h @@ -64,7 +64,7 @@ public: static void qt_cliparound(int x, int y); static void qt_cliparound_window(winid wid, int x, int y); static void qt_print_glyph(winid wid, XCHAR_P x, XCHAR_P y, - int glyph, int bkglyph); + int glyph, int bkglyph, unsigned int *); static void qt_raw_print(const char *str); static void qt_raw_print_bold(const char *str); static int qt_nhgetch(); diff --git a/win/Qt/qt_glyph.cpp b/win/Qt/qt_glyph.cpp index bed3bd5a3..f807282f3 100644 --- a/win/Qt/qt_glyph.cpp +++ b/win/Qt/qt_glyph.cpp @@ -82,30 +82,32 @@ NetHackQtGlyphs::NetHackQtGlyphs() } void NetHackQtGlyphs::drawGlyph(QPainter& painter, int glyph, int x, int y, - bool reversed) + bool fem, bool reversed) { if (!reversed) { int tile = glyph2tile[glyph]; + if (fem) + ++tile; int px = (tile % tiles_per_row) * width(); int py = tile / tiles_per_row * height(); painter.drawPixmap(x, y, pm, px, py, width(), height()); } else { // for paper doll; mirrored image for left side of two-handed weapon - painter.drawPixmap(x, y, reversed_pixmap(glyph), + painter.drawPixmap(x, y, reversed_pixmap(glyph, fem), 0, 0, width(), height()); } } void NetHackQtGlyphs::drawCell(QPainter& painter, int glyph, - int cellx, int celly) + int cellx, int celly, bool fem) { - drawGlyph(painter, glyph, cellx * width(), celly * height(), false); + drawGlyph(painter, glyph, cellx * width(), celly * height(), fem, false); } void NetHackQtGlyphs::drawBorderedCell(QPainter& painter, int glyph, int cellx, int celly, int border, - bool reversed) + bool reversed, bool fem) { int wd = width(), ht = height(), @@ -113,7 +115,7 @@ void NetHackQtGlyphs::drawBorderedCell(QPainter& painter, int glyph, lox = cellx * (wd + 2), loy = celly * (ht + 2) + yoffset; - drawGlyph(painter, glyph, lox + 1, loy + 1, reversed); + drawGlyph(painter, glyph, lox + 1, loy + 1, fem, reversed); #ifdef TEXTCOLOR if (border != NO_BORDER) { @@ -164,9 +166,11 @@ void NetHackQtGlyphs::drawBorderedCell(QPainter& painter, int glyph, } // mis-named routine to get the pixmap for a particular glyph -QPixmap NetHackQtGlyphs::glyph(int glyphindx) +QPixmap NetHackQtGlyphs::glyph(int glyphindx, bool fem) { int tile = glyph2tile[glyphindx]; + if (fem) + ++tile; int px = (tile % tiles_per_row) * tilefile_tile_W; int py = tile / tiles_per_row * tilefile_tile_H; @@ -175,9 +179,9 @@ QPixmap NetHackQtGlyphs::glyph(int glyphindx) } // transpose a glyph's tile horizontally, scaled for use in paper doll -QPixmap NetHackQtGlyphs::reversed_pixmap(int glyphindx) +QPixmap NetHackQtGlyphs::reversed_pixmap(int glyphindx, bool fem) { - QPixmap pxmp = glyph(glyphindx); + QPixmap pxmp = glyph(glyphindx, fem); #ifdef ENHANCED_PAPERDOLL qreal wid = (qreal) pxmp.width(), //hgt = (qreal) pxmp.height(), diff --git a/win/Qt/qt_glyph.h b/win/Qt/qt_glyph.h index 39b0e3914..afc2b92ca 100644 --- a/win/Qt/qt_glyph.h +++ b/win/Qt/qt_glyph.h @@ -24,13 +24,13 @@ public: void setSize(int w, int h); void drawGlyph(QPainter &, int glyph, int pixelx, int pixely, - bool reversed = false); - void drawCell(QPainter &, int glyph, int cellx, int celly); + bool fem, bool reversed = false); + void drawCell(QPainter &, int glyph, int cellx, int celly, bool fem); void drawBorderedCell(QPainter &, int glyph, int cellx, int celly, int bordercode, - bool reversed); - QPixmap glyph(int glyphindx); - QPixmap reversed_pixmap(int glyphindx); + bool reversed, bool fem = false); + QPixmap glyph(int glyphindx, bool fem = false); + QPixmap reversed_pixmap(int glyphindx, bool fem = false); private: QImage img; diff --git a/win/Qt/qt_map.cpp b/win/Qt/qt_map.cpp index f55e023c8..b3681b155 100644 --- a/win/Qt/qt_map.cpp +++ b/win/Qt/qt_map.cpp @@ -176,14 +176,19 @@ void NetHackQtMapViewport::paintEvent(QPaintEvent* event) for (int j=garea.top(); j<=garea.bottom(); j++) { for (int i=garea.left(); i<=garea.right(); i++) { +#if 0 unsigned short g=Glyph(i,j); int color; int ch; unsigned special; - +#else + int color = Glyphcolor(i,j); + int ch = Glyphttychar(i,j); + unsigned special = Glyphflags(i,j); +#endif painter.setPen( Qt::green ); /* map glyph to character and color */ - mapglyph(g, &ch, &color, &special, i, j, 0); +// mapglyph(g, &ch, &color, &special, i, j, 0); ch = cp437(ch); #ifdef TEXTCOLOR painter.setPen( nhcolor_to_pen(color) ); @@ -220,15 +225,20 @@ void NetHackQtMapViewport::paintEvent(QPaintEvent* event) } painter.setFont(font()); - } else { + } else { // tiles for (int j=garea.top(); j<=garea.bottom(); j++) { for (int i=garea.left(); i<=garea.right(); i++) { unsigned short g=Glyph(i,j); +#if 0 int color; int ch; unsigned special; mapglyph(g, &ch, &color, &special, i, j, 0); - qt_settings->glyphs().drawCell(painter, g, i, j); +#else + unsigned special = Glyphflags(i, j); +#endif + bool femflag = (special & MG_FEMALE) ? true : false; + qt_settings->glyphs().drawCell(painter, g, i, j, femflag); #ifdef TEXTCOLOR if ((special & MG_PET) != 0 && ::iflags.hilite_pet) { painter.drawPixmap(QPoint(i*qt_settings->glyphs().width(), @@ -559,8 +569,14 @@ void NetHackQtMapViewport::Clear() // FIXME: map column 0 should be surpressed from being displayed // Glyph(0, j) = GLYPH_NOTHING; + Glyphttychar(0, j) = ' '; + Glyphcolor(0, j) = NO_COLOR; + Glyphflags(0, j) = 0; for (int i = 1; i < COLNO; ++i) Glyph(i, j) = GLYPH_UNEXPLORED; + Glyphttychar(0, j) = ' '; + Glyphcolor(0, j) = NO_COLOR; + Glyphflags(0, j) = 0; } change.clear(); @@ -594,9 +610,12 @@ void NetHackQtMapViewport::CursorTo(int x,int y) Changed(cursor.x(),cursor.y()); } -void NetHackQtMapViewport::PrintGlyph(int x,int y,int theglyph) +void NetHackQtMapViewport::PrintGlyph(int x,int y,int theglyph,unsigned *glyphmod) { Glyph(x,y)=theglyph; + Glyphttychar(x,y)=glyphmod[GM_TTYCHAR]; + Glyphcolor(x,y)=glyphmod[GM_COLOR]; + Glyphflags(x,y)=glyphmod[GM_FLAGS]; Changed(x,y); } @@ -701,9 +720,9 @@ void NetHackQtMapWindow2::ClipAround(int x,int y) ensureVisible(x,y,width()*0.45,height()*0.45); } -void NetHackQtMapWindow2::PrintGlyph(int x,int y,int glyph) +void NetHackQtMapWindow2::PrintGlyph(int x,int y,int glyph, unsigned *glyphmod) { - m_viewport->PrintGlyph(x, y, glyph); + m_viewport->PrintGlyph(x, y, glyph, glyphmod); } #if 0 //RLC @@ -825,8 +844,15 @@ void NetHackQtMapWindow::Clear() { for (int j = 0; j < ROWNO; ++j) { Glyph(0, j) = GLYPH_NOTHING; - for (int i = 1; i < COLNO; ++i) + Glyphcolor(0, j) = NO_COLOR; + Glyphttychar(0, j) = ' '; + Glyphflags(0, j) = 0; + for (int i = 1; i < COLNO; ++i) { Glyph(i, j) = GLYPH_UNEXPLORED; + Glyphcolor(i, j) = NO_COLOR; + Glyphttychar(i, j) = ' '; + Glyphflags(i, j) = 0; + } } change.clear(); @@ -897,13 +923,18 @@ void NetHackQtMapWindow::paintEvent(QPaintEvent* event) for (int j=garea.top(); j<=garea.bottom(); j++) { for (int i=garea.left(); i<=garea.right(); i++) { unsigned short g=Glyph(i,j); +#if 0 int color; char32_t ch; unsigned special; - +#else + int color = Glyphcolor(i,j); + char32_t ch = Glyphttychar(i,j); + unsigned special = Glyphflags(i,j); +#endif painter.setPen( Qt::green ); /* map glyph to character and color */ - mapglyph(g, &ch, &color, &special, i, j, 0); +// mapglyph(g, &ch, &color, &special, i, j, 0); #ifdef TEXTCOLOR painter.setPen( nhcolor_to_pen(color) ); #endif @@ -935,11 +966,18 @@ void NetHackQtMapWindow::paintEvent(QPaintEvent* event) for (int j=garea.top(); j<=garea.bottom(); j++) { for (int i=garea.left(); i<=garea.right(); i++) { unsigned short g=Glyph(i,j); +#if 0 int color; int ch; unsigned special; mapglyph(g, &ch, &color, &special, i, j, 0); - qt_settings->glyphs().drawCell(painter, g, i, j); +#else + int color = Glyphcolor(i,j); + int ch = Glyphttychar(i,j); + unsigned special = Glyphflags(i,j); +#endif + bool femflag = (special & MG_FEMALE) ? true : false; + qt_settings->glyphs().drawCell(painter, g, i, j, femflag); #ifdef TEXTCOLOR if ((special & MG_PET) != 0 && ::iflags.hilite_pet) { painter.drawPixmap(QPoint(i*qt_settings->glyphs().width(), @@ -1048,9 +1086,12 @@ void NetHackQtMapWindow::ClipAround(int x,int y) viewport.center(x,y,0.45,0.45); } -void NetHackQtMapWindow::PrintGlyph(int x,int y,int glyph) +void NetHackQtMapWindow::PrintGlyph(int x,int y,int glyph, unsigned *glyphmod) { Glyph(x,y)=glyph; + Glyphttychar(x,y)=glyphmod[GM_TTYCHAR]; + Glyphcolor(x,y)=glyphmod[GM_COLOR]; + Glyphflags(x,y)=glyphmod[GM_FLAGS]; Changed(x,y); } diff --git a/win/Qt/qt_map.h b/win/Qt/qt_map.h index bf8afceb4..6200e0412 100644 --- a/win/Qt/qt_map.h +++ b/win/Qt/qt_map.h @@ -32,6 +32,12 @@ private: QFont *rogue_font; unsigned short glyph[ROWNO][COLNO]; unsigned short& Glyph(int x, int y) { return glyph[y][x]; } + unsigned int glyphttychar[ROWNO][COLNO]; + unsigned int& Glyphttychar(int x, int y) { return glyphttychar[y][x]; } + unsigned int glyphcolor[ROWNO][COLNO]; + unsigned int& Glyphcolor(int x, int y) { return glyphcolor[y][x]; } + unsigned int glyphflags[ROWNO][COLNO]; + unsigned int& Glyphflags(int x, int y) { return glyphflags[y][x]; } QPoint cursor; QPixmap pet_annotation; QPixmap pile_annotation; @@ -42,7 +48,7 @@ private: void Clear(); void Display(bool block); void CursorTo(int x,int y); - void PrintGlyph(int x,int y,int glyph); + void PrintGlyph(int x,int y,int glyph,unsigned *glyphmod); void Changed(int x, int y); void updateTiles(); @@ -64,7 +70,7 @@ public: virtual void CursorTo(int x,int y); virtual void PutStr(int attr, const QString& text); virtual void ClipAround(int x,int y); - virtual void PrintGlyph(int x,int y,int glyph); + virtual void PrintGlyph(int x,int y,int glyph,unsigned *glyphmod); signals: void resized(); diff --git a/win/Qt/qt_plsel.cpp b/win/Qt/qt_plsel.cpp index bbc3132fa..e20735b56 100644 --- a/win/Qt/qt_plsel.cpp +++ b/win/Qt/qt_plsel.cpp @@ -82,14 +82,14 @@ public: { } - void setGlyph(int g) + void setGlyph(int g, bool fem) { NetHackQtGlyphs& glyphs = qt_settings->glyphs(); int gw = glyphs.width(); int gh = glyphs.height(); QPixmap pm(gw,gh); QPainter p(&pm); - glyphs.drawGlyph(p, g, 0, 0); + glyphs.drawGlyph(p, g, 0, 0, fem); p.end(); setIcon(QIcon(pm)); //RLC setHeight(std::max(pm.height()+1,height())); @@ -124,7 +124,7 @@ public: #endif ) { - setGlyph(monnum_to_glyph(roles[id].malenum)); + setGlyph(monnum_to_glyph(roles[id].malenum), false); } }; @@ -139,7 +139,7 @@ public: #endif ) { - setGlyph(monnum_to_glyph(races[id].malenum)); + setGlyph(monnum_to_glyph(races[id].malenum), false); } }; @@ -257,6 +257,7 @@ NetHackQtPlayerSelector::NetHackQtPlayerSelector(NetHackQtKeyBuffer& ks UNUSED) chosen_gend = flags.initgend; chosen_align = flags.initalign; + bool fem = (chosen_gend > ROLE_NONE); // XXX QListView unsorted goes in rev. for (nrole=0; roles[nrole].name.m; nrole++) @@ -264,8 +265,8 @@ NetHackQtPlayerSelector::NetHackQtPlayerSelector(NetHackQtKeyBuffer& ks UNUSED) role->setRowCount(nrole); for (i=0; roles[i].name.m; i++) { QTableWidgetItem *item = new QTableWidgetItem( - QIcon(qt_settings->glyphs().glyph(roles[i].malenum)), - roles[i].name.m); + QIcon(qt_settings->glyphs().glyph(roles[i].malenum, fem)), + roles[i].name.m); item->setFlags(Qt::ItemIsEnabled|Qt::ItemIsSelectable); role->setItem(i, 0, item); } @@ -280,7 +281,7 @@ NetHackQtPlayerSelector::NetHackQtPlayerSelector(NetHackQtKeyBuffer& ks UNUSED) race->setRowCount(nrace); for (i=0; races[i].noun; i++) { QTableWidgetItem *item = new QTableWidgetItem( - QIcon(qt_settings->glyphs().glyph(races[i].malenum)), + QIcon(qt_settings->glyphs().glyph(races[i].malenum, fem)), races[i].noun); item->setFlags(Qt::ItemIsEnabled|Qt::ItemIsSelectable); race->setItem(i, 0, item); @@ -290,9 +291,13 @@ NetHackQtPlayerSelector::NetHackQtPlayerSelector(NetHackQtKeyBuffer& ks UNUSED) race->setHorizontalHeaderLabels(QStringList("Race")); race->resizeColumnToContents(0); - // TODO: render the alignment and gender labels smaller to match the - // horizontal header labels for role and race; getting the font from - // race table above and setting it for labels below made no difference + // TODO: + // Render the alignment and gender labels smaller to match the + // horizontal header labels for role and race; getting the font from + // race table above and setting it for labels below made no difference. + // + // Maybe, if the order of choosing becomes more dynamic: + // Replace the role and race glyphs when gender gets set. QLabel *gendlabel = new QLabel("Gender"); genderbox->layout()->addWidget(gendlabel); diff --git a/win/Qt/qt_stat.cpp b/win/Qt/qt_stat.cpp index 88a6cfa8c..3fca92c89 100644 --- a/win/Qt/qt_stat.cpp +++ b/win/Qt/qt_stat.cpp @@ -788,7 +788,8 @@ void NetHackQtStatusWindow::updateStats() if (u.usteed) ++k, ride.show(); else ride.hide(); if (Upolyd) { - buf = nh_capitalize_words(mons[u.umonnum].mname); + buf = nh_capitalize_words(pmname(&mons[u.umonnum], + ::flags.female ? FEMALE : MALE)); } else { buf = rank_of(u.ulevel, g.pl_character[0], ::flags.female); } diff --git a/win/Qt/qt_win.cpp b/win/Qt/qt_win.cpp index 3fd51edf9..670ae8da8 100644 --- a/win/Qt/qt_win.cpp +++ b/win/Qt/qt_win.cpp @@ -109,7 +109,7 @@ void NetHackQtWindow::EndMenu(const QString& prompt UNUSED) { puts("unexpected E int NetHackQtWindow::SelectMenu(int how UNUSED, MENU_ITEM_P **menu_list UNUSED) { puts("unexpected SelectMenu"); return 0; } void NetHackQtWindow::ClipAround(int x UNUSED,int y UNUSED) { puts("unexpected ClipAround"); } -void NetHackQtWindow::PrintGlyph(int x UNUSED,int y UNUSED,int glyph UNUSED) { puts("unexpected PrintGlyph"); } +void NetHackQtWindow::PrintGlyph(int x UNUSED,int y UNUSED,int glyph UNUSED, unsigned *glyphmod UNUSED) { puts("unexpected PrintGlyph"); } //void NetHackQtWindow::PrintGlyphCompose(int x,int y,int,int) { puts("unexpected PrintGlyphCompose"); } void NetHackQtWindow::UseRIP(int how UNUSED, time_t when UNUSED) { puts("unexpected UseRIP"); } diff --git a/win/Qt/qt_win.h b/win/Qt/qt_win.h index daa6e0d1d..681b06be1 100644 --- a/win/Qt/qt_win.h +++ b/win/Qt/qt_win.h @@ -40,7 +40,7 @@ public: virtual void EndMenu(const QString& prompt); virtual int SelectMenu(int how, MENU_ITEM_P **menu_list); virtual void ClipAround(int x, int y); - virtual void PrintGlyph(int x, int y, int glyph); + virtual void PrintGlyph(int x, int y, int glyph, unsigned *glyphmod); virtual void UseRIP(int how, time_t when); int nhid; diff --git a/win/X11/winmap.c b/win/X11/winmap.c index 6e2d2aa7c..19cbe0400 100644 --- a/win/X11/winmap.c +++ b/win/X11/winmap.c @@ -73,11 +73,12 @@ static void FDECL(display_cursor, (struct xwindow *)); /* Global functions ======================================================= */ void -X11_print_glyph(window, x, y, glyph, bkglyph) +X11_print_glyph(window, x, y, glyph, bkglyph, glyphmod) winid window; xchar x, y; int glyph; int bkglyph UNUSED; +unsigned *glyphmod UNUSED; { struct map_info_t *map_info; boolean update_bbox = FALSE; @@ -1295,6 +1296,8 @@ boolean inverted; int dest_x = (cur_col - COL0_OFFSET) * tile_map->square_width; int dest_y = row * tile_map->square_height; + if ((tile_map->glyphs[row][cur_col].special & MG_FEMALE)) + tile++; /* advance to the female tile variation */ src_x = (tile % TILES_PER_ROW) * tile_width; src_y = (tile / TILES_PER_ROW) * tile_height; XCopyArea(dpy, tile_pixmap, XtWindow(wp->w), diff --git a/win/X11/winstat.c b/win/X11/winstat.c index a30ed01e7..cbc0ce078 100644 --- a/win/X11/winstat.c +++ b/win/X11/winstat.c @@ -1453,15 +1453,15 @@ long new_value; buf[0] = highc(buf[0]); Strcat(buf, " the "); if (Upolyd) { - char mname[BUFSZ]; + char mnam[BUFSZ]; int k; - Strcpy(mname, mons[u.umonnum].mname); - for (k = 0; mname[k] != '\0'; k++) { - if (k == 0 || mname[k - 1] == ' ') - mname[k] = highc(mname[k]); + Strcpy(mnam, pmname(&mons[u.umonnum], Ugender)); + for (k = 0; mnam[k] != '\0'; k++) { + if (k == 0 || mnam[k - 1] == ' ') + mnam[k] = highc(mnam[k]); } - Strcat(buf, mname); + Strcat(buf, mnam); } else Strcat(buf, rank_of(u.ulevel, g.pl_character[0], flags.female)); diff --git a/win/chain/wc_chainin.c b/win/chain/wc_chainin.c index b6825632f..fb84ab32a 100644 --- a/win/chain/wc_chainin.c +++ b/win/chain/wc_chainin.c @@ -272,12 +272,13 @@ char *posbar; /* XXX can we decode the glyph in a meaningful way? */ void -chainin_print_glyph(window, x, y, glyph, bkglyph) +chainin_print_glyph(window, x, y, glyph, bkglyph, glyphmod) winid window; xchar x, y; int glyph, bkglyph; +int glyphmod[NUM_GLYPHMOD]; { - (*cibase->nprocs->win_print_glyph)(cibase->ndata, window, x, y, glyph, bkglyph); + (*cibase->nprocs->win_print_glyph)(cibase->ndata, window, x, y, glyph, bkglyph, glyphmod); } void diff --git a/win/chain/wc_chainout.c b/win/chain/wc_chainout.c index a4401a1eb..3ad84aa45 100644 --- a/win/chain/wc_chainout.c +++ b/win/chain/wc_chainout.c @@ -336,15 +336,16 @@ char *posbar; #endif void -chainout_print_glyph(vp, window, x, y, glyph, bkglyph) +chainout_print_glyph(vp, window, x, y, glyph, bkglyph, glyphmod) void *vp; winid window; xchar x, y; int glyph, bkglyph; +int glyphmod[NUM_GLYPHMOD]; { struct chainout_data *tdp = vp; - (*tdp->nprocs->win_print_glyph)(window, x, y, glyph, bkglyph); + (*tdp->nprocs->win_print_glyph)(window, x, y, glyph, bkglyph, glyphmod); } void diff --git a/win/chain/wc_trace.c b/win/chain/wc_trace.c index e2939549e..b6519e443 100644 --- a/win/chain/wc_trace.c +++ b/win/chain/wc_trace.c @@ -578,19 +578,20 @@ char *posbar; /* XXX can we decode the glyph in a meaningful way? see mapglyph()? genl_putmixed? */ void -trace_print_glyph(vp, window, x, y, glyph, bkglyph) +trace_print_glyph(vp, window, x, y, glyph, bkglyph, glyphmod) void *vp; winid window; xchar x, y; int glyph, bkglyph; +int glyphmod[NUM_GLYPHMOD]; { struct trace_data *tdp = vp; - fprintf(wc_tracelogf, "%sprint_glyph(%d, %d, %d, %d, %d)\n", INDENT, window, - x, y, glyph, bkglyph); + fprintf(wc_tracelogf, "%sprint_glyph(%d, %d, %d, %d, %d, %lu)\n", INDENT, window, + x, y, glyph, bkglyph, glyphmod); PRE; - (*tdp->nprocs->win_print_glyph)(tdp->ndata, window, x, y, glyph, bkglyph); + (*tdp->nprocs->win_print_glyph)(tdp->ndata, window, x, y, glyph, bkglyph, glyphmod); POST; } diff --git a/win/curses/cursmain.c b/win/curses/cursmain.c index 4035b3c9f..baceb8901 100644 --- a/win/curses/cursmain.c +++ b/win/curses/cursmain.c @@ -646,17 +646,21 @@ curses_cliparound(int x, int y) } /* -print_glyph(window, x, y, glyph, bkglyph) +print_glyph(window, x, y, glyph, bkglyph, glyphmod) -- Print the glyph at (x,y) on the given window. Glyphs are integers at the interface, mapped to whatever the window- port wants (symbol, font, color, attributes, ...there's a 1-1 map between glyphs and distinct things on the map). bkglyph is to render the background behind the glyph. It's not used here. + -- glyphmod (glyphmod[NUM_GLYPHNOD]) provides extended + information about the glyph that window ports can use to + enhance the display in various ways. + */ void curses_print_glyph(winid wid, XCHAR_P x, XCHAR_P y, int glyph, - int bkglyph UNUSED) + int bkglyph UNUSED, unsigned *glyphmod) { int ch; int color; diff --git a/win/curses/cursstat.c b/win/curses/cursstat.c index 6a3a5d833..63c188886 100644 --- a/win/curses/cursstat.c +++ b/win/curses/cursstat.c @@ -1468,7 +1468,7 @@ get_playerrank(char *rank) if (Upolyd) { int k = 0; - Strcpy(buf, mons[u.umonnum].mname); + Strcpy(buf, pmname(&mons[u.umonnum], flags.female ? FEMALE : MALE)); while(buf[k] != 0) { if ((k == 0 || (k > 0 && buf[k-1] == ' ')) && 'a' <= buf[k] && buf[k] <= 'z') diff --git a/win/share/monsters.txt b/win/share/monsters.txt index 6a69c8de6..e14f4611f 100644 --- a/win/share/monsters.txt +++ b/win/share/monsters.txt @@ -27,7 +27,7 @@ Y = (149, 149, 149) Z = (195, 195, 195) 0 = (100, 100, 100) 1 = (72, 108, 108) -# tile 0 (giant ant) +# tile 0 (giant ant,male) { ................ ................ @@ -46,7 +46,26 @@ Z = (195, 195, 195) ......JA.JA..... ................ } -# tile 1 (killer bee) +# tile 1 (giant ant,female) +{ + ................ + ................ + ................ + ................ + ................ + ................ + ................ + .......JAJKKA... + .....JAAAKJJJA.. + .....AKJJAJJAA.. + ...KKAJJJAAA.... + ..BJJAAAAAJJA... + ..JBJAJAJAA..... + .....AJA.JA..... + ......JA.JA..... + ................ +} +# tile 2 (killer bee,male) { ................ ................ @@ -65,7 +84,26 @@ Z = (195, 195, 195) .....AAAAAA..... ................ } -# tile 2 (soldier ant) +# tile 3 (killer bee,female) +{ + ................ + ................ + .PPP.....PP..... + PPPPP...PBPP.... + PBPPP..PBPPP.... + .PPBP.PPLPLL.... + ...PP.PLLALHAH.. + ...AKKKLAHAAHH.. + BBJJJJJJJAHHAA.. + ABJBBJJJJAHAHH.. + .JJABJAJ.J.HH... + .......J.J...... + ................ + ...AAAAAAAAAAA.. + .....AAAAAA..... + ................ +} +# tile 4 (soldier ant,male) { ................ ................ @@ -84,7 +122,26 @@ Z = (195, 195, 195) ..JJAAJA.JA..... ................ } -# tile 3 (fire ant) +# tile 5 (soldier ant,female) +{ + ................ + ................ + ................ + ................ + ................ + ................ + ................ + .......JAJKKA... + .....JAAAKJJJA.. + .....AKJJAJJAA.. + .JJKKAJJJAAA.... + JBJJJAAAAAJJA... + JJJBJAJAJAA..... + JAAJJAJA.JA..... + ..JJAAJA.JA..... + ................ +} +# tile 6 (fire ant,male) { ................ ................ @@ -103,7 +160,26 @@ Z = (195, 195, 195) ......DA.DA..... ................ } -# tile 4 (giant beetle) +# tile 7 (fire ant,female) +{ + ................ + ................ + ................ + ................ + ................ + ................ + ................ + .......DACCCA... + .....DAAACDDDA.. + .....ACDDADDAA.. + ...CCADDDAAA.... + ..GDDAAAAADDA... + ..DGDADADAA..... + .....ADA.DA..... + ......DA.DA..... + ................ +} +# tile 8 (giant beetle,male) { ................ ................ @@ -122,7 +198,26 @@ Z = (195, 195, 195) ................ ................ } -# tile 5 (queen bee) +# tile 9 (giant beetle,female) +{ + ................ + ................ + ................ + ................ + ................ + ................ + ......KKDKK..... + ....KACLCJJD.... + ...KCLCJJDDDK... + ...DCCJDADDAD... + ...ADJDDDDDDD... + ...BAKDDAADKAA.. + ...ABAKDDK...... + ......AA.AA..... + ................ + ................ +} +# tile 10 (queen bee,male) { ................ .PPP.....PP..... @@ -141,7 +236,26 @@ Z = (195, 195, 195) .....AAAAAA..... ................ } -# tile 6 (acid blob) +# tile 11 (queen bee,female) +{ + ................ + .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 12 (acid blob,male) { ................ ................ @@ -160,7 +274,26 @@ Z = (195, 195, 195) ..IA............ ................ } -# tile 7 (quivering blob) +# tile 13 (acid blob,female) +{ + ................ + ................ + ................ + .....KDDA....... + ...DDKDDKA...... + .DDDIIIDJDA..... + D.IIOOIIDAIA.... + .DKNNNODIDA..IA. + IDJNANOJDDJA.... + ADIDNOIDIDDDA... + ...JDIKIADKIA... + .IA.IDID.JDA.... + ...I.DDA....DA.. + .........IA..... + ..IA............ + ................ +} +# tile 14 (quivering blob,male) { ................ ................ @@ -179,7 +312,26 @@ Z = (195, 195, 195) ................ ................ } -# tile 8 (gelatinous cube) +# tile 15 (quivering blob,female) +{ + ................ + ................ + .....PPPP....... + .........P...... + .P.OOOPPE..AAA.. + P.OPBBBPOEAEAA.. + P.PBNNNP.OEAAEA. + P.PNNNNNPOEEAEA. + POPNAANNEO.OAEA. + .OPNAANNE..OAAA. + .OPBNNNEPP.OEAA. + BPOPEEEBBPO.EEA. + BBBPBBBBBBPPPPA. + ..BBBBBBBBBBPA.. + ................ + ................ +} +# tile 16 (gelatinous cube,male) { ................ ................ @@ -198,7 +350,26 @@ Z = (195, 195, 195) ................ ................ } -# tile 9 (chickatrice) +# tile 17 (gelatinous cube,female) +{ + ................ + ................ + ................ + ................ + ................ + .......LLL...... + .....LLLLLLLL... + ...LLLLLLLLLD... + ...CLLLLLLLDDA.. + ...CGGCLLLDDDAA. + ...CAGCGGDDDDAAA + ...CCCCAGDDDAAAA + .....CCCCDDAAAA. + .......CCDAAA... + ................ + ................ +} +# tile 18 (chickatrice,male) { ................ ................ @@ -217,7 +388,26 @@ Z = (195, 195, 195) ........AA...... ................ } -# tile 10 (cockatrice) +# tile 19 (chickatrice,female) +{ + ................ + ................ + ................ + ................ + .......OO....... + ......HAOO...... + .....HHOOH.HHA.. + ........OOHOA... + ........OOFA.... + ........FGGFA... + ........AGFGAA.. + ...........GA... + .......F..FFA... + .......AFFAA.... + ........AA...... + ................ +} +# tile 20 (cockatrice,male) { ................ ...D.DD......... @@ -236,7 +426,26 @@ Z = (195, 195, 195) .....FFFFA...... ................ } -# tile 11 (pyrolisk) +# tile 21 (cockatrice,female) +{ + ................ + ...D.DD......... + ....DD.......... + ....NL..AA...... + ..HHAN.AAA...... + .HH.NO..AAAA.... + ...AOOLFFFAA.... + ...OOLKGGFFAA... + ...AOAGGFGFFAA.. + .......GFFGFAA.. + .........FGGAA.. + .....FA...FFA... + ....FA....FFA... + ....FA..FFFA.... + .....FFFFA...... + ................ +} +# tile 22 (pyrolisk,male) { ................ ...D.DD......... @@ -255,7 +464,26 @@ Z = (195, 195, 195) .....JKKKA...... ................ } -# tile 12 (jackal) +# tile 23 (pyrolisk,female) +{ + ................ + ...D.DD......... + ....DD.......... + ....NB..AA...... + ..HHAN.AAA...... + .HH.NB..AAAA.... + ...APBBJJJAA.... + ...PPPKDDKJAA... + ...APADDKDKJAA.. + .......DJKDJAA.. + .........JDDAA.. + .....JA...JJA... + ....JA....JJA... + ....KA..KKKA.... + .....JKKKA...... + ................ +} +# tile 24 (jackal,male) { ................ ................ @@ -274,7 +502,26 @@ Z = (195, 195, 195) .....OO..OOA.... ................ } -# tile 13 (fox) +# tile 25 (jackal,female) +{ + ................ + ................ + ................ + ................ + ...O..O......... + ...O.OO...O..... + ..OOOO.....O.... + ..IOIOO....O.A.. + .OLLOOOL...O.A.. + DOOOAOOOOOOOAA.. + ..AAOOOOOOOOAA.. + ....OJOOOOOLAA.. + ....OJOLKALKAA.. + ...OOAOAAAOAA... + .....OO..OOA.... + ................ +} +# tile 26 (fox,male) { ................ ................ @@ -293,7 +540,26 @@ Z = (195, 195, 195) ...AC.ACA....... ................ } -# tile 14 (coyote) +# tile 27 (fox,female) +{ + ................ + ................ + ................ + ................ + ................ + ................ + ................ + ................ + ....C........... + ....C........... + ..CCAC...CCC.... + ..ACCCCCCACCC... + ...AACCCC.ACC... + ....ACAAC..AA... + ...AC.ACA....... + ................ +} +# tile 28 (coyote,male) { ................ ................ @@ -312,7 +578,26 @@ Z = (195, 195, 195) ................ ................ } -# tile 15 (werejackal) +# tile 29 (coyote,female) +{ + ................ + ................ + ................ + ...K..K......... + ...K.KK......KKK + ..KKKK......KKKA + ..NCNK.KKKKKAAA. + .KCCKKKKKKKKK... + KKCKAKKKKKKKK... + DKKKAKAKKKKAK... + ..AAKAAKAAAAK... + ....AKAKAAAAK... + ...AKKAKA.AKK... + .....AKK........ + ................ + ................ +} +# tile 30 (werejackal,male) { ................ ................ @@ -331,7 +616,26 @@ Z = (195, 195, 195) ...L.LL..OOA.... ......L......... } -# tile 16 (little dog) +# tile 31 (werejackal,female) +{ + ................ + ................ + ................ + ................ + ...O..O......... + ...O.OO...O..... + ..OOOO.....O.... + ..IOIOO....O.A.. + .OLLOOOL...O.A.. + DOOOALLOOOOOAA.. + ..AALLLLOOOOAA.. + ....LJLLLOOLAA.. + ....LJLLKALKAA.. + ..LLLALAAAOAA... + ...L.LL..OOA.... + ......L......... +} +# tile 32 (little dog,male) { ................ ................ @@ -350,7 +654,26 @@ Z = (195, 195, 195) .....KK...KA.... ................ } -# tile 17 (dingo) +# tile 33 (little dog,female) +{ + ................ + ................ + ................ + ................ + ...J..J......... + ...J.JJ...K..... + ..JJJJ.....K.... + ..NJNKK....K.A.. + .JJJCKK....K.A.. + .PJJAKCKKCKKAA.. + .DDAACKKCKKKAA.. + ....KJKJCJKJAA.. + ....KJKJJAJJAA.. + ...KKAKAAAKAA... + .....KK...KA.... + ................ +} +# tile 34 (dingo,male) { ................ ................ @@ -369,7 +692,26 @@ Z = (195, 195, 195) ................ ................ } -# tile 18 (dog) +# tile 35 (dingo,female) +{ + ................ + ................ + ................ + .............C.. + ...C..C.......C. + ...C.CC.......CA + ..CCCCK.......CA + ..ACACCKCCCCCCAA + ..LLCCCKCCCLCCCA + .KCCACKCLLLLACCA + ..AACAACLLAAACCA + ....ACACAAAAAACA + ....CCACAAA..CCA + .....ACCA....... + ................ + ................ +} +# tile 36 (dog,male) { ................ ................ @@ -388,7 +730,26 @@ Z = (195, 195, 195) .....KKAA...KA.. ................ } -# tile 19 (large dog) +# tile 37 (dog,female) +{ + ................ + ................ + ................ + ...J..J.....K... + ...J.JJ......K.. + ..JJJJ.......K.. + ..NJNKK......K.A + .JJJCKKKK....K.A + .PJCAKCKKKKCKKAA + .DDAACKKKKCKKKAA + ..AAKJKKJJCJKJAA + ....KJKKJJJAJJAA + ....KAKJAAAAKJA. + ...KKAKAAAAAKAA. + .....KKAA...KA.. + ................ +} +# tile 38 (large dog,male) { ................ ................ @@ -407,7 +768,26 @@ Z = (195, 195, 195) .....KKAA...KA.. ................ } -# tile 20 (wolf) +# tile 39 (large dog,female) +{ + ................ + ................ + ...J..J.....K... + ...J.JJ......K.. + ..JJJJ.......K.. + ..NJNKKK.....K.A + .JJJCKKKKK..JK.A + .PJCAKCKKKKCKKAA + .DDAACKKKKCKKKAA + ..AAKJKKJJCJKJAA + ...JKJKKJJJAJJAA + ....KAKJAAAAKJA. + ....KAKJAAAAKJA. + ...KKAKAAAAAKAA. + .....KKAA...KA.. + ................ +} +# tile 40 (wolf,male) { ................ ................ @@ -426,7 +806,26 @@ Z = (195, 195, 195) .....PPAA..PPA.. ................ } -# tile 21 (werewolf) +# tile 41 (wolf,female) +{ + ................ + ................ + ................ + ...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 42 (werewolf,male) { ................ ................ @@ -445,7 +844,26 @@ Z = (195, 195, 195) ...L.LLAA..PP... .....LL......... } -# tile 22 (winter wolf cub) +# tile 43 (werewolf,female) +{ + ................ + ................ + ................ + ...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 44 (winter wolf cub,male) { ................ ................ @@ -464,7 +882,26 @@ Z = (195, 195, 195) .....NB..NBA.... ................ } -# tile 23 (warg) +# tile 45 (winter wolf cub,female) +{ + ................ + ................ + ................ + ................ + ...N..N......... + ...N.NB...N..... + ..NNNN.....N.... + ..DNDNB....N.A.. + ..NNNNB....N.A.. + .NNNNNNNNNNNAA.. + .DNBBNNNNNNBAA.. + ....NNNNNNNBAA.. + ....NNNBBANBAA.. + ...NBANAAANAA... + .....NB..NBA.... + ................ +} +# tile 46 (warg,male) { ................ ...P..P....PP... @@ -483,7 +920,26 @@ Z = (195, 195, 195) ....PPPAA.PPPA.. ................ } -# tile 24 (winter wolf) +# tile 47 (warg,female) +{ + ................ + ...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 48 (winter wolf,male) { ................ ................ @@ -502,7 +958,26 @@ Z = (195, 195, 195) .....NNAA..NNA.. ................ } -# tile 25 (hell hound pup) +# tile 49 (winter wolf,female) +{ + ................ + ................ + ................ + ...N..N.....N... + ...N.NN......N.. + ..NNNN.......N.. + ..DODNN......N.A + .NOONNNNN....N.A + NNONANNNNNNNNNAA + DNNBANNNNNNNNNAA + ..AANNNNNNNBNNAA + ....NBNNNBBANNAA + ....NANBAAAANBA. + ...NNANAAAAANAA. + .....NNAA..NNA.. + ................ +} +# tile 50 (hell hound pup,male) { ................ ................ @@ -521,7 +996,26 @@ Z = (195, 195, 195) .....CC...CA.... ................ } -# tile 26 (hell hound) +# tile 51 (hell hound pup,female) +{ + ................ + ................ + ................ + ................ + ...C..C......... + ...C.CC...C..... + ..CCCC.....C.... + ..DCDCC....C.A.. + .CCCCCC....C.A.. + .PCCACCCCCCCAA.. + .CHAACCCCCCCAA.. + CHC.CCCCCCCCAA.. + .D..CCCCCACCAA.. + ...CCACAAACAA... + .....CC...CA.... + ................ +} +# tile 52 (hell hound,male) { ................ ...C..C....CC... @@ -540,7 +1034,26 @@ Z = (195, 195, 195) ....CCCAA.CCCA.. ................ } -# tile 27 (Cerberus) +# tile 53 (hell hound,female) +{ + ................ + ...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 54 (Cerberus,male) { ................ ..J..J.......... @@ -559,7 +1072,26 @@ Z = (195, 195, 195) .....JJAA...JA.. ................ } -# tile 28 (gas spore) +# tile 55 (Cerberus,female) +{ + ................ + ..J..J.......... + ..JJJJ.J..J..... + .NJNJ..J.JJ..... + JJJJKAJJJJ....J. + PJJJJANJNKK...J. + DJKJAJJJKJJK..J. + ..AAJPJKAJKJKJJ. + ..JJJDDAJKJJJJJA + ..JJJAAJJJJJJJJA + .JKKKJJJKJJKJJAA + .JJAAKJJKJJJKJAA + JJAAAAJJAAAAJJA. + JAAAAAJAAAAAJAA. + .....JJAA...JA.. + ................ +} +# tile 56 (gas spore,male) { ................ ................ @@ -578,7 +1110,26 @@ Z = (195, 195, 195) ................ ................ } -# tile 29 (floating eye) +# tile 57 (gas spore,female) +{ + ................ + ................ + ................ + .....PFGGFP..... + ....PGFFFFFP.... + ...PFFFFFGGFP... + ...FFGGFFGGFF... + ...GFGGFFFFFG... + ...GFFFFFFFFG... + ...FFFFGGFFFF... + ...PGGFGGFGGP... + ....PGFFFFGP.... + .....PFGGFP..... + ................ + ................ + ................ +} +# tile 58 (floating eye,male) { ................ ................ @@ -597,7 +1148,26 @@ Z = (195, 195, 195) ................ ................ } -# tile 30 (freezing sphere) +# tile 59 (floating eye,female) +{ + ................ + ................ + ......ONNNO..... + ....PNNNNNNNP... + ....NNNNNNNNN... + ...ONNBBBBNNNO.. + ...NNBBEEBBNNN.. + ...NNBEAAEBNNN.. + ...ONBEAAEBNNO.. + ....NBBEEBBNN... + ....PNBBBBNNPAA. + ......ONNNOAAAA. + ......AAAAAAAAA. + .......AAAAAAA.. + ................ + ................ +} +# tile 60 (freezing sphere,male) { ................ ................ @@ -616,7 +1186,26 @@ Z = (195, 195, 195) ................ ................ } -# tile 31 (flaming sphere) +# tile 61 (freezing sphere,female) +{ + ................ + ................ + ......PBBBP..... + ....PBBBBBBBP... + ....BBBBBBBBB... + ...PBPPPBBBBBP.. + ...BBNNBBPPPBB.. + ...BBANPBNNBBB.. + ...PBBPPBANPBP.. + ....BBBBBBPPB... + ....PBBBBBBBPAA. + ......PBBBPAAAA. + ......AAAAAAAAA. + .......AAAAAAA.. + ................ + ................ +} +# tile 62 (flaming sphere,male) { ................ ....C...H....... @@ -635,7 +1224,26 @@ Z = (195, 195, 195) ......JJJJJ..... ................ } -# tile 32 (shocking sphere) +# tile 63 (flaming sphere,female) +{ + ................ + ....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 64 (shocking sphere,male) { ................ .....PPPPPP..... @@ -654,7 +1262,26 @@ Z = (195, 195, 195) ......PPPPP..... ................ } -# tile 33 (beholder) +# tile 65 (shocking sphere,female) +{ + ................ + .....PPPPPP..... + ...PPIAAADAPP... + ..PAAAIAAADDAP.. + ..PHAAAPBOAAAP.. + .PAHHAPBBBOAAAP. + .PHAAAPBBBBAHHP. + .PAAAAPPBBBAAAP. + .PAAAIAPPPAAAIP. + .PIIIAAAAAAIIAP. + ..PIAANAAPAAAIP. + ..PIAANAAAPAAP.. + ...PANANAPAPAP.. + ....PPAIAPAPP... + ......PPPPP..... + ................ +} +# tile 66 (beholder,male) { ....OA..OA...... ..OA.DADA.OA.OA. @@ -673,7 +1300,26 @@ Z = (195, 195, 195) ................ ................ } -# tile 34 (kitten) +# tile 67 (beholder,female) +{ + ....OA..OA...... + ..OA.DADA.OA.OA. + ...DA.DADADADD.. + ..OADDOOOODDADO. + ...DDHOAAOHDDA.. + ...JDHOAAOHDDJ.. + ...DDDOOOODDDD.. + ...DDDDDDDDDDD.. + ...JDAOAAAOADJ.. + ....DDAAOAADD... + ....PDDDDDDDPAA. + ......JDDDJAAAA. + ......AAAAAAAAA. + .......AAAAAAA.. + ................ + ................ +} +# tile 68 (kitten,male) { ................ ................ @@ -692,7 +1338,26 @@ Z = (195, 195, 195) ......CCA..CA... ................ } -# tile 35 (housecat) +# tile 69 (kitten,female) +{ + ................ + ................ + ................ + ................ + ................ + ................ + ...........K.... + ............C... + ....C.C.....L.A. + ...CCCCJ....C.A. + ...NCNCJCCLCL.A. + ...CCCCJCCLCCAA. + ....IACCLLCCCAA. + .....CACCJCCJA.. + ......CCA..CA... + ................ +} +# tile 70 (housecat,male) { ................ ................ @@ -711,7 +1376,26 @@ Z = (195, 195, 195) .....CCA...CA... ................ } -# tile 36 (jaguar) +# tile 71 (housecat,female) +{ + ................ + ................ + ................ + ................ + ................ + ...........K.... + ............C... + ...C.C......L.A. + ..CCCCJ.....C.A. + .CNCNCJCLCLCL.A. + .CCCCCJCLCLCCAA. + ..CICJCCLCLCLAA. + ...AACCLCLCCCAA. + ...CCACCJJCCJA.. + .....CCA...CA... + ................ +} +# tile 72 (jaguar,male) { ................ ................ @@ -730,7 +1414,26 @@ Z = (195, 195, 195) .....CCAA...CA.. ................ } -# tile 37 (lynx) +# tile 73 (jaguar,female) +{ + ................ + ................ + ................ + ................ + ..C..C......C... + ..CC.CJ......C.A + .CCCCCJ......C.A + .GCGCCJCAACCJC.A + .CCCCCJCCCCCCCAA + .CDDDJCAACCAJCAA + ..CCACCAJCCAACAA + ....CACCJJJCCJA. + ....CACAAAAACJA. + ...CKACAAAAACAA. + .....CCAA...CA.. + ................ +} +# tile 74 (lynx,male) { ................ ................ @@ -749,7 +1452,26 @@ Z = (195, 195, 195) ................ ................ } -# tile 38 (panther) +# tile 75 (lynx,female) +{ + ................ + ................ + ................ + ................ + O....O.......... + AC.CCA.......... + .CCCA........CA. + .GCGCOAKKKKK.LA. + .CKCCAJCCCCCKA.. + LLDDLLACLLLCCAA. + ..CC.AACLLLCCAA. + .......CAAAACAA. + ....CACAAAACCA.. + ................ + ................ + ................ +} +# tile 76 (panther,male) { ................ ................ @@ -768,7 +1490,26 @@ Z = (195, 195, 195) ................ ................ } -# tile 39 (large cat) +# tile 77 (panther,female) +{ + ................ + ................ + ............AA.. + ..............A. + ..............A. + .A...A........A. + .EA.AE........A. + .AAAAAEAAAAAAA.. + .AAAAAEAAAAAAA.. + .HAHAA.AAAAAAAA. + .AAAA.AAAAAEAAA. + .AAA..AAAAAEAAA. + .....AA....AAA.. + ..AAAA..AAAA.... + ................ + ................ +} +# tile 78 (large cat,male) { ................ ................ @@ -787,7 +1528,26 @@ Z = (195, 195, 195) .....CCAA...CA.. ................ } -# tile 40 (tiger) +# tile 79 (large cat,female) +{ + ................ + ................ + ................ + ................ + ............K... + .............C.. + ...C.C.......L.A + ..CCCCJ......C.A + .CNCNCJCLCCLCL.A + .CCCCCJCLCCLCCAA + ..CDCJCCLCCLCLAA + ...AACCLCCLCCCAA + ....CACCJJJCCJA. + ...CKALAAAAACAA. + .....CCAA...CA.. + ................ +} +# tile 80 (tiger,male) { ................ ................ @@ -806,7 +1566,26 @@ Z = (195, 195, 195) .....CCAA..CCA.. ................ } -# tile 41 (displacer beast) +# tile 81 (tiger,female) +{ + ................ + ................ + ................ + ................ + ..C..C......C... + .CCJCC.......C.A + .CAACCJ......A.A + .GAGCCJACACAJC.A + .CCCCCACACACACAA + .ODOCACCACACACAA + .OCOACCJACACACAA + ....CACJAJAJCAA. + ....AACAAAAAAJA. + ...CKACAAAAACAA. + .....CCAA..CCA.. + ................ +} +# tile 82 (displacer beast,male) { ................ ........E....... @@ -825,7 +1604,26 @@ Z = (195, 195, 195) ...AE.AE.EA.EA.. ................ } -# tile 42 (gremlin) +# tile 83 (displacer beast,female) +{ + ................ + ........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 84 (gremlin,male) { ................ ................ @@ -844,7 +1642,26 @@ Z = (195, 195, 195) ...GFA.FGA...... ................ } -# tile 43 (gargoyle) +# tile 85 (gremlin,female) +{ + ................ + ................ + ................ + GGGA....AGGG.... + .GGGFAAAGGG..... + ..FFFFFFFF...... + ...NDFFDNA...... + ...GNFFNGA...... + ...GFFFFGA..AA.. + ...AGFFFAFAAAAA. + ..GFAGFAFFFAAAA. + .GFGFAAFFAFAAAA. + .GF.GFAGAAFAAAA. + ....FFAGFAA.AA.. + ...GFA.FGA...... + ................ +} +# tile 86 (gargoyle,male) { ................ ................ @@ -863,7 +1680,26 @@ Z = (195, 195, 195) ....PFA.FPA..... ................ } -# tile 44 (winged gargoyle) +# tile 87 (gargoyle,female) +{ + ................ + ................ + ...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 88 (winged gargoyle,male) { ...K......K..... ...KJ....KJ..... @@ -882,7 +1718,26 @@ Z = (195, 195, 195) ....PFA.FPA..... ................ } -# tile 45 (hobbit) +# tile 89 (winged gargoyle,female) +{ + ...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 90 (hobbit,male) { ................ ................ @@ -901,7 +1756,26 @@ Z = (195, 195, 195) ....LLL.LLL..... ................ } -# tile 46 (dwarf) +# tile 91 (hobbit,female) +{ + ................ + ................ + ................ + ................ + ......JJA....... + .....JJJJA...... + ....JLFLFJ...... + ....JLLLLJ...... + ....JKLLKJJ.AA.. + ...CLLLLLLCAAA.. + ..CLALLLLALCA... + ..LLAJJKJALLA... + ...L.LKJLALAA... + .....LLALLA.A... + ....LLL.LLL..... + ................ +} +# tile 92 (dwarf,male) { ................ ................ @@ -920,7 +1794,26 @@ Z = (195, 195, 195) ................ ................ } -# tile 47 (bugbear) +# tile 93 (dwarf,female) +{ + ................ + ................ + ................ + ................ + ......B......... + .....BEE........ + ....BBEEE....... + ....BLLLE....... + .....OLO...AAA.. + ...BBOOOEEAAAA.. + ...BABOEAEAAAA.. + ....LBBELAAAA... + ....EBAEEAA..... + ....BEAEB.A..... + ................ + ................ +} +# tile 94 (bugbear,male) { ................ ................ @@ -939,7 +1832,26 @@ Z = (195, 195, 195) ........CCA..... ................ } -# tile 48 (dwarf lord) +# tile 95 (bugbear,female) +{ + ................ + ................ + ......K......... + .K..KKK......... + .KKKKKK......... + KADKADKKK....... + KKKKKKKJKK...... + KAPAPAKJJKJ..... + KAAAAAKKJKJJ.... + .KKKKKJKAKKJ.... + ..KAJJCAKKKJ.AA. + ..KK.KKKKKJJAA.. + ...C..KJAKJAA... + .....CCAAKJA.... + ........CCA..... + ................ +} +# tile 96 (dwarf leader,male) { ................ ................ @@ -958,7 +1870,26 @@ Z = (195, 195, 195) ................ ................ } -# tile 49 (dwarf king) +# tile 97 (dwarf leader,female) +{ + ................ + ................ + ................ + ................ + ......B......... + .....BEE........ + ....HHHHH....... + ....BLLLE....... + ....BOLOE..AAA.. + ...BBOOOEEAAAA.. + ...BABOEAEAAAA.. + ....LBBELAAAA... + ....EBAEEAA..... + ....BEAEB.A..... + ................ + ................ +} +# tile 98 (dwarf ruler,male) { ................ ................ @@ -977,7 +1908,26 @@ Z = (195, 195, 195) ................ ................ } -# tile 50 (mind flayer) +# tile 99 (dwarf ruler,female) +{ + ................ + ................ + ................ + ................ + ....H.C.H....... + ....HCHCH....... + ....HHHHH....... + ....BLLLE...A... + .....OLO...AAAA. + ...EBOOOEEAAAA.. + ...BABOEAEAAAA.. + ....LBBELAAAA... + ....EBAEEAA..... + ....BEAEB.A..... + ................ + ................ +} +# tile 100 (mind flayer,male) { ................ .......IIIIC.... @@ -996,7 +1946,26 @@ Z = (195, 195, 195) ......CFFCAA.... ....IIC.IIA..... } -# tile 51 (master mind flayer) +# tile 101 (mind flayer,female) +{ + ................ + .......IIIIC.... + .....IIIIIIC.... + ....IIIIIIIC.... + ...IGIIIIGC..... + ...IIGINGIC..... + ....IIIIIC...... + ....IAIAIF...... + ....IAIAIF...... + ....IAIAIFI..... + .....FIFIFIC.AA. + ....CBIBBF.CAAA. + ...IIIBBFFACAAA. + ......BBFCAAAA.. + ......CFFCAA.... + ....IIC.IIA..... +} +# tile 102 (master mind flayer,male) { ................ .......IIIIC.... @@ -1015,7 +1984,26 @@ Z = (195, 195, 195) ...EEECEEEAA.... ....IIC.IIA..... } -# tile 52 (manes) +# tile 103 (master mind flayer,female) +{ + ................ + .......IIIIC.... + .....IIIIIIC.... + ....IIIIIIIC.... + ...IGIIIIGC..... + ...IIGINGIC..... + .EEEIIIIICEEEE.. + ..EEIAIAIEEEE... + ...EIAIAIEEE.... + ....IAIAIEEE.... + ....EFIFIEEE.AA. + ....CBIBBEEEAAA. + ...IIIBBEEEEAAA. + ....EEBEEEEAAA.. + ...EEECEEEAA.... + ....IIC.IIA..... +} +# tile 104 (manes,male) { ................ ................ @@ -1034,7 +2022,26 @@ Z = (195, 195, 195) ................ ................ } -# tile 53 (homunculus) +# tile 105 (manes,female) +{ + ................ + ................ + ....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 106 (homunculus,male) { ................ ................ @@ -1053,7 +2060,26 @@ Z = (195, 195, 195) ................ ................ } -# tile 54 (imp) +# tile 107 (homunculus,female) +{ + ................ + ................ + ................ + ................ + ................ + ................ + ................ + ......JJJ....... + ......LLC....... + ......LLC....... + .....BBPPPAA.... + ....L.BPPACAA... + ......BAPAAAA... + .....LLALCA..... + ................ + ................ +} +# tile 108 (imp,male) { ................ ................ @@ -1072,7 +2098,26 @@ Z = (195, 195, 195) ................ ................ } -# tile 55 (lemure) +# tile 109 (imp,female) +{ + ................ + ................ + ................ + ................ + ................ + ................ + ................ + .....O.D.O...... + .....OCDDO...... + ......CDD....... + .....GGFFFAA.... + ....C.GFFADAA... + ......GAFAAAA... + .....CDADDA..... + ................ + ................ +} +# tile 110 (lemure,male) { ................ ................ @@ -1091,7 +2136,26 @@ Z = (195, 195, 195) ................ ................ } -# tile 56 (quasit) +# tile 111 (lemure,female) +{ + ................ + ................ + ....PP.......... + ...PPPP......... + ..PAPAP....P.... + ..PPPPP..PP.P... + ..P..PPPPPPPP... + ..P..PPPPPPP.... + ..PPPPPPPPP..... + ....PPPPPPPP.... + ..PPPPPPPPPP.... + ...PPPPPPPPPP... + ..P.P..PPPP.PP.. + ........P.PP.... + ................ + ................ +} +# tile 112 (quasit,male) { ................ ................ @@ -1110,7 +2174,26 @@ Z = (195, 195, 195) ................ ................ } -# tile 57 (tengu) +# tile 113 (quasit,female) +{ + ................ + ................ + ................ + ................ + ................ + ................ + .....O.D.O...... + .....OCDDOD..... + ......CDD.D..... + .....GGFFFAA.... + ....C.GFFAAADA.. + ....C.GFFJJDA... + ......GAFAAAA... + .....CDADDA..... + ................ + ................ +} +# tile 114 (tengu,male) { ................ .......PP....... @@ -1129,7 +2212,26 @@ Z = (195, 195, 195) .....LLA.LLA.... ................ } -# tile 58 (blue jelly) +# tile 115 (tengu,female) +{ + ................ + .......PP....... + ......PPPP...... + .....DPPNP...... + ....DDDPPP...... + ....DDPPPP...... + ....D..PPA...... + .....PIAAIP.AAA. + ....PPPIIPPPAAA. + ....PAPPPPAPAAA. + ....PAHHHHAPAAA. + ....LAPPPPALAAA. + ......PPPPAAAA.. + ......PPPPAA.A.. + .....LLA.LLA.... + ................ +} +# tile 116 (blue jelly,male) { ................ ................ @@ -1148,7 +2250,26 @@ Z = (195, 195, 195) ................ ................ } -# tile 59 (spotted jelly) +# tile 117 (blue jelly,female) +{ + ................ + ................ + ................ + .......E........ + ......OBE....... + ...BE.OBEBOE.... + ..OBEOBBEOBBE... + ..OBEOBBEOBBE... + ..BBBGGBGGBEEE.. + ..BBBAGBAGEEEEA. + ..BBBBBBEBEEEEAA + ...BBBBBBBEEEAAA + ....BBBBBEEEAAA. + ......BBBEEAA... + ................ + ................ +} +# tile 118 (spotted jelly,male) { ................ ................ @@ -1167,7 +2288,26 @@ Z = (195, 195, 195) ................ ................ } -# tile 60 (ochre jelly) +# tile 119 (spotted jelly,female) +{ + ................ + ................ + ................ + .......E........ + ......OBE....... + ...BE.OCEBOE.... + ..OCEOCCEOBCE... + ..OCEOBCEOCBD... + ..BBBHHBHHBEDD.. + ..CCBAHBAHEEEEA. + ..BBCBBBEBEEDEAA + ...BBBCBBBEEDAAA + ....BCCCBEEDAAA. + ......CCBEEAA... + ................ + ................ +} +# tile 120 (ochre jelly,male) { ................ ................ @@ -1186,7 +2326,26 @@ Z = (195, 195, 195) ................ ................ } -# tile 61 (kobold) +# tile 121 (ochre jelly,female) +{ + ................ + ................ + ................ + .......D........ + ......LCD....... + ...CD.LCDCLD.... + ..LCDLCCDLCCD... + ..LCDLCCDLCCD... + ..CCCGGCGGCDDD.. + ..CCCAGCAGDDDDA. + ..CCCCCCDCDDDDAA + ...CCCCCCCDDDAAA + ....CCCCCDDDAAA. + ......CCCDDAA... + ................ + ................ +} +# tile 122 (kobold,male) { ................ ................ @@ -1205,7 +2364,26 @@ Z = (195, 195, 195) ................ ................ } -# tile 62 (large kobold) +# tile 123 (kobold,female) +{ + ................ + ................ + ................ + ................ + ...N...N........ + ...NBPBN........ + ...BABAB........ + ....BBPA..A..... + ...BBABPA.AA.A.. + ..BPBBBBPAAAAA.. + ..BAPBPAPAAAAA.. + ....PBPAAAAAA... + ....BABAAAA..... + ...BBABBA....... + ................ + ................ +} +# tile 124 (large kobold,male) { ................ ................ @@ -1224,7 +2402,26 @@ Z = (195, 195, 195) ................ ................ } -# tile 63 (kobold lord) +# tile 125 (large kobold,female) +{ + ................ + ................ + ................ + ...N...N........ + ...NBPBN........ + ...BABAB........ + ....BBPA..A..... + ...BBABPA.AA.... + ..BPBBBBPAAA.A.. + ..BAPBPAPAAAAA.. + ..BAPBPAPAAAAA.. + ....PBPAAAAAA... + ....BABAAAA..... + ...BBABBA....... + ................ + ................ +} +# tile 126 (kobold leader,male) { ................ ................ @@ -1243,7 +2440,26 @@ Z = (195, 195, 195) ................ ................ } -# tile 64 (kobold shaman) +# tile 127 (kobold leader,female) +{ + ................ + ................ + ................ + ...N...N........ + ...NCCCN........ + ...CABAC........ + ...CBBPC..A..... + ..CCBABCC.AA.... + ..CCBBBCCAAA.A.. + ..BCCBCCPAAAAA.. + ..BACBCAPAAAAA.. + ....BBBAAAAAA... + ....BABAAAA..... + ...BBABBA....... + ................ + ................ +} +# tile 128 (kobold shaman,male) { ................ ................ @@ -1262,7 +2478,26 @@ Z = (195, 195, 195) ................ ................ } -# tile 65 (leprechaun) +# tile 129 (kobold shaman,female) +{ + ................ + ................ + ................ + ...N...N........ + ...NHHHN........ + ...HABAH........ + ...HBBPH..A..... + ..HHBABHH.AA.... + .HHHBBBHHHAA.A.. + .HBHHBHHPHAAAA.. + ..BAHBHAPAAAAA.. + ....BBBAAAAAA... + ....BABAAAA..... + ...BBABBA....... + ................ + ................ +} +# tile 130 (leprechaun,male) { ................ ................ @@ -1281,7 +2516,26 @@ Z = (195, 195, 195) ................ ................ } -# tile 66 (small mimic) +# tile 131 (leprechaun,female) +{ + ................ + ................ + ................ + ................ + ......G......... + ......F....K.... + .....GFF..KLK... + ....GFFFF..K.... + .....KLKA.GLAA.. + ...FGFJFFFAKA.A. + ...GAGFFAAAK.AA. + ....LKHKKJAKAA.. + ....GFAGKJAKA... + ...GFAA.GFAK.... + ................ + ................ +} +# tile 132 (small mimic,male) { ................ ................ @@ -1300,7 +2554,26 @@ Z = (195, 195, 195) ................ ................ } -# tile 67 (large mimic) +# tile 133 (small mimic,female) +{ + ................ + ................ + ................ + ................ + ......POP....... + ......NNO....... + ......NNO....... + .......OA....... + .....NNNNN..AA.. + ....OONNNOO.AA.. + ....NANOOANAAA.. + ......NAOAAAA... + ......NAOAA.A... + .....NN.OOA..... + ................ + ................ +} +# tile 134 (large mimic,male) { ................ ................ @@ -1319,7 +2592,26 @@ Z = (195, 195, 195) ................ ................ } -# tile 68 (giant mimic) +# tile 135 (large mimic,female) +{ + ................ + ................ + ................ + ......LLOA...... + ......NNOA...... + ......NNOA...... + ......ONOA...... + .....NNNNO..AAA. + ....OONNNOO.AAA. + ...NOANNNAOOAAA. + ...NAONONOANAAA. + .....NO.NOAAAA.. + .....NO.NOAA.A.. + ....NNO.NOOA.... + ................ + ................ +} +# tile 136 (giant mimic,male) { ................ ......NNO....... @@ -1338,7 +2630,26 @@ Z = (195, 195, 195) ...NNNO.NNOOA... ................ } -# tile 69 (wood nymph) +# tile 137 (giant mimic,female) +{ + ................ + ......NNO....... + .....NNNNOA..... + .....NNNNOA..... + .....NNNNOA..... + .....ONNNOA..... + ..PONNOOONOOPAAA + .PONONNNNOONOPAA + .ONOANNNNOAONOAA + .NNOANNNNOAOOOAA + ...AANNONNAAAAAA + ....PNO.NNPAAAAA + ....ONO.NNOAA..A + ....NNO.NNOAA..A + ...NNNO.NNOOA... + ................ +} +# tile 138 (wood nymph,male) { ................ ................ @@ -1357,7 +2668,26 @@ Z = (195, 195, 195) ....KJKJKJKJ.... ................ } -# tile 70 (water nymph) +# tile 139 (wood nymph,female) +{ + ................ + ................ + ...OH........... + ..OHHL.......... + ..OHLL.......... + ..HHLA.......... + .OHLLFKKKKLA.... + .HKFLFKKKKA..... + OHKJFKKJJK.A.... + HKKLJJGKAAAAAAA. + .JJAJGDKJAAAAA.. + ..JA.KKJJAAAA... + ...J.KKKKJAA.... + ....JKKKKKJA.... + ....KJKJKJKJ.... + ................ +} +# tile 140 (water nymph,male) { ................ ................ @@ -1376,7 +2706,26 @@ Z = (195, 195, 195) ....BPBPBPBP.... ................ } -# tile 71 (mountain nymph) +# tile 141 (water nymph,female) +{ + ................ + ................ + ...OH........... + ..OHHL.......... + ..OHLL.......... + ..HHLA.......... + .OHLLJBBBBLA.... + .HBJLJBBBBA..... + OHBPJBBPPB.A.... + HBBLPPNBAAAAAAA. + .PPAPNDB.AAAAA.. + ..PA.BBPPAAAA... + ...P.BBBBPAA.... + ....PBBBBBPA.... + ....BPBPBPBP.... + ................ +} +# tile 142 (mountain nymph,male) { ................ ................ @@ -1395,7 +2744,26 @@ Z = (195, 195, 195) ....OLOLOLOL.... ................ } -# tile 72 (goblin) +# tile 143 (mountain nymph,female) +{ + ................ + ................ + ...OH........... + ..OHHL.......... + ..OHLL.......... + ..HHLA.......... + .OHLLCOOOOLA.... + .HOCLCOOOOA..... + OHOLCOOLLO.A.... + HOOKLLIOAAAAAAA. + .LLALIBOKAAAAA.. + ..LA.OOLLAAAA... + ...L.OOOOLAA.... + ....LOOOOOLA.... + ....OLOLOLOL.... + ................ +} +# tile 144 (goblin,male) { ................ ................ @@ -1414,7 +2782,26 @@ Z = (195, 195, 195) ................ ................ } -# tile 73 (hobgoblin) +# tile 145 (goblin,female) +{ + ................ + ................ + ................ + ....LK.......... + ...CJA.......... + ..KJA........... + .JJA.IIK...AA... + .IK.IGIGIJAA.... + J.ICKIIIJK...... + ...IIJJJK.A..... + ....KICJAAAAA... + ....ICKKJA...... + ....IKAIJA...... + ...IKAA.IK...... + ................ + ................ +} +# tile 146 (hobgoblin,male) { ................ .....LK......... @@ -1433,7 +2820,26 @@ Z = (195, 195, 195) ................ ................ } -# tile 74 (orc) +# tile 147 (hobgoblin,female) +{ + ................ + .....LK......... + ....CKA......... + ...CJA.......... + ..KJA........... + .JJA.IIK...AA... + .IK.IHIHIJAA.... + J.ICKIIIJK...... + ...IIJJJK.A..... + ....KICCAAAAA... + ....IIIIJA...... + ....ICKKJA...... + ....IKAIJA...... + ...IKAA.IK...... + ................ + ................ +} +# tile 148 (orc,male) { ................ ................ @@ -1452,7 +2858,26 @@ Z = (195, 195, 195) ................ ................ } -# tile 75 (hill orc) +# tile 149 (orc,female) +{ + ................ + ................ + ................ + .....OA......... + ....NOPA........ + ....LPLA........ + .....P.A........ + ..KCCAKKKA.AA... + ..BPCKJ.P.AAA... + ..BAGGFAAPNO.... + ..BAJJPNOAAA.... + ....BNOJAAAAAA.. + ...BJACPAAAA.... + ..BPPABPPA...... + ................ + ................ +} +# tile 150 (hill orc,male) { ................ ................ @@ -1471,7 +2896,26 @@ Z = (195, 195, 195) ................ ................ } -# tile 76 (Mordor orc) +# tile 151 (hill orc,female) +{ + ................ + ................ + ................ + .....OA......... + ....NOPA........ + ....LKLA........ + .....K.A........ + ..KGGAFFKA.AA... + ..JKGFF.K.AAA... + ..JAHHFAAKNO.... + ..JAGFFNOAAA.... + ....GNNFAAAAAA.. + ...GGAGFAAAA.... + ..KJJAKJJA...... + ................ + ................ +} +# tile 152 (Mordor orc,male) { ................ ................ @@ -1490,7 +2934,26 @@ Z = (195, 195, 195) ................ ................ } -# tile 77 (Uruk-hai) +# tile 153 (Mordor orc,female) +{ + ................ + ................ + ................ + .....OA......... + ....NOPA........ + ....LPLA........ + .....P.A........ + ..KIIAIIKA.AA... + ..BPIDD.P.AAA... + ..BAGGFAAP.O.... + ..BAIDDNOAAA.... + ....BNOJAAAAAA.. + ...BIAIPAAAA.... + ..BPPABPPA...... + ................ + ................ +} +# tile 154 (Uruk-hai,male) { ................ ................ @@ -1509,7 +2972,26 @@ Z = (195, 195, 195) ................ ................ } -# tile 78 (orc shaman) +# tile 155 (Uruk-hai,female) +{ + ................ + ................ + .....OA......... + ....NOPA........ + ....LPLA........ + .....P.A........ + ..IIIAIIIA...... + ..BPIKI.BAAAA... + ..BIG.PPPPAAA... + .NBAD.PDDPAA.... + ..BNNJPDDPAA.... + ....INPPPPAAAA.. + ...BIAK.AAAA.... + ..BPPABPPA...... + ................ + ................ +} +# tile 156 (orc shaman,male) { ................ ................ @@ -1528,7 +3010,26 @@ Z = (195, 195, 195) ................ ................ } -# tile 79 (orc-captain) +# tile 157 (orc shaman,female) +{ + ................ + ................ + .....OA......... + ....NOPA........ + ....LPLA........ + .....P.A........ + ..CCCACCCA...... + ..BPCKC.BAAAA... + ..BCGGFJBAAAA... + ..BAJJCJBAAA.... + ..BAJJCJBAAA.... + ....CACJAAAAAA.. + ...BCACPAAAA.... + ..BPPABPPA...... + ................ + ................ +} +# tile 158 (orc-captain,male) { ................ ................ @@ -1547,7 +3048,26 @@ Z = (195, 195, 195) ................ ................ } -# tile 80 (rock piercer) +# tile 159 (orc-captain,female) +{ + ................ + ................ + .....OA......... + ...NNOOPA....... + ....LPLA........ + ...IPPPA........ + ..DIIPADDA.AA... + ..BPIAD.P.AAA... + ..BAGGFAAP.O.... + ..BAGGFAAP.O.... + ..BAJJPNOAAA.... + ....BNOJAAAAAA.. + ...BDAIPAAAA.... + ..BPPABPPA...... + ................ + ................ +} +# tile 160 (rock piercer,male) { .JKKKKKKKKJAAA.. ..JJGKGKJJAAAA.. @@ -1566,7 +3086,26 @@ Z = (195, 195, 195) ................ ................ } -# tile 81 (iron piercer) +# tile 161 (rock piercer,female) +{ + .JKKKKKKKKJAAA.. + ..JJGKGKJJAAAA.. + ...JKKKJJAAAA... + ...JJKKJJAAAA... + ....JKKJAAAA.... + ....JJKJ.AAA.... + ....JJKJ.AAA.... + ....JJJJ..A..... + .....JJ...A..... + .....JJ...A..... + .....JJ......... + .....JJ......... + .....J.......... + .....J.......... + ................ + ................ +} +# tile 162 (iron piercer,male) { .BPPPPPPPP.AAA.. ..BBDPDP..AAAA.. @@ -1585,7 +3124,26 @@ Z = (195, 195, 195) ................ ................ } -# tile 82 (glass piercer) +# tile 163 (iron piercer,female) +{ + .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 164 (glass piercer,male) { .NBBBBBBBBPAAA.. ..NNDBDBPPAAAA.. @@ -1604,7 +3162,26 @@ Z = (195, 195, 195) ................ ................ } -# tile 83 (rothe) +# tile 165 (glass piercer,female) +{ + .NBBBBBBBBPAAA.. + ..NNDBDBPPAAAA.. + ...NBBBPPAAAA... + ...PNBBPPAAAA... + ....NBBPAAAA.... + ....NNBPAAAA.... + ....PNBPAAAA.... + ....PNBP..A..... + .....NB...A..... + .....NB...A..... + .....NB......... + .....NB......... + .....N.......... + .....P.......... + ................ + ................ +} +# tile 166 (rothe,male) { ................ ...........K.... @@ -1623,7 +3200,26 @@ Z = (195, 195, 195) ................ ................ } -# tile 84 (mumak) +# tile 167 (rothe,female) +{ + ................ + ...........K.... + ............K... + ............K... + .......JJJKKJ... + .....JKKKKKKK... + ..AAAKKKKKKKK... + .AAAAAKKKKKKKA.. + AAKKAAKKKKKAKA.. + .KEKKAKKKJAAKA.. + .KKKJAKKAJAAK... + ..KJAAAKAAA..... + ..AAKA.KA....... + ..A..A.K........ + ................ + ................ +} +# tile 168 (mumak,male) { ................ ...........P.... @@ -1642,7 +3238,26 @@ Z = (195, 195, 195) PPPA............ .AA............. } -# tile 85 (leocrotta) +# tile 169 (mumak,female) +{ + ................ + ...........P.... + .PP.........P... + PPP...PPPPP.P... + PPPPPPPPP.PP.... + PPPPBPPBBP.PP... + PPPBPPPPPP.PP... + .PDPPDDPP.PPP... + ..BPPDDP.PPPPA.. + ..PPPPPPPPPPPA.. + ..PPPPO..PAPPA.. + .OOPPOOAPPAPPA.. + OOPPOOAAPPA..... + .PPPAPA.PP...... + PPPA............ + .AA............. +} +# tile 170 (leocrotta,male) { ................ ..A..A.......... @@ -1661,7 +3276,26 @@ Z = (195, 195, 195) ................ ................ } -# tile 86 (wumpus) +# tile 171 (leocrotta,female) +{ + ................ + ..A..A.......... + ..AOOA....J..... + ..AOOAA....J.... + .APOAFA....J.... + .APOAAA.JJJJ.... + .AOPAAJKKKKKJ... + .AOAAKJJKKJKJA.. + ...JKKKKKJAKKA.. + ...JKJKKJAAKKA.. + ..JKJAKKAAPAPA.. + ..KKAAKKAAPAPA.. + .PAPAAPAPA...... + .PAPA.PAPA...... + ................ + ................ +} +# tile 172 (wumpus,male) { ................ ............B... @@ -1680,7 +3314,26 @@ Z = (195, 195, 195) ................ ................ } -# tile 87 (titanothere) +# tile 173 (wumpus,female) +{ + ................ + ............B... + .............B.. + .......BBBBB.B.. + ....BBBPPBBBB... + ...BOOBBBPBBBB.. + ...OOBBBBBPBBB.. + ..DABBAABBPBBBA. + .BOOBBDABEBBEBAA + .BOBBBBBBEBEBBAA + .BBBBBBBEBBABBAA + .EBBBBBEABBABBAA + ..EEEEEAABBA.... + .....BBA.BB..... + ................ + ................ +} +# tile 174 (titanothere,male) { ................ ................ @@ -1699,7 +3352,26 @@ Z = (195, 195, 195) ................ ................ } -# tile 88 (baluchitherium) +# tile 175 (titanothere,female) +{ + ................ + ................ + ................ + ..........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 176 (baluchitherium,male) { ................ ................ @@ -1718,7 +3390,26 @@ Z = (195, 195, 195) ................ ................ } -# tile 89 (mastodon) +# tile 177 (baluchitherium,female) +{ + ................ + ................ + ................ + ..........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 178 (mastodon,male) { ................ ................ @@ -1737,7 +3428,26 @@ Z = (195, 195, 195) .......PPA...... ................ } -# tile 90 (sewer rat) +# tile 179 (mastodon,female) +{ + ................ + ................ + ................ + ................ + ................ + ..O...O......... + .N..POP.P....... + N..PNPPPPP...... + O.PNPPPPPP.PP... + O.POPEPPP.PPPPP. + .OPOPOP..PPPPPAP + ..PPOPP.PPPPPPAA + ..PPAAAPPPPAPPA. + ..P...APPAAAPPA. + .......PPA...... + ................ +} +# tile 180 (sewer rat,male) { ................ ................ @@ -1756,7 +3466,26 @@ Z = (195, 195, 195) .........JJA.... ................ } -# tile 91 (giant rat) +# tile 181 (sewer rat,female) +{ + ................ + ................ + ................ + ................ + ................ + ................ + ................ + ..K..K.JKKKK.... + ..KKKKJKKJKKK... + ..JAKAKJJJKKKJ.. + ..GKGKJKAKKAKKA. + .KKJJJJKAKAAKKA. + .PJJAAKKAJAJKA.. + ..AA.KKA..JKA... + .........JJA.... + ................ +} +# tile 182 (giant rat,male) { ................ ................ @@ -1775,7 +3504,26 @@ Z = (195, 195, 195) ..........JJA... ................ } -# tile 92 (rabid rat) +# tile 183 (giant rat,female) +{ + ................ + ................ + ................ + ................ + ................ + ................ + ..K..K.JKKKKK... + ..KKKKJKKKJKKK.. + ..JAKAKJKJJKKKJ. + ..GAGAKJKJJKKKK. + ..AKAKJKKAKKAKKA + .KKJJJJKAJKAAKKA + .PJJAAKKAJJAJKA. + ..AA.KKAA..JKA.. + ..........JJA... + ................ +} +# tile 184 (rabid rat,male) { ................ ................ @@ -1794,7 +3542,26 @@ Z = (195, 195, 195) .OOOOOOOO.JJA... ................ } -# tile 93 (wererat) +# tile 185 (rabid rat,female) +{ + ................ + ................ + ................ + ................ + ................ + ................ + ..K..K.JKKKKK... + ..KKKKJKKKJKKK.. + ..JAKAKJKJJKKKJ. + ..GAGAKJKJJKKKK. + ..AKAKJKKAKKAKKA + .KKJOOOKAJKAAKKA + .PJOOAKKAJJAJKA. + ..AOOOKAA..JKA.. + .OOOOOOOO.JJA... + ................ +} +# tile 186 (wererat,male) { ................ ................ @@ -1813,7 +3580,26 @@ Z = (195, 195, 195) ..........JJA... ................ } -# tile 94 (rock mole) +# tile 187 (wererat,female) +{ + ................ + ................ + ................ + ................ + ................ + ................ + ..K..K.JKKKKK... + ..KKKKJKKKJKKK.. + ..LLLLKJKJJKKKJ. + ..FLFLLJKJJKKKK. + ..LLLLJKKAKKAKKA + .KKJJJJKAJKAAKKA + .PJJAAKKAJJAJKA. + ..AA.KKAA..JKA.. + ..........JJA... + ................ +} +# tile 188 (rock mole,male) { ................ ................ @@ -1832,7 +3618,26 @@ Z = (195, 195, 195) AN.NAA.AA...AA.. .AAAA........... } -# tile 95 (woodchuck) +# tile 189 (rock mole,female) +{ + ................ + ................ + ................ + ................ + ................ + ................ + ................ + .......AAAAA.... + ...AAAAAAAAAA... + ..AAAAAAAAAAAA.. + ..JAJAAAAAAAAAA. + .AAAAAAAAAAAAAA. + AN.NAAAAAAAAAAA. + A...AAAA...AAA.. + AN.NAA.AA...AA.. + .AAAA........... +} +# tile 190 (woodchuck,male) { ................ ................ @@ -1851,7 +3656,26 @@ Z = (195, 195, 195) .....JJAAJJAA... ................ } -# tile 96 (cave spider) +# tile 191 (woodchuck,female) +{ + ................ + ................ + ................ + ................ + ................ + ................ + .......KJA...... + ......NKKNA..... + ......KNOJA..... + ......KNOJA..... + .....KKKKKJA.... + ....JJKLLJJJAA.. + ......KLLJAAAAA. + ......KJJJAAAA.. + .....JJAAJJAA... + ................ +} +# tile 192 (cave spider,male) { ................ ................ @@ -1870,7 +3694,26 @@ Z = (195, 195, 195) .....PAA.APA.... ................ } -# tile 97 (centipede) +# tile 193 (cave spider,female) +{ + ................ + ................ + ................ + ................ + ................ + ........PA...... + .......PA....... + ......PAPBBA.... + ...PA.APBPPPA... + ...ABBPPAPPAA.PA + ...GPPPPAAAPPPAA + ...PPGPAAPPAAAA. + ..D.PAPAPAAPPA.. + ....D.PAAPA.APA. + .....PAA.APA.... + ................ +} +# tile 194 (centipede,male) { ................ ................ @@ -1889,7 +3732,26 @@ Z = (195, 195, 195) ...B............ ................ } -# tile 98 (giant spider) +# tile 195 (centipede,female) +{ + ................ + ................ + ......PBPP...... + ....BBPAAA...... + ..PPBAAA........ + .PAPBBBPPPP..... + ..PAAPPBBBA..... + ....PAAPAPBPP... + ......AABBPP.... + ......BB.PPAP... + ....PBBPPAP.A... + ...GPPPAP.AP.... + ...PPGPAAP...... + ..B.PAA......... + ...B............ + ................ +} +# tile 196 (giant spider,male) { ................ ................ @@ -1908,7 +3770,26 @@ Z = (195, 195, 195) .....JAA.AJA.... ................ } -# tile 99 (scorpion) +# tile 197 (giant spider,female) +{ + ................ + ................ + ................ + ................ + ................ + ........JA...... + .......JA....... + ......JAJKKA.... + ...JA.AJKJJJA... + ...AKKJJAJJAA.JA + ...GJJJJAAAJJJAA + ...JJGJAAJJAAAA. + ..D.JAJAJAAJJA.. + ....D.JAAJA.AJA. + .....JAA.AJA.... + ................ +} +# tile 198 (scorpion,male) { ................ ................ @@ -1927,7 +3808,26 @@ Z = (195, 195, 195) .......JAAJA.... ................ } -# tile 100 (lurker above) +# tile 199 (scorpion,female) +{ + ................ + ................ + .......JKJKJAA.. + ......JA.JKJKKA. + .......KA...JJJA + ......JA....KKJA + ...........JJJKA + .......AJKKAJJA. + .....AAJKJJJAA.. + ...AKKJJAJJAA... + ...GJJJJAAAJJJA. + ...JJGJAAJJAAAJ. + ..D.JAJAJAAJJA.. + ....D.JAAJA.JAA. + .......JAAJA.... + ................ +} +# tile 200 (lurker above,male) { .AAAAAAAAAAAAAAA ...AAGFAAGFAAA.. @@ -1946,7 +3846,26 @@ Z = (195, 195, 195) ................ ................ } -# tile 101 (trapper) +# tile 201 (lurker above,female) +{ + .AAAAAAAAAAAAAAA + ...AAGFAAGFAAA.. + ...AAAAAAAAAAA.. + ....AODODODOA... + ................ + ................ + ................ + ................ + ................ + ................ + ................ + ................ + ................ + ................ + ................ + ................ +} +# tile 202 (trapper,male) { ................ ................ @@ -1965,7 +3884,26 @@ Z = (195, 195, 195) ...AAGFAAGFAAA.. .AAAAAAAAAAAAAAA } -# tile 102 (pony) +# tile 203 (trapper,female) +{ + ................ + ................ + ................ + ................ + ................ + ................ + ................ + ................ + ................ + ................ + ................ + ................ + ....AODODODOA... + ...AAAAAAAAAAA.. + ...AAGFAAGFAAA.. + .AAAAAAAAAAAAAAA +} +# tile 204 (pony,male) { ................ ................ @@ -1984,7 +3922,26 @@ Z = (195, 195, 195) .....LA...L..... ................ } -# tile 103 (white unicorn) +# tile 205 (pony,female) +{ + ................ + ................ + .....JJ......... + ....KKKJ........ + ...KKEKJ........ + ..KKJKKJ........ + ..JJAKKJAA...... + ...AKKKJA....... + ...KKKKKKKJ..... + ...KKKKKKKJJAAA. + ...KJKJJJJJAJA.. + ...JAJAAAAJAA... + ...JAJAAJAJA.... + ...L.JAALAJ..... + .....LA...L..... + ................ +} +# tile 206 (white unicorn,male) { ................ ..HP............ @@ -2003,7 +3960,26 @@ Z = (195, 195, 195) .....LA...L..... ................ } -# tile 104 (gray unicorn) +# tile 207 (white unicorn,female) +{ + ................ + ..HP............ + ..PHO.NN........ + ...PHNNB........ + ...ONENB........ + ..ONNNNB........ + ..NOANNBAA...... + ...AONNBA....... + ...ONNNONNN..... + ..NONNNNONNOAAA. + ..N.ONONNONAOA.. + ..OAANAAAAOAA... + ...LAOAAOAOA.... + .....OAALAO..... + .....LA...L..... + ................ +} +# tile 208 (gray unicorn,male) { ................ ..HP............ @@ -2022,7 +3998,26 @@ Z = (195, 195, 195) .....LA...L..... ................ } -# tile 105 (black unicorn) +# tile 209 (gray unicorn,female) +{ + ................ + ..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 210 (black unicorn,male) { ................ ..HP............ @@ -2041,7 +4036,26 @@ Z = (195, 195, 195) .....LP...L..... ................ } -# tile 106 (horse) +# tile 211 (black unicorn,female) +{ + ................ + ..HP............ + ..PHO.AA........ + ...PHAAJ........ + ...AADAJ........ + ..AAAAAJ........ + ..AAPAAJPP...... + ...PAAAJP....... + ...AAAAAAAA..... + ..AAAAAAAAAAPPP. + ..A.AAAAAAAPAP.. + ..APPAPPAPAPP... + ...LPAPPAPAP.... + .....APPLPA..... + .....LP...L..... + ................ +} +# tile 212 (horse,male) { ................ ................ @@ -2060,7 +4074,26 @@ Z = (195, 195, 195) .....LA....L.... ................ } -# tile 107 (warhorse) +# tile 213 (horse,female) +{ + ................ + ................ + .....JJ......... + ....KKKJ........ + ..KKKEKJ........ + .KKKJKKJAA...... + .JJJAKKJAA...... + ...AKKKJA....... + ...KKKKKKKKJA... + ..KKKKKKKKKKJA.. + ..KJJKJJJJJKAJA. + ..JAAJAAAAAJAJA. + ..JAAJAAAJAJAA.. + ..LA.JAA.L.JA... + .....LA....L.... + ................ +} +# tile 214 (warhorse,male) { ................ .....JJJ........ @@ -2079,7 +4112,26 @@ Z = (195, 195, 195) .....LC....LC... ................ } -# tile 108 (fog cloud) +# tile 215 (warhorse,female) +{ + ................ + .....JJJ........ + ...KKKKJJ....... + .KKKKEKJJ....... + KKKKKKKJJAA..... + JKKKJKKJJAA..... + .JJJAKKJJAA..... + ...AKKKJJA...... + ...KKKKKKKKKJA.. + ..KKKKKKKKKKKJA. + ..KKJKKJKKJKKJJA + ..KJAKJAKJAKJAJA + ..KJAKJAKJAKJA.. + ..LC.KJALC.KJ... + .....LC....LC... + ................ +} +# tile 216 (fog cloud,male) { .......P........ ....P..P........ @@ -2098,7 +4150,26 @@ Z = (195, 195, 195) ..P..P.P..P..... ................ } -# tile 109 (dust vortex) +# tile 217 (fog cloud,female) +{ + .......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 218 (dust vortex,male) { ................ ................ @@ -2117,7 +4188,26 @@ Z = (195, 195, 195) ....KKKK..K..... ................ } -# tile 110 (ice vortex) +# tile 219 (dust vortex,female) +{ + ................ + ................ + ....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 220 (ice vortex,male) { ................ ................ @@ -2136,7 +4226,26 @@ Z = (195, 195, 195) ....NNNN..N..... ................ } -# tile 111 (energy vortex) +# tile 221 (ice vortex,female) +{ + ................ + ................ + ....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 222 (energy vortex,male) { ................ ................ @@ -2155,7 +4264,26 @@ Z = (195, 195, 195) ....EEEE..E..... ................ } -# tile 112 (steam vortex) +# tile 223 (energy vortex,female) +{ + ................ + ................ + ....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 224 (steam vortex,male) { ................ ................ @@ -2174,7 +4302,26 @@ Z = (195, 195, 195) ....PPPP..P..... ................ } -# tile 113 (fire vortex) +# tile 225 (steam vortex,female) +{ + ................ + ................ + ....P..PPPP..... + ...P..PPBBBP.... + ..P..PBBBB..P... + .PB.PBBPBPP..P.. + .PBBPBPBBBBP.... + .PBBBBP.PPBBP... + .PPBPB...BPBPP.. + ..PBBPP.PBBBBP.. + ...PBBBBPBPBBP.. + .P..PPBPBBP.BP.. + ..P..BBBBP..P... + ...PBBBPP..P.... + ....PPPP..P..... + ................ +} +# tile 226 (fire vortex,male) { ................ ................ @@ -2193,7 +4340,26 @@ Z = (195, 195, 195) ....DDDD..D..... ................ } -# tile 114 (baby long worm) +# tile 227 (fire vortex,female) +{ + ................ + ................ + ....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 228 (baby long worm,male) { ................ ................ @@ -2212,7 +4378,26 @@ Z = (195, 195, 195) ................ ................ } -# tile 115 (baby purple worm) +# tile 229 (baby long worm,female) +{ + ................ + ................ + ................ + ................ + ......CLC....... + ......LLL....... + .....GGAGG.A.... + .....GGAGGAAA... + ......LLLAAA.C.. + ......LLLAA.CC.. + ......CLLCCCCA.. + .......LLLCCA... + ........CLL..... + ................ + ................ + ................ +} +# tile 230 (baby purple worm,male) { ................ ................ @@ -2231,7 +4416,26 @@ Z = (195, 195, 195) ................ ................ } -# tile 116 (long worm) +# tile 231 (baby purple worm,female) +{ + ................ + ................ + ................ + .......I........ + ......III....... + ......III....... + .....GGAGG.A.... + .....GGAGGAAA... + ......IIIAAA.D.. + ......IIIAA.DD.. + ......IIIDDDDA.. + .......IIIDDA... + ........III..... + ................ + ................ + ................ +} +# tile 232 (long worm,male) { ................ ................ @@ -2250,7 +4454,26 @@ Z = (195, 195, 195) ................ ................ } -# tile 117 (purple worm) +# tile 233 (long worm,female) +{ + ................ + ................ + .....CLC........ + ....CLLLC....... + ....LLLLL....... + ...GGGLGGGAA.... + ...GAGLGAGAAA... + ...GGGLGGGAAA... + ....LLLLLAAACC.. + ....LLLLLAACCC.. + ....CLLLLCCCCA.. + .....LLLLLCCA... + ......CLLLL..... + ................ + ................ + ................ +} +# tile 234 (purple worm,male) { ................ ................ @@ -2269,7 +4492,26 @@ Z = (195, 195, 195) ................ ................ } -# tile 118 (grid bug) +# tile 235 (purple worm,female) +{ + ................ + ................ + .....DID........ + ....DIIID....... + ....IIIII....... + ...GGGIGGGAA.... + ...GAGIGAGAAA... + ...GGGIGGGAAA... + ....IIIIIAAADD.. + ....IIIIIAADDD.. + ....DIIIIDDDDA.. + .....IIIIIDDA... + ......DIIII..... + ................ + ................ + ................ +} +# tile 236 (grid bug,male) { ................ ................ @@ -2288,7 +4530,26 @@ Z = (195, 195, 195) ................ ................ } -# tile 119 (xan) +# tile 237 (grid bug,female) +{ + ................ + ................ + ................ + ................ + ..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 238 (xan,male) { ................ ................ @@ -2307,7 +4568,26 @@ Z = (195, 195, 195) ..G..AAAAAA..... ......AA.AA..... } -# tile 120 (yellow light) +# tile 239 (xan,female) +{ + ................ + ................ + ..........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 240 (yellow light,male) { ................ ......NA........ @@ -2326,7 +4606,26 @@ Z = (195, 195, 195) ................ ................ } -# tile 121 (black light) +# tile 241 (yellow light,female) +{ + ................ + ......NA........ + ......HA........ + ..NA.NHNA.NA.... + ...LALHLALA..... + ....NHHHNA...... + ..NLHHHHHLNA.... + NHHHHHHHHHHHNA.. + ..NLHHHHHLNA.... + ....NHHHNA...... + ...LALHLALA..... + ..NA.NNNA.NA.... + ......HA........ + ......NA........ + ................ + ................ +} +# tile 242 (black light,male) { ................ ......AA........ @@ -2345,7 +4644,26 @@ Z = (195, 195, 195) ................ ................ } -# tile 122 (zruty) +# tile 243 (black light,female) +{ + ................ + ......AA........ + ......AA........ + ..AA.AAAA.AA.... + ...AAAAAAAA..... + ....AAAAAA...... + ..AAAAAAAAAA.... + AAAAAAAAAAAAAA.. + ..AAAAAAAAAA.... + ....AAAAAA...... + ...AAAAAAAA..... + ..AA.AAAA.AA.... + ......AA........ + ......AA........ + ................ + ................ +} +# tile 244 (zruty,male) { ................ ......FFGF...... @@ -2364,7 +4682,26 @@ Z = (195, 195, 195) ................ ................ } -# tile 123 (couatl) +# tile 245 (zruty,female) +{ + ................ + ......FFGF...... + ....OOFGFFFF.... + ...AOFGFOOKFF... + ...FFGFAOAJKKF.. + ..FFFFFFJAAJKK.. + ..ODOFFJAJJKKJA. + ..DDDDJAJJKJJAA. + ..JODOAJJJAJJAAA + .KKJAJJJKJAJJAAA + .KKAAJKKKKJAAAAA + ...AJJKKKKJJAAAA + ...KJJAAAAKJAAA. + ..JKJJJAAJJJJ... + ................ + ................ +} +# tile 246 (couatl,male) { ................ ................ @@ -2383,7 +4720,26 @@ Z = (195, 195, 195) ................ ................ } -# tile 124 (Aleax) +# tile 247 (couatl,female) +{ + ................ + ................ + ........I....I.. + ....KKAIII..III. + ...NAOJAKI.IIIII + ...KKJAJJKKK..II + ...KKAAIJJJJJ..I + ...FAA.I...KJ..I + ..FAFA..AAAKJAA. + .......AAAJJAAA. + ......AKKJJAAA.. + ......KJAAAAAJA. + .....JJAA...JA.. + ......JJJJJJA... + ................ + ................ +} +# tile 248 (Aleax,male) { ................ ......BBBB..I... @@ -2402,7 +4758,26 @@ Z = (195, 195, 195) ..BF.LLAALLAFB.. ................ } -# tile 125 (Angel) +# tile 249 (Aleax,female) +{ + ................ + ......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 250 (Angel,male) { ................ ................ @@ -2421,7 +4796,26 @@ Z = (195, 195, 195) ....BNNNNNNP.... ................ } -# tile 126 (ki-rin) +# tile 251 (Angel,female) +{ + ................ + ................ + ......HHHH...... + ................ + .......CC....... + ......CLLC..AA.. + ......PLLP....A. + ......NPPPA.A... + .....BBLLPPAAA.. + .....NNLLPPAAA.. + ......BNNPAAAA.. + ......BNNPAAAA.. + .....BNNNPAA.A.. + .....BNNNNPA.... + ....BNNNNNNP.... + ................ +} +# tile 252 (ki-rin,male) { ................ ................ @@ -2440,7 +4834,26 @@ Z = (195, 195, 195) ................ ................ } -# tile 127 (Archon) +# tile 253 (ki-rin,female) +{ + ................ + ................ + ..LP............ + ..PLO.C.C....... + ...PLCCD........ + ...KCIKD........ + ..KCCCCD........ + ..CKACCDA....... + ...ACCCCCC...A.. + ...KCCCKCCKAA... + ..CAKCKCKCAKA... + ..CAAKAKAKA..... + ...L.KALAK...... + .....LA..L...... + ................ + ................ +} +# tile 254 (Archon,male) { ................ ......OOOO...... @@ -2459,7 +4872,26 @@ Z = (195, 195, 195) ................ ................ } -# tile 128 (bat) +# tile 255 (Archon,female) +{ + ................ + ......OOOO...... + .....OOOOOO..... + .....OJLLJO..... + .....OLLLLO..... + ....OOJLLJOO.... + ......AJJA...... + .....AAAAAAA.... + ....AAAAAAAAA... + ...OAAOAAAJLJ... + ..OOAOAAAACJC... + ....LAAAACCJCC.. + .....AAAAAJJJ... + ....AAAAAAAA.... + ................ + ................ +} +# tile 256 (bat,male) { ................ ................ @@ -2478,7 +4910,26 @@ Z = (195, 195, 195) ................ ................ } -# tile 129 (giant bat) +# tile 257 (bat,female) +{ + ................ + ................ + ................ + ................ + ...JJJCACJJJ.... + ..JJAAHJHAAJJ... + ..JA...JA..AJ... + ................ + ................ + ......AAAA...... + ....AAAAAAAA.... + ...AAA.AA.AAA... + .......AA....... + ................ + ................ + ................ +} +# tile 258 (giant bat,male) { ................ ................ @@ -2497,7 +4948,26 @@ Z = (195, 195, 195) ................ ................ } -# tile 130 (raven) +# tile 259 (giant bat,female) +{ + ................ + ................ + ................ + ...JK.J.J.JK.... + ..KJJJCACJJKJ... + .JJJAAHJHAAJJK.. + .KJA...JA..AJJ.. + ..JA.......AJ... + ................ + .....AAAAAA..... + ...AAAAAAAAAA... + ..AAAA.AA.AAAA.. + .......AA....... + ................ + ................ + ................ +} +# tile 260 (raven,male) { ..AAAA...AAA.... .AAAAAA.AAA..... @@ -2516,7 +4986,26 @@ Z = (195, 195, 195) ................ ................ } -# tile 131 (vampire bat) +# tile 261 (raven,female) +{ + ..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 262 (vampire bat,male) { ................ ................ @@ -2535,7 +5024,26 @@ Z = (195, 195, 195) ................ ................ } -# tile 132 (plains centaur) +# tile 263 (vampire bat,female) +{ + ................ + ................ + ................ + ...AA.A.A.AA.... + ..AAAAAAAAAAA... + .AAAA.DAD.AAAA.. + .AAA...A...AAA.. + ..A.........A... + ................ + .....AAAAAA..... + ...AAAAAAAAAA... + ..AAAA.AA.AAAA.. + .......AA....... + ................ + ................ + ................ +} +# tile 264 (plains centaur,male) { ................ ...KKA.......... @@ -2554,7 +5062,26 @@ Z = (195, 195, 195) ....CA...C...... ................ } -# tile 133 (forest centaur) +# tile 265 (plains centaur,female) +{ + ................ + ...KKA.......... + ...LLAA......... + .AAKKAA......... + .LLAALLA........ + LALLLLALA....... + LALLLKALA.A..... + ..LKLKAAAAA..... + ..KLKJKJJKAA.... + .KJKJKJKJAKAAAA. + .KAKJJJJKJAAA.A. + .KAAKAAAAKAA.... + ..CAKAAJAKA..... + ....KAAKAK...... + ....CA...C...... + ................ +} +# tile 266 (forest centaur,male) { ................ ................ @@ -2573,7 +5100,26 @@ Z = (195, 195, 195) ....CA...C...... ................ } -# tile 134 (mountain centaur) +# tile 267 (forest centaur,female) +{ + ................ + ................ + ................ + ...KKA.......... + LA.LLAALA....... + LAALLAALA....... + .LLAALLA........ + ..LLLLA.A....... + ..LKLKAAAAA..... + ..KLKJKJJKAA.... + .KJKJKJKJAKA.A.. + .KAKJJJJKJAAAA.. + .KAAKAAJAKA..... + ..C.KAAKAK...... + ....CA...C...... + ................ +} +# tile 268 (mountain centaur,male) { ................ ................ @@ -2592,7 +5138,26 @@ Z = (195, 195, 195) ....CA...C...... ................ } -# tile 135 (baby gray dragon) +# tile 269 (mountain centaur,female) +{ + ................ + ................ + ...KKA.......... + ...LLAA......... + ..AKKAA......... + .LJJJJLA........ + LAJKKJALA.A..... + LAKKKKALAAA..... + ..JJJJKJJKAA.... + .KJJJKJKJAKAAAA. + .KAKJJJJKJAAA.A. + .KAAKAAAAKAA.... + ..CAKAAJAKA..... + ....KAAKAK...... + ....CA...C...... + ................ +} +# tile 270 (baby gray dragon,male) { ................ ................ @@ -2611,7 +5176,26 @@ Z = (195, 195, 195) .....BPAA..PPAA. ...........PAA.. } -# tile 136 (baby silver dragon) +# tile 271 (baby gray dragon,female) +{ + ................ + ................ + ................ + .....BBBA....... + ....NPNPPA...... + ...BPPPPPA...... + ..CHHPABPA.AAA.. + .CHCDA.BPAAAAAA. + ..D..BPPAAAAAAA. + ....BBPPPPPAAAA. + ...BOOPPPPPPAAA. + ..BPOBPPPPPPPAA. + ..BPPBPPOBPAPPA. + ..BPABP.ABPAPPA. + .....BPAA..PPAA. + ...........PAA.. +} +# tile 272 (baby silver dragon,male) { ................ ................ @@ -2630,7 +5214,26 @@ Z = (195, 195, 195) .....PBAA..BBAA. ...........BAA.. } -# tile 137 (baby shimmering dragon) +# tile 273 (baby silver dragon,female) +{ + ................ + ................ + ................ + .....PPPA....... + ....OBOBBA...... + ...PBBBBBA...... + ..CHHBAPBA.AAA.. + .CHCDA.PBAAAAAA. + ..D..PBBAAAAAAA. + ....PPBBBBBAAAA. + ...PNNBBBBBBAAA. + ..PBNPBBBBBBBAA. + ..PBBPBBNPBABBA. + ..PBAPB.APBABBA. + .....PBAA..BBAA. + ...........BAA.. +} +# tile 274 (baby shimmering dragon,male) { .I.............. ...BBBBBBB.I.... @@ -2649,7 +5252,26 @@ Z = (195, 195, 195) B....BPAA..PPAAB .B.........PAAB. } -# tile 138 (baby red dragon) +# tile 275 (baby shimmering dragon,female) +{ + .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 276 (baby red dragon,male) { ................ ................ @@ -2668,7 +5290,26 @@ Z = (195, 195, 195) .....IDAA..DDAA. ...........DAA.. } -# tile 139 (baby white dragon) +# tile 277 (baby red dragon,female) +{ + ................ + ................ + ................ + .....IIIA....... + ....NDNDDA...... + ...IDDDDDA...... + ..CHHDAIDA.AAA.. + .CHCDA.IDAAAAAA. + ..D..IDDAAAAAAA. + ....IIDDDDDAAAA. + ...IHHDDDDDDAAA. + ..IDHIDDDDDDDAA. + ..IDDIDDHIDADDA. + ..IDAID.AIDADDA. + .....IDAA..DDAA. + ...........DAA.. +} +# tile 278 (baby white dragon,male) { ................ ................ @@ -2687,7 +5328,26 @@ Z = (195, 195, 195) .....NOAA..OOAA. ...........OAA.. } -# tile 140 (baby orange dragon) +# tile 279 (baby white dragon,female) +{ + ................ + ................ + ................ + .....NNNA....... + ....IOIOOA...... + ...NOOOOOA...... + ..CHHOANOA.AAA.. + .CHCDA.NOAAAAAA. + ..D..NOOAAAAAAA. + ....NNOOOOOAAAA. + ...NOOOOOOOOAAA. + ..NOONOOOOOOOAA. + ..NOONOOONOAOOA. + ..NOANO.ANOAOOA. + .....NOAA..OOAA. + ...........OAA.. +} +# tile 280 (baby orange dragon,male) { ................ ................ @@ -2706,7 +5366,26 @@ Z = (195, 195, 195) .....LCAA..CCAA. ...........CAA.. } -# tile 141 (baby black dragon) +# tile 281 (baby orange dragon,female) +{ + ................ + ................ + ................ + .....LLLA....... + ....NCNCCA...... + ...LCCCCCA...... + ..CHHCALCA.AAA.. + .CHCDA.LCAAAAAA. + ..D..LCCAAAAAAA. + ....LLCCCCCAAAA. + ...LOOCCCCCCAAA. + ..LCOLCCCCCCCAA. + ..LCCLCCOLCACCA. + ..LCALC.ALCACCA. + .....LCAA..CCAA. + ...........CAA.. +} +# tile 282 (baby black dragon,male) { ................ ................ @@ -2725,7 +5404,26 @@ Z = (195, 195, 195) .....AAP...AAPP. ...........APP.. } -# tile 142 (baby blue dragon) +# tile 283 (baby black dragon,female) +{ + ................ + ................ + ................ + .....AAA........ + ....NANAA....... + ...AAAAAA....... + ..CHHA.AA..PPP.. + .CHCD..AA.PPPPP. + ..D..AAAPPP.PPP. + ....AAAAAAAPPPP. + ...AAAAAAAAAPPP. + ..AAAAAAAAAAAPP. + ..AAAAAAAAAPAAP. + ..AAPAA.PAAPAAP. + .....AAP...AAPP. + ...........APP.. +} +# tile 284 (baby blue dragon,male) { ................ ................ @@ -2744,7 +5442,26 @@ Z = (195, 195, 195) .....BEAA..EEAA. ...........EAA.. } -# tile 143 (baby green dragon) +# tile 285 (baby blue dragon,female) +{ + ................ + ................ + ................ + .....BBBA....... + ....NENEEA...... + ...BEEEEEA...... + ..CHHEABEA.AAA.. + CCHCDA.BEAAAAAA. + ..D..BEEAAAAAAA. + ....BBEEEEEAAAA. + ...BOOEEEEEEAAA. + ..BEOBEEEEEEEAA. + ..BEEBEEOBEAEEA. + ..BEABE.ABEAEEA. + .....BEAA..EEAA. + ...........EAA.. +} +# tile 286 (baby green dragon,male) { ................ ................ @@ -2763,7 +5480,26 @@ Z = (195, 195, 195) .....GFAA..FFAA. ...........FAA.. } -# tile 144 (baby yellow dragon) +# tile 287 (baby green dragon,female) +{ + ................ + ................ + ................ + .....GGGA....... + ....NFNFFA...... + ...GFFFFFA...... + ..CHHFAGFA.AAA.. + .CHCDA.GFAAAAAA. + ..D..GFFAAAAAAA. + ....GGFFFFFAAAA. + ...GOOFFFFFFAAA. + ..GFOGFFFFFFFAA. + ..GFFGFFOGFAFFA. + ..GFAGF.AGFAFFA. + .....GFAA..FFAA. + ...........FAA.. +} +# tile 288 (baby yellow dragon,male) { ................ ................ @@ -2782,7 +5518,26 @@ Z = (195, 195, 195) .....NHAA..HHAA. ...........HAA.. } -# tile 145 (gray dragon) +# tile 289 (baby yellow dragon,female) +{ + ................ + ................ + ................ + .....NNNA....... + ....DHDHHA...... + ...NHHHHHA...... + ..CHHHANHA.AAA.. + .CHCDA.NHAAAAAA. + ..D..NHHAAAAAAA. + ....NNHHHHHAAAA. + ...NOOHHHHHHAAA. + ..NHONHHHHHHHAA. + ..NHHNHHONHAHHA. + ..NHANH.ANHAHHA. + .....NHAA..HHAA. + ...........HAA.. +} +# tile 290 (gray dragon,male) { ......BBBPA..... .....NPNPPPA.... @@ -2801,7 +5556,26 @@ Z = (195, 195, 195) ....BPAA...PP.A. ........PPPP.A.. } -# tile 146 (silver dragon) +# tile 291 (gray dragon,female) +{ + ......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 292 (silver dragon,male) { ......PPPBA..... .....OBOBBBA.... @@ -2820,7 +5594,26 @@ Z = (195, 195, 195) ....PBAA...BB.A. ........BBBB.A.. } -# tile 147 (shimmering dragon) +# tile 293 (silver dragon,female) +{ + ......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 294 (shimmering dragon,male) { .I.BF.BBBPAFB... ..BF.NPNPPPAFB.I @@ -2839,7 +5632,26 @@ Z = (195, 195, 195) ....BPAA...PP.AB ........PPPP.AB. } -# tile 148 (red dragon) +# tile 295 (shimmering dragon,female) +{ + .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 296 (red dragon,male) { ......IIIDA..... .....NDNDDDA.... @@ -2858,7 +5670,26 @@ Z = (195, 195, 195) ....IDAAJJJDDJA. ........DDDDJA.. } -# tile 149 (white dragon) +# tile 297 (red dragon,female) +{ + ......IIIDA..... + .....NDNDDDA.... + ....IDDDDDDA.... + ..DCHHD..DDA.... + CHCHCD..IDDA.... + HD.D...IDDA..... + ......HIDAAAAAA. + ....IHIDAAAAAAAA + ..IHHIDAJDDJAAA. + .IHHHIDDDDDDJAA. + .IHHHIDDDDDDDAA. + DDHHIIDDDDDDDDA. + ID.HIDDHHDDJDJA. + IDAAID.AADDADDA. + ....IDAAJJJDDJA. + ........DDDDJA.. +} +# tile 298 (white dragon,male) { ......NNNOA..... .....IOIOOOA.... @@ -2877,7 +5708,26 @@ Z = (195, 195, 195) ....NOAA...OOJA. ........OOOOJA.. } -# tile 150 (orange dragon) +# tile 299 (white dragon,female) +{ + ......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 300 (orange dragon,male) { ......LLLCA..... .....NCNCCCA.... @@ -2896,7 +5746,26 @@ Z = (195, 195, 195) ....LCAA.KKCCJA. ........CCCCJA.. } -# tile 151 (black dragon) +# tile 301 (orange dragon,female) +{ + ......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 302 (black dragon,male) { ......AAAA...... .....NANAAA..... @@ -2915,7 +5784,26 @@ Z = (195, 195, 195) ....AAPP...AAAP. ........AAAAA... } -# tile 152 (blue dragon) +# tile 303 (black dragon,female) +{ + ......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 304 (blue dragon,male) { ......BBBEA..... .....NENEEEA.... @@ -2934,7 +5822,26 @@ Z = (195, 195, 195) ....BEAA...EEJA. ...P....EEEEJA.. } -# tile 153 (green dragon) +# tile 305 (blue dragon,female) +{ + ......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 306 (green dragon,male) { ......GGGFA..... .....NFNFFFA.... @@ -2953,7 +5860,26 @@ Z = (195, 195, 195) ....GFAA...FFJA. ........FFFFJA.. } -# tile 154 (yellow dragon) +# tile 307 (green dragon,female) +{ + ......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 308 (yellow dragon,male) { ......NNNHA..... .....DHDHHHA.... @@ -2972,7 +5898,26 @@ Z = (195, 195, 195) ....NHAAJJJHHJA. ........HHHHJA.. } -# tile 155 (stalker) +# tile 309 (yellow dragon,female) +{ + ......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...... @@ -2991,7 +5936,26 @@ Z = (195, 195, 195) .....PP..PP..... ................ } -# tile 156 (air elemental) +# tile 311 (stalker,female) +{ + ................ + .......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 312 (air elemental,male) { ................ ...P.PPP..P..... @@ -3010,7 +5974,26 @@ Z = (195, 195, 195) ...PP.APPPA..... ................ } -# tile 157 (fire elemental) +# tile 313 (air elemental,female) +{ + ................ + ...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 314 (fire elemental,male) { ................ .H..LDDD........ @@ -3029,7 +6012,26 @@ Z = (195, 195, 195) ..LDDCADDDA..... ................ } -# tile 158 (earth elemental) +# tile 315 (fire elemental,female) +{ + ................ + .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 316 (earth elemental,male) { ..F............. ....CKKK..F..... @@ -3048,7 +6050,26 @@ Z = (195, 195, 195) ..CKKJAKKKA..... ................ } -# tile 159 (water elemental) +# tile 317 (earth elemental,female) +{ + ..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 318 (water elemental,male) { ................ ....PBBB..E..... @@ -3067,7 +6088,26 @@ Z = (195, 195, 195) ..PBBEABBBA..... ................ } -# tile 160 (lichen) +# tile 319 (water elemental,female) +{ + ................ + ....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 320 (lichen,male) { ................ ................ @@ -3086,7 +6126,26 @@ Z = (195, 195, 195) ................ ................ } -# tile 161 (brown mold) +# tile 321 (lichen,female) +{ + ................ + ................ + ...FFF...FFF.... + ..FCFFFFFCCFA... + .FCOOFFFCOFFFA.. + .FCOOFFFCFFFFA.. + ..FFFFFFFFFFA... + ...AFFFCCFFFA... + ...FFFFCOFFAA... + ..FCCFFCOFCFA... + ..FCOFFCFFOCFA.. + ..FFCFFFCFFFFA.. + ...FFFAAFFFFFA.. + .....AA.AAAAA... + ................ + ................ +} +# tile 322 (brown mold,male) { ................ ................ @@ -3105,7 +6164,26 @@ Z = (195, 195, 195) ................ ................ } -# tile 162 (yellow mold) +# tile 323 (brown mold,female) +{ + ................ + ................ + ...JJJ...JJJ.... + ..JKJJJJJKKJA... + .JKCCJJJKCJJJA.. + .JKCCJJJKJJJJA.. + ..JJJJJJJJJJA... + ...AJJJKKJJJA... + ...JJJJKCJJAA... + ..JKKJJKCJKJA... + ..JKCJJKJJCKJA.. + ..JJKJJJKJJJJA.. + ...JJJAAJJJJJA.. + .....AA.AAAAA... + ................ + ................ +} +# tile 324 (yellow mold,male) { ................ ................ @@ -3124,7 +6202,26 @@ Z = (195, 195, 195) ................ ................ } -# tile 163 (green mold) +# tile 325 (yellow mold,female) +{ + ................ + ................ + ...HHH...HHH.... + ..HHHHHHHNHHA... + .HHNNOHHNNOHHA.. + .HHNNOOHHOOHHA.. + ..HHOOHHHHHHA... + ...AHHHHHHHHA... + ...HHHHNNOHAA... + ..HHHHHNNOHHA... + ..HNNOHHHONOHA.. + ..HHOHHHHHOOHA.. + ...HHHAAHHHHHA.. + .....AA.AAAAA... + ................ + ................ +} +# tile 326 (green mold,male) { ................ ................ @@ -3143,7 +6240,26 @@ Z = (195, 195, 195) ................ ................ } -# tile 164 (red mold) +# tile 327 (green mold,female) +{ + ................ + ................ + ...FFF...FFF.... + ..FGFFFFFGGFA... + .FGOOFFFGOFFFA.. + .FGOOFFFGFFFFA.. + ..FFFFFFFFFFA... + ...AFFFGGFFFA... + ...FFFFGOFFAA... + ..FGGFFGOFGFA... + ..FGOFFGFFOGFA.. + ..FFGFFFGFFFFA.. + ...FFFAAFFFFFA.. + .....AA.AAAAA... + ................ + ................ +} +# tile 328 (red mold,male) { ................ ................ @@ -3162,7 +6278,26 @@ Z = (195, 195, 195) ................ ................ } -# tile 165 (shrieker) +# tile 329 (red mold,female) +{ + ................ + ................ + ...DDD...DDD.... + ..DCDDDDDCCDA... + .DLLCDDDCLDDDA.. + .DCCCDDDCDDDDA.. + ..DDDDDDDDDDA... + ...ADDDCCDDDA... + ...DDDDCLDDAA... + ..DCCDDCLDCDA... + ..DCLDDCDDLCDA.. + ..DDCDDDCDDDDA.. + ...DDDAADDDDDA.. + .....AA.AAAAA... + ................ + ................ +} +# tile 330 (shrieker,male) { ................ ................ @@ -3181,7 +6316,26 @@ Z = (195, 195, 195) ...AAAAAAAAAA... ................ } -# tile 166 (violet fungus) +# tile 331 (shrieker,female) +{ + ................ + ................ + ................ + ................ + .....GGGGFF..... + ...GGGGIGIDFF... + .GGGIIGGGIIFFFF. + GIIGIIGGGGGGGDDF + GIIGGGGIIGIIGIDF + GGGGIGGIIGIIGGFF + ..GGGGGGGGGGG... + ......FFF..AAAAA + ....AGGGFFAAAAAA + ...AGGGGGGFAAAA. + ...AAAAAAAAAA... + ................ +} +# tile 332 (violet fungus,male) { ................ ................ @@ -3200,7 +6354,26 @@ Z = (195, 195, 195) ................ ................ } -# tile 167 (gnome) +# tile 333 (violet fungus,female) +{ + ................ + ................ + ...III...III.... + ..ILIIIIILLIA... + .IOOLIIILOIIIA.. + .ILLLIIILIIIIA.. + ..IIIIIIIIIIA... + ...AIIILLIIIA... + ...IIIILOIIAA... + ..ILLIILOILIA... + ..ILOIILIIOLIA.. + ..IILIIILIIIIA.. + ...IIIAAIIIIIA.. + .....AA.AAAAA... + ................ + ................ +} +# tile 334 (gnome,male) { ................ ................ @@ -3219,7 +6392,26 @@ Z = (195, 195, 195) ................ ................ } -# tile 168 (gnome lord) +# tile 335 (gnome,female) +{ + ................ + ................ + ................ + .....DF......... + ......G......... + .....GFF........ + ....GGFFF....... + ....GLLLF....... + .....OLO...AAA.. + ...FGOOOFFAAAA.. + ...GAGOFAFAAAA.. + ....LKNKFAAAA... + ....FGAFFAA..... + ....GFAFG.A..... + ................ + ................ +} +# tile 336 (gnome leader,male) { ................ ................ @@ -3238,7 +6430,26 @@ Z = (195, 195, 195) ................ ................ } -# tile 169 (gnomish wizard) +# tile 337 (gnome leader,female) +{ + ................ + ................ + ......D......... + ......G......... + ......G......... + .....GFF........ + ....HHHHH....... + ....GLLLF.....A. + .....OLO...AAA.. + ...FGOOOFFAAAA.. + ...GAGOFAFAAAA.. + ....LKNKFAAAA... + ....FGAFFAA..... + ....GFAFG.A..... + ................ + ................ +} +# tile 338 (gnomish wizard,male) { ................ ................ @@ -3257,7 +6468,26 @@ Z = (195, 195, 195) ................ ................ } -# tile 170 (gnome king) +# tile 339 (gnomish wizard,female) +{ + ................ + ................ + ................ + ................ + ......G......... + .....GFF........ + ....GGFFF....... + ....GLLLF....... + ...FFOLOFF.AAA.. + ...GFOOOFFAAAA.. + ...FAGOFAFAAAA.. + ...GLKNKFFAAA... + ...FFGFFFFA..... + ...GFFFFGFA..... + ................ + ................ +} +# tile 340 (gnome ruler,male) { ................ ................ @@ -3276,7 +6506,26 @@ Z = (195, 195, 195) ................ ................ } -# tile 171 (giant) +# tile 341 (gnome ruler,female) +{ + ................ + ................ + ................ + ................ + ....H.C.H....... + ....HCHCH....... + ....HHHHH....... + ....GLLLF...A... + .....OLO...AAAA. + ...FGOOOFFAAAA.. + ...GAGOFAFAAAA.. + ....LKNKFAAAA... + ....FGAFFAA..... + ....GFAFG.A..... + ................ + ................ +} +# tile 342 (giant,male) { ......JJJJAA.... ....JJJJJJJJA... @@ -3295,7 +6544,26 @@ Z = (195, 195, 195) .....CLJACLJAAAA ...LLLLJ.CLLLKAA } -# tile 172 (stone giant) +# tile 343 (giant,female) +{ + ......JJJJAA.... + ....JJJJJJJJA... + ....JJLLLLJJA... + ....JFFLLFFJA... + ....JLLLLLLJA... + ....ALLAALLAAA.. + .....ALLLLJAAAA. + ..CCLLJJJJLLCCAA + .CLLLCCKCKCLLLCA + .LLLKLKCKCLKLLLA + .LLAALLCCLLAALLA + .LLAAJJJKKJAALLA + .CLC.JJJJJKKCLAA + ..LL.CLJACLJLLAA + .....CLJACLJAAAA + ...LLLLJ.CLLLKAA +} +# tile 344 (stone giant,male) { ......JJJJAA.... ....JJJJJJJJA... @@ -3314,7 +6582,26 @@ Z = (195, 195, 195) .....ALJACLJAAAA ...LLLLJ.CLLLKAA } -# tile 173 (hill giant) +# tile 345 (stone giant,female) +{ + ......JJJJAA.... + ....JJJJJJJJA... + ....JJLLLLJJA... + ....JFFLLFFJA... + ....JLLLLLLJA... + ....ALLAALLAAA.. + .....ALLLLJAAAA. + ..CCLLJJJJLLCCAA + .CLLLCCKCKCLLLCA + .LLLAAKCKCLKLLLA + .LLPPPACCLLAALLA + .LLPPPPAKKJAALLA + .CLCPPPAJJKKCLAA + ..LLPPALACLJLLAA + .....ALJACLJAAAA + ...LLLLJ.CLLLKAA +} +# tile 346 (hill giant,male) { ......JJJJAA.... ....JJJJJJJJA... @@ -3333,7 +6620,26 @@ Z = (195, 195, 195) .....CLJACLJAAAA ...LLLLJ.LLLLKAA } -# tile 174 (fire giant) +# tile 347 (hill giant,female) +{ + ......JJJJAA.... + ....JJJJJJJJA... + ....JJLLLLJJA... + ....JFFLLFFJA... + ....JLLLLLLJA... + ....ALLAALLAAA.. + .....ALLLLJAAAA. + ...JJKJJJJJJJAA. + ..LJJCCKCKCJJLA. + ..JLKKKCKCKKLJA. + ..LAAKKCCKJAALAA + ..LAAJJJKKJAALAA + ..LC.JJJJJKKCLAA + ..LL.CLJACLJLLAA + .....CLJACLJAAAA + ...LLLLJ.LLLLKAA +} +# tile 348 (fire giant,male) { ....PPDDDDAA.... ....PDDDDDDDA... @@ -3352,7 +6658,26 @@ Z = (195, 195, 195) .....CLJACLJAAAA ...LLLLJ.LLLLKAA } -# tile 175 (frost giant) +# tile 349 (fire giant,female) +{ + ....PPDDDDAA.... + ....PDDDDDDDA... + ...PPDLLLLDDA... + ...PDPFLLFFDA... + ...PPPLLLLLDA... + ....PLLAALLAAA.. + ...PPALLLLJAAAA. + ...JPDJJJJJJJAA. + ..LDDHDKCKCJJLA. + ..JLHDDCKCKKLJA. + ..LAHDHCCKJAALAA + JLAADDHJKKJAALAA + JJLJDHHJJJKKCLAA + ..LLJJJJACLJLLAA + .....CLJACLJAAAA + ...LLLLJ.LLLLKAA +} +# tile 350 (frost giant,male) { .....KJJJJAA.... ....KJJJJJJJA... @@ -3371,7 +6696,26 @@ Z = (195, 195, 195) .....CLJACLJAAAA ...LLLLJ.CLLLKAA } -# tile 176 (ettin) +# tile 351 (frost giant,female) +{ + .....KJJJJAA.... + ....KJJJJJJJA... + ....JJLLLLJJA... + ....JEELLEEJA... + ....JLLLLLLJA... + ....AKJJJJJAAA.. + .....KJAAJJAAAA. + ....KKJJJJAJAAAA + ...KJKJJJJAJJAAA + ..KJKKJJJJJKJJAA + ..KAAJKJJAJAAJAA + ..JAAJKKAKJAAJAA + ..LC.JJJJJKKCLAA + ..LL.CJJAJLJLLAA + .....CLJACLJAAAA + ...LLLLJ.CLLLKAA +} +# tile 352 (ettin,male) { ....NN..ONOP.... ..NNOOPNNOOPP... @@ -3390,7 +6734,26 @@ Z = (195, 195, 195) .....BPAABPAAAAA ...PPPPA.BPPPFAA } -# tile 177 (storm giant) +# tile 353 (ettin,female) +{ + ....NN..ONOP.... + ..NNOOPNNOOPP... + ..NPP..NPP..P... + ..ALPPLALPPLA... + ..APPPPAPPPPA... + ..APAAPAPAAPAA.. + ..APPPPAPPPPAAA. + ..BIIIIJJJIIIBAA + .BPPPIIIIIIPPPBA + .PPPFPIIIIPFPPPA + .PPAAPIIIIPAAPPA + .PPAAIIIIIIAAPPA + .BPB.IIFFIIABPAA + ..PP.BPAABPAPPAA + .....BPAABPAAAAA + ...PPPPA.BPPPFAA +} +# tile 354 (storm giant,male) { ......JJJJAA.... ....JJJJJJJJA... @@ -3409,7 +6772,26 @@ Z = (195, 195, 195) .....CLJACCJAAAA ...LLLLJ.LLLLKAA } -# tile 178 (titan) +# tile 355 (storm giant,female) +{ + ......JJJJAA.... + ....JJJJJJJJA... + ....JJLLLLJJA... + ....JFFLLFFJA... + ....JLLLLLLJA... + ....ALLAALLAAH.. + .....ALLLLJAHAA. + ...JJKJJJJJHHAA. + ..LJJCCKCKHHLAA. + ..JLKKKCKHHHHHH. + ..LAAKKCCKJAHHAA + ..LAAJJJKKJHHALA + ..LC.JJJJJKHAAAA + ..LL.CLJACHAAAAA + .....CLJACCJAAAA + ...LLLLJ.LLLLKAA +} +# tile 356 (titan,male) { .....AAAAAAA.... ....AALLLLAAA... @@ -3428,7 +6810,26 @@ Z = (195, 195, 195) .....CLJACLJAAAA ...LLLLJ.CLLLKAA } -# tile 179 (minotaur) +# tile 357 (titan,female) +{ + .....AAAAAAA.... + ....AALLLLAAA... + ....A..LL..AA... + ....ALLLLLLAA... + ....ALLAALLAAA.. + .....ALLLLJAAAA. + ..CCJJJJJJJJCCA. + .CLLLCCKCKCLLLCA + .LLLKJKCKCJKLLLA + .LLAAJJCCJJAALLA + .LLAAJJCCJJAALLA + .LLAAJJJKKJAALLA + .CLC.JJJJJKKCLAA + ..LL.CLJACLJLLAA + .....CLJACLJAAAA + ...LLLLJ.CLLLKAA +} +# tile 358 (minotaur,male) { ................ .O..........O... @@ -3447,7 +6848,26 @@ Z = (195, 195, 195) ....CLCACLCAAAAA ..LLLLL.LLLLLAA. } -# tile 180 (jabberwock) +# tile 359 (minotaur,female) +{ + ................ + .O..........O... + .OOOJJJJJJOOO... + ..OOJJKJJJOO.... + ...JGAKJGAJA.... + ...JJJKJJJJA.... + ....JJKJJJAAA... + ....JKKKJAAAA... + ..CLJAJAKALCAA.A + .CLLJJJJJALLCAAA + .LLCLAAAALCLLAA. + .LAACLLLLCAALAA. + .LL.JJJJJJJLLAAA + .LL.JJJJJJJLLAAA + ....CLCACLCAAAAA + ..LLLLL.LLLLLAA. +} +# tile 360 (jabberwock,male) { ................ ...DP........... @@ -3466,7 +6886,26 @@ Z = (195, 195, 195) ...IDAA..ID..... ................ } -# tile 181 (vorpal jabberwock) +# tile 361 (jabberwock,female) +{ + ................ + ...DP........... + ....DP.ADOO..... + ..DAIDADIPAD.... + ...DIAPIPA...... + ...DBDDDA....... + ..IBBDADDA..AA.. + .DDDDAODDIAAAA.. + ..OAOA.DDAIAAA.. + ..IOAODDAAADDAA. + ..DDDADDDDAIDA.. + ...AAADDIDIDDD.. + ....IDDAIDDDDA.. + ....IDAAIDAA.... + ...IDAA..ID..... + ................ +} +# tile 362 (vorpal jabberwock,male) { ................ ...GP........... @@ -3485,7 +6924,26 @@ Z = (195, 195, 195) ...FGAA..FG..... ................ } -# tile 182 (Keystone Kop) +# tile 363 (vorpal jabberwock,female) +{ + ................ + ...GP........... + ....GP.AGOO..... + ..GAFGAGFPAG.... + ...GFAPFPA...... + ...GHGGGA....... + ..FHHGAGGA..AA.. + .GGGGAOGGFAAAA.. + ..OAOA.GGAFAAA.. + ..FOAOGGAAAGGAA. + ..GGGAGGGGAFGA.. + ...AAAGGFGFGGG.. + ....FGGAFGGGGA.. + ....FGAAFGAA.... + ...FGAA..FG..... + ................ +} +# tile 364 (Keystone Kop,male) { ................ ....AA.......... @@ -3504,7 +6962,26 @@ Z = (195, 195, 195) ..AA....AA...... ................ } -# tile 183 (Kop Sergeant) +# tile 365 (Keystone Kop,female) +{ + ................ + ....AA.......... + ...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.......... @@ -3523,7 +7000,26 @@ Z = (195, 195, 195) ..AA....AA...... ................ } -# tile 184 (Kop Lieutenant) +# 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.......... @@ -3542,7 +7038,26 @@ Z = (195, 195, 195) ..AA....AA...... ................ } -# tile 185 (Kop Kaptain) +# tile 369 (Kop Lieutenant,female) +{ + ................ + ....AA.......... + ...AOOA...C..... + ...AOOA...C..... + ..AAAAAA..C..... + ...LLLL...C..... + ....LL....C..... + ..OAAAO.AAA..... + .OAAAAA.AAC.P... + .AA.AAAAA.CPPP.. + ..AAAAAA.PPPPPP. + ....AAAAPPPAPP.. + .A.AAAAAAPAAA... + AAAAA.PAAAAA.... + ..AA....AA...... + ................ +} +# tile 370 (Kop Kaptain,male) { ................ ....AA....C..... @@ -3561,7 +7076,26 @@ Z = (195, 195, 195) ..AA....AA...... ................ } -# tile 186 (lich) +# tile 371 (Kop Kaptain,female) +{ + ................ + ....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 372 (lich,male) { ................ ................ @@ -3580,7 +7114,26 @@ Z = (195, 195, 195) ......OOO....... ................ } -# tile 187 (demilich) +# tile 373 (lich,female) +{ + ................ + ................ + ...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 374 (demilich,male) { ................ ................ @@ -3599,7 +7152,26 @@ Z = (195, 195, 195) ......LLL....... ................ } -# tile 188 (master lich) +# tile 375 (demilich,female) +{ + ................ + ................ + ...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 376 (master lich,male) { ...H............ ...HCH.H........ @@ -3618,7 +7190,26 @@ Z = (195, 195, 195) ......OOO....... ................ } -# tile 189 (arch-lich) +# tile 377 (master lich,female) +{ + ...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 378 (arch-lich,male) { ................ ................ @@ -3637,7 +7228,26 @@ Z = (195, 195, 195) ......OOO....... ................ } -# tile 190 (kobold mummy) +# tile 379 (arch-lich,female) +{ + ................ + ................ + ...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 380 (kobold mummy,male) { ................ ................ @@ -3656,7 +7266,26 @@ Z = (195, 195, 195) ................ ................ } -# tile 191 (gnome mummy) +# tile 381 (kobold mummy,female) +{ + ................ + ................ + ................ + ...N...N........ + ...NONONO....... + ...OAOAO.OP..... + ....ONN...A..... + ...ONODNA.AA.... + ..OLONNONAAA.A.. + ..NALONANAAAAA.. + ..NAOLOAOAAAAA.. + ....NOLAAAAAA... + ....NANAAAA..... + ...OOANOA....... + ................ + ................ +} +# tile 382 (gnome mummy,male) { ................ ................ @@ -3675,7 +7304,26 @@ Z = (195, 195, 195) ................ ................ } -# tile 192 (orc mummy) +# tile 383 (gnome mummy,female) +{ + ................ + ................ + ................ + ................ + ......G......... + .....GGFO....... + ....GGFFOOP..... + ....GDODF....... + .....ONO...AAA.. + ...NONOONOAAAA.. + ...OANLOAOAAAA.. + ....NNOLOAAAA... + ....NOANDAA..... + ....NOAOO.A..... + ................ + ................ +} +# tile 384 (orc mummy,male) { ................ ................ @@ -3694,7 +7342,26 @@ Z = (195, 195, 195) ................ ................ } -# tile 193 (dwarf mummy) +# tile 385 (orc mummy,female) +{ + ................ + ................ + ................ + .....OA......... + ....NOOP........ + ....DODPOP...... + ....OOOA........ + ..OOOOOOOA.AA... + ..OOOOOOO.AAA... + ..OAOOOAACCC.... + ..OAOOOCCAAA.... + ....OCCOAAAAAA.. + ...CCAOOAAAA.... + ..OOOAOOOA...... + ................ + ................ +} +# tile 386 (dwarf mummy,male) { ................ ................ @@ -3713,7 +7380,26 @@ Z = (195, 195, 195) ................ ................ } -# tile 194 (elf mummy) +# tile 387 (dwarf mummy,female) +{ + ................ + ................ + ................ + ................ + ......B......... + .....BBEO....... + ....BBEEEOP..... + ....BDODE....... + .....ONO...AAA.. + ...NONOONOAAAA.. + ...OANLOAOAAAA.. + ....NNOLOAAAA... + ....NOANDAA..... + ....NOAOO.A..... + ................ + ................ +} +# tile 388 (elf mummy,male) { ................ ................ @@ -3732,7 +7418,26 @@ Z = (195, 195, 195) ................ ................ } -# tile 195 (human mummy) +# tile 389 (elf mummy,female) +{ + ................ + ................ + .........O...... + .......OOOP..... + ......OOOOP..... + ......OEOEAP.... + ......OOOOA..... + ......AOOA....A. + ......OAAO..AAA. + .....OOOOOOAAAA. + ....OALOOLAOAAA. + ....OADOOOAOAA.. + ......OOAOAA.A.. + .....OOA.OOA.... + ................ + ................ +} +# tile 390 (human mummy,male) { ................ ................ @@ -3751,7 +7456,26 @@ Z = (195, 195, 195) ..NNN.NNNA...... ................ } -# tile 196 (ettin mummy) +# tile 391 (human mummy,female) +{ + ................ + ................ + ...ONNO......... + ...NNNNOP....... + ..PANAN.OPP..... + ..PNNNN......... + ..ONOONNP....... + .ONLNNOOO....... + .NJNOOOOO..AAA.. + .OJOOOODN.AAAA.. + .NJOLNOAOAAAAAA. + .OCNO.NKNAAAAA.. + .N.OO.OLAAAAAAA. + ...OOAOOAAA..... + ..NNN.NNNA...... + ................ +} +# tile 392 (ettin mummy,male) { .....NN..ONOO... ...NNOOONNOOOO.. @@ -3770,7 +7494,26 @@ Z = (195, 195, 195) .....NOOANOOAAAA ...OOOOO.OOOOKAA } -# tile 197 (giant mummy) +# tile 393 (ettin mummy,female) +{ + .....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... @@ -3789,7 +7532,26 @@ Z = (195, 195, 195) .....NOOANOOAAAA ...OOOOO.OOOOKAA } -# tile 198 (red naga hatchling) +# tile 395 (giant mummy,female) +{ + ......ONOOAA.... + ....ONNNOOOOA... + ....NNOOOOOOO... + ....NFFOOFFOOP.. + ....NONOOOOOAOP. + ....AONOOOOAAAP. + .....ANOOODAAAA. + ..OOOONOOONNNOAA + .ONNNNNOOOOOOOOA + .ONODNNLOOOOOOOA + .NNAAONOLNOAAOOA + .NOAAONOONLAAOOA + .OOO.ONOONOOOOAA + ..OO.NNOANOLOOAA + .....NOOANOOAAAA + ...OOOOO.OOOOKAA +} +# tile 396 (red naga hatchling,male) { ................ ................ @@ -3808,7 +7570,26 @@ Z = (195, 195, 195) ....IIDDDDDA.... ................ } -# tile 199 (black naga hatchling) +# tile 397 (red naga hatchling,female) +{ + ................ + ................ + ................ + ................ + ....K........... + ...KLK.......... + ...LLLA......... + ...ALAA......... + ...LALA......... + ...LLLA......... + ...LLLAA........ + ...LDLAA........ + ...IDDAAAAADA... + ...IDDDAAADDA... + ....IIDDDDDA.... + ................ +} +# tile 398 (black naga hatchling,male) { ................ ................ @@ -3827,7 +7608,26 @@ Z = (195, 195, 195) ....AAAAAAAA.... ................ } -# tile 200 (golden naga hatchling) +# tile 399 (black naga hatchling,female) +{ + ................ + ................ + ................ + ................ + ....K........... + ...KLK.......... + ...LLLA......... + ...ALAA......... + ...LALA......... + ...LLLA......... + ...LLLA......... + ...LALAA........ + ...AAAPA..PAA... + ...AAAAPPPAAA... + ....AAAAAAAA.... + ................ +} +# tile 400 (golden naga hatchling,male) { ................ ................ @@ -3846,7 +7646,26 @@ Z = (195, 195, 195) ....NNHHHHHA.... ................ } -# tile 201 (guardian naga hatchling) +# tile 401 (golden naga hatchling,female) +{ + ................ + ................ + ................ + ................ + ....K........... + ...KLK.......... + ...LLLA......... + ...ALAA......... + ...LALA......... + ...LLLA......... + ...LLLAA........ + ...LHLAA........ + ...NHHAAAAAHA... + ...NHHHAAAHHA... + ....NNHHHHHA.... + ................ +} +# tile 402 (guardian naga hatchling,male) { ................ ................ @@ -3865,7 +7684,26 @@ Z = (195, 195, 195) ....GGFFFFFA.... ................ } -# tile 202 (red naga) +# tile 403 (guardian naga hatchling,female) +{ + ................ + ................ + ................ + ................ + ....K........... + ...KLK.......... + ...LLLA......... + ...ALAA......... + ...LALA......... + ...LLLA......... + ...LLLAA........ + ...LFLAA........ + ...GFFAAAAAFA... + ...GFFFAAAFFA... + ....GGFFFFFA.... + ................ +} +# tile 404 (red naga,male) { ................ ....KK.......... @@ -3884,7 +7722,26 @@ Z = (195, 195, 195) .....DDAA..DDA.. ..........DA.... } -# tile 203 (black naga) +# tile 405 (red naga,female) +{ + ................ + ....KK.......... + ...KLLK......... + ...LLLLA........ + ...ALLAA........ + ...LAALA........ + ...LLLLA........ + ...LLLDA..AA.... + ...LDLDA.AAAA... + ...IDDDAAAIIA... + ...IDDDAIDDDIDA. + ...IDDDIDDDDDDDA + ...IDDDDDDAA.DDA + ....DDDDDA..DDA. + .....DDAA..DDA.. + ..........DA.... +} +# tile 406 (black naga,male) { ................ ....KK.......... @@ -3903,7 +7760,26 @@ Z = (195, 195, 195) .....AAPP..AAP.. ..........AP.... } -# tile 204 (golden naga) +# tile 407 (black naga,female) +{ + ................ + ....KK.......... + ...KLLK......... + ...LLLLA........ + ...ALLAA........ + ...LAALA........ + ...LLLLA........ + ...LLLAA........ + ...LALAA..PPP... + ...AAAAPPPAAP... + ...AAAAPAAAAAAP. + ...AAAAAAAAAAAAP + ...AAAAAAAPP.AAP + ....AAAAAP..AAP. + .....AAPP..AAP.. + ..........AP.... +} +# tile 408 (golden naga,male) { ................ ....KK.......... @@ -3922,7 +7798,26 @@ Z = (195, 195, 195) .....HHAA..HHA.. ..........HA.... } -# tile 205 (guardian naga) +# tile 409 (golden naga,female) +{ + ................ + ....KK.......... + ...KLLK......... + ...LLLLA........ + ...ALLAA........ + ...LAALA........ + ...LLLLA........ + ...LLLHA..AA.... + ...LHLHA.AAAA... + ...NHHHAAANNA... + ...NHHHANHHHNHA. + ...NHHHNHHHHHHHA + ...NHHHHHHAA.HHA + ....HHHHHA..HHA. + .....HHAA..HHA.. + ..........HA.... +} +# tile 410 (guardian naga,male) { ................ ....KK.......... @@ -3941,7 +7836,26 @@ Z = (195, 195, 195) .....FFAA..FFA.. ..........FA.... } -# tile 206 (ogre) +# tile 411 (guardian naga,female) +{ + ................ + ....KK.......... + ...KLLK......... + ...LLLLA........ + ...ALLAA........ + ..CLAALC........ + ..LLLLLL........ + ..CLLCLC..AA.... + ...CLLCA.AAAA... + ...GLFCAAAGGA... + ...GFFFAAFFFGFA. + ...GFFFGFFFFFFFA + ...GFFFFFFAA.FFA + ....FFFFFA..FFA. + .....FFAA..FFA.. + ..........FA.... +} +# tile 412 (ogre,male) { ................ ................ @@ -3960,7 +7874,26 @@ Z = (195, 195, 195) ....CJJJCLAAAAAA ..LLLLL.LLLLLAA. } -# tile 207 (ogre lord) +# tile 413 (ogre,female) +{ + ................ + ................ + ....CLLLC....... + ..LCKKLKKCL..... + ...LAALAALJA.... + ...CLLLLLCJA.... + ....CAAACJAAA... + ....LDDDLAAAA... + ..CLJLLLKALCAA.A + .CLLAJJJJALLCAAA + .LLCLAAAALCLLAA. + .LAACLLLLCAALAA. + .LC.HHHBHHACLAAA + .LL.JJJJJJALLAAA + ....CJJJCLAAAAAA + ..LLLLL.LLLLLAA. +} +# tile 414 (ogre leader,male) { ................ ................ @@ -3979,7 +7912,26 @@ Z = (195, 195, 195) ....CJJJCLAAAAAA ..LLLLL.LLLLLAA. } -# tile 208 (ogre king) +# tile 415 (ogre leader,female) +{ + ................ + ................ + ....CLLLC....... + ..LCKKLKKCL..... + ...LAALAALJA.... + ...CLLLLLCJA.... + ....CLLLCJAAA... + ....LAAALAAAA... + ..JKJLLLKAKJAA.A + .CLKAJJJJAKLCAAA + .LLJKAAAAKJLLAA. + .LAAJKKKKJAALAA. + .LC.HHHBHHACLAAA + .LL.JJJJJJALLAAA + ....CJJJCLAAAAAA + ..LLLLL.LLLLLAA. +} +# tile 416 (ogre tyrant,male) { ...H..C..H...... ...HDCHCDH...... @@ -3998,7 +7950,26 @@ Z = (195, 195, 195) ....CJJJCLAAAAAA ..LLLLL.LLLLLAA. } -# tile 209 (gray ooze) +# tile 417 (ogre tyrant,female) +{ + ...H..C..H...... + ...HDCHCDH...... + ...HHHHHHH...... + ..LCKKLKKCL..... + ...LAALAALJA.... + ...CLLLLLCJA.... + ....CLLLCJAAA... + ....LAAALAAAA... + ..JKJLLLKAKJAA.A + .CJKAJJJJAKJCAAA + .LJJKAAAAKJJLAA. + .LAAJKKKKJAALAA. + .LC.HHHBHHACLAAA + .LL.JJJJJJALLAAA + ....CJJJCLAAAAAA + ..LLLLL.LLLLLAA. +} +# tile 418 (gray ooze,male) { ................ ................ @@ -4017,7 +7988,26 @@ Z = (195, 195, 195) .........KCCCJ.. ................ } -# tile 210 (brown pudding) +# tile 419 (gray ooze,female) +{ + ................ + ................ + ................ + .....PBPA....... + ...PBBBPBA...... + ..BBNNBPPBAA.... + .BBNNPPPBBPAAA.. + PBBBPPPBPBBAAA.. + BBBPBPPPPPBPAAA. + BBPBPPPPPPPBAAA. + PBPPBPPPBBPPAAA. + .PBBPPPBAAPPPAA. + ...PBBBAAAKPPJ.. + ........ACPPAK.. + .........KCCCJ.. + ................ +} +# tile 420 (brown pudding,male) { ................ ................ @@ -4036,7 +8026,26 @@ Z = (195, 195, 195) ................ ................ } -# tile 211 (green slime) +# tile 421 (brown pudding,female) +{ + ................ + ................ + ................ + ................ + ............J... + ....JKKJJJ..JJ.. + ...KKKCJJJJJ.... + ..KKNNJNNJJJ.... + ..KJANJANJJJA... + ..KKJJJJJCJJAA.. + ..JKJJCJJJJJAA.. + ...JJJJJJJJAAA.. + ....JJJJJJAAA... + .....AAAAAAA.... + ................ + ................ +} +# tile 422 (green slime,male) { ................ ................ @@ -4055,7 +8064,26 @@ Z = (195, 195, 195) NGGFGGF..GF..... ..GGF..GGF..G... } -# tile 212 (black pudding) +# tile 423 (green slime,female) +{ + ................ + ................ + ................ + ................ + ................ + ................ + ............G... + .....G......G..G + .G....G..G.NGN.G + ..NG.NGGNGGGGGGG + ..GGNGGNGGGFGGF. + GGNGGGGGGGGGFF.G + .NGGGGGFGFG..... + NGGGGFGGFG.G..GF + NGGFGGF..GF..... + ..GGF..GGF..G... +} +# tile 424 (black pudding,male) { ........A....... ........AA...... @@ -4074,7 +8102,26 @@ Z = (195, 195, 195) ........AAAAAAAA ..........AAAA.. } -# tile 213 (quantum mechanic) +# tile 425 (black pudding,female) +{ + ........A....... + ........AA...... + .....AAA........ + ....AAAAA....... + ....CACAA....... + ....DADAA....... + ....AAAAA....... + ....AAAAA....... + ....AAAAA....... + .....AAAAA...... + .....AAAAA...... + ......AAAAA..... + ......AAAAAA.... + .......AAAAAA.A. + ........AAAAAAAA + ..........AAAA.. +} +# tile 426 (quantum mechanic,male) { ................ ......LLLL...... @@ -4093,7 +8140,26 @@ Z = (195, 195, 195) ....NAAEBAANN... ................ } -# tile 214 (genetic engineer) +# tile 427 (quantum mechanic,female) +{ + ................ + ......LLLL...... + ...FGGCLCGGF.... + ...GNNGLGNNGL... + B.BGANGGGANGL... + B.BFGGCLCGGFL... + BIB..CLLLCCL.... + BILN.LLAALLAAAA. + BILNN.LLLLJAAAA. + BIB.NNJJJJNAAA.. + BIB.BNNNONNNAA.. + .B...NNNONNLAA.. + .....NBEBENA.A.. + .....NBEBENN.... + ....NAAEBAANN... + ................ +} +# tile 428 (genetic engineer,male) { ................ ......LLLL...... @@ -4112,7 +8178,26 @@ Z = (195, 195, 195) ..AANAAEPAANN... ................ } -# tile 215 (rust monster) +# tile 429 (genetic engineer,female) +{ + ................ + ......LLLL...... + ...LAALLLAAL.... + ...LNNLLLNNLL... + ...LANLLLANLL... + ...LLLLLLLLLL... + .....CLLLCCL.... + ..LN.LLAALL..... + ..LNN.LLLLJ..... + ..A.NNLLLLN..... + .A.ABNNNONNN.... + .AA..NNNONNL.... + .A.A.NPEPENA.... + .AA..NPEPENN.... + ..AANAAEPAANN... + ................ +} +# tile 430 (rust monster,male) { ................ ....EEEE........ @@ -4131,7 +8216,26 @@ Z = (195, 195, 195) ......AAAA...... ................ } -# tile 216 (disenchanter) +# tile 431 (rust monster,female) +{ + ................ + ....EEEE........ + ...EEHEHE....... + ...EEEAEE....... + ...EEPAPE....... + ...EPEAEP...E... + ....EEEE.AAEE... + ....EEEEEAAEEE.. + ...EEEEEEEAEAEE. + ..EEEEEEAAAAE... + ..EEAEEEEAEEEA.. + ..AAEEEEEEEEEAA. + ....AEEEEEEEAAA. + .....EEEEEAA..A. + ......AAAA...... + ................ +} +# tile 432 (disenchanter,male) { ................ ....PPPP........ @@ -4150,7 +8254,26 @@ Z = (195, 195, 195) ......AAAA...... ................ } -# tile 217 (garter snake) +# tile 433 (disenchanter,female) +{ + ................ + ....PPPP........ + ...PPDPDP....... + ...PPPAPP....... + ...PPOAOP....... + ...POPAPO...P... + ....PPPP.AAPP... + ....PPPPPAAPPP.. + ...PPPPPPPAPAPP. + ..PPPPPPAAAAP... + ..PPAPPPPAPPPA.. + ..AAPPPPPPPPPAA. + ....APPPPPPPAAA. + .....PPPPPAA..A. + ......AAAA...... + ................ +} +# tile 434 (garter snake,male) { ................ ................ @@ -4169,7 +8292,26 @@ Z = (195, 195, 195) ................ ................ } -# tile 218 (snake) +# tile 435 (garter snake,female) +{ + ................ + ................ + ................ + ....KKA......... + ...NAOKA........ + ...KKAKA........ + ...KKAKA....KA.. + ....APKAP..KAPP. + .....PKAPP.KAP.. + .....KAAP..KAP.. + ....KAAP..KAAP.. + ....KAAPPKAAP... + ....KAAKKAAP.... + .....KAAAAP..... + ................ + ................ +} +# tile 436 (snake,male) { ................ ................ @@ -4188,7 +8330,26 @@ Z = (195, 195, 195) ................ ................ } -# tile 219 (water moccasin) +# tile 437 (snake,female) +{ + ................ + ................ + ................ + ....KKA......... + ...NAOJA........ + ...KKJAJ........ + ...KKAAJ....KK.. + ...FAAKJ...KJAA. + ..FAFAKJAA.KJA.. + .....KJAA..KJA.. + ....KJAA..KJJA.. + ....KJAAAKJJA... + ....KJJJJJJA.... + .....KJJJJA..... + ................ + ................ +} +# tile 438 (water moccasin,male) { ................ ................ @@ -4207,7 +8368,26 @@ Z = (195, 195, 195) .....AAAAA...... ................ } -# tile 220 (python) +# tile 439 (water moccasin,female) +{ + ................ + ................ + ................ + ....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 440 (python,male) { ................ ................ @@ -4226,7 +8406,26 @@ Z = (195, 195, 195) .....JJJJJAA.... ................ } -# tile 221 (pit viper) +# tile 441 (python,female) +{ + ................ + ................ + ................ + ...KKKA.....JJ.. + ...GAGJA...JJJ.. + ..JKKJAJ..KJJ... + ..KKKAJJ..KJJ.AA + ..KKAAKJA.KKJAA. + .....AKJAA.KJAA. + ....JKJAA..KJJA. + ...JJJAA..KJJJA. + ...JJJAAAKJJJA.. + ...JJJJJJJJJAA.. + ....JJJJJJJAA... + .....JJJJJAA.... + ................ +} +# tile 442 (pit viper,male) { ................ ................ @@ -4245,7 +8444,26 @@ Z = (195, 195, 195) ......AAAA...... ................ } -# tile 222 (cobra) +# tile 443 (pit viper,female) +{ + ................ + ................ + ................ + ....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 444 (cobra,male) { ................ ................ @@ -4264,7 +8482,26 @@ Z = (195, 195, 195) .....AAAAAAAAA.. ................ } -# tile 223 (troll) +# tile 445 (cobra,female) +{ + ................ + ................ + ................ + ....AAA......... + ...AAAAAA....... + ..PA..AAAA...... + ..A..AAAAA..AA.. + ..D..AAAAA....A. + ......AAA.....A. + ......AA..AAAA.. + .....AA..AA..... + ....AA...AA..... + ....AA....AAAA.. + ....AAA......AA. + .....AAAAAAAAA.. + ................ +} +# tile 446 (troll,male) { ................ ..AAAAAA........ @@ -4283,7 +8520,26 @@ Z = (195, 195, 195) ..KJA..KA....... ................ } -# tile 224 (ice troll) +# tile 447 (troll,female) +{ + ................ + ..AAAAAA........ + AAAANANA........ + .AAKKKJJA....... + AAAKAAAKA....... + AKAKAAAKAA...... + KJJAKKKAJKA..... + KJAJAAAJJJA..... + KJAJKKJJKJA..... + .KJJAFGFJJAAAA.. + ..KJA.PFJAAAA... + ...AFAGFAAAAAA.. + ...GFAGP.AA.AA.. + ..KJJAKJAA.AA... + ..KJA..KA....... + ................ +} +# tile 448 (ice troll,male) { ................ ..OONOOO........ @@ -4302,7 +8558,26 @@ Z = (195, 195, 195) ..KJA..KA....... ................ } -# tile 225 (rock troll) +# tile 449 (ice troll,female) +{ + ................ + ..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........ @@ -4321,7 +8596,26 @@ Z = (195, 195, 195) ..KJA..KA....... ................ } -# tile 226 (water troll) +# tile 451 (rock troll,female) +{ + ................ + ...AAAAA........ + .AAANANAAAA..... + .AAKKKJJAA...... + AAAKAAAKAAAA.... + AKAKAAAKAAA..... + KJJAKKKAJKAA.... + KJAJAAAJJJA..... + KJAPAKJJKJA..... + PKJPPAGFJJAAAA.. + PPPPPAFFJAAAA... + .PPPAAGFAAAAAA.. + ...AFAGF.AA.AA.. + ..KJJAKJAA.AA... + ..KJA..KA....... + ................ +} +# tile 452 (water troll,male) { ................ ...AAAAA........ @@ -4340,7 +8634,26 @@ Z = (195, 195, 195) ..KJA..KA....... ................ } -# tile 227 (Olog-hai) +# tile 453 (water troll,female) +{ + ................ + ...AAAAA........ + ..AANANAA....... + .AAKKKJJAA...... + .AAKAAAKAA...... + .KAKAAAKAA...... + KJJAKKKAJKA..... + KJAJAAAJJJA..... + KJAJKKJJKJA..... + .KJJAEBEJJAAAA.. + ..KJA.PEJAAAA... + ...AEABEAAAAAA.. + ...BEABP.AA.AA.. + ..KJJAKJAA.AA... + ..KJA..KA....... + ................ +} +# tile 454 (Olog-hai,male) { ...PPPPP........ ..PPAAAPP....... @@ -4359,7 +8672,26 @@ Z = (195, 195, 195) ..AAA.AAA....... ................ } -# tile 228 (umber hulk) +# tile 455 (Olog-hai,female) +{ + ...PPPPP........ + ..PPAAAPP....... + ..PANANAP....... + ..PAAAAAP....... + .PPAAAAAPP...... + PPPAAAAAPPP..... + AAPPAAAPPAA..... + AAAPPPPPAAA..... + AAAPPPPPAAA..... + .AAAAPPPAAAPPP.. + PONNNNNNAACPP... + ...APAPPAPPPPP.. + ...PPAPP.PP.PP.. + ..AAAAAAAP.PP... + ..AAA.AAA....... + ................ +} +# tile 456 (umber hulk,male) { ................ ...AAAAA........ @@ -4378,7 +8710,26 @@ Z = (195, 195, 195) .AAAP..AAP...... ................ } -# tile 229 (vampire) +# tile 457 (umber hulk,female) +{ + ................ + ...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 458 (vampire,male) { ................ ................ @@ -4397,7 +8748,26 @@ Z = (195, 195, 195) ................ ................ } -# tile 230 (vampire lord) +# tile 459 (vampire,female) +{ + ................ + ................ + .....AAA........ + ....AAOAA....... + .ADDAGAGADA..... + ..ADALLOAD...... + .AAAAAAAAA...... + ..AAAAAAAA...... + ...AAAAAAA...... + ..ADAAAAAAPPPPP. + ..ADDAAAAAPPPP.. + ..AAAAAAAAPPP... + .....AAPAAPP.... + ....AAP..AP..... + ................ + ................ +} +# tile 460 (vampire leader,male) { ................ .....AAAA....... @@ -4416,7 +8786,26 @@ Z = (195, 195, 195) .N..AAPP..AP.... ................ } -# tile 231 (vampire mage) +# tile 461 (vampire leader,female) +{ + ................ + .....AAAA....... + .N..AAOOAA...... + .NDDAGAAGADA.... + .NADALLLOAD..... + AAAAAAAAAAA..... + AAAAAAAAAAA..... + .AAAAAAAAAA..... + .NAAAAAAAAA..... + .N.AAAAAAAAPPPPP + .NADAAAAAAAPPPPP + .NADDAAAAAAPPPP. + .NAAAAAAAAAPPP.. + .N...AAAPAAPP... + .N..AAPP..AP.... + ................ +} +# tile 462 (vampire mage,male) { ................ ................ @@ -4435,7 +8824,26 @@ Z = (195, 195, 195) ................ ................ } -# tile 232 (Vlad the Impaler) +# tile 463 (vampire mage,female) +{ + ................ + ................ + .....AAA........ + ....AAOAA....... + .ADDAGAGADA..... + ..ADALLOAD...... + .AAAA.A.AA...... + ..AAAACAAA...... + ...AAADAAA...... + ..ADAAAAAAPPPPP. + ..ADDAAAAAPPPP.. + ..AAAAAAAAPPP... + .....AAPAAPP.... + ....AAP..AP..... + ................ + ................ +} +# tile 464 (Vlad the Impaler,male) { ................ ..N..AAAA....... @@ -4454,7 +8862,26 @@ Z = (195, 195, 195) ..N.AAPP..AP.... ................ } -# tile 233 (barrow wight) +# tile 465 (Vlad the Impaler,female) +{ + ................ + ..N..AAAA....... + ADNDAAOOAADDDA.. + .ANDAGAAGADDA... + ..NDALLLOADA.... + ..NAAAAAAAAAAAAA + .HHHDAAAAADDDDDA + HEHEHJAAAADDDAA. + LLLLLJAAAADDAAPP + .LLLJAAAAADDAPPP + ..NJDAAAAADAPPPP + .ANDDAAAAAAAPPPP + .ANAAAAAAAAPPPP. + ..N..AAAPAAPPP.. + ..N.AAPP..AP.... + ................ +} +# tile 466 (barrow wight,male) { ................ ................ @@ -4473,7 +8900,26 @@ Z = (195, 195, 195) .J.....LLAA..... ................ } -# tile 234 (wraith) +# tile 467 (barrow wight,female) +{ + ................ + ................ + ...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 468 (wraith,male) { ................ ................ @@ -4492,7 +8938,26 @@ Z = (195, 195, 195) ................ ................ } -# tile 235 (Nazgul) +# tile 469 (wraith,female) +{ + ................ + ................ + ...PPPPP........ + ...PAAPPP....... + ....PAAPP....... + ....PAAPP....... + ..PP.PPP.P...... + .OLAPPP.PP...... + ..AAPPPPAP..AAA. + ..PPPPPOLPAAAAA. + ...A.PPAAAAPPA.. + .....PPAPPPPA... + ......PPPPA..... + ................ + ................ + ................ +} +# tile 470 (Nazgul,male) { ................ ................ @@ -4511,7 +8976,26 @@ Z = (195, 195, 195) ......PPPPA..... ................ } -# tile 236 (xorn) +# tile 471 (Nazgul,female) +{ + ................ + ................ + ...PPPPP........ + ...PAAPPP....... + ....PAAPP....... + ....PAAPP....... + ..PP.PPP.P...... + .OLAPPP.PP...... + .OPAPPPPAP..AAA. + ..PAPPPPAP..AAA. + ..PA.PPPLP..AAA. + ..PP.PPOLPAAAAA. + ...AAPPOAAAPPA.. + .....PPAPPPPA... + ......PPPPA..... + ................ +} +# tile 472 (xorn,male) { ................ ................ @@ -4530,7 +9014,26 @@ Z = (195, 195, 195) ................ ................ } -# tile 237 (monkey) +# tile 473 (xorn,female) +{ + ................ + ................ + ................ + ...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 474 (monkey,male) { ................ ................ @@ -4549,7 +9052,26 @@ Z = (195, 195, 195) .....JJA.JJA.... ................ } -# tile 238 (ape) +# tile 475 (monkey,female) +{ + ................ + ................ + ................ + ................ + ................ + .......KKA...... + ......KLLJA..... + ......KLLJA..... + .......KJA...... + .....KKKKKJAA... + ....KJKLLJJJAA.. + ....LAKLLJALAA.. + ......KJJJAAAA.. + ......JAAJAAA... + .....JJA.JJA.... + ................ +} +# tile 476 (ape,male) { ................ ................ @@ -4568,7 +9090,26 @@ Z = (195, 195, 195) ................ ................ } -# tile 239 (owlbear) +# tile 477 (ape,female) +{ + ................ + ................ + ......KKKJ...... + .....JJJJJJ..... + ....KCELECJJ.AA. + ....KLLLLCAJAAAA + ...KKCLACCAJJAAA + ..KKKKCCCAJKJJAA + ..KKAKJAAJJAJJAA + ..KAAKJJJJJAAJAA + ..LC.KJJJJJKCLAA + ..LL.CJJAKLJLLAA + .....CLJACLJAAAA + ...LLLLJACLLLKA. + ................ + ................ +} +# tile 478 (owlbear,male) { ................ ....K.....K..... @@ -4587,7 +9128,26 @@ Z = (195, 195, 195) ...PJPJAJPJPA... ................ } -# tile 240 (yeti) +# tile 479 (owlbear,female) +{ + ................ + ....K.....K..... + ....CK...KK..... + ....CKKKKKK..... + ...KOOOKOOOK.... + ...KOOOKOOOKA..A + ...KOOAJAOOKAAAA + ..CKCJJHJJKAKAAA + .CKKKCKLKKAJJKAA + .KJJJJCKKJJJJJAA + .KJJJPAKJPJJJJAA + ..KJJJAKJJJJJAAA + ...JJPAKJPJJAAA. + ...JAAJAJAAJAA.. + ...PJPJAJPJPA... + ................ +} +# tile 480 (yeti,male) { ................ ....BNNN........ @@ -4606,7 +9166,26 @@ Z = (195, 195, 195) ..BNNA..NNA..... ................ } -# tile 241 (carnivorous ape) +# tile 481 (yeti,female) +{ + ................ + ....BNNN........ + ...BNANAP....... + ..BNNNNNNP...... + ..NNNADANN...... + ..NNNNNNPN...... + ..N.NNBPPNP..... + ..N.NNNNANP..AA. + ..NNBNNNPN.AAAA. + ....NNNNP.KAAA.. + ....NN.NPAKKAA.. + ....NB.NPAACKAA. + ....NNANPAAKKJA. + ...BNNANNPAACKA. + ..BNNA..NNA..... + ................ +} +# tile 482 (carnivorous ape,male) { ................ ................ @@ -4625,7 +9204,26 @@ Z = (195, 195, 195) ................ ................ } -# tile 242 (sasquatch) +# tile 483 (carnivorous ape,female) +{ + ................ + ................ + ......KKKJ...... + .....JJJJJJ..... + ....KCELECJJ.AA. + ....KLLLLCAJAAAA + ...KKCAAACAJJAAA + ..KKKCDDDCAKJJAA + ..KKAKCCCAJAJJAA + ..KAAKJAAJJAAJAA + ..LC.AJJJJJKCLAA + ..LLDDAJAKLJLLAA + ...DDALJACLJAAAA + ..DDALLJACLLLKA. + ................ + ................ +} +# tile 484 (sasquatch,male) { ................ ....CCCCC....... @@ -4644,7 +9242,26 @@ Z = (195, 195, 195) .CJJJKACKJJKA... ................ } -# tile 243 (kobold zombie) +# tile 485 (sasquatch,female) +{ + ................ + ....CCCCC....... + ...CGAJGAJ...... + ..CKKKKJJJ...... + ..CKKAAAKJJ..... + .CKKKAAAKKJ..... + .CKJKKKKKKKJ.... + .CKAJJJJJAKJ.... + .CKAJKKKJAKJ.AA. + .CKJAJKJACKJAAAA + .CKJAJJJACKJAAA. + ..J.AJAKKAJAAAAA + ...CKJAKKJAAAAA. + .KCKJJACKJKJAA.. + .CJJJKACKJJKA... + ................ +} +# tile 486 (kobold zombie,male) { ................ ................ @@ -4663,7 +9280,26 @@ Z = (195, 195, 195) ................ ................ } -# tile 244 (gnome zombie) +# tile 487 (kobold zombie,female) +{ + ................ + ................ + ................ + ...N...N........ + ...NGFBN........ + ...GABAB........ + ....GBFA..A..... + ...GBABFA.AA.... + ..GFBBBIKAAA.A.. + ..BAFBFFEAAAAA.. + ..BAFBFFAAAAAA.. + ....FBFAAAAAA... + ....BABAAAA..... + ...BBABBA....... + ................ + ................ +} +# tile 488 (gnome zombie,male) { ................ ................ @@ -4682,7 +9318,26 @@ Z = (195, 195, 195) ................ ................ } -# tile 245 (orc zombie) +# tile 489 (gnome zombie,female) +{ + ................ + ................ + ................ + ................ + ......G......... + .....GFF........ + ....GGFFF....... + ....GDFDF....... + .....PFP...AAA.. + ...FGFPFEGAAAA.. + ..GAAGFFFAGAAA.. + ....AKNKFAAAA... + ....FGAFFAA..... + ....GFAFG.A..... + ................ + ................ +} +# tile 490 (orc zombie,male) { ................ ................ @@ -4701,7 +9356,26 @@ Z = (195, 195, 195) ................ ................ } -# tile 246 (dwarf zombie) +# tile 491 (orc zombie,female) +{ + ................ + ................ + ................ + .....OA......... + ....NOPA........ + ....GPGA........ + .....PFA........ + ..KCCAKKKA.AA... + .BBPCKJ.BBAAA... + BB.AGGFAABBA.... + B..AJJPAAABA.... + ....BAPPPAAAAA.. + ...BJAAEPAAA.... + ..BPPAAAPP...... + ................ + ................ +} +# tile 492 (dwarf zombie,male) { ................ ................ @@ -4720,7 +9394,26 @@ Z = (195, 195, 195) ................ ................ } -# tile 247 (elf zombie) +# tile 493 (dwarf zombie,female) +{ + ................ + ................ + ................ + ................ + ......B......... + .....BEE........ + ....BBEEE....... + ....BFFFE....... + .....PFP...AAA.. + ...BBPPPEEAAAA.. + ..FBABPEAEAAAA.. + ..F.EBBEFAAAA... + ....EBAEEAA..... + ....BEAEB.A..... + ................ + ................ +} +# tile 494 (elf zombie,male) { ................ ................ @@ -4739,7 +9432,26 @@ Z = (195, 195, 195) ................ ................ } -# tile 248 (human zombie) +# tile 495 (elf zombie,female) +{ + ................ + ................ + .........G...... + .......GGF...... + ......GGGGA..... + ......FEFEA..... + ......FFFFA..... + ......AFDA....A. + ......GAAG..AAA. + ....FFGGGFFFAAA. + ...FAAAGFAAAFAA. + .....AGGGFAAAA.. + ......GFAFAA.A.. + .....KDA.FKA.... + ................ + ................ +} +# tile 496 (human zombie,male) { ......AAA....... .....FFGAA...... @@ -4758,7 +9470,26 @@ Z = (195, 195, 195) ....GGAGGA...... ................ } -# tile 249 (ettin zombie) +# tile 497 (human zombie,female) +{ + ......AAA....... + .....FFGAA...... + .....AGAFA...... + .....FFGFA...... + ....FKF..JJ..... + ....JJJFJKJ..... + ...FJ.KJJAKJ.... + ..FK..KFJFFJ.... + ..G...KKJG...... + .....BP.BPAAAAA. + .....FPAPFAAAA.. + .....BFABFAAAA.. + .....PFABPAA.... + .....BFABFA..... + ....GGAGGA...... + ................ +} +# tile 498 (ettin zombie,male) { ....NN..ONOP.... ..NNOOPNNOOPP... @@ -4777,7 +9508,26 @@ Z = (195, 195, 195) .....GFAAGFAAAAA ...FFFFA.GFFFFAA } -# tile 250 (ghoul) +# tile 499 (ettin zombie,female) +{ + ....NN..ONOP.... + ..NNOOPNNOOPP... + ..NFF..NFF..P... + ..ADFFDADFFDA... + ..AFFFFAFFFFA... + ..AFAAFAFAAFAA.. + ..AFFFFAFFFFAAA. + ..GIIIIJJJIIIGAA + .GFFFIIIIIIFFFGA + .GFFFFIIIIFFFFFA + .FFAAFIIIIFAAFFA + .FFAAIIIIIIAAFFA + .FFF.IIFFIIAGFAA + ..FF.GFAAGFAFFAA + .....GFAAGFAAAAA + ...FFFFA.GFFFFAA +} +# tile 500 (ghoul,male) { ......AAA....... .....OOOAA...... @@ -4796,7 +9546,26 @@ Z = (195, 195, 195) ....OOAOOA...... ................ } -# tile 251 (giant zombie) +# tile 501 (ghoul,female) +{ + ......AAA....... + .....OOOAA...... + .....DODOA...... + .....OOOOA...... + ....PPOOOPP..... + ....PPPPPPP..... + ...PP.PPPAPP.... + ..PP..PPPOOP.... + ..O...PPPO...... + .....PP.PPAAAAA. + .....PPAPPAAAA.. + .....PPAPPAAAA.. + .....PPAPPAA.... + .....PPAPPA..... + ....OOAOOA...... + ................ +} +# tile 502 (giant zombie,male) { ......JJJJAA.... ....JJJJJJJJA... @@ -4815,7 +9584,26 @@ Z = (195, 195, 195) ....GFFAGFFAAAAA ...GFFAAGFFFAAAA } -# tile 252 (skeleton) +# tile 503 (giant zombie,female) +{ + ......JJJJAA.... + ....JJJJJJJJA... + ....JJFFFFJJA... + ....JDDFFDDJA... + ....JFFFFFFJA... + ....AFFAAFFAAA.. + .....AFFFFJAAAA. + ..GGFFJJJJFFGGAA + .GFFFGGFFFFFFFCA + .FFFKFFFFFFKFFFA + FFFAAFFFFFFAAFFA + FFAA.JJJKKJAAFFA + FFA..JJJJJKAGFAA + .....GFAGFFAFFAA + ....GFFAGFFAAAAA + ...GFFAAGFFFAAAA +} +# tile 504 (skeleton,male) { ................ ................ @@ -4834,7 +9622,26 @@ Z = (195, 195, 195) ......OOO....... ................ } -# tile 253 (straw golem) +# tile 505 (skeleton,female) +{ + ................ + ................ + ...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...... @@ -4853,7 +9660,26 @@ Z = (195, 195, 195) ....HALA.AHAAL.. ..........L..... } -# tile 254 (paper golem) +# tile 507 (straw golem,female) +{ + ......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 508 (paper golem,male) { ................ .......OA....... @@ -4872,7 +9698,26 @@ Z = (195, 195, 195) ....OOA...OOA... ................ } -# tile 255 (rope golem) +# tile 509 (paper golem,female) +{ + ................ + .......OA....... + .....NNNOA...... + .....ONNNOA..... + ......ONNOA..... + .......NOA...... + ..NNOA.NOA...... + ..NONOAOAONNOA.. + ..OAOANNOAOOOA.. + ......NNNOAAAAA. + ......ONOAAAAAA. + .......OOAAAAAA. + .....NOAAOAAAAA. + .....NOA..NOAA.. + ....OOA...OOA... + ................ +} +# tile 510 (rope golem,male) { ................ ................ @@ -4891,7 +9736,26 @@ Z = (195, 195, 195) ...O.A....OAA... ....OA.......... } -# tile 256 (gold golem) +# tile 511 (rope golem,female) +{ + ................ + ................ + ......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 512 (gold golem,male) { ................ ......HNH....... @@ -4910,7 +9774,26 @@ Z = (195, 195, 195) H...HNC.AHNC.A.H ..H............. } -# tile 257 (leather golem) +# tile 513 (gold golem,female) +{ + ................ + ......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 514 (leather golem,male) { ......KKKK...... .....KHKHJ...... @@ -4929,7 +9812,26 @@ Z = (195, 195, 195) ...KJJA..KJJA... ....KA....KA.... } -# tile 258 (wood golem) +# tile 515 (leather golem,female) +{ + ......KKKK...... + .....KHKHJ...... + ....KAKKJJA..... + ...KKAJJJJAJ.... + ..KKJJAJAAKJJ... + .KKKJJAAKKKJJJ.. + ..KKJJJAKKJJJJ.. + ...KKJJJA.AAA.A. + ....AAAA.KJAAAA. + ....KJAAAKKAAAAA + ...KJJAA.KJJAAA. + ...KKJA..KKJAAA. + ..KKJJJAKKJJJAA. + ..KKKJJAKKKJJA.. + ...KJJA..KJJA... + ....KA....KA.... +} +# tile 516 (wood golem,male) { ................ ......KCKJ...... @@ -4948,7 +9850,26 @@ Z = (195, 195, 195) ....KCKJAKCKJA.. ................ } -# tile 259 (flesh golem) +# tile 517 (wood golem,female) +{ + ................ + ......KCKJ...... + ......HCHJ..C... + ......KCKJ..CK.. + ......KCKJ..CKJ. + ...KKKAAAAKACKJ. + ..KCCCCCCCCCAKJA + ..KKKKKKKKKKKAJA + .CJAJJJJJJJJA..A + .CKJAAAAAAAAA.AA + .CKJACKJAKCKJAAA + .CKJACKJAKCKJAAA + ..KJACKJAKCKJAAA + ....KCKJAKCKJAA. + ....KCKJAKCKJA.. + ................ +} +# tile 518 (flesh golem,male) { ................ ................ @@ -4967,7 +9888,26 @@ Z = (195, 195, 195) ..LLDDD..DDDDD.. ................ } -# tile 260 (clay golem) +# tile 519 (flesh golem,female) +{ + ................ + ................ + ...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 520 (clay golem,male) { ................ ................ @@ -4986,7 +9926,26 @@ Z = (195, 195, 195) ..CKKKA.CKKKAA.. ................ } -# tile 261 (stone golem) +# tile 521 (clay golem,female) +{ + ................ + ................ + ................ + ....LCCCCK...... + ...LKKKKKKK..... + ...CKAKKAKK..... + ...CKAKKAKK..... + .LCKKKKKKKKLC... + CKKJKKKKKKCKKJ.. + KKKJKKJJKKJKKJAA + .JJAKKJAKKAJJAAA + ..AKKKJAKKKAAAAA + ..CKKKKKKKKKAAAA + ..CKKKAACKKKAA.. + ..CKKKA.CKKKAA.. + ................ +} +# tile 522 (stone golem,male) { ................ ................ @@ -5005,7 +9964,26 @@ Z = (195, 195, 195) ...PPAA.PPPA.... ................ } -# tile 262 (glass golem) +# tile 523 (stone golem,female) +{ + ................ + ................ + ................ + ....BBBPP....... + ...BBPPPPP...... + ...BHAPHAP...... + ...PPPPPPP...... + .BBPPPPPP.BPA... + BPPPP....PPPPAA. + BPP.BPPPP.PPPAAA + .PP.BP.PP.PPPAAA + ...BPP.PPPAAAAAA + ..BPPPAPPPAAAAA. + ..PPPPAPPPPAAA.. + ...PPAA.PPPA.... + ................ +} +# tile 524 (glass golem,male) { ................ .....BBBBBBA.... @@ -5024,7 +10002,26 @@ Z = (195, 195, 195) ..BNPA....NPAA.. ...BA.....BPA... } -# tile 263 (iron golem) +# tile 525 (glass golem,female) +{ + ................ + .....BBBBBBA.... + .....BPNPPPA.... + .....BNPPPNA.... + .....NPPPNPA.... + .....BPPNPPA.... + .......BA...BA.. + .BNBBABPBA.BPNA. + .NPPNABPNBBANPBA + .....BPNPPPAABAA + .....BNPPPAAAAAA + ......BPPNAAAAAA + ....BNABNABPAAA. + ...BNPA...BNAAA. + ..BNPA....NPAA.. + ...BA.....BPA... +} +# tile 526 (iron golem,male) { ................ ......PBP....... @@ -5043,7 +10040,26 @@ Z = (195, 195, 195) ....PBP.APBP.A.. ................ } -# tile 264 (human) +# tile 527 (iron golem,female) +{ + ................ + ......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 528 (human,male) { ................ ................ @@ -5062,7 +10078,26 @@ Z = (195, 195, 195) ................ ................ } -# tile 265 (wererat) +# tile 529 (human,female) +{ + ................ + ................ + .......JJA...... + ......JJJJA..... + ......ELELA..... + ......LLLLA..... + ......ALLA...... + .....CLAALC.AAA. + ....CLLLLLLCAAA. + ....LACLLCALAAA. + ....LAJJKJALAAA. + ......JJJKAAAA.. + ......JJAJAA.A.. + .....KLA.LKA.... + ................ + ................ +} +# tile 530 (wererat,male) { ................ ................ @@ -5081,7 +10116,26 @@ Z = (195, 195, 195) ................ ................ } -# tile 266 (werejackal) +# tile 531 (wererat,female) +{ + ................ + ................ + .......JJA...... + ......JJJJA..... + ......GJGJA..... + ......LLLLA..... + ......ALLA...... + .....CLAALC.AAA. + ....CLLLLLLCAAA. + ....LACLLCALAAA. + ....LAJJKJALAAA. + ......JJJKAAAA.. + ......JJAJAA.A.. + .....KLA.LKA.... + ................ + ................ +} +# tile 532 (werejackal,male) { ................ ................ @@ -5100,7 +10154,26 @@ Z = (195, 195, 195) ................ ................ } -# tile 267 (werewolf) +# tile 533 (werejackal,female) +{ + ................ + ................ + .......JJA...... + ......JJJJA..... + ......IPIPA..... + ......LLLLA..... + ......ALLA...... + .....CLAALC.AAA. + ....CLLLLLLCAAA. + ....LACLLCALAAA. + ....LAJJKJALAAA. + ......JJJKAAAA.. + ......JJAJAA.A.. + .....KLA.LKA.... + ................ + ................ +} +# tile 534 (werewolf,male) { ................ ................ @@ -5119,7 +10192,26 @@ Z = (195, 195, 195) ................ ................ } -# tile 268 (elf) +# tile 535 (werewolf,female) +{ + ................ + ................ + ......JJA....... + .....JJJJA...... + .....NJNJA...... + .....LLLLA...... + .....ALLA....... + ....CLAALC.AAA.. + ...CLLLLLLCAAA.. + ...LACLLCALAAA.. + ...LAJJKJALAAA.. + .....JJJKAAAA... + .....JJAJAA.A... + ....KLA.LKA..... + ................ + ................ +} +# tile 536 (elf,male) { ................ .........G...... @@ -5138,7 +10230,26 @@ Z = (195, 195, 195) ................ ................ } -# tile 269 (Woodland-elf) +# tile 537 (elf,female) +{ + ................ + .........G...... + .......GGF...... + ......GGGGA..... + ......LELEA..... + ......LLLLA..... + ......ALLA....A. + ......GAAG..AAA. + .....LGGGFLAAAA. + ....LAAGFAALAAA. + ....LAGGGFALAA.. + ......GFAFAA.A.. + ......GFAFAA.A.. + .....KLA.LKA.... + ................ + ................ +} +# tile 538 (Woodland-elf,male) { ................ ................ @@ -5157,7 +10268,26 @@ Z = (195, 195, 195) ................ ................ } -# tile 270 (Green-elf) +# tile 539 (Woodland-elf,female) +{ + ................ + ................ + .........K...... + .......KKJ...... + ......KKKKA..... + ......LELEA..... + ......LLLLA..... + ......ALLA....A. + ......KAAK..AAA. + .....LKKKJLAAAA. + ....LAPPJAALAAA. + ..KKLKKKKJALAA.. + ......PPAJAA.A.. + .....KLA.LKA.... + ................ + ................ +} +# tile 540 (Green-elf,male) { ................ ................ @@ -5176,7 +10306,26 @@ Z = (195, 195, 195) ................ ................ } -# tile 271 (Grey-elf) +# tile 541 (Green-elf,female) +{ + ................ + ................ + .........G...... + .......GGF...... + ......GGGGA..... + ......LELEA..... + ......LLLLA..... + ......ALLA....A. + ......GAAG..AAA. + .....LGGGFLAAAA. + ....LAAGFAALAAA. + ....LAGGGFALAA.. + ......GFAFAA.A.. + .....KLA.LKA.... + ................ + ................ +} +# tile 542 (Grey-elf,male) { ................ ................ @@ -5195,7 +10344,26 @@ Z = (195, 195, 195) ................ ................ } -# tile 272 (elf-lord) +# tile 543 (Grey-elf,female) +{ + ................ + ................ + .........P...... + .......PP....... + ......PPPPA..... + ......LELEA..... + ......LLLLA..... + ......ALLA....A. + ......PAAP..AAA. + .....LPPP.LAAAA. + ....LAAP.AALAAA. + ....LAPPP.ALAA.. + ......P.A.AA.A.. + .....KLA.LKA.... + ................ + ................ +} +# tile 544 (elf-leader,male) { ................ ................ @@ -5214,7 +10382,26 @@ Z = (195, 195, 195) ................ ................ } -# tile 273 (Elvenking) +# tile 545 (elf-leader,female) +{ + ................ + ................ + ........II...... + .......HGF...... + ......HGGGA..... + ......LELEA..... + ......LLLLA..... + ......ALLA....A. + ......HAAH..AAA. + .....LHHHFLAAAA. + ....LAAIIAALAAA. + ....LAHGGFALAA.. + ......HFAFAA.A.. + .....KLA.LKA.... + ................ + ................ +} +# tile 546 (Elvenmonarch,male) { ................ ................ @@ -5233,7 +10420,26 @@ Z = (195, 195, 195) ................ ................ } -# tile 274 (doppelganger) +# tile 547 (Elvenmonarch,female) +{ + ................ + ................ + ......H..H...... + ......HCHH...... + ......HHHHA..... + ......LELEA..... + ......LLLLA..... + .....IALLAI...A. + ....IIIAAIDIAAA. + .....LIIGDLAAAAA + ....LADIFDALAAAA + ....LAIIGDALAAA. + .....IIFAFDAAA.. + ...IIKLAILKDI... + ................ + ................ +} +# tile 548 (doppelganger,male) { ................ ......CCCC..I... @@ -5252,7 +10458,26 @@ Z = (195, 195, 195) ..CD.LLAALLADC.. ................ } -# tile 275 (shopkeeper) +# tile 549 (doppelganger,female) +{ + ................ + ......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 550 (shopkeeper,male) { ................ ................ @@ -5271,7 +10496,26 @@ Z = (195, 195, 195) ................ ................ } -# tile 276 (guard) +# tile 551 (shopkeeper,female) +{ + ................ + ................ + ......AAAA...... + .....AAAAAA..... + ......JLJL...... + ......LLLL...... + ......ALLA...... + .....EBAABEA.AA. + ....EBBBBBBEAAA. + ....BAEBBEABAAA. + ....LAGFFFALAAA. + ......GFAFAAAA.. + ......GFAFAA.A.. + .....JJA.JJA.... + ................ + ................ +} +# tile 552 (guard,male) { ................ .....BBPPPAA.... @@ -5290,7 +10534,26 @@ Z = (195, 195, 195) .....BPPABPPAAAA ....BPPP.BPPPAAA } -# tile 277 (prisoner) +# tile 553 (guard,female) +{ + ................ + .....BBPPPAA.... + ....BNPPPPPPA... + ....BPPBPPPPA... + ....BAABPAAPA... + ....BCLBPCLPA... + ....AKCPPCJAAA.. + ....BKJJJJAPAAAA + ...BPKJAAJAPPAAA + ..BPPKJJJJAPPPAA + ..PPABKJJAPPAPPA + ..PPABPKAPPPAPPA + ..LC.BPPPPPPCLAA + ..LL.BPPABPPLLAA + .....BPPABPPAAAA + ....BPPP.BPPPAAA +} +# tile 554 (prisoner,male) { ................ ................ @@ -5309,7 +10572,26 @@ Z = (195, 195, 195) .....LLA.LLA.... ................ } -# tile 278 (Oracle) +# tile 555 (prisoner,female) +{ + ................ + ................ + .......NOA...... + .......LLA...... + .......LLA...... + .......NOA...... + ......NOONA..... + .....NOOOONA.... + ....NANOOOANAA.. + ....PANOOOAPAAA. + ....LANOOOALAAA. + ......NOOOAAAA.. + ......NAANAAA... + ......PAAPAA.... + .....LLA.LLA.... + ................ +} +# tile 556 (Oracle,male) { ................ ................ @@ -5328,7 +10610,26 @@ Z = (195, 195, 195) ....LELLLLELAA.. ................ } -# tile 279 (aligned priest) +# tile 557 (Oracle,female) +{ + ................ + ................ + .......NN....... + LLL...GLLG...LLL + ..L..NLLLLN..L.. + ...L.NLAALN.L... + ....LNLLLLNL.... + .....LNLLNL..AA. + .....NBBEEN.AAAA + ......BBEEAAAAAA + .LLA..BBBEAAALL. + .LLLLBBBEBELLLLA + ..LLCLBLLELLCLAA + ...CLLLLLLLCLAA. + ....LELLLLELAA.. + ................ +} +# tile 558 (aligned priest,male) { ................ INI............. @@ -5347,7 +10648,26 @@ Z = (195, 195, 195) .JACCCJJCCCAA... ................ } -# tile 280 (high priest) +# tile 559 (aligned priest,female) +{ + ................ + 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 560 (high priest,male) { .INI............ IIIII.KCCK...... @@ -5366,7 +10686,26 @@ Z = (195, 195, 195) ..HACCCJJCCCAA.. ................ } -# tile 281 (soldier) +# tile 561 (high priest,female) +{ + .INI............ + IIIII.KCCK...... + .IHI.KCAACK..... + ..H..CGAGAC..... + ..LC.CAAAAC..... + .CLLC.CAACJCK... + .CHLACCCCJCCCK.. + ..HAACCJJCCCCCK. + ..HCCCCJCCJCCC.A + ..H..CCJCCLJCAAA + ..H..CCJCLLCAAAA + ..H..KCJCCCJAAAA + ..H..KCJCCCJAAAA + ..H.ACCJCCCJAAA. + ..HACCCJJCCCAA.. + ................ +} +# tile 562 (soldier,male) { .....J.......... .....JAAA....... @@ -5385,7 +10724,26 @@ Z = (195, 195, 195) .....JJ.JJ...... ................ } -# tile 282 (sergeant) +# tile 563 (soldier,female) +{ + .....J.......... + .....JAAA....... + .....ALLLA...... + .....LLLLC...... + .....JLLC....... + .....JF..F...... + ....FJFFFFF..A.. + ....FJFFFAF.A... + ....FLFFFFFAAA.. + ....FJFFAAAAAAA. + .....LFAFFAAAA.. + .....FFAF.AAAA.. + ......FAF.AA.... + .....FFAFFA..... + .....JJ.JJ...... + ................ +} +# tile 564 (sergeant,male) { .....J.......... .....JFFF....... @@ -5404,7 +10762,26 @@ Z = (195, 195, 195) .....AA.AA...... ................ } -# tile 283 (nurse) +# tile 565 (sergeant,female) +{ + .....J.......... + .....JFFF....... + ....FFFFFF...... + .....LLLLC...... + .....JLLC....... + .....JF..G...... + ....FJFFFFF..A.. + ....FJFFFAF.A... + ....FLFFFFFAAA.. + ....FJFFAAAAAAA. + .....LFAFFAAAA.. + .....FFAF.AAAA.. + ......FAF.AA.... + .....FFAFFA..... + .....AA.AA...... + ................ +} +# tile 566 (nurse,male) { ................ .......NO....... @@ -5423,7 +10800,26 @@ Z = (195, 195, 195) ................ ................ } -# tile 284 (lieutenant) +# tile 567 (nurse,female) +{ + ................ + .......NO....... + ......NDDO...... + ......NNOOA..... + .....DBLBLD..... + .....CLLLLDC.... + .....DALLACD.... + .....CNAAODCAAA. + .....NNNOOLAAAA. + ....LANNDOALAAA. + ....LANNOOALAAA. + ......NNOOAAAA.. + ......NNAOAA.A.. + .....LLA.LLA.... + ................ + ................ +} +# tile 568 (lieutenant,male) { ................ .......FFF...... @@ -5442,7 +10838,26 @@ Z = (195, 195, 195) .....AA.AA...... ................ } -# tile 285 (captain) +# tile 569 (lieutenant,female) +{ + ................ + .......FFF...... + .....FFFFFF..... + ......LLLL...... + .......LLCA..... + .....GF.FGA..... + ....FFFFFFFF.... + ....FAFFFFAFAAA. + ....FAFFFFAFAAAA + ....FAFFFFAFAAA. + ....LFFAFFJLJA.. + .....FFAFFJJJA.. + ......FAF.AA.... + .....FFAFFA..... + .....AA.AA...... + ................ +} +# tile 570 (captain,male) { ................ ......FHHF...... @@ -5461,7 +10876,26 @@ Z = (195, 195, 195) .....AA.AAAAA... ................ } -# tile 286 (watchman) +# tile 571 (captain,female) +{ + ................ + ......FHHF...... + .....FFFFFF..... + ......LLLL...... + .......LLCA..... + .....HF.FHF..... + ....FFFFFFFFAA.. + ....FAFFIFAFAAAA + ....FAFFFFAFAAA. + ....FAFFFFAFAAA. + ....LFFAFFJLJA.. + .....FFAFFJJJA.. + ......FAF.JJJA.. + .....FFAFFJJJA.. + .....AA.AAAAA... + ................ +} +# tile 572 (watchman,male) { ................ ......PPP....... @@ -5480,7 +10914,26 @@ Z = (195, 195, 195) ....JJJ.JJJ..... ................ } -# tile 287 (watch captain) +# tile 573 (watchman,female) +{ + ................ + ......PPP....... + ....PPPPPP...... + .....LLLLC...... + ......LLC....... + .....PP..P...... + ....PPPPPPP..... + ....PAPPHAPPA... + ....PAPPPANNAAA. + ....PJPPAPNNAAA. + ....JLPAPPAAAA.. + .....JPAP.AAAA.. + ......PAP.AA.... + .....PPAPPA..... + ....JJJ.JJJ..... + ................ +} +# tile 574 (watch captain,male) { ......PPP....... .....PHHHP...... @@ -5499,7 +10952,26 @@ Z = (195, 195, 195) ....JJJ.JJJ..... ................ } -# tile 288 (Medusa) +# tile 575 (watch captain,female) +{ + ......PPP....... + .....PHHHP...... + ....PPPPPPP..... + .....LLLLC...... + ......LLC....... + .....HP..H...... + ....PPPPPPP..... + ....PAPPHAPPA... + ....PAPPPANNAAA. + ....PJPPAPNNAAA. + ....JLPAPPAAAA.. + .....JPAP.AAAA.. + .....JPAP.AA.... + .....PPAPPA..... + ....JJJ.JJJ..... + ................ +} +# tile 576 (Medusa,male) { ................ ..GA...GA....... @@ -5518,7 +10990,26 @@ Z = (195, 195, 195) ..IIKIKIKIA..... ................ } -# tile 289 (Wizard of Yendor) +# tile 577 (Medusa,female) +{ + ................ + ..GA...GA....... + ...FA.FA..GA.... + ....FJFFFF...... + ..FAFLLFA....A.. + .GAFLLLLA..A..A. + ....JLLKA.A.A.A. + ...KBLLBKAAAAA.. + ..KIIBBIIIAAA.A. + ..IIIKKILLIAAA.. + ..KIILLIALIAA... + ...KIALKAAIAA... + ...IKAAKIIAAA... + ...IIKKIIIAA.... + ..IIKIKIKIA..... + ................ +} +# tile 578 (Wizard of Yendor,male) { .EEE.......EEE.. EFFAE..E..EAFFE. @@ -5537,7 +11028,26 @@ Z = (195, 195, 195) .EEEEEEEEEEEAAA. EEEEEEEEEEEEEEA. } -# tile 290 (Croesus) +# tile 579 (Wizard of Yendor,female) +{ + .EEE.......EEE.. + EFFAE..E..EAFFE. + EAAAE.EEE.EAAAE. + EAAAEEEAEEEAAAE. + EEAAEEDADEEAAEE. + .EEEEAAAAAEEEE.. + ..EEEEAAAEEEE... + ..EEEEEEEEEE.... + ...EEEEEEEE..... + ...EEEEEEEE....A + ....EEEEEE...AAA + ....EEEEEEAAAAAA + ...EEEEEEEEAAAAA + ..EEEEEEEEEAAAAA + .EEEEEEEEEEEAAA. + EEEEEEEEEEEEEEA. +} +# tile 580 (Croesus,male) { ....H..H..H..... ....HCHEHCH..... @@ -5556,7 +11066,26 @@ Z = (195, 195, 195) .GIIIKJJKKIIIGG. ................ } -# tile 291 (Charon) +# tile 581 (Croesus,female) +{ + ....H..H..H..... + ....HCHEHCH..... + ....HHHHHHH..... + ....ALLLLLA..... + ....LLALALL..... + .....LLLLL...... + ....HLLDLLH..... + ...HIALLLAIH.A.A + ...HIHAAAHIHAAAA + ..IIIEHHHIIIIAAA + ..IIIIEHIIIIIAA. + ..ILLIHHHILLIAAA + ...LIIKHIIILAAAA + ..GIIIKJIIIIGAA. + .GIIIKJJKKIIIGG. + ................ +} +# tile 582 (Charon,male) { ................ .......J........ @@ -5575,7 +11104,26 @@ Z = (195, 195, 195) .JJJJJJJJJJJAAA. JJJJJJJJJJJJJJA. } -# tile 292 (ghost) +# tile 583 (Charon,female) +{ + ................ + .......J........ + ......JJJ....... + ....JJJAJJJ..... + ....JJDADJJ..... + ...JJAAAAAJJ.... + ...JJJAAAJJJ.... + ..JJJJJJJJJJ.... + .JJJJJJJJJJJJ... + JJJJJJJJJJJJJJ.A + .OO.JJJJJJ.OOAAA + ....JJJJJJAAAAAA + ...JJJJJJJJAAAAA + ..JJJJJJJJJAAAAA + .JJJJJJJJJJJAAA. + JJJJJJJJJJJJJJA. +} +# tile 584 (ghost,male) { ................ ................ @@ -5594,7 +11142,26 @@ Z = (195, 195, 195) .O...P....P..... ........P....... } -# tile 293 (shade) +# tile 585 (ghost,female) +{ + ................ + ................ + ...NNN.......... + ..NANANN........ + .NNNNNNNNN...... + .NNPAAPNNNNN.... + .NNAAAANNNOONO.. + .NNAAAANONNNPNNO + .NNPAAPNONNOOOP. + .NNNNNNONOPNPPO. + .NNONNOPNNOPOOP. + .NOPNNOOOPPOOP.. + .OOOPOPPOPPP.PP. + .PP.PPOPPP...P.. + .O...P....P..... + ........P....... +} +# tile 586 (shade,male) { ................ ................ @@ -5613,7 +11180,26 @@ Z = (195, 195, 195) AAAA.AAAAJA..... ................ } -# tile 294 (water demon) +# tile 587 (shade,female) +{ + ................ + ................ + ................ + ................ + ................ + ................ + ................ + ................ + ........AAAAAAA. + ....AAAAAAAA.... + ..AAAAAAAAAAAA.. + AAAAAAAAAAAAAAA. + ..AAAAAAAAAAAAAA + .AAAAAAAAAAAAA.. + AAAA.AAAAJA..... + ................ +} +# tile 588 (water demon,male) { ................ ................ @@ -5632,45 +11218,26 @@ Z = (195, 195, 195) ....EEAEEA...... ................ } -# tile 295 (succubus) -{ - DD.OHHD......... - DDOHHDGD........ - DDOHDDDDD....... - DDHHDDDA........ - DHHHDJADDDD..... - .HHJJDDDJDDD.... - OHDDCDCDDJDD.... - HHHCDDCDLJ.DD... - HHHCDLJJJAADDA.. - HHHDJJDDDAADAA.. - HHHHDDAADAAAA... - HHHH.DKJDDAA.... - H.H..DDAADDAA... - ..H..DDAA.DAA... - ....DDAA..DDAA.. - ...DDJA...DDDA.. -} -# tile 296 (horned devil) +# tile 589 (water demon,female) { ................ ................ - ..O.......O..... - ..OO.....OO..... - ...LOCDCOL...... - ...CDDDDDC...... - ...DAADAADA..D.. - ...DDDDDDDA.D... - ..CCDDFDDCCAD.A. - ..CDKDDDKCDADA.. - ..CDAKKKACDAAAA. - ..DDADDDADDAAAA. - ....CDDDKAAAAA.. - ...CDDADDKAA.... - ..CDDAA.DDK..... + ................ + ................ + ..EE.....EE..... + .E.EE...EE.E.... + ....EEEEE....... + ....EBEBE..A.... + ...EEEEEEEAAAA.. + ..EEE...EEEAA.A. + ..EEEEEEEEEAAA.. + ..EEAEEEAEEAAA.. + ...AAEEEAAAAA... + ....EEAEEAA..... + ....EEAEEA...... ................ } -# tile 297 (incubus) +# tile 590 (Amorous Demon,male) { DD.OHHD......... DDOHHDGD........ @@ -5689,7 +11256,64 @@ Z = (195, 195, 195) ...DDKAA..DDAA.. ..DDKAA...DDDA.. } -# tile 298 (erinys) +# tile 595 (Amorous Demon,female) +{ + DD.OHHD......... + DDOHHDGD........ + DDOHDDDDD....... + DDHHDDDA........ + DHHHDJADDDD..... + .HHJJDDDJDDD.... + OHDDCDCDDJDD.... + HHHCDDCDLJ.DD... + HHHCDLJJJAADDA.. + HHHDJJDDDAADAA.. + HHHHDDAADAAAA... + HHHH.DKJDDAA.... + H.H..DDAADDAA... + ..H..DDAA.DAA... + ....DDAA..DDAA.. + ...DDJA...DDDA.. +} +# tile 592 (horned devil,male) +{ + ................ + ................ + ..O.......O..... + ..OO.....OO..... + ...LOCDCOL...... + ...CDDDDDC...... + ...DAADAADA..D.. + ...DDDDDDDA.D... + ..CCDDFDDCCAD.A. + ..CDKDDDKCDADA.. + ..CDAKKKACDAAAA. + ..DDADDDADDAAAA. + ....CDDDKAAAAA.. + ...CDDADDKAA.... + ..CDDAA.DDK..... + ................ +} +# tile 593 (horned devil,female) +{ + ................ + ................ + ..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.... @@ -5708,7 +11332,26 @@ Z = (195, 195, 195) ..BBEBEBEBA..... ................ } -# tile 299 (barbed devil) +# tile 597 (erinys,female) +{ + ..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 598 (barbed devil,male) { ................ ................ @@ -5727,7 +11370,26 @@ Z = (195, 195, 195) .CCDDAA.DDKK.... ................ } -# tile 300 (marilith) +# tile 599 (barbed devil,female) +{ + ................ + ................ + ..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 600 (marilith,male) { .D..HHH.....D... DD.HHHHHA...DD.. @@ -5746,7 +11408,26 @@ Z = (195, 195, 195) ..FGFFFFFFFFFA.. ....GFFFFFFAA... } -# tile 301 (vrock) +# tile 601 (marilith,female) +{ + .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 602 (vrock,male) { ................ ......OPP.O..... @@ -5765,7 +11446,26 @@ Z = (195, 195, 195) .....DDA.DDA.... ................ } -# tile 302 (hezrou) +# tile 603 (vrock,female) +{ + ................ + ......OPP.O..... + ......PPPP...... + .....CPPDP...... + ....CCCPPP...... + ....CCPPPP...... + ....C..PPA...... + .....DDAADD.AAA. + ....DDDDDDDDAAA. + ....DADDDDADAAA. + ....DADDDDADAAA. + ....DADDDDADAAA. + ......DAADAAAA.. + ......DAADAA.A.. + .....DDA.DDA.... + ................ +} +# tile 604 (hezrou,male) { ................ ................ @@ -5784,7 +11484,26 @@ Z = (195, 195, 195) ...........FFFA. ................ } -# tile 303 (bone devil) +# tile 605 (hezrou,female) +{ + ................ + ................ + ....GGGFF....... + ..NGFFNNFFF..... + .DFFFDDNFF.F.... + .GFFFDNFF.FFFAA. + .AFAFFFFFFFFFFAA + .GFFFF.FFF.FGFAA + .GAAAFF..LFGFFAA + ..FFFF.FFLFGFFFA + ..LLA.FLLLJJG.FA + .LLAFFLLFJJGFFFA + ..LAFLLLAAGF.FAA + .....L.LAGFFFFAA + ...........FFFA. + ................ +} +# tile 606 (bone devil,male) { ................ ................ @@ -5803,7 +11522,26 @@ Z = (195, 195, 195) ..NOOAA.OOL..... ................ } -# tile 304 (ice devil) +# tile 607 (bone devil,female) +{ + ................ + ................ + ..O.......O..... + ..OO.....OO..O.. + ...LNLOLOL....O. + ...LOOOOOL....O. + ...NAAOAAOA..O.. + ...NOOOOOOA.O... + ..NOOOFOOOOAO.A. + ..OOKNOOKOOALA.. + ..OOANOOAOOAKAA. + ..LLANOOALLAAAA. + ....NOOOLAAAAA.. + ...NOOAOOLAA.... + ..NOOAA.OOL..... + ................ +} +# tile 608 (ice devil,male) { ................ ................ @@ -5822,7 +11560,26 @@ Z = (195, 195, 195) ..BNNAA.NNP..... ................ } -# tile 305 (nalfeshnee) +# tile 609 (ice devil,female) +{ + ................ + ................ + ..N.......N..... + ..NN.....NN..... + ...PBPNPNP..BNB. + ...PNNNNNP..N.N. + ...BAANAANA...N. + ...BNNNNNNA.BNB. + ..BNNNFNNNNAN.A. + ..NNKBNNKNNABA.. + ..NNABNNANNA.AA. + ..PPABNNAPPAAAA. + ....BNNNPAAAAA.. + ...BNNANNPAA.... + ..BNNAA.NNP..... + ................ +} +# tile 610 (nalfeshnee,male) { ................ ................ @@ -5841,7 +11598,26 @@ Z = (195, 195, 195) ................ ................ } -# tile 306 (pit fiend) +# tile 611 (nalfeshnee,female) +{ + ................ + ................ + ......BB...BB... + ..KKKKKBB.BB.... + .KADKADKKKB..... + .KKKKKKKDKK..... + .OKDKOKKDDKD.... + .OKDKOKKKDKDD... + .KAAAKKDKAKKD... + ..KKKDDLAKKKD.A. + ...KK.KKKKKDDA.. + ....L..KDAKDAA.. + ......LLAAKDA... + .........LLA.... + ................ + ................ +} +# tile 612 (pit fiend,male) { ................ .K.O.......O.K.. @@ -5860,7 +11636,26 @@ Z = (195, 195, 195) ...CDDAA.DDK.... ................ } -# tile 307 (sandestin) +# tile 613 (pit fiend,female) +{ + ................ + .K.O.......O.K.. + .K.OO.....OO.KJ. + KJJ.LOCDCOL.KJJ. + KJJJKDDDDDKKJJJ. + KJJCKDNDNDKCJJJA + JJCCKDDDDDJCCJJA + JJCCCKDIDJDCCJJA + JACCDDKJJDDCDAJA + JACCKDDDDDKCDAJA + ...CDKDDDKCDDAAA + ....DKDDDKCDAAAA + .....CDDDKAAAA.. + ....CDDADDKA.... + ...CDDAA.DDK.... + ................ +} +# tile 614 (sandestin,male) { .....CCCCC..I... .I..CD....C..... @@ -5879,7 +11674,26 @@ Z = (195, 195, 195) .CD.DDAADDDADC.. ................ } -# tile 308 (balrog) +# tile 615 (sandestin,female) +{ + .....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 616 (balrog,male) { ................ .K..O.....O..K.. @@ -5898,7 +11712,26 @@ Z = (195, 195, 195) ..CDDDAA.DDDK.AA ................ } -# tile 309 (Juiblex) +# tile 617 (balrog,female) +{ + ................ + .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 618 (Juiblex,male) { ................ DD.........DD... @@ -5917,7 +11750,26 @@ Z = (195, 195, 195) .CCCCCCCCCCCKA.. ................ } -# tile 310 (Yeenoghu) +# tile 619 (Juiblex,female) +{ + ................ + 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 620 (Yeenoghu,male) { ....B.HHP....... ....BPPPP....... @@ -5936,7 +11788,26 @@ Z = (195, 195, 195) ...BPAA.PPA..... ................ } -# tile 311 (Orcus) +# tile 621 (Yeenoghu,female) +{ + ....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 622 (Orcus,male) { ................ .K..O.....O..K.. @@ -5955,7 +11826,26 @@ Z = (195, 195, 195) ...OOPPAOOPPAGA. ................ } -# tile 312 (Geryon) +# tile 623 (Orcus,female) +{ + ................ + .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 624 (Geryon,male) { .K...........K.. .K....JJJ....KJ. @@ -5974,7 +11864,26 @@ Z = (195, 195, 195) ....FGGGFFFFFFFA .....FFFFFFFFFA. } -# tile 313 (Dispater) +# tile 625 (Geryon,female) +{ + .K...........K.. + .K....JJJ....KJ. + KJJ..JJJJJ..KJJ. + KJJJKLLLLLKKJJJ. + KJJJKLBLBLKJJJJA + JJJJKLLLLLJJJJJA + JJALLKLLLJLLAJJA + JA.LLLKJJLLLAAJA + ...LJLLLLLKLAAAA + ...LCKLLLKCLAFGF + ...LLGLLFALLFFFA + .....GFFFAAAFFAA + ....GGGGFFAAFFAA + ....GFFFFFAAFGFA + ....FGGGFFFFFFFA + .....FFFFFFFFFA. +} +# tile 626 (Dispater,male) { ................ ......OJJO...... @@ -5993,7 +11902,26 @@ Z = (195, 195, 195) .....PPA.PPA.... ................ } -# tile 314 (Baalzebub) +# tile 627 (Dispater,female) +{ + ................ + ......OJJO...... + ......JJJJA..... + ......BLBLA..... + ......LLLLA..... + ......ALLA...... + .....CKAAKK.AAA. + ....CKKKKKKKAAA. + ....KACKKJAKAAA. + ....KACKKJAKAAJA + ....KACKKJAKAAJA + ....LACKKJJLAJA. + ......CKAJAJJA.. + ......CKAPAAAA.. + .....PPA.PPA.... + ................ +} +# tile 628 (Baalzebub,male) { ......F...F..... .......F.F...... @@ -6012,7 +11940,26 @@ Z = (195, 195, 195) .....FFA..FF.... ................ } -# tile 315 (Asmodeus) +# tile 629 (Baalzebub,female) +{ + ......F...F..... + .......F.F...... + ......BFFFB..... + .....BPPFBPP.... + .....PPPFPPP.... + ......PPFPP..... + .....CAFFFAK.... + ....CKKAFAKKKAA. + ....CAKJFAKAKAA. + ....FACJDAJAFAA. + ....FACKJJJAFAA. + ....FACKKKJAFAA. + ......CKKKJAAA.. + ......CKAKJA.A.. + .....FFA..FF.... + ................ +} +# tile 630 (Asmodeus,male) { ................ ......OJJO...... @@ -6031,7 +11978,26 @@ Z = (195, 195, 195) .....PPA.PPA.... ................ } -# tile 316 (Demogorgon) +# tile 631 (Asmodeus,female) +{ + ................ + ......OJJO...... + ......JJJJA..... + ......BLBLA..... + ......LLLLA..... + ......ALLA...... + .....CKAAKK.AAA. + ....CKKKKKKKAAA. + ...KKCKKKKJKKAA. + ...KKAKKKJAKKAJA + ...KA.CKKJAAKAJA + ...LA.CKKJJALJA. + ......CKAJAJJA.. + ......CKAPAAAA.. + .....PPA.PPA.... + ................ +} +# tile 632 (Demogorgon,male) { ...KKK..KKK..... ..KBKBK.BKBK.... @@ -6050,7 +12016,26 @@ Z = (195, 195, 195) ..GAGFAFFFAFA... ................ } -# tile 317 (Death) +# tile 633 (Demogorgon,female) +{ + ...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 634 (Death,male) { .BBBB....JJJ.... .BPPPP.JJJJ..... @@ -6069,7 +12054,26 @@ Z = (195, 195, 195) .CJJAAAAAAAAJJA. ACJAAAAAAAAAAAJ. } -# tile 318 (Pestilence) +# tile 635 (Death,female) +{ + .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 636 (Pestilence,male) { F........JJJ.... ..F....JJJJ..... @@ -6088,7 +12092,26 @@ Z = (195, 195, 195) ..JJFBFAFFAJJJA. .JJAAFAFAAAAAAJ. } -# tile 319 (Famine) +# tile 637 (Pestilence,female) +{ + 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 638 (Famine,male) { .........JJJ.... .......JJJ...... @@ -6107,7 +12130,26 @@ Z = (195, 195, 195) K...JJAAAJJAA... K..JJAAAAAJJJA.. } -# tile 320 (mail daemon) +# tile 639 (Famine,female) +{ + .........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 640 (mail daemon,male) { ...OP.BEEE.PO... ...OOEBEEEEOOD.. @@ -6126,7 +12168,26 @@ Z = (195, 195, 195) ..CDDDAAA.DDDK.. ................ } -# tile 321 (djinni) +# tile 641 (mail daemon,female) +{ + ...OP.BEEE.PO... + ...OOEBEEEEOOD.. + ..DLOBEEEEOOLDD. + .DDDLDDDDDDLDDD. + .CCDDDNDDNDDDCC. + CCDKDDDDDDDDJCCC + CDDKKDDIIDDJJCCD + CDDK.KDAADJJECDD + CCDKEEKKKJEEKCDD + .CCDK.EEEE..CDDD + .CCDAE.EENNNCDD. + .DDDAEEEENDNDDD. + ....BBEEENNNNN.. + ...BEEEAANNNNNA. + ..CDDDAAA.DDDK.. + ................ +} +# tile 642 (djinni,male) { .LL..NNN..LL.... ..L..NGNA.L..... @@ -6145,7 +12206,26 @@ Z = (195, 195, 195) .........IFED... ................ } -# tile 322 (jellyfish) +# tile 643 (djinni,female) +{ + .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 644 (jellyfish,male) { ................ .....PBPA....... @@ -6164,7 +12244,26 @@ Z = (195, 195, 195) ..PEE.P.E..E.... .P..E.P..E...... } -# tile 323 (piranha) +# tile 645 (jellyfish,female) +{ + ................ + .....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 646 (piranha,male) { ................ ................ @@ -6183,7 +12282,26 @@ Z = (195, 195, 195) .....E..P....... ....E..E...E.... } -# tile 324 (shark) +# tile 647 (piranha,female) +{ + ................ + ................ + ................ + ................ + ................ + ....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 648 (shark,male) { ................ ................ @@ -6202,7 +12320,26 @@ Z = (195, 195, 195) PDNPPEE..EE..... .PPPE..EEE..E... } -# tile 325 (giant eel) +# tile 649 (shark,female) +{ + ................ + ................ + ................ + ...............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 650 (giant eel,male) { ................ ................ @@ -6221,7 +12358,26 @@ Z = (195, 195, 195) ...EE.AAAAE.E... ..E...EE.E...E.. } -# tile 326 (electric eel) +# tile 651 (giant eel,female) +{ + ................ + ................ + ................ + ....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 652 (electric eel,male) { ................ ................ @@ -6240,7 +12396,26 @@ Z = (195, 195, 195) ...EE.AAADE.E... ..E...EE.E...E.. } -# tile 327 (kraken) +# tile 653 (electric eel,female) +{ + ................ + ................ + ................ + ....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 654 (kraken,male) { ................ ................ @@ -6259,7 +12434,26 @@ Z = (195, 195, 195) EEEEEEE..EE..... ..EEE..EEE..E... } -# tile 328 (newt) +# tile 655 (kraken,female) +{ + ................ + ................ + ..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 656 (newt,male) { ................ ................ @@ -6278,7 +12472,26 @@ Z = (195, 195, 195) ................ ................ } -# tile 329 (gecko) +# tile 657 (newt,female) +{ + ................ + ................ + ................ + ................ + ................ + ......JKKJ...... + .....CLCCLLC.... + ....LAAAACCLCA.. + .......LCCLLLCA. + ....LCCCLLLAALA. + ....CALLLLAAAA.. + ...LLLLCLAAA.... + ...LLAAALLA..... + ................ + ................ + ................ +} +# tile 658 (gecko,male) { ................ ................ @@ -6297,7 +12510,26 @@ Z = (195, 195, 195) ................ ................ } -# tile 330 (iguana) +# tile 659 (gecko,female) +{ + ................ + ................ + ...........LLP.. + ..........LLOOA. + ......PO.LLOOOA. + ......OOALOOOA.. + .......LLOOOA... + ...POALOOOAA.... + ...OOLOOOOOOA... + ....ALOOOAOPA... + ...DOOOOA.AA.... + ...OOOAOOA...... + ...OODAOPA...... + ..F.AA.AA....... + ................ + ................ +} +# tile 660 (iguana,male) { ................ ................ @@ -6316,7 +12548,26 @@ Z = (195, 195, 195) ................ ................ } -# tile 331 (baby crocodile) +# tile 661 (iguana,female) +{ + ................ + ................ + ................ + ................ + ................ + ....GPGPGGPF.... + ..GPAAAAFFGPF... + .GPAA.PFFGPPPAA. + ......FGGPPFPPAA + .PFGGGGPPPFAAPPA + .FGPAPPPPFAAAAA. + .GPPPPFPFAAA.A.. + .PPFFAFPPAA..... + D.AAAAAAPPA..... + ................ + ................ +} +# tile 662 (baby crocodile,male) { ................ ................ @@ -6335,7 +12586,26 @@ Z = (195, 195, 195) ................ ................ } -# tile 332 (lizard) +# tile 663 (baby crocodile,female) +{ + ................ + ................ + ................ + ................ + ................ + .....FFOFOFA.... + ....FOGFGGOFF... + ....GAAAAFOGFA.. + ...FAA.GFOGGGFA. + ...GFOOOGGGFAGA. + ...FGAGGGGFAAA.. + ..FGGGGFGFAA.... + ..GGDFAFGGA..... + ...D............ + ................ + ................ +} +# tile 664 (lizard,male) { ................ ................ @@ -6354,7 +12624,26 @@ Z = (195, 195, 195) ................ ................ } -# tile 333 (chameleon) +# tile 665 (lizard,female) +{ + ................ + ................ + ................ + ................ + ................ + ................ + ....FFFFGFJ..... + ..FFAAAJJGFJ.... + ......JGFFJFAA.. + ...JGGGFFJAAFA.. + ..JFAFFFJAAAA... + ..FFFFJJAAA..... + .JFAAAAFAA...... + .D.............. + ................ + ................ +} +# tile 666 (chameleon,male) { ................ ................ @@ -6373,7 +12662,26 @@ Z = (195, 195, 195) .DD............. ................ } -# tile 334 (crocodile) +# tile 667 (chameleon,female) +{ + ................ + ................ + ................ + .....GGGG....... + ...GGGGGGGG..... + ...GGFFFFGGFA... + ..GPAAAGFFGGFA.. + .GPAA.PFFGGGGAA. + ...GGGGGGGGFGGAA + .PGGBBGGGGFAAGGA + .FGGABGGGFAAAAA. + .GGGGGFGFAAA.A.. + .DGFFAFGGAA..... + D.AAAAAAGGA..... + .DD............. + ................ +} +# tile 668 (crocodile,male) { ................ ................ @@ -6392,7 +12700,26 @@ Z = (195, 195, 195) .DF............. ................ } -# tile 335 (salamander) +# tile 669 (crocodile,female) +{ + ................ + ................ + ................ + ................ + ....FFOFOOFA.... + ...FOGFGFGOFFA.. + ..FGAAAAFFOGFFA. + .FFAA.GFFOGGGGFA + ......FOOGGGGGGA + .G.OOOOGGGGFAGGA + .FOGAGGGGGFAAAA. + FGGGGGFGGFAA.... + GGDDFAFGGGA..... + GDDFAAAAGGA..... + .DF............. + ................ +} +# tile 670 (salamander,male) { ................ ................ @@ -6411,7 +12738,26 @@ Z = (195, 195, 195) ..ACCA.......... ...AAA.......... } -# tile 336 (long worm tail) +# tile 671 (salamander,female) +{ + ................ + ................ + ................ + ......CCC....... + ....CCCCCCC..... + ...CCDDDDCCDA... + ....AAAADDCCDA.. + ......KDDCCCCAA. + ..LLLCCCCCCDCCAA + .KLCCCLLLCDAACCA + .DCEECLKKDAAAAA. + DCCAECDKDAAA.A.. + CCCCCCDCCAA..... + .DAADAAACCA..... + ..ACCA.......... + ...AAA.......... +} +# tile 672 (long worm tail,male) { ........ILLLL... ......IILLAA.... @@ -6430,7 +12776,26 @@ Z = (195, 195, 195) .LLLIIIILLLA.... ...LLLLLAAA..... } -# tile 337 (archeologist) +# tile 673 (long worm tail,female) +{ + ........ILLLL... + ......IILLAA.... + .....ILLAA...... + .....ILA........ + .....ILA........ + ......LLA...II.. + .......LLIIILLLL + ........ILLAAA.L + ...IIIILLALL.... + .ILLLLLAA..LL... + ILLAAAA.....LA.. + ILA.........LA.. + LLA........LLA.. + LILA......LLA... + .LLLIIIILLLA.... + ...LLLLLAAA..... +} +# tile 674 (archeologist,male) { ................ ................ @@ -6449,7 +12814,26 @@ Z = (195, 195, 195) .....CJJ.JKJ.... ................ } -# tile 338 (barbarian) +# tile 675 (archeologist,female) +{ + ................ + ................ + ......KJ.J...... + ......KJJJ...... + ....KCKKKJJJ.... + ......LELEA..... + ......LLLLA..... + ......ALLA...... + .....CKAAKJ.AAA. + ....CKKKJJJJAAA. + ....KACKJJAJAAA. + ....LACJKJALAAA. + ......CJJKAAAA.. + .....KCJAJJA.A.. + .....CJJ.JKJ.... + ................ +} +# tile 676 (barbarian,male) { ................ ................ @@ -6468,7 +12852,26 @@ Z = (195, 195, 195) .....LLA.LLA.... ................ } -# tile 339 (caveman) +# tile 677 (barbarian,female) +{ + ................ + ................ + .......HHA...... + ......HHHHA..... + ......LFLFA..... + ......LLLLA..... + ......ALLA...... + .....LLAALL.AAA. + ....LLLLLLLLAAA. + ....LALLLLALAAA. + ....LAALLAALAAA. + ....LAJJKJALAAA. + ......LJJLAAAA.. + ......LLALAA.A.. + .....LLA.LLA.... + ................ +} +# tile 678 (cave dweller,male) { ................ ................ @@ -6487,7 +12890,7 @@ Z = (195, 195, 195) ................ ................ } -# tile 340 (cavewoman) +# tile 679 (cave dweller,female) { ................ ................ @@ -6506,7 +12909,7 @@ Z = (195, 195, 195) ................ ................ } -# tile 341 (healer) +# tile 680 (healer,male) { ................ .......NN....... @@ -6525,7 +12928,26 @@ Z = (195, 195, 195) ................ ................ } -# tile 342 (knight) +# tile 681 (healer,female) +{ + ................ + .......NN....... + ......NDDO...... + ......NNNN...... + ......ELEP...... + ......LLLP...... + .......LLP...... + ......O..PA.AAA. + .....NNOOPPAAAA. + ....OOONOPPPAA.. + ....LANOOPALAA.. + ......NOOPAAAA.. + .....NOOOPAA.A.. + ....NOOOOOPA.... + ................ + ................ +} +# tile 682 (knight,male) { ................ ................ @@ -6544,7 +12966,26 @@ Z = (195, 195, 195) ................ ................ } -# tile 343 (monk) +# tile 683 (knight,female) +{ + ................ + ................ + .......BPA...... + ......BPPPA..... + ......PEEPA..... + ......PLLPA..... + ......ALLAA..... + .....BBAABB.AAA. + ....BPPPPPPPAAA. + ....PABPPPAPAAA. + ....LA.PP.ALAAA. + ......BP.PAAAA.. + ......BPAPAA.A.. + .....PPA.PPA.... + ................ + ................ +} +# tile 684 (monk,male) { ................ ................ @@ -6563,7 +13004,26 @@ Z = (195, 195, 195) ................ ................ } -# tile 344 (priest) +# tile 685 (monk,female) +{ + ................ + ................ + .......CCC...... + ......JCJJJA.... + ......CAAAJA.... + ......CAAAJA.... + ......CKLKCAAAA. + .....CDDDDDDAAAA + ....CDDLALDDDAAA + ....DALLALLADAA. + ....DDDDCDDDDAA. + .....AACCCDAAAA. + .....CDCCCDDA.A. + ....CCCCCCCDD... + ................ + ................ +} +# tile 686 (cleric,male) { ................ ................ @@ -6573,16 +13033,16 @@ Z = (195, 195, 195) ......ALLJA..... ......IJJIAAAA.. .....ODDDDDAAAA. - ....IDNDDDDDAAA. - ...NLNNNDDALAA.. - ......NDDDAAAA.. + ....INNDDDDDAAA. + ...NLNNDDDALAA.. + ......DDDDAAAA.. ......DIIDAAAA.. .....DDIIDDA.A.. ....DIIIIIDD.... ................ ................ } -# tile 345 (priestess) +# tile 687 (cleric,female) { ................ .......JJ....... @@ -6592,16 +13052,16 @@ Z = (195, 195, 195) .....JJLLJJ..... .....JEJJEJAAA.. .....ODEEDDAAAA. - ....IDINDDDDAAA. - ....L.NNNDALAA.. - ......INDDAAAA.. - ......INDDAAAA.. + ....IDINNDDDAAA. + ....L.DNNDALAA.. + ......IDDDAAAA.. + ......IDDDAAAA.. .....DDIIDDA.A.. ....DIIIIIDD.... ................ ................ } -# tile 346 (ranger) +# tile 688 (ranger,male) { ................ ................ @@ -6620,7 +13080,26 @@ Z = (195, 195, 195) ................ ................ } -# tile 347 (rogue) +# tile 689 (ranger,female) +{ + ................ + ................ + ........CJA..... + .......CJJJA.... + .......JEEJA.... + .......JLLJA.... + .......ALLAA.... + ......GGAAGG.AAA + .....BPFFFFPPAAA + .....PAGFFFAPAAA + .....LA.FF.ALAAA + .......BP.PAAAA. + .......BPAPAA.A. + ......PPA.PPA... + ................ + ................ +} +# tile 690 (rogue,male) { ................ ................ @@ -6639,7 +13118,26 @@ Z = (195, 195, 195) .....KKA.KKA.... ................ } -# tile 348 (samurai) +# tile 691 (rogue,female) +{ + ................ + ................ + ................ + .....OA...OA.... + .....OOIDPPA.... + ......IDDDA..... + ......LKLKA..... + ......LLLLA..... + ......ALLA...... + ......BAABAA..A. + .....KEBBEJAAAA. + ....KAAEEAAKAA.. + ....LAJJHJALAA.. + ......KKJKAAAA.. + .....KKA.KKA.... + ................ +} +# tile 692 (samurai,male) { ................ ................ @@ -6658,7 +13156,26 @@ Z = (195, 195, 195) .....IIA.IIA.... ................ } -# tile 349 (tourist) +# tile 693 (samurai,female) +{ + ................ + ................ + .........AA..... + .......AAA...... + ......AAAAA..... + .....ALFLFA..... + .....ALLLLA..... + ......ALLA...... + ....IIIAAIIIAAA. + ....LDIIIIDLAAA. + ....LABBBBALAAA. + ....LABBBBALAAA. + ......IDDDAAAA.. + ......IDADAA.A.. + .....IIA.IIA.... + ................ +} +# tile 694 (tourist,male) { ................ ................ @@ -6677,7 +13194,45 @@ Z = (195, 195, 195) .....LLA.LLA.... ................ } -# tile 350 (valkyrie) +# tile 695 (tourist,female) +{ + ................ + ................ + ......JKJJA..... + ......KJJJA..... + ...JJJJJJJJJJ... + ......LFLFAA.... + ......LLLLA..... + ......ALLA...... + .....HGAAGH.AAA. + ....LLGHHGLLAAA. + ....LAHGHGALAAA. + ....LAHHGHALAAA. + ......JJJKAAAA.. + ......LLALAA.A.. + .....LLA.LLA.... + ................ +} +# tile 696 (valkyrie,male) +{ + D..............D + .D............D. + ..D...LHHL...D.. + ...D.HHHHHL.D... + ....DHELELHD.... + ....HDLLLLD..... + ...HHHDLLD...... + ...HJKJDDKJJAAA. + ..HHLJJDDJJLAAA. + ..H.LADKDCALAAA. + ....LDAKKDALAAA. + ....D.KKJKDAAA.. + ...D..KJAJAD.A.. + ..D..KLA.LKAD... + .D...........D.. + D.............D. +} +# tile 697 (valkyrie,female) { ................ ................ @@ -6696,7 +13251,7 @@ Z = (195, 195, 195) ................ ................ } -# tile 351 (wizard) +# tile 698 (wizard,male) { ................ .........BP..... @@ -6715,7 +13270,26 @@ Z = (195, 195, 195) ....BPPPPPPE.... ................ } -# tile 352 (Lord Carnarvon) +# tile 699 (wizard,female) +{ + ................ + .........BP..... + .......BBPE..... + ......BPPEA..... + ......BAAEA..... + ......BAAEA..... + ......PLLE...... + ......PAAEA.AAA. + .....BBPBEEAAAA. + ....PPPBEEEEAA.. + ....LABPPEALAA.. + ......BPPEAAAA.. + .....BPPPEAA.A.. + .....BPPPPEA.... + ....BPPPPPPE.... + ................ +} +# tile 700 (Lord Carnarvon,male) { .......JJ....... ......KJJJ...... @@ -6734,7 +13308,26 @@ Z = (195, 195, 195) .....PPA.PPA.... ................ } -# tile 353 (Pelias) +# tile 701 (Lord Carnarvon,female) +{ + .......JJ....... + ......KJJJ...... + ....KCKKKJJJ.... + ......LELEA..... + ......LLLLA..... + ......ALLA...... + .....CIAAIK.AAA. + ....CKKIIKKKAAA. + ...KKCKKHKJKKAA. + ...KKAKHKJAKKAA. + ...KAIHKKJIAKA.. + ...LAICKKJIALA.. + .....ICKAJIAAA.. + ......CKAPAAAA.. + .....PPA.PPA.... + ................ +} +# tile 702 (Pelias,male) { ................ .......JJ....... @@ -6753,7 +13346,26 @@ Z = (195, 195, 195) .....PPA.PPA.... ................ } -# tile 354 (Shaman Karnov) +# tile 703 (Pelias,female) +{ + ................ + .......JJ....... + ......KKKJ...... + ......LELEA..... + ......LLLLA..... + ......ALLA...... + .....CKAAKK.AAA. + ....CKKKKKKKAAA. + ...KKCKKKKJKKAA. + ...KKAKKKKAKKAA. + ...KA.CKKJAAKA.. + ...LA.CKAJAALA.. + ......CKAJAAAA.. + ......CKAPAAAA.. + .....PPA.PPA.... + ................ +} +# tile 704 (Shaman Karnov,male) { ................ .......JJA...... @@ -6772,7 +13384,26 @@ Z = (195, 195, 195) .....LLA.LLA.... ................ } -# tile 355 (Earendil) +# tile 705 (Shaman Karnov,female) +{ + ................ + .......JJA...... + ......JJJJA..... + .....JFLFLJ..... + .....JLLLLJ..... + .....JJDDJA..... + ....LHAJJAHLAA.. + ...LLLHAAHLLLAA. + ...LLLLHHLLLLAA. + ...LLALHHLALLAA. + ...LLALLLLALLAA. + ....LACKKJALAAA. + ......CKKJAAAA.. + ......LA.LAA.A.. + .....LLA.LLA.... + ................ +} +# tile 706 (Earendil,male) { .........G...... ....B..GGF..B... @@ -6791,7 +13422,26 @@ Z = (195, 195, 195) .....AAAAAA..... ................ } -# tile 356 (Elwing) +# tile 707 (Earendil,female) +{ + .........G...... + ....B..GGF..B... + ...BB.GGGGABB... + ..BPBPLELEABPB.. + ..BBBPLLLLABBB.. + ..PBPPALLAPPP... + ...PPBGAAGBBB... + ...BBLGGGFLBBB.. + ..BBLAAGFAALBB.. + ...BLAGGGFALB... + ......GFAF...... + ......L..L.AAA.. + ......AAAAAAAA.. + ....AAAAAAAA.... + .....AAAAAA..... + ................ +} +# tile 708 (Elwing,male) { .........G...... ....B..GGF..B... @@ -6810,7 +13460,26 @@ Z = (195, 195, 195) .....AAAAAA..... ................ } -# tile 357 (Hippocrates) +# tile 709 (Elwing,female) +{ + .........G...... + ....B..GGF..B... + ...BB.GGGGABB... + ..BPBHLELEHBPB.. + ..BBBHLLLLHBBB.. + ..PBHHALLAHHP... + ...PHHGAAGHHB... + ...BBLGGGFLBBB.. + ..BBLAAGFAALBB.. + ...BLAGGGFALB... + ......GFAF...... + ......L..L.AAA.. + ......AAAAAAAA.. + ....AAAAAAAA.... + .....AAAAAA..... + ................ +} +# tile 710 (Hippocrates,male) { ................ ....LLLCCD...... @@ -6829,7 +13498,26 @@ Z = (195, 195, 195) .LCCCCCCCDA..... ................ } -# tile 358 (King Arthur) +# tile 711 (Hippocrates,female) +{ + ................ + ....LLLCCD...... + ...LLCCDDA...... + ...LAAAADA...... + ...LBABADA...... + ...LAAAADA...... + ...CCLLDD.B..... + ....CKKDDFBFAAA. + ..LLLCLDDDBFAAA. + .CCCCLDDDFBAAA.. + .LALLCCDDFBDAA.. + ...LCCCCDABFAA.. + ...LCCCCDABAAA.. + ..LLCCCCDAA.AA.. + .LCCCCCCCDA..... + ................ +} +# tile 712 (King Arthur,male) { ................ ................ @@ -6848,7 +13536,26 @@ Z = (195, 195, 195) ....PPAA.PPA.... ................ } -# tile 359 (Grand Master) +# tile 713 (King Arthur,female) +{ + ................ + ................ + ......OHHA...... + .....OHHHHA..... + .....HBLBHA..... + .....HLLLHA..... + .....ALLLAA..... + ....BBAAABB.AAA. + ...BPPPPPPPPAAA. + ...PABPPPPACPAA. + ..NNNNNNNNNCLCA. + .....BPP.PACAA.. + .....BPAPPAA.A.. + .....BPAPPAA.A.. + ....PPAA.PPA.... + ................ +} +# tile 714 (Grand Master,male) { ................ .......LL....... @@ -6867,7 +13574,26 @@ Z = (195, 195, 195) ..JACCCCCCCCAA.. ................ } -# tile 360 (Arch Priest) +# tile 715 (Grand Master,female) +{ + ................ + .......LL....... + ......LLLL...... + ......LLLL...... + ..LC.CALLAC..... + .CLLC.CAACCCC... + .CJLACCCCCCCCC.. + ..JAACCCCCCCCCC. + ..JCCCCCCCCCCC.A + ..J..PPPPPLCCAAA + ..J..CCCCLLCAAAA + ..J..CCCCCCCAAAA + ..J..CCCCCCCAAAA + ..J.ACCCCCCCAAA. + ..JACCCCCCCCAA.. + ................ +} +# tile 716 (Arch Priest,male) { ..N............. .NNN..JLLJ...... @@ -6886,7 +13612,26 @@ Z = (195, 195, 195) ..HACCCJJCCCAA.. ................ } -# tile 361 (Orion) +# tile 717 (Arch Priest,female) +{ + ..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 718 (Orion,male) { ................ ................ @@ -6905,7 +13650,26 @@ Z = (195, 195, 195) ......BPAPAA.A.. .....PPA.PPA.... } -# tile 362 (Master of Thieves) +# tile 719 (Orion,female) +{ + ................ + ................ + .......CJA...... + ......CJJJA..... + ......JEEJA..... + ......JLLJA..... + ......ALLAA..... + .....GGAAGG..... + ....BGFFFFFP.... + ....BPFFFFPPAAA. + ....PAGFFFAPAAA. + ....LANNNNALAAA. + ......BP.PAAAAA. + ......BP.PAAAA.. + ......BPAPAA.A.. + .....PPA.PPA.... +} +# tile 720 (Master of Thieves,male) { ................ ...H.....H...... @@ -6924,7 +13688,26 @@ Z = (195, 195, 195) ...JJA..JJA..... ................ } -# tile 363 (Lord Sato) +# tile 721 (Master of Thieves,female) +{ + ................ + ...H.....H...... + ...HHIDKHH...... + ....IDDDD....... + ....LLLLLA...... + ....LBLBLA...... + ....LLLLLA...... + .....LLLA....... + ....B.AABAA..... + ...KEBBBEJAAA... + ..KAEEEEEAJAAA.. + ..LAJJHHJALAAA.. + ....JKKKJAAAAA.. + ....KJAJKAAAA... + ...JJA..JJA..... + ................ +} +# tile 722 (Lord Sato,male) { .....AAA........ .....AAA........ @@ -6943,7 +13726,26 @@ Z = (195, 195, 195) ..IIIA.IIIAA.... ................ } -# tile 364 (Twoflower) +# tile 723 (Lord Sato,female) +{ + .....AAA........ + .....AAA........ + ...AAAAAAA...... + ..AALLLLLAA..... + ..ALFFLFFLA..... + ..ALLLLLLLA..... + ...AALLLA....... + IIIIIAAAIIIIAAA. + LLDIIIIIIDLLAAA. + LLABBBBBBALLAAA. + LLABBBBBBALLAAA. + LLABBBBBBALLAAA. + ...IIDDDDAAAAAA. + ...IIAAIDAAA..A. + ..IIIA.IIIAA.... + ................ +} +# tile 724 (Twoflower,male) { ................ ................ @@ -6962,7 +13764,26 @@ Z = (195, 195, 195) .....LLA.LLA.... ................ } -# tile 365 (Norn) +# tile 725 (Twoflower,female) +{ + ................ + ................ + ......JKJJA..... + ......KJJJA..... + ....JJJJJJJJ.... + .....NNLNNA..... + ....NALNALNA.... + .....NNANNAA.... + .....AAAAAA.AAA. + ....LLHGHGLLAAA. + ....LAGGGGALAAA. + ....LAHGHGALAAA. + ......JJJKAAAA.. + ......JJAKAA.A.. + .....LLA.LLA.... + ................ +} +# tile 726 (Norn,male) { ................ ................ @@ -6981,7 +13802,26 @@ Z = (195, 195, 195) ................ ................ } -# tile 366 (Neferet the Green) +# tile 727 (Norn,female) +{ + ................ + ................ + ......NNN....... + .....NNNNN...... + .....NELELN..... + ....NNLLLLN..... + ...NNNALLA...... + ...NJKJAAKJJAAA. + ..NNLJJKKJJLAAA. + ..N.LACKJCALAAA. + ....LAKKKKALAAA. + ......KKJKAAAA.. + ......KJAJAA.A.. + .....KLA.LKA.... + ................ + ................ +} +# tile 728 (Neferet the Green,male) { ................ ................ @@ -7000,7 +13840,26 @@ Z = (195, 195, 195) ...BPPPPPPPE.... ................ } -# tile 367 (Minion of Huhetotl) +# tile 729 (Neferet the Green,female) +{ + ................ + ................ + ......GGG....... + .....GFFFG...... + ....GFEFEG...... + ....GFFFFEG..... + .N.GPEFFFEE..... + .I..BBEAAEA.AA.. + .I.BBPPBBEEAAAA. + .IGBPPPPPEEEAA.. + .I.PP.EPEAAGAA.. + .I...BPPPAAAAA.. + .N...BPPPEAA.A.. + ....BPPPPPEA.... + ...BPPPPPPPE.... + ................ +} +# tile 730 (Minion of Huhetotl,male) { ...OP......PO... ...OODDDDDDOOD.. @@ -7019,7 +13878,26 @@ Z = (195, 195, 195) ..CDDDAAA.DDDK.. ................ } -# tile 368 (Thoth Amon) +# tile 731 (Minion of Huhetotl,female) +{ + ...OP......PO... + ...OODDDDDDOOD.. + ..DLOOCDDCOOLDD. + .DDDLDDDDDDLDDD. + .CCDDDNDDNDDDCC. + CCDKDDDDDDDDJCCC + CDDKKDDIIDDJJCCD + CDDKKKDAADJJDCDD + CCDKDDKKKJDDKCDD + .CCDKKDDDDKKCDDD + .CCDADKDDKDACDD. + .DDDADDDDDDADDD. + ....CCDDDDKKAA.. + ...CDDDAADDDKAA. + ..CDDDAAA.DDDK.. + ................ +} +# tile 732 (Thoth Amon,male) { ................ ......OJJO...... @@ -7038,7 +13916,26 @@ Z = (195, 195, 195) .....PPA.PPA.... ................ } -# tile 369 (Chromatic Dragon) +# tile 733 (Thoth Amon,female) +{ + ................ + ......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 734 (Chromatic Dragon,male) { ......GGGFA..... .....NFNFEEA.... @@ -7057,7 +13954,26 @@ Z = (195, 195, 195) ....GFAA...CCJA. ........FFFFJA.. } -# tile 370 (Goblin King) +# tile 735 (Chromatic Dragon,female) +{ + ......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 736 (Goblin King,male) { ................ ................ @@ -7076,7 +13992,26 @@ Z = (195, 195, 195) ................ ................ } -# tile 371 (Cyclops) +# tile 737 (Goblin King,female) +{ + ................ + ................ + .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 738 (Cyclops,male) { ................ ....LLLLL....... @@ -7095,7 +14030,26 @@ Z = (195, 195, 195) ....CJJJCLAAAAAA ..LLLLL.LLLLLAA. } -# tile 372 (Ixoth) +# tile 739 (Cyclops,female) +{ + ................ + ....LLLLL....... + ...CLLLLLC...... + ...LBABNNL...... + ...LBBBNNLJA.... + ...CLNNNLCJA.... + ....LLLLLJAAA... + ....LAALLAAAA... + ..JKJLLLKAKJAA.A + .CLKAJJJJAKLCAAA + .LLJKAAAAKJLLAA. + .LAAJKKKKJAALAA. + .LC.GGGHGGACLAAA + .LL.JJJJJJALLAAA + ....CJJJCLAAAAAA + ..LLLLL.LLLLLAA. +} +# tile 740 (Ixoth,male) { ....O......O.... ....O......O.... @@ -7114,7 +14068,26 @@ Z = (195, 195, 195) ..CDDDAAA.DDDK.. ................ } -# tile 373 (Master Kaen) +# tile 741 (Ixoth,female) +{ + ....O......O.... + ....O......O.... + ...LOOCDDCOOL... + ...DDDDDDDDDDD.. + .CCDDDGDDGDDDCC. + CCDKDDDDDDDDJCCC + CDDKKKDIIDJJDCCD + CDDKDDKJJJDDDCDD + CCDKDDDDDDDDKCDD + .CCDKKDDDDKKCDDD + .CCDADKDDKDACDD. + .DDDADDDDDDADDD. + ....CCDDDDKKAA.. + ...CDDDAADDDKAA. + ..CDDDAAA.DDDK.. + ................ +} +# tile 742 (Master Kaen,male) { ................ .......KKA...... @@ -7133,7 +14106,26 @@ Z = (195, 195, 195) ...KJJJJJJJJJA.. ................ } -# tile 374 (Nalzok) +# tile 743 (Master Kaen,female) +{ + ................ + .......KKA...... + ......KJJKA..... + ..KKA.KAAKA.KKA. + .KAAKAKDDKAKAAKA + .KOOJKKOOKKKOOJA + .KJJJJJJJJJKJJJA + ..KJJJJJJJJJJJA. + ....KJJJJJJJA... + ......KJJJAAAAAA + .....KJJJJKAAAAA + .....KJJJJJAAAAA + ....KJJJJJJKAAA. + ...KJJJJJJJJKAA. + ...KJJJJJJJJJA.. + ................ +} +# tile 744 (Nalzok,male) { ....O......O.... ....O......O.... @@ -7152,7 +14144,26 @@ Z = (195, 195, 195) ..CDDDAAA.DDDK.. ................ } -# tile 375 (Scorpius) +# tile 745 (Nalzok,female) +{ + ....O......O.... + ....O......O.... + ...LOOCDDCOOL... + ...DDDDDDDDDDD.. + .CCDDDBDDBDDDCC. + CCDKDDDDDDDDJCCC + CDDKKKDIIDJJDCCD + CDDKDDKJJJDDDCDD + CCDKDDDDDDDDKCDD + .CCDKKDDDDKKCDDD + .CCDADKDDKDACDD. + .DDDADDDDDDADDD. + ....CCDDDDKKAA.. + ...CDDDAADDDKAA. + ..CDDDAAA.DDDK.. + ................ +} +# tile 746 (Scorpius,male) { .....JLJLJAA.... ....JA.JCJCKAA.. @@ -7171,7 +14182,26 @@ Z = (195, 195, 195) ...D...JAAJA.JJ. ........JA.JA... } -# tile 376 (Master Assassin) +# tile 747 (Scorpius,female) +{ + .....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 748 (Master Assassin,male) { ................ ................ @@ -7190,7 +14220,26 @@ Z = (195, 195, 195) .....AAA.AAA.... ................ } -# tile 377 (Ashikaga Takauji) +# tile 749 (Master Assassin,female) +{ + ................ + ................ + ................ + .......AA....... + ......AAAA...... + .....ABLBLA..... + .....AAAAAA..... + ......AAAA...... + .....AAAAAA..PP. + ....AAAAAAAAPPP. + ....AAAAAAAAPPP. + ....LAAAAAALPPP. + ......AAAAAPPP.. + ......AAAAAP.P.. + .....AAA.AAA.... + ................ +} +# tile 750 (Ashikaga Takauji,male) { ................ ................ @@ -7209,7 +14258,26 @@ Z = (195, 195, 195) .....IIA.IIA.... ................ } -# tile 378 (Lord Surtur) +# tile 751 (Ashikaga Takauji,female) +{ + ................ + ................ + ......AA........ + .......AAA...... + ......AAAAA..... + .....ALFLFA..... + .....ALLLLA..... + ......ALLA...... + ....IIIAAIIIAAA. + ....LDIIIIDLAAA. + ....LAIIIIALAAA. + ....LALHHLALAAA. + ......IIIIAAAA.. + ......IIAIAA.A.. + .....IIA.IIA.... + ................ +} +# tile 752 (Lord Surtur,male) { ....PPDDDDAA.... ....PDDDDDDDA... @@ -7228,7 +14296,26 @@ Z = (195, 195, 195) .....BPPABPPAAAA ...LLLLJ.BLLLKAA } -# tile 379 (Dark One) +# tile 753 (Lord Surtur,female) +{ + ....PPDDDDAA.... + ....PDDDDDDDA... + ...PPDLLLLDDA... + ...PDPFLLFFDA... + ...PPPLLLLLDA... + ....PLLAALLAAA.. + ...PPALLLLBAAAA. + ...PPDBBBBBBBAA. + ..BDDHDPBPPPPPA. + ..PPHDDPBPPPPPA. + ..LAHDHPBPPAALAA + JLAADDHBBBBAALAA + JJLJDHHPBPPPCLAA + ..LLJBPPABPPLLAA + .....BPPABPPAAAA + ...LLLLJ.BLLLKAA +} +# tile 754 (Dark One,male) { ................ ......AAA....... @@ -7247,7 +14334,26 @@ Z = (195, 195, 195) AAAAAAAAAAAAAAAA ................ } -# tile 380 (student) +# tile 755 (Dark One,female) +{ + ................ + ......AAA....... + .....AAAAA...... + .....ADADA...... + .....AAAAA...... + ....AAAAAAA..... + ....AAAAAAA..... + ...AAAAAAAAA.... + ...AAAAAAAAA.... + ..AAAAAAAAAAA... + ..AAAAAAAAAAA... + ...AAAAAAAAA.... + ...AAAAAAAAAA... + ..AAAAAAAAAAAA.. + AAAAAAAAAAAAAAAA + ................ +} +# tile 756 (student,male) { ................ ................ @@ -7266,7 +14372,26 @@ Z = (195, 195, 195) .....CJJ.JKJ.... ................ } -# tile 381 (chieftain) +# tile 757 (student,female) +{ + ................ + ................ + .....GGFGG...... + .......G........ + ......NDND...... + ...DDDDDDDD..... + ......LELEA..... + ......LLLLA..... + ......ALLA...... + .....CKAAKJ.AAA. + ....CKKKJJJJAAA. + ....KACKJJAJAAA. + ....LACJKJALAAA. + .....KCJAJJA.A.. + .....CJJ.JKJ.... + ................ +} +# tile 758 (chieftain,male) { ................ ................ @@ -7285,7 +14410,26 @@ Z = (195, 195, 195) .....LLA.LLA.... ................ } -# tile 382 (neanderthal) +# tile 759 (chieftain,female) +{ + ................ + ................ + .......HHA...... + ......HHHHA..... + ......LFLFA..... + ......LLLLA..... + .....HALLAH..... + ....LLHAAHLLAAA. + ....LLLIILLLAAA. + ....LALIILALAAA. + ....LAALLAALAAA. + ....LAJJKJALAAA. + ......LJJLAAAA.. + ......LLALAA.A.. + .....LLA.LLA.... + ................ +} +# tile 760 (neanderthal,male) { ................ ................ @@ -7304,7 +14448,26 @@ Z = (195, 195, 195) ................ ................ } -# tile 383 (High-elf) +# tile 761 (neanderthal,female) +{ + ................ + ................ + ................ + ......JJJJ...... + .....JJJJJJ..... + .....JFLFLJ..... + .....JLLLLJ..... + .....JJDDJA..... + ....JJAJJAJJ.AA. + ...JLLJAAJLLJAA. + ...LLALJJLALLAA. + ....LALCCLALAAA. + ......LA.LAA.A.. + .....LLA.LLA.... + ................ + ................ +} +# tile 762 (High-elf,male) { .........G...... .......GGF...... @@ -7323,7 +14486,26 @@ Z = (195, 195, 195) ......GFAFAA.... .....KLA.LKA.... } -# tile 384 (attendant) +# tile 763 (High-elf,female) +{ + .........G...... + .......GGF...... + ......GGGGA..... + ......LILIA..... + ......LLLLA..... + ......ALLA...... + ......GAAG..AA.. + .....LGGGFLAAAA. + ....LAAGFAALAAA. + ....LA.GFAALAA.. + ....LA.GFAALAA.. + ....LAGGGFAL.A.. + ......GFAFAA.A.. + ......GFAFAA.... + ......GFAFAA.... + .....KLA.LKA.... +} +# tile 764 (attendant,male) { ................ ................ @@ -7342,7 +14524,26 @@ Z = (195, 195, 195) ................ ................ } -# tile 385 (page) +# tile 765 (attendant,female) +{ + ................ + ................ + ................ + ......JJJ....... + .....JLLLJ...... + ......BLB....... + .....CLLLD...... + .....CCKKDA.AAA. + .....LLCLDDAAAA. + ....CCCLDDDDAA.. + ....LALCCDALAA.. + ......LCCDAAAA.. + .....LCCCDAA.A.. + ....LCCCCCDA.... + ................ + ................ +} +# tile 766 (page,male) { ................ ................ @@ -7361,7 +14562,26 @@ Z = (195, 195, 195) ................ ................ } -# tile 386 (abbot) +# tile 767 (page,female) +{ + ................ + ................ + .......BPA...... + ......BPPPA..... + ......PEEPA..... + ......PLLPA..... + .......LLAA..... + ......BAABA.AAA. + .....BPPPPPAAAA. + ....PABPPPAPAAA. + ....LA.PP.ALAAA. + ......BP.PAAAA.. + ......LLALAA.A.. + .....LLA.LLA.... + ................ + ................ +} +# tile 768 (abbot,male) { ................ ................ @@ -7380,7 +14600,26 @@ Z = (195, 195, 195) ....CDCCCDDA.A.. ...CCCCCCCDD.... } -# tile 387 (acolyte) +# tile 769 (abbot,female) +{ + ................ + ................ + ................ + ................ + ................ + ......KLK....... + ......LLL....... + ....CCLLLJJ..... + ....KCKLKKJAAA.. + ....CDDDDDDAAAA. + ...CDDLALDDDAAA. + ...DALLALLADAA.. + ...DDDDCDDDDAA.. + ....AACCCDAAAA.. + ....CDCCCDDA.A.. + ...CCCCCCCDD.... +} +# tile 770 (acolyte,male) { ................ ................ @@ -7399,7 +14638,26 @@ Z = (195, 195, 195) ....LCCCCCDD.... ................ } -# tile 388 (hunter) +# tile 771 (acolyte,female) +{ + ................ + ................ + ................ + ......JJJJ...... + ......JLLJA..... + ......LLLLA..... + ......ALLJA..... + ......CJJCAAAA.. + .....LDDDDDAAAA. + ....CDCCDDDDAAA. + ....L.LCCDALAA.. + ......LCCDAAAA.. + ......LCCDAAAA.. + .....LDCCDDA.A.. + ....LCCCCCDD.... + ................ +} +# tile 772 (hunter,male) { ................ ................ @@ -7418,7 +14676,26 @@ Z = (195, 195, 195) ....JPPA.PPA.... ................ } -# tile 389 (thug) +# tile 773 (hunter,female) +{ + ................ + ................ + ................ + ....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 774 (thug,male) { ................ ................ @@ -7437,7 +14714,26 @@ Z = (195, 195, 195) .....KKA.KKA.... ................ } -# tile 390 (ninja) +# tile 775 (thug,female) +{ + ................ + ................ + ................ + .......ID....... + ......IDDDA..... + ......LKLKA..... + ......LLLLA..... + ......ALLA...... + .....KKAAKKA..A. + ....KKJKKJJKAAA. + ....KAAJJAAKAA.. + ....LAJJJJALAA.. + ......KKJKAAAA.. + ......KAAKAAAA.. + .....KKA.KKA.... + ................ +} +# tile 776 (ninja,male) { ................ ................ @@ -7456,7 +14752,26 @@ Z = (195, 195, 195) .....AAA.AAA.... ................ } -# tile 391 (roshi) +# tile 777 (ninja,female) +{ + ................ + ................ + .........AA..... + .......AAA...... + ......AAAAA..... + .....AFLFLA..... + .....AAAAAA..... + ......AAAA...... + ....AAAAAAAA.PP. + ....AAAAAAAAPPP. + ....AAAAAAAAPPP. + ....LAAAAAALPPP. + ......AAAAAPPP.. + ......AAAAAP.P.. + .....AAA.AAA.... + ................ +} +# tile 778 (roshi,male) { ................ ................ @@ -7475,7 +14790,26 @@ Z = (195, 195, 195) .....PPA.PPA.... ................ } -# tile 392 (guide) +# tile 779 (roshi,female) +{ + ................ + ................ + ................ + .......AAAAA.... + ......AAAAA..... + .....ALFLFA..... + .....ALLLLA..... + ......ALLA...... + ....PPPAAPPPAAA. + ....L.PPPP.LAAA. + ....LAOOOOALAAA. + ....LAOOOOALAAA. + ......P...AAAA.. + ......P.A.AA.A.. + .....PPA.PPA.... + ................ +} +# tile 780 (guide,male) { ................ ................ @@ -7494,7 +14828,26 @@ Z = (195, 195, 195) .....LLA.LLA.... ................ } -# tile 393 (warrior) +# tile 781 (guide,female) +{ + ................ + ................ + ......JKJJA..... + ......KJJJA..... + ....JJJJJJJJ.... + ......LFLFAA.... + ......LLLLA..... + ......ALLA...... + .....HHAAHH.AAA. + ....LLHHHHLLAAA. + ....LAHHHHALAAA. + ....LAHHHHALAAA. + ......JJJKAAAA.. + ......JJAKAA.A.. + .....LLA.LLA.... + ................ +} +# tile 782 (warrior,male) { .....O....O..... .....NO..ON..... @@ -7513,7 +14866,26 @@ Z = (195, 195, 195) .....KLA.LKA.... ................ } -# tile 394 (apprentice) +# tile 783 (warrior,female) +{ + .....O....O..... + .....NO..ON..... + ......NPPN...... + .....PPPPPP..... + .....PELELP..... + ....HHLLLLH..... + ...HHHALLA...... + ...HJKJAAKJJAAA. + ..HHLJJKKJJLAAA. + ..H.LACKJCALAAA. + ....LAAKKAALAAA. + ......KKJKAAAA.. + ......KJAJAA.A.. + ......KJAJAA.A.. + .....KLA.LKA.... + ................ +} +# tile 784 (apprentice,male) { ................ ................ @@ -7532,7 +14904,26 @@ Z = (195, 195, 195) ....BPPPPPPE.... ................ } -# tile 395 (invisible monster) +# tile 785 (apprentice,female) +{ + ................ + ................ + ................ + ......JJJ....... + .....JLLLJ...... + ......GLG....... + .....BLLLE...... + .....BBEEEA.AAA. + .....BBPBEEAAAA. + ....PPPBEEEEAA.. + ....LABPPEALAA.. + ......BPPEAAAA.. + .....BPPPEAA.A.. + .....BPPPPEA.... + ....BPPPPPPE.... + ................ +} +# tile 786 (invisible monster, nogender) { ................ ................ diff --git a/win/share/safeproc.c b/win/share/safeproc.c index 490a2c432..6811721e3 100644 --- a/win/share/safeproc.c +++ b/win/share/safeproc.c @@ -3,10 +3,7 @@ /* NetHack may be freely redistributed. See license for details. */ /* must #define SAFEPROCS in xxxconf.h or via CFLAGS or this won't compile */ -#include "config.h" -#include "color.h" -#include "wintype.h" -#include "winprocs.h" +#include "hack.h" /* * *********************************************************** @@ -324,11 +321,12 @@ int x, y; * Print the glyph to the output device. Don't flush the output device. */ void -safe_print_glyph(window, x, y, glyph, bkglyph) +safe_print_glyph(window, x, y, glyph, bkglyph, glyphmod) winid window; xchar x, y; int glyph; int bkglyph UNUSED; +int glyphmod[NUM_GLYPHMOD] UNUSED; { return; } diff --git a/win/share/tilemap.c b/win/share/tilemap.c index 0adefc332..c7766a63b 100644 --- a/win/share/tilemap.c +++ b/win/share/tilemap.c @@ -18,10 +18,22 @@ #define Fprintf (void) fprintf -const char *FDECL(tilename, (int, int)); +/* + * Defining OBTAIN_TILEMAP to get a listing of the tile-mappings + * for debugging purposes requires that your link to produce + * the tilemap utility must also include: + * objects.o, monst.o drawing.o + */ +/* #define OBTAIN_TILEMAP */ + +#if defined(OBTAIN_TILEMAP) && !defined(TILETEXT) +FILE *tilemap_file; +#endif + +const char *FDECL(tilename, (int, int, int)); void NDECL(init_tilemap); void FDECL(process_substitutions, (FILE *)); -boolean FDECL(acceptable_tilename, (int, const char *, const char *)); +boolean FDECL(acceptable_tilename, (int, int, const char *, const char *)); #if defined(MICRO) || defined(WIN32) #undef exit @@ -34,17 +46,14 @@ extern void FDECL(exit, (int)); #define STATUES_LOOK_LIKE_MONSTERS #endif -#define MON_GLYPH 1 -#define OBJ_GLYPH 2 -#define OTH_GLYPH 3 /* fortunately unnecessary */ - +enum {MON_GLYPH, OBJ_GLYPH, OTH_GLYPH, TERMINATOR = -1}; #define EXTRA_SCROLL_DESCR_COUNT ((SCR_BLANK_PAPER - SCR_STINKING_CLOUD) - 1) /* note that the ifdefs here should be the opposite sense from monst.c/ * objects.c/rm.h */ -struct conditionals { +struct conditionals_t { int sequence, predecessor; const char *name; } conditionals[] = { @@ -56,7 +65,7 @@ struct conditionals { { MON_GLYPH, PM_BABY_SILVER_DRAGON, "baby shimmering dragon" }, { MON_GLYPH, PM_SILVER_DRAGON, "shimmering dragon" }, { MON_GLYPH, PM_JABBERWOCK, "vorpal jabberwock" }, - { MON_GLYPH, PM_VAMPIRE_LORD, "vampire mage" }, + { MON_GLYPH, PM_VAMPIRE_LEADER, "vampire mage" }, #ifndef CHARON /* not supported yet */ { MON_GLYPH, PM_CROESUS, "Charon" }, #endif @@ -79,7 +88,7 @@ struct conditionals { { OBJ_GLYPH, SCR_STINKING_CLOUD + EXTRA_SCROLL_DESCR_COUNT, "stamped / mail" }, #endif - { 0, 0, 0 } + { TERMINATOR, 0, 0 } }; /* @@ -103,42 +112,42 @@ struct substitute { { GLYPH_CMAP_OFF + S_vwall, GLYPH_CMAP_OFF + S_trwall, "sokoban walls", "In_sokoban(plev)" } }; -#ifdef TILETEXT - +#if defined(TILETEXT) || defined(OBTAIN_TILEMAP) /* - * entry is the position of the tile within the monsters/objects/other set + * file_entry is the position of the tile within the monsters/objects/other set */ const char * -tilename(set, entry) -int set, entry; +tilename(set, file_entry, gend) +int set, file_entry, gend; { - int i, j, condnum, tilenum; + int i, j, condnum, tilenum, gendnum; static char buf[BUFSZ]; (void) def_char_to_objclass(']'); - condnum = tilenum = 0; + condnum = tilenum = gendnum = 0; for (i = 0; i < NUMMONS; i++) { - if (set == MON_GLYPH && tilenum == entry) - return mons[i].mname; - tilenum++; - while (conditionals[condnum].sequence == MON_GLYPH - && conditionals[condnum].predecessor == i) { - if (set == MON_GLYPH && tilenum == entry) - return conditionals[condnum].name; - condnum++; - tilenum++; + if (set == MON_GLYPH && tilenum == file_entry && gend == 0) + return mons[i].pmnames[NEUTRAL]; + for (condnum = 0; conditionals[condnum].sequence != -1; ++condnum) { + if (conditionals[condnum].sequence == MON_GLYPH + && conditionals[condnum].predecessor == i) { + tilenum += 2; + if (set == MON_GLYPH && tilenum == file_entry) + return conditionals[condnum].name; + } } + tilenum += 2; } - if (set == MON_GLYPH && tilenum == entry) + if (set == MON_GLYPH && tilenum == file_entry) return "invisible monster"; tilenum = 0; /* set-relative number */ for (i = 0; i < NUM_OBJECTS; i++) { /* prefer to give the description - that's all the tile's * appearance should reveal */ - if (set == OBJ_GLYPH && tilenum == entry) { + if (set == OBJ_GLYPH && tilenum == file_entry) { if (!obj_descr[i].oc_descr) return obj_descr[i].oc_name; if (!obj_descr[i].oc_name) @@ -148,20 +157,20 @@ int set, entry; obj_descr[i].oc_name); return buf; } - - tilenum++; - while (conditionals[condnum].sequence == OBJ_GLYPH - && conditionals[condnum].predecessor == i) { - if (set == OBJ_GLYPH && tilenum == entry) - return conditionals[condnum].name; - condnum++; - tilenum++; + for (condnum = 0; conditionals[condnum].sequence != -1; ++condnum) { + if (conditionals[condnum].sequence == OBJ_GLYPH + && conditionals[condnum].predecessor == i) { + tilenum++; + if (set == OBJ_GLYPH && tilenum == file_entry) + return conditionals[condnum].name; + } } + tilenum++; } tilenum = 0; /* set-relative number */ for (i = 0; i < (MAXPCHARS - MAXEXPCHARS); i++) { - if (set == OTH_GLYPH && tilenum == entry) { + if (set == OTH_GLYPH && tilenum == file_entry) { if (*defsyms[i].explanation) { return defsyms[i].explanation; } else { @@ -169,18 +178,19 @@ int set, entry; return buf; } } - tilenum++; - while (conditionals[condnum].sequence == OTH_GLYPH - && conditionals[condnum].predecessor == i) { - if (set == OTH_GLYPH && tilenum == entry) - return conditionals[condnum].name; - condnum++; - tilenum++; + for (condnum = 0; conditionals[condnum].sequence != -1; ++condnum) { + if (conditionals[condnum].sequence == OTH_GLYPH + && conditionals[condnum].predecessor == i) { + tilenum++; + if (set == OTH_GLYPH && tilenum == file_entry) + return conditionals[condnum].name; + } } + tilenum++; } /* explosions */ tilenum = MAXPCHARS - MAXEXPCHARS; - i = entry - tilenum; + i = file_entry - tilenum; if (i < (MAXEXPCHARS * EXPL_MAX)) { if (set == OTH_GLYPH) { static const char *explosion_types[] = { @@ -195,7 +205,7 @@ int set, entry; } tilenum += (MAXEXPCHARS * EXPL_MAX); - i = entry - tilenum; + i = file_entry - tilenum; if (i < (NUM_ZAP << 2)) { if (set == OTH_GLYPH) { Sprintf(buf, "zap %d %d", i / 4, i % 4); @@ -204,7 +214,7 @@ int set, entry; } tilenum += (NUM_ZAP << 2); - i = entry - tilenum; + i = file_entry - tilenum; if (i < WARNCOUNT) { if (set == OTH_GLYPH) { Sprintf(buf, "warning %d", i); @@ -213,7 +223,7 @@ int set, entry; } tilenum += WARNCOUNT; - i = entry - tilenum; + i = file_entry - tilenum; if (i < 1) { if (set == OTH_GLYPH) { Sprintf(buf, "unexplored"); @@ -222,17 +232,17 @@ int set, entry; } tilenum += 1; - i = entry - tilenum; + i = file_entry - tilenum; if (i < 1) { if (set == OTH_GLYPH) { Sprintf(buf, "nothing"); return buf; } } - tilenum += 1; + tilenum++; for (i = 0; i < SIZE(substitutes); i++) { - j = entry - tilenum; + j = file_entry - tilenum; if (j <= substitutes[i].last_glyph - substitutes[i].first_glyph) { if (set == OTH_GLYPH) { Sprintf(buf, "sub %s %d", substitutes[i].sub_name, j); @@ -242,12 +252,12 @@ int set, entry; tilenum += substitutes[i].last_glyph - substitutes[i].first_glyph + 1; } - Sprintf(buf, "unknown %d %d", set, entry); + Sprintf(buf, "unknown %d %d", set, file_entry); return buf; } +#endif -#else /* TILETEXT */ - +#ifndef TILETEXT #define TILE_FILE "tile.c" #ifdef AMIGA @@ -260,7 +270,14 @@ int set, entry; #endif #endif -short tilemap[MAX_GLYPH]; +struct tilemap_t { + short tilenum; +#ifdef OBTAIN_TILEMAP + char name[80]; + int glyph; +#endif +} tilemap[MAX_GLYPH]; + #ifdef STATUES_LOOK_LIKE_MONSTERS int lastmontile, lastobjtile, lastothtile, laststatuetile; @@ -275,7 +292,8 @@ int lastmontile, lastobjtile, lastothtile; * set up array to map glyph numbers to tile numbers * * assumes tiles are numbered sequentially through monsters/objects/other, - * with entries for all supported compilation options + * with entries for all supported compilation options. monsters have two + * tiles for each (male + female). * * "other" contains cmap and zaps (the swallow sets are a repeated portion * of cmap), as well as the "flash" glyphs for the new warning system @@ -286,20 +304,21 @@ init_tilemap() { int i, j, condnum, tilenum; int corpsetile, swallowbase; + int file_entry = 0; for (i = 0; i < MAX_GLYPH; i++) { - tilemap[i] = -1; + tilemap[i].tilenum = -1; } - corpsetile = NUMMONS + NUM_INVIS_TILES + CORPSE; - swallowbase = NUMMONS + NUM_INVIS_TILES + NUM_OBJECTS + S_sw_tl; + corpsetile = NUMMONS + NUMMONS + NUM_INVIS_TILES + CORPSE; + swallowbase = NUMMONS + NUMMONS + NUM_INVIS_TILES + NUM_OBJECTS + S_sw_tl; /* add number compiled out */ - for (i = 0; conditionals[i].sequence; i++) { + for (i = 0; conditionals[i].sequence != TERMINATOR; i++) { switch (conditionals[i].sequence) { case MON_GLYPH: - corpsetile++; - swallowbase++; + corpsetile += 2; + swallowbase += 2; break; case OBJ_GLYPH: if (conditionals[i].predecessor < CORPSE) @@ -313,116 +332,238 @@ init_tilemap() } } - condnum = tilenum = 0; +#ifdef OBTAIN_TILEMAP + tilemap_file = fopen("tilemappings.lst", "w"); +#endif + tilenum = 0; for (i = 0; i < NUMMONS; i++) { - tilemap[GLYPH_MON_OFF + i] = tilenum; - tilemap[GLYPH_PET_OFF + i] = tilenum; - tilemap[GLYPH_DETECT_OFF + i] = tilenum; - tilemap[GLYPH_RIDDEN_OFF + i] = tilenum; - tilemap[GLYPH_BODY_OFF + i] = corpsetile; +#ifdef OBTAIN_TILEMAP + char buf[256]; +#endif + tilemap[GLYPH_MON_OFF + i].tilenum = tilenum; + tilemap[GLYPH_PET_OFF + i].tilenum = tilenum; + tilemap[GLYPH_DETECT_OFF + i].tilenum = tilenum; + tilemap[GLYPH_RIDDEN_OFF + i].tilenum = tilenum; + tilemap[GLYPH_BODY_OFF + i].tilenum = corpsetile; j = GLYPH_SWALLOW_OFF + 8 * i; - tilemap[j] = swallowbase; - tilemap[j + 1] = swallowbase + 1; - tilemap[j + 2] = swallowbase + 2; - tilemap[j + 3] = swallowbase + 3; - tilemap[j + 4] = swallowbase + 4; - tilemap[j + 5] = swallowbase + 5; - tilemap[j + 6] = swallowbase + 6; - tilemap[j + 7] = swallowbase + 7; - tilenum++; - while (conditionals[condnum].sequence == MON_GLYPH - && conditionals[condnum].predecessor == i) { - condnum++; - tilenum++; + tilemap[j].tilenum = swallowbase; + tilemap[j + 1].tilenum = swallowbase + 1; + tilemap[j + 2].tilenum = swallowbase + 2; + tilemap[j + 3].tilenum = swallowbase + 3; + tilemap[j + 4].tilenum = swallowbase + 4; + tilemap[j + 5].tilenum = swallowbase + 5; + tilemap[j + 6].tilenum = swallowbase + 6; + tilemap[j + 7].tilenum = swallowbase + 7; +#ifdef OBTAIN_TILEMAP + Sprintf(buf, "%s (%d)", tilename(MON_GLYPH, file_entry, 0), file_entry); + Sprintf(tilemap[GLYPH_MON_OFF + i].name, + "%s (%d)", buf, i); + Sprintf(tilemap[GLYPH_PET_OFF + i].name, + "%s %s (%d)", buf, "pet", i); + Sprintf(tilemap[GLYPH_DETECT_OFF + i].name, + "%s %s (%d)", buf, "detected", i); + Sprintf(tilemap[GLYPH_RIDDEN_OFF + i].name, + "%s %s (%d)", buf, "ridden", i); + Sprintf(tilemap[GLYPH_BODY_OFF + i].name, + "%s %s (%d)", buf, "corpse", i); + Sprintf(tilemap[j + 0].name, "%s swallow0 (%d)", buf, i); + Sprintf(tilemap[j + 1].name, "%s swallow1 (%d)", buf, i); + Sprintf(tilemap[j + 2].name, "%s swallow2 (%d)", buf, i); + Sprintf(tilemap[j + 3].name, "%s swallow3 (%d)", buf, i); + Sprintf(tilemap[j + 4].name, "%s swallow4 (%d)", buf, i); + Sprintf(tilemap[j + 5].name, "%s swallow5 (%d)", buf, i); + Sprintf(tilemap[j + 6].name, "%s swallow6 (%d)", buf, i); + Sprintf(tilemap[j + 7].name, "%s swallow7 (%d)", buf, i); +#endif + for (condnum = 0; conditionals[condnum].sequence != -1; condnum++) { + if (conditionals[condnum].sequence == MON_GLYPH + && conditionals[condnum].predecessor == i) { + tilenum += 2; + file_entry += 2; +#ifdef OBTAIN_TILEMAP + Fprintf(tilemap_file, "skipping monst %s (%d)\n", + tilename(MON_GLYPH, file_entry, 0), file_entry); +#endif + } } + tilenum += 2; /* male + female tiles for each */ + file_entry += 2; } - tilemap[GLYPH_INVISIBLE] = tilenum++; + tilemap[GLYPH_INVISIBLE].tilenum = tilenum++; + file_entry++; +#ifdef OBTAIN_TILEMAP + Sprintf(tilemap[GLYPH_INVISIBLE].name, + "%s (%d)", "invisible mon", file_entry); +#endif lastmontile = tilenum - 1; + file_entry = 0; for (i = 0; i < NUM_OBJECTS; i++) { - tilemap[GLYPH_OBJ_OFF + i] = tilenum; - tilenum++; - while (conditionals[condnum].sequence == OBJ_GLYPH - && conditionals[condnum].predecessor == i) { - condnum++; - tilenum++; + tilemap[GLYPH_OBJ_OFF + i].tilenum = tilenum; +#ifdef OBTAIN_TILEMAP + Sprintf(tilemap[GLYPH_OBJ_OFF + i].name, "%s (%d)", + tilename(OBJ_GLYPH, file_entry, 0), file_entry); +#endif + for (condnum = 0; conditionals[condnum].sequence != -1; condnum++) { + if (conditionals[condnum].sequence == OBJ_GLYPH + && conditionals[condnum].predecessor == i) { + tilenum++; + file_entry++; +#ifdef OBTAIN_TILEMAP + Fprintf(tilemap_file, "skipping obj %s (%d)\n", + tilename(OBJ_GLYPH, file_entry, 0), file_entry); +#endif + } } + tilenum++; + file_entry++; } lastobjtile = tilenum - 1; + file_entry = 0; for (i = 0; i < (MAXPCHARS - MAXEXPCHARS); i++) { - tilemap[GLYPH_CMAP_OFF + i] = tilenum; + tilemap[GLYPH_CMAP_OFF + i].tilenum = tilenum; +#ifdef OBTAIN_TILEMAP + Sprintf(tilemap[GLYPH_CMAP_OFF + i].name, "cmap %s (%d)", + tilename(OTH_GLYPH, file_entry, 0), file_entry); +#endif tilenum++; - while (conditionals[condnum].sequence == OTH_GLYPH - && conditionals[condnum].predecessor == i) { - condnum++; - tilenum++; + file_entry++; + for (condnum = 0; conditionals[condnum].sequence != -1; condnum++) { + if (conditionals[condnum].sequence == OTH_GLYPH + && conditionals[condnum].predecessor == i) { + tilenum++; + file_entry++; +#ifdef OBTAIN_TILEMAP + Fprintf(tilemap_file, "skipping cmap %s (%d)\n", + tilename(OTH_GLYPH, file_entry, 0), file_entry); +#endif + } } } for (i = 0; i < (MAXEXPCHARS * EXPL_MAX); i++) { - tilemap[GLYPH_EXPLODE_OFF + i] = tilenum; - tilenum++; - while (conditionals[condnum].sequence == OTH_GLYPH - && conditionals[condnum].predecessor == (i + MAXPCHARS)) { - condnum++; - tilenum++; + tilemap[GLYPH_EXPLODE_OFF + i].tilenum = tilenum; +#ifdef OBTAIN_TILEMAP + Sprintf(tilemap[GLYPH_EXPLODE_OFF + i].name, "explosion %s (%d)", + tilename(OTH_GLYPH, file_entry, 0), file_entry); +#endif + for (condnum = 0; conditionals[condnum].sequence != -1; condnum++) { + if (conditionals[condnum].sequence == OTH_GLYPH + && conditionals[condnum].predecessor == i + MAXPCHARS) { + tilenum++; + file_entry++; +#ifdef OBTAIN_TILEMAP + Fprintf(tilemap_file, "skipping explosion %s (%d)\n", + tilename(OTH_GLYPH, file_entry, 0), file_entry); +#endif + } } + tilenum++; + file_entry++; } for (i = 0; i < NUM_ZAP << 2; i++) { - tilemap[GLYPH_ZAP_OFF + i] = tilenum; + tilemap[GLYPH_ZAP_OFF + i].tilenum = tilenum; +#ifdef OBTAIN_TILEMAP + Sprintf(tilemap[GLYPH_ZAP_OFF + i].name, "zap %s (%d)", + tilename(OTH_GLYPH, file_entry, 0), file_entry); +#endif tilenum++; - while (conditionals[condnum].sequence == OTH_GLYPH + file_entry++; + for (condnum = 0; conditionals[condnum].sequence != -1; condnum++) { + if (conditionals[condnum].sequence == OTH_GLYPH && conditionals[condnum].predecessor == (i + MAXEXPCHARS)) { - condnum++; - tilenum++; +#ifdef OBTAIN_TILEMAP + Fprintf(tilemap_file, "skipping zap %s (%d)\n", + tilename(OTH_GLYPH, file_entry, 0), file_entry); +#endif + file_entry++; + tilenum++; + } } } for (i = 0; i < WARNCOUNT; i++) { - tilemap[GLYPH_WARNING_OFF + i] = tilenum; + tilemap[GLYPH_WARNING_OFF + i].tilenum = tilenum; +#ifdef OBTAIN_TILEMAP + Sprintf(tilemap[GLYPH_WARNING_OFF + i].name, "%s (%d)", + tilename(OTH_GLYPH, file_entry, 0), file_entry); +#endif tilenum++; + file_entry++; } for (i = 0; i < 1; i++) { - tilemap[GLYPH_UNEXPLORED_OFF + i] = tilenum; + tilemap[GLYPH_UNEXPLORED_OFF + i].tilenum = tilenum; +#ifdef OBTAIN_TILEMAP + Sprintf(tilemap[GLYPH_UNEXPLORED_OFF + i].name, "unexplored %s (%d)", + tilename(OTH_GLYPH, file_entry, 0), file_entry); +#endif tilenum++; + file_entry++; } for (i = 0; i < 1; i++) { - tilemap[GLYPH_NOTHING + i] = tilenum; + tilemap[GLYPH_NOTHING + i].tilenum = tilenum; +#ifdef OBTAIN_TILEMAP + Sprintf(tilemap[GLYPH_NOTHING + i].name, " nothing %s (%d)", + tilename(OTH_GLYPH, file_entry, 0), file_entry); +#endif tilenum++; + file_entry++; } #ifndef STATUES_LOOK_LIKE_MONSTERS /* statue patch: statues still use the same glyph as in vanilla */ for (i = 0; i < NUMMONS; i++) { - tilemap[GLYPH_STATUE_OFF + i] = tilemap[GLYPH_OBJ_OFF + STATUE]; + tilemap[GLYPH_STATUE_OFF + i].tilenum = tilemap[GLYPH_OBJ_OFF + STATUE]; +#ifdef OBTAIN_TILEMAP + Sprintf(tilemap[GLYPH_STATUE_OFF + i].name, "%s (%d)", + tilename(OTH_GLYPH, file_entry, 0), file_entry); +#endif } #endif lastothtile = tilenum - 1; #ifdef STATUES_LOOK_LIKE_MONSTERS - /* skip over the substitutes to get to the grayscale statues */ + file_entry = 0; + /* fast-forward over the substitutes to grayscale statues loc */ for (i = 0; i < SIZE(substitutes); i++) { tilenum += substitutes[i].last_glyph - substitutes[i].first_glyph + 1; } /* statue patch: statues look more like the monster */ - condnum = 0; /* doing monsters again, so reset */ for (i = 0; i < NUMMONS; i++) { - tilemap[GLYPH_STATUE_OFF + i] = tilenum; - tilenum++; - while (conditionals[condnum].sequence == MON_GLYPH - && conditionals[condnum].predecessor == i) { - condnum++; - tilenum++; + tilemap[GLYPH_STATUE_OFF + i].tilenum = tilenum; +#ifdef OBTAIN_TILEMAP + Sprintf(tilemap[GLYPH_STATUE_OFF + i].name, "statue of %s (%d)", + tilename(MON_GLYPH, file_entry, 0), file_entry); +#endif + for (condnum = 0; conditionals[condnum].sequence != -1; condnum++) { + if (conditionals[condnum].sequence == MON_GLYPH + && conditionals[condnum].predecessor == i) { + file_entry += 2; /* skip female tile too */ + tilenum += 2; +#ifdef OBTAIN_TILEMAP + Fprintf(tilemap_file, "skipping statue of %s (%d)\n", + tilename(MON_GLYPH, file_entry, 0), file_entry); +#endif + } } + tilenum += 2; + file_entry += 2; } - laststatuetile = tilenum - 1; + 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); + } + fclose(tilemap_file); #endif } @@ -451,8 +592,8 @@ FILE *ofp; Fprintf(ofp, "short std_tiles%d[] = { ", span); for (k = substitutes[i].first_glyph; k < substitutes[i].last_glyph; k++) - Fprintf(ofp, "%d, ", tilemap[k]); - Fprintf(ofp, "%d };\n", tilemap[substitutes[i].last_glyph]); + Fprintf(ofp, "%d, ", tilemap[k].tilenum); + Fprintf(ofp, "%d };\n", tilemap[substitutes[i].last_glyph].tilenum); } } @@ -503,6 +644,11 @@ FILE *ofp; Fprintf(ofp, "\nint total_tiles_used = %d;\n", start); } +#ifdef OBTAIN_TILEMAP +extern void NDECL(monst_globals_init); +extern void NDECL(objects_globals_init); +#endif + int main() { @@ -510,6 +656,11 @@ main() char filename[30]; FILE *ofp; +#ifdef OBTAIN_TILEMAP + objects_globals_init(); + monst_globals_init(); +#endif + init_tilemap(); /* @@ -526,7 +677,7 @@ main() Fprintf(ofp, "\nshort glyph2tile[MAX_GLYPH] = {\n"); for (i = 0; i < MAX_GLYPH; i++) { - Fprintf(ofp, " %4d,", tilemap[i]); + Fprintf(ofp, " %4d,", tilemap[i].tilenum); if ((i % 12) == 11 || i == MAX_GLYPH - 1) Fprintf(ofp, "\n"); } @@ -654,17 +805,20 @@ struct { }; boolean -acceptable_tilename(idx, encountered, expected) -int idx; +acceptable_tilename(glyph_set, idx, encountered, expected) +int glyph_set, idx; const char *encountered, *expected; { - if (idx >= 0 && idx < SIZE(altlabels)) { - if (!strcmp(altlabels[idx].expectedlabel, expected)) { - if (!strcmp(altlabels[idx].betterlabel, encountered)) - return TRUE; + if (glyph_set == OTH_GLYPH) { + if (idx >= 0 && idx < SIZE(altlabels)) { + if (!strcmp(altlabels[idx].expectedlabel, expected)) { + if (!strcmp(altlabels[idx].betterlabel, encountered)) + return TRUE; + } } + return FALSE; } - return FALSE; + return TRUE; } /*tilemap.c*/ diff --git a/win/share/tiletext.c b/win/share/tiletext.c index d078c4e37..0970e0e14 100644 --- a/win/share/tiletext.c +++ b/win/share/tiletext.c @@ -26,13 +26,15 @@ static const char *text_sets[] = { "monsters.txt", "objects.txt", "other.txt" }; #endif -extern const char *FDECL(tilename, (int, int)); -extern boolean FDECL(acceptable_tilename, (int, const char *, const char *)); +extern const char *FDECL(tilename, (int, int, int)); +extern boolean FDECL(acceptable_tilename, (int, int, const char *, const char *)); static void FDECL(read_text_colormap, (FILE *)); static boolean FDECL(write_text_colormap, (FILE *)); static boolean FDECL(read_txttile, (FILE *, pixel (*)[TILE_X])); static void FDECL(write_txttile, (FILE *, pixel (*)[TILE_X])); +enum { MONSTER_SET, OBJECT_SET, OTHER_SET}; + /* Ugh. DICE doesn't like %[A-Z], so we have to spell it out... */ #define FORMAT_STRING \ "%[ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.] = " \ @@ -108,29 +110,37 @@ read_txttile(txtfile, pixels) FILE *txtfile; pixel (*pixels)[TILE_X]; { - int ph, i, j, k; - char buf[BUFSZ], ttype[BUFSZ]; + int ph, i, j, k, reslt; + char buf[BUFSZ], ttype[BUFSZ], gend[BUFSZ]; const char *p; char c[2]; + static int gidx = 0; - if (fscanf(txtfile, "# %s %d (%[^)])", ttype, &i, buf) <= 0) + gend[0] = '\0'; + if (tile_set == MONSTER_SET) + reslt = fscanf(txtfile, "# %s %d (%[^,],%[^)])", ttype, &i, buf, gend); + else + reslt = fscanf(txtfile, "# %s %d (%[^)])", ttype, &i, buf); + if (reslt <= 0) return FALSE; + if (tile_set == MONSTER_SET && gend[0] == 'f') + gidx = 1; + ph = strcmp(ttype, "placeholder") == 0; if (!ph && strcmp(ttype, "tile") != 0) Fprintf(stderr, "Keyword \"%s\" unexpected for entry %d\n", ttype, i); - if (tile_set != 0) { - /* check tile name, but not relative number, which will - * change when tiles are added - */ - p = tilename(tile_set, tile_set_indx); - if (p && strcmp(p, buf) && !acceptable_tilename(tile_set_indx,buf,p)) { - Fprintf(stderr, "warning: for tile %d (numbered %d) of %s,\n", - tile_set_indx, i, text_sets[tile_set - 1]); - Fprintf(stderr, "\tfound '%s' while expecting '%s'\n", buf, p); - } + /* check tile name, but not relative number, which will + * change when tiles are added + */ + p = tilename(tile_set, tile_set_indx, gidx); + if (p && strcmp(p, buf) + && !acceptable_tilename(tile_set, tile_set_indx, buf, p)) { + Fprintf(stderr, "warning: for tile %d (numbered %d) of %s,\n", + tile_set_indx, i, text_sets[tile_set]); + Fprintf(stderr, "\tfound '%s' while expecting '%s'\n", buf, p); } tile_set_indx++; @@ -196,21 +206,26 @@ pixel (*pixels)[TILE_X]; { const char *p; const char *type; - int i, j, k; + int i = 0, j, k; if (memcmp(placeholder, pixels, sizeof(placeholder)) == 0) type = "placeholder"; else type = "tile"; - if (tile_set == 0) - Fprintf(txtfile, "# %s %d (unknown)\n", type, tile_set_indx); - else { - p = tilename(tile_set, tile_set_indx); - if (p) - Fprintf(txtfile, "# %s %d (%s)\n", type, tile_set_indx, p); - else - Fprintf(txtfile, "# %s %d (null)\n", type, tile_set_indx); + if (tile_set == MONSTER_SET) { + for (i = 0; i < 2; ++i) { + Fprintf(txtfile, "# %s %d (unknown,%s)\n", type, tile_set_indx, + i ? "female" : "male"); + if (i == 0) + tile_set_indx++; + } + } else { + p = tilename(tile_set, tile_set_indx, i); + if (p) + Fprintf(txtfile, "# %s %d (%s)\n", type, tile_set_indx, p); + else + Fprintf(txtfile, "# %s %d (null)\n", type, tile_set_indx); } tile_set_indx++; @@ -302,7 +317,7 @@ const char *type; tile_set = 0; for (i = 0; i < SIZE(text_sets); i++) { if (!strcmp(p, text_sets[i])) - tile_set = i + 1; + tile_set = i; } tile_set_indx = 0; diff --git a/win/shim/winshim.c b/win/shim/winshim.c index b37da9b11..c6e425d70 100644 --- a/win/shim/winshim.c +++ b/win/shim/winshim.c @@ -129,7 +129,7 @@ VDECLCB(shim_mark_synch,(void), "v") VDECLCB(shim_wait_synch,(void), "v") VDECLCB(shim_cliparound,(int x, int y), "vii", A2P x, A2P y) VDECLCB(shim_update_positionbar,(char *posbar), "vp", P2V posbar) -VDECLCB(shim_print_glyph,(winid w, int x, int y, int glyph, int bkglyph), "viiiii", A2P w, A2P x, A2P y, A2P glyph, A2P bkglyph) +VDECLCB(shim_print_glyph,(winid w, int x, int y, int glyph, int bkglyph, int glyphmod[NUM_GLYPHMOD]), "viiiii", A2P w, A2P x, A2P y, A2P glyph, A2P bkglyph, A2P glyphmod) VDECLCB(shim_raw_print,(const char *str), "vs", P2V str) VDECLCB(shim_raw_print_bold,(const char *str), "vs", P2V str) DECLCB(int, shim_nhgetch,(void), "i") @@ -311,4 +311,4 @@ EM_JS(void, local_callback, (const char *cb_name, const char *shim_name, void *r }) #endif /* __EMSCRIPTEN__ */ -#endif /* SHIM_GRAPHICS */ \ No newline at end of file +#endif /* SHIM_GRAPHICS */ diff --git a/win/tty/wintty.c b/win/tty/wintty.c index a0ebef942..c59ea8fe5 100644 --- a/win/tty/wintty.c +++ b/win/tty/wintty.c @@ -3415,15 +3415,15 @@ int x, y; */ void -tty_print_glyph(window, x, y, glyph, bkglyph) +tty_print_glyph(window, x, y, glyph, bkglyph, glyphmod) winid window; xchar x, y; int glyph; int bkglyph UNUSED; +unsigned *glyphmod; /* don't mark UNUSED as we need to revisit */ { - int ch; boolean inverse_on = FALSE; - int color; + int ch, color; unsigned special; HUPSKIP(); @@ -3433,8 +3433,10 @@ int bkglyph UNUSED; return; } #endif - /* map glyph to character and color */ - (void) mapglyph(glyph, &ch, &color, &special, x, y, 0); + /* get glyph ttychar, color, and special flags */ + ch = (int) glyphmod[GM_TTYCHAR]; + color = (int) glyphmod[GM_COLOR]; + special = glyphmod[GM_FLAGS]; print_vt_code2(AVTC_SELECT_WINDOW, window); diff --git a/win/win32/mhmap.c b/win/win32/mhmap.c index 34cb1a9cb..4a84e190a 100644 --- a/win/win32/mhmap.c +++ b/win/win32/mhmap.c @@ -37,8 +37,8 @@ typedef struct mswin_nethack_map_window { int map[COLNO][ROWNO]; /* glyph map */ int bkmap[COLNO][ROWNO]; /* backround glyph map */ + unsigned glyphmod[COLNO][ROWNO][NUM_GLYPHMOD]; boolean mapDirty[COLNO][ROWNO]; /* dirty flag for map */ - int mapMode; /* current map mode */ boolean bAsciiMode; /* switch ASCII/tiled mode */ boolean bFitToScreenMode; /* switch Fit map to screen mode on/off */ @@ -86,7 +86,7 @@ static void nhcoord2display(PNHMapWindow data, int x, int y, LPRECT lpOut); static void paint(PNHMapWindow data, int i, int j); static void dirtyAll(PNHMapWindow data); static void dirty(PNHMapWindow data, int i, int j); -static void setGlyph(PNHMapWindow data, int i, int j, int fg, int bg); +static void setGlyph(PNHMapWindow data, int i, int j, int fg, int bg, unsigned *glyphmod); static void clearAll(PNHMapWindow data); #if (VERSION_MAJOR < 4) && (VERSION_MINOR < 4) && (PATCHLEVEL < 2) @@ -639,7 +639,7 @@ onMSNHCommand(HWND hWnd, WPARAM wParam, LPARAM lParam) case MSNH_MSG_PRINT_GLYPH: { PMSNHMsgPrintGlyph msg_data = (PMSNHMsgPrintGlyph) lParam; setGlyph(data, msg_data->x, msg_data->y, - msg_data->glyph, msg_data->bkglyph); + msg_data->glyph, msg_data->bkglyph, msg_data->glyphmod); } break; case MSNH_MSG_CLIPAROUND: { @@ -708,8 +708,10 @@ onMSNHCommand(HWND hWnd, WPARAM wParam, LPARAM lParam) PMSNHMsgGetText msg_data = (PMSNHMsgGetText) lParam; size_t index; int col, row; +#if 0 int color; - unsigned special; + unsigned special = 0U; +#endif int mgch; index = 0; @@ -717,13 +719,14 @@ onMSNHCommand(HWND hWnd, WPARAM wParam, LPARAM lParam) for (col = 0; col < COLNO; col++) { if (index >= msg_data->max_size) break; - if (data->map[col][row] == NO_GLYPH) { + if (data->map[col][row] == NO_GLYPH) mgch = ' '; - } else { - (void) mapglyph(data->map[col][row], &mgch, &color, - &special, col, row, 0); - } - msg_data->buffer[index] = mgch; + +// } else { +// (void) mapglyph(data->map[col][row], &mgch, &color, +// &special, col, row, 0); +// } + msg_data->buffer[index] = data->glyphmod[col][row][GM_TTYCHAR]; index++; } if (index >= msg_data->max_size - 1) @@ -785,9 +788,9 @@ paintTile(PNHMapWindow data, int i, int j, RECT * rect) int glyph, bkglyph; int layer; #ifdef USE_PILEMARK - int color; - unsigned special; - int mgch; +// int color; +// unsigned special = 0U; +// int mgch; #endif layer = 0; glyph = data->map[i][j]; @@ -811,8 +814,16 @@ paintTile(PNHMapWindow data, int i, int j, RECT * rect) layer++; } +// (void) mapglyph(glyph, &mgch, &color, &special, i, j, 0); +// mgch = (int) data.glyphmod[GM_TTYCHAR]; +// color = (int) data.glyphmod[GM_COLOR]; +// special = glyphmod[GM_FLAGS]; + if ((glyph != NO_GLYPH) && (glyph != bkglyph)) { + /* rely on NetHack core helper routine */ ntile = glyph2tile[glyph]; + if (data->glyphmod[i][j][GM_FLAGS] & MG_FEMALE) + ntile++; t_x = TILEBMP_X(ntile); t_y = TILEBMP_Y(ntile); @@ -834,9 +845,9 @@ paintTile(PNHMapWindow data, int i, int j, RECT * rect) #ifdef USE_PILEMARK /* rely on NetHack core helper routine */ - (void) mapglyph(data->map[i][j], &mgch, &color, &special, - i, j, 0); - if ((glyph != NO_GLYPH) && (special & MG_PET) +// (void) mapglyph(data->map[i][j], &mgch, &color, &special, +// i, j, 0); + if ((glyph != NO_GLYPH) && (data->glyphmod[i][j][GM_FLAGS] & MG_PET) #else if ((glyph != NO_GLYPH) && glyph_is_pet(glyph) #endif @@ -859,7 +870,7 @@ paintTile(PNHMapWindow data, int i, int j, RECT * rect) DeleteDC(hdcPetMark); } #ifdef USE_PILEMARK - if ((glyph != NO_GLYPH) && (special & MG_OBJPILE) + if ((glyph != NO_GLYPH) && (data->glyphmod[i][j][GM_FLAGS] & MG_OBJPILE) && iflags.hilite_pile) { /* apply pilemark transparently over other image */ HDC hdcPileMark; @@ -893,8 +904,8 @@ paintGlyph(PNHMapWindow data, int i, int j, RECT * rect) char ch; WCHAR wch; int color; - unsigned special; - int mgch; +// unsigned special; +// int mgch; HBRUSH back_brush; COLORREF OldFg; @@ -909,11 +920,12 @@ paintGlyph(PNHMapWindow data, int i, int j, RECT * rect) OldFg = SetTextColor(hDC, nhcolor_to_RGB(color)); #else /* rely on NetHack core helper routine */ - (void) mapglyph(data->map[i][j], &mgch, &color, - &special, i, j, 0); - ch = (char) mgch; - if (((special & MG_PET) && iflags.hilite_pet) - || ((special & (MG_DETECT | MG_BW_LAVA)) +// (void) mapglyph(data->map[i][j], &mgch, &color, +// &special, i, j, 0); + ch = (char) data->glyphmod[i][j][GM_TTYCHAR]; + color = (int) data->glyphmod[i][j][GM_COLOR]; + if (((data->glyphmod[i][j][GM_FLAGS] & MG_PET) && iflags.hilite_pet) + || ((data->glyphmod[i][j][GM_FLAGS] & (MG_DETECT | MG_BW_LAVA)) && iflags.use_inverse)) { back_brush = CreateSolidBrush(nhcolor_to_RGB(CLR_GRAY)); @@ -972,13 +984,19 @@ paintGlyph(PNHMapWindow data, int i, int j, RECT * rect) } } -static void setGlyph(PNHMapWindow data, int i, int j, int fg, int bg) +static void setGlyph(PNHMapWindow data, int i, int j, int fg, int bg, unsigned *glyphmod) { - if ((data->map[i][j] != fg) || (data->bkmap[i][j] != bg)) { + int gm; + + if ((data->map[i][j] != fg) || (data->bkmap[i][j] != bg) + || data->glyphmod[i][j][GM_TTYCHAR] != glyphmod[GM_TTYCHAR] + || data->glyphmod[i][j][GM_COLOR] != glyphmod[GM_COLOR] + || data->glyphmod[i][j][GM_FLAGS] != glyphmod[GM_FLAGS]) { data->map[i][j] = fg; data->bkmap[i][j] = bg; data->mapDirty[i][j] = TRUE; - + for (gm = 0; gm < NUM_GLYPHMOD; ++gm) + data->glyphmod[i][j][gm] = glyphmod[gm]; RECT rect; nhcoord2display(data, i, j, &rect); InvalidateRect(data->hWnd, &rect, FALSE); @@ -991,6 +1009,9 @@ static void clearAll(PNHMapWindow data) for (int y = 0; y < ROWNO; y++) { data->map[x][y] = NO_GLYPH; data->bkmap[x][y] = NO_GLYPH; + data->glyphmod[x][y][GM_TTYCHAR] = ' '; + data->glyphmod[x][y][GM_COLOR] = NO_COLOR; + data->glyphmod[x][y][GM_FLAGS] = 0U; data->mapDirty[x][y] = TRUE; } InvalidateRect(data->hWnd, NULL, FALSE); diff --git a/win/win32/mhmsg.h b/win/win32/mhmsg.h index 07fe86791..431d426ca 100644 --- a/win/win32/mhmsg.h +++ b/win/win32/mhmsg.h @@ -38,6 +38,7 @@ typedef struct mswin_nhmsg_print_glyph { XCHAR_P y; int glyph; int bkglyph; + int glyphmod[NUM_GLYPHMOD]; } MSNHMsgPrintGlyph, *PMSNHMsgPrintGlyph; typedef struct mswin_nhmsg_cliparound { diff --git a/win/win32/mswproc.c b/win/win32/mswproc.c index a439deca5..efebf6160 100644 --- a/win/win32/mswproc.c +++ b/win/win32/mswproc.c @@ -1281,7 +1281,7 @@ mswin_cliparound(int x, int y) } /* -print_glyph(window, x, y, glyph, bkglyph) +print_glyph(window, x, y, glyph, bkglyph, glyphmod) -- Print the glyph at (x,y) on the given window. Glyphs are integers at the interface, mapped to whatever the window- port wants (symbol, font, color, attributes, ...there's @@ -1290,12 +1290,15 @@ print_glyph(window, x, y, glyph, bkglyph) graphical or tiled environments to allow the depiction to fall against a background consistent with the grid around x,y. + -- glyphmod provides extended information about the glyph + that window ports can use to enhance the display in + various ways. */ void -mswin_print_glyph(winid wid, XCHAR_P x, XCHAR_P y, int glyph, int bkglyph) +mswin_print_glyph(winid wid, XCHAR_P x, XCHAR_P y, int glyph, int bkglyph, unsigned *glyphmod) { - logDebug("mswin_print_glyph(%d, %d, %d, %d, %d)\n", wid, x, y, glyph, bkglyph); + logDebug("mswin_print_glyph(%d, %d, %d, %d, %d, %lu)\n", wid, x, y, glyph, bkglyph, glyphmod); if ((wid >= 0) && (wid < MAXWINDOWS) && (GetNHApp()->windowlist[wid].win != NULL)) { @@ -1306,6 +1309,9 @@ mswin_print_glyph(winid wid, XCHAR_P x, XCHAR_P y, int glyph, int bkglyph) data.y = y; data.glyph = glyph; data.bkglyph = bkglyph; + data.glyphmod[GM_TTYCHAR] = glyphmod[GM_TTYCHAR]; + data.glyphmod[GM_COLOR] = glyphmod[GM_COLOR]; + data.glyphmod[GM_FLAGS] = glyphmod[GM_FLAGS]; SendMessage(GetNHApp()->windowlist[wid].win, WM_MSNH_COMMAND, (WPARAM) MSNH_MSG_PRINT_GLYPH, (LPARAM) &data); } diff --git a/win/win32/winMS.h b/win/win32/winMS.h index 17cb8d2ef..6ec4e9c3b 100644 --- a/win/win32/winMS.h +++ b/win/win32/winMS.h @@ -162,7 +162,7 @@ void mswin_update_inventory(void); void mswin_mark_synch(void); void mswin_wait_synch(void); void mswin_cliparound(int x, int y); -void mswin_print_glyph(winid wid, XCHAR_P x, XCHAR_P y, int glyph, int bkglyph); +void mswin_print_glyph(winid wid, XCHAR_P x, XCHAR_P y, int glyph, int bkglyph, unsigned *glyphmod); void mswin_raw_print(const char *str); void mswin_raw_print_bold(const char *str); void mswin_raw_print_flush();