git-svn-id: https://crawl-ref.svn.sourceforge.net/svnroot/crawl-ref/trunk@10271 c06c8d41-db1a-0410-9941-cceddc491573
5WVUTEZLEZEML54CKPR6GACQBYY3EMVNXMLJOREN6SSEUZGC47AQC
RDS3NSFOLBAEGHBFEQ4TODN5QSJ2DLDM2SIVVUMA6IVRHAZLRVKQC
Q43X3MHS6IVLGSIIUJMTZT6NO6S4BDAUAJE4UJBXN4KWRFPLYZEAC
WUCXHWMF2FL5KCC6E6KNKMYL2NBXXC3WVRY2AUPWSBAPWJFGS34QC
5VUJ4K2LSY35LKIKRCY7YIQP4GK6AYOZ5QUL6G4NSO5DIX2Z2XSQC
P2C3BQS22ZA4FBKNNKNSPT7II6BO5BA4ZFUKBOYYTW4VP4BJDWEQC
GNVJ7ESHE4IPEZCRTBTHUQXSZWWKXLOU76G3XSTEAURMI4JCPLMAC
NZFL7NLM45VHI2KKS6ADHIYBORGAUHANELYTFBAK6GNFHAUNZJDAC
BR6HF3PWCXUG24OBIWTCZ64DDVBA2G6BQBDJ5V5WMARRQBG2CLGQC
LQL6F3NIIER36EKJ5XE2LVIH56R75ENH6L2UJDD3RKXYUBYMJRCAC
LOAPDCDZDTOXBCNX7IQBCACP7TCMVUBNZVUTUCLX5VXM7MEFPQBQC
7NRMOLVOLPSF4KW23GZOO4X6BMGSMBE3IDMO4WOKBZXPYCLRZIXQC
WRDCASRSGOBY5RLVORAMRBSYKEWLLO7VZ4V5NQG2TKBWYNU4OZKAC
OY7HY5MTXM2OO43HM2GYUS5U3MBTKDM66IALE5OXAXF2EGYVAEGQC
2JEJP4VO4NUN5X63WT54RWIXPJLHB6NJ7LVGQCU2QHO7CRBIPT2AC
MG6LLF3XYCOEBQRX7TJ4MUTKM3IROYWUMZGCMYVW4TGDG36CJMJQC
4LNIHTHZTCOEZEHZ4GW6WCZH4UCDWKK5UVUKEDODEBBS4YH2KONQC
K2CS6TCX2NDVL2ASEHGP4J4K4IJ6FP3ANNKTSIWVG43HPYSBX6ZQC
PFEJ4LMDNEKLMGRCMWQ7EIRVU4JMYGICI4G7X4WVWOROVXQCBZ7QC
CQ24AVAI6SW3AHTIDMLPSTRRBEU6FHRF5I5FD6G5QIYE6PO4BQMQC
L57WEZMVIHTFRLWVIPWOIOWHCF2I53TVUVYJ2V6IZ64R56FVTZZAC
J7VTRSN2BLWL7QJMHG73LBUOUL6WNNT2ZAVEDMGYB6SDX3L5GGYQC
4SUUJM2DQUEWHDG3UKJUDZABLHFVF2CFUX5GVAWKT7BBBGR2ISTQC
25CH7HH4LKXFIZ75YNMXS3TSXO6O27DYSOPLOD45K4OCNFWLS4LQC
HBXWZNXAJ7LUX7FYUIHQYBTRMWVJC6CAQQL3NNZHK5ETLIFEZJ7QC
TPZWAV3USKO7RX4IGHLZKVPRN36K33PJPSZYL6FZMX4XBHTYOQYAC
DCZMEKDHQWSQCQYQD6ZXB3XOMWLVLPSPVSBVVMPXMSZF7GO3BVCAC
AM7QPHDAWNXHLUEVUHVRHG2RO2DOIEFFU4GV3DCIROW6O5HW7H4AC
PSCYVKJ7DGXAL3V5U4O6AJTRV6Q3N3SHQWAZ73VIPRTE4W64F2XAC
M7WTOF3BVX5MGA7AQZB22YEFWCSL7RLW54PQM3MTRLCKUCUZZEUAC
IPPPBA4G2LODBP3EJIYGUAAOMHKLNBXHBD7KVX2JVDTA4DETHO4AC
Q3B3UVMYEVC4YJUPYVSNTR4DJH4E6J4JJDHZNT5LNOCHCPPMEMXAC
22ZPAVDZLX4R66AODFVA56HH4T3XU62UUON6LYZG3GGTXCTD3YVAC
XDJGQNFELURGXMUAOOVALQMSLAJVHMG63KPKVA33HTJFVZROGZ4AC
QO5ZJWQ3JK3PEGBPTQSAYIPEJEHG2M2KTD74227G5VG7DVXUL3BQC
IP4STBRVFU5OPNAPM2XZWU77PXHKLOPBW5EGLGB4ZHYNZS7QKTKAC
NVD2HSEW2ONWNYDDCTOMZZOUP6NG4DCXI4LNYYIY4BQEBDMJQK5AC
LM764EO6YIFOKMRXWZ5S4GYZB4BHZQDTEFP7MEVYO4NN4EDOFGNQC
NDKS43E4XVAU3FDY276OF5JW7E5SF6F5EJD2XLV5JLKZ5W6N554QC
N73PR6EHLADBQDS2XACPYB27U6A3JV3UVI7JAFFOJKCMYCH7DDEQC
PRQVFUGUGPKI2Q74ODEI3CYUJQB63CKC6ONQTE3BTOHKXG4JCNLQC
P52QVYEFQXNK6IXNN2EMZIBLOIHHGQ7LODWIGWPJLANGVIPQK5IAC
JW2KRJHES33W7UTWZ6NDO4TLMK4EFU4HKZXBWR2UJOMPCCOTR4CQC
RWSXCNYUGDSMP2GKN22HROC5Q2GHSAVJJUDRT3Z53WU2DAI4IZOQC
6YE7VMQJZ633V2FJFP2JQC5R37MMOBPE2PVIZWW7VYAO6BOJB73AC
DF5LOTJFSXOT7UBDHLBDLGA22OY4L7ZF6CVFP6H3KL4N5CHB5C5QC
WXZQJUZXMYS7R6ORNB7DWE5KEUXT262GXWMRPOJYYB4I3BFGYLLAC
P2OYYNPHIBGOLT4CRLNTTIXDN34EU2QCMFQJNLAMUAHQXZTEDPXQC
DHALALIGG7PVB52N6PDZRMXGML6MV53MUJBLO2ZP3L24H7EVVBWQC
KHYL5UOMGS7HLVEQNVIOYWNP2ZH2THKZ5CGGIZFI6NN5V2YD3YEAC
L4DV5O3UTY456Y6YFXELHEWEFLB6ZUCENZ3AKYJZLGRRGUVHT5QAC
AWPVLDOOVIARJANEGN2TXGMZSSHJI4WMGMYRH6OOSFSEQUIDY6GQC
EI5XQIKW3OBVTDVT2A4Q535I5FOVEKARLFISM457IHGAK7TVOMVAC
C2VJXKTIPFZ34C6L6FNCDAGEI7NLTKUXTNB7RN4EYAJCALULIBMQC
5WKKONCYM73GBJ6GDYK3OLZ2PB7KJHFDYGEMHQQMPQMFJJHTLWCQC
IYMUEJG2VI3TV7HVAZIU2L4DVQY7VNSIFVV4I3QIVP7H66EVJISAC
RB6RQE2N3EKJKFHCM4UCMBHG5OH7EA24SYM3PSXIJDOVXYL4VUMQC
3XQAOZVTIDFQ7EUC36J2AFMTHZXLZ3G5MBHFN5JZWEWWCXFENHRAC
NG53L53MSFQZAIVKHG54IEMXNJ33AYVPF2OZM4MMJFDKEJCGPBSAC
RPOZZWKG5GLPHVZZ7ZKMKS64ZMV2LDCQSARBJFJ6FZOTOKCQO7FAC
SA36K3OJ75PNVR2F4QAPNU2LUGFTVHNIAZVSXCBXBT2NLW2RTUPAC
R5HVRGDKUX6A2H4DRHGWFBC2P625VAJHDZTERDMLFVXWSZLMHKRAC
NMZFKLRNGUMWPRLQCGHJPKTEFPPBIGMM2MEND5CR3QIEF5Z6BQDAC
SWOYPTHJAWFEDBMB3ROT33VQZIXGZD5UOXEV456DDUENW2HGA66QC
EOJPYR3QD5GGS7GB2P7SBLMOP7YC57YMIVR7VKCOMWNCKNBPESBQC
PG5XH3WD6YPDOIZQ7SGHCQVXSDP5KQIGZLG7QNGHQVU6ULAVJWFAC
NLQNXH3SVJ52CWXEV35FSSZP32VHC4QFGN3HINF4KO5GZHZMOBKQC
FDMKFGCTWKKSBP3B5VE4BSVFHUVNX5BSDFRVD6E735DHPVYEQFGQC
CQD3RU44235F3CYFDZBC3JRT2H3AE7PXJNVBBMCRF65Q5LPA3EHQC
WHY6LRRJ5T2NSBE3IUCR4X3TOAH7TTK5NPUPUIFT7TPNJ6J4HBDAC
OWERGKLVPNPGIIS23FZ7ZDOBWUIXCKYAFG3URXU75JAUDX3N5ENAC
6PAG7GHXHIYXJPPTEK4KZQZT4CL2SJDAGTVIUDB4KK66PVSTWUMAC
PWYWF6M5DPBIANK2MGGVHFC3VUNAT4BHILSG2IPOPKIZBOAIAK7QC
NUYGFMQOZK32XUFTDPGTZ25L7JGOU532S2D4MELYJB5GQL7KNGOAC
HCVH2CWL32UD66O6Z7ZYDUASWN3RF5TW6FSWURGMD7MELKB772FAC
KFULGQQOHWUTXOM3BXCCYPGGVGGY4Z6265XUFRCBPNLTZAEHJZSQC
CGYTZT5QWIEGYKUOLOK7MFXSLJKLYRZONER5ZCDZO5XYWSLG475QC
GSS3OCYMI4MYKACCGNLFA267VDH2U7G4QVVDLMOVAUHZTYQ3QJDAC
TW7QOMTSLYPGUUWHGHLY5G5LV6QQRQIKK4BSE64RY7RDGKVDHCEAC
CLIEHAE2PP7ZIGLLIMYCWM4FC54KBOAN5AILOLAZJ5S26GTJM4RQC
IIN7AVA6JYRBXH6ZYRR7BY7TV6PW7ANAQ2A3PD55FKBKKQFEEF2AC
RTNCVAW3IRKSTVGF2RKT4MFCXNSMA6LHW45QVO4FZNYUNMRLJT2AC
QYUAYEGK7WPBJLZRSWZVDWD5SMNAWWIJSQPWYA7BEYXMEBD2SDKAC
KDWQP5WMMIAZGQQPXSI36IQBVZNGQFE2Z4N33QLKOMEKWEIRVKLAC
4ZSVHDY23VI2FMLU5Z2CJ35SAPDQRREM6RABZ4GEILWI7NRULQNAC
EXZ3JJJIBWKHQ7XSJPC6P3LOKAALMJHUX3CGIL6FO5KPNTFMLE4QC
NO2HRD7RZS42S55UG4FQ5EFQDY6WYWKGIXHUKYLWF36HHE3VZ7WAC
F5G5PCHLAXLGPJA3E4Y4TJ6RZ5PNWNIYHGMJ366J6VGGGPHGSY5QC
27JI3J23EXDY2G4X7NHTFTSHSEUDGDPFOYPG6P53UNSSJP3DDQTAC
ODQ7LIJ2UROGGENIORRXZFWII3ZM2N45YD53FKWDQB7LLRXR4PHAC
JJULXW764V5C2HJKZNWQAEWB6QM5YZADD7ZCE35LYTBFEM6PMYCAC
SDLKLUNFGVKDS55DDJZCBAVIB7NL3RRYPTACAY65SCUQKV6APFSAC
XZTGZ7MOPX7ZOHQ4IQPXOHGUH5WPRNOYAQ6IQOMZDZYNVSAYFTNAC
KAOE5HB3THUKVGFZRO5EZESHEB3Q34WUO5DFMLWIKOBF47LZTIYAC
NVSFIV2ZKP44XHCSCXG6OZVGL67OIFINC34J2EMKTA4KULCERUEAC
CRUW4EVU3UDWNKXBCPWWHWXXGE7EMEHKK3PLLUD7NWPYY4K2R3YAC
WKJIIZMCJLMWUIIXBVXBU2G4UJONM46JIEWK7U6XIPFZUOIFFBMAC
2IPPYYFWEFI342OOKTTEKMLLBUFPERK7RNLBF2TWQF5D47M6PSTAC
VEVPRVWGRHRKBBUTO64ELK3NPZANUQI3ZZ7F23YXJQLKIORUW3HQC
P5TRGRH7XMQSPCZKM5IEEO34TY6WMLGHHX7BU6Y453JFRXLUR2VQC
TJ72NVTRNJKF55RTH5MRLTHHVPOJ2M5OOYEWF4UFLTO2PPPTU6PQC
R3ZUGT5VJ2DG5NFPG4RBWDWTULDE7L4REYSGVPHJPDXFG6OBIXYAC
JGKYRZ34S3I23PMJX6IUBR7EHEFD6I4XXEGXNT7GKT2M2VIRBSMQC
Y2NYY7HWFZ2LQDK3ACSLGS37F2J2IJ5LRGCIMZYXLEOSVPD3A4DAC
UZ6N6HOUPGVSPC5NQROEEDWMEGJA5XUWUY2AKH5QG65AZ25PVXDAC
3XL4DKV7PSWAU3ZBJSKZFJ2VUYABC47I7KKWGIRCJYXULQD453MQC
GPEJOT73KMACP33IPAKFR5ROGHCOIP22VXZMQNYTGLEA2OSZUM2AC
PKHOZG6TIUP2NZZIP6CW5OIPZ3O6PCGWXXW5MH4I6P2WVM24HZEQC
B4YYKEZVHLGRFAHEP5ATEV4MYRPGXQPWTUXGGG7ITZH3ZGV3VMBQC
ZVG6W2UMHJ3GHLF4ZVCUHZOOEUNJMWPURVBN2OQXKVTXYC4Z2LPQC
KO7TLN7OM7UQF33RRTOFPFTDQLTYCOE4N7KWQUTWRIUSEB6PQ4WQC
2ILR4SBFXZDMIOMZ6RPUR5I4OKON2QHBSO23TDD5KI77NTOI4OWQC
LOEVXFCKSHE3TCQSUSHOIHHVDJT3RFLE6U3VDI6JXAQTQI5KCJ4AC
5BPJZOGZ6VTUNTJXBTP22KIPGT5NNNSXZVW5J2BGQYBP4MTCZ3CQC
X5WLJCJVW55SXZVP7IKP7ADCJIGNKN4PKAXFECVR6TNK7XSMZR7QC
2G7MZ653N3JUHJ4DA5Q7VRO3S5T27DLPKDCJEKB6DGYSTXULUVWAC
KEWUUIWZCM2VE6WZX4BC4DXGL7LBAWGLUPCPA4KCBCUL5ZQLECBAC
Q3XHNSHW6FI4JCXSEABATRFBJPMCF7PXNG2K6ZQTRRPVMIZFHUBQC
YF2GZWXNV6NVFFEBEOYS67JQJQK2IUS5BZMGJW3XQPYIJYHQJCEQC
TO43FWKHNIA5MVDOFXYHQODTLBQYEZKX5UIUGID57436UF7G2EXQC
IGN3Q5YCLHXKWFZQRSRABCHW2JFW5TFVU7TM5EXE2EW7PDBBSQWAC
HSIGNHMJYSWABSW7TG2AGX5GVA5J7LMHDXA3MNGYDOSFBROO5PBAC
WCK6TM2ZD56WSOK6SMMKBYAYGG4OUCTILLMVVLMB4QO5I5S2IVNAC
AFE345BJ7IX2YYYX3I5I6RYLXNWJCFE4WMH6F5JMIR6X7WUP75CAC
AUXHSGS4EFOPZ6TVZYWNVOUDO7NYKUKE3HBKGQQWTALSVFOE3HAAC
6L4EP4ZRWWYLT55PD5KTTJON5J2JB5VV5MWNHF5VPZQZ5BKEYZ4QC
4FQAKUKUO6PCAZ3N4HUR5XL6E4VA5UQUZ3AEDGRBLVY7W2LMWI7QC
WLBSQ2ESMTOPKZUFZL6KPKKTRPW5Y2LDJO6F34K6WSNE7H77KFKAC
JV7RFSC2MQ3X2ZZB24SLNIWRWGYVLEMPG3G3ZVZHON7S3HXC7OZQC
UXYQEI6GLKABRWITOJVAFK5QETIMVRRBJO3DCHFUAC5A6YTVI64QC
NHCEH7ZFP3IFRMZMC25ZA2X5ZSS3MOCHCYLVCSVY7RTY62WX7UAQC
TFQQFUXNCKWDRDLMHZWXYQQS7CS5DHTLESFCOHIU7PIJ2VNFBAEQC
GTPAKUU3R5AS3LQNCCZIP3BWV473RM4EB2AIS4FXAJRXHEOVH2PAC
KZWOHH536QBWAPWROR32EOXEK5LRY6I5VHVL7HHI7GOFKCMQTCSQC
KQNMFSLV62B4ANDKTUZ7LQH2MD2NDGNCP55MKM5YAATQ4T52H2PQC
BNRY5YIXLFE2TDNU2JQHWWXJQVWNSEWQ52DU7XUWIT5DZWKGBDDAC
T4FNOPMWYYJHJBTTY33PB43HTJPKEC46L62YERTWIX73HYZSELXQC
AYU5OVG2HZO46KDAPKUWAVHS5HTYFKUWIMIRMTHAXVVFEDJE7YPAC
EHL7B5UIYYHSFX3KXQ43C4GNFJSEUEXFF7U3IL7XU6E5R675WS7AC
WP5VP57D5BWKDAS7AA224OV2RX4O4BPTI2BLY7TS3T2O2PLUGXCQC
HIRKGUMNJPWKSVTR6TVBPD3MWNA63CEHCLCIPWEMGDFHVB3NPLDQC
PKXXBHS3LWLPZI2QVRX22MSQ4R2626IXRSNHFFYHXYTLJJQU54LQC
PDOFPXD2X6VI23AHKCGQ5RVDBG74CNP2E3YOHKXLOARHHBXEK3HQC
HB27XKFYVYIEQZGBCEZ6LKPUBMXLIPDAAS636GJ5TULIQ7KND5KQC
GQL5SIGBHLU3FMCE54XVGLRY5AZHRM6DUEB722REA2DPLGJSN6EQC
SGQFZEDSAJWZSZ6RUF2WNWNLSD2Y6QH72L4PWLLZBLQL3G5PFWBQC
TDXC5VWE2B5VVGNXEF7V5E6UCKCSAIZVLJXFIOQ4G4A2PK5L7BBQC
RIGGVFYNCRFDUUCMIAN7SDEOUL4VMMZI6OYXZW72BVNI4WXJQXWQC
SIDH2P7NBIG5KEOE27XHD3ZT2NQ2OJZFN6VZXWNWYFFY5YVXSSVQC
MRUMXF3YPJCHAW4DC7DHJR5O77LXAJLMA53IOJP4YEMAOZRNWNKAC
3QK2EPUWNVFFHIJ3BPR3COPVI7EMDDD75PCLKMAVY2RRAPSACBWQC
VXWDDKBETFFMU7LMGN4UGB74NNKXW456KFJMWWEVOTWH35NZZZHAC
W2KRIXSCRJPS6WDIYTHVF5IRMF3V5DWECRAWUPVTB7VZ6A2BLD4QC
WFMQVPMMOPG5SBJD5LUBOIYWRMXVWK3FXENK7SAEGZ5T6XWFKERQC
5FHWTG7M6FW4B3I33YI7QSM3OZIB6ZGC6TI6JISSLY5Y43HI56VAC
4S7GTHOCXO5MLS3DKSZWUYYZFBVNHDG6RFJONUALXVA7CCPFKXKAC
CH7JECYYH35H4TRHRNRTRJCQTQLZ2WRH62TKV72SUIU2RTK5OH7AC
AVSWNOP23Z2QCLQGXFDZV7TI4RC3XSXHIX2HDXFHXGKDEZSSIGJQC
ZK5H5YBD3R7H3KKNKSJYE65TUEPPWIWUJLU567FKSZYQYIW6ZVFAC
2IJDLTWK74ULETLFTIPUIY2MSG6RNONVAFNFE7MADPT6UNYSSBDAC
GE5BVIRQVT4PARCIODIUK5UXW4AYLFR55UCA4J2DIJU4AMYWQIZAC
WXSNNK2RXP3DQFAEQGQUZJHFWXJC7ZKG2WURZGL566UDM4YXFSWQC
H5BVKRORNXTCJKFXQPTFWDURKSUFW24CGSJXBGZCJUP4DHMSVDBQC
stop_running();
}
}
}
void slime_conversion(monsters* monster)
{
if (you.religion == GOD_JIYVA && mons_is_slime(monster)
&& !mons_is_summoned(monster)
&& !mons_is_shapeshifter(monster)
&& !mons_neutral(monster)
&& !mons_friendly(monster)
&& !testbits(monster->flags, MF_ATT_CHANGE_ATTEMPT)
&& mons_player_visible(monster) && !mons_is_sleeping(monster)
&& !mons_is_confused(monster) && !mons_is_paralysed(monster))
{
monster->flags |= MF_ATT_CHANGE_ATTEMPT;
if (!player_under_penance())
{
jiyva_convert_slime(monster);
// Zin worshippers are the only ones who can pray to ask Zin for
// stuff.
if (prayed_for != (you.religion == GOD_ZIN))
// Zin and Jiyva worshippers are the only ones who can pray to ask their
// god for stuff.
if (prayed_for != (you.religion == GOD_ZIN || you.religion == GOD_JIYVA))
}
break;
case GOD_JIYVA:
if (prayed_for && jiyva_grant_jelly())
{
int jelly_count = 0;
for (radius_iterator ri(you.pos(), 9); ri; ++ri)
{
int item = igrd(*ri);
if (item != NON_ITEM)
{
for (stack_iterator si(*ri); si; ++si)
if (si != NON_ITEM && one_chance_in(7))
jelly_count++;
}
}
if (jelly_count >= 1)
{
int count_created = 0;
for (; jelly_count > 0; --jelly_count)
{
mgen_data mg(MONS_JELLY, BEH_STRICT_NEUTRAL, 0, 0,
you.pos(), MHITNOT, 0, GOD_JIYVA);
if (create_monster(mg) != -1)
count_created++;
// Sanity check: Stop if spawning further jellies
// would excommunicate us.
if (you.piety - (count_created+1) * 5 <= 0)
break;
}
if (count_created > 0)
{
mprf(MSGCH_PRAY, "%s!",
count_created > 1 ? "Some jellies appear"
: "A jelly appears");
}
you.piety -= 5 * count_created;
}
static bool _jiyva_retribution()
{
const god_type god = GOD_JIYVA;
if (you.is_undead || one_chance_in(4)
|| player_mutation_level(MUT_MUTATION_RESISTANCE) == 3)
{
const monster_type slimes[] = {
MONS_GIANT_EYEBALL, MONS_EYE_OF_DRAINING,
MONS_EYE_OF_DEVASTATION, MONS_GREAT_ORB_OF_EYES,
MONS_GIANT_SPORE, MONS_SHINING_EYE, MONS_GIANT_ORANGE_BRAIN,
MONS_JELLY, MONS_BROWN_OOZE, MONS_ACID_BLOB, MONS_AZURE_JELLY,
MONS_DEATH_OOZE, MONS_SLIME_CREATURE
};
const int how_many = 1 + (you.experience_level / 10) + random2(3);
bool success = false;
for (int i = 0; i < how_many; ++i)
{
const monster_type mon = RANDOM_ELEMENT(slimes);
if (create_monster(
mgen_data::hostile_at( static_cast<monster_type>(mon),
you.pos(), 0, 0, true, god)) != -1)
{
success = true;
}
}
if (success)
god_speaks(god, "Some slimes ooze up out of the ground!");
else
simple_god_message("The ground quivers slightly.");
}
else
{
const int mutat = 1 + random2(4);
god_speaks(god, "You feel Jiyva alter your body.");
for (int i = 0; i < mutat; ++i)
mutate(RANDOM_BAD_MUTATION, true, true, true);
}
return (true);
}
void jiyva_convert_slime(monsters* slime)
{
ASSERT(mons_is_slime(slime));
if (you.can_see(slime))
{
if (mons_genus(slime->type) == MONS_GIANT_EYEBALL)
{
mprf(MSGCH_GOD, "%s stares at you suspiciously for a moment, "
"then relaxes.",
slime->name(DESC_CAP_THE).c_str());
}
else
{
mprf(MSGCH_GOD, "%s trembles before you.",
slime->name(DESC_CAP_THE).c_str());
}
}
slime->attitude = ATT_STRICT_NEUTRAL;
slime->flags |= MF_WAS_NEUTRAL;
slime->god = GOD_JIYVA;
// Complimentary jelly upon joining
if (you.religion == GOD_JIYVA && !_has_jelly())
{
monster_type mon = MONS_JELLY;
mgen_data mg(mon, BEH_STRICT_NEUTRAL, 0, 0, you.pos(), MHITNOT, 0,
GOD_JIYVA);
_delayed_monster(mg);
simple_god_message(" grants you a jelly!");
if (level_id::current() == level_id(BRANCH_SLIME_PITS, 6))
{
const level_id target(BRANCH_SLIME_PITS, 6);
bool done = apply_to_level(target, true, slime_vault_to_floor);
if (done)
{
if (silenced(you.pos()))
{
mpr("An unexplained breeze blows through the dungeon.",
MSGCH_GOD);
}
else
mpr("You hear the sound of toppling stones.", MSGCH_GOD);
}
}
}
}
}
// Rearrange stats, biased towards the stat chosen last at level up.
void jiyva_stat_action()
{
char* max_statp[] = { &you.max_strength, &you.max_intel, &you.max_dex };
char* base_statp[] = { &you.strength, &you.intel, &you.dex };
int incremented_weight[] = {1, 1, 1};
int decremented_weight[3];
int stat_up_choice;
int stat_down_choice;
incremented_weight[you.last_chosen] = 2;
for (int x = 0; x < 3; ++x)
decremented_weight[x] = std::min(10, std::max(0, *max_statp[x] - 7));
stat_up_choice = choose_random_weighted(incremented_weight,
incremented_weight + 3);
stat_down_choice = choose_random_weighted(decremented_weight,
decremented_weight + 3);
if (stat_up_choice != stat_down_choice)
{
// We have a stat change noticeable to the player at this point.
// This could be lethal if the player currently has 1 in a stat
// but has a max stat of something higher -- perhaps we should
// check for that?
(*max_statp[stat_up_choice])++;
(*max_statp[stat_down_choice])--;
(*base_statp[stat_up_choice])++;
(*base_statp[stat_down_choice])--;
mprf(MSGCH_GOD, "Jiyva's power touches on your attributes.");
you.redraw_strength = true;
you.redraw_intelligence = true;
you.redraw_dexterity = true;
burden_change();
}
}
static void _maybe_spawn_jellies(int dam, const char* aux,
kill_method_type death_type, int death_source)
{
// We need to exclude acid damage and similar things or this function
// will crash later.
if (death_source == NON_MONSTER)
return;
monster_type mons;
const monster_type jellies[] = {
MONS_ACID_BLOB, MONS_AZURE_JELLY,
MONS_DEATH_OOZE
};
// Exclude torment damage
char *ptr = strstr(aux, "torment");
if (you.religion == GOD_JIYVA && you.piety >= 160 && ptr == NULL)
{
int how_many = 0;
if (dam >= you.hp_max * 0.75)
how_many = random2(4) + 2;
else if(dam >= you.hp_max / 2)
how_many = random2(2) + 2;
else if(dam >= you.hp_max / 4)
how_many = random2(1) + 1;
if (how_many > 0)
{
if (x_chance_in_y(how_many, 8)
&& !lose_stat(STAT_STRENGTH, 1, true, "spawning slimes"))
{
canned_msg(MSG_NOTHING_HAPPENS);
return;
}
int count_created = 0;
for (int i = 0; i < how_many; ++i)
{
mons = RANDOM_ELEMENT(jellies);
mgen_data mg (mons, BEH_STRICT_NEUTRAL, 0, 0, you.pos(),
MHITNOT, 0, GOD_JIYVA);
if (create_monster(mg) != -1)
count_created++;
}
if (count_created > 0)
{
mprf("You shudder from the %s and a %s!",
death_type == KILLED_BY_MONSTER ? "blow" : "blast",
count_created > 1 ? "flood of jellies pours out from you"
: "jelly pops out");
}
}
#define SAME_ATTITUDE(x) (mons_friendly_real(x) ? BEH_FRIENDLY : \
mons_good_neutral(x) ? BEH_GOOD_NEUTRAL : \
mons_neutral(x) ? BEH_NEUTRAL \
: BEH_HOSTILE)
#define SAME_ATTITUDE(x) (mons_friendly_real(x) ? BEH_FRIENDLY : \
mons_good_neutral(x) ? BEH_GOOD_NEUTRAL : \
mons_strict_neutral(x) ? BEH_STRICT_NEUTRAL : \
mons_neutral(x) ? BEH_NEUTRAL \
: BEH_HOSTILE)
else if (you.religion == GOD_JIYVA
&& (targetc == MONS_OOZE
|| targetc == MONS_JELLY
|| targetc == MONS_BROWN_OOZE
|| targetc == MONS_ACID_BLOB
|| targetc == MONS_GIANT_AMOEBA
|| targetc == MONS_SLIME_CREATURE
|| targetc == MONS_DEATH_OOZE
|| targetc == MONS_AZURE_JELLY))
{
// Message used for the Slimify ability.
str_polymon = " quivers uncontrollably and liquefies into ";
}
}
}
static void _set_random_slime_target(monsters* mon)
{
// Strictly neutral slimes will go for the nearest item
int item_idx;
coord_def orig_target = mon->target;
for (radius_iterator ri(mon->pos(), LOS_RADIUS, true, false); ri; ++ri)
{
item_idx = igrd(*ri);
if (item_idx != NON_ITEM)
{
for (stack_iterator si(*ri); si; ++si)
{
item_def& item(*si);
if (_is_item_jelly_edible(item))
{
mon->target = *ri;
break;
}
}
}
}
if (you.religion == GOD_JIYVA)
{
const item_def& item = *si;
const int value = item_value(item) / item.quantity;
const int quantity = item.quantity;
int pg = 0;
int timeout = 0;
for (int m = 0; m < quantity; m++)
{
if (x_chance_in_y(value/2 + 1, 30 + you.piety/4))
{
if (timeout <= 0)
pg += random2(item_value(item)/6);
else
timeout -= value/5;
}
}
if (pg > 0)
{
mprf(MSGCH_GOD, "Jiyva appreciates your sacrifice.");
gain_piety(pg);
}
if (you.piety > 80
&& random2(you.piety) > 50
&& one_chance_in(4))
{
bool success = false;
if (!you.is_undead)
{
simple_god_message(" alters your body.");
more();
const int rand = random2(100);
if (rand < 40)
success = mutate(RANDOM_MUTATION);
else if (rand < 60)
success = delete_mutation(RANDOM_MUTATION);
else
success = mutate(RANDOM_GOOD_MUTATION);
}
if (success)
{
timeout = (100 + roll_dice(2, 4));
you.num_gifts[you.religion]++;
take_note(Note(NOTE_GOD_GIFT, you.religion));
}
else
mpr("You feel as though nothing has changed.");
}
}
// Monsters consider as "slime" for Jiyva.
bool mons_is_slime(const monsters *mon)
{
if (mons_genus(mon->type) == MONS_JELLY
|| mons_genus(mon->type) == MONS_GIANT_EYEBALL
|| mons_genus(mon->type) == MONS_GIANT_ORANGE_BRAIN)
{
return (true);
}
return (false);
}
bool mons_eats_items(const monsters *mon)
{
return (mons_itemuse(mon) == MONUSE_EATS_ITEMS
|| mon->has_ench(ENCH_EATS_ITEMS));
if (level_id::current() == level_id(BRANCH_SLIME_PITS, 6)
&& you.religion == GOD_JIYVA)
{
const level_id target(BRANCH_SLIME_PITS, 6);
if (times_entered == 0)
{
if (apply_to_level(target, true, slime_vault_to_floor))
{
if (!silenced(you.pos()))
{
mpr("You hear the sound of toppling stones.",
MSGCH_MONSTER_ENCHANT);
}
else
{
mpr("An unexplained breeze blows through the dungeon.",
MSGCH_MONSTER_ENCHANT);
}
}
times_entered++;
}
}
}
if (you.religion == GOD_JIYVA && !player_under_penance()
&& one_chance_in(10))
{
int total_jellies = 1 + random2(5);
bool success = false;
int created;
for (int num_jellies = total_jellies; num_jellies > 0; num_jellies--)
{
//Spread jellies around the level
coord_def newpos;
do
{
newpos.set( random_range(X_BOUND_1 + 1, X_BOUND_2 - 1),
random_range(Y_BOUND_1 + 1, Y_BOUND_2 - 1) );
}
while (grd(newpos) != DNGN_FLOOR
&& grd(newpos) != DNGN_SHALLOW_WATER
|| monster_at(newpos)
|| env.cgrid(newpos) != EMPTY_CLOUD);
mgen_data mg(MONS_JELLY, BEH_STRICT_NEUTRAL, 0, 0, newpos,
MHITNOT, 0, GOD_JIYVA);
if (create_monster(mg) != -1)
success = true;
}
if (success && !silenced(you.pos()))
{
switch (random2(3))
{
case 0:
simple_god_message(" gurgles merrily.");
break;
case 1:
mprf(MSGCH_SOUND, "You hear %s splatter%s.",
total_jellies > 1 ? "a series of" : "a",
total_jellies > 1 ? "s" : "");
break;
case 2:
simple_god_message(" says: Divide and consume!");
break;
}
}
"Missionary", "Evangelist", "Apostle", "Messiah"}
"Missionary", "Evangelist", "Apostle", "Messiah"},
// Jiyva -- slime and jelly theme
{"Scum", "Jelly", "Squelcher", "Dissolver",
"Putrid Slime", "Consuming %s", "Archjelly", "Royal Jelly"}
((mons.attitude == ATT_HOSTILE) ? "hostile" :
(mons.attitude == ATT_FRIENDLY) ? "friendly" :
(mons.attitude == ATT_NEUTRAL) ? "neutral" :
(mons.attitude == ATT_GOOD_NEUTRAL) ? "good neutral"
: "unknown alignment") );
((mons.attitude == ATT_HOSTILE) ? "hostile" :
(mons.attitude == ATT_FRIENDLY) ? "friendly" :
(mons.attitude == ATT_NEUTRAL) ? "neutral" :
(mons.attitude == ATT_GOOD_NEUTRAL) ? "good neutral":
(mons.attitude == ATT_STRICT_NEUTRAL) ? "strictly neutral"
: "unknown alignment") );
if (mons_holiness(mon) == MH_UNDEAD)
{
monster_polymorph(mon, MONS_DEATH_OOZE);
mon->attitude = ATT_STRICT_NEUTRAL;
}
else
{
const int x = mon->hit_dice + (coinflip() ? 1 : -1) * random2(5);
if (x < 3)
{
monster_polymorph(mon, MONS_OOZE);
mon->add_ench(ENCH_EATS_ITEMS);
}
else if (x >= 3 && x < 5)
{
monster_polymorph(mon, MONS_JELLY);
}
else if (x >= 5 && x < 7)
{
monster_polymorph(mon, MONS_BROWN_OOZE);
}
else if (x >= 7 && x <= 11)
{
if (coinflip())
{
monster_polymorph(mon, MONS_SLIME_CREATURE);
mon->add_ench(ENCH_EATS_ITEMS);
}
else
{
monster_polymorph(mon, MONS_GIANT_AMOEBA);
mon->add_ench(ENCH_EATS_ITEMS);
}
}
else
{
if (coinflip())
monster_polymorph(mon, MONS_ACID_BLOB);
else
monster_polymorph(mon, MONS_AZURE_JELLY);
}
mon->attitude = ATT_STRICT_NEUTRAL;
}
return(MON_AFFECTED);
// Jiyva
{ ABIL_JIYVA_CALL_JELLY, "Request Jelly", 2, 0, 20, 1, ABFLAG_NONE },
{ ABIL_JIYVA_JELLY_SHIELD, "Jelly Shield", 0, 0, 0, 0, ABFLAG_PIETY },
{ ABIL_JIYVA_SLIMIFY, "Slimify", 4, 0, 100, 3, ABFLAG_NONE },
{ ABIL_JIYVA_BAD_MUT_REMOVE, "Mutation Removal",
8, 0, 200, 15, ABFLAG_NONE },
return (false);
}
break;
case ABIL_JIYVA_CALL_JELLY:
{
mgen_data mg(MONS_JELLY, BEH_STRICT_NEUTRAL, 0, 0, you.pos(),
MHITNOT, 0, GOD_JIYVA);
if (create_monster(mg) == -1)
return (false);
exercise(SK_INVOCATIONS, 1 + random2(3));
break;
}
case ABIL_JIYVA_JELLY_SHIELD:
// Prayer effect
break;
case ABIL_JIYVA_SLIMIFY:
beam.range = LOS_RADIUS;
if (!spell_direction(spd, beam))
return (false);
if (beam.target == you.pos())
{
mpr("You cannot slime yourself!");
return (false);
}
if (!zapping(ZAP_SLIME, 16 + you.skills[SK_INVOCATIONS] * 8, beam,
true))
{
case ABIL_JIYVA_BAD_MUT_REMOVE:
{
// Removes a bad mutation from the player.
// delete_mutation(RANDOM_BAD_MUTATION) defaults to removing
// a random mutation if the player has no bad mutations
// so any newly added bad mutations need to be included here.
const mutation_type bad[] = {
MUT_HERBIVOROUS, MUT_CARNIVOROUS,
MUT_FRAIL, MUT_SLOW_HEALING,
MUT_FAST_METABOLISM, MUT_WEAK, MUT_DOPEY,
MUT_CLUMSY, MUT_DEFORMED, MUT_TELEPORT,
MUT_SCREAM, MUT_BERSERK, MUT_BLURRY_VISION,
MUT_LOW_MAGIC, MUT_DETERIORATION
};
if (!how_mutated())
{
mpr("You have no mutations to remove.");
return (false);
}
bool done = false;
for (int tries = 0; !done && tries < 100; tries++)
{
mutation_type mutat = RANDOM_ELEMENT(bad);
if (you.mutation[mutat] > 0)
done = delete_mutation(mutat);
}