From 018bfc6f736dd95dbf3315e5a2ba71204555ffdc Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Thu, 10 Mar 2016 18:41:54 +0100 Subject: Refactor use_symbiotic_power() to use std::vector --- src/cmd5.cc | 76 +++++++++++++++++++++++++++++++++------------------------ src/cmd5.hpp | 3 +++ src/cmd7.cc | 6 ++--- src/defines.h | 5 ++++ src/monster3.cc | 37 +++++----------------------- src/tables.hpp | 2 +- 6 files changed, 61 insertions(+), 68 deletions(-) (limited to 'src') 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 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 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 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 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 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 @@ -124,6 +124,11 @@ #define MAX_SPELLS 100 #define MAX_RUNES 100 +/* + * Total number of monster powers + */ +#define MONSTER_POWERS_MAX 96 + /* * Total number of stores (see "store.c", etc) */ 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 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]; -- cgit v1.2.3