summaryrefslogtreecommitdiff
path: root/src/cmd5.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/cmd5.cc')
-rw-r--r--src/cmd5.cc79
1 files changed, 49 insertions, 30 deletions
diff --git a/src/cmd5.cc b/src/cmd5.cc
index 120e2e96..a7589e6c 100644
--- a/src/cmd5.cc
+++ b/src/cmd5.cc
@@ -660,9 +660,20 @@ std::vector<int> extract_monster_powers(monster_race const *r_ptr, bool great)
}
/**
+ * Calculate mana required for a given monster power.
+ */
+static int calc_monster_spell_mana(monster_power const *mp_ptr)
+{
+ int mana = mp_ptr->mana / 10;
+ if (mana > p_ptr->msp) mana = p_ptr->msp;
+ if (!mana) mana = 1;
+ return mana;
+}
+
+/**
* Choose a monster power
*/
-static std::tuple<int, int> choose_monster_power(monster_race const *r_ptr, bool great, bool no_cost)
+static std::tuple<int, int> choose_monster_power(monster_race const *r_ptr, bool great, bool symbiosis)
{
/* Extract available monster powers */
std::vector<int> powers = extract_monster_powers(r_ptr, great);
@@ -682,7 +693,7 @@ static std::tuple<int, int> choose_monster_power(monster_race const *r_ptr, bool
char out_val[160];
strnfmt(out_val, 78,
"(Powers a-%c, ESC=exit) Use which power of your %s? ",
- label, (no_cost ? "symbiote" : "body"));
+ label, (symbiosis ? "symbiote" : "body"));
/* Save the screen */
character_icky = TRUE;
@@ -706,16 +717,12 @@ static std::tuple<int, int> choose_monster_power(monster_race const *r_ptr, bool
while (ctr < num)
{
monster_power *mp_ptr = &monster_powers[powers[ctr]];
- int mana = mp_ptr->mana / 10;
-
- if (mana > p_ptr->msp) mana = p_ptr->msp;
-
- if (!mana) mana = 1;
label = (ctr < 26) ? I2A(ctr) : I2D(ctr - 26);
- if (!no_cost)
+ if (!symbiosis)
{
+ int mana = calc_monster_spell_mana(mp_ptr);
strnfmt(dummy, 80, " %c) %2d %s",
label, mana, mp_ptr->name);
}
@@ -1874,15 +1881,13 @@ static void apply_monster_power(monster_race const *r_ptr, int power)
/*
- * Use a power of the monster in symbiosis
+ * Use a monster power and call the given callback.
*/
-int use_symbiotic_power(int r_idx, bool great, bool no_cost)
+static int use_monster_power_aux(monster_race const *r_ptr, bool great, bool symbiosis, std::function<void(monster_power const *power)> f)
{
- monster_race const *r_ptr = &r_info[r_idx];
-
int power;
int num;
- std::tie(power, num) = choose_monster_power(r_ptr, great, no_cost);
+ std::tie(power, num) = choose_monster_power(r_ptr, great, symbiosis);
// Early exit?
if (power == 0) {
@@ -1894,25 +1899,11 @@ int use_symbiotic_power(int r_idx, bool great, bool no_cost)
return -1;
}
- /* Apply the effect */
+ // Apply the effect
apply_monster_power(r_ptr, power);
- /* Take some SP */
- if (!no_cost)
- {
- int chance = (monster_powers[power].mana + r_ptr->level);
- int pchance = adj_str_wgt[p_ptr->stat_ind[A_WIS]] / 2 + get_skill(SKILL_POSSESSION);
-
- if (rand_int(chance) >= pchance)
- {
- int m = monster_powers[power].mana / 10;
-
- if (m > p_ptr->msp) m = p_ptr->msp;
- if (!m) m = 1;
-
- p_ptr->csp -= m;
- }
- }
+ // Post-processing
+ f(&monster_powers[power]);
/* Redraw mana */
p_ptr->redraw |= (PR_FRAME);
@@ -1923,6 +1914,34 @@ int use_symbiotic_power(int r_idx, bool great, bool no_cost)
return (num);
}
+/**
+ * Use a power of the monster in symbiosis
+ */
+int use_symbiotic_power(int r_idx, bool great)
+{
+ monster_race const *r_ptr = &r_info[r_idx];
+ return use_monster_power_aux(r_ptr, great, true, [](monster_power const *) {
+ // Don't need to do anything post-cast.
+ });
+}
+
+/**
+ * Use a power of a possessed body.
+ */
+void use_monster_power(int r_idx, bool great)
+{
+ monster_race const *r_ptr = &r_info[r_idx];
+ use_monster_power_aux(r_ptr, great, false, [r_ptr](monster_power const *power) {
+ // Sometimes give a free cast.
+ int chance = (power->mana + r_ptr->level);
+ int pchance = adj_str_wgt[p_ptr->stat_ind[A_WIS]] / 2 + get_skill(SKILL_POSSESSION);
+ if (rand_int(chance) >= pchance)
+ {
+ p_ptr->csp -= calc_monster_spell_mana(power);
+ }
+ });
+}
+
/*
* Schooled magic
*/