Now we need tiles for the new potions!
git-svn-id: https://crawl-ref.svn.sourceforge.net/svnroot/crawl-ref/trunk@10669 c06c8d41-db1a-0410-9941-cceddc491573
VY2RJLJQMUOVIJOYPTA7AEXPURIV3H6VF7O5QQ7LF44ZS36RTFYAC
TKBNL7HXWTEWYERMIANPKAWU3VD2QYMIZTBC3C7Y4VBHZSP3IBIQC
D3MYRGY6SIFALXOTHUMXPTLG3MXWCZD3EFQSRJAMSULGH755F7QQC
CGXHRJTW3ROFLTU3YE6YRKVQGLK3X5UCKZCO7S7VEEWEMKW4HVIQC
GUKKDWUJEKIHUM6GUCNLIQJ67BE4WWQKBFGYDJQ5D5LCJ2R6VTOAC
HP72STXEK6KJ5SAPZKKLLAXC5HB7J4E6X6NK2BNFP6GARF52K5RQC
SVPQA3Q4RSXNXOCNYX5HHSBB27TI5MCB75YLJFP7GKLIDS5VN35AC
BXQ2UMD4SSS5IUZZEDNVUKH6H26WE7LHARPAWIFEQCJM5WWLWCVQC
LYEMFS2OCCXSYOZKIQURQDXL64CB5BFP2P3MW3JDCEUIYVWX745QC
N7CV6FHEMKA7IRWFVPCPIYO66V2SVMOYQTWV7LNWZFGBF2XHO7NQC
LVOFSHI6SIDK2YJELLKW3F7VIGPOIJT5WCAWHT3M33JPM7MCZPMQC
KFULGQQOHWUTXOM3BXCCYPGGVGGY4Z6265XUFRCBPNLTZAEHJZSQC
43XCHFXZ34FDVT2QG23RZ65V6NRBY6PE3ENQEEDXFYKRR7IRFHCAC
FZ3VCF24YWNHTLVHBZYWX37X4FI2SNCXGZGTV2UFGFGAWMOKFIUAC
K2CS6TCX2NDVL2ASEHGP4J4K4IJ6FP3ANNKTSIWVG43HPYSBX6ZQC
T3R2D5M4YSC6NFZ6YO3AEG4VWORECX72CHUM5UBADV4UPAAZG7WQC
TR6F3WVSL6TS5SZVGJBGDK54FKAXYWRWXFRNMQ2AYYKHADSHR2EQC
RDS3NSFOLBAEGHBFEQ4TODN5QSJ2DLDM2SIVVUMA6IVRHAZLRVKQC
5WVUTEZLEZEML54CKPR6GACQBYY3EMVNXMLJOREN6SSEUZGC47AQC
MG6LLF3XYCOEBQRX7TJ4MUTKM3IROYWUMZGCMYVW4TGDG36CJMJQC
PFEJ4LMDNEKLMGRCMWQ7EIRVU4JMYGICI4G7X4WVWOROVXQCBZ7QC
OONYLF4DAPLIYLBNNRW74IVT5BBTWI4XHQBXSNSPVRX3FTKJBTRAC
ZYRDAY7GAX43C5ZOK3TSWPRAOCZVYOJZZWP7IVX6JPW7B3Y5U55QC
WT66JDIRTLLP37SHTV4GI3V64JFJ4D25LNRLGCHFG6CLEFKJ3QGQC
5KTPCJG42MF2B34CEH6VXAJIOZR6QOS2BWYNW7DXM3WA7N3GH4HQC
IPPPBA4G2LODBP3EJIYGUAAOMHKLNBXHBD7KVX2JVDTA4DETHO4AC
RPOZZWKG5GLPHVZZ7ZKMKS64ZMV2LDCQSARBJFJ6FZOTOKCQO7FAC
UZ6N6HOUPGVSPC5NQROEEDWMEGJA5XUWUY2AKH5QG65AZ25PVXDAC
SIDH2P7NBIG5KEOE27XHD3ZT2NQ2OJZFN6VZXWNWYFFY5YVXSSVQC
HB27XKFYVYIEQZGBCEZ6LKPUBMXLIPDAAS636GJ5TULIQ7KND5KQC
DKISJVKAJJK2SVZSXGJ37K5SOVTDARVX6RPK3MAKVNGC36Z4YAZQC
UU5JLKAKZSTWFQJLUTPQZJ3ZQY7BEU2KROZETUNSKC6LFG6XVSZQC
2HNLFROSOZ6ROLX3Q3W5E7I4Y4ELIWSJ7EX5GDGZZOMRPTK6TBSAC
PNIGZ2ABVEGC6DN6PMKO6Z4M2SQ5EB7VZQT33YMEAUPEZVVEDJZQC
MIMVAKQXKJMHYLKXKY2TJEBL4HCOHKLDQYX6J5H4MWCI442NWEHAC
TXVL24IFH5SK7EJAN7JAUHAZJHJV7GB364UU65P745GUBWJS6Q6AC
25CH7HH4LKXFIZ75YNMXS3TSXO6O27DYSOPLOD45K4OCNFWLS4LQC
NDKS43E4XVAU3FDY276OF5JW7E5SF6F5EJD2XLV5JLKZ5W6N554QC
IMAF6ICHAOMBKDMATJT3VRFGKKZWDKJJTCIA5XCKWB6UKWECOQ6QC
3NFVCXRVGHN2CHLLWFZES5RBS4R2BCDS4EEQNSDCFYIFQWQK7MUQC
3XQAOZVTIDFQ7EUC36J2AFMTHZXLZ3G5MBHFN5JZWEWWCXFENHRAC
NLQNXH3SVJ52CWXEV35FSSZP32VHC4QFGN3HINF4KO5GZHZMOBKQC
OWERGKLVPNPGIIS23FZ7ZDOBWUIXCKYAFG3URXU75JAUDX3N5ENAC
2UO6ZOW7UCP5XJ2TJ26PJNQABILK2BZ4J3BAKLOKMZPJDQHW24MAC
ILO5P5FRDUY4SEQEXMTUDKOPXAUBJRSORHHUVTLLCYOYSXBXOVRAC
N6SBZYHPKCHUZ5UQJLYYIEK62TTEV7YWZXHPTPNVHWPHR6XZRF4AC
LCCGXSFIDQFIRXHGRJWOELNPQOHHCXCWXS366GOULDFPQVOKAIJAC
U5SDF665RTV32CTKTC4QO3Q5B44IAE42MZYJSYUNZP3JZEUTO4KQC
SIP35YIR6H5EBKAT4QN3LTE4XOUN6Z6DDMPK33TTGMM5PZM4QB5AC
GQLLYETI5KID6MXQ6YJ5TZJYN5V3QDFOUQIKBVDYGVARNWBCMOSAC
X55CKEKNO5RD2JMQ4MYX6PXQLDMLH4U4PPKSBK5EQ622J5HOPD2AC
NYG3EBROAFJX6PYLHJ7L7OPLHF5SSGEHFH5AFDYBQ6OQ75MLAACQC
BI5CXFKCZHWNZQ4VXWN24FD322V55H7GYJHXF4GJ26PPKXIEOLSQC
PYZVEUF25HRJ6FFJH4HEQHUROLBJEYLOSTBKORAGQ5BEZ7DCKYDQC
BQ5QKUWLCYSBO4A7EWZN4FXPNSIAR6JPBAZE4PSV6XCUNTV53ERQC
BYURAML2EPTULHH22Q5RPXYGDEYAJYESR6C72UMNPPYHTCJZUPFAC
ZGUJWUFJ4NFFJ6PGXLFGQWCWBCZHPWGWI44NJHJEVPRG5L36PADQC
2IPPYYFWEFI342OOKTTEKMLLBUFPERK7RNLBF2TWQF5D47M6PSTAC
OSGS3PH2L5CBTDVZCZS6OCFQNA4A7RMEXBYJQB7DDZBYYJW7QSSAC
CCBZCRRBI5MJA7BXOMCIDO7B7OCXWEWYLEG3IE4XFZGLEF36OMYQC
4UXFU3FZOCBSLDQ4S7MJKAE2H7VUHCNRDQMIY6NJ3PHYXWNGISDQC
TGJZXTUIAKCFZQJ54ZQEBGFBVZSJCAX6AWDRSH3TP7UJRLGUM5SAC
XZTGZ7MOPX7ZOHQ4IQPXOHGUH5WPRNOYAQ6IQOMZDZYNVSAYFTNAC
T3NY54AEBRWTVKX6A5LAGWL3MTKUZ6NOOCFLTFV7FSUNCRHMQKAQC
AH3PLTXXMD4SK7NIO7EWCEPTCZHMLGP2S3BGMMI74TJXRGV2TI3QC
CA6AAWUMXEKXR5VTGK7DHBBLTXDKWP5HUJIKMPZBM7QCYXFZKCHQC
WBRAEO5JU2JNLWCSBCHQGVSB64FJBCXLT5HCRRDM2ZBSZSOZNEIQC
KZWOHH536QBWAPWROR32EOXEK5LRY6I5VHVL7HHI7GOFKCMQTCSQC
EH4FFBOHIUH2QM43B4CHXRETOAKYV53EAQYA3FETDD5VWV2WX6QQC
Q3DNEB5OOJ34P5ML4CMK3L6SCP7RLW7DDOZEG24KZBX3C7BJRQDAC
DTO3EUKWHZ5RJNGNCFYXSOVTIPVXPP637F2W7WFGYKJ7JK7VNKNQC
VNHFP63ZLLZU3A3PLXP4BITX57DUIYDHFOHQYK3BOBHV3S64G26QC
4GYZYBY7FFORRNPIEFTV4ZM2C7Z6D2KTQOM537ZCC2YBXT2TNSHAC
QW73U22SVPKFZ367CURWGZCUJZIG73MRKWE2EBRG535N4UUYKMNAC
JK3HFJG76OOQHJMXJUSZRTR5CX5ZMS52LRVBLOR7E2NBI6PRSHHAC
UNXGLYIYBZMWR6GX3LRNAA2UPZD7MNBH7TYGYQTTFHPCJRDZXWPQC
I2B33Z7NZGC33AMDSSK446AZZYWKPHWLAGULVHKKZU4MVB4BNJOAC
Q6WLX2VTRJ3LGDPWBH5WKQM7CIIJ5H6AEIKMXPF2PJA5JX5ZLUZQC
ODQ7LIJ2UROGGENIORRXZFWII3ZM2N45YD53FKWDQB7LLRXR4PHAC
VMIKJGB6CSFVZS6VMQNP33ALEDEO2TARDICVGDJFMZ4WSPTV3LFAC
I7QLYOTE6DLQZM7YWUWYLKHRJRB2A3STQ42ALSRGQICEWKD2QTEQC
UADYVV3UD5ERJTZZJGY4EUQ4NJ2JSBG7YYUJ75ZRBIXRQXQKOJPAC
7YUGK5Q64KG5O7GJGTUBRRLHAHBCJ5YOE23YUPT6UBKUSB67CYAQC
CDFS7Z74W5HKPQIHQICOG442KQFXUSBGGLDDQLE3MG74T44YU6AQC
XBXO44GTW26ELSWP4ZRCRIFOZO7JULKLV3IXAMGR2YZ5B7KVSIDAC
GVCGKTH5IJ4VSQEIN4CRC7ZFVZW26JPIYNCPTO7GY66CSZZEW3ZQC
PI5BATR2SER3RFE76IUGHM2AGXVFOUM3PLU7WC2K2Q2BA5K2E73QC
M53SMQWSTQBB24VSHBX7KJAAMMWGVKKPKV4TLMFHONWYYCNEDRGAC
V633AMMPMHJB5ZLP5IHFXCT6FCENVTPX25TY7T5MF2QZLDDN24HAC
O6ZMFKDI3XO2SWPNEYHIPYFDWJR4TVDP5BAATK6LVCVETQID6E7AC
&& (mons_is_plant(monster)
|| monster->mons_species() == MONS_GIANT_SPORE)
&& !mons_is_summoned(monster)
&& !mons_wont_attack(monster)
&& !testbits(monster->flags, MF_ATT_CHANGE_ATTEMPT))
&& monster->attitude == ATT_HOSTILE
&& feawn_neutralises(monster)
&& !testbits(monster->flags, MF_ATT_CHANGE_ATTEMPT)
&& !player_under_penance())
if (!player_under_penance())
{
// We must call remove_auto_exclude before neutralizing the
// plant because remove_auto_exclude only removes exclusions
// it thinks were caused by auto-exclude, and
// auto-exclusions now check for ATT_HOSTILE. Oh, what a
// tangled web, etc.
remove_auto_exclude(monster, false);
// We must call remove_auto_exclude before neutralizing the
// plant because remove_auto_exclude only removes exclusions
// it thinks were caused by auto-exclude, and
// auto-exclusions now check for ATT_HOSTILE. Oh, what a
// tangled web, etc.
remove_auto_exclude(monster, false);
env.show_col(e) = BLUE;
// Translates between colours used for shallow and deep water,
// if not using the normal LIGHTCYAN / BLUE. The ripple uses
// the deep water colour.
unsigned short base_colour = env.grid_colours(monster->pos());
static const unsigned short ripple_table[] =
{BLUE, // BLACK => BLUE (default)
BLUE, // BLUE => BLUE
GREEN, // GREEN => GREEN
CYAN, // CYAN => CYAN
RED, // RED => RED
MAGENTA, // MAGENTA => MAGENTA
BROWN, // BROWN => BROWN
DARKGREY, // LIGHTGREY => DARKGREY
DARKGREY, // DARKGREY => DARKGREY
BLUE, // LIGHTBLUE => BLUE
GREEN, // LIGHTGREEN => GREEN
BLUE, // LIGHTCYAN => BLUE
RED, // LIGHTRED => RED
MAGENTA, // LIGHTMAGENTA => MAGENTA
BROWN, // YELLOW => BROWN
LIGHTGREY}; // WHITE => LIGHTGREY
env.show_col(e) = ripple_table[base_colour & 0x0f];
// Ignore squares that are already occupied by non-fungi.
if (actor_at(*i) && !actor_at(*i)->mons_species() == MONS_TOADSTOOL)
actor *target = actor_at(*i);
if (target && (target->atype() == ACT_PLAYER
|| target->is_summoned()))
{
if (mons && mons->mons_species() != MONS_TOADSTOOL)
{
switch (mons_genus(mons->mons_species()))
{
case MONS_ZOMBIE_SMALL:
// Maybe turn a zombie into a skeleton.
if (mons_skeleton(mons_zombie_base(mons)))
{
processed_count++;
monster_type skele_type = MONS_SKELETON_LARGE;
if (mons_zombie_size(mons_zombie_base(mons)) == Z_SMALL)
skele_type = MONS_SKELETON_SMALL;
if (mons->visible())
{
mprf("%s flesh rots away.",
mons->name(DESC_NOCAP_ITS).c_str());
}
mons->upgrade_type(skele_type,true,true);
behaviour_event(mons, ME_ALERT, MHITYOU);
continue;
}
// Else fall through and destroy the zombie.
// Ghoul type monsters are always destroyed.
case MONS_GHOUL:
{
if (mons->visible())
{
mprf("The %s rots away and dies.",
mons->name(DESC_PLAIN).c_str());
}
coord_def pos = mons->pos();
int colour = mons->colour;
int corpse = monster_die(mons, KILL_MISC, NON_MONSTER, true);
kills = true;
// If a corpse didn't drop, create a toadstool.
// If one did drop, we will create toadstools from it as usual
// later on.
if (corpse < 0)
{
const int mushroom = create_monster(
mgen_data(MONS_TOADSTOOL,
BEH_HOSTILE,
0,
0,
pos,
MHITNOT,
MG_FORCE_PLACE,
GOD_NO_GOD,
MONS_PROGRAM_BUG,
0,
colour),
false);
if (mushroom != -1)
seen_mushrooms++;
processed_count++;
continue;
}
break;
}
default:
continue;
}
}
if (plant != -1 && see_grid(target))
mpr("A plant grows up from the ground.");
if (plant != -1)
{
env.mons[plant].flags |= MF_ATT_CHANGE_ATTEMPT;
if (see_grid(target))
mpr("A plant grows up from the ground.");
}
create_monster(mgen_data(MONS_GIANT_SPORE,
behavior,
0,
0,
*rad,
MHITNOT,
MG_FORCE_PLACE));
int rc = create_monster(mgen_data(MONS_GIANT_SPORE,
behavior,
0,
0,
*rad,
MHITNOT,
MG_FORCE_PLACE));
// Feawn worshipers are on the hook for most plants and fungi, but not
// toadstools and giant spores because they die too easily.
//
// If feawn worshipers kill a protected monster they lose piety,
// if they attack a friendly one they get penance,
// if a friendly one dies they lose piety.
bool feawn_protects_species(int mc)
{
return (mons_class_is_plant(mc)
&& mc != MONS_TOADSTOOL
&& mc != MONS_GIANT_SPORE);
}
bool feawn_protects(const monsters * target)
{
return target && feawn_protects_species(target->mons_species());
}
// Feawn neutralizes most plants and fungi but skips toadstools to prevent
// message spam (and killing them doesn't even cause piety loss).
bool feawn_neutralises(const monsters * target)
{
return (target && mons_is_plant(target)
&& target->mons_species() != MONS_TOADSTOOL);
}
const bool boosted_int = you.duration[DUR_DIVINE_STAMINA];
const bool boosted_dex = you.duration[DUR_DIVINE_STAMINA];
const bool boosted_int = you.duration[DUR_DIVINE_STAMINA]
|| you.duration[DUR_BRILLIANCE];
const bool boosted_dex = you.duration[DUR_DIVINE_STAMINA]
|| you.duration[DUR_AGILITY];
if (monster->pos() + mmov == you.pos())
{
ASSERT(!crawl_state.arena);
if (!mons_friendly(monster))
{
// If it steps into you, cancel other targets.
monster->foe = MHITYOU;
monster->target = you.pos();
monster_attack(monster);
if (mons_is_batty(monster))
{
monster->behaviour = BEH_WANDER;
_set_random_target(monster);
}
DEBUG_ENERGY_USE("monster_attack()");
mmov.reset();
continue;
}
}
continue;
}
}
if (monster->pos() + mmov == you.pos())
{
ASSERT(!crawl_state.arena);
if (!mons_friendly(monster))
{
// If it steps into you, cancel other targets.
monster->foe = MHITYOU;
monster->target = you.pos();
monster_attack(monster);
if (mons_is_batty(monster))
{
monster->behaviour = BEH_WANDER;
_set_random_target(monster);
}
DEBUG_ENERGY_USE("monster_attack()");
mmov.reset();
did_god_conduct(DID_STIMULANTS, 4 + random2(4), was_known);
break;
}
case POT_BRILLIANCE:
{
const bool were_brilliant = you.duration[DUR_BRILLIANCE] > 0;
mprf(MSGCH_DURATION, "You feel %s all of a sudden.",
were_brilliant ? "clever" : "more clever");
if (were_brilliant)
contaminate_player(1, was_known);
else
modify_stat(STAT_INTELLIGENCE, 5, true, "");
you.duration[DUR_BRILLIANCE] += (35 + random2(pow)) / factor;
if (you.duration[DUR_BRILLIANCE] > 80)
you.duration[DUR_BRILLIANCE] = 80;
did_god_conduct(DID_STIMULANTS, 4 + random2(4), was_known);
break;
}
case POT_AGILITY:
{
const bool were_agile = you.duration[DUR_AGILITY] > 0;
mprf(MSGCH_DURATION, "You feel %s all of a sudden.",
were_agile ? "agile" : "more agile");
if (were_agile)
contaminate_player(1, was_known);
else
modify_stat(STAT_DEXTERITY, 5, true, "");
}
else if (which_god == GOD_FEAWN )
{
have_any = true;
std::string buf = "You can speed up decomposition.";
_print_final_god_abil_desc(which_god, buf,
ABIL_FEAWN_FUNGAL_BLOOM);
buf = "You can pass through plants during prayer.";
_print_final_god_abil_desc(which_god, buf,
ABIL_FEAWN_PLANTWALK);
// We don't want to hit a monster in a wall square twice.
// Also stop single target beams from affecting a monster if they already
// affected the player on this square. -cao
if ((!hit_player || this->is_beam || this->is_explosion)
&& !still_wall && !avoid_monster)
{
if (monsters* m = monster_at(pos()) )
affect_monster(m);
}
// goes out of scope. -cao
if (you.religion == GOD_FEAWN && flavour == BEAM_SPORE)
// goes out of scope.
//
// Also exempting miscast explosions from this conduct -cao
if (you.religion == GOD_FEAWN
&& (flavour == BEAM_SPORE
|| beam_source == NON_MONSTER
&& aux_source.find("your miscasting") != std::string::npos))
{
corpse = monster_die(mon, thrower, beam_source_as_target());
{
// Prevent spore explosions killing plants from being registered as
// a feawn misconduct. Deaths can trigger the ally dying or plant
// dying conducts, but spore explosions shouldn't count for either of
// those.
//
// FIXME: Should be a better way of doing this. For now we are just
// falsifying the death report... -cao
if(you.religion == GOD_FEAWN && this->flavour == BEAM_SPORE
&& feawn_protects(mon))
{
if (mon->attitude==ATT_FRIENDLY)
mon->attitude = ATT_HOSTILE;
corpse = monster_die(mon, KILL_MON, beam_source_as_target());
}
else
corpse = monster_die(mon, thrower, beam_source_as_target());
}
if (_decrement_a_duration(DUR_AGILITY, "You feel a little less agile now."))
modify_stat(STAT_DEXTERITY, -5, true, "agility running out");
if (_decrement_a_duration(DUR_BRILLIANCE, "You feel a little less clever now."))
modify_stat(STAT_INTELLIGENCE, -5, true, "brilliance running out");