From 2c8b8579faf729b9cf21b8b2d827f0e482570bd3 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Tue, 2 May 2017 19:20:57 +0200 Subject: Move random_artifacts to Game struct --- src/birth.cc | 40 ++++++++++++++++++---------------------- src/cmd6.cc | 2 +- src/game.hpp | 6 ++++++ src/loadsave.cc | 35 ++++++++++++----------------------- src/monster2.cc | 6 +++--- src/object1.cc | 3 +++ src/object2.cc | 25 +++++++++++++------------ src/q_rand.cc | 2 +- src/random_artifact.hpp | 6 ++++-- src/variable.cc | 2 -- src/variable.hpp | 2 -- src/wizard2.cc | 1 + 12 files changed, 62 insertions(+), 68 deletions(-) diff --git a/src/birth.cc b/src/birth.cc index 36f319d6..2f56ec28 100644 --- a/src/birth.cc +++ b/src/birth.cc @@ -56,6 +56,7 @@ #include "xtra2.hpp" #include "z-rand.hpp" +#include #include #include #include @@ -465,33 +466,28 @@ static void get_extra() */ static errr init_randart() { - int i; - - long cost; - - random_artifact* ra_ptr; - char buf[80]; - - for (i = 0; i < MAX_RANDARTS; i++) + for (int i = 0; i < MAX_RANDARTS; i++) { - ra_ptr = &random_artifacts[i]; - - strcpy(ra_ptr->name_short, - get_line("rart_s.txt", ANGBAND_DIR_FILE, buf, i)); - strcpy(ra_ptr->name_full, - get_line("rart_f.txt", ANGBAND_DIR_FILE, buf, i)); - - ra_ptr->attr = randint(15); - ra_ptr->activation = rand_int(MAX_T_ACT); - ra_ptr->generated = FALSE; - - cost = randnor(0, 250); + // Generate a 'cost' + auto cost = randnor(0, 250); + if (cost < 0) + { + cost = 0; + } - if (cost < 0) cost = 0; + // Generate the random artifact + random_artifact ra; + ra.name_short = get_line("rart_s.txt", ANGBAND_DIR_FILE, buf, i); + ra.name_full = get_line("rart_f.txt", ANGBAND_DIR_FILE, buf, i); + ra.attr = randint(15); + ra.activation = rand_int(MAX_T_ACT); + ra.generated = FALSE; + ra.cost = cost; - ra_ptr->cost = cost; + // Push + game->random_artifacts.push_back(ra); } return 0; diff --git a/src/cmd6.cc b/src/cmd6.cc index d609298d..e36f0cb6 100644 --- a/src/cmd6.cc +++ b/src/cmd6.cc @@ -4839,7 +4839,7 @@ void do_cmd_activate() { if (o_ptr->tval == TV_RANDART) { - lev = random_artifacts[o_ptr->sval].level; + lev = game->random_artifacts[o_ptr->sval].level; } else { diff --git a/src/game.hpp b/src/game.hpp index 20ca0f86..631e16b1 100644 --- a/src/game.hpp +++ b/src/game.hpp @@ -7,6 +7,7 @@ #include "grid.hpp" #include "h-basic.h" #include "player_defs.hpp" +#include "random_artifact.hpp" #include "skill_type.hpp" #include "wilderness_map.hpp" @@ -40,6 +41,11 @@ struct Game { */ grid wilderness; + /** + * Random artifacts + */ + std::vector random_artifacts; + /** * Player's un-adjusted HP at every level. * Stored to avoid shenanigans with draininging levels diff --git a/src/loadsave.cc b/src/loadsave.cc index 86c67956..ef554f19 100644 --- a/src/loadsave.cc +++ b/src/loadsave.cc @@ -2266,31 +2266,20 @@ static bool do_wilderness(ls_flag_t flag) return true; } +static void do_randart(random_artifact *ra_ptr, ls_flag_t flag) +{ + do_std_string(ra_ptr->name_full, flag); + do_std_string(ra_ptr->name_short, flag); + do_byte(&ra_ptr->level, flag); + do_byte(&ra_ptr->attr, flag); + do_u32b(&ra_ptr->cost, flag); + do_byte(&ra_ptr->activation, flag); + do_byte(&ra_ptr->generated, flag); +} + static bool do_randarts(ls_flag_t flag) { - u16b n_randarts = MAX_RANDARTS; - - do_u16b(&n_randarts, flag); - - if ((flag == ls_flag_t::LOAD) && (n_randarts > MAX_RANDARTS)) - { - note("Too many random artifacts!"); - return false; - } - - for (std::size_t i = 0; i < n_randarts; i++) - { - random_artifact *ra_ptr = &random_artifacts[i]; - - do_string(ra_ptr->name_full, 80, flag); - do_string(ra_ptr->name_short, 80, flag); - do_byte(&ra_ptr->level, flag); - do_byte(&ra_ptr->attr, flag); - do_u32b(&ra_ptr->cost, flag); - do_byte(&ra_ptr->activation, flag); - do_byte(&ra_ptr->generated, flag); - } - + do_vector(flag, game->random_artifacts, do_randart); return true; } diff --git a/src/monster2.cc b/src/monster2.cc index ab60a9e3..8e866796 100644 --- a/src/monster2.cc +++ b/src/monster2.cc @@ -432,6 +432,7 @@ void delete_monster_idx(int i) { auto &k_info = game->edit_data.k_info; auto &a_info = game->edit_data.a_info; + auto &random_artifacts = game->random_artifacts; /* Get location */ monster_type *m_ptr = &m_list[i]; @@ -1892,8 +1893,7 @@ void monster_carry(monster_type *m_ptr, int m_idx, object_type *q_ptr) { auto &k_info = game->edit_data.k_info; auto &a_info = game->edit_data.a_info; - - object_type *o_ptr; + auto &random_artifacts = game->random_artifacts; /* Get new object */ int o_idx = o_pop(); @@ -1901,7 +1901,7 @@ void monster_carry(monster_type *m_ptr, int m_idx, object_type *q_ptr) if (o_idx) { /* Get the item */ - o_ptr = &o_list[o_idx]; + object_type *o_ptr = &o_list[o_idx]; /* Structure copy */ object_copy(o_ptr, q_ptr); diff --git a/src/object1.cc b/src/object1.cc index d10f3042..34c22a4a 100644 --- a/src/object1.cc +++ b/src/object1.cc @@ -1022,6 +1022,7 @@ static std::string object_desc_aux(object_type const *o_ptr, int pref, int mode) auto const &k_info = game->edit_data.k_info; auto const &a_info = game->edit_data.a_info; auto const &e_info = game->edit_data.e_info; + auto const &random_artifacts = game->random_artifacts; static auto const TR_PVAL_MASK = compute_pval_mask(); bool_ hack_name = FALSE; @@ -6125,6 +6126,7 @@ static void apply_flags_set(s16b a_idx, s16b set_idx, object_flag_set *f) byte object_attr(object_type const *o_ptr) { auto const &k_info = game->edit_data.k_info; + auto const &random_artifacts = game->random_artifacts; if (o_ptr->tval == TV_RANDART) { @@ -6143,6 +6145,7 @@ byte object_attr(object_type const *o_ptr) byte object_attr_default(object_type *o_ptr) { auto const &k_info = game->edit_data.k_info; + auto const &random_artifacts = game->random_artifacts; if (o_ptr->tval == TV_RANDART) { diff --git a/src/object2.cc b/src/object2.cc index a9f0f7ce..32ab6de1 100644 --- a/src/object2.cc +++ b/src/object2.cc @@ -400,7 +400,7 @@ void wipe_o_list() /* Mega-Hack -- Preserve the artifact */ if (o_ptr->tval == TV_RANDART) { - random_artifacts[o_ptr->sval].generated = FALSE; + game->random_artifacts[o_ptr->sval].generated = FALSE; } else if (k_info[o_ptr->k_idx].flags & TR_NORM_ART) { @@ -1098,7 +1098,7 @@ s32b object_value_real(object_type const *o_ptr) if (o_ptr->tval == TV_RANDART) { - return random_artifacts[o_ptr->sval].cost; + return game->random_artifacts[o_ptr->sval].cost; } /* Hack -- "worthless" items */ @@ -1998,20 +1998,21 @@ s16b m_bonus(int max, int level) */ static void finalize_randart(object_type* o_ptr, int lev) { - int r; - int i = 0; - bool_ flag = TRUE; + auto &random_artifacts = game->random_artifacts; /* Paranoia */ - if (o_ptr->tval != TV_RANDART) return; + if (o_ptr->tval != TV_RANDART) + { + return; + } - while (flag) + for (int i = 0; ; i++) { - r = rand_int(MAX_RANDARTS); + auto const r = rand_int(MAX_RANDARTS); if (!(random_artifacts[r].generated) || i > 2000) { - random_artifact* ra_ptr = &random_artifacts[r]; + auto ra_ptr = &random_artifacts[r]; o_ptr->sval = r; o_ptr->pval2 = ra_ptr->activation; @@ -2019,10 +2020,8 @@ static void finalize_randart(object_type* o_ptr, int lev) ra_ptr->level = lev; ra_ptr->generated = TRUE; - flag = FALSE; + return; } - - i++; } } @@ -4751,6 +4750,7 @@ void place_object(int y, int x, bool_ good, bool_ great, int where) auto const &d_info = game->edit_data.d_info; auto &k_info = game->edit_data.k_info; auto &a_info = game->edit_data.a_info; + auto &random_artifacts = game->random_artifacts; s16b o_idx; @@ -4987,6 +4987,7 @@ s16b drop_near(object_type *j_ptr, int chance, int y, int x) auto const &f_info = game->edit_data.f_info; auto &k_info = game->edit_data.k_info; auto &a_info = game->edit_data.a_info; + auto &random_artifacts = game->random_artifacts; int i, k, d, s; diff --git a/src/q_rand.cc b/src/q_rand.cc index 177ba7a9..e3860dd2 100644 --- a/src/q_rand.cc +++ b/src/q_rand.cc @@ -270,7 +270,7 @@ static void do_get_new_obj(int y, int x) /* Mega-Hack -- Preserve the artifact */ if (o_ptr->tval == TV_RANDART) { - random_artifacts[o_ptr->sval].generated = FALSE; + game->random_artifacts[o_ptr->sval].generated = FALSE; } else if (k_info[o_ptr->k_idx].flags & TR_NORM_ART) { diff --git a/src/random_artifact.hpp b/src/random_artifact.hpp index a3fc1c66..618f1102 100644 --- a/src/random_artifact.hpp +++ b/src/random_artifact.hpp @@ -2,13 +2,15 @@ #include "h-basic.h" +#include + /** * Random artifact descriptor. */ struct random_artifact { - char name_full[80]; /* Full name for the artifact */ - char name_short[80]; /* Un-Id'd name */ + std::string name_full; /* Full name for the artifact */ + std::string name_short; /* Un-Id'd name */ byte level; /* Level of the artifact */ byte attr; /* Color that is used on the screen */ u32b cost; /* Object's value */ diff --git a/src/variable.cc b/src/variable.cc index 3b81a51a..7aae4187 100644 --- a/src/variable.cc +++ b/src/variable.cc @@ -558,8 +558,6 @@ bool_ carried_monster_hit = FALSE; /* * Random artifacts. */ -random_artifact random_artifacts[MAX_RANDARTS]; -/* These three used to be constants but now are set by modules */ s32b RANDART_WEAPON; s32b RANDART_ARMOR; s32b RANDART_JEWEL; diff --git a/src/variable.hpp b/src/variable.hpp index 38db36b4..3cb54d3a 100644 --- a/src/variable.hpp +++ b/src/variable.hpp @@ -17,7 +17,6 @@ #include "player_race_mod_fwd.hpp" #include "player_spec_fwd.hpp" #include "player_type_fwd.hpp" -#include "random_artifact.hpp" #include "random_quest.hpp" #include "school_type.hpp" #include "skill_modifiers_fwd.hpp" @@ -161,7 +160,6 @@ extern bool_ ambush_flag; extern bool_ fate_flag; extern s16b no_breeds; extern bool_ carried_monster_hit; -extern random_artifact random_artifacts[MAX_RANDARTS]; extern s32b RANDART_WEAPON; extern s32b RANDART_ARMOR; extern s32b RANDART_JEWEL; diff --git a/src/wizard2.cc b/src/wizard2.cc index cf7c699d..890c6fbe 100644 --- a/src/wizard2.cc +++ b/src/wizard2.cc @@ -825,6 +825,7 @@ static void wiz_reroll_item(object_type *o_ptr) static void wiz_statistics(object_type *o_ptr) { auto &a_info = game->edit_data.a_info; + auto &random_artifacts = game->random_artifacts; long i, matches, better, worse, other; -- cgit v1.2.3