summaryrefslogtreecommitdiffstats
path: root/trunk/source/it_use2.cc
diff options
context:
space:
mode:
authorpeterb12 <peterb12@c06c8d41-db1a-0410-9941-cceddc491573>2005-07-21 02:34:44 +0000
committerpeterb12 <peterb12@c06c8d41-db1a-0410-9941-cceddc491573>2005-07-21 02:34:44 +0000
commit673bdae75485d14f759af597c3c62b99601f9a43 (patch)
tree368103f29fe0ce5dcf98060d9b5faa04590085fb /trunk/source/it_use2.cc
parent7e900be770db24b0405fd2162491c405a425873e (diff)
downloadcrawl-ref-673bdae75485d14f759af597c3c62b99601f9a43.tar.gz
crawl-ref-673bdae75485d14f759af597c3c62b99601f9a43.zip
Initial revision
git-svn-id: https://crawl-ref.svn.sourceforge.net/svnroot/crawl-ref/trunk@3 c06c8d41-db1a-0410-9941-cceddc491573
Diffstat (limited to 'trunk/source/it_use2.cc')
-rw-r--r--trunk/source/it_use2.cc523
1 files changed, 523 insertions, 0 deletions
diff --git a/trunk/source/it_use2.cc b/trunk/source/it_use2.cc
new file mode 100644
index 0000000000..45449716d9
--- /dev/null
+++ b/trunk/source/it_use2.cc
@@ -0,0 +1,523 @@
+/*
+ * File: it_use2.cc
+ * Summary: Functions for using wands, potions, and weapon/armour removal.4\3
+ * Written by: Linley Henzell
+ *
+ * Change History (most recent first):
+ *
+ * 26jun2000 jmf added ZAP_MAGMA
+ * <4> 19mar2000 jmf Added ZAP_BACKLIGHT and ZAP_SLEEP
+ * <3> 10/1/99 BCR Changed messages for speed and
+ * made amulet resist slow up speed
+ * <2> 5/20/99 BWR Fixed bug with RAP_METABOLISM
+ * and RAP_NOISES artefacts/
+ * <1> -/--/-- LRH Created
+ */
+
+#include "AppHdr.h"
+#include "it_use2.h"
+
+#include <stdio.h>
+#include <string.h>
+
+#include "externs.h"
+
+#include "beam.h"
+#include "effects.h"
+#include "food.h"
+#include "itemname.h"
+#include "misc.h"
+#include "mutation.h"
+#include "player.h"
+#include "randart.h"
+#include "religion.h"
+#include "skills2.h"
+#include "spells2.h"
+#include "spl-cast.h"
+#include "stuff.h"
+#include "view.h"
+
+// From an actual potion, pow == 40 -- bwr
+bool potion_effect( char pot_eff, int pow )
+{
+ bool effect = true; // current behaviour is all potions id on quaffing
+
+ int new_value = 0;
+ unsigned char i;
+
+ if (pow > 150)
+ pow = 150;
+
+ switch (pot_eff)
+ {
+ case POT_HEALING:
+ mpr("You feel better.");
+ inc_hp(5 + random2(7), false);
+
+ // only fix rot when healed to full
+ if (you.hp == you.hp_max)
+ {
+ unrot_hp(1);
+ set_hp(you.hp_max, false);
+ }
+
+ you.poison = 0;
+ you.rotting = 0;
+ you.disease = 0;
+ you.conf = 0;
+ break;
+
+ case POT_HEAL_WOUNDS:
+ mpr("You feel much better.");
+ inc_hp(10 + random2avg(28, 3), false);
+
+ // only fix rot when healed to full
+ if (you.hp == you.hp_max)
+ {
+ unrot_hp( 2 + random2avg(5, 2) );
+ set_hp(you.hp_max, false);
+ }
+ break;
+
+ case POT_SPEED:
+ haste_player( 40 + random2(pow) );
+ break;
+
+ case POT_MIGHT:
+ {
+ bool were_mighty = (you.might > 0);
+
+ if (!were_mighty)
+ mpr( "You feel very mighty all of a sudden." );
+ else
+ {
+ mpr( "You still feel pretty mighty." );
+ contaminate_player(1);
+ }
+
+ // conceivable max gain of +184 {dlb}
+ you.might += 35 + random2(pow);
+
+ if (!were_mighty)
+ modify_stat(STAT_STRENGTH, 5, true);
+
+ // files.cc permits values up to 215, but ... {dlb}
+ if (you.might > 80)
+ you.might = 80;
+
+ naughty( NAUGHTY_STIMULANTS, 4 + random2(4) );
+ }
+ break;
+
+ case POT_GAIN_STRENGTH:
+ mutate(MUT_STRONG);
+ break;
+
+ case POT_GAIN_DEXTERITY:
+ mutate(MUT_AGILE);
+ break;
+
+ case POT_GAIN_INTELLIGENCE:
+ mutate(MUT_CLEVER);
+ break;
+
+ case POT_LEVITATION:
+ strcpy(info, "You feel");
+ strcat(info, (!player_is_levitating()) ? " very" : " more");
+ strcat(info, " buoyant.");
+ mpr(info);
+
+ if (!player_is_levitating())
+ mpr("You gently float upwards from the floor.");
+
+ you.levitation += 25 + random2(pow);
+
+ if (you.levitation > 100)
+ you.levitation = 100;
+
+ burden_change();
+ break;
+
+ case POT_POISON:
+ case POT_STRONG_POISON:
+ if (player_res_poison())
+ {
+ snprintf( info, INFO_SIZE, "You feel %s nauseous.",
+ (pot_eff == POT_POISON) ? "slightly" : "quite" );
+
+ mpr(info);
+ }
+ else
+ {
+ snprintf( info, INFO_SIZE, "That liquid tasted %s nasty...",
+ (pot_eff == POT_POISON) ? "very" : "extremely" );
+
+ mpr(info);
+
+ poison_player( ((pot_eff == POT_POISON) ? 1 + random2avg(5, 2)
+ : 3 + random2avg(13, 2)) );
+ }
+ break;
+
+ case POT_SLOWING:
+ slow_player( 10 + random2(pow) );
+ break;
+
+ case POT_PARALYSIS:
+ snprintf( info, INFO_SIZE, "You %s the ability to move!",
+ (you.paralysis) ? "still haven't" : "suddenly lose" );
+
+ mpr( info, MSGCH_WARN );
+
+ new_value = 2 + random2( 6 + you.paralysis );
+
+ if (new_value > you.paralysis)
+ you.paralysis = new_value;
+
+ if (you.paralysis > 13)
+ you.paralysis = 13;
+ break;
+
+ case POT_CONFUSION:
+ confuse_player( 3 + random2(8) );
+ break;
+
+ case POT_INVISIBILITY:
+ mpr( (!you.invis) ? "You fade into invisibility!"
+ : "You feel safely hidden away." );
+
+ // now multiple invisiblity casts aren't as good -- bwr
+ if (!you.invis)
+ you.invis = 15 + random2(pow);
+ else
+ you.invis += random2(pow);
+
+ if (you.invis > 100)
+ you.invis = 100;
+ break;
+
+ // carnivore check here? {dlb}
+ case POT_PORRIDGE: // oatmeal - always gluggy white/grey?
+ mpr("That potion was really gluggy!");
+ lessen_hunger(6000, true);
+ break;
+
+ case POT_DEGENERATION:
+ mpr("There was something very wrong with that liquid!");
+ lose_stat(STAT_RANDOM, 1 + random2avg(4, 2));
+ break;
+
+ // Don't generate randomly - should be rare and interesting
+ case POT_DECAY:
+ if (you.is_undead)
+ mpr( "You feel terrible." );
+ else
+ rot_player( 10 + random2(10) );
+ break;
+
+ case POT_WATER:
+ mpr("This tastes like water.");
+ // we should really separate thirst from hunger {dlb}
+ // Thirst would just be annoying for the player, the
+ // 20 points here doesn't represesent real food anyways -- bwr
+ lessen_hunger(20, true);
+ break;
+
+ case POT_EXPERIENCE:
+ if (you.experience_level < 27)
+ {
+ mpr("You feel more experienced!");
+
+ you.experience = 1 + exp_needed( 2 + you.experience_level );
+ level_change();
+ }
+ else
+ mpr("A flood of memories washes over you.");
+ break; // I'll let this slip past robe of archmagi
+
+ case POT_MAGIC:
+ mpr( "You feel magical!" );
+ new_value = 5 + random2avg(19, 2);
+
+ // increase intrinsic MP points
+ if (you.magic_points + new_value > you.max_magic_points)
+ {
+ new_value = (you.max_magic_points - you.magic_points)
+ + (you.magic_points + new_value - you.max_magic_points) / 4 + 1;
+ }
+
+ inc_mp( new_value, true );
+ break;
+
+ case POT_RESTORE_ABILITIES:
+ // messaging taken care of within function {dlb}
+ // not quite true... if no stat's are restore = no message, and
+ // that's just confusing when trying out random potions (this one
+ // still auto-identifies so we know what the effect is, but it
+ // shouldn't require bringing up the descovery screen to do that -- bwr
+ if (restore_stat(STAT_ALL, false) == false)
+ mpr( "You feel refreshed." );
+ break;
+
+ case POT_BERSERK_RAGE:
+ go_berserk(true);
+ break;
+
+ case POT_CURE_MUTATION:
+ mpr("It has a very clean taste.");
+ for (i = 0; i < 7; i++)
+ {
+ if (random2(10) > i)
+ delete_mutation(100);
+ }
+ break;
+
+ case POT_MUTATION:
+ mpr("You feel extremely strange.");
+ for (i = 0; i < 3; i++)
+ {
+ mutate(100, false);
+ }
+
+ naughty(NAUGHTY_STIMULANTS, 4 + random2(4));
+ break;
+ }
+
+ return (effect);
+} // end potion_effect()
+
+void unwield_item(char unw)
+{
+ you.special_wield = SPWLD_NONE;
+ you.wield_change = true;
+
+ if (you.inv[unw].base_type == OBJ_WEAPONS)
+ {
+ if (is_fixed_artefact( you.inv[unw] ))
+ {
+ switch (you.inv[unw].special)
+ {
+ case SPWPN_SINGING_SWORD:
+ mpr("The Singing Sword sighs.");
+ break;
+ case SPWPN_WRATH_OF_TROG:
+ mpr("You feel less violent.");
+ break;
+ case SPWPN_SCYTHE_OF_CURSES:
+ case SPWPN_STAFF_OF_OLGREB:
+ you.inv[unw].plus = 0;
+ you.inv[unw].plus2 = 0;
+ break;
+ case SPWPN_STAFF_OF_WUCAD_MU:
+ you.inv[unw].plus = 0;
+ you.inv[unw].plus2 = 0;
+ miscast_effect( SPTYP_DIVINATION, 9, 90, 100, "the Staff of Wucad Mu" );
+ break;
+ default:
+ break;
+ }
+
+ return;
+ }
+
+ int brand = get_weapon_brand( you.inv[unw] );
+
+ if (is_random_artefact( you.inv[unw] ))
+ unuse_randart(unw);
+
+ if (brand != SPWPN_NORMAL)
+ {
+ char str_pass[ ITEMNAME_SIZE ];
+ in_name(unw, DESC_CAP_YOUR, str_pass);
+ strcpy(info, str_pass);
+
+ switch (brand)
+ {
+ case SPWPN_SWORD_OF_CEREBOV:
+ case SPWPN_FLAMING:
+ strcat(info, " stops flaming.");
+ mpr(info);
+ break;
+
+ case SPWPN_FREEZING:
+ case SPWPN_HOLY_WRATH:
+ strcat(info, " stops glowing.");
+ mpr(info);
+ break;
+
+ case SPWPN_ELECTROCUTION:
+ strcat(info, " stops crackling.");
+ mpr(info);
+ break;
+
+ case SPWPN_VENOM:
+ strcat(info, " stops dripping with poison.");
+ mpr(info);
+ break;
+
+ case SPWPN_PROTECTION:
+ mpr("You feel less protected.");
+ you.redraw_armour_class = 1;
+ break;
+
+ case SPWPN_VAMPIRICISM:
+ mpr("You feel the strange hunger wane.");
+ break;
+
+ /* case 8: draining
+ case 9: speed, 10 slicing etc */
+
+ case SPWPN_DISTORTION:
+ // Removing the translocations skill reduction of effect,
+ // it might seem sensible, but this brand is supposted
+ // to be dangerous because it does large bonus damage,
+ // as well as free teleport other side effects, and
+ // even with the miscast effects you can rely on the
+ // occasional spatial bonus to mow down some opponents.
+ // It's far too powerful without a real risk, especially
+ // if it's to be allowed as a player spell. -- bwr
+
+ // int effect = 9 - random2avg( you.skills[SK_TRANSLOCATIONS] * 2, 2 );
+ miscast_effect( SPTYP_TRANSLOCATION, 9, 90, 100, "a distortion effect" );
+ break;
+
+ // when more are added here, *must* duplicate unwielding
+ // effect in vorpalise weapon scroll effect in read_scoll
+ } // end switch
+
+
+ if (you.duration[DUR_WEAPON_BRAND])
+ {
+ you.duration[DUR_WEAPON_BRAND] = 0;
+ set_item_ego_type( you.inv[unw], OBJ_WEAPONS, SPWPN_NORMAL );
+ mpr("Your branding evaporates.");
+ }
+ } // end if
+ }
+
+ if (player_equip( EQ_STAFF, STAFF_POWER ))
+ {
+ // XXX: Ugly hack so that thhis currently works (don't want to
+ // mess with the fact that currently this function doesn't
+ // actually unwield the item, but we need it out of the player's
+ // hand for this to work. -- bwr
+ int tmp = you.equip[ EQ_WEAPON ];
+
+ you.equip[ EQ_WEAPON ] = -1;
+ calc_mp();
+ you.equip[ EQ_WEAPON ] = tmp;
+ }
+
+ return;
+} // end unwield_item()
+
+// This does *not* call ev_mod!
+void unwear_armour(char unw)
+{
+ you.redraw_armour_class = 1;
+ you.redraw_evasion = 1;
+
+ switch (get_armour_ego_type( you.inv[unw] ))
+ {
+ case SPARM_RUNNING:
+ mpr("You feel rather sluggish.");
+ break;
+
+ case SPARM_FIRE_RESISTANCE:
+ mpr("\"Was it this warm in here before?\"");
+ break;
+
+ case SPARM_COLD_RESISTANCE:
+ mpr("You catch a bit of a chill.");
+ break;
+
+ case SPARM_POISON_RESISTANCE:
+ if (!player_res_poison())
+ mpr("You feel less healthy.");
+ break;
+
+ case SPARM_SEE_INVISIBLE:
+ if (!player_see_invis())
+ mpr("You feel less perceptive.");
+ break;
+
+ case SPARM_DARKNESS: // I do not understand this {dlb}
+ if (you.invis)
+ you.invis = 1;
+ break;
+
+ case SPARM_STRENGTH:
+ modify_stat(STAT_STRENGTH, -3, false);
+ break;
+
+ case SPARM_DEXTERITY:
+ modify_stat(STAT_DEXTERITY, -3, false);
+ break;
+
+ case SPARM_INTELLIGENCE:
+ modify_stat(STAT_INTELLIGENCE, -3, false);
+ break;
+
+ case SPARM_PONDEROUSNESS:
+ mpr("That put a bit of spring back into your step.");
+ // you.speed -= 2;
+ break;
+
+ case SPARM_LEVITATION:
+ //you.levitation++;
+ if (you.levitation)
+ you.levitation = 1;
+ break;
+
+ case SPARM_MAGIC_RESISTANCE:
+ mpr("You feel less resistant to magic.");
+ break;
+
+ case SPARM_PROTECTION:
+ mpr("You feel less protected.");
+ break;
+
+ case SPARM_STEALTH:
+ mpr("You feel less stealthy.");
+ break;
+
+ case SPARM_RESISTANCE:
+ mpr("You feel hot and cold all over.");
+ break;
+
+ case SPARM_POSITIVE_ENERGY:
+ mpr("You feel vulnerable.");
+ break;
+
+ case SPARM_ARCHMAGI:
+ mpr("You feel strangely numb.");
+ break;
+ }
+
+ if (is_random_artefact( you.inv[unw] ))
+ unuse_randart(unw);
+
+ return;
+} // end unwear_armour()
+
+void unuse_randart(unsigned char unw)
+{
+ ASSERT( is_random_artefact( you.inv[unw] ) );
+
+ FixedVector< char, RA_PROPERTIES > proprt;
+ randart_wpn_properties( you.inv[unw], proprt );
+
+ if (proprt[RAP_AC])
+ you.redraw_armour_class = 1;
+
+ if (proprt[RAP_EVASION])
+ you.redraw_evasion = 1;
+
+ // modify ability scores
+ modify_stat( STAT_STRENGTH, -proprt[RAP_STRENGTH], true );
+ modify_stat( STAT_INTELLIGENCE, -proprt[RAP_INTELLIGENCE], true );
+ modify_stat( STAT_DEXTERITY, -proprt[RAP_DEXTERITY], true );
+
+ if (proprt[RAP_NOISES] != 0)
+ you.special_wield = SPWLD_NONE;
+} // end unuse_randart()