This might have introduced some bugs: I now get intermittent crashes on startup (this might have to do with the changes to special_room.) Sorry about that - committing before I need to do any more big conflict resolutions. Fixes coming later.
git-svn-id: https://crawl-ref.svn.sourceforge.net/svnroot/crawl-ref/trunk@6732 c06c8d41-db1a-0410-9941-cceddc491573
SIDH2P7NBIG5KEOE27XHD3ZT2NQ2OJZFN6VZXWNWYFFY5YVXSSVQC T5LXIUDYIJH3PB5IFGGN2UT5SVS2PH3RHXH3JOFBLG2V6V3OGN7QC DAQ2V7UKJZGPMSL63L5CU2BQ77QPTV4AV2EQAEIOBKTM7MROTNVAC JTDCW2MCYACX7ZXCLARRTSPYVZAAQKAPA5YWBRA5KKCHKMRFT5QAC Y2AKNQQDDJ2JMJAVFM74PWCHFOL6SSD6O5KUDJBFTV2UBZYLO4JQC GXKLF4UHNQTOG4JAIMNFALCK4AX3LIRDKZROPYVMYBOGWXTTKMOAC B2RFDVZOXTEZFX543OQRF5CRW7RFO6EJEDOKDLMOZSYJUZ7WUZNAC UEMWQ43AFJOEEXGTXRDT5R6UPPVXSVNDZSA64PD364PJEVXJTUAQC RLZ52B2RIO2ZOTDCERISBSQL2YNUWHAOPO3LG4V66NDGVB32DVOQC 4KLWHPJEMJD4W5PW2W7532K524Y6VGCGG2T7A37KY42IAACWHJEAC TMCQX3FTNVHGHVSJZJLVZ3TLWVF3GNXAMX3WZW64S2LUDQ2KQW2AC RFBNVDJ3RJATZ5CVPHZF2SHZRN7G7LI4TARLGW7M7J2D6HPBBMXQC 42ID4ZFON757GHVWYTRTULQB7YKQSLPUKNYW4HVNVWLG4QHDJI4AC FQYPXOW7QKCKR2LHPZXRC6BI2ZMECFISPFYWAB5GWZH6FWAGLRZQC CO3IUAKWE3HYMRCHV7EQC473KI2BOZDBHXVHXBJEO3BLIYABQN3QC AIEVTCZRPA3ZK4YGELI6MW34LDPOWDM7AM35DO6QB6PVYLHTRRZAC DHALALIGG7PVB52N6PDZRMXGML6MV53MUJBLO2ZP3L24H7EVVBWQC VCCPAZQXJIAPZSMLNPJDQE7LXO37A56BB33HX3P5P4IZ77VIQVGQC 2VUJ2IMYI7MYLFMSPYAH6IEXIMFG4JUSUYLVCW7SZELHSLPIEL3AC FVEPL7AUMO6QPLVPGQVZTPSI5ITBIW6Q7CYUWQYGVNUHKTK5FQHAC FMIJ6JZ42OUFL2PPNOI7SJPABN5MGBXWH2ELF23AKFVNAZFHPS7AC XO46PGFNQ3WWQWQICZ6DVBBK5CAQVZ26MYZKWF6G4B2VGXKTGDTAC 6YDBSYLFVN46R6TUMPBTAAE5SJZDHAL2VLF55FXHHAF3KM76UFMQC 6IX7V3PY4ZESJO3MCEXXRQWT2OTJCGUU5LQQZF76YNE4XHSW523QC Y4ORYGHVKJMAF2HCG6AIGTZP56DBLHDNR5JERCQBJJRUWD6WZMCQC MRNLVLPKGYRKAJ775ATOG5V6LYD3DTIKGWEUE7F6NGD6S3CNBIVQC FQZQDCMDTH4C3B7JXWPZNHTQKRKZF2VV2SNG2ZULDIYFINNKQCYQC 6UEKO6GLZNCAGVJRMRBVX6XSLS7H3SFUOUZRPECEOA5TV2DC2QIQC 5OFUF2JHXEX5AF5CDY4KATIAFKIHDKTV463PIJZN3IXEIJWDNVYAC 66544JROPPFOFRRQ6JIWBNV47KCE27TYFZJJMK75Z3HZMPTCT4GAC KBIIMBVTWPMMUZLPLK2KJOXKSVMGUREIYJ57VCYVXDX5F23QXDEQC ENR5ESQYWRTVCHJTZVHKUQN4ZRRQHZN3NFW6UJQFBV5PRNTY6FYAC FFTLO4E55WG64QGFHKKQYH7AFLQNIQKYRDP5JQ72LHZEORSS3DWAC 4QRLZDW4KBFG34B3MCG4375NHFR3WKWSLWQKRMQ3OE5R26WCZBBQC JQ7TYWYJV6PRQLENUF25ZHHD3ULFTROL7OS6DHQKEWXTJH5VRSUQC 33QMQXTWFPR4LUBHEWTFGR74L5QJJDQTT5JZRBFTPDQBPXIHQIUQC GQF26J3LYUS35FFHOV4N26QHSJIA5GXMNBXVVKDGX7YMFBFJK4LQC DPJBWGZZPH6WNIHLLENQBL3EO2WKHEOPAF777ROBCYBNK6DY5KDQC RWY7WOKVHCQFJYJZBNI74IB7W67465BZCA2YU3DE4MAUGHK4JBGQC 7IG33VVCNNO7RQ5LNZSNDYADT5AZYME2BNZFY33D3CA2Z7A5AZSAC OIMK2GZB5U47LAROHRYACNOXXHGSUCOZ75CGRKJ3IKIFWXVGV2DAC 6ZQY6HMQHBIQP6RPQZTK4KJ6YGCW2SJJUYHGI6UVATES5GKJRP7QC U3LUN66XOUGBCEA3E4BFKXBFTPGV5ZQRUTXUYRA73LF6YOHOQHEQC 35BSTPL7XDKCT3EVYH6MOCJFBYC57IPI5XFRFOEZ44RFLLU2QEWAC 3DQXSE4YGFBBDUWK4YEOFWW4UPWILWELFSLP37SL6BERGAZJC5YAC KFULGQQOHWUTXOM3BXCCYPGGVGGY4Z6265XUFRCBPNLTZAEHJZSQC TZ643KHSE5CUPXFSQ7VYVOCM5MTQ7F4SENEYQX2RNFHGHLQVS3RQC PL6I2CMSTHY5ZHWVMIQE5YTM5S5VPKBNZM6QJVHZSSKOJGIJ5W4AC K2CS6TCX2NDVL2ASEHGP4J4K4IJ6FP3ANNKTSIWVG43HPYSBX6ZQC TJISAZK5RWKXIIC5UTQNY4KT3UX3ASGBUQQNWZ7ZDULPRYFRZXQQC RPOZZWKG5GLPHVZZ7ZKMKS64ZMV2LDCQSARBJFJ6FZOTOKCQO7FAC D27U7RT2C77NEUBP6JCSQJ2DRCJVHOXUO2PFZ45VFYMEVMKI4TSAC 4RRUNGCGJO7KZISXL62B3NXZ354DH3VHSI7TDTIHGH5NDEJHHLQQC FSD7GIK3YLZXWLEH37BU6KV3IUCFGXPQL6IZ7H65YWNRBEKDBX5AC 3YK4G4IQBXW63HPGU5WRTV6L2FCMKAK4DOTCHFK2FNSB5B3Y3PVQC TAHSTXR7ROOMDFUSBUU4ZAIEWQLAS5CIRCTARLD4Q2BGNLSL7E5QC JJULXW764V5C2HJKZNWQAEWB6QM5YZADD7ZCE35LYTBFEM6PMYCAC 25CH7HH4LKXFIZ75YNMXS3TSXO6O27DYSOPLOD45K4OCNFWLS4LQC XHNJ2W4AQHIF32P2ENIMMDLWAIFWP442KJIZC6RKS4HBJNZIHHBAC MJWFTUS66PTCNEYXEJA3CUJFXNWXIKDD6H3V24PW7HK64NSVOFSAC TGJZXTUIAKCFZQJ54ZQEBGFBVZSJCAX6AWDRSH3TP7UJRLGUM5SAC CGYTZT5QWIEGYKUOLOK7MFXSLJKLYRZONER5ZCDZO5XYWSLG475QC UZ6N6HOUPGVSPC5NQROEEDWMEGJA5XUWUY2AKH5QG65AZ25PVXDAC 2OWVXCERDC37YX5JYHO32TJYXMVELRURTOLE24IL5VRUV5KDK37QC OMS37BKMR5OENBJCRQATYIKPH7SHFIAQNSN2FED3PGM52ZQQE27QC UH3CJQMQ3NPICXD34NTCTUZJWOCEF4P5XEGXFLLNDDFLZK7QPUBQC ILOED4VB4I6VPAUTR75ZWX6MXDYXB5DO2EDK2UH67O3HNKWV23RQC SDLKLUNFGVKDS55DDJZCBAVIB7NL3RRYPTACAY65SCUQKV6APFSAC 6U42DGWHCNLYUJMIL7S4RJ65JTRDMH4Z2ZAU3NZLPZZHPDLM4FIAC WT66JDIRTLLP37SHTV4GI3V64JFJ4D25LNRLGCHFG6CLEFKJ3QGQC DMG73XDQHY2X2PHKWIY56XKD3O4NPGZKKIO6GX3IV2LLRVXPGKYQC 75M6AVUSS3G5EJECJJRB67V5UYDOIV26FZNB2FFCMBZ33EK7FVIQC AEBHDL56FPVPVSRWJULNC2KA4HKT7W42OZYJWJVBXTLDTJJ3DWIAC GO6IEYK2NTKW2EXK4GVW664G5BF2GKJVI5AY4P56CB643PLTYK3AC X3RDT655FEYO6XEVPIUAPEPJZAFE55KZBH2AZOLK3NGHINMVIGFQC XVFTIQ7MSVKQDMQ2HT3IY6FJOZFK4H6OFGTUAID5VGCA5BGVXYPAC 2O3C3MTT2ZBYIFGPJ4MF5R4AXBYUHOEN62KAUWFWF6JWHIIVLRNQC C5U3HSOOQ7BKXKXIDS7MLVXUKDTHAWJ5NXNX6YDXTM3GWY5UWX4QC AJJ6D6JRV6ZAZOAUHYUM2IQG42V6PBALOD4KEMNKSVVAOJXAUCPQC GZMPIDNMBXZ4B2ZWKREHBPAVN53J6WRVY5W5KY52KEBHKU6IW4IQC AMFTO4UE74UYQBU3R2EYUU6BJ7SC4O4NOAFICRTLMT3MIFRQ6AKAC NG53L53MSFQZAIVKHG54IEMXNJ33AYVPF2OZM4MMJFDKEJCGPBSAC KCHX2F3JFEWOZT3WMJVZAAQUU2QSZ5Q7RDCD7WUJ7VE65J52JFUQC 3ZWALZFSTSIVYXY4BAY6ANGINTDACZC6RSSJTEMQSTSUIE66YOBQC RC6L3CIBLJEH4GWRFD7UQNGI6PZT74FRUVOYHSAN2XCC74NZUASQC S34LKQDIQJLIWVIPASOJBBZ6ZCXDHP5KPS7TRBZJSCDRVNCLK6UAC B7DNCNY7SXL5WAW5B3XZP5KIQSBWOJ3N2YW46WOUQKTRBRRZ7YOQC CVC5FFFLGVRR3KPYDNB6RF4FNACV3LI3HPSR4MCUNZ4C3FSQYBDAC 45EMD3KLQPMERNMIKU5G76H6556XOMIW352TSBP7VLWJX2YYGS7AC HQTS3VQ6PNUZKHNVEWMML7JNAAAKL4DSW3KFSRCCSLGYTDHZFCCAC U3KGUJJQWQORJIIFH3ADVNIEEX5HOX6KEOXO7DJSL7L3Z6GG3PAQC 6GJYM7D3VKAKCIHAOEZW5XPE7KIJZXJCYZYMHVJAECV5QZWGQAUAC IHIJSWVOONSTA2WCHKW3YKBLETUQECFVBVLMET5SGQZ4C6U3GCUQC JBZ7NU4BB5PGQWCOSZHD5OQUHQIVOD4XGJLSJQ7BUGQEGPRTVGZQC 77H4BWWPPGLM3PLZH4QTAJRXIZTSDVNCOKZE223I437FN2UJ34RQC QXD3HX6QQ37PW6HVKIIKGFLO2ACROLUGKK66KFX7ED6SO4FDXB2AC YXWZYOBUFR4EHBSKXCFGZNK7NIM7IPE2GMZYIXEJTUPDDC3BIEDAC Q3B3UVMYEVC4YJUPYVSNTR4DJH4E6J4JJDHZNT5LNOCHCPPMEMXAC 7HA2754QW3SBCAJ5K6KUXNXXXIZB5BIBCFPLXADCXHH6EREKXHSAC 7NDXS36TE7QVXTXJWMYSVG5UHCCLPIO4VL6NXFGTDK3ZNKE3A2IAC 5HF63O5IRRERI2V3SZEDHUNFHUF2B4RSVWQR6C6DR5JF5UYSROWAC TOOHYAX73C5KPSWGHPCBWCUN62WMMO3BI5CWEEMGV3WBFZ5RIH5AC W54GZBNFKPOF6DTOVK73PVASTQI5DXG42WQ6CXFDPXHFZOHUVVSQC 6HQB2N6N75R2RGKJFWRUN7WAC2PNGWQFXTII5DTRLTHZ2BOTMTVAC NK2TBKWOQBD2ZRGAO4Z3HMZPIN7UX3HNUS2YHEIJUUINUTRMPODQC HNX5L5QUZWBQTOBEVKJTAMRX5NOCK7CVBIKMCLYEJLVJNCCUCXUAC LS5XCCGKQHSJQGWLWLGTP2F5OYWK4ND5AQQAGRN6H2HVBSXNCCZAC G3UKWY6JNG2ZQO6R2UTAAIQ3ECJIGEKEHTKOJNL5EN4YBC7U44KQC HIPFIMUOA7DFOFV3DQ55YZJVGNU2GNDYFUCB4MRPUR5DTYDO5YMAC MSQI3TH6T62JAXQGLL52QZCWAMC372TGB6ZNNRDGUGMJKBNNV2VAC DMLFJIPOE4ZXUFQ25VVEZCMURP2UPJBBWDGQS3DPQVUNVBBQ4GDQC H3EEUJYQCVEXQSDP62GBIC47T4BKBAC4Z65HRKGJK2M5MFXZWYOAC 542UIZKI65UDRNEMGFFDBWYD5XC7AYLTZ3JZQRR2GHYJALD3YY6QC 547JREUJXTZNYVGHNNAET5F5O5JYYGNTDQB6ABZNT7YX5EY64OHAC 627CM2ZOKVBMPVPBYGWBWWPT2FBMVRRH2VDGPT6Z5XCVJ5R4YQWQC V26TVLNNESUAUJY24SEXIWRQB7A4JJ6TVQU3JVZV54IEEKCB3WOQC SSQP7MS6LZYY73QEF66EYNNQJJSB6TVLLWXLWL7JJAYBLXCEY2XAC LDBTCT5WIPLJPZWXS2RUQ26QKISCUUTLO77M464WOE6VSYSNPKYAC PSCYVKJ7DGXAL3V5U4O6AJTRV6Q3N3SHQWAZ73VIPRTE4W64F2XAC Y66ZAXN24E3HLIBOSW4OXUTQ4X4PRGNJII4KVDQH4GQJVA6GO3NAC 45FTVJJ5FMXBXQ2GVUZVJZU6Y6NUYG2JZIHWVMONA7QYYCZQSM2QC GQL5SIGBHLU3FMCE54XVGLRY5AZHRM6DUEB722REA2DPLGJSN6EQC NXLDJFG7FPL7ZADEBSY3DLDIBLZ7I4JV3NPRGFQYPF25BXWIK6CQC SOGYI2OBNZHL6HZN3ZJR5ITQHTYITILKR4D4EZPKBO23UYZW3JQAC EJRKMYKMOYRQXTWGFTMADEWIGWLMWHMUDA73AUT7HO5OBK2GUQEAC NO2TVO6BFGXCJWEWQVJJU7TYUPAZS5ESQAOUUKZOIU52I2AFX6FQC 442VGKMARB6LTQUEBIB5P447EI34BRJL6JALZKXLWPDHWCM6KKCQC 2G55UEHQ7554OPNSZVTUCZTWSHIFKGT56QEGSYFKCTX547I4AL3AC UOW2X5KTUHYCM73SWNOSJPHUKWVLF3OJTNSISSSENEURBX2XWHVQC QKGDOYIYKE6B36ION5O2DRW65DWWPZMYNWJVH7LJJ7FPGGM2MYAQC NJDPIHOREOTAZJXOMZA5QA4TBADDWLFZ25NVAIFDQ7BUBVUWCEEAC T4IH76FA5TWHFOZUJFHLQXQJENJHWTUZZP4EGNA7D4GTZY7D4ZKAC K5V7BNN65MEQBOOOA5XRJO4WJ7RP6TDOTQ7DSTICECW4MM64QRAQC GZ4FB5VKL4C22KK3GSKQPLJYMRGLFXUDCOBNEBC2OKK6KVZL3OSQC SVY2PTCLXR3KNPQAWXVXTTGCC5DR334HOAKHYO3VDDRWM2BWMALAC ZCRK2DJ5VKECRQXZTWT4NUDL2VT5ZHUK7NT6NQPLRJ56TDX5PJSAC QUHEENPY2PYTEUS7C4R3CKE4FHSHGR2BIXB6EW676ESX3727PA3AC AVCMVFA3MKCXHO6H44UK5KJNIHTGQV7UA7GYXM26VI6TXXU5ZN6QC KEANRIMF5CGFVZ2XJYNFPOAKLXOSOJUOVA73IWBWOG576265ERHAC NVSFIV2ZKP44XHCSCXG6OZVGL67OIFINC34J2EMKTA4KULCERUEAC VJDLV4PF2ZJ46NERO4LZUX5JE2CD5XBOBQCYYPTFWTHLUEYDUOYAC L57WEZMVIHTFRLWVIPWOIOWHCF2I53TVUVYJ2V6IZ64R56FVTZZAC Y4NA3JSN63RLATF4NNBPSR5CWF5Z7UEMWCGVX4B6NOAR47CGM4GQC YP2ADVIVFDLAU4NYFG7BTHV6BMH7VPKUYQ6WVQF3Z725L3DSX7HAC 44LY6TB272RWWFLON2XOUIXWFPUXM5OMX6KLX66HH37BNURVT4DQC ZBHENBGH5RNIC4L2NP45RJWYB3256NAM2JU2E3CD2RF6FEV4Z4FAC 4SUUJM2DQUEWHDG3UKJUDZABLHFVF2CFUX5GVAWKT7BBBGR2ISTQC TUF6IG4NNHW5YD5AVRYE7GILPSFJLUV6442F5LSP436MFEIIGVUAC WDQ3ST3BQ7BMW2IXQMSJVRG7GK2EG444JLKII24FB7IJ5YF5KT5QC ASLW3Z5PAVZSWJEMMMVZT226P44EKSAD47QS72JIFJESAI3RPN3AC EOMCPVNQLX3IMLC46EAO67DPBH5KEG2FQTPBLGU62HIRWA3UQ7XQC 7KWDC7XFNMBLSUO2HISIROBINZBX5T67LJEEXTAORXW2YZ7VWFGAC EGV2HM7SD7UQSWJGLR65NQJTUBAJ7WHLM67FMH4UFP7JRSFKREPAC P5TRGRH7XMQSPCZKM5IEEO34TY6WMLGHHX7BU6Y453JFRXLUR2VQC 7AMQN7MITMXBNVDAK5VOXTQ4TZIAOD6ZLOFJG7GQMBTY23Y2BKSAC HAI4YDKI72OBDT5KMMVCO3DOU765OPWCU7GTRKTALFNSDOI4R2LAC PES2QAPAJTLHZORDXNJWKK4VWRDCGXMOVVFI2TQALCPB5JUPHCVQC JM7UAK777RAVDAVLQLEOBRTGNW2B47S5G55XITJXO243IUNZHVYQC LUH6GAJODIQXNPBEHMSUTKH3KA3DYVRCKZ6GJJ4HHNHOIMMUEP6QC ZLQAAP55CJ77XIJN3DZVPT4GTTVLIBFJLIJJKI6L5UBSHX7VUK6AC 7KVPF74ACO6Q5FXS2YBBJTJT4Y4YN2M3ZNIPXFI3QSQNGNTHD7AAC UEI5JAVCMN7Y2SACTEZPZSNFJWOJTC55G24Q6LKQCT4XNDH5ZQIAC B62ICMDTN5V7R7RBL4JALFVKEMVOOVLRSJASRNYS6CGFWBEEF5JQC OAQEGSRMAOE4UHILW4LSDKERKTPOJPGPJQ3R2FB5QFWFB764UGHQC AREBCIU2RU2RNHBWD4GARWEBKSL7HDFGDLII22H56OJO2AQUOMLQC JCWJWGMQIKQGSSFJUQRKNIWW3HBOJSHYDTOPPE5BWOJTIJTDYUTAC XPMFRLTXS5LA4TROB43JS7NZ4FB2JAQBZZMZWS7SHPMU4SKUIYTQC KKEPQAZMWQFWPQ4P4KT5PWG2YFPG7H4JHL5K7USVHQ3Y6L4NWURQC LA2LFZAVBUB2BUK7Q3P3B4YQ5PIYHXAAKTN6KAZY5HTZ3QITUJ5AC JJHOTW7LDUJ6DLUG2DTFWASCAFPGD2WBW7MHBSECJZU7PTJYWQDQC 247OW5JFN34ZV3GRVHRE25AXLLISUBPOX5YRGUE64BCM2V7QNEHAC AUXVWXWIFSTWFA6VZXN2FMG7FQEKRZVV6MD32VQQ7J2RKCXHAVGAC GSJA56E3ORVIBCBA6T6WU2HE4DCLJ6NZPW76O7L54N4CYPKLJOWQC S5CIJLSFFXV445G6CH2AQ3YDU3P7RLSIHWV7GBJ4MZ4C26BWCY6AC 7YUGK5Q64KG5O7GJGTUBRRLHAHBCJ5YOE23YUPT6UBKUSB67CYAQC LFBNFE3PZBXTR2ROPKYPARUWLJAYWAKGTS7VBWADZWVVSJ5CLX6AC PHBACPMH3F34GODHVDKNCMXWU373RJQGVTDLBFCCDLLWDXVYOLTAC RDZUMV3A5TREQHLPPJWDWVXBNIOWC3CQJJ35TYFBQQVQNTU7SPXQC GT7BSR54BVJKHUCLEBTELGBMNBFFDQW52EVC4XKVEMUVG2UGZMDAC 3JMYZAITZNV5TPYISUMMYGJRYKFDZP34YAG72IB27BISVSZU76VQC HWTL2S7OVOJRJAAN66ZTT26HJDAOIW6RKAG5NFMNZJU63CTU2U5AC 4UXFU3FZOCBSLDQ4S7MJKAE2H7VUHCNRDQMIY6NJ3PHYXWNGISDQC BRGAZR5AXWC2IALBVXO5SB354IRQEIRHSK55RZPGFI4AGIOD4LUQC RGY2525RQH7SSGM6ZVI7CZL4WMNFZK2WRABOSIWRKQYYOU2RWN4QC JDZCDMUCQ7VENYVLB62KQWUIRGABID37OKATOKCBUPCDL7W75NPAC GB6EXRIQHNKDMACOLGFQFPQVIKAGO5ETYHCU4TI2HLZTXFENCDXQC IGN3Q5YCLHXKWFZQRSRABCHW2JFW5TFVU7TM5EXE2EW7PDBBSQWAC MT73EUNHNCLN5AQW6TT2PSM26PJCFQL5SF53NUYQ2T27UHATQNUAC CIAIASCBKKV7VMYBL2CIFAYGFQTB6GIME4FSQGZNQGXO7FXQTA5AC SWE3F3BLKHYMJEJLXNFH3MR2E6VDEYXJ6DL7QLPP47BJEKEUCAMAC 57E4T664CXRFPVW2BZBYI33UIHFS4PSEZURZYPSYSZK5DRLJJ5CQC W6EWE6VIRP6OTSSTG3ZZEBN72OIKK6D3AEIP3OWX3HMJBA52SZSAC SRYIUTTRZYQDYPLLXYKEHMYWC4EGBYPOT65M2HZEIGFG6SDMV7SQC FMSYEPHQUC3RGEOEJ77OZ43JTIFITY56SOOKYPU4CKAVB4VP65FAC C6E4OROPXFOSAVGLTJE2MYHOGC6QXP4JU275LGBHAYASP27KCY3AC QEEJFAETO6B2J4IWDIDCJ5UNIFNNHHG22IWF2CUJRTJJBNE47CWQC GUU3TNB4MKZDZWA3LL32GK2LQONRRSX3M5B4UBMZWU7GDJT54A3QC TBJCQGMVKL3X62362MFETVIGEVJXIOGG5EZJLZOKVAMO3ZJHE7UQC WL3O4GOFGFEDGJ74LVMYJEIRSSZ3ZPIPY5FWAZJED3FPCTUV6NQQC L7IUC3ZM63VFJGYX3PHH5HO2BI6VQ46MBPWMCIX25K2OFRYXTJ4AC YNHLI6CSX6FXVNQDDA5PRBIQAR2L37KIBE5TDHNQ2ZCAM4KGBJXAC DK362IHKSDADMUPD35NOTKM4WESQM37KG2PNOJRV2FGELDWULYPQC 4OV4JZ6NWQ2ZK4LEWCUWALLB3BVANJJ2EMLHC5LJLA5WYSP25OIQC 3KRKUK3HCBBZWS5MXFAMM4R5PGWWTSURBSFXEEZPRRCFAZ5EZTCAC NIETE75N7WEVCF7CVQQ4ARUIRI36RHUD4JD4WPWRM4IZUVHKT4JQC FCEJKZUR27U2PIFOPDQFGB4YFAGIBIGYGY2N25IJBCGMFRDFHSVAC HYXNSIBI3LPNH7VATDEUXYEONKKT3VPDTVDW43ZSTXISQY5DYH7AC OMTU7OMVWDVAGJCQGQJDZ3YU252T6IM2LPS2ZMPWB7MIXCJK62AQC POP6UTTHSJGDU5NU7ENQJOZVFUHYM63HJ6HLPXDDLK7XFIP4XEIQC C7ZG3QMG2CDCRQFCCC5BAY7Q7EQ2I634BXGVOOTMSR7EYBARJ6MAC DKRSOHZXL6EPSLKOKHF7GJXSZEJVY7CXGACSHWLM5B5FTRETWWCAC HGVGIN7AM24XZJA32PK45TU663TFL3OZ2C4DAGJXBBMYXHFNFKMAC ZJ35GZK55U4IYTYDAVXTAMBNG5YF3LIGYD7OVTQH3UFA56I7JE5AC JDBTF7NKDHWDTAX5LRBQ75A5JBNELFITVYQ6KOGW5XM2SGW33STQC PYS7ZCTOPYGLE6YQ6BJKHV7UI43U7GFVVFVSXBQAYMG5AIJL5VDQC YF6CE2VBFK6K4V34PKBVYVQUTJRDDDCF2M5RMUGW6V6N2M4SUPLAC 4SWAT5KCKQV527NKELAXFQ5XA4Q5HONQXD4VBXMUZNPVPQKPCPNAC SO6OPFUUGKUK24KOXKAPNXR334J7NG76F3Y7ZGC6H3XYSGWTWXWAC NFJKJYTT6CBLOKLGT6HIVIDEPWXMGXJV5AAL37SBZTG2HSFMJMKQC 5IDWJF6VEZYCN64IW2XQYR42VEFAB6BR4WE4RNWXZ35JFDOZA77QC OJXLFQMDM4XF2WSDVMAC3FXG5HJQB3QAQXLZM35RA34YYLTAP2HQC KJO5N6UIPKQ6TZNNOWZEHUAWZNUW7CAHLIW2ARX47K4SIE3N5LYAC SJXOZ6J66G3S5VYGIZ3YHEUCKUF5554YEFUYLVBH7X4ALYSXKTGQC HSDVFA7GIQ3JG6XK3OLW5UI63VZSBZUZ4VMTKL3XFBJXILYF67RQC SYNARO4WXXFW5D6XQYFPSNS23LK44OPQPKPUD4PNL3AWKQWGA5WQC 67WUNL6XO77CNOMQEZ6BMV4LL2VTCMUBG57DQMCHNEMPCGYXLO3QC 7MDPXLMPCFLZS6CLZBN4FN4RDNBW4Z6Q2NNPWD2N3LOW5LQISM3AC JE3SMK7MKFSSNBOPA5RITTF5WOQSSAGUPUO3C2QHFOHA77IPAD3AC 2UUCC7V3WQ5KBHJS4MTKZ5OIELYJHSTUVRPYGPWIQ5JS6D7YIK4AC 3V52MSSK7QX7FWLLUW63DTWCBAJEK674EFZLKP45FLZ5KZKVARHAC ND3T5LCZATC63EVQ6SLI7XXMSUL7XICJDNLH3UCYUDEFWTA3N5MQC O5DY2ABCK6UTDJUUQULQERVXLV35IP74NTLYXNMKXCH6UFGYLKWQC RDLF4VIJMMHHL2OCQEXOK6HNCS5QX3FZF3S4IHPY3OZUKC2FZ24AC I2OEVGXBBJ3MFLF7GCYA73LMKUFXMZ72YQER66VGJ4HJM5WK5ZIAC AUFEDZ4RUY32ZAXOPTZ5OX6X6GUUYJHNDEFZD4GHUBBAFOQCVPWQC AROBKQGZEY7IBWUQ6XNGEJQJMI3XB7BXLMX5PHU3L6DWIATCH7EAC DH3YTI6VVI727SQXO4CXSDCSBG2UN3UAWLFULBGRLBVH22ACRXIAC MDAJYB6STTZPNHRQ2X66MMMSONMKXTESLHJSFPGN7H3D3TOVBAVAC 37HLRNCJQGZRXC7YRIGHPRALDBB5QUHVKFSCOWINHQH5ZPIIG6BAC RZP5Z6JM74GVX2M6L2JOFRJ5VT2XGFHBNRDESVHSKF66PQKIW32QC 226KYCTMLIXUKD734QATY3JKWUUKC5Q3O75JT5EWIX6BKR7ANZSAC PNIGZ2ABVEGC6DN6PMKO6Z4M2SQ5EB7VZQT33YMEAUPEZVVEDJZQC UB67ZWGT7FOPKZ7SO5PAO3V4PUBPWPWXKQIQIUABNB533XP4JUMQC U2AV5FJ7UR6QMGMSZBW6MMLBZHWTANK46QOBP42PYHMAXJCBMRBQC OIT7AR4IL2ZH4ISWXG3Y7Y24ICNQ5WSUFJLSUIYD7P5VGYU5BJLQC QDBILCQHREAKSVXBJJGE2EPNR4ATTQWUZMV7BLJYZWWUI737TSKQC UDPTU4OERZ3DTU3KVJZWF2R22QEKLZTSBAWFHBIM46A6T3UH2BJAC MPQIZUHUAHOF2CKNTLSYCGMR7FIC3EPA2RHZIY6JOQKAS6H6YY4AC 2AZDBJ4WJ3RB2XPEQMY37YZTHYUB36D36OC2U75LLD36FRJWOB7QC ERTQJ5ZXDBRGKC5N3GZ6U4MFFK5HB6737FVLVD4GSMGTIFCSJJJQC 4DEFHDNO2GUBYL4EGYEAR2IP3KBDXRU7UL7L4P7HEZY2UNR6IYJAC 4ZAYR6K7SNJ45QYS5KLZOJ2T7OKYL4M2RY5UIIMOWRQGZLTME6UQC IGBJ3ZY5G73GTHPRNWKC6XMQDINRGCTIXKBHTEZ7JLUJS6H4JRBAC 25EF5X4H3LURXFZ35ZGYGUB6ND7NFQVH4M2XX2SI33I4XRGYG5HAC P2OYYNPHIBGOLT4CRLNTTIXDN34EU2QCMFQJNLAMUAHQXZTEDPXQC WXZQJUZXMYS7R6ORNB7DWE5KEUXT262GXWMRPOJYYB4I3BFGYLLAC MI7CWKRDXHAU7PIHLXXOSFBULRGT2OOMIMOSQLMVYOUVGABIVXGAC HW7XKO7HRAUQVDVVKG5GA7PYAEL5J5GKVDPT2CKAD3FLERAY5HLAC KC4WE63EQMVI6QBPDO3EAEPMFLAOS7H5WUAFL7JPRIE3V7CR333AC DTJNZWOY2ODLIKWXJXEXOABVO2NDU7DM4UZ3NVLHXPQORVNFPTJQC RHRAOBKSM35XB4EELW33PZ6ZJ25Z7R5CVCJVBEEAKCBQR7YK2BBAC 3NFVCXRVGHN2CHLLWFZES5RBS4R2BCDS4EEQNSDCFYIFQWQK7MUQC BIZDHHK5LIO57S5AKHEPJFLWV5DAFKZIKYBGOUNGICSWTX7DCXKAC RC5SAVDRSD6X75HG3SEEFC444LXYMHASQFLOJMH6D6VTYHBQAJEQC SS6MUIJYTGIVBYU356Z563QJWLJ47QNHSJWS7GJTS7EATZH2ESJQC WZTIVJJVK7CAHU5D2IYPH7TWGTLBBYPJZJYPGWKCDGM3JQ6Z6VKAC BWHU47MJ7KAVKMKMRBVYLOHUCASSNVCGPC3SPMNBAC7DLI6XX2YQC JI4NDSOXGGZ7QHXXFB3ZTHAKHABXYBZXPDGLUFV5SKYEOL5FT7JQC V2LAHZJVKBRUAKHRXZZTHOAAHKHUS4CWWZICYEJHTDI6IA7X4LUQC B6X2JQ6LF5EEDKFOXKX4RQYH6GW3LXB5E4WTIUVHSXTO4TIZA24QC VKCRXZQKBCAW4IYLDKA2GUUQQ6PG4ZRBVONFMOPH6XNF56GP2VXQC TN2D3PHU7VSGUND2BDIC2F4U6O2HFSV3JXLF7HMYYMY7GZXM6IFAC GUXTGUEMZYBRGV5QUAQSJHG3AOIQDWWCDIMOX4LASFJAZVGL2WQAC YMUDD3TCTXZ3U4W3AMKNCPO2K5VTOTSXSV34T36NIWMVDJXWA6TAC CKUQML2VZN6MF7U72JIFOU4LELG4H2E4NRZDOZYDGCWNPHFLOTEQC CQ24AVAI6SW3AHTIDMLPSTRRBEU6FHRF5I5FD6G5QIYE6PO4BQMQC RT4UZQXFGZCMWEP553GYPQKMYIKQHRJO7EZ73N76HJI45AW5O3DQC UIHAXYA56MLOLDBWRWPYDTIPIKGTP4E2RGGFHJUIUF57EIUPFXJQC 72CQFK27NR37P2WQ32U4PEXXKMRIO7JEMJN2ZCPNVPZMT7UPFJJAC F2ZJ55CL3T66DFM34BQWCJNHIT4XJFCGTWTA5KESV6NHWFLTGUYAC R22TTMI6WXWULC7ODKFF3QCB7MOTETQQ6IR4BUCUPOCQKQNCTT5AC TTHOIZMSG2GWUO5IQWOPYK5V5DS6HIPD7ULFI6P6E7LQ6MMKPMHAC 7Y5HSDFKA5TPLS2TWTRFMQVX6UXUDHXU5MUMXQSDFAIY4THQ3BIQC CEK6M777MI5JVDC3KHE3JD3FETVSJ4VN6DGATBI5P3O6P5XHY4DAC NWUWP5QCMJ7ZZMLCVB74PW7HDEFB6ICEQHNDHCGG7UWDQNNLGVMQC ZHFUXYUHS6V47WK2NRH7OU6RX77NRKTXOZC3MND2GG7PEEWSGFTAC 5ASC3STDYCNLZFEBN6UTMUCGDETHBR2OCBZCF5VIAZ5RRWLOTDYQC GACH6PWPGGUBEE7PFEPQMOZKSR7HTQGL2WLGF2AQPJD3FCCSKZNQC EB33TUEEJFHMEO6YHEXSYX3MBXHNPEFNMZL2VA75GOGKY6POSF2AC 6LT6USGJOTDMRJGXLAN2NSZXK2GKWEXDKKUV6SVV7ZC6WI6EKMDQC XPMC3YAOVJXYI5FAXLIHOCHVJLI24HKAF2GH7HG7FTQI5HBU4GWAC 475LL4U4ND6PTNV4XKC7WQAOJC7RF2VCCVX3DRILP2PKIBFYWE6QC YLWMDMNLJOERFAGH5RIFTRWLGCEOWAD4GIWUIXKYA7EE3EWHCVAQC OK6A6PMHOYIQIPXK32AKOH55QRFWQA43BJWHUOCZA2VIJ6NROHMQC S2LIBA2CLTZ6ZU66AUZ2CCNLCDOBSGWQGTZ6HFAFP2XSWAALGLSQC UAJN2CFA2QHYDHW2UFAVPPHDQFCD54RKM6V2UC4AMEDJUBBLNWIQC SG76BPJKTQGDFNP5QFMAVR6H72FMMAYCECVGSWWSCLMAVQX7E3FQC W74555HMPXUQ72AGKBXC5P3STMMX5DZAW6ZESUDLNVJBCAG43PLAC Y2NYY7HWFZ2LQDK3ACSLGS37F2J2IJ5LRGCIMZYXLEOSVPD3A4DAC T7CUIVICB74342RA32BR37T36FOX4RBSQIB5PNOHTGTGUYGDKSTQC EFWEYIB2R3DPD3JWIPU6LS6SFLPMYN7J7X4GBZR7DJWKHJ3UELSAC T2AYVN57EFJQLFUFLAZDXKDAFDGTDLQIEQWQZNYFWJZBYSTYH4QQC OSGS3PH2L5CBTDVZCZS6OCFQNA4A7RMEXBYJQB7DDZBYYJW7QSSAC X5WLJCJVW55SXZVP7IKP7ADCJIGNKN4PKAXFECVR6TNK7XSMZR7QC F7Q5PX44SLPANIZXCY67TG2W5JTRVJMHGQW54VJLGB4XRH7R6JBQC EDGP3KBYHBZ62J6RSGWDMWG4AARB2D3ULKELML5H3S4EDWTWUD7QC I5N4EIR6SCLLRGKRBUKW5FKUVYK62EA5DOWIAS5XFIHZQKMCXWBAC KAOE5HB3THUKVGFZRO5EZESHEB3Q34WUO5DFMLWIKOBF47LZTIYAC RISMOCQM6BKK4XSIRKYLOBB2UPDYJNDAL6OGIIR5GGNZQAK5YSZAC YKVVFNKT2M5WG2KBURRTOJG23BJVI6WUBP5JOGYPHQBS4RNGFGWQC LH4OYDEWEON5QNUCM74R7MNBJDP7O4XRETY74ZMYSXUXYQV427PAC EHP6PYCIPYQ3KF4JFGBTZXEUQHN3FVAH4NUWEOWDDNKGPYVOTOJQC UVGFF3QPZKZNMWFDDANQRBTVOROTA4TZFXGYDPV4GQXZKHZY2EXAC ZGUJWUFJ4NFFJ6PGXLFGQWCWBCZHPWGWI44NJHJEVPRG5L36PADQC PFEJ4LMDNEKLMGRCMWQ7EIRVU4JMYGICI4G7X4WVWOROVXQCBZ7QC SXUKGEXMGRRN6UO2GJW4HSVU5TSUNUHIHBMMF7CAG7QMLKZYWTKQC FWLLPRIZDBJVQ336TPOLYAFT6WYGAFC52OFIOTRN2YQPFZ3PQVRQC 5FMXUX2ZFIF6NQZCS54W7ZOCVSH7XR6UIMQ5FW2UZLEN4EWP5PSAC SPWOUV6ZNHLBSAX455ACJDBEJYVFHGO4H76L4NPAE5DF6BEAK34QC QQYQ4O4WRYDPIYYWPCUMFPPS4NUXONB2UVXCT7XFIHSVSSPXURXAC RXYHWJIDGC2MATMRRJWUQDPLABFDJFA32N5I7WYW7IEHCNSSNZAQC SCXDRLT2W436HM4WX4UZRC5M3XNSA65V7XR7AGHEOTSKBWEHUREAC QMN4QZWL4LOQMJ7A56O5WXH6J5TBLNA63XWIL34DNU7J3FVQI2UQC EMOBSWJHHB4V6WVMZL7JCF2V3KZN454Z6NS346OKFPMBNO24EJDQC GDTMDVSG3IGKIEWC5MGJJHRRMKMJY7H2AHBRUXTJ4ADI4RPXL5WQC 4GAIJ3CGARXLDO3NG2MWPNCRCPDSZWFAMXFKMWXWVMM6HYWOPVWAC IO5CHPT4QBYSFAPSZGGJAYMN33RDAQKGLVW6OKK25HVIEEQEI4IQC BX6P2BQYNZH2FM4ADLPULHK5FCWEAVXFEUYNHYLCUTSQCOWGNWAQC 2E4RV454MTTCKYLKMSHEEAFPNAFVUXXPBZV3XP6V7QMF4BBWE7TAC NUYXKJP5YXHRDUQW5QW7UC3D5U3VPANIOZAOHFCPWMSRYGMA3GCAC WQLOHSNCA3VOMDJF6IINJYKSYVYZEBPJJWBB33QSNE4RP5HEXPMAC GXXYPBFEWKRZQ6OBGYNS2EXZN52NGNV3UU3WM6S5R74CMJBAKGTAC 6TEISZD7HYSSL24EOKIBNURU66KGSQX7B7SNAHBP4DQSAOTGH2MQC 5FJOO7TPXXTY66X4O242AWSMYNDLG2NI2NKSHDELLDIMAOE5OBTAC INWKDE6QMV7PUWMZ65IZTUF4WB2G2OR2Q2NPTNID4Y3NVD7JWN3AC 3OFG2YD2UOHC6UA7H7LWKOWCNFFSTDOXAA6L3KC335OF5RV3YOYQC A2SAU7YL5ZS4TODRUTKLI4W4RZOMZSSLBEEXOKPKQKP5SEWU7QOQC PQ3SLWFD5CF33ZHBG2V7YJEKAL6HTSDYOV25OKUTBCW2QF7TL4AAC SFWCESFCUEVKJ6ZQQX3Y5YTIQD5BC6MCVSLVZFRGRTU46BFLKKWAC REOC4SN5SYUZ6IDLV6I6XZ4MPKE36VAJXLCZ2SXYYZB3RECLXSLQC J6APXOT4QOGQFONWB7G546VTVF6QG42HVOROMHF7YBDJPR4K26OAC RBAGQ2PB7V5YAM5KSHSZR2E3MLKDSRVM5XYGI2TIXP5QMVBOQHDQC VQD5BW56OTUNPILMCASXZ6YZ3OQGXKQ7CSNDMNZUX72AQZXKOE3QC ZJSJGWYEOMUS4VK7VWFVLKW2E42X7KPFLK6HAA5LN3URQWISQULQC CG4TL4AKSN4J7CMATZFJ5N7PSDCQXLS3QYX7PZ3K67KMMBT675OQC VMATCICB4F6UPNDTZ4AA6XT6JD33HG5T5Z33GLPPYEGI5HIJ6UBQC IGKVCDUXGUOCEDVHXKOXNVMN3I3SFBRXG2G3WPKZBVL7USXSC47QC XJBNF2N35THJC2KYGCMPLC3CDCJP25CEDKHUI3P55V6H5YWXBUKAC 3RNRFLMD2X4RUFTDVITLXAP377YB6F6YMQLL3DAXSUZDZBTWSLRQC 4CHQ6JHHITQSW4FJPGP3LFHIZUXLUMMUGH4TRUNN4FU2PXLNVQFQC 5V47S4NNTHWTSAHV3YLO2VGH7JTUIYJ3GBPDN5ZM4UQALT2ZEXDQC DS2GZKISEP2DM2VU6EJ525Q7W3WVOKJXG5PY2OY4VNFCLBHVVOTAC NCRXRQNCAMQQOZCL7TBMKGM6TOGDAHR3GRXAVVB26FLGE2KUZC2QC OCAXB5FMLNTM6ZOSWRFWBMRFFXHTLSJXHXR2AT6Q6MZN5RX5V2QAC TVC7W7C2XKBQSD2IJFMWFVGXZAOD4EUOW43NAQTOF5KFMAUOJABQC IXOB6KSQY3CWTXS3LLNDWLVMNK6CV2MCXJAR5CJLNNX4ZOLAMV6QC 3HGELZU7NELOQ635HZO6IJIYLBSNCJ5VPH46IE22KA3OSLEFK7AQC UIRWVLX5LDNWURTZOG7EFLXE5OOEL4XBPSLSUHUQSKHC4A7WCVLQC GSFCXJDE6XSHSN2OL5WQ2MCYMPH3K2SRXRTUF62CXCZIBRRJG7BQC GGEB64C3QQ5PPS7GOFXULDUCRT2NZL2PMIE5UDDUJTUTLLPTDU7QC R3ZUGT5VJ2DG5NFPG4RBWDWTULDE7L4REYSGVPHJPDXFG6OBIXYAC QS3ZRS3E6KL3YJHPKYEWCWJYRBJSXD5OOYF6Y25HZVECGPJRDB5QC E5DMZFW6WCFAKTKKOQPYTQXZ2CGLWMVH64LRXDUI2UIG4VYUHIVQC RSIUBEQUGNU4LO6KH4PKVROWQS33DAKSY4XFVGN7T3CEKSXABCSAC LOEVXFCKSHE3TCQSUSHOIHHVDJT3RFLE6U3VDI6JXAQTQI5KCJ4AC D7SLVLRNCYCBDYYRANHDG3JYEF25CFCSUY5FMF5KXVD5D4UZSDDAC MFONX2CQ4V7HA5NSD6P5NDDBXYDSKIOCYUKRZXJ4ZER2OKJWT2HQC PM65H4V4GNPVIJFUQW57DC3VDB7TRUUNXKVZONQKEFZSK3AXX5GQC LTX72QGIPNUGWQN5ULPOMFCOPZTK7472DQY4AYX5WM3WHSUVXI5QC XL76SC3IJRRKWPA6L3BWJWCMZBM4Q5VYOLTWUG3XGM22MO6PFE3AC GPEJOT73KMACP33IPAKFR5ROGHCOIP22VXZMQNYTGLEA2OSZUM2AC MDFQRJ6QZNFUBVSFWLXUJ6EBXOU47T3CVDI2XKBGNNRF4DXDKESQC 2DORUQ4B574MDOOMRYWGU5I72AKHMCSTZ6B3VSHQBUQOZYHRC7FAC R2DQBWKIW7YUJB5SOQ7J274JIYRVX4H3ISFRPAL5RG2RVVP4G2KAC FEAW5HX4TFYOEGUNSESIV5IB2Z65XEJ2EALW6PYNTPRLTPT7APUAC W3P6VW36DJA2Q6AKEHRR4UPY3VOGOKYQD552MC35NKMPGFORFHGAC RX6575DZOHRUXQUZH34YZGPZJF4STUPLBQDIVTINA2L6LVCKRIGQC F6H5PXCHNY6JFQSKO2Z54DHU55BCBA7XZDYDU6IDTVKPJHINP2IQC 6LYLJJDKKIPIXKJITRAC7LAZSNBO7O4IJIVBKUC7FD57AV53LHHAC 7ZWRDDHUNLFWUBFH4322MCPLLHH7G4KVJW64NNUGJD7RPFEHFSWAC 7BREK7U6OWZ6YU3JDSJSH4CMNNULDYABCKCAUHGZIUJZBIRJS5WQC H55P74Y6NHAPF3VPWXIAP7DODA3DV7NCT3SK6VVLWNNWZ7JIMBTAC Y4WR4EIOFFXHRQI2PJAZWD4MVL6A7MNBHLN4KOV6BIKGGA7FXQTQC AV3TMWHWB3XBXQCT34UPMZBSIIKVXIGWQPNEFU4CZSBS3ZOF2CUQC 5WP65PFRPN43O6CMEE3AIAWPENG3LTMJJ62FP5MQWS3Q3ZRNDMNQC QNIQ2NBBIERVCA2YTD3O3P6QPJ5M6VDVGGX7V2BWXTW5553T4PVAC WVKP2MFDE56ZO3OI7FCEKE5LI3MAUIL6IDTUW6MEBCV5OWF4OKEAC BUSA7O6EFBZVAG2RL5T7MD2WTWKOEKKIAAZ2VS4Y3L6ECT4HQR6QC Z6Q7JVMFQ32SC7FRGOB7CE7JS2HEOPAO3B2VLU3YR3UCUDZFIPFQC ADIVVYTV2MJ3XVRYDNBLPTAEACCNF27XZDCRVZFQEHRHPMZGNITQC W7KGGF2VUXLD6YH55EPIRQ5SF5VKVKT33P6RNKCFCVQ4QXOLQE7AC NQXYTPHC5ZBLJDIC5OVAUIDYYOXLPSGWUVD464ODH4KBHYGRDPPAC JM6GKZ6VMX6FNVOZIDXIV22HGX7YESMIFZFE6EEQVCMFJIEA3FNAC 5BJPWUPLJFS34FUTFJVKA4A52YMIGV6EWDXLNSDCWBJWBGVSQFGQC IWMCGZ57ZVHE6WSPYD2CZNSG7ZDKGRBNZVY3KLR53TGEM3OQJLBAC S5IPZ6TIY6ICVYGJ25DHWDVAHWTNTTFJUDYE3MV5FVEDXY7J4APQC TO43FWKHNIA5MVDOFXYHQODTLBQYEZKX5UIUGID57436UF7G2EXQC QCUMH3C7GXV7ZW444WT5SFAXQOJKJSE2YCQCEHMRYXCWF4QI7UMAC VXSORUQOM2VZA4CAZDC6KPAY373NQIN3UT7CXQXTRCYXO2WM62DAC NQ5MZTGKHPSXGP6F7BIEFPGDN2CVBYOREAWOKRQOCXK2PCQYJWGQC RNJX2RDBDA62DSAUIWVVPFS7YNIU3GEOXDWJUABDS5DS5QGS3LAQC 5FBOE2QNRLKUNOP54CZD6LFAMM7LX6NNLHJRJHRDDIUTQ7J723DQC Q3XHNSHW6FI4JCXSEABATRFBJPMCF7PXNG2K6ZQTRRPVMIZFHUBQC 67WH6I2XIMRRL26UM4FJJJZEMJIDPW5Q77FFNZGKWGTWS7GTCJ6QC A3MLQ7PZMDW5YGEKMX6YOKMJQE7CZPULZ4SWAFKAQIKWI5XXYG7AC JAYS2VMYWPH2YKIDWEXW2NOK4ATTIXTGZTXUVDDIQGCXLB5W4OUQC 3RQKQXTWHEZ6OHFRONNLBCGWMJBV5LTNVLH5UYCDWWES75ZR3DUQC M27JU3PI7UXV4S4LTHOCGVASHX2RBXL5ZU4MLFWCQCSMGQC53IAAC RWSXCNYUGDSMP2GKN22HROC5Q2GHSAVJJUDRT3Z53WU2DAI4IZOQC DOZORMA366M4HB5JKSS27BMCR6ET7QNZNND2B7KV3NVEEPR5H7EAC 3CY6KJWHQUZFZGO2C7VVCO32RRHUIMQQQJAE2MUXFF45F7ECRLJQC OYYZVCE3QHBVJM6IEKK5HTJRG5YOVQNCBRMSJENTHOI2WPJLNCFAC UWMN4HLG6YA2YFQEVIVMDISD6APKEPIZXMMPMNUYCBQDSAUYSXPQC ARP25R4B66WPY56X77RRYLHDTIVGZCG2GQGV5WX2UX3DUAS2SAAQC CHO4U5JC3RNTLXVIDXXJYZMOBZJ4VXW2GVJWDOTBRKK3AJ36LDLQC DTO3EUKWHZ5RJNGNCFYXSOVTIPVXPP637F2W7WFGYKJ7JK7VNKNQC Q3DNEB5OOJ34P5ML4CMK3L6SCP7RLW7DDOZEG24KZBX3C7BJRQDAC ED62QWGKBPORWVKDFOQRKJXEIWZVNGR3O4KWQBDSRNPT36AYOQYAC AUXHSGS4EFOPZ6TVZYWNVOUDO7NYKUKE3HBKGQQWTALSVFOE3HAAC PRG7UT7G56GT4W3FQ3KG5JRPGMKKJBFDLVHDLYFQK6IZW25JQLBQC OFTOEJSRSA2EZOAQOJCWWQNDX7IVVAR565JK3DZCBG54TBHHCIDQC XYBPIU6AQ77EID4VNOMI7KQZULZI4VBZHHIGBRYO7QRJVCODEKYAC IXLNOTBJGHKESBCTME6QAR6XVWFNCHYGMS62V62ZJEA7VLQHXO2QC HDJSYPW6GTSBM43QYCJQBEBDAUWWHFHUR6DC4ILGF6LJVL26CZPAC 2YL37AGHLFOMIF3GCTVQGGV2RNNWETWM6ZMUHO3QEWDVBFFSFAKQC 33NP4VXH6MMMH4JFK73G4ENZ2VYFKW2AWXIRITZLVIENKDOSJO2AC C7RRWT4OPLL3MLBTFYI2Z4PJX2DMS2QHKDLTLQBGR3LD6UCO6XEAC DHXIQXK5VTL5JDDEERAVLZK4KBQLXFTBN5TQ6MH3PRBLG5ULOS4AC K2GMFKXUWN5R3KCW6OYVXHN47MIQZKEEIOSAU6LFFKBNKF6JBVWAC TV3ZC6WOZKSQQJQN26JIVKCHK6UK7WMDBYZDUYRWEAZ4JB4YVNAAC IVVTHLTTLOP5TSULXJWUSSXHOKYWVU3OWKYVK45A7RIB6V34MYQAC O6ZMFKDI3XO2SWPNEYHIPYFDWJR4TVDP5BAATK6LVCVETQID6E7AC RTB6BWX5OPHNXFSRXCQ34G5THZO4F6QZCW4GQBAL6JHVEMEMSPOAC CPTUVTBSOJMAUKMS5RFOAEZEVJGPFHMJA2DJWMDTYN7PFNZUGPWQC BDFIS53HAIHOCXQ5BE7WCO2MEOFCUQPFY4JGUWVLWY6JO3IFMEKQC OFH2B2UZBK43QLFQBZ54FOCFLFNE54BZVDNCEUGDTBCUGNVZULIQC XCEZ7OA2INNPSYNAB5U6JB7XNDAD5BKU26YLFPPZ3SEESFZKADQAC CIPVRZGLOZHCERK6YPOBV3P2E4IAB4H6D5EHLRQE2O5E4P4VCBUAC 3EUPIYJNWOMOQBP2Z5SGSMWK453BXJD6KL2WFTR3NM565MEBYASAC HJV7BZBM752K5I47ILBQJJXSPODBBLGKDX5DWJTRDXPJ3V7AEVWAC 5XNQ3SSNBFXFNWA6DPM74W6FH65NX665P3DMH6YCWVFOPZTJSYCQC TPZWAV3USKO7RX4IGHLZKVPRN36K33PJPSZYL6FZMX4XBHTYOQYAC JK3HFJG76OOQHJMXJUSZRTR5CX5ZMS52LRVBLOR7E2NBI6PRSHHAC KFWX5LI235XQYQOSUSSAKKQUNB2OCN3NOYP6E7D3HSM2UOSBGYHQC VM7ZJXYXF3XTGYLWW5RXTEFGG46FOOWWEATC6S565BGHBGM3CXUAC OONYLF4DAPLIYLBNNRW74IVT5BBTWI4XHQBXSNSPVRX3FTKJBTRAC FU7EQZLXD7YNGUUDHXCBI3VUKL6M2G3EPDY6FB5UA6B6RD4S5UOQC NPTVMSNYWIALN2GSKESU6NKX7XNG7QDH2TNIWUB6R6NHCLK32NFAC BW3XFNOS6LDAQLHOZ6RXARCMKCY5JVLVDSXDSSAX4DSYM3FANQBAC ZJLJGSB2XSBQU42OFQMXL3EG4CXAQGOYAU6YTV2SAWZEJIPFH2CAC ENI6P5WUO7DS4Y7EUDCYB4PSNT7CXH2L5JIB5BLZHNMWN4QDXMWQC QDTVLBRGHDTRUVT7I3O72K6TMOYAUSAJBZUHGOEFU2RKJNUPWZSQC OP6CTAKWCAU64JXQ3USQYR5E5IFHQHNCACII5UMVRXUTZXJQOAZAC GVCGKTH5IJ4VSQEIN4CRC7ZFVZW26JPIYNCPTO7GY66CSZZEW3ZQC ITUTGFJ56GR7FWMC5Y7XKUJJ4Z35I6BMOHCPCW3W5MKDQGVOGM4AC R5JKQLY5QE6UBG3RH3Y5ZRSX6H35CHYI2HYNDZF6ZHVRULUORXBQC AO3KHGKGSX2ZR24KJVIOTUY7EHYHMMI5W4HN3CAG4YGQHBOHLGDQC T5XERKCC6UL2UI2HKE34BTKNINTOXOSDCBYGC3A3JY7XMKIQW4GQC CDKRLJIGVWQE2PMHCSLJBLYQEK7JYC4LQM7H2X3O6NMJMCCDRVIAC WBAFNYODKTL3YSG3UOJITBJSTFYGJLIWKRNK6NMGIIP5TPC2BDGQC HIRKGUMNJPWKSVTR6TVBPD3MWNA63CEHCLCIPWEMGDFHVB3NPLDQC 4GYZYBY7FFORRNPIEFTV4ZM2C7Z6D2KTQOM537ZCC2YBXT2TNSHAC 32S5UVZCXZ5QWH4NDB23MHOPLVPON3VKIWH6EEY42SRPBFZUUXSQC N5FAAVHNKQZJV2G3JFRW7WKTXB3A4YY6GTVIMBCG5RSA65TKVBGQC OEISFRW2B7E4YRJSWXNXBH2IAJO4O3LHNYFPFD3MBY57LYVRHMZQC V77IIRDTMZWKFEZEQIQNBMVELSSFTPV2ZWR2QIALU5Z7I3YZZBZAC 4FQAKUKUO6PCAZ3N4HUR5XL6E4VA5UQUZ3AEDGRBLVY7W2LMWI7QC O7S3ILRELHICJXXTDGMF7KPPZWYHPYCNDPV2I77FZXXH4I454B4QC EH4VJW3I5Y4V6DT3YMLNDA3NW2DEAV4LRE4T5IEXAVB4WB3JJMGAC 3C2VE43SHCSBY4LTRTFYFLIPRWFUN6DXU6D34QVWDQTSNRBUFG7AC SQDS2YBPOYDDDCW3GGARBZ2HQIUHCQKL7SSHKFQWDENOL5YNNVNQC B7MSPF6X2RLGWN4M6ZZF3WSOPKGYPTTD7LIJVST7DXN27DG6JHNAC KA5FM5FELFEKHCCICIQCKVKOLHOYXOCODGK4NFJWRSPJ4UXULC2AC KLE4PF466VJJ56WVBMTFDS3B4KHVV5VNSKJT6DQN6BRH5NLSPNOQC 3PY3L3A4QRW3Z5Y7SHO4TMVOOP2VNCO27X2MX4DTOP2SADLBQUOAC 5UVDIVD4NSXA52U4QMQIVST3GSZJ2A2YZK3RUEXKPM43YVQ7LI5AC KKNUX66ORZWWQH4ARKCHPHNDOYCI65STE3A27LKA3FWUKIX7MAXQC L4RYVF46EQKMVOEADGRG4WMPVTQ6NNFGYMU4SHAH6XJIKWVHT77QC E5JKWMBVQQGVSCAX4UOGHI6QW5RFOX6PJB77LHL3UI2NJ427BFFQC 3UKFCWWS5BLFQWZRB5FUA46CE2XGX5VRCEWC3K3XH5RCGQK64N2AC 7XJLSTDZDOSHW6JF3Y4545YGGK5BC2SOXJVQXXVOFR3I7PXYUJZQC 5KTPCJG42MF2B34CEH6VXAJIOZR6QOS2BWYNW7DXM3WA7N3GH4HQC OZA5DYMGLATSTUY6LAYN4QHWWJDRAM2X2BSL654TIA6E5B6XWEAAC LUNOTEIMYZJ7JL5P55GEHUVSDEZMYX3TWYUB2ABRHAYJEWQSSXIAC 56C44YMFHZ62GXAAOLYSLLGBVGRWXB53W2VI37Q26ZECEK2XG5SQC SCWXQW5H65OXUP2MEJ2MEEAVPSRJDT3RQGKYCMKVTORS2334PQSQC HZK3YN3SAISTDS5JI4COBYFG7YB4ABDVENXWZZEYLFA2LDI232VAC CREW3VTGN2BV622ZXHCPHUEZWBAGEQMNUELDLTHLEKG4VBXGMRPQC 34C4U6EQWERY75GZJKUCM5KVGU2OUICETS5LGZF6RMKMZT4R5SQAC LDGIQP4A5BWVFQWQ2MGZRM5OY45ZXNNARH4WZPLUTBJVS4CVHISQC JT672SIJK4BOIUAGL2WQ6NR2NF4PSWP3BT6Q4HMNRF25UN6JQ2MAC JDM27QE4HR52AYFSQE763BFF57ANOTF5MXKMO377PP5EXMN7SAOAC DHK4J2ZAMNKLRDX3V3LPBV2REQXY5BV6LX6TLX6ZWHWGPRXWHNZQC A3CO4KBFTFU3ZSHWRY2OPPX3MMTFV7OUCZGL7Q4Y2FU7JO4AP7MAC 3IUPEZKGA22SJUYY6662PQHCBCBGKUAEOSXDWPCOQEJA6I42TBWAC WMHFDQKUDCUGM3R245LLVZ5NNEZSCXFDSTNMVS2O5EFUHHO7HU3AC ILN2K6ASDZSMEHOPJ22IZLZJUO6DDGZTKAKXM3YXG6JZZHJNLX4AC NTFA3ZSJFTVLTTKI6ONJE33PGGDW36IVGWMO6GXRA4ZG57TOWNFAC L6O4LGZRKBURVWEY7XRVCSQLJ5RULNBEWMQJ6I2UYVWWB66FM3MQC TFZ4TER7O2Z4FOGF2RCPEPYIHBTUA4LG3ECXLR7XGLCC6GO6OOTAC XJUQANMY7JJTA3KDICDXEOBE22YQTMZQSDPP4PFBTTGJJDK4X5KAC C22455VGUQOSUX2OORA32LROFQ7NNYDMD2ZDTTUZSAQLXK4AD6QAC NDTQUANX3GZ6HZP5FONYNJUYPD3R2P6SGRC3ICKJ7ZWF3KO23LTAC OYTCBRC7LE44EUVRZVYTOOVKQWJ6P6YE3FXTOGUTNKEMLNWPHKSQC QZERCVTY5BISIKSDH6WUXGZPIBAF4KUCGSZEEGMGBCORNUXT4HXAC OY7KHQPESOUHPBXRZ2JSNUKPAC7DCDY73TAUHCSJG5V6TPAHBVYQC FIYBXLWALQINNQTHG2KNDUUTAQAZRDDLXW2XOVSKDKBADJ3XCJ4AC TJRYL3NXPW5IUGEV3YOC7JYWEXCZDBFPLT4AUG4P227WVKVB72ZAC HSRRNAU5UAYC6B6IQWGJPFROMZBTJICPCH6DJVZDHDTAGOQ6IOYAC SPOCLROO64OKT2F6SGUJNAQXH2XZWCK3LE7IRCDQCRYPU6Q6SAFQC TPPJRQ2NTCV3GI2VRHEXQJREDERPJODCJWUG5WCOQGN4REPPPAMAC FEKRY3DYIDLWVBLAZN7W2WFNEKZPCAHABXOSM6K5RLTH5WY2NODQC JN4GPMQCXOY5ICTLPLWP6DXBFULN4GMAEK7T4GXTZVIJAUUKBBYAC YAAJ6PTN6QUSWE52URI5AENOGD366FIHOIFUOXFUJLVZYE4OG6HQC VD4KDTGHVKCN35AWREYB4TEOUMCTW7SAUPAMTMF5ABC7VBHVKP4AC TXENGSZD2F6LFYQVN3MGWO2LH4H6F4756NIMQZL2B3MXIAGN5AQAC NLSZ4SHFD6LN6AWB3HLLKQTCKQW55ZHEW3YM7XRAVAKIPD3C3Q3AC 45QV77UI6QFW4234P365LD3FGJYRVWTT5455DPB324NG2NFQMKTQC 4PBRMB7TK2TXL7VSDKMUQMT4QFK3SGRU4TUVMEM7V2VS7KKKILAQC 4PUWNQO7QMEWY3GSUHLBKMYOAI7ASYSRM32KDGTA7DLNDIGFAWFAC UPJVSMMMHGRDUIJG4MZX6IBLQ4ODBF5Z3PF3RHDYTSAEOCVDZM5AC NQMXQ6OQVUSC7Y7F7IL252QW4A5JED224EECNHWAM4ZZYVNY745AC SNRNR7OJX2MRRSYXSX3FC2CKM7HAGRQS2XMUUTOOBRHJZO2B5MTAC YHSVOROKPYS33Y4RYZRVZTE3G5LXOFX52HEDNLV6HIXOJYNOKH3QC SKWBAGSAB625IIN4UP3NCPRX2H3KCPC2LULHS2A7JVRLO3EUBJDAC ABLV37FMURRJPEZV2VRKOUYAKEMLI7E6RA4PDAII2EJ5L7WBHKZQC BNTPYSO6ECZ76CHHLDP3ASSPDSEUH4Y3E3LETKNXVWAWJRFL3YEQC 47NSOFQMBZCDIBHEAZSENFUGDSQCX3GJHFBUZ65ARDKCYIZ435LAC L254F6ZIU2HWGLFFGPIORTN4C3TDQ3E5JZ7Z7GQA5AEDIKL6PKDAC Y5RFQ6KNJCBQUSV2T6WDR7TPZLZYLOAWBVMUTHDXGOZQDZ2U423AC IIN7AVA6JYRBXH6ZYRR7BY7TV6PW7ANAQ2A3PD55FKBKKQFEEF2AC LW4N5EHKL776DURXZMAM6JEW3JPWWX5BSNP7TCZHTLCDOQTTGFCAC YMLVBQ6M27MECUVMU3BQP3WSGR7GW4XJMQIHLGHHWMVXHMMIXOYAC OVLN3RPH65K6TZHPINT2O42WI4BHLW7OTFQFPRSYHZU4UAAMER6QC FEGNPOJI2SALUA2PVIXIQ2CIXFLSXD7UB7CNUSAAKV4L3POXCRFQC 2KTJHQUX2LTU2BCLS5YXVRRKMOYKKIZAPF2LBKORFGSHEN5IO3IAC 2P3IJKK547AOEFWKXEAL73QFKW423GGAZEZHW6OZ6QB7YUSDNC3AC VS3WVE6ORJ76O3TRRJCR4JJVFVRKKFK5YHZ6AA4AU63DWM3KR3UAC M2XL3DZCNIFZQOZZIJSRA6WV2PISXL4BEVPI5FX4OW6AE3IVZBJQC WG6O475IOLZFMUQSLVR2KHM7XTBF5HH276L2KDGF7UOSESDOAILQC JP7SVXCIKEPVDD4Q5CDYDATPK7X5XOYW3T6QK2Y6EWHFH52LBK3QC 3KAINFIXO7WNWGUGZB43EUNFRS2ZPBLQZDTY456QACMRHYIJ7WDAC VXMRWJ2CPHIB2NAHMZKUV7DAFA7GLVA32WDS53WNT3BIDHK6GOZQC CUB27EJDQG66FF2YCKOV4HU3LAJVJIHUJ5QYLURRDIEVGPK666DQC YCL3W2PFE6ILTGBFODCSXNPDIA46KVSZP2TI7HDMYAOEJT65RIEAC 347OTVM5V6C5UE5ERARQJQTVNTHKQNL5NEKE43TI2SYUH64CWT6QC 5UC5TI7B6NWGIGN74QRBZKDBYUMHLM2ZO5ATXEZ6TZOGOLF3JX5QC JPBP7PZSMLAI3DCMQZ3RB5EBDFAXJLZJE5MMUHADIJE5VYEMD5KQC YX2LDGNQNB6AQRKAVXNYQ473X6EVPQEBT5AJKBIIWFIMS3U2BNQQC 5XSXMOBGXFLTIQE6WDXWWFVDOTUPZSIQ2FWT3YI5QMVU6D76IUYQC 34RCM6RXIWHZMYXNGFQKLKQIAJ6QISIQ3D5HMK4HZNLVX66BSUBAC TK2DI6PDNMQWV3WGYEFTRNITLFJ6YXSEMKRDP3FIFGS4W4LSPSMQC BMGB25AWEDOAWKDB7H22R6D4SL32CSBSOBWBIEN3GFGDLEDGEWJAC W45PMU4HNPSAMMEBJ4XH4MTHLPVIASZT4FXTBPID5LFXKIMNUBKAC ZP2KE7A2LE7Z2S7AC45WE4CXDSEVDTWIMV2EM4IBUKXYJIDU6R7QC PR42BCP5BPRFD2MP5H6CIJP7E57Q6TKL6SOXZWFKMFVR2OZWHT7AC TQLWCGVXVZ75H7MDBJD3DJDUFNW62WOAEDJUVKCHQTAXKBP47CSAC GVW4OBPGXY2Q75HB7QHADZIOHKL22FI2BSJ2TM4K5SBJENBFTQKAC PI5BATR2SER3RFE76IUGHM2AGXVFOUM3PLU7WC2K2Q2BA5K2E73QC VYGSRD6AGPW3JDTKAMFIUEERMWNCV35SPWXH75XCX2SCMMR72RQQC DDU4A3JGN5IUIPP5IASOODKPR2WBHSDSV4FITZ6HNXNSXXQACWAQC 7HYUCUM7VRDLLOPHIEYMKGNXYFBCGCBQN4BOAFVD7U646KLEPHQQC 6MAMXLPWLW5IXKQXGUNSKNZNHZM7U24GQNN4IWZL2FKKGAKL23YAC 5K2ANIEXD3CPJM4XNKNPZINP2G4NT7SJBKRN62WNBUKJXFERTILQC FZKMVCODMWQEVVBBQHTTXFBRO4LZEYLB646ZPVUMLHH6EER7FAOAC 64VBM7SGUX7CVO5TMVOFU4A26BDOFQXKS6G5K7BXCSWKCCXEETOAC 7TK2D5RI45FKCIQBHGU4FA75NSFZA3ZYFF2UYQJEGHCOV7I4XUGQC H7HOAPMVNVME2LOADK6US3IEE22NVLVJJ4VKGNM3ZGMFI5HJKQ2AC UZ5623MOLKBTGBSRBJ4OBOEI4IEZSPV3NCV2DRMUZ3CHHJQVHIIAC QLMCSREGK2UUAPXZSZQKLZOLM4BCB7PAVCSR3DLFQS3EW3IMWQSQC Q34XE6SMDPGFALBB7DSQWDVIPPGXYAH6I3FDTB56S4RRHOBKJREAC PDOFPXD2X6VI23AHKCGQ5RVDBG74CNP2E3YOHKXLOARHHBXEK3HQC H5BVKRORNXTCJKFXQPTFWDURKSUFW24CGSJXBGZCJUP4DHMSVDBQC 3BUZB6SWAESYJGX564WE7IS2FFURCDOZT4D2I4PWSZXUVHEQDTQAC LVCBY444HPB4RRFMUAZPHVZ67IC3L6DB27AEMCW3DEXHLBF73TMQC JEWGBHOQGDSWMLT4FZTQWUKTBJJWY5CSRAQQUOWIZ7U4QBJ6ZLBQC X5DCNPFXJAWWTCTVQGZN4PTTWUJIUE4JPTXH3WVWCO2DW67MXWYAC RT56MRPFK5ISZOZMZWTXYM4H25GSVKPL7RZ3RTSWVW2TZCD2U3CQC 7Q7PY2DHSCW7Y663XJUTBFZTHXCF6KPIMZV2A6XORBCMMHIJWVGQC WKGCRBVC45E5T6TKJ6BOLIJFRUF7IZBDHNUIBUXCCOIWKGJBEVCQC AMBBZGB4EP4MA2ILKQSAY4O2XQAIH673JHCDQ6N4MBGL2MAZGXNAC LMRRQE4ZXQYZPXVGBTDZP7LEIM6OGSSOOQ5FAOWXJCDCNCECX5VAC 7V4DCKFJCNBXFODMKJ6H3MCDUTSD4XVQ7D4D6XFCD4JNF4HCE4KAC QCIPZ52TOIKLA6O22P7USLEAYI4VAZRLGVXMAASSGEP37KN5PEVAC FLAGBNUNSIQNFDN53CDWABJRTTFWDL4PG34AI474ZKPXDEPYHOAQC 5P6MEKBISK6NI4MULM75HHFBQW5MXITSZJDGLLIDKJ7G24F7XYNAC _set_show_backup(ex, ey);env.show[ex][ey] = DNGN_INVIS_EXPOSED;env.show_col[ex][ey] = BLUE;
_set_show_backup(e.x, e.y);env.show[e.x][e.y] = DNGN_INVIS_EXPOSED;env.show_col[e.x][e.y] = BLUE;
env.show[ex][ey] = monster->type + DNGN_START_OF_MONSTERS;env.show_col[ex][ey] = get_mons_colour( monster );
env.show[e.x][e.y] = monster->type + DNGN_START_OF_MONSTERS;env.show_col[e.x][e.y] = get_mons_colour( monster );
coord_def gp;for (gp.y = (you.y_pos - 8); (gp.y < you.y_pos + 9); gp.y++)for (gp.x = (you.x_pos - 8); (gp.x < you.x_pos + 9); gp.x++)
for (radius_iterator ri(you.pos(), LOS_RADIUS, true, false); ri; ++ri){if (igrd(*ri) != NON_ITEM)
if (in_bounds(gp) && igrd(gp) != NON_ITEM){const coord_def ep = gp - you.pos() + coord_def(9, 9);if (env.show(ep))_update_item_grid(gp, ep);}
const coord_def ep = *ri - you.pos() + coord_def(9, 9);if (env.show(ep))_update_item_grid(*ri, ep);
_set_show_backup(ex, ey);env.show[ex][ey] = DNGN_CLOUD;env.show_col[ex][ey] = which_colour;
_set_show_backup(e.x, e.y);env.show(e) = DNGN_CLOUD;env.show_col(e) = which_colour;
for (i = you.x_pos - map_radius; i < you.x_pos + map_radius; i++)for (j = you.y_pos - map_radius; j < you.y_pos + map_radius; j++){if (proportion < 100 && random2(100) >= proportion)continue; // note that proportion can be over 100if (!map_bounds(i, j))continue;const int dist = grid_distance( you.x_pos, you.y_pos, i, j );
for ( radius_iterator ri(you.pos(), map_radius, true, false); ri; ++ri ){if (proportion < 100 && random2(100) >= proportion)continue; // note that proportion can be over 100const int dist = grid_distance( you.pos(), *ri );
if (!wizard_map && is_terrain_known(i,j)){// Can't use set_envmap_obj because that would// overwrite the gmap.env.tile_bk_bg[i][j] = tile_idx_unseen_terrain(i, j, grd[i][j]);}
if (!wizard_map && is_terrain_known(*ri)){// Can't use set_envmap_obj because that would// overwrite the gmap.env.tile_bk_bg(*ri) = tile_idx_unseen_terrain(ri->x, ri->y,grd(*ri));}
if (!wizard_map && is_terrain_known(i, j))continue;
if (!wizard_map && is_terrain_known(*ri))continue;
for (k = -1; k <= 1; k++)for (l = -1; l <= 1; l++){if (k == 0 && l == 0)continue;
if (map_bounds(*ai) && (!grid_is_opaque(grd(*ai))|| grd(*ai) == DNGN_CLOSED_DOOR)){open = true;break;}}}
if (!map_bounds( i + k, j + l )){--empty_count;continue;}
if (open > 0){if (wizard_map || !get_envmap_obj(*ri))set_envmap_obj(*ri, grd(*ri));
if (grid_is_opaque( grd[i + k][j + l] )&& grd[i + k][j + l] != DNGN_CLOSED_DOOR){empty_count--;}}}if (empty_count > 0)
// Hack to give demonspawn Pandemonium mutation the ability// to detect exits magically.if (wizard_map|| player_mutation_level(MUT_PANDEMONIUM) > 1&& grd(*ri) == DNGN_EXIT_PANDEMONIUM)
if (wizard_map || !get_envmap_obj(i, j))set_envmap_obj(i, j, grd[i][j]);// Hack to give demonspawn Pandemonium mutation the ability// to detect exits magically.if (wizard_map|| player_mutation_level(MUT_PANDEMONIUM) > 1&& grd[i][j] == DNGN_EXIT_PANDEMONIUM){set_terrain_seen( i, j );}else{set_terrain_mapped( i, j );}
set_terrain_seen( *ri );
for (int x = you.x_pos - 10; x <= you.x_pos + 10; x++)for (int y = you.y_pos - 10; y <= you.y_pos + 10; y++){if (!in_bounds(x,y))continue;if (grd[x][y] == DNGN_SECRET_DOOR)grd[x][y] = DNGN_CLOSED_DOOR;}
for ( radius_iterator ri(you.pos(), 10, true, false); ri; ++ri )if ( grd(*ri) == DNGN_SECRET_DOOR )grd(*ri) = DNGN_CLOSED_DOOR;
// Updates/creates a StairInfo for the stair at (x, y) in grid coordinatesvoid update_stair(int x, int y, const level_pos &p, bool guess = false);
// Updates/creates a StairInfo for the stair at stairpos in grid coordinatesvoid update_stair(const coord_def& stairpos, const level_pos &p,bool guess = false);
if (!you.running.x|| you.running.x == you.x_pos && you.running.y == you.y_pos|| !_is_valid_explore_target(you.running.x, you.running.y))
if (!you.running.pos.x|| you.running.pos == you.pos()|| !_is_valid_explore_target(you.running.pos))
for (int y = 0; y < GYM; ++y)for (int x = 0; x < GXM; ++x)
for ( rectangle_iterator ri(1); ri; ++ri ){const dungeon_feature_type grid = grd(*ri);const int envc = env.map(*ri).object;if ((*ri == you.pos() || envc)&& is_travelable_stair(grid)&& (is_terrain_seen(*ri) || !is_branch_stair(*ri)))
dungeon_feature_type grid = grd[x][y];int envc = env.map[x][y].object;if ((x == you.x_pos && y == you.y_pos || envc)&& is_travelable_stair(grid)&& (is_terrain_seen(x, y) || !is_branch_stair(x, y))){// Convert to grid coords, because that's what we use// everywhere else.const coord_def stair(x, y);st.push_back(stair);}
st.push_back(*ri);
const int targ_x = you.x_pos + run_check[i].dx;const int targ_y = you.y_pos + run_check[i].dy;const dungeon_feature_type targ_grid =_base_grid_type( grd[ targ_x ][ targ_y ] );
const coord_def targ = you.pos() + run_check[i].delta;const dungeon_feature_type targ_grid = _base_grid_type(grd(targ));
if (empty_surrounds( you.x_pos, you.y_pos, DNGN_FLOOR, 1,false, empty )){escape = true;}else{escape = false;}
escape = empty_surrounds(you.pos(), DNGN_FLOOR, 1, false, empty);
m.x = unmarshallByte(th);m.y = unmarshallByte(th);m.target_x = unmarshallByte(th);m.target_y = unmarshallByte(th);
m.position.x = unmarshallByte(th);m.position.y = unmarshallByte(th);m.target.x = unmarshallByte(th);m.target.y = unmarshallByte(th);
coord_def p;for (p.x = you.x_pos - 1; p.x <= you.x_pos + 1; ++p.x)for (p.y = you.y_pos - 1; p.y <= you.y_pos + 1; ++p.y){if (p == you.pos())continue;if (const monsters *mon = monster_at(p)){if (!mons_friendly(mon))return (2);}}
for ( adjacent_iterator ai; ai; ++ai )if (const monsters *mon = monster_at(*ai))if (!mons_friendly(mon))return (2);
void apply_area_cloud(int (*func) (int, int, int, int, cloud_type,kill_category, killer_type),int x, int y, int pow, int number, cloud_type ctype,
void apply_area_cloud(cloud_func func, const coord_def& where,int pow, int number, cloud_type ctype,
static bool _cloud_helper(int (*func)(int, int, int, int, cloud_type,kill_category, killer_type),int x, int y, int pow, int spread_rate,cloud_type ctype, kill_category, killer_type );
static bool _cloud_helper(cloud_func func, const coord_def& where,int pow, int spread_rate,cloud_type ctype, kill_category whose,killer_type killer);
void apply_area_cloud( int (*func) (int, int, int, int, cloud_type,kill_category, killer_type),int x, int y,
void apply_area_cloud( cloud_func func, const coord_def& where,
if (clouds_left && _cloud_helper(func, x, y, pow, spread_rate,ctype, whose, killer))clouds_left--;
if (number && _cloud_helper(func, where, pow, spread_rate, ctype, whose,killer))number--;
if (x_first){if (clouds_left && _cloud_helper(func, x + dx, y, pow, spread_rate,ctype, whose, killer)){clouds_left--;good_squares++;neighbours[0]++;}if (clouds_left && _cloud_helper(func, x - dx, y, pow, spread_rate,ctype, whose, killer)){clouds_left--;good_squares++;neighbours[1]++;}
// These indices depend on the order in Compass (see acr.cc)int compass_order_orth[4] = { 2, 6, 4, 0 };int compass_order_diag[4] = { 1, 3, 5, 7 };
if (clouds_left && _cloud_helper(func, x, y + dy, pow, spread_rate,ctype, whose, killer)){clouds_left--;good_squares++;neighbours[2]++;}
int* const arrs[2] = { compass_order_orth, compass_order_diag };
if (clouds_left && _cloud_helper(func, x, y - dy, pow, spread_rate,ctype, whose, killer)){clouds_left--;good_squares++;neighbours[3]++;}}else
for ( int m = 0; m < 2; ++m )
if (clouds_left && _cloud_helper(func, x, y + dy, pow, spread_rate,ctype, whose, killer)){clouds_left--;good_squares++;neighbours[2]++;}if (clouds_left && _cloud_helper(func, x, y - dy, pow, spread_rate,ctype, whose, killer))
// Randomise, but do orthogonals first and diagonals later.std::random_shuffle( arrs[m], arrs[m] + 4 );for ( int i = 0; i < 4 && number; ++i )
clouds_left--;good_squares++;neighbours[3]++;}if (clouds_left && _cloud_helper(func, x + dx, y, pow, spread_rate,ctype, whose, killer)){clouds_left--;good_squares++;neighbours[0]++;}if (clouds_left && _cloud_helper(func, x - dx, y, pow, spread_rate,ctype, whose, killer)){clouds_left--;good_squares++;neighbours[1]++;
const int aux = arrs[m][i];if ( _cloud_helper(func, where + Compass[aux],pow, spread_rate, ctype, whose, killer)){number--;good_squares++;neighbours[aux]++;}
}// Mow diagonals; we could randomize dx & dy again here.if (clouds_left && _cloud_helper(func, x + dx, y + dy, pow, spread_rate,ctype, whose, killer)){clouds_left--;good_squares++;neighbours[4]++;}if (clouds_left && _cloud_helper(func, x - dx, y + dy, pow, spread_rate,ctype, whose, killer)){clouds_left--;good_squares++;neighbours[5]++;}if (clouds_left && _cloud_helper(func, x + dx, y - dy, pow, spread_rate,ctype, whose, killer)){clouds_left--;good_squares++;neighbours[6]++;
if (clouds_left && _cloud_helper(func, x - dx, y - dy, pow, spread_rate,ctype, whose, killer))
// Get a random permutation.int perm[8];for ( int i = 0; i < 8; ++i )perm[i] = i;std::random_shuffle(perm, perm+8);for (int i = 0; i < 8 && number; i++)
switch (i){case 0:apply_area_cloud(func, x + dx, y, pow, spread, ctype, whose, killer,spread_rate);break;case 1:apply_area_cloud(func, x - dx, y, pow, spread, ctype, whose, killer,spread_rate);break;case 2:apply_area_cloud(func, x, y + dy, pow, spread, ctype, whose, killer,spread_rate);break;case 3:apply_area_cloud(func, x, y - dy, pow, spread, ctype, whose, killer,spread_rate);break;case 4:apply_area_cloud(func, x + dx, y + dy, pow, spread, ctype, whose,killer, spread_rate);break;case 5:apply_area_cloud(func, x - dx, y + dy, pow, spread, ctype, whose,killer, spread_rate);break;case 6:apply_area_cloud(func, x + dx, y - dy, pow, spread, ctype, whose,killer, spread_rate);break;case 7:apply_area_cloud(func, x - dx, y - dy, pow, spread, ctype, whose,killer, spread_rate);break;}
apply_area_cloud(func, where + Compass[j], pow, spread, ctype, whose,killer, spread_rate);
static bool _cloud_helper(int (*func)(int, int, int, int, cloud_type,kill_category, killer_type),int x, int y, int pow, int spread_rate,
static bool _cloud_helper(cloud_func func, const coord_def& where,int pow, int spread_rate,
if (x < 5 || x > GXM - 5 || y < 5 || y > GYM - 5)continue;if (!see_grid(x, y))continue;if (grd[x][y] == DNGN_SECRET_DOOR && random2(pow) > random2(15)){reveal_secret_door(x, y);found++;}
reveal_secret_door(*ri);found++;
if (okay_to_dest&& (grid == DNGN_ORCISH_IDOL|| grid == DNGN_GRANITE_STATUE|| pow >= 40 && grid == DNGN_ROCK_WALL && one_chance_in(3)|| pow >= 40 && grid == DNGN_CLEAR_ROCK_WALL&& one_chance_in(3)|| pow >= 60 && grid == DNGN_STONE_WALL && one_chance_in(10)|| pow >= 60 && grid == DNGN_CLEAR_STONE_WALL&& one_chance_in(10)))
if ((grid == DNGN_ORCISH_IDOL|| grid == DNGN_GRANITE_STATUE|| pow >= 40 && grid == DNGN_ROCK_WALL && one_chance_in(3)|| pow >= 40 && grid == DNGN_CLEAR_ROCK_WALL&& one_chance_in(3)|| pow >= 60 && grid == DNGN_STONE_WALL && one_chance_in(10)|| pow >= 60 && grid == DNGN_CLEAR_STONE_WALL&& one_chance_in(10)))
if (okay_to_dest){grd[spd.tx][spd.ty] = DNGN_FLOOR;env.trap[trap].type = TRAP_UNASSIGNED;}
grd(spd.target) = DNGN_FLOOR;env.trap[trap].type = TRAP_UNASSIGNED;
if (grd[you.x_pos][you.y_pos] != DNGN_FLOOR&& grd[you.x_pos][you.y_pos] != DNGN_SHALLOW_WATER|| mgrd[you.x_pos][you.y_pos] != NON_MONSTER|| env.cgrid[you.x_pos][you.y_pos] != EMPTY_CLOUD)
if (grd(you.pos()) != DNGN_FLOOR&& grd(you.pos()) != DNGN_SHALLOW_WATER|| mgrd(you.pos()) != NON_MONSTER|| env.cgrid(you.pos()) != EMPTY_CLOUD)
while (grd[newx][newy] != DNGN_FLOOR&& grd[newx][newy] != DNGN_SHALLOW_WATER|| mgrd[newx][newy] != NON_MONSTER|| env.cgrid[newx][newy] != EMPTY_CLOUD);
while (grd(newpos) != DNGN_FLOOR&& grd(newpos) != DNGN_SHALLOW_WATER|| mgrd(newpos) != NON_MONSTER|| env.cgrid(newpos) != EMPTY_CLOUD);
for (int srx = you.x_pos - 1; srx < you.x_pos + 2; srx++)for (int sry = you.y_pos - 1; sry < you.y_pos + 2; sry++){// Tile already occupied by monster or yourself {dlb}:if (mgrd[srx][sry] != NON_MONSTER|| srx == you.x_pos && sry == you.y_pos){continue;}
for ( adjacent_iterator ai; ai; ++ai ){// Tile already occupied by monsterif (mgrd(*ai) != NON_MONSTER)continue;
bool proceed = false;for (unsigned int i = 0; i < ARRAYSZ(safe_to_overwrite); ++i){if (grd[srx][sry] == safe_to_overwrite[i]){proceed = true;break;}}
bool proceed = false;for (unsigned int i=0; i < ARRAYSZ(safe_to_overwrite) && !proceed; ++i)if (grd(*ai) == safe_to_overwrite[i])proceed = true;
while (objl != NON_ITEM){// hate to see the orb get destroyed by accident {dlb}:if (mitm[objl].base_type == OBJ_ORBS){proceed = false;break;}
// checkpoint two - is the orb resting in the tile? {dlb}:if (!proceed)continue;// Destroy all items on the square.for ( stack_iterator si(*ai); si; ++si )destroy_item(si->index());// deal with clouds {dlb}:if (env.cgrid(*ai) != EMPTY_CLOUD)delete_cloud( env.cgrid(*ai) );
hrg = mitm[objl].link;objl = hrg;}// checkpoint two - is the orb resting in the tile? {dlb}:if (!proceed)continue;objl = igrd[srx][sry];hrg = 0;while (objl != NON_ITEM){hrg = mitm[objl].link;destroy_item(objl);objl = hrg;}// deal with clouds {dlb}:if (env.cgrid[srx][sry] != EMPTY_CLOUD)delete_cloud( env.cgrid[srx][sry] );// mechanical traps are destroyed {dlb}:int which_trap;if ((which_trap = trap_at_xy(coord_def(srx, sry))) != -1)
// mechanical traps are destroyed {dlb}:int which_trap = trap_at_xy(*ai);if ( which_trap != -1 ){trap_struct& trap(env.trap[which_trap]);if (trap_category(trap.type) == DNGN_TRAP_MECHANICAL)
// Finally, place the wall {dlb}:grd[srx][sry] = DNGN_ROCK_WALL;number_built++;}
// Finally, place the wall {dlb}:grd(*ai) = DNGN_ROCK_WALL;number_built++;}
for (int x = -radius; x <= radius; x++)for (int y = -radius; y <= radius; y++){int posx = you.x_pos + x;int posy = you.y_pos + y;int dist = _inside_circle(posx, posy, radius);if (dist == -1)continue;
for ( radius_iterator ri(you.pos(), radius, false, false); ri; ++ri ){int dist = _inside_circle(*ri, radius);if (dist == -1)continue;
if (trap_type_at_xy(pos) != NUM_TRAPS&& grd(pos) == DNGN_UNDISCOVERED_TRAP){const dungeon_feature_type type =trap_category( trap_type_at_xy(pos) );grd(pos) = type;set_envmap_obj(posx, posy, type);trap_count++;}// forming patternsif (pattern == 0 // outward rays&& (x == 0 || y == 0 || x == y || x == -y)|| pattern == 1 // circles&& (dist >= (radius-1)*(radius-1) && dist <= radius*radius|| dist >= (radius/2-1)*(radius/2-1)&& dist <= radius*radius/4)|| pattern == 2 // latticed&& (x%2 == 0 || y%2 == 0)|| pattern == 3 // cross-like&& (abs(x)+abs(y) < 5 && x != y && x != -y))
if (trap_type_at_xy(pos) != NUM_TRAPS&& grd(pos) == DNGN_UNDISCOVERED_TRAP){const dungeon_feature_type type =trap_category( trap_type_at_xy(pos) );grd(pos) = type;set_envmap_obj(pos, type);trap_count++;}// forming patternsconst int x = pos.x - you.pos().x, y = pos.y - you.pos().y;if (pattern == 0 // outward rays&& (x == 0 || y == 0 || x == y || x == -y)|| pattern == 1 // circles&& (dist >= (radius-1)*(radius-1) && dist <= radius*radius|| dist >= (radius/2-1)*(radius/2-1)&& dist <= radius*radius/4)|| pattern == 2 // latticed&& (x%2 == 0 || y%2 == 0)|| pattern == 3 // cross-like&& (abs(x)+abs(y) < 5 && x != y && x != -y)){env.map(pos).property = FPROP_SANCTUARY_1; // yellow}elseenv.map(pos).property = FPROP_SANCTUARY_2; // white// scare all attacking monsters inside sanctuary, and make// all friendly monsters inside sanctuary stop attacking and// move towards the player.int monster = mgrd(pos);if (monster != NON_MONSTER){monsters* mon = &menv[monster];if (mons_friendly(mon))
elseenv.map[posx][posy].property = FPROP_SANCTUARY_2; // white// scare all attacking monsters inside sanctuary, and make// all friendly monsters inside sanctuary stop attacking and// move towards the player.int monster = mgrd[posx][posy];if (monster != NON_MONSTER)
else if (!mons_wont_attack(mon))
mimic_alert(mon);if(you.can_see(mon)){scare_count++;seen_mon = mon;}}else if (mon->add_ench(mon_enchant(ENCH_FEAR, 0,KC_YOU))){behaviour_event(mon, ME_SCARE, MHITYOU);// Check to see that monster is actually fleeing,// since plants can't flee.if (mons_is_fleeing(mon) && you.can_see(mon)){scare_count++;seen_mon = mon;}
scare_count++;seen_mon = mon;
// last updated 24may2000 {dlb}/* ************************************************************************ called from: spell* *********************************************************************** */
// last updated 24may2000 {dlb}/* ************************************************************************ called from: spell* *********************************************************************** */
// last updated 24may2000 {dlb}/* ************************************************************************ called from: spell* *********************************************************************** */unsigned char detect_items( int pow );// last updated 24may2000 {dlb}/* ************************************************************************ called from: spell* *********************************************************************** */unsigned char detect_traps( int pow );// last updated 24may2000 {dlb}/* ************************************************************************ called from: item_use - spell* *********************************************************************** */
int detect_items( int pow );int detect_traps( int pow );
// last updated 24may2000 {dlb}/* ************************************************************************ called from: ability - food - it_use2 - spell* returns TRUE if a stat was restored.* *********************************************************************** */
// last updated 24may2000 {dlb}/* ************************************************************************ called from: ability - religion - spell* *********************************************************************** */
// last updated 24may2000 {dlb}/* ************************************************************************ called from: ability - spell* *********************************************************************** */
// last updated 24may2000 {dlb}/* ************************************************************************ called from: ability - spell* *********************************************************************** */
// Used to just be visible screen:// if (etx > you.x_pos - 15 && etx < you.x_pos + 15// && ety > you.y_pos - 8 && ety < you.y_pos + 8)if (grid_distance( you.x_pos, you.y_pos, etx, ety ) < range)
if (grid_distance( you.pos(), p) < range&& grd(p) == DNGN_UNDISCOVERED_TRAP)
grd[ etx ][ ety ] = trap_category( env.trap[count_x].type );set_envmap_obj(etx, ety, grd[etx][ety]);set_terrain_mapped(etx, ety);}
grd(p) = trap_category( env.trap[i].type );set_envmap_obj(p, grd(p));set_terrain_mapped(p);
for (int i = you.x_pos - map_radius; i < you.x_pos + map_radius; i++)for (int j = you.y_pos - map_radius; j < you.y_pos + map_radius; j++){if (!in_bounds(i, j))continue;
for ( radius_iterator ri(you.pos(), map_radius, true, false); ri; ++ri ){
// Don't expose new dug out areas:// Note: assumptions are being made here about how// terrain can change (eg it used to be solid, and// thus item free).if (is_terrain_changed(i, j))continue;
// Don't expose new dug out areas:// Note: assumptions are being made here about how// terrain can change (eg it used to be solid, and// thus item free).if (is_terrain_changed(*ri))continue;
if (igrd[i][j] != NON_ITEM&& (!get_envmap_obj(i, j) || !is_envmap_item(i, j))){items_found++;set_envmap_obj(i, j, DNGN_ITEM_DETECTED);set_envmap_detected_item(i, j);
if (igrd(*ri) != NON_ITEM&& (!get_envmap_obj(*ri) || !is_envmap_item(*ri))){items_found++;set_envmap_obj(*ri, DNGN_ITEM_DETECTED);set_envmap_detected_item(*ri);
// Don't replace previously seen items with an unseen one.if (!is_terrain_seen(i,j))tile_place_tile_bk(i, j, TILE_UNSEEN_ITEM);
// Don't replace previously seen items with an unseen one.if (!is_terrain_seen(*ri))tile_place_tile_bk(ri->x, ri->y, TILE_UNSEEN_ITEM);
if (map_bounds(gx, gy) && !is_terrain_changed(gx, gy)&& mon->can_pass_through_feat(grd[gx][gy]))
if (map_bounds(place) && !is_terrain_changed(place)&& mon->can_pass_through_feat(grd(place)))
set_envmap_obj(gridx, gridy, mon->type + DNGN_START_OF_MONSTERS);set_envmap_detected_mons(gridx, gridy);
set_envmap_obj(where, mon->type + DNGN_START_OF_MONSTERS);set_envmap_detected_mons(where);
for (int i = you.x_pos - map_radius; i < you.x_pos + map_radius; i++)for (int j = you.y_pos - map_radius; j < you.y_pos + map_radius; j++)
for (radius_iterator ri(you.pos(), map_radius, true, false); ri; ++ri){if (mgrd(*ri) != NON_MONSTER)
if (mgrd[i][j] != NON_MONSTER)
_mark_detected_creature(*ri, mon, fuzz_chance, fuzz_radius);// Assuming that highly intelligent spellcasters can// detect scrying. -- bwrif (mons_intel( mon->type ) == I_HIGH&& mons_class_flag( mon->type, M_SPELLCASTER ))
monsters *mon = &menv[ mgrd[i][j] ];creatures_found++;_mark_detected_creature(i, j, mon, fuzz_chance, fuzz_radius);// Assuming that highly intelligent spellcasters can// detect scrying. -- bwrif (mons_intel( mon->type ) == I_HIGH&& mons_class_flag( mon->type, M_SPELLCASTER )){behaviour_event( mon, ME_DISTURB, MHITYOU, you.pos() );}
behaviour_event( mon, ME_DISTURB, MHITYOU, you.pos() );
char minx = you.x_pos - 6;char maxx = you.x_pos + 7;char miny = you.y_pos - 6;char maxy = you.y_pos + 7;char xinc = 1;char yinc = 1;
int minx = you.pos().x - 6;int maxx = you.pos().x + 7;int miny = you.pos().y - 6;int maxy = you.pos().y + 7;int xinc = 1;int yinc = 1;
else if ((grd[targ_x][targ_y] == DNGN_DEEP_WATER|| grd[targ_x][targ_y] == DNGN_SHALLOW_WATER|| grd[targ_x][targ_y] == DNGN_FOUNTAIN_BLUE)
else if ((grd(targ) == DNGN_DEEP_WATER|| grd(targ) == DNGN_SHALLOW_WATER|| grd(targ) == DNGN_FOUNTAIN_BLUE)
mgen_data(mon,friendly ? BEH_FRIENDLY : BEH_HOSTILE,dur, coord_def(targ_x, targ_y),friendly ? you.pet_target : MHITYOU,0, god)) == -1)
mgen_data(mon, friendly ? BEH_FRIENDLY : BEH_HOSTILE,dur, targ, friendly ? you.pet_target : MHITYOU, 0, god))== -1)
// last updated 24may2000 {dlb}/* ************************************************************************ called from: beam - it_use3 - spells - spells1* *********************************************************************** */void big_cloud(cloud_type cl_type, kill_category whose, int cl_x, int cl_y,
void big_cloud(cloud_type cl_type, kill_category whose, const coord_def& where,
int cl_x, int cl_y, int pow, int size, int spread_rate = -1);// last updated 24may2000 {dlb}/* ************************************************************************ called from: acr (WIZARD only) - item_use - spell* *********************************************************************** */int blink(int pow, bool high_level_controlled_blink,bool wizard_blink = false);
const coord_def& where, int pow, int size, int spread_rate = -1);
// last updated 24may2000 {dlb}/* ************************************************************************ called from: acr (WIZARD only) - item_use - spell* *********************************************************************** */
const int ystart = MAX(0, you.y_pos - 9);const int yend = MIN(GYM - 1, you.y_pos + 9);const int xstart = MAX(0, you.x_pos - 9);const int xend = MIN(GXM - 1, you.x_pos + 9);
for ( radius_iterator ri(you.pos(), 9); ri; ++ri ){if ( mgrd(*ri) == NON_MONSTER )continue;
// monster checkfor (int y = ystart; y <= yend; ++y){for (int x = xstart; x <= xend; ++x)
monsters *monster = &menv[mgrd(*ri)];if (is_orcish_follower(monster))
const unsigned short targ_monst = mgrd[x][y];if (targ_monst != NON_MONSTER)
num_followers++;if (mons_player_visible(monster)&& !mons_is_sleeping(monster)&& !mons_is_confused(monster)&& !mons_cannot_act(monster))
monsters *monster = &menv[targ_monst];if (is_orcish_follower(monster)){num_followers++;
const int hd = monster->hit_dice;
if (mons_player_visible(monster)&& !mons_is_sleeping(monster)&& !mons_is_confused(monster)&& !mons_cannot_act(monster)){const int hd = monster->hit_dice;// During penance followers get a saving throw.if (random2((you.piety-you.penance[GOD_BEOGH])/18) +random2(you.skills[SK_INVOCATIONS]-6)> random2(hd) + hd + random2(5)){continue;}
// During penance followers get a saving throw.if (random2((you.piety-you.penance[GOD_BEOGH])/18) +random2(you.skills[SK_INVOCATIONS]-6)> random2(hd) + hd + random2(5)){continue;}
monster->attitude = ATT_HOSTILE;behaviour_event(monster, ME_ALERT, MHITYOU);// For now CREATED_FRIENDLY stays.
monster->attitude = ATT_HOSTILE;behaviour_event(monster, ME_ALERT, MHITYOU);// For now CREATED_FRIENDLY stays.
{grd[env.trap[which_trap].x][env.trap[which_trap].y]= trap_category(env.trap[which_trap].type);}
grd(trap.pos) = trap_category(trap.type);
// Loop moves beyond those tiles contiguous to parent {dlb}:if (jex > 1)return (false);for (jey = -1; jey < 2; jey++)
if (mgrd(*ai) == NON_MONSTER&& parent->can_pass_through(*ai)&& (*ai != you.pos()))
// 10-50 for now - must take clouds into account:if (mgrd[parent->x + jex][parent->y + jey] == NON_MONSTER&& parent->can_pass_through(parent->x + jex, parent->y + jey)&& (parent->x + jex != you.x_pos || parent->y + jey != you.y_pos)){foundSpot = true;break;}
if ( one_chance_in(++num_spots) )child_spot = *ai;
if (mgrd[temp_x][temp_y] == NON_MONSTER&& _habitat_okay( monster, grd[temp_x][temp_y] )){// Found an appropiate space... check if we// switch the current choice to this one.num_found++;if (one_chance_in(num_found)){loc_x = temp_x;loc_y = temp_y;}}}}
int ystart = 0;int xstart = 0;int yend = GXM - 1;int xend = GYM - 1;if (near_by)
// A radius_iterator with radius == max(GXM,GYM) will sweep the whole// level.radius_iterator ri(you.pos(), near_by ? 9 : std::max(GXM,GYM),true, in_sight);for ( ; ri; ++ri )
ystart = MAX(0, you.y_pos - 9);xstart = MAX(0, you.x_pos - 9);yend = MIN(GYM - 1, you.y_pos + 9);xend = MIN(GXM - 1, you.x_pos + 9);}// Monster check.for ( int y = ystart; y <= yend; ++y ){for ( int x = xstart; x <= xend; ++x )
if ( mgrd(*ri) != NON_MONSTER )
monsters *mon = &menv[mgrd[x][y]];if (suitable(mon)){// FIXME: if the intent is to favour monsters// named by $DEITY, we should set a flag on the// monster (something like MF_DEITY_PREFERRED) and// use that instead of checking the name, given// that other monsters can also have names.
// FIXME: if the intent is to favour monsters// named by $DEITY, we should set a flag on the// monster (something like MF_DEITY_PREFERRED) and// use that instead of checking the name, given// that other monsters can also have names.
// True, but it's currently only used for orcs, and// Blork and Urug also being preferred to non-named orcs// is fine, I think. Once more gods name followers (and// prefer them) that should be changed, of course. (jpeg)if (prefer_named && mon->is_named()){mons_count += 2;// Named monsters have doubled chances.if (x_chance_in_y(2, mons_count))chosen = mon;}else if (one_chance_in(++mons_count))chosen = mon;}
// True, but it's currently only used for orcs, and// Blork and Urug also being preferred to non-named orcs// is fine, I think. Once more gods name followers (and// prefer them) that should be changed, of course. (jpeg)// Named monsters have doubled chances.int mon_weight = ((prefer_named && mon->is_named()) ? 2 : 1);if ( x_chance_in_y(mon_weight, (weight += mon_weight)) )chosen = mon;
if (abs(dx) > abs(dy)){// Sometimes we'll just move parallel the x axis.if (coinflip())mmov.y = 0;}
// Sometimes we'll just move parallel the x axis.if (abs(delta.x) > abs(delta.y) && coinflip())mmov.y = 0;
if (abs(dy) > abs(dx)){// Sometimes we'll just move parallel the y axis.if (coinflip())mmov.x = 0;}
// Sometimes we'll just move parallel the y axis.if (abs(delta.y) > abs(delta.x) && coinflip())mmov.x = 0;
int dx = sgn(targ->x - monster->x);int dy = sgn(targ->y - monster->y);const int tx = monster->x + dx;const int ty = monster->y + dy;
coord_def diff = targ->pos() - monster->pos();coord_def sg(sgn(diff.x), sgn(diff.y));coord_def t = monster->pos() + sg;
int dx = abs(monster->x - you.x_pos);int dy = abs(monster->y - you.y_pos);if (dx == 2 && dy <= 2 || dy == 2 && dx <= 2){ret = true;monster_attack( monster_index(monster), false );}
ret = true;monster_attack( monster_index(monster), false );
if (monster->target_x == foe_x && monster->target_y == foe_y&& monster->mon_see_grid(foe_pos, true))
if (monster->target == foepos&& monster->mon_see_grid(foepos, true)&& grid_distance(monster->pos(), foepos) == 2)
int dx = abs(monster->x - foe_x);int dy = abs(monster->y - foe_y);if (dx == 2 && dy <= 2 || dy == 2 && dx <= 2){ret = true;monsters_fight(monster_index(monster), monster->foe, false);}
ret = true;monsters_fight(monster_index(monster), monster->foe, false);
&& ( beem.target_x == you.x_pos && beem.target_y == you.y_pos&& you.caught()|| mgrd[beem.target_x][beem.target_y] != NON_MONSTER&& mons_is_caught(&menv[mgrd[beem.target_x][beem.target_y]]) ))
&& ( beem.target == you.pos() && you.caught()|| mgrd(beem.target) != NON_MONSTER&& mons_is_caught(&menv[mgrd(beem.target)])))
if (monster_can_submerge(monster, grd[monster->x][monster->y])&& env.cgrid[monster->x][monster->y] != EMPTY_CLOUD)
if (monster_can_submerge(monster, grd(monster->pos()))&& env.cgrid(monster->pos()) != EMPTY_CLOUD)
const int targ_x = monster->x + count_x - 1;const int targ_y = monster->y + count_y - 1;// Bounds check - don't consider moving out of grid!if (targ_x < 0 || targ_x >= GXM || targ_y < 0 || targ_y >= GYM){good_move[count_x][count_y] = false;continue;}dungeon_feature_type target_grid = grd[targ_x][targ_y];
const int targ_x = monster->pos().x + count_x - 1;const int targ_y = monster->pos().y + count_y - 1;// Bounds check - don't consider moving out of grid!if (targ_x < 0 || targ_x >= GXM || targ_y < 0 || targ_y >= GYM){good_move[count_x][count_y] = false;continue;}dungeon_feature_type target_grid = grd[targ_x][targ_y];
if (target_grid == DNGN_DEEP_WATER)deep_water_available = true;const monsters* mons = dynamic_cast<const monsters*>(monster);good_move[count_x][count_y] =_mon_can_move_to_pos(mons, coord_def(count_x-1, count_y-1));
if (target_grid == DNGN_DEEP_WATER)deep_water_available = true;const monsters* mons = dynamic_cast<const monsters*>(monster);good_move[count_x][count_y] =_mon_can_move_to_pos(mons, coord_def(count_x-1, count_y-1));
dist[i] = grid_distance(monster->x + compass_x[newdir],monster->y + compass_y[newdir],monster->target_x,monster->target_y);
dist[i] = grid_distance(monster->pos().x + compass_x[newdir],monster->pos().y + compass_y[newdir],monster->target.x,monster->target.y);
// Try and find a random floor space some distance away.for (i = 0; i < 50; i++){tx = 5 + random2( GXM - 10 );ty = 5 + random2( GYM - 10 );
// Don't drop on anything but vanilla floor right now.if (grd(*ai) != DNGN_FLOOR)continue;
for (i = -1; i <= 1; i++)for (j = -1; j <= 1; j++){tx = x + i;ty = y + j;if (!inside_level_bounds(tx, ty))continue;// Don't drop on anything but vanilla floor right now.if (grd[tx][ty] != DNGN_FLOOR)continue;if (mgrd[tx][ty] != NON_MONSTER)continue;if (tx == you.x_pos && ty == you.y_pos)continue;if (one_chance_in(++count)){nx = tx;ny = ty;found_move = true;}}if (found_move)
if (count > 0)
const int mon_index = mgrd[mon->x][mon->y];mgrd[mon->x][mon->y] = NON_MONSTER;mgrd[nx][ny] = mon_index;mon->x = nx;mon->y = ny;
const int mon_index = mgrd(mon->pos());mgrd(mon->pos()) = NON_MONSTER;mgrd(result) = mon_index;mon->moveto(result);
// last updated 12may2000 {dlb}/* ************************************************************************ called from: misc - monplace - spells3* *********************************************************************** */bool empty_surrounds( int emx, int emy, dungeon_feature_type spc_wanted,int radius,bool allow_centre, FixedVector<char, 2>& empty );
bool empty_surrounds( const coord_def& where, dungeon_feature_type spc_wanted,int radius, bool allow_centre, coord_def& empty );
if (empty_surrounds( p.x, p.y, spcw, 2, true, empty )){pos.x = empty[0];pos.y = empty[1];}
if (empty_surrounds( p, spcw, 2, true, empty ))pos = empty;
bool empty_surrounds(int emx, int emy, dungeon_feature_type spc_wanted,int radius, bool allow_centre,FixedVector < char, 2 > &empty)
bool empty_surrounds(const coord_def& where, dungeon_feature_type spc_wanted,int radius, bool allow_centre, coord_def& empty)
int count_x, count_y;for (count_x = -radius; count_x <= radius; count_x++)for (count_y = -radius; count_y <= radius; count_y++){success = false;if (!allow_centre && count_x == 0 && count_y == 0)continue;
if (mgrd[tx][ty] != NON_MONSTER)continue;// Players won't summon out of LOS, or past transparent walls.if (!see_grid_no_trans(tx, ty) && playerSummon)continue;if (grd[tx][ty] == spc_wanted)success = true;if (grid_compatible(spc_wanted, grd[tx][ty]))success = true;
success =(grd(*ri) == spc_wanted) || grid_compatible(spc_wanted, grd(*ri));if (success && one_chance_in(++good_count))empty = *ri;}
if (success && one_chance_in(++good_count)){empty[0] = tx;empty[1] = ty;}}
ac(0), ev(0), speed(0), speed_increment(0), x(0), y(0),target_x(0), target_y(0), patrol_point(0, 0), travel_target(MTRAV_NONE),
ac(0), ev(0), speed(0), speed_increment(0),target(0,0), patrol_point(0, 0), travel_target(MTRAV_NONE),
if (in_bounds(pos) && mgrd(pos) == NON_MONSTER&& monster_can_submerge(mon, grd(pos))){if (one_chance_in(++okay_squares))target_square = pos;}}
for ( adjacent_iterator ai; ai; ++ai )if (mgrd(*ai) == NON_MONSTER && monster_can_submerge(mon, grd(*ai)))if (one_chance_in(++okay_squares))target_square = *ai;
for (pos.x = you.x_pos - 1; pos.x <= you.x_pos + 1; ++pos.x)for (pos.y = you.y_pos - 1; pos.y <= you.y_pos + 1; ++pos.y)
for ( adjacent_iterator ai; ai; ++ai ){if (mgrd(*ai) == NON_MONSTER&& monster_habitable_grid(mon, grd(*ai))&& trap_type_at_xy(*ai) == NUM_TRAPS)
if (pos == you.pos())continue;if (in_bounds(pos) && mgrd(pos) == NON_MONSTER&& monster_habitable_grid(mon, grd(pos))&& trap_type_at_xy(pos) == NUM_TRAPS){if (one_chance_in(++okay_squares))target_square = pos;}
if (one_chance_in(++okay_squares))target_square = *ai;
// last updated 08jan2001 {gdl}/* ************************************************************************ called from: ability - decks - fight - it_use2 - spells1* *********************************************************************** */
// last updated 12may2000 {dlb}/* ************************************************************************ called from: acr - effects - spells3* *********************************************************************** */
// Created Sept 1, 2000 -- bwr/* ************************************************************************ called from: acr misc* *********************************************************************** */void merfolk_start_swimming(void);// last updated 12may2000 {dlb}/* ************************************************************************ called from: acr - misc - player - stuff* *********************************************************************** */void new_level(void);
void merfolk_start_swimming();void new_level();
// last updated 12may2000 {dlb}/* ************************************************************************ called from: delay* *********************************************************************** */
ASSERT(blood.x >= 0 && blood.y >= 0);for (int o = igrd[blood.x][blood.y]; o != NON_ITEM; o = mitm[o].link)
ASSERT(blood.pos.x >= 0 && blood.pos.y >= 0);for (int o = igrd[blood.pos.x][blood.pos.y]; o != NON_ITEM; o = mitm[o].link)
for (int srx = you.x_pos - max_dist; srx <= you.x_pos + max_dist; ++srx)for (int sry = you.y_pos - max_dist; sry <= you.y_pos + max_dist; ++sry)
for (radius_iterator ri(you.pos(), max_dist); ri; ++ri ){// Must have LOS, with no translucent walls in the way.if (see_grid_no_trans(*ri))
// Must have LOS, with no translucent walls in the way.if (see_grid_no_trans(srx, sry)){// Maybe we want distance() instead of grid_distance()?int dist = grid_distance(srx, sry, you.x_pos, you.y_pos);
// Maybe we want distance() instead of grid_distance()?int dist = grid_distance(*ri, you.pos());// Don't exclude own square; may be levitating.// XXX: Currently, levitating over a trap will always detect it.if (dist == 0)++dist;
// Don't exclude own square; may be levitating.// XXX: Currently, levitating over a trap will always detect it.if (dist == 0)++dist;
// Making this harsher by removing the old +1...int effective = you.skills[SK_TRAPS_DOORS] / (2*dist - 1);
// Making this harsher by removing the old +1...int effective = you.skills[SK_TRAPS_DOORS] / (2*dist - 1);
if (grd(*ri) == DNGN_SECRET_DOOR && x_chance_in_y(effective+1, 17)){mpr("You found a secret door!");reveal_secret_door(*ri);exercise(SK_TRAPS_DOORS, (coinflip() ? 2 : 1));}else if (grd(*ri) == DNGN_UNDISCOVERED_TRAP&& x_chance_in_y(effective + 1, 17)){const int i = trap_at_xy(*ri);
i = trap_at_xy(coord_def(srx, sry));if (i != -1){grd[srx][sry] = trap_category(env.trap[i].type);mpr("You found a trap!");learned_something_new(TUT_SEEN_TRAP, srx, sry);exercise(SK_TRAPS_DOORS, (coinflip() ? 2 : 1));}else{// Maybe we shouldn't kill the trap for debugging// purposes - oh well.grd[srx][sry] = DNGN_FLOOR;
// Maybe we shouldn't kill the trap for debugging// purposes - oh well.grd(*ri) = DNGN_FLOOR;
lp.id = new_level_id;lp.pos.x = you.x_pos;lp.pos.y = you.y_pos;
lp.id = new_level_id;lp.pos = you.pos();
dungeon_feature_type door = grid_secret_door_appearance(coord_def(x, y));grd[x][y] = grid_is_opaque(door) ?DNGN_CLOSED_DOOR : DNGN_OPEN_DOOR;
dungeon_feature_type door = grid_secret_door_appearance(p);grd(p) = grid_is_opaque(door) ? DNGN_CLOSED_DOOR : DNGN_OPEN_DOOR;
LUARET1(you_x_pos, number, you.x_pos)LUARET1(you_y_pos, number, you.y_pos)LUARET2(you_pos, number, you.x_pos, you.y_pos)
LUARET1(you_x_pos, number, you.pos().x)LUARET1(you_y_pos, number, you.pos().y)LUARET2(you_pos, number, you.pos().x, you.pos().y)
for (int x = 5; x < GXM; x++)for (int y = 5; y < GYM; y++){// 1. Not near player!if (x > you.x_pos - 9 && x < you.x_pos + 9&& y > you.y_pos - 9 && y < you.y_pos + 9){continue;}
for ( rectangle_iterator ri(1); ri; ++ri ){if ( grid_distance( you.pos(), *ri ) <= 9 )continue;
int next;// Iterate through the grids list of items.for (int item = igrd[x][y]; item != NON_ITEM; item = next)
for ( stack_iterator si(*ri); si; ++si ){if (_item_ok_to_clean(si->index()) && x_chance_in_y(15, 100))
const item_def& obj(mitm[item]);if (is_fixed_artefact(obj)){// 7. Move uniques to abyss.set_unique_item_status( OBJ_WEAPONS, obj.special,UNIQ_LOST_IN_ABYSS );}else if (is_unrandom_artefact(obj)){// 9. Unmark unrandart.const int z = find_unrandart_index(obj);if (z != -1)set_unrandart_exist(z, false);}// POOF!destroy_item( item );if (first_cleaned == NON_ITEM)first_cleaned = item;
// 7. Move uniques to abyss.set_unique_item_status( OBJ_WEAPONS, si->special,UNIQ_LOST_IN_ABYSS );}else if (is_unrandom_artefact(*si)){// 9. Unmark unrandart.const int z = find_unrandart_index(*si);if (z != -1)set_unrandart_exist(z, false);
const int x_middle = MAX(beam.tx, you.x_pos) - (x_distance / 2);const int y_middle = MAX(beam.ty, you.y_pos) - (y_distance / 2);
const int x_middle = MAX(beam.target.x, you.pos().x) - (x_distance / 2);const int y_middle = MAX(beam.target.y, you.pos().y) - (y_distance / 2);
int distance_from(const coord_def &b) const;bool operator == (const coord_def &other) const{return x == other.x && y == other.y;}bool operator != (const coord_def &other) const{return !operator == (other);}bool operator < (const coord_def &other) const{return (x < other.x) || (x == other.x && y < other.y);}const coord_def &operator += (const coord_def &other){x += other.x;y += other.y;return (*this);}const coord_def &operator += (int offset){x += offset;y += offset;return (*this);}const coord_def &operator -= (const coord_def &other){x -= other.x;y -= other.y;return (*this);}const coord_def &operator -= (int offset){x -= offset;y -= offset;return (*this);}const coord_def &operator /= (int div){x /= div;y /= div;return (*this);}const coord_def &operator *= (int mul){x *= mul;y *= mul;return (*this);}coord_def operator + (const coord_def &other) const{coord_def copy = *this;return (copy += other);}coord_def operator + (int other) const{coord_def copy = *this;return (copy += other);}coord_def operator - (const coord_def &other) const{coord_def copy = *this;return (copy -= other);}coord_def operator - (int other) const{coord_def copy = *this;return (copy -= other);}coord_def operator / (int div) const{coord_def copy = *this;return (copy /= div);}coord_def operator * (int mul) const{coord_def copy = *this;return (copy *= mul);}int abs() const{return (x * x + y * y);}int rdist() const{return (std::max(std::abs(x), std::abs(y)));}bool origin() const{return (!x && !y);}};
virtual coord_def pos() const = 0;
virtual void moveto(const coord_def &c) = 0;virtual const coord_def& pos() const { return position; }virtual coord_def& pos() { return position; }
};struct coord_def{int x;int y;
void set(int xi, int yi){x = xi;y = yi;}void reset(){set(0, 0);}int distance_from(const coord_def &b) const;bool operator == (const coord_def &other) const{return x == other.x && y == other.y;}bool operator != (const coord_def &other) const{return !operator == (other);}bool operator < (const coord_def &other) const{return (x < other.x) || (x == other.x && y < other.y);}const coord_def &operator += (const coord_def &other){x += other.x;y += other.y;return (*this);}const coord_def &operator += (int offset){x += offset;y += offset;return (*this);}const coord_def &operator -= (const coord_def &other){x -= other.x;y -= other.y;return (*this);}const coord_def &operator -= (int offset){x -= offset;y -= offset;return (*this);}const coord_def &operator /= (int div){x /= div;y /= div;return (*this);}const coord_def &operator *= (int mul){x *= mul;y *= mul;return (*this);}coord_def operator + (const coord_def &other) const{coord_def copy = *this;return (copy += other);}coord_def operator + (int other) const{coord_def copy = *this;return (copy += other);}coord_def operator - (const coord_def &other) const{coord_def copy = *this;return (copy -= other);}coord_def operator - (int other) const{coord_def copy = *this;return (copy -= other);}coord_def operator / (int div) const{coord_def copy = *this;return (copy /= div);}coord_def operator * (int mul) const{coord_def copy = *this;return (copy *= mul);}int abs() const{return (x * x + y * y);}int rdist() const{return (std::max(std::abs(x), std::abs(y)));}bool origin() const{return (!x && !y);}};
monster_index(mon), range, long_time, mon->x, mon->y,mon->foe, mon->target_x, mon->target_y, mon->flags );
monster_index(mon), range, long_time, mon->pos().x, mon->pos().y,mon->foe, mon->target.x, mon->target.y, mon->flags );
for (int i = -1; i <= 1; i++){for (int j = -1; j <= 1; j++){if (is_bloodcovered(coord_def(x+i,y+j))&& one_chance_in(5)){env.map[x+i][y+j].property = FPROP_NONE;}}}return;
for ( adjacent_iterator ai(where); ai; ++ai )if (is_bloodcovered(*ai) && one_chance_in(5))env.map(*ai).property = FPROP_NONE;break;
if (grd[cx][cy] >= DNGN_DRY_FOUNTAIN_BLUE&& grd[cx][cy] < DNGN_PERMADRY_FOUNTAIN){_maybe_restart_fountain_flow(cx, cy, fountain_checks);}
_maybe_restart_fountain_flow(*ri, fountain_checks);
bool place_specific_trap(int spec_x, int spec_y, trap_type spec_type);void place_spec_shop(int level_number, int shop_x, int shop_y,
bool place_specific_trap(const coord_def& where, trap_type spec_type);void place_spec_shop(int level_number, const coord_def& where,
for (int x = 1; x < GXM; x++)for (int y = 1; y < GYM; y++){if (grd[x][y] >= DNGN_STONE_STAIRS_UP_I&& grd[x][y] <= DNGN_ESCAPE_HATCH_UP)
for ( rectangle_iterator ri(1); ri; ++ri ){if (grd(*ri) >= DNGN_STONE_STAIRS_UP_I&& grd(*ri) <= DNGN_ESCAPE_HATCH_UP)
if (grd[x][y] == DNGN_STONE_STAIRS_UP_I){env.markers.add(new map_feature_marker(coord_def(x,y),grd[x][y]));}grd[x][y] = exit;
if (grd(*ri) == DNGN_STONE_STAIRS_UP_I)env.markers.add(new map_feature_marker(*ri, grd(*ri)));grd(*ri) = exit;
for (int x = 1; x < GXM; x++)for (int y = 1; y < GYM; y++)if (grd[x][y] >= DNGN_STONE_STAIRS_DOWN_I&& grd[x][y] <= DNGN_ESCAPE_HATCH_UP){grd[x][y] = DNGN_FLOOR;}
for (rectangle_iterator ri(1); ri; ++ri){if (grd(*ri) >= DNGN_STONE_STAIRS_DOWN_I&& grd(*ri) <= DNGN_ESCAPE_HATCH_UP){grd(*ri) = DNGN_FLOOR;}}
for (int x = 1; x < GXM; x++)for (int y = 1; y < GYM; y++)if (grd[x][y] >= DNGN_STONE_STAIRS_DOWN_I&& grd[x][y] <= DNGN_ESCAPE_HATCH_DOWN){grd[x][y] = DNGN_ESCAPE_HATCH_UP;}
for (rectangle_iterator ri(1); ri; ++ri){if (grd(*ri) >= DNGN_STONE_STAIRS_DOWN_I&& grd(*ri) <= DNGN_ESCAPE_HATCH_DOWN){grd(*ri) = DNGN_ESCAPE_HATCH_UP;}}
// First check horizontal neighbouring squares.if ((!inside_level_bounds(x-1, y) || grd[x-1][y] < DNGN_SHALLOW_WATER)&& (!inside_level_bounds(x+1, y) || grd[x+1][y] < DNGN_SHALLOW_WATER))
const coord_def adjs[] = { coord_def(-1,0), coord_def(1,0),coord_def(0,-1), coord_def(0,1) };for ( unsigned int i = 0; i < ARRAYSZ(adjs); ++i )
// Now check vertical neighbouring squares.if ((!inside_level_bounds(x, y-1) || grd[x][y-1] < DNGN_SHALLOW_WATER)&& (!inside_level_bounds(x, y+1) || grd[x][y+1] < DNGN_SHALLOW_WATER)){return (true);}// No corridor found.
case 0:// go up from north edgecx = sr.x1 + (random2(sr.x2 - sr.x1));cy = sr.y1;dx = 0;dy = -1;break;case 1:// go down from south edgecx = sr.x1 + (random2(sr.x2 - sr.x1));cy = sr.y2;dx = 0;dy = 1;break;case 2:// go left from west edgecy = sr.y1 + (random2(sr.y2 - sr.y1));cx = sr.x1;dx = -1;dy = 0;break;case 3:// go right from east edgecy = sr.y1 + (random2(sr.y2 - sr.y1));cx = sr.x2;dx = 1;dy = 0;break;}
is_ok = true;
sx = cx;sy = cy;
// Set direction.switch (random2(4)){case 0:// go up from north edgec.set( random_range(sr.tl.x, sr.br.x - 1), sr.tl.y );delta.set(0, -1);break;case 1:// go down from south edgec.set( random_range(sr.tl.x, sr.br.x - 1), sr.br.y );delta.set(0, 1);break;case 2:// go left from west edgec.set( sr.tl.x, random_range(sr.tl.y, sr.br.y - 1) );delta.set(-1, 0);break;case 3:// go right from east edgec.set( sr.br.x, random_range(sr.tl.y, sr.br.y - 1) );delta.set( 1, 0);break;}
// look around for floorif (i > 0){if (grd[sx + 1][sy] == DNGN_FLOOR)break;if (grd[sx][sy + 1] == DNGN_FLOOR)break;if (grd[sx - 1][sy] == DNGN_FLOOR)break;if (grd[sx][sy - 1] == DNGN_FLOOR)
// Quit if we run off the map before finding floor.if (!in_bounds(s)){is_ok = false;
for (y = sr.y1; y <= sr.y2; ++y){// Avoid the boss (or anyone else we may have dropped already).if (mgrd[x][y] != NON_MONSTER)continue;
// Avoid the boss (or anyone else we may have dropped already).if (mgrd(*ri) != NON_MONSTER)continue;
// Run through the cumulative chances and place a monster.for (i = 0; i < num_types; ++i)
// Run through the cumulative chances and place a monster.for (i = 0; i < num_types; ++i){if (roll < pit_list[i].rare)
if (roll < pit_list[i].rare){mons_place(mgen_data::sleeper_at(pit_list[i].type,coord_def(x, y)));break;}
mons_place(mgen_data::sleeper_at(pit_list[i].type, *ri));break;
for (x = sr.x1; x <= sr.x2; x++)for (y = sr.y1; y <= sr.y2; y++){if (one_chance_in(4))continue;mons_place(mgen_data::sleeper_at( mons_alloc[random2(10)],coord_def(x, y) ));}
for (rectangle_iterator ri(sr.tl, sr.br); ri; ++ri)if (!one_chance_in(4))mons_place(mgen_data::sleeper_at(mons_alloc[random2(10)], *ri));
for (x = sr.x1; x <= sr.x2; x++)for (y = sr.y1; y <= sr.y2; y++){if (one_chance_in(4))continue;
for ( rectangle_iterator ri(sr.tl, sr.br); ri; ++ri )if ( *ri != lordpos && !one_chance_in(4) )mons_place(mgen_data::sleeper_at(mons_alloc[random2(10)], *ri));
// We'll put the boss down later.if (x == lordx && y == lordy)continue;mons_place(mgen_data::sleeper_at( mons_alloc[random2(10)],coord_def(x, y) ));}
obj_type = ((temp_rand > 8) ? OBJ_WEAPONS : // 2 in 11(temp_rand > 6) ? OBJ_ARMOUR : // 2 in 11(temp_rand > 5) ? OBJ_MISSILES : // 1 in 11(temp_rand > 4) ? OBJ_WANDS : // 1 in 11(temp_rand > 3) ? OBJ_SCROLLS : // 1 in 11(temp_rand > 2) ? OBJ_JEWELLERY : // 1 in 11(temp_rand > 1) ? OBJ_BOOKS : // 1 in 11(temp_rand > 0) ? OBJ_STAVES // 1 in 11: OBJ_POTIONS); // 1 in 11
obj_type = ((temp_rand > 8) ? OBJ_WEAPONS : // 2 in 11(temp_rand > 6) ? OBJ_ARMOUR : // 2 in 11(temp_rand > 5) ? OBJ_MISSILES : // 1 in 11(temp_rand > 4) ? OBJ_WANDS : // 1 in 11(temp_rand > 3) ? OBJ_SCROLLS : // 1 in 11(temp_rand > 2) ? OBJ_JEWELLERY : // 1 in 11(temp_rand > 1) ? OBJ_BOOKS : // 1 in 11(temp_rand > 0) ? OBJ_STAVES // 1 in 11: OBJ_POTIONS); // 1 in 11
mgen_data::sleeper_at(MONS_GUARDIAN_NAGA,coord_def(sr.x1 + random2( sr.x2 - sr.x1 ),sr.y1 + random2( sr.y2 - sr.y1 )),MG_PATROLLING ));
mgen_data::sleeper_at( MONS_GUARDIAN_NAGA, sr.random_spot(),MG_PATROLLING ));
for (x = sr.x1; x <= sr.x2; x++)for (y = sr.y1; y <= sr.y2; y++){if (coinflip())continue;const int i = get_item_slot();if (i == NON_ITEM)continue;mitm[i].quantity = 1;mitm[i].base_type = OBJ_FOOD;mitm[i].sub_type = (one_chance_in(25) ? FOOD_ROYAL_JELLY: FOOD_HONEYCOMB);mitm[i].x = x;mitm[i].y = y;
item_def& item(mitm[i]);item.quantity = 1;item.base_type = OBJ_FOOD;item.sub_type = (one_chance_in(25) ? FOOD_ROYAL_JELLY : FOOD_HONEYCOMB);item.pos = *ri;item_colour( item );}
for (x = sr.x1; x <= sr.x2; x++)for (y = sr.y1; y <= sr.y2; y++){if (x == queenx && y == queeny)continue;
for ( rectangle_iterator ri(sr.tl, sr.br); ri; ++ri ){if (*ri == queenpos)continue;
// The hive is chock full of bees!mons_place(mgen_data::sleeper_at(one_chance_in(7) ? MONS_KILLER_BEE_LARVA: MONS_KILLER_BEE,coord_def(x, y),MG_PATROLLING));}mons_place(mgen_data::sleeper_at(MONS_QUEEN_BEE,coord_def(queenx, queeny ),MG_PATROLLING));
// The hive is chock full of bees!mons_place(mgen_data::sleeper_at(one_chance_in(7) ? MONS_KILLER_BEE_LARVA: MONS_KILLER_BEE,*ri, MG_PATROLLING));}mons_place(mgen_data::sleeper_at(MONS_QUEEN_BEE, queenpos, MG_PATROLLING));
for (int vx = v1x; vx < v1x + place.size.x; vx++)for (int vy = v1y; vy < v1y + place.size.y; vy++)
for (rectangle_iterator ri(v1, v1 + place.size); ri; ++ri){const coord_def vdelta = *ri - v1;// FIXME: why the y and x swap?const int feat = vgrid[vdelta.y][vdelta.x];if (feat == ' ')continue;const dungeon_feature_type oldgrid = grd(*ri);altar_count = _vault_grid( place,level_number, *ri,altar_count,acq_item_class,feat, target_connections,num_runes );if (!building_level)
const int feat = vgrid[vy - v1y][vx - v1x];if (feat == ' ')continue;const dungeon_feature_type oldgrid = grd[vx][vy];altar_count = _vault_grid( place,level_number, vx, vy,altar_count,acq_item_class,feat, target_connections,num_runes );if (!building_level){link_items();const dungeon_feature_type newgrid = grd[vx][vy];grd[vx][vy] = oldgrid;dungeon_terrain_changed(coord_def(vx, vy), newgrid, true, true);env.markers.remove_markers_at(coord_def(vx, vy), MAT_ANY);}
link_items();const dungeon_feature_type newgrid = grd(*ri);grd(*ri) = oldgrid;dungeon_terrain_changed(*ri, newgrid, true, true);env.markers.remove_markers_at(*ri, MAT_ANY);
for (vx = place.pos.x; vx < place.pos.x + place.size.x; vx++)for (vy = place.pos.y; vy < place.pos.y + place.size.y; vy++){if (vgrid[vy][vx] == ' ')continue;
for ( rectangle_iterator ri(place.pos, place.pos + place.size); ri; ++ri ){if (vgrid[ri->x][ri->y] == ' ')continue;
const dungeon_feature_type oldgrid = grd[vx][vy];altar_count = _vault_grid( place,level_number, vx, vy, altar_count,acq_item_class,vgrid[vy][vx],target_connections,num_runes,rune_subst );if (!generating_level){// Have to link items each square at a time, or// dungeon_terrain_changed could blow up.link_items();const dungeon_feature_type newgrid = grd[vx][vy];grd[vx][vy] = oldgrid;dungeon_terrain_changed(coord_def(vx, vy), newgrid,true, true);env.markers.remove_markers_at(coord_def(vx, vy), MAT_ANY);}
const dungeon_feature_type oldgrid = grd(*ri);altar_count = _vault_grid( place, level_number, *ri, altar_count,acq_item_class,vgrid[ri->x][ri->y],target_connections,num_runes,rune_subst );if (!generating_level){// Have to link items each square at a time, or// dungeon_terrain_changed could blow up.link_items();const dungeon_feature_type newgrid = grd(*ri);grd(*ri) = oldgrid;dungeon_terrain_changed(*ri, newgrid, true, true);env.markers.remove_markers_at(*ri, MAT_ANY);
if (grd[x][y] == DNGN_DEEP_WATER)grd[x][y] = DNGN_SHALLOW_WATER;else if (grd[x][y] <= DNGN_MINMOVE || grd[x][y] == DNGN_LAVA)grd[x][y] = DNGN_FLOOR;
if (grd(where) == DNGN_DEEP_WATER)grd(where) = DNGN_SHALLOW_WATER;else if (grd(where) <= DNGN_MINMOVE || grd(where) == DNGN_LAVA)grd(where) = DNGN_FLOOR;
int monster_level, int vx, int vy, bool force_pos,bool generate_awake, bool patrolling)
int monster_level, const coord_def& where,bool force_pos, bool generate_awake, bool patrolling)
&& (vx == place.pos.x || vy == place.pos.y|| vx == place.pos.x + place.size.x - 1|| vy == place.pos.y + place.size.y - 1))
&& (where.x == place.pos.x || where.y == place.pos.y|| where.x == place.pos.x + place.size.x - 1|| where.y == place.pos.y + place.size.y - 1))
grd[x][y] = feature;if (needs_update && is_terrain_seen(coord_def(x,y))){set_envmap_obj(x, y, feature);
set_envmap_obj(*ri, feature);
if (_need_varied_selection(env.shop[i].type) && !is_artefact(mitm[orb]))stocked[mitm[orb].sub_type]++;
if (_need_varied_selection(env.shop[i].type) && !is_artefact(item))stocked[item.sub_type]++;
for (x_count = ta1_x; x_count < ta2_x; x_count++)for (y_count = ta1_y; y_count < ta2_y; y_count++){if (grd[x_count][y_count] != DNGN_FLOOR || coinflip())continue;
// Gah. FIXME.coord_def tl(ta1_x, ta1_y);coord_def br(ta2_x-1, ta2_y-1);for (rectangle_iterator ri(tl, br); ri; ++ri){if (grd(*ri) != DNGN_FLOOR || coinflip())continue;
sr.x1 = 8 + random2(30);sr.y1 = 8 + random2(22);sr.x2 = sr.x1 + 20 + random2(10);sr.y2 = sr.y1 + 20 + random2(8);
sr.tl.set(8 + random2(30), 8 + random2(22));sr.br.set(20 + random2(10), 20 + random2(8));sr.br += sr.tl;
_replace_area(sr.x1, sr.y1, sr.x2, sr.y2, DNGN_ROCK_WALL, type_floor);_replace_area(sr.x1, sr.y1, sr.x2, sr.y2, DNGN_CLOSED_DOOR, type_floor);
_replace_area(sr.tl, sr.br, DNGN_ROCK_WALL, type_floor);_replace_area(sr.tl, sr.br, DNGN_CLOSED_DOOR, type_floor);
for (i = sr.x1; i <= sr.x2; i++)for (j = sr.y1; j <= sr.y2; j++){if (grd[i][j] == target)grd[i][j] = (((i + j) % 2) ? floor2 : floor1);}
for ( rectangle_iterator ri(sr.tl, sr.br); ri; ++ri )if (grd(*ri) == target)grd(*ri) = ((ri->x + ri->y) % 2) ? floor2 : floor1;
pos[0] = rox1[i]; // - 1;pos[1] = roy1[i] + random2(roy2[i] - roy1[i]);jpos[0] = rox2[last_room]; // + 1;jpos[1] = roy1[last_room]
pos.x = rox1[i]; // - 1;pos.y = roy1[i] + random2(roy2[i] - roy1[i]);jpos.x = rox2[last_room]; // + 1;jpos.y = roy1[last_room]
pos[1] = roy1[i]; // - 1;pos[0] = rox1[i] + random2(rox2[i] - rox1[i]);jpos[1] = roy2[last_room]; // + 1;jpos[0] = rox1[last_room]
pos.y = roy1[i]; // - 1;pos.x = rox1[i] + random2(rox2[i] - rox1[i]);jpos.y = roy2[last_room]; // + 1;jpos.x = rox1[last_room]
doing = (coinflip()? 1 : 0);if (pos[doing] < jpos[doing])pos[doing]++;else if (pos[doing] > jpos[doing])pos[doing]--;if (grd[pos[0]][pos[1]] == DNGN_ROCK_WALL)grd[pos[0]][pos[1]] = DNGN_FLOOR;
// make a corridorif ( coinflip() ){if ( pos.x < jpos.x )pos.x++;else if ( pos.x > jpos.x )pos.x--;}else{if ( pos.y < jpos.y )pos.y++;else if ( pos.y > jpos.y )pos.y--;}if (grd(pos) == DNGN_ROCK_WALL)grd(pos) = DNGN_FLOOR;
if ((grd[pos[0] + 1][pos[1]] == DNGN_ROCK_WALL&& grd[pos[0] - 1][pos[1]] == DNGN_ROCK_WALL)|| (grd[pos[0]][pos[1] + 1] == DNGN_ROCK_WALL&& grd[pos[0]][pos[1] - 1] == DNGN_ROCK_WALL))
if ((grd[pos.x + 1][pos.y] == DNGN_ROCK_WALL&& grd[pos.x - 1][pos.y] == DNGN_ROCK_WALL)|| (grd[pos.x][pos.y + 1] == DNGN_ROCK_WALL&& grd[pos.x][pos.y - 1] == DNGN_ROCK_WALL))
int temp_rand = 0; // probability determination {dlb}int x,y;
for (rectangle_iterator ri(sr.tl, sr.br); ri; ++ri){if (grd(*ri) == DNGN_FLOOR || grd(*ri) == DNGN_BUILDER_SPECIAL_FLOOR){const int temp_rand = random2(24);const monster_type mon_type =((temp_rand > 11) ? MONS_ZOMBIE_SMALL : // 50.0%(temp_rand > 7) ? MONS_WIGHT : // 16.7%(temp_rand > 3) ? MONS_NECROPHAGE : // 16.7%(temp_rand > 0) ? MONS_WRAITH // 12.5%: MONS_VAMPIRE); // 4.2%
for (x = sr.x1; x <= sr.x2; x++)for (y = sr.y1; y <= sr.y2; y++)if (grd[x][y] == DNGN_FLOOR || grd[x][y] == DNGN_BUILDER_SPECIAL_FLOOR){temp_rand = random2(24);const monster_type mon_type =((temp_rand > 11) ? MONS_ZOMBIE_SMALL : // 50.0%(temp_rand > 7) ? MONS_WIGHT : // 16.7%(temp_rand > 3) ? MONS_NECROPHAGE : // 16.7%(temp_rand > 0) ? MONS_WRAITH // 12.5%: MONS_VAMPIRE); // 4.2%mons_place(mgen_data::sleeper_at(mon_type, coord_def(x, y) ));}
mons_place(mgen_data::sleeper_at(mon_type, *ri));}}
bool isMe; // selected self (convenience: tx == you.x_pos,// ty == you.y_pos)bool isEndpoint; // Does the player want the attack to stop at (tx,ty)?
bool isMe; // selected self (convenience: target == you.pos())bool isEndpoint; // Does the player want the attack to stop at target?
int tx,ty; // target x,y or logical extension of beam to map edgeint dx,dy; // delta x and y if direction - always -1,0,1
coord_def target; // target x,y or logical extension of beam to map edgecoord_def delta; // delta x and y if direction - always -1,0,1
const int old_tx = moves.tx + (skip_iter ? 500 : 0); // hmmm...hackconst int old_ty = moves.ty;
coord_def old_target = moves.target;if ( skip_iter )old_target.x += 500; // hmmm...hack
if (moves.dx > 0)mx = (GXM - 1) - you.x_pos;if (moves.dx < 0)mx = you.x_pos;
if (moves.delta.x > 0)mx = (GXM - 1) - you.pos().x;if (moves.delta.x < 0)mx = you.pos().x;
int fx = -1, fy = -1;for (int dx = -1; dx <= 1; ++dx)for (int dy = -1; dy <= 1; ++dy)
coord_def f;for (adjacent_iterator ai; ai; ++ai){if (grd(*ai) == DNGN_FLOOR&& trap_at_xy(*ai) == -1&& one_chance_in(++count))
if ( dx == 0 && dy == 0 )continue;const int rx = you.x_pos + dx;const int ry = you.y_pos + dy;if (grd[rx][ry] == DNGN_FLOOR && trap_at_xy(coord_def(rx,ry)) == -1&& one_chance_in(++count)){fx = rx;fy = ry;}
f = *ai;
menv[i].name(DESC_CAP_THE, true).c_str(),i, menv[i].type, menv[i].x, menv[i].y,((menv[i].attitude == ATT_HOSTILE) ? "hostile" :(menv[i].attitude == ATT_FRIENDLY) ? "friendly" :(menv[i].attitude == ATT_NEUTRAL) ? "neutral" :(menv[i].attitude == ATT_GOOD_NEUTRAL) ? "good neutral"
mons.name(DESC_CAP_THE, true).c_str(),i, mons.type, mons.pos().x, mons.pos().y,((mons.attitude == ATT_HOSTILE) ? "hostile" :(mons.attitude == ATT_FRIENDLY) ? "friendly" :(mons.attitude == ATT_NEUTRAL) ? "neutral" :(mons.attitude == ATT_GOOD_NEUTRAL) ? "good neutral"
menv[i].hit_dice,menv[i].experience,menv[i].hit_points, menv[i].max_hit_points,menv[i].ac, menv[i].ev,mons_resist_magic( &menv[i] ),menv[i].speed, menv[i].speed_increment,menv[i].base_monster != MONS_PROGRAM_BUG ? " base=" : "",menv[i].base_monster != MONS_PROGRAM_BUG ?get_monster_data(menv[i].base_monster)->name : "",menv[i].number, menv[i].flags );
mons.hit_dice,mons.experience,mons.hit_points, mons.max_hit_points,mons.ac, mons.ev,mons_resist_magic( &mons ),mons.speed, mons.speed_increment,mons.base_monster != MONS_PROGRAM_BUG ? " base=" : "",mons.base_monster != MONS_PROGRAM_BUG ?get_monster_data(mons.base_monster)->name : "",mons.number, mons.flags );
(mons_is_sleeping(&menv[i]) ? "sleep" :mons_is_wandering(&menv[i]) ? "wander" :mons_is_seeking(&menv[i]) ? "seek" :mons_is_fleeing(&menv[i]) ? "flee" :mons_is_cornered(&menv[i]) ? "cornered" :mons_is_panicking(&menv[i]) ? "panic" :mons_is_lurking(&menv[i]) ? "lurk"
(mons_is_sleeping(&mons) ? "sleep" :mons_is_wandering(&mons) ? "wander" :mons_is_seeking(&mons) ? "seek" :mons_is_fleeing(&mons) ? "flee" :mons_is_cornered(&mons) ? "cornered" :mons_is_panicking(&mons) ? "panic" :mons_is_lurking(&mons) ? "lurk"
menv[i].behaviour,((menv[i].foe == MHITYOU) ? "you" :(menv[i].foe == MHITNOT) ? "none" :(menv[menv[i].foe].type == -1) ? "unassigned monster": menv[menv[i].foe].name(DESC_PLAIN, true).c_str()),menv[i].foe,menv[i].foe_memory,menv[i].target_x, menv[i].target_y,god_name(menv[i].god).c_str() );
mons.behaviour,((mons.foe == MHITYOU) ? "you" :(mons.foe == MHITNOT) ? "none" :(menv[mons.foe].type == -1) ? "unassigned monster": menv[mons.foe].name(DESC_PLAIN, true).c_str()),mons.foe,mons.foe_memory,mons.target.x, mons.target.y,god_name(mons.god).c_str() );
mons_res_fire( &menv[i] ),mons_res_cold( &menv[i] ),mons_res_elec( &menv[i] ),mons_res_poison( &menv[i] ),mons_res_negative_energy( &menv[i] ) );
mons_res_fire( &mons ),mons_res_cold( &mons ),mons_res_elec( &mons ),mons_res_poison( &mons ),mons_res_negative_energy( &mons ) );
if (!you.can_pass_through_feat(grd[x][y]))grd[x][y] = DNGN_FLOOR;move_player_to_grid(coord_def(x, y), false, true, true);
if (!you.can_pass_through_feat(grd(where)))grd(where) = DNGN_FLOOR;move_player_to_grid(where, false, true, true);
env.cloud[ cloud ].x = newpos.x;env.cloud[ cloud ].y = newpos.y;env.cgrid[ old_x ][ old_y ] = EMPTY_CLOUD;
env.cloud[cloud].pos = newpos;
tile_beam = tileidx_item_throw(*item,pbolt.target_x - pbolt.source_x,pbolt.target_y - pbolt.source_y);
const coord_def diff = pbolt.target - pbolt.source;tile_beam = tileidx_item_throw(*item, diff.x, diff.y);
if (in_bounds(newx, newy)&& (newx != beem.source_x|| newy != beem.source_y)){beem.target_x = newx;beem.target_y = newy;}
if (in_bounds(newtarget))beem.target = newtarget;
flavour(BEAM_MAGIC), source_x(0), source_y(0), damage(0,0),ench_power(0), hit(0), target_x(0), target_y(0), pos(),
flavour(BEAM_MAGIC), source(), target(), pos(), damage(0,0),ench_power(0), hit(0),
static int _check_adjacent(dungeon_feature_type feat, int &dx, int &dy);static void _open_door(int move_x, int move_y, bool check_confused = true);static void _close_door(int move_x, int move_y);
static int _check_adjacent(dungeon_feature_type feat, coord_def& delta);static void _open_door(coord_def move, bool check_confused = true);static void _open_door(int x, int y, bool check_confused = true){_open_door(coord_def(x,y), check_confused);}static void _close_door(coord_def move);
int skill = you.dex + (you.skills[SK_TRAPS_DOORS] + you.skills[SK_STEALTH]) / 2;
int skill = you.dex +(you.skills[SK_TRAPS_DOORS] + you.skills[SK_STEALTH]) / 2;