summaryrefslogtreecommitdiffstats
path: root/crawl-ref
diff options
context:
space:
mode:
authorAdam Borowski <kilobyte@angband.pl>2009-11-13 14:35:56 +0100
committerAdam Borowski <kilobyte@angband.pl>2009-11-13 19:51:51 +0100
commit14be7c5cfe60d0d9f1a00cd543c32482bdd544d4 (patch)
treeb4fa79fbe2a0d21c9e2e05e890a43289a7378a60 /crawl-ref
parent5aba0fa49e632d5f61d3489263f36dde4a74dfad (diff)
downloadcrawl-ref-14be7c5cfe60d0d9f1a00cd543c32482bdd544d4.tar.gz
crawl-ref-14be7c5cfe60d0d9f1a00cd543c32482bdd544d4.zip
Let unrandart shields have a melee_effect func, called on successful block.
Diffstat (limited to 'crawl-ref')
-rw-r--r--crawl-ref/source/actor.cc18
-rw-r--r--crawl-ref/source/actor.h2
-rw-r--r--crawl-ref/source/beam.cc4
-rw-r--r--crawl-ref/source/fight.cc2
-rw-r--r--crawl-ref/source/monster.cc4
-rw-r--r--crawl-ref/source/monster.h2
-rw-r--r--crawl-ref/source/player.cc4
-rw-r--r--crawl-ref/source/player.h2
8 files changed, 29 insertions, 9 deletions
diff --git a/crawl-ref/source/actor.cc b/crawl-ref/source/actor.cc
index 1cacd258d4..a9da27b6ad 100644
--- a/crawl-ref/source/actor.cc
+++ b/crawl-ref/source/actor.cc
@@ -1,6 +1,7 @@
#include "AppHdr.h"
#include "actor.h"
+#include "artefact.h"
#include "env.h"
#include "player.h"
#include "random.h"
@@ -145,4 +146,19 @@ bool actor::can_hibernate(bool holi_only) const
return (true);
}
-
+void actor::shield_block_succeeded(actor *foe)
+{
+ item_def *sh = shield();
+ unrandart_entry *unrand_entry;
+
+ if (sh
+ && sh->base_type == OBJ_ARMOUR
+ && get_armour_slot(*sh) == EQ_SHIELD
+ && is_artefact(*sh)
+ && is_unrandom_artefact(*sh)
+ && (unrand_entry = get_unrand_entry(sh->special))
+ && unrand_entry->fight_func.melee_effects)
+ {
+ unrand_entry->fight_func.melee_effects(sh, this, foe, false);
+ }
+}
diff --git a/crawl-ref/source/actor.h b/crawl-ref/source/actor.h
index 72c5057e71..401b768d7f 100644
--- a/crawl-ref/source/actor.h
+++ b/crawl-ref/source/actor.h
@@ -181,7 +181,7 @@ public:
virtual int shield_block_penalty() const = 0;
virtual int shield_bypass_ability(int tohit) const = 0;
- virtual void shield_block_succeeded() { }
+ virtual void shield_block_succeeded(actor *foe);
virtual int mons_species() const = 0;
diff --git a/crawl-ref/source/beam.cc b/crawl-ref/source/beam.cc
index 065db7c014..a4cafaf209 100644
--- a/crawl-ref/source/beam.cc
+++ b/crawl-ref/source/beam.cc
@@ -3730,7 +3730,7 @@ bool bolt::misses_player()
mprf( "You block the %s.", name.c_str() );
finish_beam();
}
- you.shield_block_succeeded();
+ you.shield_block_succeeded(agent());
return (true);
}
@@ -4680,7 +4680,7 @@ bool bolt::attempt_block(monsters* mon)
finish_beam();
}
- mon->shield_block_succeeded();
+ mon->shield_block_succeeded(agent());
}
}
diff --git a/crawl-ref/source/fight.cc b/crawl-ref/source/fight.cc
index 0a52fb2b13..5eb2dcdf3c 100644
--- a/crawl-ref/source/fight.cc
+++ b/crawl-ref/source/fight.cc
@@ -4342,7 +4342,7 @@ bool melee_attack::attack_shield_blocked(bool verbose)
atk_name(DESC_NOCAP_ITS).c_str());
}
- defender->shield_block_succeeded();
+ defender->shield_block_succeeded(attacker);
return (true);
}
diff --git a/crawl-ref/source/monster.cc b/crawl-ref/source/monster.cc
index 4d574000e8..0781f1a4d3 100644
--- a/crawl-ref/source/monster.cc
+++ b/crawl-ref/source/monster.cc
@@ -2925,8 +2925,10 @@ int monsters::shield_block_penalty() const
return (4 * shield_blocks * shield_blocks);
}
-void monsters::shield_block_succeeded()
+void monsters::shield_block_succeeded(actor *attacker)
{
+ actor::shield_block_succeeded(attacker);
+
++shield_blocks;
}
diff --git a/crawl-ref/source/monster.h b/crawl-ref/source/monster.h
index 7fb7ea2109..051018c82e 100644
--- a/crawl-ref/source/monster.h
+++ b/crawl-ref/source/monster.h
@@ -388,7 +388,7 @@ public:
int shield_bonus() const;
int shield_block_penalty() const;
- void shield_block_succeeded();
+ void shield_block_succeeded(actor *foe);
int shield_bypass_ability(int tohit) const;
actor_type atype() const { return ACT_MONSTER; }
diff --git a/crawl-ref/source/player.cc b/crawl-ref/source/player.cc
index 3b1516551a..aeff736ad1 100644
--- a/crawl-ref/source/player.cc
+++ b/crawl-ref/source/player.cc
@@ -6130,8 +6130,10 @@ int player::shield_bypass_ability(int tohit) const
return (15 + tohit / 2);
}
-void player::shield_block_succeeded()
+void player::shield_block_succeeded(actor *foe)
{
+ actor::shield_block_succeeded(foe);
+
shield_blocks++;
if (coinflip())
exercise(SK_SHIELDS, 1);
diff --git a/crawl-ref/source/player.h b/crawl-ref/source/player.h
index b705e889d4..e060e3fd14 100644
--- a/crawl-ref/source/player.h
+++ b/crawl-ref/source/player.h
@@ -495,7 +495,7 @@ public:
int shield_block_penalty() const;
int shield_bypass_ability(int tohit) const;
- void shield_block_succeeded();
+ void shield_block_succeeded(actor *foe);
bool wearing_light_armour(bool with_skill = false) const;
void exercise(skill_type skill, int qty);