From 2fa1a5e82a4e13f16ea6001c11d2452bac036d20 Mon Sep 17 00:00:00 2001 From: Bardur Arantsson Date: Sat, 17 Sep 2016 09:58:13 +0200 Subject: Unify skill_* fields into skill_modifier{,s} --- src/init1.cc | 120 +++++++++++++++++++------------------------- src/init2.cc | 1 + src/loadsave.cc | 24 ++++++--- src/player_class.hpp | 6 +-- src/player_race.hpp | 6 +-- src/player_race_mod.hpp | 6 +-- src/player_spec.hpp | 6 +-- src/skill_modifier.hpp | 12 +++++ src/skill_modifiers.hpp | 11 ++++ src/skill_modifiers_fwd.hpp | 3 ++ src/skills.cc | 67 ++++++------------------- src/variable.cc | 6 +-- src/variable.hpp | 6 +-- 13 files changed, 122 insertions(+), 152 deletions(-) create mode 100644 src/skill_modifier.hpp create mode 100644 src/skill_modifiers.hpp create mode 100644 src/skill_modifiers_fwd.hpp diff --git a/src/init1.cc b/src/init1.cc index 05a4f857..d86fbd4e 100644 --- a/src/init1.cc +++ b/src/init1.cc @@ -806,6 +806,37 @@ static errr grab_object_flag(object_flag_set *flags, cptr what) return (1); } +/* + * 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 */ @@ -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(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 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 @@ -40,10 +41,7 @@ struct player_race std::array 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 @@ -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 @@ -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 + +struct skill_modifiers +{ + std::array 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; -- cgit v1.2.3