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;}elsereturn (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;}}elseunevokable = 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 itemsif (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;elsecrawl_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;}elsereturn (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;}}elseunevokable = 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 itemsif (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;elsecrawl_state.zero_turns_taken();return (did_work);}