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 typesint 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.domon_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 levellev_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 typesint 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_trapDEPTH: Zot:*CHANCE: 20TAGS: allow_dupKFEAT: * = Zot trapKITEM: * = any good_itemMAP*ENDMAPNAME: lemuel_zot_downstairsDEPTH: Zot:1-4ORIENT: floatTAGS: allow_dupSUBST: . = .^KFEAT: ^ = Zot trapSUBST: > = }])MAPxxxxxxx@....>xxxxxxxxENDMAPNAME: lemuel_zot_upstairsDEPTH: Zot:2-5ORIENT: floatTAGS: allow_dupSUBST: . = .^KFEAT: ^ = zot trapSUBST: < = ([{MAPxxxxxxx@....<xxxxxxxxENDMAP############################ Halls of Wrath#NAME: lemuel_halls_of_wrathDEPTH: Zot:1-4ORIENT: floatFLAGS: no_rotateNSUBST: 1 = 6:2 / *=1SUBST: 1 = 1 .:5SUBST: 1 = 1 3MONS: troll/deep troll/iron troll/ogre/two-headed ogre/w:2 iron devilMONS: moth of wrathMONS: hill giant/stone giant/fire giant/frost giant/ettin/w:5 efreet/w:3 titanNSUBST: C = 2:= / *=cNSUBST: D = 2:= / *=cMAPccccccccccccccccccccccccn111111111111111111.c..cn111111111111111111.c.)ccCCCCCCCCCCCCCCcc++cc..cn....F....F....F....c..c+...................+..c+...................+.}c+...................+..cn....F....F....F....c..ccDDDDDDDDDDDDDDcc++cc..cn111111111111111111.c.]cn111111111111111111.c..cccccccccccccccccccccccccENDMAP############################ Lich library#NAME: lemuel_lich_libraryDEPTH: Zot:1-4TAGS: no_monster_genMONS: flying skull, lich, ancient lich, necromancer, vampire mage, mimicITEM: any book, any scrollSUBST: w:w?SUBST: ?=. 1:1SUBST: x:xcSUBST: +=+=SUBST: d = d 6:1SUBST: 4 = 4 5:2 .:4SUBST: d = d:20 eMAPwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwxxxxxxxxx+xxxxxxxxxwwwwx....x.......x....xwwwwx....+...F...+....xwwwwx.4..x.......x..4.xwwwwx4.4.xxxx+xxxx.4.4xwwwwx.4.4xxx...xxx4.4.xwwwwx4.4.xxx.2.xxx.4.4xwwwwxxxxxxxxx+xxxxxxx+xwwwwxxxxxxxxx.xxxxxx$$xwwwwxdddxxxxx.x...xx$$xwwwwx.2.xxxxx.+.F.xxxxxwwwwx...xxxxx.x...xxxxxwwwwx...xxxxx.xxxxxxxxxwwwwxx+xxxxxx.xxxdddddxwwwwxx.xxxxxx.xxxd232dxwwwwxx.xxxxxx.xxxd...dxwwwwxx......+...+....dxwwwwxxxxxxxxxmxxxd...dxwwwwxxxxxxxxxFxxxdddddxwwwwxxxxxxxxxxxxxxxxxxxwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwENDMAP############################ Lake of fire#NAME: lemuel_lake_of_fireDEPTH: Zot:*SUBST: * =*lKMONS: * = orb of fireKFEAT: * = lSUBST: .=.lMAP..ll....llll...llllll..ll**ll..ll**ll..llllll...llll....ll..ENDMAP############################# Globe of electric golems#NAME: lemuel_golem_globeDEPTH: Zot:*FLAGS: no_rotateSUBST: 1 = 1.MONS: electric golemMAPmmmmmm..mmmm.11.mmm.1..1.mmm.11.mmmm..mmmmmmENDMAP############################ Acid trip#NAME: lemuel_acid_tripDEPTH: Zot:1-4ORIENT: floatMONS: oklob plant, acid blob, jelly, yellow draconianMONS: any nonbase yellow draconianSUBST: 1 = 1:2 .SUBST: . = .:20 3:3 2:1SUBST: }=}>, )=)>, ]=]># chance for having all downstairs in the vault is 12.5%MAPxx++xxxxx....xxxxxx..4444..xxxxx....4554....xxxx.....cccc.....xxx....ccc..ccc....xxx...cc......cc...xxx...cc..1111..cc...xx...c...1}11...c...xx.5.c...11]1...c.5.xx...c...1)11...c...xx...cc..1111..cc...xxx...cc......cc...xxx....cc....cc....xxx....c....c....xxxx............xxxxx..4444..xxxxxx4554xxxxxxxxxENDMAP
############################ Firehouse#NAME: lemuel_firehouseDEPTH: Zot: 1-4ORIENT: floatMONS: orb of fireMONS: fire elementalMONS: red draconian / weight:2 mottled draconianMONS: any nonbase red draconianMONS: efreetSUBST: 1=122, 3=322SUBST: 4 = 2:20 4:5 3:15 .:20MAPlllllllllllllllllllll.....lllllllll....x....llllllll....xxx....llllllll...xx}xx...llllllll...xx]2)xx...llllllll..xx2...2xx..llllllll..xx...5...xx..llllllll..x...2.2...x..llllllll...x.2xx+xx2.x...llllllll...x.xx444xx.x...llllllll...x.x44444x.x...llllllll..x.x44F44x.x..llllllll..x.x44444x.x..llllllll.x.xx444xx.x.llllllll.x.1x...x1.x.llllllllxxxx+++xxxxllllllll333...333lllllllll.....llllllllllllllllll>llENDMAP
ENDMAP############################################################################### Hell vaults############################################################################################################################################################# lemuel_hellion_isleNAME: lemuel_hellion_isleDEPTH: Geh:*MONS: hellion, FiendSUBST: L = l.SUBST: 1 = .:2 l:2 1MAPlLllLLlLLLLLllLLllLLLlllLLLLllllllllllLLLLLlll11lllllLLLLLll111llllLLLlll121llLLLllll111lLLLLllll1llLLllllllLLLLlllLLLllLLlLLlLENDMAP############################################################################### lemuel_mystery_cryptNAME: lemuel_mystery_cryptDEPTH: Dis:*MONS: mummy / mummy priest / greater mummy, lichNSUBST: 1:1=} / *=1NSUBST: 1:1=) / *=1NSUBST: 1:1=] / *=1SUBST: = : =+SUBST: }=}>, )=)>, ]=]># occasionally (12.5%), all downstairs are in this vaultORIENT: floatMAPxxxxxxxxxxxxxxxxxxxxxxxxxFxxxx1.x1x.1xxx2..=1xxx.xxxxx.x.x.xxxx...xxxxx.xx1.x.x.x.x.1x...=1xxx.xxx=x=x=x=x=xx...xxxx...+...........+...=1x+...+.....F.....+.F.xxxx...+...........+...=1xxx.xxx=x=x=x=x=xx...xxxxx.xx1.x.x.x.x.1x...=1xxx.xxxxx.x.x.xxxx...xxxxxFxxxx1.x1x.1xxx2..=1xxxxxxxxxxxxxxxxxxxxxxxx
#############################################################################
############################################################################### lemuel_nasty_pondNAME: lemuel_nasty_pondDEPTH: Tar:*TAGS: no_pool_fixupFLAGS: no_rotateMONS: plant, oklob plant, death ooze, rotting devil, blue death / green deathSUBST: W:w.SUBST: Z:w.SUBST: w = w .:1SUBST: . = .:15 1:1 w:1SUBST: 1 = 1 2:2COLOUR: . = none / green w:2COLOUR: w = green / lightgreenMAP...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..xxxxxxxxxxxxxxxxxxxxxxx...................................................ccccccccxxxxxxxxxxxxxxxxxxxx...l.l..............................................cccc...cxxxxxxxxxxxxxxxxxxxx..l.l.l.l.............................................c....cxxxxxxxxxxxxxxxxxxxx.l.l.l.l.l............................................c....cxxxxxxxxxxxxxxxxxxx.l.l.l.l.l.............................................c...ccccxxxxxxxxxxxxxxxxxl.l.l.l.l.l............................................+...c..ccxxxxxxxxxxxxxxxx.l.l.l.G.l.l.................}1].......................+...+.T.cxxxxxxxxxxxxxxxxl.l.l.l.l.l.l.................)........................+...c..ccxxxxxxxxxxxxxxxx.l.l.l.l.l.l...........................................c...ccccxxxxxxxxxxxxxxxxxx.l.l.l.l.l.l..........................................c....cxxxxxxxxxxxxxxxxxxxx..l.l.l.l.............................................c....cxxxxxxxxxxxxxxxxxxxx.....l.l............................................cccc...cxxxxxxxxxxxxxxxxxxxxx......................[...........(................ccccccccxxxxxxxxxxxxxxxxxxxxx...................................................cccc..xxxxxxxxxxxx
xxxxxxxxxx...l.l.....................................................xxxxxxxxxxxxxxxxxxxxx..l.l.l.l..................................................xxxxxxxxxxxxxxxxxxxxx.l.l.l.l.l.................................................xxxxxxxxxxxxxxxxxxxx.l.l.l.l.l...................................................xxxxxxxxxxxxxxxxxxxl.l.l.l.l.l..................................................xxxxxxxxxxxxxxxxxxx.l.l.l.G.l.l.................}1].............................=Txxxxxxxxxxxxxxxxxl.l.l.l.l.l.l.................)..............................xxxxxxxxxxxxxxxxxxx.l.l.l.l.l.l.................................................xxxxxxxxxxxxxxxxxxxx.l.l.l.l.l.l...............................................xxxxxxxxxxxxxxxxxxxxx..l.l.l.l..................................................xxxxxxxxxxxxxxxxxxxxx.....l.l...................................................xxxxxxxxxxxxxxxxxxxxxx......................[...........(......................xxxxxxxxxxxxxxxxxxxxxxx.........................................................xxxxxxxxxxxxxxxxxxxxxxx.........................................................xxxxxxxxxxxx
############################################################################## Asmodeus#
############################################################################### Asmodeus##############################################################################