git-svn-id: https://crawl-ref.svn.sourceforge.net/svnroot/crawl-ref/trunk@9718 c06c8d41-db1a-0410-9941-cceddc491573
GDISJTTXFDQYMOFLUHIDCYWMU7O2SGXN2YQ3VRUIHU5YE3SUVJ7AC
G2JEGJW7XN55HXKF4FRD6BJGXTGNMZFQHKHESXJOZFQMPW36UQGQC
FWWAYEWZS32VGKS6KE5ZIVSGTSBGYNNUHVE4GFRAKAHS2WUF3K6QC
DHI4FAUHYA3V7I2LKBE74AA672FVDUE2LBOZHTTL3EAE4YJP2ICAC
RVHFMZ4CW4IIEDTYE2HFWIRNNNCUWX5N7ZYLZTODDR3N3J64WZ4AC
XKDPUWDOAFP4ZVWY6AOYPX3TJLTFBNZWRYSPIMEJHFX577WAJGMAC
K2CS6TCX2NDVL2ASEHGP4J4K4IJ6FP3ANNKTSIWVG43HPYSBX6ZQC
UPPUAHXHWKGQWDKOCVLR7RG3SHEUVKOUC5GRYCEUDGD6RNCOU5LAC
ND3T5LCZATC63EVQ6SLI7XXMSUL7XICJDNLH3UCYUDEFWTA3N5MQC
25CH7HH4LKXFIZ75YNMXS3TSXO6O27DYSOPLOD45K4OCNFWLS4LQC
SHFSQYLN7WPQC35V3XYYEIZ4CQMREASUNR474CIKFG3C2FYI4SHQC
OXHOOJE4XEQKGI3JKURNSITG6CRQFAOFQ2EKKG6M5DCLN7LS4GUAC
G6WNKWA4GNUGNOH63AKXJQMQS2V4FGJ55CB4P2Z3MPSX3UPMVF6AC
FIYBXLWALQINNQTHG2KNDUUTAQAZRDDLXW2XOVSKDKBADJ3XCJ4AC
KT3JMGSH5VTNRV2H5POWZLYNXSIRE5CT2XW3ZID7FNZTXYOZG22QC
FU7EQZLXD7YNGUUDHXCBI3VUKL6M2G3EPDY6FB5UA6B6RD4S5UOQC
I2B33Z7NZGC33AMDSSK446AZZYWKPHWLAGULVHKKZU4MVB4BNJOAC
JM7UAK777RAVDAVLQLEOBRTGNW2B47S5G55XITJXO243IUNZHVYQC
GOX2FK35IXLRJJJYT6QHL2GTFUWN6IJ6P7GIWKSP2LDOGTWA7XEQC
CIPVRZGLOZHCERK6YPOBV3P2E4IAB4H6D5EHLRQE2O5E4P4VCBUAC
BDFIS53HAIHOCXQ5BE7WCO2MEOFCUQPFY4JGUWVLWY6JO3IFMEKQC
N6J4ANT3WFBQYTFDPZFVF2PWS2S7CK4GHHX4UV3JW4VWAKETZR5AC
UTKZUB7Z3YPIZMMGF5DUOKNZX3GWY46A4GUHX5GA2GMQCT2EWXSQC
XJBNF2N35THJC2KYGCMPLC3CDCJP25CEDKHUI3P55V6H5YWXBUKAC
RPOZZWKG5GLPHVZZ7ZKMKS64ZMV2LDCQSARBJFJ6FZOTOKCQO7FAC
HODV46TCH5AGI42Z5JKVDX4VCRVQCNREJUL6W3TUJK6S77SXQNLQC
3ZWALZFSTSIVYXY4BAY6ANGINTDACZC6RSSJTEMQSTSUIE66YOBQC
3KAINFIXO7WNWGUGZB43EUNFRS2ZPBLQZDTY456QACMRHYIJ7WDAC
PHBACPMH3F34GODHVDKNCMXWU373RJQGVTDLBFCCDLLWDXVYOLTAC
WIGDOFMKXC3UZWMQCZ4235LPYRXPEJBCHQ2LQEPLVPXQNA33I33AC
TONFKA6OUHKQVVN7LP6QR4LHODWBCZQ6V42ITUO6EI4SW642A7PAC
7P5WSNAGXFBICVTPQO6EHXMJ7O2HAYOIGVRS37EPA5GDQY7KUMIQC
K3WXOHMGLLPL4CHGWRK227FWKCMBA7KHLJXLY6DTKEC5LKFJI62QC
KBH6DZPJCNMT3OMEMHKLASTWQZ24FIVNVANBCVI3SEVAMMPSWRWQC
4LNIHTHZTCOEZEHZ4GW6WCZH4UCDWKK5UVUKEDODEBBS4YH2KONQC
GPEJOT73KMACP33IPAKFR5ROGHCOIP22VXZMQNYTGLEA2OSZUM2AC
XGAEDOORDNSVEDQ577A7QNKMYJJ2BZXFL6JITM7RAVRIDHHBRJXAC
XGPPA2X3G3266EVSTXGQ7ZWYOCJ32FEYPEUJV55AI5TGFYHTYTQQC
6ECDSRJ6V3FSIAQC6FZK5SV4NGXXR6PW5S4KADSPISPP36CXLTYQC
YZXHBEKWQPY4BTKG5FFGLP3AIRBQSTKQVLJJHWKQEA3HTN4UHDYQC
OYATP4N2G5QIC45GJOWL552ASS4FAOMJ3JUCWAXNKSUPOVVBMDOQC
OBWENTR55T5IGFMLKDJUJ6QEL3R6TGPBY7DF36YAWU2W6UHZ5TZAC
SVY2PTCLXR3KNPQAWXVXTTGCC5DR334HOAKHYO3VDDRWM2BWMALAC
KNCEMOC5TMWHTKCWF7CMYNHLGCXOLGMTXLEIHMEFBGM5FR26GRXAC
FEKRY3DYIDLWVBLAZN7W2WFNEKZPCAHABXOSM6K5RLTH5WY2NODQC
MDAJYB6STTZPNHRQ2X66MMMSONMKXTESLHJSFPGN7H3D3TOVBAVAC
S4PO7XGBGKFJBC5RDKB76KSSKPS3TACH7K3SN2VGBGDLVUIMOOSQC
7U7IZUR2C7UALYI4Y3SHBYGTHYVQM6JI4PXDFXUFL3T3L6JBSC6AC
NS3KXJXQSN33UQSOBDK3WXXKA3KY5YOUJL67NBZKGQAJYDYZ2COQC
int pract = 0; // By how much Evocations is practised.
bool did_work = false; // Used for default "nothing happens" message.
mpr("You open the flask...");
const int monster =
create_monster(
mgen_data(MONS_EFREET,
friendly ? BEH_FRIENDLY : BEH_HOSTILE,
0, 0, you.pos(),
MHITYOU, MG_FORCE_BEH));
const int wield = you.equip[EQ_WEAPON];
if (monster != -1)
{
mpr("...and a huge efreet comes out.");
if (player_angers_monster(&menv[monster]))
friendly = false;
if (silenced(you.pos()))
{
mpr(friendly ? "It nods graciously at you."
: "It snaps in your direction!", MSGCH_TALK_VISUAL);
}
else
{
mpr(friendly ? "\"Thank you for releasing me!\""
: "It howls insanely!", MSGCH_TALK);
}
}
else
canned_msg(MSG_NOTHING_HAPPENS);
dec_inv_item_quantity(you.equip[EQ_WEAPON], 1);
mpr("You aren't wielding anything!");
crawl_state.zero_turns_taken();
return (false);
slot = prompt_invent_item( "Evoke which item? (* to show all)",
MT_INVLIST,
OSEL_EVOKABLE, true, true, true, 0, -1,
NULL, OPER_EVOKE );
if (prompt_failed(slot))
return (false);
item_def& wpn = *you.weapon();
bool unevokable = false;
const bool wielded = (you.equip[EQ_WEAPON] == slot);
item_def& item = you.inv[slot];
// Also handles messages.
if (!item_is_evokable(item, false, true))
return (false);
set_ident_type( OBJ_STAVES, wpn.sub_type, ID_KNOWN_TYPE );
set_ident_flags( wpn, ISFLAG_KNOW_TYPE );
set_ident_type( OBJ_STAVES, item.sub_type, ID_KNOWN_TYPE );
set_ident_flags( item, ISFLAG_KNOW_TYPE );
} // end evoke_wielded()
static bool _efreet_flask()
{
bool friendly = x_chance_in_y(10 + you.skills[SK_EVOCATIONS] / 3, 20);
mpr("You open the flask...");
const int monster =
create_monster(
mgen_data(MONS_EFREET,
friendly ? BEH_FRIENDLY : BEH_HOSTILE,
0, 0, you.pos(),
MHITYOU, MG_FORCE_BEH));
if (monster != -1)
{
mpr("...and a huge efreet comes out.");
if (player_angers_monster(&menv[monster]))
friendly = false;
if (silenced(you.pos()))
{
mpr(friendly ? "It nods graciously at you."
: "It snaps in your direction!", MSGCH_TALK_VISUAL);
}
else
{
mpr(friendly ? "\"Thank you for releasing me!\""
: "It howls insanely!", MSGCH_TALK);
}
}
else
canned_msg(MSG_NOTHING_HAPPENS);
dec_inv_item_quantity(you.equip[EQ_WEAPON], 1);
return (true);
bool item_is_evokable(const item_def &item, bool known, bool msg)
{
const bool wielded = (you.equip[EQ_WEAPON] == item.link);
switch (item.base_type)
{
case OBJ_WANDS:
if (item.plus2 == ZAPCOUNT_EMPTY)
{
if (msg)
mpr("This wand has no charges.");
return (false);
}
return (true);
case OBJ_WEAPONS:
if (!wielded && !msg)
return (false);
if (get_weapon_brand(item) == SPWPN_REACHING
&& item_type_known(item))
{
if (!wielded)
{
if (msg)
mpr("That item can only be evoked when wielded.");
return (false);
}
return (true);
}
if (is_fixed_artefact(item))
{
switch (item.special)
{
case SPWPN_SCEPTRE_OF_ASMODEUS:
case SPWPN_STAFF_OF_WUCAD_MU:
case SPWPN_STAFF_OF_DISPATER:
case SPWPN_STAFF_OF_OLGREB:
if (!wielded)
{
if (msg)
mpr("That item can only be evoked when wielded.");
return (false);
}
return (true);
default:
return (false);
}
}
if (msg)
mpr("That item cannot be evoked!");
return (false);
case OBJ_STAVES:
if (item_is_rod(item)
|| !known && !item_type_known(item)
|| item.sub_type == STAFF_CHANNELING
&& item_type_known(item))
{
if (!wielded)
{
if (msg)
mpr("That item can only be evoked when wielded.");
return (false);
}
return (true);
}
if (msg)
mpr("That item cannot be evoked!");
return (false);
case OBJ_MISCELLANY:
if (is_deck(item))
{
if (!wielded)
{
if (msg)
mpr("That item can only be evoked when wielded.");
return (false);
}
return (true);
}
if (item.sub_type != MISC_LANTERN_OF_SHADOWS
&& item.sub_type != MISC_EMPTY_EBONY_CASKET)
{
return (true);
}
// else fall through
default:
if (msg)
mpr("That item cannot be evoked!");
return (false);
}
}