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
#endif
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 player
int friendly_pickup; // pickup setting for allies
unsigned 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 game
unsigned 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 magic
char 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 weapon
bool redraw_quiver; // redraw quiver
bool 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 action
FixedVector< 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 things
FixedVector<int, NUM_DURATIONS> duration;
int rotting;
int berserk_penalty; // penalty for moving while berserk
FixedVector<unsigned long, NUM_ATTRIBUTES> attribute;
FixedVector<unsigned char, NUM_QUIVER> quiver; // default items for quiver
FixedVector<long, NUM_OBJECT_CLASSES> sacrifice_value;
undead_state_type is_undead;
delay_queue_type delay_queue; // pending actions
FixedVector<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 vault
std::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 Jiyva
unsigned char piety;
unsigned char piety_hysteresis; // amount of stored-up docking
unsigned 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 see
unsigned 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 game
time_t start_time; // start time of session
long real_time; // real time played (in seconds)
long num_turns; // number of turns taken
long 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
// failures
dungeon_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_TILE
coord_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 slot
FixedVector<ability_type, 52> ability_letter_table; // ref to abil by enum
std::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);
// actor
int 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 info
PlaceInfo& 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 flags
unsigned long experience;
monster_type base_monster; // zombie base monster, draconian colour
unsigned 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_MONSTER
public:
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 interface
int 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 overridden
const 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 player
int friendly_pickup; // pickup setting for allies
unsigned 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 game
unsigned 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 magic
char 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 weapon
bool redraw_quiver; // redraw quiver
bool 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 action
FixedVector< 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 things
FixedVector<int, NUM_DURATIONS> duration;
int rotting;
int berserk_penalty; // penalty for moving while berserk
FixedVector<unsigned long, NUM_ATTRIBUTES> attribute;
FixedVector<unsigned char, NUM_QUIVER> quiver; // default items for quiver
FixedVector<long, NUM_OBJECT_CLASSES> sacrifice_value;
undead_state_type is_undead;
delay_queue_type delay_queue; // pending actions
FixedVector<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 vault
std::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 Jiyva
unsigned char piety;
unsigned char piety_hysteresis; // amount of stored-up docking
unsigned 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 see
unsigned 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 game
time_t start_time; // start time of session
long real_time; // real time played (in seconds)
long num_turns; // number of turns taken
long 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
// failures
dungeon_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_TILE
coord_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 slot
FixedVector<ability_type, 52> ability_letter_table; // ref to abil by enum
std::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);
// actor
int 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 info
PlaceInfo& 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 flags
unsigned long experience;
monster_type base_monster; // zombie base monster, draconian colour
unsigned 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_MONSTER
public:
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 interface
int 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 list
FixedVector< monsters, MAX_MONSTERS > mons; // monster list
feature_grid grid; // terrain grid
FixedArray< unsigned short, GXM, GYM > mgrid; // monster grid
FixedArray< int, GXM, GYM > igrid; // item grid
FixedArray< unsigned short, GXM, GYM > cgrid; // cloud grid
FixedArray< unsigned short, GXM, GYM > grid_colours; // colour overrides
FixedArray< 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 coords
FixedArray<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) coords
FixedArray<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;
#endif
FixedVector< cloud_struct, MAX_CLOUDS > cloud; // cloud list
unsigned char cloud_no;
FixedVector< shop_struct, MAX_SHOPS > shop; // shop list
FixedVector< trap_def, MAX_TRAPS > trap; // trap list
FixedVector< monster_type, 20 > mons_alloc;
map_markers markers;
// Place to associate arbitrary data with a particular level.
// Sort of like player::attribute
CrawlHashTable 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.h
unsigned 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 list
FixedVector< monsters, MAX_MONSTERS > mons; // monster list
feature_grid grid; // terrain grid
FixedArray< unsigned short, GXM, GYM > mgrid; // monster grid
FixedArray< int, GXM, GYM > igrid; // item grid
FixedArray< unsigned short, GXM, GYM > cgrid; // cloud grid
FixedArray< unsigned short, GXM, GYM > grid_colours; // colour overrides
FixedArray< 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 coords
FixedArray<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) coords
FixedArray<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;
#endif
FixedVector< cloud_struct, MAX_CLOUDS > cloud; // cloud list
unsigned char cloud_no;
FixedVector< shop_struct, MAX_SHOPS > shop; // shop list
FixedVector< trap_def, MAX_TRAPS > trap; // trap list
FixedVector< monster_type, 20 > mons_alloc;
map_markers markers;
// Place to associate arbitrary data with a particular level.
// Sort of like player::attribute
CrawlHashTable 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.h
unsigned long level_flags;
coord_def sanctuary_pos;
int sanctuary_time;
};
extern struct crawl_environment env;
#endif
#ifndef ACTOR_H
#define ACTOR_H
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 overridden
const 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