ASXBSZVXJCWVX5VQSRWXL5BWQ4NA7JLYXP6LWQTRGYW6DC2DZZPQC VRAXIE6NIBWNUKKLT25G6IS7B2DK4CJXSJORZ43G35GPS4D5MXOQC H7BIAEZAMLWTTCA7OIQ7YF5C2LS2DVLK65EOKHMKZ4PWL2BQL6ZQC BYAU2Q2Y3YARSDGBJPJUZWUYVETAHO6PSJ6P4XCWPGYRRZMDWEQAC THSEYQZ4KVU6WF2AXH6XBPAIX7PQVJ455MNPFEXHXQA4LLCYIPCQC BSZCHUEYK4ZSTIFMYKIHBOJGMNYKMILJVHQH2EYFKK3C3OR2ALTAC NW3WF4AHXC2D3ZO3VUH73T3L5SJGVDTUGG4PPCDFZTKJKSTPURXAC AKA32GXKN53M4MU66OADWNFCQ7CN75LPEM5ZEJ7TQVZ6OK4WISSAC GLAIQU2KCJKEY2NWIZKSHBAG5G54SCM5IH3XPFKXZVU67J5DIPLQC 36BFWYZWCQGMAMK4EF2R5C66RA2EBLTX3MJW3QDEKN64C3BJQX7AC BP3W6RIQBMRI3NGRARGGQFAPDATWJ7KYHFRFQUAZ3F25ZIG2WS2AC NOQ4LTFDCNNSHUE2AHXYBVXUTTXBDZOHNCK5V4TWVDBIYRC3VUCQC K2CS6TCX2NDVL2ASEHGP4J4K4IJ6FP3ANNKTSIWVG43HPYSBX6ZQC XEFLKDEZCVSPO4SMGNXRNQWAJ6KKWABWFX2PULITTDJUIKYPVPSAC IQGGFC563RBS7GDOACKCLXK752EE5RC3T6G5L6H446SXTMSA7T2AC LCCFD6BLLDJO3PVPKKJ7YJ4PQUHLUKQBWRCYRH26UVMOTYZPJQRQC SVY2PTCLXR3KNPQAWXVXTTGCC5DR334HOAKHYO3VDDRWM2BWMALAC SDLKLUNFGVKDS55DDJZCBAVIB7NL3RRYPTACAY65SCUQKV6APFSAC 3DQXSE4YGFBBDUWK4YEOFWW4UPWILWELFSLP37SL6BERGAZJC5YAC FAVME2A2U4OUKN2BTISAG5PCI5Y4BN6YVFKCSQQHHZLEVVVF4LKAC 2KTJHQUX2LTU2BCLS5YXVRRKMOYKKIZAPF2LBKORFGSHEN5IO3IAC RRNEVUYOK5S4M4QH77N34IXSSNUXVQAIZQLXAQKQCRITMPUKGP6AC 6PAG7GHXHIYXJPPTEK4KZQZT4CL2SJDAGTVIUDB4KK66PVSTWUMAC E42EFZ3RINKLTGOJJZAH2N5QF3P4S5NCO5T52HLXJRMBPP463HTAC DIAGORS5MPTNYDMPDOBXCIGCVDH7THTHYFOQUKMET57QH2J6WF5AC WRDCASRSGOBY5RLVORAMRBSYKEWLLO7VZ4V5NQG2TKBWYNU4OZKAC TW7QOMTSLYPGUUWHGHLY5G5LV6QQRQIKK4BSE64RY7RDGKVDHCEAC 5WVUTEZLEZEML54CKPR6GACQBYY3EMVNXMLJOREN6SSEUZGC47AQC 7KWDC7XFNMBLSUO2HISIROBINZBX5T67LJEEXTAORXW2YZ7VWFGAC UL7XFKMUX3WIU4O2LZANK4ECJ654UZPDBFGNXUEYZYOLKBYBCG6AC RPOZZWKG5GLPHVZZ7ZKMKS64ZMV2LDCQSARBJFJ6FZOTOKCQO7FAC ACZYEIX7WMPIIODKCATBCUE626AJ4ZGGBOMVC6BGXM27EQU2RECAC 2EBEWIV4YHXXAFR4GG2GMZJ2K77NK762HNQ77CZLHI3LDVGX7RJAC DKRSOHZXL6EPSLKOKHF7GJXSZEJVY7CXGACSHWLM5B5FTRETWWCAC S7Y7E2KDAFMTLDIXUTR673SYL5N35VXYGLRU67L42WHVYG5SEPBQC SIDH2P7NBIG5KEOE27XHD3ZT2NQ2OJZFN6VZXWNWYFFY5YVXSSVQC R22TTMI6WXWULC7ODKFF3QCB7MOTETQQ6IR4BUCUPOCQKQNCTT5AC QDTVLBRGHDTRUVT7I3O72K6TMOYAUSAJBZUHGOEFU2RKJNUPWZSQC UAJN2CFA2QHYDHW2UFAVPPHDQFCD54RKM6V2UC4AMEDJUBBLNWIQC X5WLJCJVW55SXZVP7IKP7ADCJIGNKN4PKAXFECVR6TNK7XSMZR7QC 6L4EP4ZRWWYLT55PD5KTTJON5J2JB5VV5MWNHF5VPZQZ5BKEYZ4QC ASLW3Z5PAVZSWJEMMMVZT226P44EKSAD47QS72JIFJESAI3RPN3AC UPA65AL4JXYLIHH4D42IWJHRTOAF2BPOVZOAKOXBLZBYIMDZDFFQC OSRZEPPGBIMSZBWIVBTZTTIMV6TEUGVZRZ5AI2ZJW7CVZZQBUIMQC RBAGQ2PB7V5YAM5KSHSZR2E3MLKDSRVM5XYGI2TIXP5QMVBOQHDQC S5RANRFX6SRLISGDLFVHDWHWXZ4IIEMM23FMY4IHK5PZQBLRTTYAC 3V52MSSK7QX7FWLLUW63DTWCBAJEK674EFZLKP45FLZ5KZKVARHAC 247OW5JFN34ZV3GRVHRE25AXLLISUBPOX5YRGUE64BCM2V7QNEHAC KVDUZCENP2TCYLWIGUOS4JD4PK4TIJE5GGCAXVUBAYSF5YZFADVAC KKJUHD576DZVDDQ7JFBAO7S35DAPIMZNOYVLAUBDOTTUGR4Q53JQC AVCMVFA3MKCXHO6H44UK5KJNIHTGQV7UA7GYXM26VI6TXXU5ZN6QC C3TZ3MSKH4LCCIOAI6IZNLHQT46X635ZE2OCNPEAM7VNL7QRRCKAC TVC7W7C2XKBQSD2IJFMWFVGXZAOD4EUOW43NAQTOF5KFMAUOJABQC U5E476KITX52LCQEDW7OYSEJJS3B7624LHAUFENVMNZM76OAFJ6QC 774O5HM4CU5QYP4MPKKLHIVZQ5JLLZETYIDZZYBAPOJSO6ILC5RAC OP6CTAKWCAU64JXQ3USQYR5E5IFHQHNCACII5UMVRXUTZXJQOAZAC HH3HFWVXABJ4IRMN22PPJCREMULZSN6DA7VYKOGECGMNUQTZ5QNQC CEK6M777MI5JVDC3KHE3JD3FETVSJ4VN6DGATBI5P3O6P5XHY4DAC BUSA7O6EFBZVAG2RL5T7MD2WTWKOEKKIAAZ2VS4Y3L6ECT4HQR6QC Z6Q7JVMFQ32SC7FRGOB7CE7JS2HEOPAO3B2VLU3YR3UCUDZFIPFQC RQ24Y25QDO2GY65XESEVBCP6VXCB7BDTWXO42IPPI6UPRJQ5XYDAC C4CGYUPRJPDPAF6E65Y3MGAK45PNDPF2CNT276V7P37PPLX3AR5QC 2Z6IWKMEWE4OIFVWFSZBA2SIXMBJNV6H6LNEPOXTJZW433ABU4EQC EQDLV5OMIFO5ZPYNE27VQLLZEIRMSALGNEFWVSCFXJN22A43GCWQC CZWERNJVMJFBGKQHHR6I5U2FCRUJD7H2DG3C43V2CBAW74GYU2HAC DXYAQFFVZ5YDUPT2MIKGAMVODSOJ4UJR5WTQKNCFMB5WJ6KH4D3QC YW5UVOSZFDRNHV5BCQ4JGP5CU3WFL4T3W5LRYX2NRVALQURONJ7QC 2KKHQWC5ML42HRY3UCOOEU7CUKAZMPDDD35OARA6HVXU4GDJ3P4QC 3B3GZ4E2L4RIPHILKXACK4GF7DCQA5XC4UG75PHQXIVH4UCQWYAAC FTDI4OSR3G5KKGJ5UILSHTHOP4GF4XJ4DHKYPUWFKWAGGXTOCJSQC JLAGD2FAV3CWVO7PLXTHLT7MBI23TUSYLSNHFAWP5IB5UO77VKJAC IPYQUTCWLI46CL62UXHR6PULPO4JPPXPFAJCGZULBQM67SHGPXTAC 5FHWTG7M6FW4B3I33YI7QSM3OZIB6ZGC6TI6JISSLY5Y43HI56VAC TV3ZC6WOZKSQQJQN26JIVKCHK6UK7WMDBYZDUYRWEAZ4JB4YVNAAC KFULGQQOHWUTXOM3BXCCYPGGVGGY4Z6265XUFRCBPNLTZAEHJZSQC QXI6JLO5RGDKUG5H7RBMQTTT3234L2NGHJTMWAF6UJEBJDBDMMNAC CLIEHAE2PP7ZIGLLIMYCWM4FC54KBOAN5AILOLAZJ5S26GTJM4RQC NULVQ2A7ES5N3BBQAH6YKFST6UPVKD4KYYFFHYTUKSYLHXR4OYSAC FCZSQBKDNMJZRJS2LWQQWLUFGOXSKXDJZQIHC7L5S7HXCXQPOMMAC U5IBPFKQSOUYHVCULUKZC3NUAUB5XPAFW2R7SZYTGZZVMRF5DH2AC 7EIA4DGVDBJRNHEAN3DK6SNHGALSSEUWSOL57C2VPGN2IZCQ633AC 6LT6USGJOTDMRJGXLAN2NSZXK2GKWEXDKKUV6SVV7ZC6WI6EKMDQC PWY4VZVHDLYL7UVNCCOW7BM7LYK2BOGTL23P75HXUJ33MHJPEJPQC 634UBQG7RYANZYTNHYLPHMXXO3FUJYUVHGFSK53TH6572QDVUOBQC CLBOD3ANEMCQTE6USMTZAH4UWNLB73AIT3ZCDHLUUTMLQTCZJ4GAC 6TQASFI7B552ZNCBVI7AS3MMMACNTGEJESTB74EFCH2MJGH5LW3AC ISUJEAPPWKP2UIYPT6BJUUNSVH52NEXWGXNUATL7I3IO7TPO32HAC KDK4YJQS4P7HRB334SZ3EFCW27AEGRPE3PXW6S6TKRIG6HLOKQNAC MFOXVZEY4AR3FDNGKAIB7YSXWTE6DOUXPS7UGSJGSBIK7VCRWLKAC 3NWBNYOBOSOGZMKDHFJKLL3ZDUXGXFU7OEOSLL26KPC3S3DRNHUAC GR6QXMDUVPNXA2XVDRJUWGVSDI2FXQCKLXAXZUVEI6NYRMK6I5LQC 6LTQT4CP7LJZLAE7JTPQ4OT4JOG3IFYM7RNXL3FINKBFO6452DTAC RM2JXW3ATVYRYHF3NMG5ALGI64OJ7IP2F3MDUDPUT5TBKSSN4KVQC 6RJVKSL7RVZIZIZIC4TWIYJQ24RUSB346ODS3NYGDHUIRTC4Z5FQC JI4NDSOXGGZ7QHXXFB3ZTHAKHABXYBZXPDGLUFV5SKYEOL5FT7JQC 4UXFU3FZOCBSLDQ4S7MJKAE2H7VUHCNRDQMIY6NJ3PHYXWNGISDQC H55P74Y6NHAPF3VPWXIAP7DODA3DV7NCT3SK6VVLWNNWZ7JIMBTAC CK7CT5TUFUL2AQY7FUHB5JI3FC2KSPWUWHXC6VEUJJ7G4OWUQFTAC 6GT5JAWOIIL4SQ5MWIID6ZVO3KKQFWDQDZNVFHZ6DNK5QCBXJ4UAC YSUUJTK4F4QM353U4D4FEUQ4NYKTZF4I5VWGX7EXBEWBN6IFEKWAC WVFKGV3AMOYUZ53MWH2RWRITRRCPKKNPTO7QASA5WVKWAUGDJ2OQC Z37LPWKBVEMAADJPZDI3DIPZTEIE4HI456I5PM2XTAG74X237XFQC KSM4H3SBM6FIQTUEGHXXYATJXEOJ4EKUBAFCRMFKSHY7N2HWECRQC JM7UAK777RAVDAVLQLEOBRTGNW2B47S5G55XITJXO243IUNZHVYQC LJK4ZQATLSB4MKZG3ARZX5V6RFGTN3NLCN6GTCUGJQKU26SOXMUAC QKV56RZTWOX64VLWW52R2DEUM3HGGZNLRAJ2ZV2BHW5K422OPNJQC BIZDHHK5LIO57S5AKHEPJFLWV5DAFKZIKYBGOUNGICSWTX7DCXKAC GBUB77EAYHOFY6GQ5IY3ZSBC7FSQFZZKYNBD5QMCQFIKFLYLWHOQC JGKYRZ34S3I23PMJX6IUBR7EHEFD6I4XXEGXNT7GKT2M2VIRBSMQC 2X6FLALUQSY4GEF2YBXZVC5ZTOZSMS3IBO7BFTSKAA4TXWEV7EXAC NK2TBKWOQBD2ZRGAO4Z3HMZPIN7UX3HNUS2YHEIJUUINUTRMPODQC LABXKXWWQY2V4FUDLGVTDYHXINAP6KRHZDHBQ2FE22FFOEIZPL6QC DCZMEKDHQWSQCQYQD6ZXB3XOMWLVLPSPVSBVVMPXMSZF7GO3BVCAC DH3YTI6VVI727SQXO4CXSDCSBG2UN3UAWLFULBGRLBVH22ACRXIAC 2YLX45THVAG2ICWFAOANL3BQQBYMPQV36EY73TYCWA336RVW7KGQC TGJZXTUIAKCFZQJ54ZQEBGFBVZSJCAX6AWDRSH3TP7UJRLGUM5SAC F2ZJ55CL3T66DFM34BQWCJNHIT4XJFCGTWTA5KESV6NHWFLTGUYAC U6OTXM3JN7SGPVIGQ5F6NR2I7J5V7KOWFQ7AVNNRQQDNLBEDMYFQC NQIXUYGUIQTKZUB2IQDII7BBDMZ4VN4NUUTGT2ARQBZTDJUMPKRQC OWNMHNCGA5H3A6AULXXW473PKC7N6IINE3LJCB3KCFG2XA3TYCQQC 3KAINFIXO7WNWGUGZB43EUNFRS2ZPBLQZDTY456QACMRHYIJ7WDAC XUCCWGMXKPIR34BBCCOI67YHI3RST4STDWSDUZTN4B2CJWXQLQ7AC HSRRNAU5UAYC6B6IQWGJPFROMZBTJICPCH6DJVZDHDTAGOQ6IOYAC CAHE52HL2ZGRJPBYZ3DS4BVKUD2XC7N3SG25TGG7JGHGJDST4P3QC DDU4A3JGN5IUIPP5IASOODKPR2WBHSDSV4FITZ6HNXNSXXQACWAQC ZL4S2AICGMIH5DCHUXH6GJHSGELIONW6DOMFWB5PE62BVS7QZZEAC GQQ6ASWTYODIHG7X32JNUUHP5NMOVZJIHWGS3F3MKRYZGAHP6NVQC I2B33Z7NZGC33AMDSSK446AZZYWKPHWLAGULVHKKZU4MVB4BNJOAC BMKL2AB2HBBBVAHWDYXPYZHSCO345QWOQHFSICFRN5BCYZ3UEK3AC FVT2J6IVMSQZYKQGUHQVGT4ADYM7AWUQ4U7766GBRRFMSR2WBMLAC UKN6HTZXDUUOWKNWNKWPHKGUGL474JIAQN5JU3DM3DU26WGMNP4AC 3YBQGKQ22WFXA5RXDSKLFWMABLJ6KHBVWEIA3WIDHWM25OECNTYAC EHP6PYCIPYQ3KF4JFGBTZXEUQHN3FVAH4NUWEOWDDNKGPYVOTOJQC HODV46TCH5AGI42Z5JKVDX4VCRVQCNREJUL6W3TUJK6S77SXQNLQC NVD2HSEW2ONWNYDDCTOMZZOUP6NG4DCXI4LNYYIY4BQEBDMJQK5AC 3GH3RH5QFHWAELRYSRB2BAS5TEN6SYRXLNZHN65HPQCJWILENGYQC W5VEC2PBIM5DMU5233HOWAZUEPTGWJRZZIA3H35YYQQW6BTP6XUAC X7MFMKQTNZ2IWBFVGS6WQV7NRNKJ3DWQAW2X7IQMFQQXW24AHPZQC TLO257LZSB6ZO36STDUEWJBO2LETXFKTFGXELA6Y4BZBVAEIIINAC ZWFOOUUA5VCYOXGAHE76DXW65ME4AH2DVN6JVNGZAKTHZNDTVOJAC Y6NBWVBEELJTKBFGKXUE4WIJP4TMJ65YMF5TWWRB5CHYEFZ26GKAC CI2RMLJLIAZMEGNN6LJN6PSHXHLPG7PXFIDYRGFPVMDPJ2R4S4NQC 5BJPWUPLJFS34FUTFJVKA4A52YMIGV6EWDXLNSDCWBJWBGVSQFGQC FS4MVTH4EEEECLEAO2FTNK5CLF2PHFYO2JZHC2YEOKYLWXRDRU6AC CCRQESB4ADT4WA7FGLNZZXAJ6G5QMCTYCZIWORBN45P6ZPILC34AC FWNNTOEERPUKXPE4OC52UABFZLKIU3O5GRNNLDK4QI4HR2IOU36QC WT66JDIRTLLP37SHTV4GI3V64JFJ4D25LNRLGCHFG6CLEFKJ3QGQC 6NBAJU44SKV2GYCFZ3NWGC5L73CIZIKINHSL4J7VKASV6R5WMIZAC ZJLJGSB2XSBQU42OFQMXL3EG4CXAQGOYAU6YTV2SAWZEJIPFH2CAC NWUWP5QCMJ7ZZMLCVB74PW7HDEFB6ICEQHNDHCGG7UWDQNNLGVMQC OGDVYT4KKXIUOB4NCNWBX64EJWS25B54DF23UP3NMQ6QWHEW2RAAC F2X5SIIXWXXEL2FVMYDC4GL2ODZ4O7RA46U66VGJ5K2EZHHAQGUAC WXSNNK2RXP3DQFAEQGQUZJHFWXJC7ZKG2WURZGL566UDM4YXFSWQC 3PY3L3A4QRW3Z5Y7SHO4TMVOOP2VNCO27X2MX4DTOP2SADLBQUOAC DOZORMA366M4HB5JKSS27BMCR6ET7QNZNND2B7KV3NVEEPR5H7EAC ENI6P5WUO7DS4Y7EUDCYB4PSNT7CXH2L5JIB5BLZHNMWN4QDXMWQC RDOOG5LBE5TCTFYCKJIB7TGGTRFX4HBLMJZYXS5TCFWNCU3QII5QC EOMCPVNQLX3IMLC46EAO67DPBH5KEG2FQTPBLGU62HIRWA3UQ7XQC Z7NCYTUYFX6DW5T2IVYD3JOKPICQMADIKOTLCUZUJIP2OGMBVROQC SJOTTUZMA3UTGT5D6LKUTBDP2CZFXT24FB5IAWCUFHSHLLACM75QC QIHESOUNY5H7T56DAVXJMZRBUJPDMLHGTM34WIMPCWSUM72Z6QPQC A7NKTYZ6VZC42TSSSDEWD5ROPE3P3M5I2QSNAVUMCYJ46PCXTDPQC NF5ISJJGD3UIZYQHYM6LC726BBBMZBCFQ2HWDDXWY2NQQKH6JN4AC RISMOCQM6BKK4XSIRKYLOBB2UPDYJNDAL6OGIIR5GGNZQAK5YSZAC DKISJVKAJJK2SVZSXGJ37K5SOVTDARVX6RPK3MAKVNGC36Z4YAZQC ACKNLTFL2RI3PMRWLNRVLRWGQAMLRFKNGNS5LED6NFE5GVGFIHFAC MLZSEZWNNZMSIDQNAAIOJJR4K7VSVJICL5SAGHD3ROM7SYDVZABAC O4DT3BQQ3XYPL6PQ72G6VPBAVHXZMEOLONFXNHXFMBXBVOYMB6VQC PM2AFCUMNJD4UBWQ4GQPETHSE4T2C75JB5B4RHN3DBD6KTX3VBLQC EIJQB5HNBFGK6MQ7OOM6TC3BKONFXF3CIDM7HTL7VKE44ZM6ACJQC G3HJCS277WA2VONPOJW6FAOQO7VHMSMLXZWYIXKFE4N4Y3OV7UZAC POACC5YR6QQGEX6GGMUJKGCDQNX6P6FUF4UQTYGOSHFOHJ26X4SQC M7WTOF3BVX5MGA7AQZB22YEFWCSL7RLW54PQM3MTRLCKUCUZZEUAC FUEEIUKGHHFPIRZCN3N753GONWAZTWQ2ZWR53IBJAAZ6FZUNGOMAC 5XSXMOBGXFLTIQE6WDXWWFVDOTUPZSIQ2FWT3YI5QMVU6D76IUYQC YOH32TMLN6QJG4ZFLYWPJF3YUEGIMZPVPYN57RTB26QBBHMICV3AC 6X4LO6MAQLVRJBTYVGBJUI6RGAAFM6DMXW3KFNWC23R5TX7Q2OLQC 7AMQN7MITMXBNVDAK5VOXTQ4TZIAOD6ZLOFJG7GQMBTY23Y2BKSAC WQLOHSNCA3VOMDJF6IINJYKSYVYZEBPJJWBB33QSNE4RP5HEXPMAC CDKRLJIGVWQE2PMHCSLJBLYQEK7JYC4LQM7H2X3O6NMJMCCDRVIAC P5TRGRH7XMQSPCZKM5IEEO34TY6WMLGHHX7BU6Y453JFRXLUR2VQC 3DO3LBKJRTDOI6MBMVQGH6KESDFKRYMNIGKDTCWCMPACRMWTQYIQC EMOBSWJHHB4V6WVMZL7JCF2V3KZN454Z6NS346OKFPMBNO24EJDQC LH4OYDEWEON5QNUCM74R7MNBJDP7O4XRETY74ZMYSXUXYQV427PAC QS3ZRS3E6KL3YJHPKYEWCWJYRBJSXD5OOYF6Y25HZVECGPJRDB5QC 4LNIHTHZTCOEZEHZ4GW6WCZH4UCDWKK5UVUKEDODEBBS4YH2KONQC 5UC5TI7B6NWGIGN74QRBZKDBYUMHLM2ZO5ATXEZ6TZOGOLF3JX5QC OSGS3PH2L5CBTDVZCZS6OCFQNA4A7RMEXBYJQB7DDZBYYJW7QSSAC MSQI3TH6T62JAXQGLL52QZCWAMC372TGB6ZNNRDGUGMJKBNNV2VAC GPEJOT73KMACP33IPAKFR5ROGHCOIP22VXZMQNYTGLEA2OSZUM2AC E335DPK7M5WBYKN5C3KG75KY75CVXLN3XTLK55MADVZMHW74AHGQC EH2GBTIVFF2UUAONBZ3L2WXVISLKDEWP7K4JFRPAOGGKPMSBWVDAC IOAGPY5NFIEOWH277C4353PTETHYUVOXLHBZ7EIOAQ5IOCXOEVCQC AOAJ6D3OKSELEYKAT55XCVU5LYJ7SMCZKC6DIEGLLB3TF2LEENWQC OONYLF4DAPLIYLBNNRW74IVT5BBTWI4XHQBXSNSPVRX3FTKJBTRAC 5B36ULBPPMKZJBURDAAVN4VBMKY3PIZIIDY3LAZYSIVTWGW4CRIAC X4OCLD5YEXCYVQNMOQORLIO72AKUEMT3BT6FB3TW2HARKN5X7MEQC AYU5OVG2HZO46KDAPKUWAVHS5HTYFKUWIMIRMTHAXVVFEDJE7YPAC NWJ5IHZJXYE4I7CKSDNMTLGTIKOWK42LC2UYZL2TLXSZLM67WKRAC 2UO6ZOW7UCP5XJ2TJ26PJNQABILK2BZ4J3BAKLOKMZPJDQHW24MAC FIXUE5QKMQPOFLKMBLNBRJNXG4NDESEFVTJRNCFCXAXDRNHPMTAAC 7Y5HSDFKA5TPLS2TWTRFMQVX6UXUDHXU5MUMXQSDFAIY4THQ3BIQC POP6UTTHSJGDU5NU7ENQJOZVFUHYM63HJ6HLPXDDLK7XFIP4XEIQC M2EUGZPKR6XTZSLQYDO7CDBBR2WPPMCBIBKJSZW5P7KYUOUPZSZQC 22MF6OUN62WDBJR5QFNJTKU7Q5TIQ76XWCEIRBFWAZDMZUSKJGCAC U3UHWTM2LW64BR5DEBMMZUIGXGS2H3IYSGTWYI5ZU6LD4WWYKRPQC P47PQFI72BLIWRWYDZM3I54BCZT2IJG4LTB7GAIYNFXPQIH4XDOAC Q6WLX2VTRJ3LGDPWBH5WKQM7CIIJ5H6AEIKMXPF2PJA5JX5ZLUZQC 6EZYOF7W56XYRLZ7JSIX3DLQS7BOYVQP7TSSCNU7WIJT4FPZIM6QC Y4WR4EIOFFXHRQI2PJAZWD4MVL6A7MNBHLN4KOV6BIKGGA7FXQTQC 4OKEEU32EGHIDAJ75GH3USSQHQPZBDZVC7TOP7ALMHZRUFPE5WEQC JMBL7S3FVFBUQGRYXVHY4LCL3RTWMFFW42EG4FQPH45YTERD35RAC ROODXPAWIP2V2SHJVO4CI567E3CYLBTL6MSYAG3IFEGHIDIKNAAQC PFEJ4LMDNEKLMGRCMWQ7EIRVU4JMYGICI4G7X4WVWOROVXQCBZ7QC F7Q5PX44SLPANIZXCY67TG2W5JTRVJMHGQW54VJLGB4XRH7R6JBQC IBITKTCFECTUF6E6WMQVWXQT5Z52O5B4IZBWOLP5DWXGUHGC62AQC C67GX7W5HBCDPQJRSHWMLM4DUJ3ELFSHH42SVICFJVCJW25T5Z3AC QYQKV4R47PTERXVFQNNWWQVICGSOMBHW6WM5TAZAKLIYOLLPUAJAC 5V47S4NNTHWTSAHV3YLO2VGH7JTUIYJ3GBPDN5ZM4UQALT2ZEXDQC NVK2OISSU4XF2CGSK2BAWZE2OPCLTXYHNSE6UDJ5M54EHY2I7BLAC UBJ3K77N3ESM5ZHZAND4FDTONECSSB3NUNL6QQA7ATSESSCW5QUQC GRVGLW4QW6BMLK4E3HY7YMHFV2PWGV7BPVFMOTX5APYKCWNUELOQC 2GUJEAQN5CVJOKMEZANI6QQ6JFJZGCS6TDKHTVP4NZFXVNSYZWEAC L254F6ZIU2HWGLFFGPIORTN4C3TDQ3E5JZ7Z7GQA5AEDIKL6PKDAC ALIE3JM7NTE4KYN7TOPI32MCVZRAZF4ENAS5HVA3RX6PB6GSQNMQC HM6NOS7BN5665KWIFGBXOHZIDMRSVCESN72GMGI6NVBFZGCF3L6QC LFBNFE3PZBXTR2ROPKYPARUWLJAYWAKGTS7VBWADZWVVSJ5CLX6AC TQXNC2YQVJZXBPSLDEANMM2EDGHTH4DSN74OJIRMUF7D46SESHZAC 627CM2ZOKVBMPVPBYGWBWWPT2FBMVRRH2VDGPT6Z5XCVJ5R4YQWQC YKVVFNKT2M5WG2KBURRTOJG23BJVI6WUBP5JOGYPHQBS4RNGFGWQC 5WKKONCYM73GBJ6GDYK3OLZ2PB7KJHFDYGEMHQQMPQMFJJHTLWCQC VGVUWNUF4CV4PGWZFHHT5SOC2BQAED5DOY47I4HCJUV2OQW46RDAC V7IKAPO5OY7CJTT62GMHQOD3EQW42FTTY3KDBOTJUODPS5WMBCHAC L5W2SXCJEVQOLRIN2IQO3AITQGHAS7PYSL4I7M5BQMG7MYZ2AQQQC RCPQNIRPR3NQXEMVLBAQW6657UJFIP43N54UJVEZHJH22OH4UQIQC S4W5EBZLFX3HA3JNR524LF5RJ7PAPMSMN3FVRZNLQZY4QNEILGLQC QKGDOYIYKE6B36ION5O2DRW65DWWPZMYNWJVH7LJJ7FPGGM2MYAQC B62ICMDTN5V7R7RBL4JALFVKEMVOOVLRSJASRNYS6CGFWBEEF5JQC ZLQAAP55CJ77XIJN3DZVPT4GTTVLIBFJLIJJKI6L5UBSHX7VUK6AC WBAFNYODKTL3YSG3UOJITBJSTFYGJLIWKRNK6NMGIIP5TPC2BDGQC RPN4UZZV2GZILMYXCEIUZE5GTUZJA4Y5K7GMZBHZOE27M77PX5MQC L4RYVF46EQKMVOEADGRG4WMPVTQ6NNFGYMU4SHAH6XJIKWVHT77QC OYTCBRC7LE44EUVRZVYTOOVKQWJ6P6YE3FXTOGUTNKEMLNWPHKSQC ZGZVOMRXLVC42FV67RBTLBOZWFYRL4UHL54A365BR76OUIYRWQXAC QX7GM3YZFUBCXTLQIKF27YOPKYR2655HYRWSNTDXXI6CTH4XEP7AC IVVTHLTTLOP5TSULXJWUSSXHOKYWVU3OWKYVK45A7RIB6V34MYQAC RCLZVH5IZLUUJU3XDIW4GUDJ5G73DOI3EEMRKNMCNPSSEDBU5YFAC UZ6N6HOUPGVSPC5NQROEEDWMEGJA5XUWUY2AKH5QG65AZ25PVXDAC CGYTZT5QWIEGYKUOLOK7MFXSLJKLYRZONER5ZCDZO5XYWSLG475QC AUXVWXWIFSTWFA6VZXN2FMG7FQEKRZVV6MD32VQQ7J2RKCXHAVGAC 25CH7HH4LKXFIZ75YNMXS3TSXO6O27DYSOPLOD45K4OCNFWLS4LQC 7IERR3KESLBDHEMGSFRYGA66PZBPGKPUGMFDCSFR3WDX7RXD5OTAC 3SQQ4MM6YO4I37CQ6GIBIX6BXAEVHNVNHPVMR3PPBBNO454D6XWQC Q3B3UVMYEVC4YJUPYVSNTR4DJH4E6J4JJDHZNT5LNOCHCPPMEMXAC 5FA5IEAXTMXYS2VUBVDKBKHPKAIOY4GN5SXYJORBYWQIGHVW3FFQC 55PFDYPVE6JVGDYPCFUE4XS2523PVSV4CSIFRW6A2GGX4I6VWRWQC 52W74WXL5XIH6YFJBQRVAO47YHCS3CPMUUZS4Q3AZ3HAPDWMT54AC ED62QWGKBPORWVKDFOQRKJXEIWZVNGR3O4KWQBDSRNPT36AYOQYAC DK362IHKSDADMUPD35NOTKM4WESQM37KG2PNOJRV2FGELDWULYPQC T3R2D5M4YSC6NFZ6YO3AEG4VWORECX72CHUM5UBADV4UPAAZG7WQC GQL5SIGBHLU3FMCE54XVGLRY5AZHRM6DUEB722REA2DPLGJSN6EQC #endifclass player : public actor{public:bool turn_is_over; // flag signaling that player has performed a timed action// If true, player is headed to the Abyss.bool banished;std::string banished_by;std::vector<int> mesmerised_by; // monsters mesmerising playerint friendly_pickup; // pickup setting for alliesunsigned short prev_targ;coord_def prev_grd_targ;char your_name[kNameLen];species_type species;job_type char_class;// Coordinates of last travel target; note that this is never used by// travel itself, only by the level-map to remember the last travel target.short travel_x, travel_y;runrest running; // Nonzero if running/traveling.unsigned short unrand_reacts;double elapsed_time; // total amount of elapsed time in the gameunsigned char synch_time; // amount to wait before calling handle_time()unsigned char disease;char max_level;coord_def youpos;coord_def prev_move;int hunger;FixedVector<char, NUM_EQUIP> equip;int hp;int hp_max;int base_hp; // temporary max HP loss (rotting)int base_hp2; // base HPs from levels (and permanent loss)int magic_points;int max_magic_points;int base_magic_points; // temporary max MP loss? (currently unused)int base_magic_points2; // base MPs from levels and potions of magicchar strength;char intel;char dex;char max_strength;char max_intel;char max_dex;stat_type last_chosen;char hunger_state;bool wield_change; // redraw weaponbool redraw_quiver; // redraw quiverbool received_weapon_warning;unsigned long redraw_status_flags;// PC's symbol (usually @) and colour.int symbol;int colour;bool redraw_hit_points;bool redraw_magic_points;bool redraw_strength;bool redraw_intelligence;bool redraw_dexterity;bool redraw_experience;bool redraw_armour_class;bool redraw_evasion;unsigned char flash_colour;unsigned char hit_points_regeneration;unsigned char magic_points_regeneration;unsigned long experience;int experience_level;int gold;char class_name[30];int time_taken;int shield_blocks; // number of shield blocks since last actionFixedVector< item_def, ENDOFPACK > inv;int burden;burden_state_type burden_state;FixedVector<spell_type, 25> spells;char spell_no;game_direction_type char_direction;bool opened_zot;bool royal_jelly_dead;bool transform_cancellable;unsigned short pet_target;int your_level; // offset by one (-1 == 0, 0 == 1, etc.) for display// durational thingsFixedVector<int, NUM_DURATIONS> duration;int rotting;int berserk_penalty; // penalty for moving while berserkFixedVector<unsigned long, NUM_ATTRIBUTES> attribute;FixedVector<unsigned char, NUM_QUIVER> quiver; // default items for quiverFixedVector<long, NUM_OBJECT_CLASSES> sacrifice_value;undead_state_type is_undead;delay_queue_type delay_queue; // pending actionsFixedVector<unsigned char, 50> skills;FixedVector<bool, 50> practise_skill;FixedVector<unsigned int, 50> skill_points;FixedVector<unsigned char, 50> skill_order;skill_type sage_bonus_skill; // If Sage is in effect, which skill it affects.int sage_bonus_degree; // How much bonus XP to give in that skill.int skill_cost_level;int total_skill_points;int exp_available;FixedArray<unsigned char, 6, 50> item_description;FixedVector<unique_item_status_type, MAX_UNRANDARTS> unique_items;FixedVector<bool, NUM_MONSTERS> unique_creatures;// NOTE: The kills member is a pointer to a KillMaster object,// rather than the object itself, so that we can get away with// just a foward declare of the KillMaster class, rather than// having to #include kills.h and thus make every single .cc file// dependant on kills.h. Having a pointer means that we have// to do our own implementations of copying the player object,// since the default implementations will lead to the kills member// pointing to freed memory, or worse yet lead to the same piece of// memory being freed twice.KillMaster* kills;level_area_type level_type;// Human-readable name for portal vault. Will be set to level_type_tag// if not explicitly set by the entry portal.std::string level_type_name;// Three-letter extension for portal vault bones files. Will be set// to first three letters of level_type_tag if not explicitly set by// the entry portal.std::string level_type_ext;// Abbreviation of portal vault name, for use in notes. If not// explicitly set by the portal vault, will be set from level_type_name// or level_type_tag if either is short enough, or the shorter of the// two will be truncated if neither is short enough.std::string level_type_name_abbrev;// Item origin string for items from portal vaults, so that dumps// can have origins like "You found it in on level 2 of a ziggurat".// Will be set relative to level_type_name if not explicitly set.std::string level_type_origin;// .des file tag for portal vaultstd::string level_type_tag;entry_cause_type entry_cause;god_type entry_cause_god;branch_type where_are_you;FixedVector<unsigned char, 30> branch_stairs;god_type religion;std::string second_god_name; // Random second name of Jiyvaunsigned char piety;unsigned char piety_hysteresis; // amount of stored-up dockingunsigned char gift_timeout;FixedVector<unsigned char, MAX_NUM_GODS> penance;FixedVector<unsigned char, MAX_NUM_GODS> worshipped;FixedVector<short, MAX_NUM_GODS> num_gifts;FixedVector<unsigned char, NUM_MUTATIONS> mutation;FixedVector<unsigned char, NUM_MUTATIONS> demon_pow;unsigned char magic_contamination;FixedVector<bool, NUM_FIXED_BOOKS> had_book;FixedVector<bool, NUM_SPELLS> seen_spell;unsigned char normal_vision; // how far the species gets to seeunsigned char current_vision; // current sight radius (cells)unsigned char hell_exit; // which level plyr goes to on hell exit.// This field is here even in non-WIZARD compiles, since the// player might have been playing previously under wiz mode.bool wizard; // true if player has entered wiz mode.time_t birth_time; // start time of gametime_t start_time; // start time of sessionlong real_time; // real time played (in seconds)long num_turns; // number of turns takenlong last_view_update; // what turn was the view last updated?int old_hunger; // used for hunger delta-meter (see output.cc)// Set when the character is going to a new level, to guard against levgen// failuresdungeon_feature_type transit_stair;bool entering_level;int lava_in_sight; // Is there lava in LoS?int water_in_sight; // Is there deep water in LoS?#ifdef USE_TILEcoord_def last_clicked_grid; // The map position the player last clicked on.int last_clicked_item; // The inventory cell the player last clicked on.
// Warning: these two are quite different.//// The spell table is an index to a specific spell slot (you.spells).// The ability table lists the ability (ABIL_*) which prefers that letter.//// In other words, the spell table contains hard links and the ability// table contains soft links.FixedVector<int, 52> spell_letter_table; // ref to spell by slotFixedVector<ability_type, 52> ability_letter_table; // ref to abil by enumstd::set<std::string> uniq_map_tags;std::set<std::string> uniq_map_names;PlaceInfo global_info;player_quiver* m_quiver;int escaped_death_cause;std::string escaped_death_aux;protected:FixedVector<PlaceInfo, NUM_BRANCHES> branch_info;FixedVector<PlaceInfo, NUM_LEVEL_AREA_TYPES - 1> non_branch_info;public:player();player(const player &other);~player();void copy_from(const player &other);void init();// Low-level move the player. Use this instead of changing pos directly.void moveto(const coord_def &c);// Move the player during an abyss shift.void shiftto(const coord_def &c);void reset_prev_move();bool in_water() const;bool can_swim() const;bool is_levitating() const;bool cannot_speak() const;bool invisible() const;bool can_see_invisible() const;bool visible_to(const actor *looker) const;bool can_see(const actor *target) const;bool is_icy() const;bool is_fiery() const;bool light_flight() const;bool travelling_light() const;kill_category kill_alignment() const;bool has_spell(spell_type spell) const;size_type transform_size(int psize = PSIZE_TORSO) const;std::string shout_verb() const;item_def *slot_item(equipment_type eq);// actorint id() const;int mindex() const;int get_experience_level() const;actor_type atype() const { return ACT_PLAYER; }god_type deity() const;bool alive() const;bool is_summoned(int* duration = NULL, int* summon_type = NULL) const;bool swimming() const;bool submerged() const;bool floundering() const;bool extra_balanced() const;bool can_pass_through_feat(dungeon_feature_type grid) const;bool is_habitable_feat(dungeon_feature_type actual_grid) const;size_type body_size(int psize = PSIZE_TORSO, bool base = false) const;int body_weight() const;int total_weight() const;int damage_brand(int which_attack = -1);int damage_type(int which_attack = -1);int has_claws(bool allow_tran = true) const;bool has_usable_claws(bool allow_tran = true) const;item_def *weapon(int which_attack = -1);item_def *shield();bool can_wield(const item_def &item,bool ignore_curse = false,bool ignore_brand = false,bool ignore_shield = false,bool ignore_transform = false) const;bool could_wield(const item_def &item,bool ignore_brand = false,bool ignore_transform = false) const;std::string name(description_level_type type,bool force_visible = false) const;std::string pronoun(pronoun_type pro, bool force_visible = false) const;std::string conj_verb(const std::string &verb) const;std::string hand_name(bool plural, bool *can_plural = NULL) const;std::string foot_name(bool plural, bool *can_plural = NULL) const;std::string arm_name(bool plural, bool *can_plural = NULL) const;bool fumbles_attack(bool verbose = true);bool cannot_fight() const;void attacking(actor *other);bool can_go_berserk() const;bool can_go_berserk(bool verbose) const;void go_berserk(bool intentional);bool can_mutate() const;bool can_safely_mutate() const;bool can_bleed() const;bool mutate();void backlight();void banish(const std::string &who = "");void blink(bool allow_partial_control = true);void teleport(bool right_now = false, bool abyss_shift = false);void drain_stat(int stat, int amount, actor* attacker);void expose_to_element(beam_type element, int strength = 0);void god_conduct(conduct_type thing_done, int level);int hunger_level() const { return hunger_state; }void make_hungry(int nutrition, bool silent = true);void poison(actor *agent, int amount = 1);bool sicken(int amount);void paralyse(actor *, int str);void petrify(actor *, int str);void slow_down(actor *, int str);void confuse(actor *, int strength);void heal(int amount, bool max_too = false);bool drain_exp(actor *, bool quiet = false, int pow = 3);bool rot(actor *, int amount, int immediate = 0, bool quiet = false);int hurt(const actor *attacker, int amount,beam_type flavour = BEAM_MISSILE,bool cleanup_dead = true);int warding() const;int mons_species() const;mon_holy_type holiness() const;int res_fire() const;int res_steam() const;int res_cold() const;int res_elec() const;int res_poison() const;int res_rotting() const;int res_asphyx() const;int res_sticky_flame() const;int res_holy_energy(const actor *) const;int res_negative_energy() const;int res_torment() const;bool confusable() const;bool slowable() const;flight_type flight_mode() const;bool permanent_levitation() const;bool permanent_flight() const;bool paralysed() const;bool cannot_move() const;bool cannot_act() const;bool confused() const;bool caught() const;bool backlit(bool check_haloed = true) const;bool haloed() const;bool asleep() const;void put_to_sleep(int power = 0);void awake();void check_awaken(int disturbance);bool can_throw_large_rocks() const;int armour_class() const;int melee_evasion(const actor *attacker) const;int stat_hp() const { return hp; }int stat_maxhp() const { return hp_max; }int shield_bonus() const;int shield_block_penalty() const;int shield_bypass_ability(int tohit) const;void shield_block_succeeded();bool wearing_light_armour(bool with_skill = false) const;void exercise(skill_type skill, int qty);int skill(skill_type skill, bool skill_bump = false) const;PlaceInfo& get_place_info() const ; // Current place infoPlaceInfo& get_place_info(branch_type branch,level_area_type level_type2) const;PlaceInfo& get_place_info(branch_type branch) const;PlaceInfo& get_place_info(level_area_type level_type2) const;void set_place_info(PlaceInfo info);// Returns copies of the PlaceInfo; modifying the vector won't// modify the player object.std::vector<PlaceInfo> get_all_place_info(bool visited_only = false,bool dungeon_only = false) const;bool do_shaft();bool did_escape_death() const;void reset_escaped_death();protected:void base_moveto(const coord_def &c);};
#ifndef MONSTER_H#define MONSTER_H#include "actor.h"class mon_enchant{public:enchant_type ench;int degree;int duration, maxduration;kill_category who; // Who set this enchantment?public:mon_enchant(enchant_type e = ENCH_NONE, int deg = 0,kill_category whose = KC_OTHER,int dur = 0);killer_type killer() const;int kill_agent() const;operator std::string () const;const char *kill_category_desc(kill_category) const;void merge_killer(kill_category who);void cap_degree();void set_duration(const monsters *mons, const mon_enchant *exist);bool operator < (const mon_enchant &other) const{return (ench < other.ench);}bool operator == (const mon_enchant &other) const{// NOTE: This does *not* check who/degree.return (ench == other.ench);}mon_enchant &operator += (const mon_enchant &other);mon_enchant operator + (const mon_enchant &other) const;private:int modded_speed(const monsters *mons, int hdplus) const;int calc_duration(const monsters *mons, const mon_enchant *added) const;};typedef std::map<enchant_type, mon_enchant> mon_enchant_list;struct monsterentry;class monsters : public actor{public:monsters();monsters(const monsters &other);~monsters();monsters &operator = (const monsters &other);void reset();public:std::string mname;int type;int hit_points;int max_hit_points;int hit_dice;int ac;int ev;int speed;int speed_increment;coord_def target;coord_def patrol_point;mutable montravel_target_type travel_target;std::vector<coord_def> travel_path;FixedVector<short, NUM_MONSTER_SLOTS> inv;monster_spells spells;mon_attitude_type attitude;beh_type behaviour;unsigned short foe;char ench_countdown;mon_enchant_list enchantments;unsigned long flags; // bitfield of boolean flagsunsigned long experience;monster_type base_monster; // zombie base monster, draconian colourunsigned int number; // #heads (hydra), etc.int colour;int foe_memory; // how long to 'remember' foe x,y// once they go out of sight.int shield_blocks; // Count of shield blocks this round.god_type god; // What god the monster worships, if// any.std::auto_ptr<ghost_demon> ghost; // Ghost information.std::string seen_context; // Non-standard context for// AI_SEE_MONSTERpublic:mon_attitude_type temp_attitude() const;// Returns true if the monster is named with a proper name, or is// a player ghost.bool is_named() const;// Does this monster have a base name, i.e. is base_name() != name().// See base_name() for details.bool has_base_name() const;const monsterentry *find_monsterentry() const;void init_experience();void mark_summoned(int longevity, bool mark_items_summoned,int summon_type = 0);bool is_summoned(int* duration = NULL, int* summon_type = NULL) const;bool has_action_energy() const;void check_redraw(const coord_def &oldpos) const;void apply_location_effects(const coord_def &oldpos);void moveto(const coord_def& c);bool move_to_pos(const coord_def &newpos);kill_category kill_alignment() const;int foe_distance() const;bool needs_berserk(bool check_spells = true) const;// Has a hydra-like variable number of attacks based on mons->number.bool has_hydra_multi_attack() const;bool has_multitargeting() const;bool has_ench(enchant_type ench) const;bool has_ench(enchant_type ench, enchant_type ench2) const;mon_enchant get_ench(enchant_type ench,enchant_type ench2 = ENCH_NONE) const;bool add_ench(const mon_enchant &);void update_ench(const mon_enchant &);bool del_ench(enchant_type ench, bool quiet = false, bool effect = true);bool lose_ench_duration(const mon_enchant &e, int levels);bool lose_ench_levels(const mon_enchant &e, int lev);void lose_energy(energy_use_type et, int div = 1, int mult = 1);void scale_hp(int num, int den);bool gain_exp(int exp);void react_to_damage(int damage, beam_type flavour, kill_category whose);void forget_random_spell();void add_enchantment_effect(const mon_enchant &me, bool quiet = false);void remove_enchantment_effect(const mon_enchant &me, bool quiet = false);void apply_enchantments();void apply_enchantment(const mon_enchant &me);bool can_drink_potion(potion_type ptype) const;bool should_drink_potion(potion_type ptype) const;item_type_id_state_type drink_potion_effect(potion_type ptype);void timeout_enchantments(int levels);bool is_travelling() const;bool is_patrolling() const;bool needs_transit() const;void set_transit(const level_id &destination);bool find_place_to_live(bool near_player = false);bool find_home_near_place(const coord_def &c);bool find_home_near_player();bool find_home_around(const coord_def &c, int radius);bool find_home_anywhere();void set_ghost(const ghost_demon &ghost, bool has_name = true);void ghost_init();void pandemon_init();void uglything_init(bool only_mutate = false);void uglything_mutate();void uglything_upgrade();void destroy_inventory();void load_spells(mon_spellbook_type spellbook);actor *get_foe() const;// actor interfaceint id() const;int mindex() const;int get_experience_level() const;god_type deity() const;bool alive() const;bool swimming() const;bool wants_submerge() const;bool submerged() const;bool can_drown() const;bool floundering() const;bool extra_balanced() const;bool can_pass_through_feat(dungeon_feature_type grid) const;bool is_habitable_feat(dungeon_feature_type actual_grid) const;size_type body_size(int psize = PSIZE_TORSO, bool base = false) const;int body_weight() const;int total_weight() const;int damage_brand(int which_attack = -1);int damage_type(int which_attack = -1);item_def *slot_item(equipment_type eq);item_def *mslot_item(mon_inv_type sl) const;item_def *weapon(int which_attack = -1);item_def *launcher();item_def *missiles();item_def *shield();bool can_wield(const item_def &item,bool ignore_curse = false,bool ignore_brand = false,bool ignore_shield = false,bool ignore_transform = false) const;bool could_wield(const item_def &item,bool ignore_brand = false,bool ignore_transform = false) const;int missile_count();void wield_melee_weapon(int near = -1);void swap_weapons(int near = -1);bool pickup_item(item_def &item, int near = -1, bool force = false);void pickup_message(const item_def &item, int near);bool pickup_wand(item_def &item, int near);bool pickup_scroll(item_def &item, int near);bool pickup_potion(item_def &item, int near);bool pickup_gold(item_def &item, int near);bool pickup_launcher(item_def &launcher, int near);bool pickup_melee_weapon(item_def &item, int near);bool pickup_throwable_weapon(item_def &item, int near);bool pickup_weapon(item_def &item, int near, bool force);bool pickup_armour(item_def &item, int near, bool force);bool pickup_misc(item_def &item, int near);bool pickup_missile(item_def &item, int near, bool force);void equip(item_def &item, int slot, int near = -1);bool unequip(item_def &item, int slot, int near = -1,bool force = false);bool can_use_missile(const item_def &item) const;std::string name(description_level_type type,bool force_visible = false) const;// Base name of the monster, bypassing any mname setting. For an orc priest// named Arbolt, name() will return "Arbolt", but base_name() will return// "orc priest".std::string base_name(description_level_type type,bool force_visible = false) const;// Full name of the monster. For an orc priest named Arbolt, full_name()// will return "Arbolt the orc priest".std::string full_name(description_level_type type,bool use_comma = false) const;std::string pronoun(pronoun_type pro, bool force_visible = false) const;std::string conj_verb(const std::string &verb) const;std::string hand_name(bool plural, bool *can_plural = NULL) const;std::string foot_name(bool plural, bool *can_plural = NULL) const;std::string arm_name(bool plural, bool *can_plural = NULL) const;bool fumbles_attack(bool verbose = true);bool cannot_fight() const;int skill(skill_type skill, bool skill_bump = false) const;void attacking(actor *other);bool can_go_berserk() const;void go_berserk(bool intentional);bool can_mutate() const;bool can_safely_mutate() const;bool can_bleed() const;bool mutate();void banish(const std::string &who = "");void expose_to_element(beam_type element, int strength = 0);bool visible() const;int mons_species() const;mon_holy_type holiness() const;int res_fire() const;int res_steam() const;int res_cold() const;int res_elec() const;int res_poison() const;int res_rotting() const;int res_asphyx() const;int res_sticky_flame() const;int res_holy_energy(const actor *) const;int res_negative_energy() const;int res_torment() const;flight_type flight_mode() const;bool is_levitating() const;bool invisible() const;bool can_see_invisible() const;bool visible_to(const actor *looker) const;bool mon_see_cell(const coord_def& pos, bool reach = false) const;bool can_see(const actor *target) const;bool is_icy() const;bool is_fiery() const;bool paralysed() const;bool cannot_move() const;bool cannot_act() const;bool confused() const;bool confused_by_you() const;bool caught() const;bool asleep() const;bool backlit(bool check_haloed = true) const;bool haloed() const;bool has_spell(spell_type spell) const;bool has_attack_flavour(int flavour) const;bool has_damage_type(int dam_type);bool can_throw_large_rocks() const;int armour_class() const;int melee_evasion(const actor *attacker) const;void poison(actor *agent, int amount = 1);bool sicken(int strength);void paralyse(actor *, int str);void petrify(actor *, int str);void slow_down(actor *, int str);void confuse(actor *, int strength);bool drain_exp(actor *, bool quiet = false, int pow = 3);bool rot(actor *, int amount, int immediate = 0, bool quiet = false);int hurt(const actor *attacker, int amount,beam_type flavour = BEAM_MISSILE,bool cleanup_dead = true);void heal(int amount, bool max_too = false);void blink(bool allow_partial_control = true);void teleport(bool right_now = false, bool abyss_shift = false);void put_to_sleep(int power = 0);void check_awaken(int disturbance);int stat_hp() const { return hit_points; }int stat_maxhp() const { return max_hit_points; }int shield_bonus() const;int shield_block_penalty() const;void shield_block_succeeded();int shield_bypass_ability(int tohit) const;actor_type atype() const { return ACT_MONSTER; }// Hacks, with a capital H.void fix_speed();void check_speed();void upgrade_type(monster_type after, bool adjust_hd, bool adjust_hp);std::string describe_enchantments() const;int action_energy(energy_use_type et) const;bool do_shaft();bool has_spell_of_type(unsigned) const;private:void init_with(const monsters &mons);void swap_slots(mon_inv_type a, mon_inv_type b);bool need_message(int &near) const;bool level_up();bool level_up_change();bool pickup(item_def &item, int slot, int near, bool force_merge = false);void equip_weapon(item_def &item, int near, bool msg = true);void equip_armour(item_def &item, int near);void unequip_weapon(item_def &item, int near, bool msg = true);void unequip_armour(item_def &item, int near);bool decay_enchantment(const mon_enchant &me, bool decay_degree = true);bool drop_item(int eslot, int near);bool wants_weapon(const item_def &item) const;bool wants_armour(const item_def &item) const;void lose_pickup_energy();bool check_set_valid_home(const coord_def &place,coord_def &chosen,int &nvalid) const;};#endif
}};class actor{public:virtual ~actor();virtual int id() const = 0;virtual int mindex() const = 0;virtual actor_type atype() const = 0;virtual kill_category kill_alignment() const = 0;virtual god_type deity() const = 0;virtual bool alive() const = 0;virtual bool is_summoned(int* duration = NULL,int* summon_type = NULL) const = 0;virtual void moveto(const coord_def &c) = 0;virtual const coord_def& pos() const { return position; }virtual coord_def& pos() { return position; }virtual bool swimming() const = 0;virtual bool submerged() const = 0;virtual bool floundering() const = 0;// Returns true if the actor is exceptionally well balanced.virtual bool extra_balanced() const = 0;virtual int get_experience_level() const = 0;virtual bool can_pass_through_feat(dungeon_feature_type grid) const = 0;virtual bool can_pass_through(int x, int y) const;virtual bool can_pass_through(const coord_def &c) const;virtual bool is_habitable_feat(dungeon_feature_type actual_grid) const = 0;bool is_habitable(const coord_def &pos) const;virtual size_type body_size(int psize = PSIZE_TORSO,bool base = false) const = 0;virtual int body_weight() const = 0;virtual int total_weight() const = 0;virtual int damage_brand(int which_attack = -1) = 0;virtual int damage_type(int which_attack = -1) = 0;virtual item_def *weapon(int which_attack = -1) = 0;virtual item_def *shield() = 0;virtual item_def *slot_item(equipment_type eq) = 0;// Just a wrapper; not to be overriddenconst item_def *slot_item(equipment_type eq) const{return const_cast<actor*>(this)->slot_item(eq);}virtual bool has_equipped(equipment_type eq, int sub_type) const;bool can_wield(const item_def* item,bool ignore_curse = false,bool ignore_brand = false,bool ignore_shield = false,bool ignore_transform = false) const;virtual bool can_wield(const item_def &item,bool ignore_curse = false,bool ignore_brand = false,bool ignore_shield = false,bool ignore_transform = false) const = 0;virtual bool could_wield(const item_def &item,bool ignore_brand = false,bool ignore_transform = false) const = 0;virtual int hunger_level() const { return HS_ENGORGED; }virtual void make_hungry(int nutrition, bool silent = true){}// Need not be implemented for the player - player action costs// are explicitly calculated.virtual void lose_energy(energy_use_type, int div = 1, int mult = 1){}virtual std::string name(description_level_type type,bool force_visible = false) const = 0;virtual std::string pronoun(pronoun_type which_pronoun,bool force_visible = false) const = 0;virtual std::string conj_verb(const std::string &verb) const = 0;virtual std::string hand_name(bool plural,bool *can_plural = NULL) const = 0;virtual std::string foot_name(bool plural,bool *can_plural = NULL) const = 0;virtual std::string arm_name(bool plural,bool *can_plural = NULL) const = 0;virtual bool fumbles_attack(bool verbose = true) = 0;// Returns true if the actor has no way to attack (plants, statues).// (statues have only indirect attacks).virtual bool cannot_fight() const = 0;virtual void attacking(actor *other) = 0;virtual bool can_go_berserk() const = 0;virtual bool can_see_invisible() const = 0;virtual bool invisible() const = 0;virtual bool visible_to(const actor *looker) const = 0;virtual bool can_see(const actor *target) const = 0;virtual bool is_icy() const = 0;virtual bool is_fiery() const = 0;virtual void go_berserk(bool intentional) = 0;virtual bool can_mutate() const = 0;virtual bool can_safely_mutate() const = 0;virtual bool can_bleed() const = 0;virtual bool mutate() = 0;virtual bool drain_exp(actor *agent, bool quiet = false, int pow = 3) = 0;virtual bool rot(actor *agent, int amount, int immediate = 0,bool quiet = false) = 0;virtual int hurt(const actor *attacker, int amount,beam_type flavour = BEAM_MISSILE,bool cleanup_dead = true) = 0;virtual void heal(int amount, bool max_too = false) = 0;virtual void banish(const std::string &who = "") = 0;virtual void blink(bool allow_partial_control = true) = 0;virtual void teleport(bool right_now = false, bool abyss_shift = false) = 0;virtual void poison(actor *attacker, int amount = 1) = 0;virtual bool sicken(int amount) = 0;virtual void paralyse(actor *attacker, int strength) = 0;virtual void petrify(actor *attacker, int strength) = 0;virtual void slow_down(actor *attacker, int strength) = 0;virtual void confuse(actor *attacker, int strength) = 0;virtual void expose_to_element(beam_type element, int strength = 0) = 0;virtual void drain_stat(int stat, int amount, actor* attacker) { }virtual void put_to_sleep(int power = 0) { };virtual void check_awaken(int disturbance) = 0;virtual bool wearing_light_armour(bool = false) const { return (true); }virtual int skill(skill_type sk, bool skill_bump = false) const{return (0);}virtual void exercise(skill_type sk, int qty) { }virtual int stat_hp() const = 0;virtual int stat_maxhp() const = 0;virtual bool can_throw_large_rocks() const = 0;virtual int armour_class() const = 0;virtual int melee_evasion(const actor *attacker) const = 0;virtual int shield_bonus() const = 0;virtual int shield_block_penalty() const = 0;virtual int shield_bypass_ability(int tohit) const = 0;virtual void shield_block_succeeded() { }virtual int mons_species() const = 0;virtual mon_holy_type holiness() const = 0;virtual int res_fire() const = 0;virtual int res_steam() const = 0;virtual int res_cold() const = 0;virtual int res_elec() const = 0;virtual int res_poison() const = 0;virtual int res_rotting() const = 0;virtual int res_asphyx() const = 0;virtual int res_sticky_flame() const = 0;virtual int res_holy_energy(const actor *attacker) const = 0;virtual int res_negative_energy() const = 0;virtual int res_torment() const = 0;virtual flight_type flight_mode() const = 0;virtual bool is_levitating() const = 0;virtual bool airborne() const;virtual bool paralysed() const = 0;virtual bool cannot_move() const = 0;virtual bool cannot_act() const = 0;virtual bool confused() const = 0;virtual bool caught() const = 0;virtual bool asleep() const { return (false); }virtual bool backlit(bool check_haloed = true) const = 0;virtual bool haloed() const = 0;virtual bool handle_trap();virtual void god_conduct(conduct_type thing_done, int level) { }virtual bool incapacitated() const{return cannot_move() || asleep() || confused() || caught();
virtual int warding() const{return (0);}virtual bool visible() const{return (true);}virtual bool has_spell(spell_type spell) const = 0;virtual bool will_trigger_shaft() const;virtual level_id shaft_dest() const;virtual bool do_shaft() = 0;coord_def position;
};struct cloud_struct{coord_def pos;cloud_type type;int decay;unsigned char spread_rate;kill_category whose;killer_type killer;cloud_struct() : pos(), type(CLOUD_NONE), decay(0), spread_rate(0),whose(KC_OTHER), killer(KILL_NONE){}void set_whose(kill_category _whose);void set_killer(killer_type _killer);static kill_category killer_to_whose(killer_type killer);static killer_type whose_to_killer(kill_category whose);
class player : public actor{public:bool turn_is_over; // flag signaling that player has performed a timed action// If true, player is headed to the Abyss.bool banished;std::string banished_by;std::vector<int> mesmerised_by; // monsters mesmerising playerint friendly_pickup; // pickup setting for alliesunsigned short prev_targ;coord_def prev_grd_targ;char your_name[kNameLen];species_type species;job_type char_class;// Coordinates of last travel target; note that this is never used by// travel itself, only by the level-map to remember the last travel target.short travel_x, travel_y;runrest running; // Nonzero if running/traveling.unsigned short unrand_reacts;double elapsed_time; // total amount of elapsed time in the gameunsigned char synch_time; // amount to wait before calling handle_time()unsigned char disease;char max_level;coord_def youpos;coord_def prev_move;int hunger;FixedVector<char, NUM_EQUIP> equip;int hp;int hp_max;int base_hp; // temporary max HP loss (rotting)int base_hp2; // base HPs from levels (and permanent loss)int magic_points;int max_magic_points;int base_magic_points; // temporary max MP loss? (currently unused)int base_magic_points2; // base MPs from levels and potions of magicchar strength;char intel;char dex;char max_strength;char max_intel;char max_dex;stat_type last_chosen;char hunger_state;bool wield_change; // redraw weaponbool redraw_quiver; // redraw quiverbool received_weapon_warning;unsigned long redraw_status_flags;// PC's symbol (usually @) and colour.int symbol;int colour;bool redraw_hit_points;bool redraw_magic_points;bool redraw_strength;bool redraw_intelligence;bool redraw_dexterity;bool redraw_experience;bool redraw_armour_class;bool redraw_evasion;unsigned char flash_colour;unsigned char hit_points_regeneration;unsigned char magic_points_regeneration;unsigned long experience;int experience_level;int gold;char class_name[30];int time_taken;int shield_blocks; // number of shield blocks since last actionFixedVector< item_def, ENDOFPACK > inv;int burden;burden_state_type burden_state;FixedVector<spell_type, 25> spells;char spell_no;game_direction_type char_direction;bool opened_zot;bool royal_jelly_dead;bool transform_cancellable;unsigned short pet_target;int your_level; // offset by one (-1 == 0, 0 == 1, etc.) for display// durational thingsFixedVector<int, NUM_DURATIONS> duration;int rotting;int berserk_penalty; // penalty for moving while berserkFixedVector<unsigned long, NUM_ATTRIBUTES> attribute;FixedVector<unsigned char, NUM_QUIVER> quiver; // default items for quiverFixedVector<long, NUM_OBJECT_CLASSES> sacrifice_value;undead_state_type is_undead;delay_queue_type delay_queue; // pending actionsFixedVector<unsigned char, 50> skills;FixedVector<bool, 50> practise_skill;FixedVector<unsigned int, 50> skill_points;FixedVector<unsigned char, 50> skill_order;skill_type sage_bonus_skill; // If Sage is in effect, which skill it affects.int sage_bonus_degree; // How much bonus XP to give in that skill.int skill_cost_level;int total_skill_points;int exp_available;FixedArray<unsigned char, 6, 50> item_description;FixedVector<unique_item_status_type, MAX_UNRANDARTS> unique_items;FixedVector<bool, NUM_MONSTERS> unique_creatures;// NOTE: The kills member is a pointer to a KillMaster object,// rather than the object itself, so that we can get away with// just a foward declare of the KillMaster class, rather than// having to #include kills.h and thus make every single .cc file// dependant on kills.h. Having a pointer means that we have// to do our own implementations of copying the player object,// since the default implementations will lead to the kills member// pointing to freed memory, or worse yet lead to the same piece of// memory being freed twice.KillMaster* kills;level_area_type level_type;// Human-readable name for portal vault. Will be set to level_type_tag// if not explicitly set by the entry portal.std::string level_type_name;// Three-letter extension for portal vault bones files. Will be set// to first three letters of level_type_tag if not explicitly set by// the entry portal.std::string level_type_ext;// Abbreviation of portal vault name, for use in notes. If not// explicitly set by the portal vault, will be set from level_type_name// or level_type_tag if either is short enough, or the shorter of the// two will be truncated if neither is short enough.std::string level_type_name_abbrev;// Item origin string for items from portal vaults, so that dumps// can have origins like "You found it in on level 2 of a ziggurat".// Will be set relative to level_type_name if not explicitly set.std::string level_type_origin;// .des file tag for portal vaultstd::string level_type_tag;entry_cause_type entry_cause;god_type entry_cause_god;branch_type where_are_you;FixedVector<unsigned char, 30> branch_stairs;god_type religion;std::string second_god_name; // Random second name of Jiyvaunsigned char piety;unsigned char piety_hysteresis; // amount of stored-up dockingunsigned char gift_timeout;FixedVector<unsigned char, MAX_NUM_GODS> penance;FixedVector<unsigned char, MAX_NUM_GODS> worshipped;FixedVector<short, MAX_NUM_GODS> num_gifts;FixedVector<unsigned char, NUM_MUTATIONS> mutation;FixedVector<unsigned char, NUM_MUTATIONS> demon_pow;unsigned char magic_contamination;FixedVector<bool, NUM_FIXED_BOOKS> had_book;FixedVector<bool, NUM_SPELLS> seen_spell;unsigned char normal_vision; // how far the species gets to seeunsigned char current_vision; // current sight radius (cells)unsigned char hell_exit; // which level plyr goes to on hell exit.// This field is here even in non-WIZARD compiles, since the// player might have been playing previously under wiz mode.bool wizard; // true if player has entered wiz mode.time_t birth_time; // start time of gametime_t start_time; // start time of sessionlong real_time; // real time played (in seconds)long num_turns; // number of turns takenlong last_view_update; // what turn was the view last updated?int old_hunger; // used for hunger delta-meter (see output.cc)// Set when the character is going to a new level, to guard against levgen// failuresdungeon_feature_type transit_stair;bool entering_level;int lava_in_sight; // Is there lava in LoS?int water_in_sight; // Is there deep water in LoS?#ifdef USE_TILEcoord_def last_clicked_grid; // The map position the player last clicked on.int last_clicked_item; // The inventory cell the player last clicked on.#endif// Warning: these two are quite different.//// The spell table is an index to a specific spell slot (you.spells).// The ability table lists the ability (ABIL_*) which prefers that letter.//// In other words, the spell table contains hard links and the ability// table contains soft links.FixedVector<int, 52> spell_letter_table; // ref to spell by slotFixedVector<ability_type, 52> ability_letter_table; // ref to abil by enumstd::set<std::string> uniq_map_tags;std::set<std::string> uniq_map_names;PlaceInfo global_info;player_quiver* m_quiver;int escaped_death_cause;std::string escaped_death_aux;protected:FixedVector<PlaceInfo, NUM_BRANCHES> branch_info;FixedVector<PlaceInfo, NUM_LEVEL_AREA_TYPES - 1> non_branch_info;public:player();player(const player &other);~player();void copy_from(const player &other);void init();// Low-level move the player. Use this instead of changing pos directly.void moveto(const coord_def &c);// Move the player during an abyss shift.void shiftto(const coord_def &c);void reset_prev_move();bool in_water() const;bool can_swim() const;bool is_levitating() const;bool cannot_speak() const;bool invisible() const;bool can_see_invisible() const;bool visible_to(const actor *looker) const;bool can_see(const actor *target) const;bool is_icy() const;bool is_fiery() const;bool light_flight() const;bool travelling_light() const;kill_category kill_alignment() const;bool has_spell(spell_type spell) const;size_type transform_size(int psize = PSIZE_TORSO) const;std::string shout_verb() const;item_def *slot_item(equipment_type eq);// actorint id() const;int mindex() const;int get_experience_level() const;actor_type atype() const { return ACT_PLAYER; }god_type deity() const;bool alive() const;bool is_summoned(int* duration = NULL, int* summon_type = NULL) const;bool swimming() const;bool submerged() const;bool floundering() const;bool extra_balanced() const;bool can_pass_through_feat(dungeon_feature_type grid) const;bool is_habitable_feat(dungeon_feature_type actual_grid) const;size_type body_size(int psize = PSIZE_TORSO, bool base = false) const;int body_weight() const;int total_weight() const;int damage_brand(int which_attack = -1);int damage_type(int which_attack = -1);int has_claws(bool allow_tran = true) const;bool has_usable_claws(bool allow_tran = true) const;item_def *weapon(int which_attack = -1);item_def *shield();
std::string name(description_level_type type,bool force_visible = false) const;std::string pronoun(pronoun_type pro, bool force_visible = false) const;std::string conj_verb(const std::string &verb) const;std::string hand_name(bool plural, bool *can_plural = NULL) const;std::string foot_name(bool plural, bool *can_plural = NULL) const;std::string arm_name(bool plural, bool *can_plural = NULL) const;
void attacking(actor *other);bool can_go_berserk() const;bool can_go_berserk(bool verbose) const;void go_berserk(bool intentional);bool can_mutate() const;bool can_safely_mutate() const;bool can_bleed() const;bool mutate();void backlight();void banish(const std::string &who = "");void blink(bool allow_partial_control = true);void teleport(bool right_now = false, bool abyss_shift = false);void drain_stat(int stat, int amount, actor* attacker);void expose_to_element(beam_type element, int strength = 0);void god_conduct(conduct_type thing_done, int level);int hunger_level() const { return hunger_state; }void make_hungry(int nutrition, bool silent = true);void poison(actor *agent, int amount = 1);bool sicken(int amount);void paralyse(actor *, int str);void petrify(actor *, int str);void slow_down(actor *, int str);void confuse(actor *, int strength);void heal(int amount, bool max_too = false);bool drain_exp(actor *, bool quiet = false, int pow = 3);bool rot(actor *, int amount, int immediate = 0, bool quiet = false);int hurt(const actor *attacker, int amount,beam_type flavour = BEAM_MISSILE,bool cleanup_dead = true);int warding() const;int mons_species() const;mon_holy_type holiness() const;int res_fire() const;int res_steam() const;int res_cold() const;int res_elec() const;int res_poison() const;int res_rotting() const;int res_asphyx() const;int res_sticky_flame() const;int res_holy_energy(const actor *) const;int res_negative_energy() const;int res_torment() const;bool confusable() const;bool slowable() const;flight_type flight_mode() const;bool permanent_levitation() const;bool permanent_flight() const;bool paralysed() const;bool cannot_move() const;bool cannot_act() const;bool confused() const;bool caught() const;bool backlit(bool check_haloed = true) const;bool haloed() const;bool asleep() const;void put_to_sleep(int power = 0);void awake();void check_awaken(int disturbance);bool can_throw_large_rocks() const;int armour_class() const;int melee_evasion(const actor *attacker) const;int stat_hp() const { return hp; }int stat_maxhp() const { return hp_max; }int shield_bonus() const;int shield_block_penalty() const;int shield_bypass_ability(int tohit) const;void shield_block_succeeded();bool wearing_light_armour(bool with_skill = false) const;void exercise(skill_type skill, int qty);int skill(skill_type skill, bool skill_bump = false) const;PlaceInfo& get_place_info() const ; // Current place infoPlaceInfo& get_place_info(branch_type branch,level_area_type level_type2) const;PlaceInfo& get_place_info(branch_type branch) const;PlaceInfo& get_place_info(level_area_type level_type2) const;void set_place_info(PlaceInfo info);// Returns copies of the PlaceInfo; modifying the vector won't// modify the player object.std::vector<PlaceInfo> get_all_place_info(bool visited_only = false,bool dungeon_only = false) const;bool do_shaft();bool did_escape_death() const;void reset_escaped_death();protected:void base_moveto(const coord_def &c);};extern player you;
class mon_enchant{public:enchant_type ench;int degree;int duration, maxduration;kill_category who; // Who set this enchantment?public:mon_enchant(enchant_type e = ENCH_NONE, int deg = 0,kill_category whose = KC_OTHER,int dur = 0);killer_type killer() const;int kill_agent() const;operator std::string () const;const char *kill_category_desc(kill_category) const;void merge_killer(kill_category who);void cap_degree();void set_duration(const monsters *mons, const mon_enchant *exist);bool operator < (const mon_enchant &other) const{return (ench < other.ench);}bool operator == (const mon_enchant &other) const{// NOTE: This does *not* check who/degree.return (ench == other.ench);}mon_enchant &operator += (const mon_enchant &other);mon_enchant operator + (const mon_enchant &other) const;private:int modded_speed(const monsters *mons, int hdplus) const;int calc_duration(const monsters *mons, const mon_enchant *added) const;};typedef std::map<enchant_type, mon_enchant> mon_enchant_list;struct monsterentry;class monsters : public actor{public:monsters();monsters(const monsters &other);~monsters();monsters &operator = (const monsters &other);void reset();public:std::string mname;int type;int hit_points;int max_hit_points;int hit_dice;int ac;int ev;int speed;int speed_increment;coord_def target;coord_def patrol_point;mutable montravel_target_type travel_target;std::vector<coord_def> travel_path;FixedVector<short, NUM_MONSTER_SLOTS> inv;monster_spells spells;mon_attitude_type attitude;beh_type behaviour;unsigned short foe;char ench_countdown;mon_enchant_list enchantments;unsigned long flags; // bitfield of boolean flagsunsigned long experience;monster_type base_monster; // zombie base monster, draconian colourunsigned int number; // #heads (hydra), etc.int colour;int foe_memory; // how long to 'remember' foe x,y// once they go out of sight.int shield_blocks; // Count of shield blocks this round.god_type god; // What god the monster worships, if// any.std::auto_ptr<ghost_demon> ghost; // Ghost information.std::string seen_context; // Non-standard context for// AI_SEE_MONSTERpublic:mon_attitude_type temp_attitude() const;// Returns true if the monster is named with a proper name, or is// a player ghost.bool is_named() const;// Does this monster have a base name, i.e. is base_name() != name().// See base_name() for details.bool has_base_name() const;const monsterentry *find_monsterentry() const;void init_experience();void mark_summoned(int longevity, bool mark_items_summoned,int summon_type = 0);bool is_summoned(int* duration = NULL, int* summon_type = NULL) const;bool has_action_energy() const;void check_redraw(const coord_def &oldpos) const;void apply_location_effects(const coord_def &oldpos);void moveto(const coord_def& c);bool move_to_pos(const coord_def &newpos);kill_category kill_alignment() const;int foe_distance() const;bool needs_berserk(bool check_spells = true) const;// Has a hydra-like variable number of attacks based on mons->number.bool has_hydra_multi_attack() const;bool has_multitargeting() const;bool has_ench(enchant_type ench) const;bool has_ench(enchant_type ench, enchant_type ench2) const;mon_enchant get_ench(enchant_type ench,enchant_type ench2 = ENCH_NONE) const;bool add_ench(const mon_enchant &);void update_ench(const mon_enchant &);bool del_ench(enchant_type ench, bool quiet = false, bool effect = true);bool lose_ench_duration(const mon_enchant &e, int levels);bool lose_ench_levels(const mon_enchant &e, int lev);void lose_energy(energy_use_type et, int div = 1, int mult = 1);void scale_hp(int num, int den);bool gain_exp(int exp);void react_to_damage(int damage, beam_type flavour, kill_category whose);void forget_random_spell();void add_enchantment_effect(const mon_enchant &me, bool quiet = false);void remove_enchantment_effect(const mon_enchant &me, bool quiet = false);void apply_enchantments();void apply_enchantment(const mon_enchant &me);bool can_drink_potion(potion_type ptype) const;bool should_drink_potion(potion_type ptype) const;item_type_id_state_type drink_potion_effect(potion_type ptype);void timeout_enchantments(int levels);
class actor;class monsters;
bool is_travelling() const;bool is_patrolling() const;bool needs_transit() const;void set_transit(const level_id &destination);bool find_place_to_live(bool near_player = false);bool find_home_near_place(const coord_def &c);bool find_home_near_player();bool find_home_around(const coord_def &c, int radius);bool find_home_anywhere();void set_ghost(const ghost_demon &ghost, bool has_name = true);void ghost_init();void pandemon_init();void uglything_init(bool only_mutate = false);void uglything_mutate();void uglything_upgrade();void destroy_inventory();void load_spells(mon_spellbook_type spellbook);actor *get_foe() const;// actor interfaceint id() const;int mindex() const;int get_experience_level() const;god_type deity() const;bool alive() const;bool swimming() const;bool wants_submerge() const;bool submerged() const;bool can_drown() const;bool floundering() const;bool extra_balanced() const;bool can_pass_through_feat(dungeon_feature_type grid) const;bool is_habitable_feat(dungeon_feature_type actual_grid) const;size_type body_size(int psize = PSIZE_TORSO, bool base = false) const;int body_weight() const;int total_weight() const;int damage_brand(int which_attack = -1);int damage_type(int which_attack = -1);item_def *slot_item(equipment_type eq);item_def *mslot_item(mon_inv_type sl) const;item_def *weapon(int which_attack = -1);item_def *launcher();item_def *missiles();item_def *shield();bool can_wield(const item_def &item,bool ignore_curse = false,bool ignore_brand = false,bool ignore_shield = false,bool ignore_transform = false) const;bool could_wield(const item_def &item,bool ignore_brand = false,bool ignore_transform = false) const;int missile_count();void wield_melee_weapon(int near = -1);void swap_weapons(int near = -1);bool pickup_item(item_def &item, int near = -1, bool force = false);void pickup_message(const item_def &item, int near);bool pickup_wand(item_def &item, int near);bool pickup_scroll(item_def &item, int near);bool pickup_potion(item_def &item, int near);bool pickup_gold(item_def &item, int near);bool pickup_launcher(item_def &launcher, int near);bool pickup_melee_weapon(item_def &item, int near);bool pickup_throwable_weapon(item_def &item, int near);bool pickup_weapon(item_def &item, int near, bool force);bool pickup_armour(item_def &item, int near, bool force);bool pickup_misc(item_def &item, int near);bool pickup_missile(item_def &item, int near, bool force);void equip(item_def &item, int slot, int near = -1);bool unequip(item_def &item, int slot, int near = -1,bool force = false);bool can_use_missile(const item_def &item) const;std::string name(description_level_type type,bool force_visible = false) const;// Base name of the monster, bypassing any mname setting. For an orc priest// named Arbolt, name() will return "Arbolt", but base_name() will return// "orc priest".std::string base_name(description_level_type type,bool force_visible = false) const;// Full name of the monster. For an orc priest named Arbolt, full_name()// will return "Arbolt the orc priest".std::string full_name(description_level_type type,bool use_comma = false) const;std::string pronoun(pronoun_type pro, bool force_visible = false) const;std::string conj_verb(const std::string &verb) const;std::string hand_name(bool plural, bool *can_plural = NULL) const;std::string foot_name(bool plural, bool *can_plural = NULL) const;std::string arm_name(bool plural, bool *can_plural = NULL) const;bool fumbles_attack(bool verbose = true);bool cannot_fight() const;int skill(skill_type skill, bool skill_bump = false) const;void attacking(actor *other);bool can_go_berserk() const;void go_berserk(bool intentional);bool can_mutate() const;bool can_safely_mutate() const;bool can_bleed() const;bool mutate();void banish(const std::string &who = "");void expose_to_element(beam_type element, int strength = 0);bool visible() const;int mons_species() const;mon_holy_type holiness() const;int res_fire() const;int res_steam() const;int res_cold() const;int res_elec() const;int res_poison() const;int res_rotting() const;int res_asphyx() const;int res_sticky_flame() const;int res_holy_energy(const actor *) const;int res_negative_energy() const;int res_torment() const;flight_type flight_mode() const;bool is_levitating() const;bool invisible() const;bool can_see_invisible() const;bool visible_to(const actor *looker) const;bool mon_see_cell(const coord_def& pos, bool reach = false) const;bool can_see(const actor *target) const;bool is_icy() const;bool is_fiery() const;bool paralysed() const;bool cannot_move() const;bool cannot_act() const;bool confused() const;bool confused_by_you() const;bool caught() const;bool asleep() const;bool backlit(bool check_haloed = true) const;bool haloed() const;bool has_spell(spell_type spell) const;bool has_attack_flavour(int flavour) const;bool has_damage_type(int dam_type);bool can_throw_large_rocks() const;int armour_class() const;int melee_evasion(const actor *attacker) const;void poison(actor *agent, int amount = 1);bool sicken(int strength);void paralyse(actor *, int str);void petrify(actor *, int str);void slow_down(actor *, int str);void confuse(actor *, int strength);bool drain_exp(actor *, bool quiet = false, int pow = 3);bool rot(actor *, int amount, int immediate = 0, bool quiet = false);int hurt(const actor *attacker, int amount,beam_type flavour = BEAM_MISSILE,bool cleanup_dead = true);void heal(int amount, bool max_too = false);void blink(bool allow_partial_control = true);void teleport(bool right_now = false, bool abyss_shift = false);void put_to_sleep(int power = 0);void check_awaken(int disturbance);int stat_hp() const { return hit_points; }int stat_maxhp() const { return max_hit_points; }int shield_bonus() const;int shield_block_penalty() const;void shield_block_succeeded();int shield_bypass_ability(int tohit) const;actor_type atype() const { return ACT_MONSTER; }// Hacks, with a capital H.void fix_speed();void check_speed();void upgrade_type(monster_type after, bool adjust_hd, bool adjust_hp);std::string describe_enchantments() const;int action_energy(energy_use_type et) const;bool do_shaft();bool has_spell_of_type(unsigned) const;private:void init_with(const monsters &mons);void swap_slots(mon_inv_type a, mon_inv_type b);bool need_message(int &near) const;bool level_up();bool level_up_change();bool pickup(item_def &item, int slot, int near, bool force_merge = false);void equip_weapon(item_def &item, int near, bool msg = true);void equip_armour(item_def &item, int near);void unequip_weapon(item_def &item, int near, bool msg = true);void unequip_armour(item_def &item, int near);bool decay_enchantment(const mon_enchant &me, bool decay_degree = true);bool drop_item(int eslot, int near);bool wants_weapon(const item_def &item) const;bool wants_armour(const item_def &item) const;void lose_pickup_energy();bool check_set_valid_home(const coord_def &place,coord_def &chosen,int &nvalid) const;};struct cloud_struct{coord_def pos;cloud_type type;int decay;unsigned char spread_rate;kill_category whose;killer_type killer;cloud_struct() : pos(), type(CLOUD_NONE), decay(0), spread_rate(0),whose(KC_OTHER), killer(KILL_NONE){}void set_whose(kill_category _whose);void set_killer(killer_type _killer);static kill_category killer_to_whose(killer_type killer);static killer_type whose_to_killer(kill_category whose);};struct shop_struct{coord_def pos;unsigned char greed;shop_type type;unsigned char level;FixedVector<unsigned char, 3> keeper_name;};
typedef FixedArray<dungeon_feature_type, GXM, GYM> feature_grid;typedef FixedArray<unsigned, ENV_SHOW_DIAMETER, ENV_SHOW_DIAMETER>env_show_grid;class crawl_exit_hook;struct crawl_environment{public:unsigned char rock_colour;unsigned char floor_colour;FixedVector< item_def, MAX_ITEMS > item; // item listFixedVector< monsters, MAX_MONSTERS > mons; // monster listfeature_grid grid; // terrain gridFixedArray< unsigned short, GXM, GYM > mgrid; // monster gridFixedArray< int, GXM, GYM > igrid; // item gridFixedArray< unsigned short, GXM, GYM > cgrid; // cloud gridFixedArray< unsigned short, GXM, GYM > grid_colours; // colour overridesFixedArray< map_cell, GXM, GYM > map; // discovered terrain// Glyphs of squares that are in LOS.env_show_grid show;// What would be visible, if all of the translucent wall were// made opaque.env_show_grid no_trans_show;FixedArray<unsigned short, ENV_SHOW_DIAMETER, ENV_SHOW_DIAMETER>show_col; // view window colour#ifdef USE_TILE// indexed by grid coordsFixedArray<tile_fg_store, GXM, GYM> tile_bk_fg;FixedArray<unsigned int, GXM, GYM> tile_bk_bg;FixedArray<tile_flavour, GXM, GYM> tile_flv;// indexed by (show-1) coordsFixedArray<unsigned int, ENV_SHOW_DIAMETER, ENV_SHOW_DIAMETER> tile_fg;FixedArray<unsigned int, ENV_SHOW_DIAMETER, ENV_SHOW_DIAMETER> tile_bg;tile_flavour tile_default;#endifFixedVector< cloud_struct, MAX_CLOUDS > cloud; // cloud listunsigned char cloud_no;FixedVector< shop_struct, MAX_SHOPS > shop; // shop listFixedVector< trap_def, MAX_TRAPS > trap; // trap listFixedVector< monster_type, 20 > mons_alloc;map_markers markers;// Place to associate arbitrary data with a particular level.// Sort of like player::attributeCrawlHashTable properties;// Rate at which random monsters spawn, with lower numbers making// them spawn more often (5 or less causes one to spawn about every// 5 turns). Set to 0 to stop random generation.int spawn_random_rate;double elapsed_time; // used during level load// Number of turns the player has spent on this level.int turns_on_level;// Flags for things like preventing teleport control; see// level_flag_type in enum.hunsigned long level_flags;coord_def sanctuary_pos;int sanctuary_time;};extern struct crawl_environment env;
#ifndef ENV_H#define ENV_H#include "monster.h"class crawl_exit_hook;struct crawl_environment{public:unsigned char rock_colour;unsigned char floor_colour;FixedVector< item_def, MAX_ITEMS > item; // item listFixedVector< monsters, MAX_MONSTERS > mons; // monster listfeature_grid grid; // terrain gridFixedArray< unsigned short, GXM, GYM > mgrid; // monster gridFixedArray< int, GXM, GYM > igrid; // item gridFixedArray< unsigned short, GXM, GYM > cgrid; // cloud gridFixedArray< unsigned short, GXM, GYM > grid_colours; // colour overridesFixedArray< map_cell, GXM, GYM > map; // discovered terrain// Glyphs of squares that are in LOS.env_show_grid show;// What would be visible, if all of the translucent wall were// made opaque.env_show_grid no_trans_show;FixedArray<unsigned short, ENV_SHOW_DIAMETER, ENV_SHOW_DIAMETER>show_col; // view window colour#ifdef USE_TILE// indexed by grid coordsFixedArray<tile_fg_store, GXM, GYM> tile_bk_fg;FixedArray<unsigned int, GXM, GYM> tile_bk_bg;FixedArray<tile_flavour, GXM, GYM> tile_flv;// indexed by (show-1) coordsFixedArray<unsigned int, ENV_SHOW_DIAMETER, ENV_SHOW_DIAMETER> tile_fg;FixedArray<unsigned int, ENV_SHOW_DIAMETER, ENV_SHOW_DIAMETER> tile_bg;tile_flavour tile_default;#endifFixedVector< cloud_struct, MAX_CLOUDS > cloud; // cloud listunsigned char cloud_no;FixedVector< shop_struct, MAX_SHOPS > shop; // shop listFixedVector< trap_def, MAX_TRAPS > trap; // trap listFixedVector< monster_type, 20 > mons_alloc;map_markers markers;// Place to associate arbitrary data with a particular level.// Sort of like player::attributeCrawlHashTable properties;// Rate at which random monsters spawn, with lower numbers making// them spawn more often (5 or less causes one to spawn about every// 5 turns). Set to 0 to stop random generation.int spawn_random_rate;double elapsed_time; // used during level load// Number of turns the player has spent on this level.int turns_on_level;// Flags for things like preventing teleport control; see// level_flag_type in enum.hunsigned long level_flags;coord_def sanctuary_pos;int sanctuary_time;};extern struct crawl_environment env;#endif
#ifndef ACTOR_H#define ACTOR_Hclass actor{public:virtual ~actor();virtual int id() const = 0;virtual int mindex() const = 0;virtual actor_type atype() const = 0;virtual kill_category kill_alignment() const = 0;virtual god_type deity() const = 0;virtual bool alive() const = 0;virtual bool is_summoned(int* duration = NULL,int* summon_type = NULL) const = 0;virtual void moveto(const coord_def &c) = 0;virtual const coord_def& pos() const { return position; }virtual coord_def& pos() { return position; }virtual bool swimming() const = 0;virtual bool submerged() const = 0;virtual bool floundering() const = 0;// Returns true if the actor is exceptionally well balanced.virtual bool extra_balanced() const = 0;virtual int get_experience_level() const = 0;virtual bool can_pass_through_feat(dungeon_feature_type grid) const = 0;virtual bool can_pass_through(int x, int y) const;virtual bool can_pass_through(const coord_def &c) const;virtual bool is_habitable_feat(dungeon_feature_type actual_grid) const = 0;bool is_habitable(const coord_def &pos) const;virtual size_type body_size(int psize = PSIZE_TORSO,bool base = false) const = 0;virtual int body_weight() const = 0;virtual int total_weight() const = 0;virtual int damage_brand(int which_attack = -1) = 0;virtual int damage_type(int which_attack = -1) = 0;virtual item_def *weapon(int which_attack = -1) = 0;virtual item_def *shield() = 0;virtual item_def *slot_item(equipment_type eq) = 0;// Just a wrapper; not to be overriddenconst item_def *slot_item(equipment_type eq) const{return const_cast<actor*>(this)->slot_item(eq);}virtual bool has_equipped(equipment_type eq, int sub_type) const;bool can_wield(const item_def* item,bool ignore_curse = false,bool ignore_brand = false,bool ignore_shield = false,bool ignore_transform = false) const;virtual bool can_wield(const item_def &item,bool ignore_curse = false,bool ignore_brand = false,bool ignore_shield = false,bool ignore_transform = false) const = 0;virtual bool could_wield(const item_def &item,bool ignore_brand = false,bool ignore_transform = false) const = 0;virtual int hunger_level() const { return HS_ENGORGED; }virtual void make_hungry(int nutrition, bool silent = true){}// Need not be implemented for the player - player action costs// are explicitly calculated.virtual void lose_energy(energy_use_type, int div = 1, int mult = 1){}virtual std::string name(description_level_type type,bool force_visible = false) const = 0;virtual std::string pronoun(pronoun_type which_pronoun,bool force_visible = false) const = 0;virtual std::string conj_verb(const std::string &verb) const = 0;virtual std::string hand_name(bool plural,bool *can_plural = NULL) const = 0;virtual std::string foot_name(bool plural,bool *can_plural = NULL) const = 0;virtual std::string arm_name(bool plural,bool *can_plural = NULL) const = 0;virtual bool fumbles_attack(bool verbose = true) = 0;// Returns true if the actor has no way to attack (plants, statues).// (statues have only indirect attacks).virtual bool cannot_fight() const = 0;virtual void attacking(actor *other) = 0;virtual bool can_go_berserk() const = 0;virtual bool can_see_invisible() const = 0;virtual bool invisible() const = 0;virtual bool visible_to(const actor *looker) const = 0;virtual bool can_see(const actor *target) const = 0;virtual bool is_icy() const = 0;virtual bool is_fiery() const = 0;virtual void go_berserk(bool intentional) = 0;virtual bool can_mutate() const = 0;virtual bool can_safely_mutate() const = 0;virtual bool can_bleed() const = 0;virtual bool mutate() = 0;virtual bool drain_exp(actor *agent, bool quiet = false, int pow = 3) = 0;virtual bool rot(actor *agent, int amount, int immediate = 0,bool quiet = false) = 0;virtual int hurt(const actor *attacker, int amount,beam_type flavour = BEAM_MISSILE,bool cleanup_dead = true) = 0;virtual void heal(int amount, bool max_too = false) = 0;virtual void banish(const std::string &who = "") = 0;virtual void blink(bool allow_partial_control = true) = 0;virtual void teleport(bool right_now = false, bool abyss_shift = false) = 0;virtual void poison(actor *attacker, int amount = 1) = 0;virtual bool sicken(int amount) = 0;virtual void paralyse(actor *attacker, int strength) = 0;virtual void petrify(actor *attacker, int strength) = 0;virtual void slow_down(actor *attacker, int strength) = 0;virtual void confuse(actor *attacker, int strength) = 0;virtual void expose_to_element(beam_type element, int strength = 0) = 0;virtual void drain_stat(int stat, int amount, actor* attacker) { }virtual void put_to_sleep(int power = 0) { };virtual void check_awaken(int disturbance) = 0;virtual bool wearing_light_armour(bool = false) const { return (true); }virtual int skill(skill_type sk, bool skill_bump = false) const{return (0);}virtual void exercise(skill_type sk, int qty) { }virtual int stat_hp() const = 0;virtual int stat_maxhp() const = 0;virtual bool can_throw_large_rocks() const = 0;virtual int armour_class() const = 0;virtual int melee_evasion(const actor *attacker) const = 0;virtual int shield_bonus() const = 0;virtual int shield_block_penalty() const = 0;virtual int shield_bypass_ability(int tohit) const = 0;virtual void shield_block_succeeded() { }virtual int mons_species() const = 0;virtual mon_holy_type holiness() const = 0;virtual int res_fire() const = 0;virtual int res_steam() const = 0;virtual int res_cold() const = 0;virtual int res_elec() const = 0;virtual int res_poison() const = 0;virtual int res_rotting() const = 0;virtual int res_asphyx() const = 0;virtual int res_sticky_flame() const = 0;virtual int res_holy_energy(const actor *attacker) const = 0;virtual int res_negative_energy() const = 0;virtual int res_torment() const = 0;virtual flight_type flight_mode() const = 0;virtual bool is_levitating() const = 0;virtual bool airborne() const;virtual bool paralysed() const = 0;virtual bool cannot_move() const = 0;virtual bool cannot_act() const = 0;virtual bool confused() const = 0;virtual bool caught() const = 0;virtual bool asleep() const { return (false); }virtual bool backlit(bool check_haloed = true) const = 0;virtual bool haloed() const = 0;virtual bool handle_trap();virtual void god_conduct(conduct_type thing_done, int level) { }virtual bool incapacitated() const{return cannot_move() || asleep() || confused() || caught();}virtual int warding() const{return (0);}virtual bool visible() const{return (true);}virtual bool has_spell(spell_type spell) const = 0;virtual bool will_trigger_shaft() const;virtual level_id shaft_dest() const;virtual bool do_shaft() = 0;coord_def position;};#endif