modifying the wielded weapon rather than the misc. item in question. Also update tooltips.
git-svn-id: https://crawl-ref.svn.sourceforge.net/svnroot/crawl-ref/trunk@9802 c06c8d41-db1a-0410-9941-cceddc491573
5OYPJO4PYZVSBANUX4PCRISNZJK7JW5HG2OW2O7J7UVBJKKVF2WQC
AGB6JRC7CKURRFF3YV5A4ATZNL4NMS7VMPJZYWR4JV2HXILHVBTAC
JHTOROSEZYTWG4FXYRCYXKYL72VXBPNESVBMQGQOIMCXBHUO5E5QC
GDISJTTXFDQYMOFLUHIDCYWMU7O2SGXN2YQ3VRUIHU5YE3SUVJ7AC
A43NYENITQ3BRLUMCFT3T5CM2NFXCIDRX7OCMEAXXGNTJIDDS6YQC
Q3B3UVMYEVC4YJUPYVSNTR4DJH4E6J4JJDHZNT5LNOCHCPPMEMXAC
25CH7HH4LKXFIZ75YNMXS3TSXO6O27DYSOPLOD45K4OCNFWLS4LQC
UPPUAHXHWKGQWDKOCVLR7RG3SHEUVKOUC5GRYCEUDGD6RNCOU5LAC
K2CS6TCX2NDVL2ASEHGP4J4K4IJ6FP3ANNKTSIWVG43HPYSBX6ZQC
OXHOOJE4XEQKGI3JKURNSITG6CRQFAOFQ2EKKG6M5DCLN7LS4GUAC
HBHQQDULNVWISJ75XIL6R6BFEDYRNY22NX3ZTFVNP5ZWJGJSKOEQC
ND3T5LCZATC63EVQ6SLI7XXMSUL7XICJDNLH3UCYUDEFWTA3N5MQC
5BJPWUPLJFS34FUTFJVKA4A52YMIGV6EWDXLNSDCWBJWBGVSQFGQC
RVHFMZ4CW4IIEDTYE2HFWIRNNNCUWX5N7ZYLZTODDR3N3J64WZ4AC
I2B33Z7NZGC33AMDSSK446AZZYWKPHWLAGULVHKKZU4MVB4BNJOAC
FWWAYEWZS32VGKS6KE5ZIVSGTSBGYNNUHVE4GFRAKAHS2WUF3K6QC
GOX2FK35IXLRJJJYT6QHL2GTFUWN6IJ6P7GIWKSP2LDOGTWA7XEQC
CIPVRZGLOZHCERK6YPOBV3P2E4IAB4H6D5EHLRQE2O5E4P4VCBUAC
BDFIS53HAIHOCXQ5BE7WCO2MEOFCUQPFY4JGUWVLWY6JO3IFMEKQC
N6J4ANT3WFBQYTFDPZFVF2PWS2S7CK4GHHX4UV3JW4VWAKETZR5AC
UTKZUB7Z3YPIZMMGF5DUOKNZX3GWY46A4GUHX5GA2GMQCT2EWXSQC
FU7EQZLXD7YNGUUDHXCBI3VUKL6M2G3EPDY6FB5UA6B6RD4S5UOQC
XJBNF2N35THJC2KYGCMPLC3CDCJP25CEDKHUI3P55V6H5YWXBUKAC
3ZWALZFSTSIVYXY4BAY6ANGINTDACZC6RSSJTEMQSTSUIE66YOBQC
RPOZZWKG5GLPHVZZ7ZKMKS64ZMV2LDCQSARBJFJ6FZOTOKCQO7FAC
6ECDSRJ6V3FSIAQC6FZK5SV4NGXXR6PW5S4KADSPISPP36CXLTYQC
FIYBXLWALQINNQTHG2KNDUUTAQAZRDDLXW2XOVSKDKBADJ3XCJ4AC
KT3JMGSH5VTNRV2H5POWZLYNXSIRE5CT2XW3ZID7FNZTXYOZG22QC
PHBACPMH3F34GODHVDKNCMXWU373RJQGVTDLBFCCDLLWDXVYOLTAC
3DQXSE4YGFBBDUWK4YEOFWW4UPWILWELFSLP37SL6BERGAZJC5YAC
RK3TWXHPC3PFCY6WRRWV7VYSREPWZZSXK3ROQLB3QMYIJ3BLPBOQC
QVVC7AYGVA6U64PTNA7L27422NLMO327P22BQKXEVIMPZHIHO7MQC
3KAINFIXO7WNWGUGZB43EUNFRS2ZPBLQZDTY456QACMRHYIJ7WDAC
4SWAT5KCKQV527NKELAXFQ5XA4Q5HONQXD4VBXMUZNPVPQKPCPNAC
5IDWJF6VEZYCN64IW2XQYR42VEFAB6BR4WE4RNWXZ35JFDOZA77QC
RDLF4VIJMMHHL2OCQEXOK6HNCS5QX3FZF3S4IHPY3OZUKC2FZ24AC
JM7UAK777RAVDAVLQLEOBRTGNW2B47S5G55XITJXO243IUNZHVYQC
7P5WSNAGXFBICVTPQO6EHXMJ7O2HAYOIGVRS37EPA5GDQY7KUMIQC
WFMQVPMMOPG5SBJD5LUBOIYWRMXVWK3FXENK7SAEGZ5T6XWFKERQC
XL7E3EW5RPRYR7XHURIVKUJ3ATQAXMEGDLI3RSG3V4PGMLQ7CY3AC
bool evoke_item(int slot)
{
if (you.duration[DUR_BERSERKER])
{
canned_msg( MSG_TOO_BERSERK );
return (false);
}
if (player_in_bat_form())
{
canned_msg(MSG_PRESENT_FORM);
return (false);
}
if (slot == -1)
{
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);
}
ASSERT (slot >= 0);
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);
// Check inscriptions.
if (!check_warning_inscriptions(item, OPER_EVOKE))
return (false);
int power = 0;
int pract = 0; // By how much Evocations is practised.
bool did_work = false; // Used for default "nothing happens" message.
bool unevokable = false;
switch (item.base_type)
{
case OBJ_WANDS:
zap_wand(slot);
return (true);
case OBJ_WEAPONS:
ASSERT(wielded);
if (get_weapon_brand(item) == SPWPN_REACHING)
{
if (_reaching_weapon_attack(item))
{
pract = 0;
did_work = true;
}
else
return (false);
}
else if (is_fixed_artefact(item))
{
switch (item.special)
{
case SPWPN_STAFF_OF_DISPATER:
if (you.duration[DUR_DEATHS_DOOR] || !enough_hp(11, true)
|| !enough_mp(5, true))
{
break;
}
mpr("You feel the staff feeding on your energy!");
dec_hp( 5 + random2avg(19, 2), false, "Staff of Dispater" );
dec_mp( 2 + random2avg(5, 2) );
make_hungry(100, false, true);
power = you.skills[SK_EVOCATIONS] * 8;
your_spells( SPELL_HELLFIRE, power, false );
pract = (coinflip() ? 2 : 1);
did_work = true;
break;
case SPWPN_SCEPTRE_OF_ASMODEUS:
if (evoke_sceptre_of_asmodeus())
{
make_hungry(200, false, true);
did_work = true;
pract = 1;
}
break;
case SPWPN_STAFF_OF_OLGREB:
if (!enough_mp( 4, true )
|| you.skills[SK_EVOCATIONS] < random2(6))
{
break;
}
dec_mp(4);
make_hungry(50, false, true);
pract = 1;
did_work = true;
power = 10 + you.skills[SK_EVOCATIONS] * 8;
your_spells( SPELL_OLGREBS_TOXIC_RADIANCE, power, false );
if (x_chance_in_y(you.skills[SK_EVOCATIONS] + 1, 10))
your_spells( SPELL_VENOM_BOLT, power, false );
break;
case SPWPN_STAFF_OF_WUCAD_MU:
if (you.magic_points == you.max_magic_points
|| you.skills[SK_EVOCATIONS] < random2(25))
{
break;
}
mpr("Magical energy flows into your mind!");
inc_mp( 3 + random2(5) + you.skills[SK_EVOCATIONS] / 3, false );
make_hungry(50, false, true);
pract = 1;
did_work = true;
if (one_chance_in(3))
{
// NH_NEVER prevents "nothing happens" messages.
MiscastEffect( &you, NON_MONSTER, SPTYP_DIVINATION,
random2(9), random2(70),
"the Staff of Wucad Mu", NH_NEVER );
}
break;
default:
unevokable = true;
break;
}
}
else
unevokable = true;
break;
case OBJ_STAVES:
ASSERT(wielded);
if (item_is_rod( item ))
{
pract = staff_spell( slot );
// [ds] Early exit, no turns are lost.
if (pract == -1)
return (false);
did_work = true; // staff_spell() will handle messages
}
else if (item.sub_type == STAFF_CHANNELING)
{
if (you.magic_points < you.max_magic_points
&& x_chance_in_y(you.skills[SK_EVOCATIONS] + 11, 40))
{
mpr("You channel some magical energy.");
inc_mp( 1 + random2(3), false );
make_hungry(50, false, true);
pract = 1;
did_work = true;
if (!item_type_known(item))
{
set_ident_type( OBJ_STAVES, item.sub_type, ID_KNOWN_TYPE );
set_ident_flags( item, ISFLAG_KNOW_TYPE );
mprf("You are wielding %s.",
item.name(DESC_NOCAP_A).c_str());
more();
you.wield_change = true;
}
}
}
else
{
unevokable = true;
}
break;
case OBJ_MISCELLANY:
did_work = true; // easier to do it this way for misc items
if (is_deck(item))
{
ASSERT(wielded);
evoke_deck(item);
pract = 1;
break;
}
switch (item.sub_type)
{
case MISC_BOTTLED_EFREET:
if (_efreet_flask())
pract = 2;
break;
case MISC_CRYSTAL_BALL_OF_SEEING:
if (_ball_of_seeing())
pract = 1;
break;
case MISC_AIR_ELEMENTAL_FAN:
if (you.skills[SK_EVOCATIONS] <= random2(30))
canned_msg(MSG_NOTHING_HAPPENS);
else
{
cast_summon_elemental(100, GOD_NO_GOD, MONS_AIR_ELEMENTAL, 4);
pract = (one_chance_in(5) ? 1 : 0);
}
break;
case MISC_LAMP_OF_FIRE:
if (you.skills[SK_EVOCATIONS] <= random2(30))
canned_msg(MSG_NOTHING_HAPPENS);
else
{
cast_summon_elemental(100, GOD_NO_GOD, MONS_FIRE_ELEMENTAL, 4);
pract = (one_chance_in(5) ? 1 : 0);
}
break;
case MISC_STONE_OF_EARTH_ELEMENTALS:
if (you.skills[SK_EVOCATIONS] <= random2(30))
canned_msg(MSG_NOTHING_HAPPENS);
else
{
cast_summon_elemental(100, GOD_NO_GOD, MONS_EARTH_ELEMENTAL, 4);
pract = (one_chance_in(5) ? 1 : 0);
}
break;
case MISC_HORN_OF_GERYON:
if (evoke_horn_of_geryon())
pract = 1;
break;
case MISC_BOX_OF_BEASTS:
if (_box_of_beasts())
pract = 1;
break;
case MISC_CRYSTAL_BALL_OF_ENERGY:
if (_ball_of_energy())
pract = 1;
break;
case MISC_CRYSTAL_BALL_OF_FIXATION:
if (_ball_of_fixation())
pract = 1;
break;
case MISC_DISC_OF_STORMS:
if (_disc_of_storms())
pract = (coinflip() ? 2 : 1);
break;
default:
did_work = false;
unevokable = true;
break;
}
break;
default:
unevokable = true;
break;
}
if (!did_work)
canned_msg(MSG_NOTHING_HAPPENS);
else if (pract > 0)
exercise( SK_EVOCATIONS, pract );
if (!unevokable)
you.turn_is_over = true;
else
crawl_state.zero_turns_taken();
return (did_work);
}
bool evoke_item(int slot)
{
if (you.duration[DUR_BERSERKER])
{
canned_msg( MSG_TOO_BERSERK );
return (false);
}
if (player_in_bat_form())
{
canned_msg(MSG_PRESENT_FORM);
return (false);
}
if (slot == -1)
{
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);
}
ASSERT (slot >= 0);
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);
// Check inscriptions.
if (!check_warning_inscriptions(item, OPER_EVOKE))
return (false);
int power = 0;
int pract = 0; // By how much Evocations is practised.
bool did_work = false; // Used for default "nothing happens" message.
bool unevokable = false;
switch (item.base_type)
{
case OBJ_WANDS:
zap_wand(slot);
return (true);
case OBJ_WEAPONS:
ASSERT(wielded);
if (get_weapon_brand(item) == SPWPN_REACHING)
{
if (_reaching_weapon_attack(item))
{
pract = 0;
did_work = true;
}
else
return (false);
}
else if (is_fixed_artefact(item))
{
switch (item.special)
{
case SPWPN_STAFF_OF_DISPATER:
if (you.duration[DUR_DEATHS_DOOR] || !enough_hp(11, true)
|| !enough_mp(5, true))
{
break;
}
mpr("You feel the staff feeding on your energy!");
dec_hp( 5 + random2avg(19, 2), false, "Staff of Dispater" );
dec_mp( 2 + random2avg(5, 2) );
make_hungry(100, false, true);
power = you.skills[SK_EVOCATIONS] * 8;
your_spells( SPELL_HELLFIRE, power, false );
pract = (coinflip() ? 2 : 1);
did_work = true;
break;
case SPWPN_SCEPTRE_OF_ASMODEUS:
if (evoke_sceptre_of_asmodeus())
{
make_hungry(200, false, true);
did_work = true;
pract = 1;
}
break;
case SPWPN_STAFF_OF_OLGREB:
if (!enough_mp( 4, true )
|| you.skills[SK_EVOCATIONS] < random2(6))
{
break;
}
dec_mp(4);
make_hungry(50, false, true);
pract = 1;
did_work = true;
power = 10 + you.skills[SK_EVOCATIONS] * 8;
your_spells( SPELL_OLGREBS_TOXIC_RADIANCE, power, false );
if (x_chance_in_y(you.skills[SK_EVOCATIONS] + 1, 10))
your_spells( SPELL_VENOM_BOLT, power, false );
break;
case SPWPN_STAFF_OF_WUCAD_MU:
if (you.magic_points == you.max_magic_points
|| you.skills[SK_EVOCATIONS] < random2(25))
{
break;
}
mpr("Magical energy flows into your mind!");
inc_mp( 3 + random2(5) + you.skills[SK_EVOCATIONS] / 3, false );
make_hungry(50, false, true);
pract = 1;
did_work = true;
if (one_chance_in(3))
{
// NH_NEVER prevents "nothing happens" messages.
MiscastEffect( &you, NON_MONSTER, SPTYP_DIVINATION,
random2(9), random2(70),
"the Staff of Wucad Mu", NH_NEVER );
}
break;
default:
unevokable = true;
break;
}
}
else
unevokable = true;
break;
case OBJ_STAVES:
ASSERT(wielded);
if (item_is_rod( item ))
{
pract = staff_spell( slot );
// [ds] Early exit, no turns are lost.
if (pract == -1)
return (false);
did_work = true; // staff_spell() will handle messages
}
else if (item.sub_type == STAFF_CHANNELING)
{
if (you.magic_points < you.max_magic_points
&& x_chance_in_y(you.skills[SK_EVOCATIONS] + 11, 40))
{
mpr("You channel some magical energy.");
inc_mp( 1 + random2(3), false );
make_hungry(50, false, true);
pract = 1;
did_work = true;
if (!item_type_known(item))
{
set_ident_type( OBJ_STAVES, item.sub_type, ID_KNOWN_TYPE );
set_ident_flags( item, ISFLAG_KNOW_TYPE );
mprf("You are wielding %s.",
item.name(DESC_NOCAP_A).c_str());
more();
you.wield_change = true;
}
}
}
else
{
unevokable = true;
}
break;
case OBJ_MISCELLANY:
did_work = true; // easier to do it this way for misc items
if (is_deck(item))
{
ASSERT(wielded);
evoke_deck(item);
pract = 1;
break;
}
switch (item.sub_type)
{
case MISC_BOTTLED_EFREET:
if (_efreet_flask(slot))
pract = 2;
break;
case MISC_CRYSTAL_BALL_OF_SEEING:
if (_ball_of_seeing())
pract = 1;
break;
case MISC_AIR_ELEMENTAL_FAN:
if (you.skills[SK_EVOCATIONS] <= random2(30))
canned_msg(MSG_NOTHING_HAPPENS);
else
{
cast_summon_elemental(100, GOD_NO_GOD, MONS_AIR_ELEMENTAL, 4);
pract = (one_chance_in(5) ? 1 : 0);
}
break;
case MISC_LAMP_OF_FIRE:
if (you.skills[SK_EVOCATIONS] <= random2(30))
canned_msg(MSG_NOTHING_HAPPENS);
else
{
cast_summon_elemental(100, GOD_NO_GOD, MONS_FIRE_ELEMENTAL, 4);
pract = (one_chance_in(5) ? 1 : 0);
}
break;
case MISC_STONE_OF_EARTH_ELEMENTALS:
if (you.skills[SK_EVOCATIONS] <= random2(30))
canned_msg(MSG_NOTHING_HAPPENS);
else
{
cast_summon_elemental(100, GOD_NO_GOD, MONS_EARTH_ELEMENTAL, 4);
pract = (one_chance_in(5) ? 1 : 0);
}
break;
case MISC_HORN_OF_GERYON:
if (evoke_horn_of_geryon())
pract = 1;
break;
case MISC_BOX_OF_BEASTS:
if (_box_of_beasts(item))
pract = 1;
break;
case MISC_CRYSTAL_BALL_OF_ENERGY:
if (_ball_of_energy())
pract = 1;
break;
case MISC_CRYSTAL_BALL_OF_FIXATION:
if (_ball_of_fixation())
pract = 1;
break;
case MISC_DISC_OF_STORMS:
if (_disc_of_storms())
pract = (coinflip() ? 2 : 1);
break;
default:
did_work = false;
unevokable = true;
break;
}
break;
default:
unevokable = true;
break;
}
if (!did_work)
canned_msg(MSG_NOTHING_HAPPENS);
else if (pract > 0)
exercise( SK_EVOCATIONS, pract );
if (!unevokable)
you.turn_is_over = true;
else
crawl_state.zero_turns_taken();
return (did_work);
}