From e6ef18391a683c0cc95453697b52fc9f0f2a7393 Mon Sep 17 00:00:00 2001 From: Habu Date: Fri, 22 Oct 2021 01:03:43 +0900 Subject: [PATCH] =?utf8?q?[Refactor]=20=E6=8A=80=E8=83=BD=E7=B5=8C?= =?utf8?q?=E9=A8=93=E5=80=A4=E3=83=86=E3=83=BC=E3=83=96=E3=83=AB=E3=82=92?= =?utf8?q?=E9=85=8D=E5=88=97=E3=81=8B=E3=82=89=20std::map=20=E3=81=AB?= =?utf8?q?=E3=81=99=E3=82=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit enum skill_idx を enum class にする準備として、列挙値でそのままアクセス できるようにするために技能経験値テーブル skill_table::s_start/s_max を 配列から std::map に変更する。 --- src/birth/birth-stat.cpp | 2 +- src/info-reader/skill-reader.cpp | 5 +++-- src/knowledge/knowledge-experiences.cpp | 2 +- src/load/player-info-loader.cpp | 5 ++++- src/player/player-skill.h | 8 ++++++-- src/save/player-writer.cpp | 7 ++++++- src/system/player-type-definition.h | 4 +++- src/util/enum-range.h | 10 ++++++++++ src/wizard/wizard-special-process.cpp | 2 +- 9 files changed, 35 insertions(+), 10 deletions(-) diff --git a/src/birth/birth-stat.cpp b/src/birth/birth-stat.cpp index b8ae4f04e..0f2dbc557 100644 --- a/src/birth/birth-stat.cpp +++ b/src/birth/birth-stat.cpp @@ -131,7 +131,7 @@ void get_extra(player_type *player_ptr, bool roll_hitdie) whip_exp = std::max(whip_exp, PlayerSkill::weapon_exp_at(EXP_LEVEL_BEGINNER)); } - for (int i = 0; i < MAX_SKILLS; i++) + for (auto i : PLAYER_SKILL_KIND_TYPE_RANGE) player_ptr->skill_exp[i] = s_info[pclass].s_start[i]; if (player_ptr->pclass == PlayerClassType::SORCERER) diff --git a/src/info-reader/skill-reader.cpp b/src/info-reader/skill-reader.cpp index 61dc976ae..3587b8813 100644 --- a/src/info-reader/skill-reader.cpp +++ b/src/info-reader/skill-reader.cpp @@ -59,8 +59,9 @@ errr parse_s_info(std::string_view buf, angband_header *head) if (!PlayerSkill::valid_weapon_exp(start) || !PlayerSkill::valid_weapon_exp(max) || start > max) return PARSE_ERROR_INVALID_FLAG; - s_ptr->s_start[num] = (SUB_EXP)start; - s_ptr->s_max[num] = (SUB_EXP)max; + auto skill = SKILL_MARTIAL_ARTS + num; + s_ptr->s_start[skill] = static_cast(start); + s_ptr->s_max[skill] = static_cast(max); } else return PARSE_ERROR_UNDEFINED_DIRECTIVE; diff --git a/src/knowledge/knowledge-experiences.cpp b/src/knowledge/knowledge-experiences.cpp index c94ed7c8e..485d17c8b 100644 --- a/src/knowledge/knowledge-experiences.cpp +++ b/src/knowledge/knowledge-experiences.cpp @@ -158,7 +158,7 @@ void do_cmd_knowledge_skill_exp(player_type *player_ptr) if (!open_temporary_file(&fff, file_name)) return; - for (int i = 0; i < SKILL_MAX; i++) { + for (auto i : PLAYER_SKILL_KIND_TYPE_RANGE) { SUB_EXP skill_exp = player_ptr->skill_exp[i]; SUB_EXP skill_max = s_info[enum2i(player_ptr->pclass)].s_max[i]; fprintf(fff, "%-20s ", skill_name[i]); diff --git a/src/load/player-info-loader.cpp b/src/load/player-info-loader.cpp index 7c01c1fb6..1d89ed271 100644 --- a/src/load/player-info-loader.cpp +++ b/src/load/player-info-loader.cpp @@ -108,8 +108,11 @@ void rd_experience(player_type *player_ptr) for (int j = 0; j < max_weapon_exp_size; j++) player_ptr->weapon_exp[tval][j] = rd_s16b(); - for (int i = 0; i < MAX_SKILLS; i++) + for (auto i : PLAYER_SKILL_KIND_TYPE_RANGE) player_ptr->skill_exp[i] = rd_s16b(); + + // resreved skills + strip_bytes(sizeof(int16_t) * (MAX_SKILLS - PLAYER_SKILL_KIND_TYPE_RANGE.size())); } void rd_skills(player_type *player_ptr) diff --git a/src/player/player-skill.h b/src/player/player-skill.h index 7308813f1..cc1b031a3 100644 --- a/src/player/player-skill.h +++ b/src/player/player-skill.h @@ -2,6 +2,8 @@ #include "system/angband.h" +#include "util/enum-range.h" + #include #include #include @@ -15,6 +17,8 @@ enum skill_idx { SKILL_MAX = 4, }; +constexpr auto PLAYER_SKILL_KIND_TYPE_RANGE = EnumRange(SKILL_MARTIAL_ARTS, SKILL_SHIELD); + /* Proficiency level */ #define EXP_LEVEL_UNSKILLED 0 #define EXP_LEVEL_BEGINNER 1 @@ -32,8 +36,8 @@ enum class ItemKindType : short; typedef struct skill_table { std::map> w_start{}; /* start weapon exp */ std::map> w_max{}; /* max weapon exp */ - SUB_EXP s_start[MAX_SKILLS]{}; /* start skill */ - SUB_EXP s_max[MAX_SKILLS]{}; /* max skill */ + std::map s_start{}; /* start skill */ + std::map s_max{}; /* max skill */ } skill_table; extern std::vector s_info; diff --git a/src/save/player-writer.cpp b/src/save/player-writer.cpp index a4f077328..a53f00589 100644 --- a/src/save/player-writer.cpp +++ b/src/save/player-writer.cpp @@ -82,8 +82,13 @@ void wr_player(player_type *player_ptr) for (int j = 0; j < 64; j++) wr_s16b(player_ptr->weapon_exp[tval][j]); - for (int i = 0; i < MAX_SKILLS; i++) + for (auto i : PLAYER_SKILL_KIND_TYPE_RANGE) { wr_s16b(player_ptr->skill_exp[i]); + } + for (auto i = 0U; i < MAX_SKILLS - PLAYER_SKILL_KIND_TYPE_RANGE.size(); ++i) { + // resreved skills + wr_s16b(0); + } std::visit(PlayerClassSpecificDataWriter(), player_ptr->class_specific_data); diff --git a/src/system/player-type-definition.h b/src/system/player-type-definition.h index efe710d99..4dec6023f 100644 --- a/src/system/player-type-definition.h +++ b/src/system/player-type-definition.h @@ -15,6 +15,8 @@ #include #include +#include "player/player-skill.h" + enum class ItemKindType : short; enum class RF_ABILITY; @@ -186,7 +188,7 @@ public: SUB_EXP spell_exp[64]{}; /* Proficiency of spells */ std::map> weapon_exp{}; /* Proficiency of weapons */ - SUB_EXP skill_exp[MAX_SKILLS]{}; /* Proficiency of misc. skill */ + std::map skill_exp{}; /* Proficiency of misc. skill */ ClassSpecificData class_specific_data; diff --git a/src/util/enum-range.h b/src/util/enum-range.h index 939731ad5..ca726560b 100644 --- a/src/util/enum-range.h +++ b/src/util/enum-range.h @@ -110,6 +110,16 @@ public: return iterator(end_val); } + /*! + * @brief 範囲に含まれる列挙値の種類数を取得する + * + * @return 範囲に含まれる列挙値の種類数 + */ + constexpr std::size_t size() const noexcept + { + return static_cast(end_val) - static_cast(begin_val); + } + private: EnumType begin_val; EnumType end_val; diff --git a/src/wizard/wizard-special-process.cpp b/src/wizard/wizard-special-process.cpp index 7d4f51382..673f7a23f 100644 --- a/src/wizard/wizard-special-process.cpp +++ b/src/wizard/wizard-special-process.cpp @@ -424,7 +424,7 @@ void wiz_change_status(player_type *player_ptr) } } - for (int j = 0; j < 10; j++) { + for (auto j : PLAYER_SKILL_KIND_TYPE_RANGE) { player_ptr->skill_exp[j] = tmp_s16b; auto short_pclass = enum2i(player_ptr->pclass); if (player_ptr->skill_exp[j] > s_info[short_pclass].s_max[j]) -- 2.11.0