summaryrefslogtreecommitdiffstats
path: root/crawl-ref/source/fight.cc
diff options
context:
space:
mode:
authorj-p-e-g <j-p-e-g@c06c8d41-db1a-0410-9941-cceddc491573>2007-09-10 18:21:32 +0000
committerj-p-e-g <j-p-e-g@c06c8d41-db1a-0410-9941-cceddc491573>2007-09-10 18:21:32 +0000
commitd5f99b33e02371f88fa0028b496f48539d9ec8a1 (patch)
tree868a9c60ad96c7e320dd6843dd318785e03ae6d2 /crawl-ref/source/fight.cc
parent6e2e9d806ac731c0e421e7bfb4ab5497ea73730b (diff)
downloadcrawl-ref-d5f99b33e02371f88fa0028b496f48539d9ec8a1.tar.gz
crawl-ref-d5f99b33e02371f88fa0028b496f48539d9ec8a1.zip
Identification overhaul part II. Okay, not really. ;)
Applying Matthew's latest patch (1789869): Identify items you see monsters use. git-svn-id: https://crawl-ref.svn.sourceforge.net/svnroot/crawl-ref/trunk@2068 c06c8d41-db1a-0410-9941-cceddc491573
Diffstat (limited to 'crawl-ref/source/fight.cc')
-rw-r--r--crawl-ref/source/fight.cc51
1 files changed, 46 insertions, 5 deletions
diff --git a/crawl-ref/source/fight.cc b/crawl-ref/source/fight.cc
index e32961c628..9619b92e38 100644
--- a/crawl-ref/source/fight.cc
+++ b/crawl-ref/source/fight.cc
@@ -286,7 +286,7 @@ melee_attack::melee_attack(actor *attk, actor *defn,
: attacker(attk), defender(defn),
atk(NULL), def(NULL),
cancel_attack(false),
- did_hit(false), perceived_attack(false),
+ did_hit(false), perceived_attack(false), obvious_effect(false),
needs_message(false), attacker_visible(false), defender_visible(false),
attacker_invisible(false), defender_invisible(false),
unarmed_ok(allow_unarmed),
@@ -1615,6 +1615,8 @@ bool melee_attack::distortion_affects_defender()
if (one_chance_in(3))
{
emit_nodmg_hit_message();
+ if (defender_visible)
+ obvious_effect = true;
defender->blink();
return (false);
}
@@ -1626,6 +1628,8 @@ bool melee_attack::distortion_affects_defender()
if (!one_chance_in(3))
{
emit_nodmg_hit_message();
+ if (defender_visible)
+ obvious_effect = true;
defender->teleport(coinflip(), one_chance_in(5));
return (false);
}
@@ -1633,6 +1637,19 @@ bool melee_attack::distortion_affects_defender()
if (you.level_type != LEVEL_ABYSS && coinflip())
{
emit_nodmg_hit_message();
+
+ if (defender->atype() == ACT_PLAYER && attacker_visible
+ && weapon != NULL && !is_artefact(*weapon))
+ {
+ // If the player is being sent to the Abyss by being attacked
+ // with a distortion weapon, then we have to ID it before
+ // the player goes to Abyss, while the weapon object is
+ // still in memory.
+ set_ident_flags(*weapon, ISFLAG_KNOW_TYPE);
+ }
+ else if (defender_visible)
+ obvious_effect = true;
+
defender->banish( atk? atk->name(DESC_PLAIN, true)
: attacker->name(DESC_PLAIN) );
return (true);
@@ -1643,10 +1660,13 @@ bool melee_attack::distortion_affects_defender()
bool melee_attack::apply_damage_brand()
{
+ bool ret = false;
+
// Monster resistance to the brand.
int res = 0;
-
+
special_damage = 0;
+ obvious_effect = false;
switch (damage_brand)
{
case SPWPN_FLAMING:
@@ -1718,12 +1738,24 @@ bool melee_attack::apply_damage_brand()
case SPWPN_STAFF_OF_OLGREB:
if (!one_chance_in(4))
{
+ int old_poison = 0;
+
+ if (defender->atype() == ACT_PLAYER)
+ old_poison = you.duration[DUR_POISONING];
+
// Poison monster message needs to arrive after hit message.
emit_nodmg_hit_message();
// Weapons of venom do two levels of poisoning to the player,
// but only one level to monsters.
defender->poison( attacker, 2 );
+
+ if (defender->atype() == ACT_PLAYER
+ && old_poison < you.duration[DUR_POISONING])
+ {
+ obvious_effect = true;
+ }
+
}
break;
@@ -1747,6 +1779,8 @@ bool melee_attack::apply_damage_brand()
break;
}
+ obvious_effect = true;
+
// vampire bat form
if (you.species == SP_VAMPIRE && attacker->atype() == ACT_PLAYER
&& you.attribute[ATTR_TRANSFORMATION] == TRAN_BAT)
@@ -1853,8 +1887,7 @@ bool melee_attack::apply_damage_brand()
break;
case SPWPN_DISTORTION:
- if (distortion_affects_defender())
- return (true);
+ ret = distortion_affects_defender();
break;
case SPWPN_CONFUSE:
@@ -1885,7 +1918,15 @@ bool melee_attack::apply_damage_brand()
}
}
- return (false);
+ obvious_effect = obvious_effect || (special_damage_message != "");
+
+ if (obvious_effect && attacker_visible && weapon != NULL
+ && !is_artefact(*weapon))
+ {
+ set_ident_flags(*weapon, ISFLAG_KNOW_TYPE);
+ }
+
+ return (ret);
}
// Returns true if a head got lopped off.