diff options
author | Adam Borowski <kilobyte@angband.pl> | 2009-11-13 14:35:56 +0100 |
---|---|---|
committer | Adam Borowski <kilobyte@angband.pl> | 2009-11-13 19:51:51 +0100 |
commit | 14be7c5cfe60d0d9f1a00cd543c32482bdd544d4 (patch) | |
tree | b4fa79fbe2a0d21c9e2e05e890a43289a7378a60 /crawl-ref | |
parent | 5aba0fa49e632d5f61d3489263f36dde4a74dfad (diff) | |
download | crawl-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.cc | 18 | ||||
-rw-r--r-- | crawl-ref/source/actor.h | 2 | ||||
-rw-r--r-- | crawl-ref/source/beam.cc | 4 | ||||
-rw-r--r-- | crawl-ref/source/fight.cc | 2 | ||||
-rw-r--r-- | crawl-ref/source/monster.cc | 4 | ||||
-rw-r--r-- | crawl-ref/source/monster.h | 2 | ||||
-rw-r--r-- | crawl-ref/source/player.cc | 4 | ||||
-rw-r--r-- | crawl-ref/source/player.h | 2 |
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); |