Added more control when specifying draconians in maps (any yellow draconian, green draconian knight, any nonbase red draconian, any base draconian, etc.).
Fixed crash when dragon or draconian breathes and the player is unarmed.
Replaced magic number 250 in monster creation with enum constant MONS_PROGRAM_BUG.
git-svn-id: https://crawl-ref.svn.sourceforge.net/svnroot/crawl-ref/trunk@3253 c06c8d41-db1a-0410-9941-cceddc491573
IE3INS4WUXZOBVXB5VWRBYPVPXADD2U2W5H3TBTOYNWJ3EGRSGQQC
V4C7C4NGWD34ZZHOT4V7FRYRC7ZZA2W6FSN3BO73IJBSVFCHQOCQC
NRMSQFTORG3GC7HQBIN5DHB5GLWXM6IQO6PTXD4C7LBQWJIHYIGAC
ZQDY7M2M4OW4JW5RFQDCFVZJWSC64UWFHX3KUDH44KSVV3C4NFXAC
TO3JMTZO6ETZWBXPA75JLCFD7ML546WXBRLWHPKL44ZIQ2H5HW6QC
32B6H524I6YHMCVYFWZPHP32R4BURWJHMFGLYAEWADGI45B27ZUQC
KT3JMGSH5VTNRV2H5POWZLYNXSIRE5CT2XW3ZID7FNZTXYOZG22QC
CNTH672RXIVHXRTZQ5MB4SDZKVQI3J5B6AD6PLUPONCTY7IDDMZAC
TF5WVX4WNGWZTEB6BN3CLPOTLT7KWA3B6P2L2QWRFH67YTH5LVMAC
EH4VJW3I5Y4V6DT3YMLNDA3NW2DEAV4LRE4T5IEXAVB4WB3JJMGAC
X4OCLD5YEXCYVQNMOQORLIO72AKUEMT3BT6FB3TW2HARKN5X7MEQC
CGYTZT5QWIEGYKUOLOK7MFXSLJKLYRZONER5ZCDZO5XYWSLG475QC
4NBPZKMZBKB3QYX4FFUAKDXQS43NJCBDLMHKDJFVXHQLX4MQDINAC
45CWQUPQHKUFUJ4MVL5K3KCVCCKLY2Z7RZWZ53UT723RV5STPSRAC
KFULGQQOHWUTXOM3BXCCYPGGVGGY4Z6265XUFRCBPNLTZAEHJZSQC
DH3YTI6VVI727SQXO4CXSDCSBG2UN3UAWLFULBGRLBVH22ACRXIAC
K2CS6TCX2NDVL2ASEHGP4J4K4IJ6FP3ANNKTSIWVG43HPYSBX6ZQC
AREBCIU2RU2RNHBWD4GARWEBKSL7HDFGDLII22H56OJO2AQUOMLQC
X5WLJCJVW55SXZVP7IKP7ADCJIGNKN4PKAXFECVR6TNK7XSMZR7QC
C7EEMEI6FU6L2VWZBTDCZO5ZTB2N5TCNGSMIBZTN6NZRE7BUBFPQC
SJXOZ6J66G3S5VYGIZ3YHEUCKUF5554YEFUYLVBH7X4ALYSXKTGQC
U3KGUJJQWQORJIIFH3ADVNIEEX5HOX6KEOXO7DJSL7L3Z6GG3PAQC
TS7X6ZTTQRB2I53VV4LXZPXZWM3DIKYI3T5PPHZANSEW4Q7QZBOAC
7BQVRR4GR2WNIGOE7D6WGVSFLMW5B6HPMJIZPZBPTSM6H57XXH4AC
3HMZIQCJSWUYTWQDWRQYPI5VOSRIAGGBOM7LIMF7362RJ2LRMZAAC
SWOYPTHJAWFEDBMB3ROT33VQZIXGZD5UOXEV456DDUENW2HGA66QC
L4PKJZERR7WADKWHY3MR6J6OZFREVPL3CB43I6MLJ2BVKWCUTE7AC
CA6ZG6P2CE5EPAOQSB3P7NBDKTNFFHQP4CPOUFZL32ON6N32GSSQC
3MAPXTL5GAQ6373CUUVPBARIRHBRSISAF3BO2WBEROT2KUAXWLGAC
SS6MUIJYTGIVBYU356Z563QJWLJ47QNHSJWS7GJTS7EATZH2ESJQC
DDU4A3JGN5IUIPP5IASOODKPR2WBHSDSV4FITZ6HNXNSXXQACWAQC
RPOZZWKG5GLPHVZZ7ZKMKS64ZMV2LDCQSARBJFJ6FZOTOKCQO7FAC
KEYK3CH5J46U6TTOKTWRNMYTZXMQXFVEAZUC4ZQ4QCOSJHVIBDRQC
L254F6ZIU2HWGLFFGPIORTN4C3TDQ3E5JZ7Z7GQA5AEDIKL6PKDAC
I7NXCEKCEBDWOGO7EDNRZ36GELP3P5GTOOXQG2YS5TXZTCNN7CDQC
XAFFD52IHN6FWFR2TT5F2KCUS7HAVCBI5CWTFMKPQG77GGTGAHLAC
C22455VGUQOSUX2OORA32LROFQ7NNYDMD2ZDTTUZSAQLXK4AD6QAC
WDEFQ6YABDQIGJXW5KT3OGR3EO6FZHXZELIRVIXQ4XDYTVOV5V6AC
2TECJQA3PK7OYSSTOWZSQFWMTATJRHHA6JV3IGRHFGS3R7U27RZAC
UZ6N6HOUPGVSPC5NQROEEDWMEGJA5XUWUY2AKH5QG65AZ25PVXDAC
MSQI3TH6T62JAXQGLL52QZCWAMC372TGB6ZNNRDGUGMJKBNNV2VAC
E5DMZFW6WCFAKTKKOQPYTQXZ2CGLWMVH64LRXDUI2UIG4VYUHIVQC
CIPVRZGLOZHCERK6YPOBV3P2E4IAB4H6D5EHLRQE2O5E4P4VCBUAC
7AMQN7MITMXBNVDAK5VOXTQ4TZIAOD6ZLOFJG7GQMBTY23Y2BKSAC
WW6THKR7JN447YC23YYHYYNH7ABMCFFSECNUFTIJBZX6JHX6W7TAC
GRH4XPIYHDOXXF3R3QPMZTFHGLO2OJAZS4FLNBBXG3DHTQQM7RDQC
2NCKGJDDPPGP2NXYYPEPVRJIIWEP6M7HE6WYMQN3UNNN3C2JIRFQC
JQFQX7IWSJ4TYWVUVXAFMCPSAN67PRMNECDQI5WMON2JFMQVVUEQC
YATODO2EN3AW7IXW5PL25HHK34YHF6Y32QBMOUZXEATZZ4YQQWZQC
TAVHZJPVNJBZR7CUURAOYNDZPNVQ3AGHTXDEP5K4JGYETBLQJDRQC
YZXHBEKWQPY4BTKG5FFGLP3AIRBQSTKQVLJJHWKQEA3HTN4UHDYQC
HIRKGUMNJPWKSVTR6TVBPD3MWNA63CEHCLCIPWEMGDFHVB3NPLDQC
JNB3PBPBJHDUHH47ZICB25QENPTMLYK7CXC5BXRVWZ3J3ZZPKCUAC
35KOQQV4ZBNNIAXGKPOYHOWTN7RBQY7HRZTVMR3WAS4GOYFBM6PQC
EWQIUA5WOC7YATFBBYEC4FM3V36MPM44EEDIMR4NU2DEUCSB2GSAC
VEOWM6UDFNWRAXP5YUO7XBH4ZALAJXCWRA4IRDITXJ3QWH42CTWAC
MWA35QHODXDNH2OYJ3URQQOXSEONHFXY4OG4VMGHYBBTAC777NLQC
JIMH7VEMQ7QF6VV2D65UISCRG5W55UX5YSQLLUW6SZNSTZMFWQ5AC
H3552BCIAVBLKAYKE4DHFLBLFW5RGRMYBMRRYHYEB5IPIJRUVU5QC
6X36L3WFJHVRAZ2KD6VQMG7O2BBTYKHVU7EMIRHUFUNE7VDMXA7AC
ED62QWGKBPORWVKDFOQRKJXEIWZVNGR3O4KWQBDSRNPT36AYOQYAC
KFM2ARORBIJ6BGX456VFW7EAVRIYBVFUV53JH63GSKNOKVPJWQ2QC
MXOCLQAUGWLOS7AOTYZ46JZDMRL4EVRK5YN4JJUQ76GLKBOBHEVAC
R6XS2HO5QX2FJUGL5UQQRNETKCMYWTUFPHPPS5SYWK3OQA4UDUQQC
ILN2K6ASDZSMEHOPJ22IZLZJUO6DDGZTKAKXM3YXG6JZZHJNLX4AC
GQL5SIGBHLU3FMCE54XVGLRY5AZHRM6DUEB722REA2DPLGJSN6EQC
// accuracy is halved if you're wielding a weapon of dragon slaying
// (which makes the dragon/draconian avoid looking at you)
// accuracy is halved if the dragon is attacking a target that's
// wielding a weapon of dragon slaying (which makes the
// dragon/draconian avoid looking at the foe).
//
// [ds] FIXME: This effect seems too strong. Perhaps use 75% of
// original to-hit instead of 50%.
bool place_monster(int &id, int mon_type, int power, beh_type behaviour,
int target, bool summoned, int px, int py, bool allow_bands,
proximity_type proximity, int extra, int dur,
unsigned mmask)
bool drac_colour_incompatible(int drac, int colour)
int band_size = 0;
int band_monsters[BIG_BAND]; // band monster types
int lev_mons = power; // final 'power'
int i;
dungeon_char_type stair_type = NUM_DCHAR_TYPES;
int tries = 0;
int pval = 0;
level_id place = level_id::current();
return (drac == MONS_DRACONIAN_SCORCHER && colour == MONS_WHITE_DRACONIAN);
}
// set initial id to -1 (unsuccessful create)
id = -1;
// (1) early out (summoned to occupied grid)
if (summoned && mgrd[px][py] != NON_MONSTER)
return (false);
static int resolve_monster_type(int mon_type, proximity_type proximity,
int num, int px, int py, unsigned mmask,
dungeon_char_type *stair_type,
int *lev_mons)
{
if (mon_type == RANDOM_DRACONIAN)
{
// Pick any random drac, constrained by colour if requested.
do
mon_type =
random_range(MONS_BLACK_DRACONIAN, MONS_DRACONIAN_SCORCHER);
while (num != MONS_PROGRAM_BUG
&& mon_type != num
&& (mons_species(mon_type) == mon_type
|| drac_colour_incompatible(mon_type, num)));
}
else if (mon_type == RANDOM_BASE_DRACONIAN)
mon_type = random_range(MONS_BLACK_DRACONIAN, MONS_PALE_DRACONIAN);
else if (mon_type == RANDOM_NONBASE_DRACONIAN)
mon_type = random_range(MONS_DRACONIAN_CALLER, MONS_DRACONIAN_SCORCHER);
if ( stair_type == DCHAR_STAIRS_DOWN ) // deeper level
lev_mons++;
else if (stair_type == DCHAR_STAIRS_UP) // higher level
if ( *stair_type == DCHAR_STAIRS_DOWN ) // deeper level
++*lev_mons;
else if (*stair_type == DCHAR_STAIRS_UP) // higher level
mon_type = pick_random_monster(place, lev_mons,
lev_mons);
if (mon_type == MONS_PROGRAM_BUG)
return (false);
mon_type = pick_random_monster(place, *lev_mons, *lev_mons);
return (mon_type);
}
bool place_monster(int &id, int mon_type, int power, beh_type behaviour,
int target, bool summoned, int px, int py, bool allow_bands,
proximity_type proximity, int extra, int dur,
unsigned mmask)
{
int band_size = 0;
int band_monsters[BIG_BAND]; // band monster types
int lev_mons = power; // final 'power'
int i;
int tries = 0;
int pval = 0;
dungeon_char_type stair_type = NUM_DCHAR_TYPES;
// set initial id to -1 (unsuccessful create)
id = -1;
// (1) early out (summoned to occupied grid)
if (summoned && mgrd[px][py] != NON_MONSTER)
return (false);
mon_type =
resolve_monster_type(mon_type, proximity, extra,
px, py, mmask, &stair_type,
&lev_mons);
static const char *drac_colour_names[] = {
"black", "mottled", "yellow", "green", "purple",
"red", "white", "pale"
};
std::string draconian_colour_name(monster_type mtype)
{
ASSERT(ARRAYSIZE(drac_colour_names) ==
MONS_PALE_DRACONIAN - MONS_DRACONIAN);
if (mtype < MONS_BLACK_DRACONIAN || mtype > MONS_PALE_DRACONIAN)
return "buggy";
return (drac_colour_names[mtype - MONS_BLACK_DRACONIAN]);
}
monster_type draconian_colour_by_name(const std::string &name)
{
ASSERT(ARRAYSIZE(drac_colour_names) ==
MONS_PALE_DRACONIAN - MONS_DRACONIAN);
for (unsigned i = 0; i < ARRAYSIZE(drac_colour_names); ++i)
if (name == drac_colour_names[i])
return static_cast<monster_type>(i + MONS_BLACK_DRACONIAN);
return (MONS_PROGRAM_BUG);
}
switch (mon.number)
{
default: break;
case MONS_BLACK_DRACONIAN: result += "black "; break;
case MONS_MOTTLED_DRACONIAN: result += "mottled "; break;
case MONS_YELLOW_DRACONIAN: result += "yellow "; break;
case MONS_GREEN_DRACONIAN: result += "green "; break;
case MONS_PURPLE_DRACONIAN: result += "purple "; break;
case MONS_RED_DRACONIAN: result += "red "; break;
case MONS_WHITE_DRACONIAN: result += "white "; break;
case MONS_PALE_DRACONIAN: result += "pale "; break;
}
result +=
draconian_colour_name(
static_cast<monster_type>( mon.number ) ) + " ";
break;
// Handle draconians specified as:
// Exactly as in mon-data.h:
// yellow draconian or draconian knight - the monster specified.
//
// Others:
// any draconian => any random draconain
// any base draconian => any unspecialised coloured draconian.
// any nonbase draconian => any specialised coloured draconian.
// any <colour> draconian => any draconian of the colour.
// any nonbase <colour> draconian => any specialised drac of the colour.
//
mons_spec mons_list::drac_monspec(std::string name) const
{
mons_spec spec;
spec.mid = get_monster_by_name(name, true);
// Check if it's a simple drac name, we're done.
if (spec.mid != MONS_PROGRAM_BUG)
return (spec);
spec.mid = RANDOM_DRACONIAN;
// Request for any draconian?
if (starts_with(name, "any "))
// Strip "any "
name = name.substr(4);
if (starts_with(name, "base "))
{
// Base dracs need no further work.
return (RANDOM_BASE_DRACONIAN);
}
else if (starts_with(name, "nonbase "))
{
spec.mid = RANDOM_NONBASE_DRACONIAN;
name = name.substr(8);
}
trim_string(name);
// Match "any draconian"
if (name == "draconian")
return (spec);
// Check for recognition again to match any (nonbase) <colour> draconian.
const monster_type colour = get_monster_by_name(name, true);
if (colour != MONS_PROGRAM_BUG)
{
spec.monnum = colour;
return (spec);
}
// Only legal possibility left is <colour> boss drac.
std::string::size_type wordend = name.find(' ');
if (wordend == std::string::npos)
return (MONS_PROGRAM_BUG);
std::string scolour = name.substr(0, wordend);
if ((spec.monnum = draconian_colour_by_name(scolour)) == MONS_PROGRAM_BUG)
return (MONS_PROGRAM_BUG);
name = trimmed_string(name.substr(wordend + 1));
spec.mid = get_monster_by_name(name, true);
// We should have a non-base draconian here.
if (spec.mid == MONS_PROGRAM_BUG
|| mons_genus(spec.mid) != MONS_DRACONIAN
|| spec.mid == MONS_DRACONIAN
|| (spec.mid >= MONS_BLACK_DRACONIAN
&& spec.mid <= MONS_PALE_DRACONIAN))
{
return (MONS_PROGRAM_BUG);
}
return (spec);
}
inline bool starts_with(const std::string &s, const std::string &prefix)
{
return (s.rfind(prefix, 0) != std::string::npos);
}
inline bool ends_with(const std::string &s, const std::string &suffix)
{
if (s.length() < suffix.length())
return false;
return (s.find(suffix, s.length() - suffix.length()) != std::string::npos);
}
###########################
#
# Zot petite vaults
#
NAME: lemuel_baited_zot_trap
DEPTH: Zot:*
CHANCE: 20
TAGS: allow_dup
KFEAT: * = Zot trap
KITEM: * = any good_item
MAP
*
ENDMAP
NAME: lemuel_zot_downstairs
DEPTH: Zot:1-4
ORIENT: float
TAGS: allow_dup
SUBST: . = .^
KFEAT: ^ = Zot trap
SUBST: > = }])
MAP
xxxxxxx
@....>x
xxxxxxx
ENDMAP
NAME: lemuel_zot_upstairs
DEPTH: Zot:2-5
ORIENT: float
TAGS: allow_dup
SUBST: . = .^
KFEAT: ^ = zot trap
SUBST: < = ([{
MAP
xxxxxxx
@....<x
xxxxxxx
ENDMAP
###########################
# Halls of Wrath
#
NAME: lemuel_halls_of_wrath
DEPTH: Zot:1-4
ORIENT: float
FLAGS: no_rotate
NSUBST: 1 = 6:2 / *=1
SUBST: 1 = 1 .:5
SUBST: 1 = 1 3
MONS: troll/deep troll/iron troll/ogre/two-headed ogre/w:2 iron devil
MONS: moth of wrath
MONS: hill giant/stone giant/fire giant/frost giant/ettin/w:5 efreet/w:3 titan
NSUBST: C = 2:= / *=c
NSUBST: D = 2:= / *=c
MAP
cccccccccccccccccccccccc
n111111111111111111.c..c
n111111111111111111.c.)c
cCCCCCCCCCCCCCCcc++cc..c
n....F....F....F....c..c
+...................+..c
+...................+.}c
+...................+..c
n....F....F....F....c..c
cDDDDDDDDDDDDDDcc++cc..c
n111111111111111111.c.]c
n111111111111111111.c..c
cccccccccccccccccccccccc
ENDMAP
###########################
# Lich library
#
NAME: lemuel_lich_library
DEPTH: Zot:1-4
TAGS: no_monster_gen
MONS: flying skull, lich, ancient lich, necromancer, vampire mage, mimic
ITEM: any book, any scroll
SUBST: w:w?
SUBST: ?=. 1:1
SUBST: x:xc
SUBST: +=+=
SUBST: d = d 6:1
SUBST: 4 = 4 5:2 .:4
SUBST: d = d:20 e
MAP
wwwwwwwwwwwwwwwwwwwwwww
wwwwwwwwwwwwwwwwwwwwwww
wwxxxxxxxxx+xxxxxxxxxww
wwx....x.......x....xww
wwx....+...F...+....xww
wwx.4..x.......x..4.xww
wwx4.4.xxxx+xxxx.4.4xww
wwx.4.4xxx...xxx4.4.xww
wwx4.4.xxx.2.xxx.4.4xww
wwxxxxxxxxx+xxxxxxx+xww
wwxxxxxxxxx.xxxxxx$$xww
wwxdddxxxxx.x...xx$$xww
wwx.2.xxxxx.+.F.xxxxxww
wwx...xxxxx.x...xxxxxww
wwx...xxxxx.xxxxxxxxxww
wwxx+xxxxxx.xxxdddddxww
wwxx.xxxxxx.xxxd232dxww
wwxx.xxxxxx.xxxd...dxww
wwxx......+...+....dxww
wwxxxxxxxxxmxxxd...dxww
wwxxxxxxxxxFxxxdddddxww
wwxxxxxxxxxxxxxxxxxxxww
wwwwwwwwwwwwwwwwwwwwwww
wwwwwwwwwwwwwwwwwwwwwww
ENDMAP
###########################
# Lake of fire
#
NAME: lemuel_lake_of_fire
DEPTH: Zot:*
SUBST: * =*l
KMONS: * = orb of fire
KFEAT: * = l
SUBST: .=.l
MAP
..ll..
..llll..
.llllll.
.ll**ll.
.ll**ll.
.llllll.
..llll..
..ll..
ENDMAP
###########################
#
# Globe of electric golems
#
NAME: lemuel_golem_globe
DEPTH: Zot:*
FLAGS: no_rotate
SUBST: 1 = 1.
MONS: electric golem
MAP
mmmm
mm..mm
mm.11.mm
m.1..1.m
mm.11.mm
mm..mm
mmmm
ENDMAP
###########################
# Acid trip
#
NAME: lemuel_acid_trip
DEPTH: Zot:1-4
ORIENT: float
MONS: oklob plant, acid blob, jelly, yellow draconian
MONS: any nonbase yellow draconian
SUBST: 1 = 1:2 .
SUBST: . = .:20 3:3 2:1
SUBST: }=}>, )=)>, ]=]>
# chance for having all downstairs in the vault is 12.5%
MAP
xx++xx
xxx....xxx
xxx..4444..xxx
xx....4554....xx
xx.....cccc.....xx
x....ccc..ccc....x
xx...cc......cc...xx
x...cc..1111..cc...x
x...c...1}11...c...x
x.5.c...11]1...c.5.x
x...c...1)11...c...x
x...cc..1111..cc...x
xx...cc......cc...xx
x....cc....cc....x
xx....c....c....xx
xx............xx
xxx..4444..xxx
xxx4554xxx
xxxxxx
ENDMAP
###########################
# Firehouse
#
NAME: lemuel_firehouse
DEPTH: Zot: 1-4
ORIENT: float
MONS: orb of fire
MONS: fire elemental
MONS: red draconian / weight:2 mottled draconian
MONS: any nonbase red draconian
MONS: efreet
SUBST: 1=122, 3=322
SUBST: 4 = 2:20 4:5 3:15 .:20
MAP
lllll
lllllllllll
lllll.....lllll
llll....x....llll
llll....xxx....llll
llll...xx}xx...llll
llll...xx]2)xx...llll
llll..xx2...2xx..llll
llll..xx...5...xx..llll
llll..x...2.2...x..llll
llll...x.2xx+xx2.x...llll
llll...x.xx444xx.x...llll
llll...x.x44444x.x...llll
llll..x.x44F44x.x..llll
llll..x.x44444x.x..llll
llll.x.xx444xx.x.llll
llll.x.1x...x1.x.llll
llllxxxx+++xxxxllll
llll333...333llll
lllll.....lllll
lllllllllll
ll>ll
ENDMAP
ENDMAP
##############################################################################
# Hell vaults
##############################################################################
##############################################################################
# lemuel_hellion_isle
NAME: lemuel_hellion_isle
DEPTH: Geh:*
MONS: hellion, Fiend
SUBST: L = l.
SUBST: 1 = .:2 l:2 1
MAP
lL
llL
LlLLL
LLllLL
llLLLlllLLL
LllllllllllLL
LLLlll11lllllLL
LLLll111llllL
LLlll121llLL
Lllll111lLL
LLllll1llL
LllllllL
LLLlllL
LLllL
LlL
LlL
ENDMAP
##############################################################################
# lemuel_mystery_crypt
NAME: lemuel_mystery_crypt
DEPTH: Dis:*
MONS: mummy / mummy priest / greater mummy, lich
NSUBST: 1:1=} / *=1
NSUBST: 1:1=) / *=1
NSUBST: 1:1=] / *=1
SUBST: = : =+
SUBST: }=}>, )=)>, ]=]>
# occasionally (12.5%), all downstairs are in this vault
ORIENT: float
MAP
xxxxxxxxxxxxxxxxxxxxxxx
xxFxxxx1.x1x.1xxx2..=1x
xx.xxxxx.x.x.xxxx...xxx
xx.xx1.x.x.x.x.1x...=1x
xx.xxx=x=x=x=x=xx...xxx
x...+...........+...=1x
+...+.....F.....+.F.xxx
x...+...........+...=1x
xx.xxx=x=x=x=x=xx...xxx
xx.xx1.x.x.x.x.1x...=1x
xx.xxxxx.x.x.xxxx...xxx
xxFxxxx1.x1x.1xxx2..=1x
xxxxxxxxxxxxxxxxxxxxxxx
#############################################################################
##############################################################################
# lemuel_nasty_pond
NAME: lemuel_nasty_pond
DEPTH: Tar:*
TAGS: no_pool_fixup
FLAGS: no_rotate
MONS: plant, oklob plant, death ooze, rotting devil, blue death / green death
SUBST: W:w.
SUBST: Z:w.
SUBST: w = w .:1
SUBST: . = .:15 1:1 w:1
SUBST: 1 = 1 2:2
COLOUR: . = none / green w:2
COLOUR: w = green / lightgreen
MAP
...WWWW3....
.3..WWWWW....3...
....WWWwwW...3....3.
..Z.WWwwwwww3.....3...
3.ZZWwwwwwwwwww3......
.ZZZ..wwwww5wwwwww3...
..3Z..44wwwwwww33.....
.3ZZZ..44wwwwww3..3...
.ZZZZZ.44wwwww........
..ZZZZZ4wwww.3......
3ZZZZwwwww....3.
.ZZwww3.....
ENDMAP
##############################################################################
xxxxxxxxxxx............................{............................xxxxxxxxxxxx
xxxxxxxxxxx............................{......................cccc..xxxxxxxxxxxx
xxxxxxxxxxx...................................................ccccccccxxxxxxxxxx
xxxxxxxxxx...l.l..............................................cccc...cxxxxxxxxxx
xxxxxxxxxx..l.l.l.l.............................................c....cxxxxxxxxxx
xxxxxxxxxx.l.l.l.l.l............................................c....cxxxxxxxxxx
xxxxxxxxx.l.l.l.l.l.............................................c...ccccxxxxxxxx
xxxxxxxxxl.l.l.l.l.l............................................+...c..ccxxxxxxx
xxxxxxxxx.l.l.l.G.l.l.................}1].......................+...+.T.cxxxxxxx
xxxxxxxxxl.l.l.l.l.l.l.................)........................+...c..ccxxxxxxx
xxxxxxxxx.l.l.l.l.l.l...........................................c...ccccxxxxxxxx
xxxxxxxxxx.l.l.l.l.l.l..........................................c....cxxxxxxxxxx
xxxxxxxxxx..l.l.l.l.............................................c....cxxxxxxxxxx
xxxxxxxxxx.....l.l............................................cccc...cxxxxxxxxxx
xxxxxxxxxxx......................[...........(................ccccccccxxxxxxxxxx
xxxxxxxxxxx...................................................cccc..xxxxxxxxxxxx
xxxxxxxxxx...l.l.....................................................xxxxxxxxxxx
xxxxxxxxxx..l.l.l.l..................................................xxxxxxxxxxx
xxxxxxxxxx.l.l.l.l.l.................................................xxxxxxxxxxx
xxxxxxxxx.l.l.l.l.l...................................................xxxxxxxxxx
xxxxxxxxxl.l.l.l.l.l..................................................xxxxxxxxxx
xxxxxxxxx.l.l.l.G.l.l.................}1].............................=Txxxxxxxx
xxxxxxxxxl.l.l.l.l.l.l.................)..............................xxxxxxxxxx
xxxxxxxxx.l.l.l.l.l.l.................................................xxxxxxxxxx
xxxxxxxxxx.l.l.l.l.l.l...............................................xxxxxxxxxxx
xxxxxxxxxx..l.l.l.l..................................................xxxxxxxxxxx
xxxxxxxxxx.....l.l...................................................xxxxxxxxxxx
xxxxxxxxxxx......................[...........(......................xxxxxxxxxxxx
xxxxxxxxxxx.........................................................xxxxxxxxxxxx
xxxxxxxxxxx.........................................................xxxxxxxxxxxx
#############################################################################
# Asmodeus
#
##############################################################################
# Asmodeus
##############################################################################