summaryrefslogtreecommitdiff
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
commit2fa1a5e82a4e13f16ea6001c11d2452bac036d20 (patch)
tree281abb2809be83f8710d2aacab9ea342923455a7
parentab69f8a32062d0ae44ba7af0b4e357f6a77169ea (diff)
Unify skill_* fields into skill_modifier{,s}
-rw-r--r--src/init1.cc120
-rw-r--r--src/init2.cc1
-rw-r--r--src/loadsave.cc24
-rw-r--r--src/player_class.hpp6
-rw-r--r--src/player_race.hpp6
-rw-r--r--src/player_race_mod.hpp6
-rw-r--r--src/player_spec.hpp6
-rw-r--r--src/skill_modifier.hpp12
-rw-r--r--src/skill_modifiers.hpp11
-rw-r--r--src/skill_modifiers_fwd.hpp3
-rw-r--r--src/skills.cc67
-rw-r--r--src/variable.cc6
-rw-r--r--src/variable.hpp6
13 files changed, 122 insertions, 152 deletions
diff --git a/src/init1.cc b/src/init1.cc
index 05a4f857..d86fbd4e 100644
--- a/src/init1.cc
+++ b/src/init1.cc
@@ -807,6 +807,37 @@ static errr grab_object_flag(object_flag_set *flags, cptr what)
}
/*
+ * Read skill values
+ */
+static int read_skill_modifiers(skill_modifiers *skill_modifiers, cptr buf)
+{
+ long val, mod;
+ char v, m;
+ char name[200];
+
+ if (5 != sscanf(buf, "%c%ld:%c%ld:%s", &v, &val, &m, &mod, name))
+ {
+ return 1;
+ }
+
+ long i;
+ if ((i = find_skill(name)) == -1)
+ {
+ return 1;
+ }
+
+ auto s = &skill_modifiers->modifiers[i];
+
+ s->basem = monster_ego_modify(v);
+ s->base = val;
+ s->modm = monster_ego_modify(m);
+ s->mod = mod;
+
+ return 0;
+}
+
+
+/*
* Initialize the "player" arrays, by parsing an ascii "template" file
*/
errr init_player_info_txt(FILE *fp)
@@ -834,15 +865,6 @@ errr init_player_info_txt(FILE *fp)
/* Just before the first line */
error_line = -1;
- /* Init general skills */
- for (z = 0; z < MAX_SKILLS; z++)
- {
- gen_skill_basem[z] = 0;
- gen_skill_base[z] = 0;
- gen_skill_modm[z] = 0;
- gen_skill_mod[z] = 0;
- }
-
/* Parse */
while (0 == my_fgets(fp, buf, 1024))
{
@@ -888,18 +910,10 @@ errr init_player_info_txt(FILE *fp)
/* Process 'G:k' for "General skills" */
if ((buf[0] == 'G') && (buf[2] == 'k'))
{
- long val, mod, i;
- char name[200], v, m;
-
- /* Scan for the values */
- if (5 != sscanf(buf + 4, "%c%ld:%c%ld:%s",
- &v, &val, &m, &mod, name)) return (1);
-
- if ((i = find_skill(name)) == -1) return (1);
- gen_skill_basem[i] = monster_ego_modify(v);
- gen_skill_base[i] = val;
- gen_skill_modm[i] = monster_ego_modify(m);
- gen_skill_mod[i] = mod;
+ if (read_skill_modifiers(gen_skill, buf + 4))
+ {
+ return 1;
+ }
/* Next... */
continue;
@@ -1044,18 +1058,10 @@ errr init_player_info_txt(FILE *fp)
/* Process 'k' for "skills" */
if ((buf[0] == 'R') && (buf[2] == 'k'))
{
- long val, mod, i;
- char name[200], v, m;
-
- /* Scan for the values */
- if (5 != sscanf(buf + 4, "%c%ld:%c%ld:%s",
- &v, &val, &m, &mod, name)) return (1);
-
- if ((i = find_skill(name)) == -1) return (1);
- rp_ptr->skill_basem[i] = monster_ego_modify(v);
- rp_ptr->skill_base[i] = val;
- rp_ptr->skill_modm[i] = monster_ego_modify(m);
- rp_ptr->skill_mod[i] = mod;
+ if (read_skill_modifiers(&rp_ptr->skill_modifiers, buf + 4))
+ {
+ return 1;
+ }
/* Next... */
continue;
@@ -1319,18 +1325,10 @@ errr init_player_info_txt(FILE *fp)
/* Process 'k' for "skills" */
if ((buf[0] == 'S') && (buf[2] == 'k'))
{
- long val, mod, i;
- char name[200], v, m;
-
- /* Scan for the values */
- if (5 != sscanf(buf + 4, "%c%ld:%c%ld:%s",
- &v, &val, &m, &mod, name)) return (1);
-
- if ((i = find_skill(name)) == -1) return (1);
- rmp_ptr->skill_basem[i] = monster_ego_modify(v);
- rmp_ptr->skill_base[i] = val;
- rmp_ptr->skill_modm[i] = monster_ego_modify(m);
- rmp_ptr->skill_mod[i] = mod;
+ if (read_skill_modifiers(&rmp_ptr->skill_modifiers, buf + 4))
+ {
+ return 1;
+ }
/* Next... */
continue;
@@ -1640,18 +1638,10 @@ errr init_player_info_txt(FILE *fp)
/* Process 'k' for "skills" */
if ((buf[0] == 'C') && (buf[2] == 'k'))
{
- long val, mod, i;
- char name[200], v, m;
-
- /* Scan for the values */
- if (5 != sscanf(buf + 4, "%c%ld:%c%ld:%s",
- &v, &val, &m, &mod, name)) return (1);
-
- if ((i = find_skill(name)) == -1) return (1);
- c_ptr->skill_basem[i] = monster_ego_modify(v);
- c_ptr->skill_base[i] = val;
- c_ptr->skill_modm[i] = monster_ego_modify(m);
- c_ptr->skill_mod[i] = mod;
+ if (read_skill_modifiers(&c_ptr->skill_modifiers, buf + 4))
+ {
+ return 1;
+ }
/* Next... */
continue;
@@ -1916,18 +1906,10 @@ errr init_player_info_txt(FILE *fp)
/* Process 'k' for "skills" */
if (buf[4] == 'k')
{
- long val, mod, i;
- char name[200], v, m;
-
- /* Scan for the values */
- if (5 != sscanf(buf + 6, "%c%ld:%c%ld:%s",
- &v, &val, &m, &mod, name)) return (1);
-
- if ((i = find_skill(name)) == -1) return (1);
- s_ptr->skill_basem[i] = monster_ego_modify(v);
- s_ptr->skill_base[i] = val;
- s_ptr->skill_modm[i] = monster_ego_modify(m);
- s_ptr->skill_mod[i] = mod;
+ if (read_skill_modifiers(&s_ptr->skill_modifiers, buf + 6))
+ {
+ return 1;
+ }
/* Next... */
continue;
diff --git a/src/init2.cc b/src/init2.cc
index ac69b760..7a7f6906 100644
--- a/src/init2.cc
+++ b/src/init2.cc
@@ -556,6 +556,7 @@ namespace {
class_info = new player_class[max_c_idx];
bg = make_array<hist_type>(max_bg_idx);
meta_class_info = new meta_class_type[max_mc_idx];
+ gen_skill = new skill_modifiers;
}
static errr parse(FILE *fp)
diff --git a/src/loadsave.cc b/src/loadsave.cc
index 2c5085ed..1d3e8144 100644
--- a/src/loadsave.cc
+++ b/src/loadsave.cc
@@ -261,6 +261,22 @@ static void do_quick_start(ls_flag_t flag)
}
}
+static void do_skill_modifier(skill_modifier *s, ls_flag_t flag)
+{
+ do_byte((byte*) &s->basem, flag);
+ do_u32b( &s->base, flag);
+ do_byte((byte*) &s->modm, flag);
+ do_s16b( &s->mod, flag);
+}
+
+static void do_skill_modifiers(skill_modifiers *skill_modifiers, ls_flag_t flag)
+{
+ for (std::size_t i = 0; i < MAX_SKILLS; i++)
+ {
+ do_skill_modifier(&skill_modifiers->modifiers[i], flag);
+ }
+}
+
/*
* The special saved subrace
*/
@@ -326,13 +342,7 @@ static void do_subrace(ls_flag_t flag)
do_byte(&sr_ptr->g_attr, flag);
do_byte((byte*)&sr_ptr->g_char, flag);
- for (i = 0; i < MAX_SKILLS; i++)
- {
- do_byte((byte*)&sr_ptr->skill_basem[i], flag);
- do_u32b(&sr_ptr->skill_base[i], flag);
- do_byte((byte*)&sr_ptr->skill_modm[i], flag);
- do_s16b(&sr_ptr->skill_mod[i], flag);
- }
+ do_skill_modifiers(&sr_ptr->skill_modifiers, flag);
}
diff --git a/src/player_class.hpp b/src/player_class.hpp
index 6e094717..e3a124e6 100644
--- a/src/player_class.hpp
+++ b/src/player_class.hpp
@@ -6,6 +6,7 @@
#include "player_defs.hpp"
#include "player_race_flag_set.hpp"
#include "player_spec.hpp"
+#include "skill_modifiers.hpp"
/**
* Maximum number of specialties.
@@ -54,10 +55,7 @@ struct player_class
std::array<object_flag_set, PY_MAX_LEVEL + 1> oflags;
s16b opval[PY_MAX_LEVEL + 1] { };
- char skill_basem[MAX_SKILLS] { };
- u32b skill_base[MAX_SKILLS] { };
- char skill_modm[MAX_SKILLS] { };
- s16b skill_mod[MAX_SKILLS] { };
+ struct skill_modifiers skill_modifiers;
u32b gods = 0;
diff --git a/src/player_race.hpp b/src/player_race.hpp
index a80373bb..6e2b861d 100644
--- a/src/player_race.hpp
+++ b/src/player_race.hpp
@@ -7,6 +7,7 @@
#include "player_race_ability_type.hpp"
#include "player_race_flag_set.hpp"
#include "skills_defs.hpp"
+#include "skill_modifiers.hpp"
#include <array>
@@ -40,10 +41,7 @@ struct player_race
std::array<object_flag_set, PY_MAX_LEVEL + 1> oflags;
s16b opval[PY_MAX_LEVEL + 1] { };
- char skill_basem[MAX_SKILLS] { };
- u32b skill_base[MAX_SKILLS] { };
- char skill_modm[MAX_SKILLS] { };
- s16b skill_mod[MAX_SKILLS] { };
+ struct skill_modifiers skill_modifiers;
s16b obj_tval[5] { };
s16b obj_sval[5] { };
diff --git a/src/player_race_mod.hpp b/src/player_race_mod.hpp
index 9b0d95f6..0472c4ee 100644
--- a/src/player_race_mod.hpp
+++ b/src/player_race_mod.hpp
@@ -6,6 +6,7 @@
#include "player_defs.hpp"
#include "player_race_ability_type.hpp"
#include "player_race_flag_set.hpp"
+#include "skill_modifiers.hpp"
#include "skills_defs.hpp"
#include <array>
@@ -44,10 +45,7 @@ struct player_race_mod
byte g_attr = 0; /* Overlay graphic attribute */
char g_char = '\0'; /* Overlay graphic character */
- char skill_basem[MAX_SKILLS] { };
- u32b skill_base[MAX_SKILLS] { };
- char skill_modm[MAX_SKILLS] { };
- s16b skill_mod[MAX_SKILLS] { };
+ struct skill_modifiers skill_modifiers;
s16b obj_tval[5] { };
s16b obj_sval[5] { };
diff --git a/src/player_spec.hpp b/src/player_spec.hpp
index 5fcec7cd..52b6f180 100644
--- a/src/player_spec.hpp
+++ b/src/player_spec.hpp
@@ -3,6 +3,7 @@
#include "h-basic.h"
#include "player_race_ability_type.hpp"
#include "player_race_flag_set.hpp"
+#include "skill_modifiers.hpp"
#include "skills_defs.hpp"
#include <array>
@@ -15,10 +16,7 @@ struct player_spec
const char *title = nullptr; /* Type of class spec */
char *desc = nullptr; /* Small desc of the class spec */
- char skill_basem[MAX_SKILLS] { }; /* Mod for value */
- u32b skill_base[MAX_SKILLS] { }; /* value */
- char skill_modm[MAX_SKILLS] { }; /* mod for mod */
- s16b skill_mod[MAX_SKILLS] { }; /* mod */
+ struct skill_modifiers skill_modifiers;
u32b skill_ideal[MAX_SKILLS] { }; /* Ideal skill levels at level 50 */
diff --git a/src/skill_modifier.hpp b/src/skill_modifier.hpp
new file mode 100644
index 00000000..e4bf4ce9
--- /dev/null
+++ b/src/skill_modifier.hpp
@@ -0,0 +1,12 @@
+#pragma once
+
+#include "h-basic.h"
+
+struct skill_modifier {
+
+ char basem = '\0';
+ u32b base = 0;
+ char modm = '\0';
+ s16b mod = 0;
+
+};
diff --git a/src/skill_modifiers.hpp b/src/skill_modifiers.hpp
new file mode 100644
index 00000000..fe9d9a1b
--- /dev/null
+++ b/src/skill_modifiers.hpp
@@ -0,0 +1,11 @@
+#pragma once
+
+#include "h-basic.h"
+#include "skills_defs.hpp"
+#include "skill_modifier.hpp"
+#include <array>
+
+struct skill_modifiers
+{
+ std::array<skill_modifier, MAX_SKILLS> modifiers;
+};
diff --git a/src/skill_modifiers_fwd.hpp b/src/skill_modifiers_fwd.hpp
new file mode 100644
index 00000000..18f692bd
--- /dev/null
+++ b/src/skill_modifiers_fwd.hpp
@@ -0,0 +1,3 @@
+#pragma once
+
+struct skill_modifiers;
diff --git a/src/skills.cc b/src/skills.cc
index 8949e9ad..bc508c54 100644
--- a/src/skills.cc
+++ b/src/skills.cc
@@ -1177,62 +1177,25 @@ bool_ forbid_non_blessed()
/*
- * Gets the base value of a skill, given a race/class/...
+ * Augment skill value/modifier with the given skill_modifiers
*/
-void compute_skills(s32b *v, s32b *m, int i)
+static void augment_skills(s32b *v, s32b *m, skill_modifier const &s)
{
- s32b value, mod;
-
- /***** general skills *****/
-
- /* If the skill correspond to the magic school lets pump them a bit */
- value = gen_skill_base[i];
- mod = gen_skill_mod[i];
-
- *v = modify_aux(*v,
- value, gen_skill_basem[i]);
- *m = modify_aux(*m,
- mod, gen_skill_modm[i]);
-
- /***** race skills *****/
-
- value = rp_ptr->skill_base[i];
- mod = rp_ptr->skill_mod[i];
-
- *v = modify_aux(*v,
- value, rp_ptr->skill_basem[i]);
- *m = modify_aux(*m,
- mod, rp_ptr->skill_modm[i]);
-
- /***** race mod skills *****/
-
- value = rmp_ptr->skill_base[i];
- mod = rmp_ptr->skill_mod[i];
-
- *v = modify_aux(*v,
- value, rmp_ptr->skill_basem[i]);
- *m = modify_aux(*m,
- mod, rmp_ptr->skill_modm[i]);
-
- /***** class skills *****/
-
- value = cp_ptr->skill_base[i];
- mod = cp_ptr->skill_mod[i];
-
- *v = modify_aux(*v,
- value, cp_ptr->skill_basem[i]);
- *m = modify_aux(*m,
- mod, cp_ptr->skill_modm[i]);
-
- /***** class spec skills *****/
+ *v = modify_aux(*v, s.base, s.basem);
+ *m = modify_aux(*m, s.mod, s.modm);
+}
- value = spp_ptr->skill_base[i];
- mod = spp_ptr->skill_mod[i];
- *v = modify_aux(*v,
- value, spp_ptr->skill_basem[i]);
- *m = modify_aux(*m,
- mod, spp_ptr->skill_modm[i]);
+/*
+ * Gets the base value of a skill, given a race/class/...
+ */
+void compute_skills(s32b *v, s32b *m, int i)
+{
+ augment_skills(v, m, gen_skill->modifiers[i]);
+ augment_skills(v, m, rp_ptr->skill_modifiers.modifiers[i]);
+ augment_skills(v, m, rmp_ptr->skill_modifiers.modifiers[i]);
+ augment_skills(v, m, cp_ptr->skill_modifiers.modifiers[i]);
+ augment_skills(v, m, spp_ptr->skill_modifiers.modifiers[i]);
}
/*
diff --git a/src/variable.cc b/src/variable.cc
index 524766ea..4ac48b50 100644
--- a/src/variable.cc
+++ b/src/variable.cc
@@ -13,6 +13,7 @@
#include "dungeon_flag_set.hpp"
#include "player_type.hpp"
#include "randart_gen_type.hpp"
+#include "skill_modifiers.hpp"
#include "util.hpp"
@@ -938,10 +939,7 @@ effect_type effects[MAX_EFFECTS];
/*
* General skills set
*/
-char gen_skill_basem[MAX_SKILLS];
-u32b gen_skill_base[MAX_SKILLS];
-char gen_skill_modm[MAX_SKILLS];
-s16b gen_skill_mod[MAX_SKILLS];
+skill_modifiers *gen_skill;
/*
* Table of "cli" macros.
diff --git a/src/variable.hpp b/src/variable.hpp
index 543c1bd5..3cfc7c8c 100644
--- a/src/variable.hpp
+++ b/src/variable.hpp
@@ -35,6 +35,7 @@
#include "rune_spell.hpp"
#include "school_type.hpp"
#include "set_type_fwd.hpp"
+#include "skill_modifiers_fwd.hpp"
#include "skill_type_fwd.hpp"
#include "skills_defs.hpp"
#include "store_action_type_fwd.hpp"
@@ -284,10 +285,7 @@ extern school_type schools[SCHOOLS_MAX];
extern int project_time;
extern s32b project_time_effect;
extern effect_type effects[MAX_EFFECTS];
-extern char gen_skill_basem[MAX_SKILLS];
-extern u32b gen_skill_base[MAX_SKILLS];
-extern char gen_skill_modm[MAX_SKILLS];
-extern s16b gen_skill_mod[MAX_SKILLS];
+extern skill_modifiers *gen_skill;
extern int max_bact;
extern bool_ automatizer_enabled;
extern s16b last_teleportation_y;