summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorBardur Arantsson <bardur@scientician.net>2016-09-17 09:58:13 +0200
committerBardur Arantsson <bardur@scientician.net>2016-09-17 09:58:13 +0200
commit0a16384475488d682e33c8d55691e5d9417412ac (patch)
tree25b73201916e8b63cf012dbf0d8392af42e1d16f /src
parentf507d6fb86fe7cfaf4dec69afa36875a1a4aaae4 (diff)
Unify opval/oflags in player_* structs into player_level_flag
Diffstat (limited to 'src')
-rw-r--r--src/corrupt.cc18
-rw-r--r--src/files.cc23
-rw-r--r--src/init1.cc12
-rw-r--r--src/loadsave.cc10
-rw-r--r--src/player_class.hpp4
-rw-r--r--src/player_level_flag.hpp13
-rw-r--r--src/player_race.hpp4
-rw-r--r--src/player_race_mod.hpp4
-rw-r--r--src/xtra1.cc29
9 files changed, 73 insertions, 44 deletions
diff --git a/src/corrupt.cc b/src/corrupt.cc
index 64569264..8ad22ea9 100644
--- a/src/corrupt.cc
+++ b/src/corrupt.cc
@@ -106,15 +106,15 @@ static void player_gain_vampire()
}
/* Bonus/and .. not bonus :) */
- rmp_ptr->flags = rmp_ptr->flags | PR_HURT_LITE;
- rmp_ptr->oflags[2] = rmp_ptr->oflags[2]
- | TR_RES_POIS
- | TR_RES_NETHER
- | TR_RES_COLD
- | TR_RES_DARK
- | TR_HOLD_LIFE;
- rmp_ptr->oflags[2] = rmp_ptr->oflags[2]
- | TR_LITE1;
+ rmp_ptr->flags |= PR_HURT_LITE;
+ rmp_ptr->lflags[1].oflags |=
+ ( TR_RES_POIS
+ | TR_RES_NETHER
+ | TR_RES_COLD
+ | TR_RES_DARK
+ | TR_HOLD_LIFE
+ | TR_LITE1
+ );
}
/**
diff --git a/src/files.cc b/src/files.cc
index 4cd95447..ec569e73 100644
--- a/src/files.cc
+++ b/src/files.cc
@@ -1575,6 +1575,16 @@ static object_flag_set wield_monster_flags()
}
+template<class LF>
+static void apply_lflags(LF const &lflags, object_flag_set *f)
+{
+ for (int i = 1; i <= p_ptr->lev; i++)
+ {
+ (*f) |= lflags[i].oflags;
+ }
+}
+
+
/*
* Obtain the "flags" for the player as if he was an item
*/
@@ -1680,20 +1690,13 @@ object_flag_set player_flags()
}
/* Classes */
- for (int i = 1; i <= p_ptr->lev; i++)
- {
- f |= cp_ptr->oflags[i];
- }
+ apply_lflags(cp_ptr->lflags, &f);
/* Races */
if ((!p_ptr->mimic_form) && (!p_ptr->body_monster))
{
- for (int i = 1; i <= p_ptr->lev; i++)
- {
- f |= rp_ptr->oflags[i];
-
- f |= rmp_ptr->oflags[i];
- }
+ apply_lflags(rp_ptr->lflags, &f);
+ apply_lflags(rmp_ptr->lflags, &f);
}
else
{
diff --git a/src/init1.cc b/src/init1.cc
index de19105d..412dde11 100644
--- a/src/init1.cc
+++ b/src/init1.cc
@@ -1040,7 +1040,7 @@ errr init_player_info_txt(FILE *fp)
&s[0], &s[1])) return (1);
lev = s[0];
- rp_ptr->opval[lev] = s[1];
+ rp_ptr->lflags[lev].pval = s[1];
/* Next... */
continue;
@@ -1154,7 +1154,7 @@ errr init_player_info_txt(FILE *fp)
/* Process 'F' for "level Flags" (multiple lines) */
if ((buf[0] == 'R') && (buf[2] == 'F'))
{
- if (grab_object_flag(&rp_ptr->oflags[lev], buf + 4))
+ if (grab_object_flag(&rp_ptr->lflags[lev].oflags, buf + 4))
{
return (5);
}
@@ -1290,7 +1290,7 @@ errr init_player_info_txt(FILE *fp)
&s[0], &s[1])) return (1);
lev = s[0];
- rmp_ptr->opval[lev] = s[1];
+ rmp_ptr->lflags[lev].pval = s[1];
/* Next... */
continue;
@@ -1404,7 +1404,7 @@ errr init_player_info_txt(FILE *fp)
/* Process 'F' for "level Flags" (multiple lines) */
if ((buf[0] == 'S') && (buf[2] == 'F'))
{
- if (0 != grab_object_flag(&rmp_ptr->oflags[lev], buf + 4))
+ if (0 != grab_object_flag(&rmp_ptr->lflags[lev].oflags, buf + 4))
{
return (5);
}
@@ -1592,7 +1592,7 @@ errr init_player_info_txt(FILE *fp)
&s[0], &s[1])) return (1);
lev = s[0];
- c_ptr->opval[lev] = s[1];
+ c_ptr->lflags[lev].pval = s[1];
/* Next... */
continue;
@@ -1753,7 +1753,7 @@ errr init_player_info_txt(FILE *fp)
}
/* Parse this entry */
- if (0 != grab_object_flag(&c_ptr->oflags[lev], s))
+ if (0 != grab_object_flag(&c_ptr->lflags[lev].oflags, s))
{
return (5);
}
diff --git a/src/loadsave.cc b/src/loadsave.cc
index 1d3e8144..07e2c4fc 100644
--- a/src/loadsave.cc
+++ b/src/loadsave.cc
@@ -19,6 +19,7 @@
#include "object2.hpp"
#include "object_kind.hpp"
#include "player_class.hpp"
+#include "player_level_flag.hpp"
#include "player_race.hpp"
#include "player_race_mod.hpp"
#include "player_type.hpp"
@@ -277,6 +278,12 @@ static void do_skill_modifiers(skill_modifiers *skill_modifiers, ls_flag_t flag)
}
}
+static void do_player_level_flag(player_level_flag *lflag, ls_flag_t flag)
+{
+ do_flag_set(&lflag->oflags, flag);
+ do_s16b(&lflag->pval, flag);
+}
+
/*
* The special saved subrace
*/
@@ -335,8 +342,7 @@ static void do_subrace(ls_flag_t flag)
for (i = 0; i < PY_MAX_LEVEL + 1; i++)
{
- do_flag_set(&sr_ptr->oflags[i], flag);
- do_s16b(&sr_ptr->opval[i], flag);
+ do_player_level_flag(&sr_ptr->lflags[i], flag);
}
do_byte(&sr_ptr->g_attr, flag);
diff --git a/src/player_class.hpp b/src/player_class.hpp
index 53e712f9..e0f88008 100644
--- a/src/player_class.hpp
+++ b/src/player_class.hpp
@@ -5,6 +5,7 @@
#include "object_flag_set.hpp"
#include "object_proto.hpp"
#include "player_defs.hpp"
+#include "player_level_flag.hpp"
#include "player_race_flag_set.hpp"
#include "player_spec.hpp"
#include "skill_modifiers.hpp"
@@ -42,8 +43,7 @@ struct player_class
char body_parts[BODY_MAX] { }; /* To help to decide what to use when body changing */
- std::array<object_flag_set, PY_MAX_LEVEL + 1> oflags;
- s16b opval[PY_MAX_LEVEL + 1] { };
+ std::array<player_level_flag, PY_MAX_LEVEL+1> lflags;
struct skill_modifiers skill_modifiers;
diff --git a/src/player_level_flag.hpp b/src/player_level_flag.hpp
new file mode 100644
index 00000000..fe4c862c
--- /dev/null
+++ b/src/player_level_flag.hpp
@@ -0,0 +1,13 @@
+#pragma once
+
+#include "h-basic.h"
+#include "object_flag_set.hpp"
+#include "player_defs.hpp"
+
+struct player_level_flag {
+
+ object_flag_set oflags;
+
+ s16b pval = 0;
+
+};
diff --git a/src/player_race.hpp b/src/player_race.hpp
index 203999ad..844eeb75 100644
--- a/src/player_race.hpp
+++ b/src/player_race.hpp
@@ -5,6 +5,7 @@
#include "object_flag_set.hpp"
#include "object_proto.hpp"
#include "player_defs.hpp"
+#include "player_level_flag.hpp"
#include "player_race_ability_type.hpp"
#include "player_race_flag_set.hpp"
#include "skills_defs.hpp"
@@ -40,8 +41,7 @@ struct player_race
player_race_flag_set flags;
- std::array<object_flag_set, PY_MAX_LEVEL + 1> oflags;
- s16b opval[PY_MAX_LEVEL + 1] { };
+ std::array<player_level_flag, PY_MAX_LEVEL+1> lflags;
struct skill_modifiers skill_modifiers;
diff --git a/src/player_race_mod.hpp b/src/player_race_mod.hpp
index bf203cc6..40264ba3 100644
--- a/src/player_race_mod.hpp
+++ b/src/player_race_mod.hpp
@@ -5,6 +5,7 @@
#include "object_flag_set.hpp"
#include "object_proto.hpp"
#include "player_defs.hpp"
+#include "player_level_flag.hpp"
#include "player_race_ability_type.hpp"
#include "player_race_flag_set.hpp"
#include "skill_modifiers.hpp"
@@ -41,8 +42,7 @@ struct player_race_mod
player_race_flag_set flags;
- std::array<object_flag_set, PY_MAX_LEVEL + 1> oflags;
- s16b opval[PY_MAX_LEVEL + 1] { };
+ std::array<player_level_flag, PY_MAX_LEVEL+1> lflags;
byte g_attr = 0; /* Overlay graphic attribute */
char g_char = '\0'; /* Overlay graphic character */
diff --git a/src/xtra1.cc b/src/xtra1.cc
index a816efb1..066bd0fb 100644
--- a/src/xtra1.cc
+++ b/src/xtra1.cc
@@ -2727,6 +2727,18 @@ void apply_flags(object_flag_set const &f, s16b pval, s16b tval, s16b to_h, s16b
}
+/**
+ * Apply player level flags
+ */
+template <class LF>
+static void apply_lflags(LF const &lflags)
+{
+ for (int i = 1; i <= p_ptr->lev; i++)
+ {
+ apply_flags(lflags[i].oflags, lflags[i].pval, 0, 0, 0, 0);
+ }
+}
+
/**
* Are barehand fighter's hands empty?
@@ -2978,10 +2990,8 @@ void calc_bonuses(bool_ silent)
/* The powers gived by the wielded monster */
calc_wield_monster();
- for (i = 1; i <= p_ptr->lev; i++)
- {
- apply_flags(cp_ptr->oflags[i], cp_ptr->opval[i], 0, 0, 0, 0);
- }
+ /* Apply all the level-dependent class flags */
+ apply_lflags(cp_ptr->lflags);
if (p_ptr->melee_style == SKILL_HAND)
{
@@ -3022,14 +3032,11 @@ void calc_bonuses(bool_ silent)
/***** Races ****/
if ((!p_ptr->mimic_form) && (!p_ptr->body_monster))
{
- int i;
-
- for (i = 1; i <= p_ptr->lev; i++)
- {
- apply_flags(rp_ptr->oflags[i], rp_ptr->opval[i], 0, 0, 0, 0);
- apply_flags(rmp_ptr->oflags[i], rmp_ptr->opval[i], 0, 0, 0, 0);
- }
+ /* Apply level-dependent flags from race/sub-race */
+ apply_lflags(rp_ptr->lflags);
+ apply_lflags(rmp_ptr->lflags);
+ /* Is the player's race hurt by light? */
if (race_flags_p(PR_HURT_LITE))
p_ptr->sensible_lite = TRUE;
}