summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/cmd5.cc76
-rw-r--r--src/cmd5.hpp3
-rw-r--r--src/cmd7.cc6
-rw-r--r--src/defines.h5
-rw-r--r--src/monster3.cc37
-rw-r--r--src/tables.hpp2
6 files changed, 61 insertions, 68 deletions
diff --git a/src/cmd5.cc b/src/cmd5.cc
index 9870f116..9ca22adf 100644
--- a/src/cmd5.cc
+++ b/src/cmd5.cc
@@ -616,68 +616,80 @@ cptr symbiote_name(bool_ capitalize)
}
/*
- * Use a power of the monster in symbiosis
+ * Extract powers
*/
-int use_symbiotic_power(int r_idx, bool_ great, bool_ only_number, bool_ no_cost)
+std::vector<int> extract_monster_powers(monster_race const *r_ptr, bool great)
{
- int power = -1;
-
- int num = 0, dir = 0 , i;
-
- int powers[96];
-
- bool_ flag;
-
- int ask, plev = p_ptr->lev;
-
- char choice;
-
- char out_val[160];
-
- monster_race *r_ptr = &r_info[r_idx];
-
- int rlev = ((r_ptr->level >= 1) ? r_ptr->level : 1);
-
- int x = p_ptr->px, y = p_ptr->py, k;
-
- int rad;
-
- int label;
-
+ std::vector<int> powers;
+ powers.reserve(MONSTER_POWERS_MAX);
/* List the monster powers -- RF4_* */
- for (i = 0; i < 32; i++)
+ for (std::size_t i = 0; i < 32; i++)
{
if (r_ptr->flags4 & BIT(i))
{
if (monster_powers[i].great && (!great)) continue;
if (!monster_powers[i].power) continue;
- powers[num++] = i;
+ powers.push_back(i);
}
}
/* List the monster powers -- RF5_* */
- for (i = 0; i < 32; i++)
+ for (std::size_t i = 0; i < 32; i++)
{
if (r_ptr->flags5 & BIT(i))
{
if (monster_powers[i + 32].great && (!great)) continue;
if (!monster_powers[i + 32].power) continue;
- powers[num++] = i + 32;
+ powers.push_back(i + 32);
}
}
/* List the monster powers -- RF6_* */
- for (i = 0; i < 32; i++)
+ for (std::size_t i = 0; i < 32; i++)
{
if (r_ptr->flags6 & BIT(i))
{
if (monster_powers[i + 64].great && (!great)) continue;
if (!monster_powers[i + 64].power) continue;
- powers[num++] = i + 64;
+ powers.push_back(i + 64);
}
}
+ return powers;
+}
+
+/*
+ * Use a power of the monster in symbiosis
+ */
+int use_symbiotic_power(int r_idx, bool_ great, bool_ only_number, bool_ no_cost)
+{
+ int power = -1;
+
+ int dir = 0 , i;
+
+ bool_ flag;
+
+ int ask, plev = p_ptr->lev;
+
+ char choice;
+
+ char out_val[160];
+
+ monster_race *r_ptr = &r_info[r_idx];
+
+ int const rlev = ((r_ptr->level >= 1) ? r_ptr->level : 1);
+
+ int x = p_ptr->px, y = p_ptr->py, k;
+
+ int rad;
+
+ int label;
+
+ /* Extract available monster powers */
+ std::vector<int> powers = extract_monster_powers(r_ptr, great);
+ int const num = powers.size(); // Avoid signed/unsigned warnings
+
if (!num)
{
msg_print("You have no powers you can use.");
diff --git a/src/cmd5.hpp b/src/cmd5.hpp
index 1b3b062a..892b57f4 100644
--- a/src/cmd5.hpp
+++ b/src/cmd5.hpp
@@ -2,6 +2,8 @@
#include "h-basic.h"
#include "object_type_fwd.hpp"
+#include "monster_race_fwd.hpp"
+#include <vector>
extern bool_ is_magestaff(void);
extern void do_cmd_browse_aux(object_type *o_ptr);
@@ -14,3 +16,4 @@ extern bool_ is_ok_spell(s32b spell_idx, s32b pval);
extern s32b get_school_spell(cptr do_what, s16b force_book);
extern void do_cmd_copy_spell(void);
extern void cast_school_spell(void);
+extern std::vector<int> extract_monster_powers(monster_race const *r_ptr, bool great);
diff --git a/src/cmd7.cc b/src/cmd7.cc
index 2317f8b9..aa053a48 100644
--- a/src/cmd7.cc
+++ b/src/cmd7.cc
@@ -1831,8 +1831,6 @@ void do_cmd_possessor()
if (ext == 1)
{
- bool_ use_great = FALSE;
-
if (p_ptr->disembodied)
{
msg_print("You don't currently own a body to use.");
@@ -1840,9 +1838,9 @@ void do_cmd_possessor()
}
/* Do we have access to all the powers ? */
- if (get_skill_scale(SKILL_POSSESSION, 100) >= r_info[p_ptr->body_monster].level)
- use_great = TRUE;
+ bool_ use_great = (get_skill_scale(SKILL_POSSESSION, 100) >= r_info[p_ptr->body_monster].level);
+ /* Select power */
use_symbiotic_power(p_ptr->body_monster, use_great, FALSE, FALSE);
if (p_ptr->csp < 0)
diff --git a/src/defines.h b/src/defines.h
index 5309023f..224f5bd9 100644
--- a/src/defines.h
+++ b/src/defines.h
@@ -125,6 +125,11 @@
#define MAX_RUNES 100
/*
+ * Total number of monster powers
+ */
+#define MONSTER_POWERS_MAX 96
+
+/*
* Total number of stores (see "store.c", etc)
*/
#define STORE_GENERAL 0
diff --git a/src/monster3.cc b/src/monster3.cc
index 0d26538c..75227699 100644
--- a/src/monster3.cc
+++ b/src/monster3.cc
@@ -10,6 +10,7 @@
#include "cave_type.hpp"
#include "cmd2.hpp"
+#include "cmd5.hpp"
#include "gods.hpp"
#include "melee2.hpp"
#include "monster2.hpp"
@@ -418,8 +419,7 @@ bool_ do_control_drop(void)
bool_ do_control_magic(void)
{
int power = -1;
- int num = 0, i;
- int powers[96];
+ int i;
bool_ flag, redraw;
int ask;
char choice;
@@ -437,36 +437,11 @@ bool_ do_control_magic(void)
return TRUE;
}
- /* List the monster powers -- RF4_* */
- for (i = 0; i < 32; i++)
- {
- if (r_ptr->flags4 & BIT(i))
- {
- if (!monster_powers[i].power) continue;
- powers[num++] = i;
- }
- }
-
- /* List the monster powers -- RF5_* */
- for (i = 0; i < 32; i++)
- {
- if (r_ptr->flags5 & BIT(i))
- {
- if (!monster_powers[i + 32].power) continue;
- powers[num++] = i + 32;
- }
- }
-
- /* List the monster powers -- RF6_* */
- for (i = 0; i < 32; i++)
- {
- if (r_ptr->flags6 & BIT(i))
- {
- if (!monster_powers[i + 64].power) continue;
- powers[num++] = i + 64;
- }
- }
+ /* Extract available monster powers */
+ std::vector<int> powers = extract_monster_powers(r_ptr, true);
+ int const num = powers.size(); // Avoid signed/unsigned warnings
+ /* Are any powers available? */
if (!num)
{
msg_print("You have no powers you can use.");
diff --git a/src/tables.hpp b/src/tables.hpp
index aee776bd..c643d97e 100644
--- a/src/tables.hpp
+++ b/src/tables.hpp
@@ -67,7 +67,7 @@ extern cptr sense_desc[];
extern flags_group flags_groups[MAX_FLAG_GROUP];
extern power_type powers_type[POWER_MAX];
extern cptr artifact_names_list;
-extern monster_power monster_powers[96];
+extern monster_power monster_powers[MONSTER_POWERS_MAX];
extern tval_desc tval_descs[];
extern between_exit between_exits[MAX_BETWEEN_EXITS];
extern int month_day[9];