diff options
Diffstat (limited to 'crawl-ref/source')
-rw-r--r-- | crawl-ref/source/externs.h | 2 | ||||
-rw-r--r-- | crawl-ref/source/mgrow.cc | 14 | ||||
-rw-r--r-- | crawl-ref/source/monstuff.cc | 11 | ||||
-rw-r--r-- | crawl-ref/source/religion.cc | 29 | ||||
-rw-r--r-- | crawl-ref/source/religion.h | 3 |
5 files changed, 42 insertions, 17 deletions
diff --git a/crawl-ref/source/externs.h b/crawl-ref/source/externs.h index a24a2f4b5c..7c510225d3 100644 --- a/crawl-ref/source/externs.h +++ b/crawl-ref/source/externs.h @@ -1064,7 +1064,7 @@ public: void lose_energy(energy_use_type et); void scale_hp(int num, int den); - void gain_exp(int exp); + bool gain_exp(int exp); void add_enchantment_effect(const mon_enchant &me, bool quiet = false); void remove_enchantment_effect(const mon_enchant &me, bool quiet = false); diff --git a/crawl-ref/source/mgrow.cc b/crawl-ref/source/mgrow.cc index 57b3edc0cf..aacacfe3d1 100644 --- a/crawl-ref/source/mgrow.cc +++ b/crawl-ref/source/mgrow.cc @@ -181,22 +181,22 @@ void monsters::init_experience() experience = mexplevs[std::min(hit_dice, MAX_MONS_HD)]; } -void monsters::gain_exp(int exp) +bool monsters::gain_exp(int exp) { if (!alive()) - return; + return false; init_experience(); if (hit_dice >= MAX_MONS_HD) - return; + return false; // Only natural monsters can level-up. if (holiness() != MH_NATURAL) - return; - + return false; + // Avoid wrap-around. if (experience + exp < experience) - return; + return false; experience += exp; @@ -218,4 +218,6 @@ void monsters::gain_exp(int exp) if (hit_dice < MAX_MONS_HD && experience >= mexplevs[hit_dice + 1]) experience = (mexplevs[hit_dice] + mexplevs[hit_dice + 1]) / 2; + + return (levels_gained > 0); } diff --git a/crawl-ref/source/monstuff.cc b/crawl-ref/source/monstuff.cc index 9bcb773088..4b9058d11a 100644 --- a/crawl-ref/source/monstuff.cc +++ b/crawl-ref/source/monstuff.cc @@ -406,7 +406,16 @@ static void _give_monster_experience( monsters *victim, if ((!victim_was_born_friendly || !mons_friendly(mons)) && !mons_aligned(killer_index, monster_index(victim))) { - mons->gain_exp(experience); + if (mons->gain_exp(experience)) + { + // Blessings for followers. + if (you.religion == GOD_BEOGH + && you.piety >= piety_breakpoint(2) + && random2(you.piety) >= piety_breakpoint(0)) + { + bless_follower(GOD_BEOGH, is_orcish_follower, mons); + } + } } } diff --git a/crawl-ref/source/religion.cc b/crawl-ref/source/religion.cc index bff047e0d2..b15bf4f23d 100644 --- a/crawl-ref/source/religion.cc +++ b/crawl-ref/source/religion.cc @@ -827,19 +827,32 @@ static bool blessing_healing(monsters *mon, bool extra) return heal_monster(mon, mon->max_hit_points, extra); } +// Bless a follower within sight of the player. void bless_follower(god_type god, - bool (*suitable)(const monsters* mon)) + bool (*suitable)(const monsters* mon), + monsters* follower) { + // If there are no monsters (including followers) in sight, get out. if (!there_are_monsters_nearby()) return; - int monster = choose_random_nearby_monster(0, suitable); + monsters *mon; - if (monster == NON_MONSTER) - return; + // If a follower was specified, and it's suitable, pick it. + if (follower && suitable(follower)) + mon = follower; + // Otherwise, pick a random follower. + else + { + int monster = choose_random_nearby_monster(0, suitable); + + if (monster == NON_MONSTER) + return; + + mon = &menv[monster]; + } - monsters* mon = &menv[monster]; - const char *blessed = mon->name(DESC_NOCAP_A).c_str(); + const char *blessed = mon->name(DESC_NOCAP_THE).c_str(); const char *result; int chance = random2(20); @@ -906,8 +919,8 @@ void bless_follower(god_type god, } blessing_done: - mprf(MSGCH_GOD, "%s blesses %s with %s.", god_name(god).c_str(), - blessed, result); + snprintf(info, INFO_SIZE, " blesses %s with %s.", blessed, result); + simple_god_message(info); } static void do_god_gift(bool prayed_for) diff --git a/crawl-ref/source/religion.h b/crawl-ref/source/religion.h index b21a525f90..765bdec408 100644 --- a/crawl-ref/source/religion.h +++ b/crawl-ref/source/religion.h @@ -72,7 +72,8 @@ bool trog_burn_books(); bool tso_stab_safe_monster(const actor *act); void bless_follower(god_type god, - bool (*suitable)(const monsters* mon)); + bool (*suitable)(const monsters* mon), + monsters* follower = NULL); bool is_orcish_follower(const monsters* mon); bool god_hates_attacking_friend(god_type god, const actor *fr); |