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 100
if (!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 100
const 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 coordinates
void update_stair(int x, int y, const level_pos &p, bool guess = false);
// Updates/creates a StairInfo for the stair at stairpos in grid coordinates
void 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 monster
if (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 patterns
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))
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 patterns
const 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
}
else
env.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))
else
env.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. -- bwr
if (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. -- bwr
if (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 check
for (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 edge
cx = sr.x1 + (random2(sr.x2 - sr.x1));
cy = sr.y1;
dx = 0;
dy = -1;
break;
case 1:
// go down from south edge
cx = sr.x1 + (random2(sr.x2 - sr.x1));
cy = sr.y2;
dx = 0;
dy = 1;
break;
case 2:
// go left from west edge
cy = sr.y1 + (random2(sr.y2 - sr.y1));
cx = sr.x1;
dx = -1;
dy = 0;
break;
case 3:
// go right from east edge
cy = 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 edge
c.set( random_range(sr.tl.x, sr.br.x - 1), sr.tl.y );
delta.set(0, -1);
break;
case 1:
// go down from south edge
c.set( random_range(sr.tl.x, sr.br.x - 1), sr.br.y );
delta.set(0, 1);
break;
case 2:
// go left from west edge
c.set( sr.tl.x, random_range(sr.tl.y, sr.br.y - 1) );
delta.set(-1, 0);
break;
case 3:
// go right from east edge
c.set( sr.br.x, random_range(sr.tl.y, sr.br.y - 1) );
delta.set( 1, 0);
break;
}
// look around for floor
if (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 corridor
if ( 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 edge
int 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 edge
coord_def delta; // delta x and y if direction - always -1,0,1
const int old_tx = moves.tx + (skip_iter ? 500 : 0); // hmmm...hack
const 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;