7 #include "knowledge/knowledge-experiences.h"
8 #include "core/show-file.h"
9 #include "flavor/object-flavor.h"
10 #include "game-option/cheat-options.h"
11 #include "game-option/text-display-options.h"
12 #include "io-dump/dump-util.h"
13 #include "object/object-kind.h"
14 #include "player-info/class-info.h"
15 #include "player/player-skill.h"
16 #include "player/player-status.h"
17 #include "realm/realm-names-table.h"
18 #include "spell/spells-execution.h"
19 #include "spell/technic-info-table.h"
20 #include "sv-definition/sv-bow-types.h"
21 #include "system/player-type-definition.h"
22 #include "util/angband-files.h"
27 void do_cmd_knowledge_weapon_exp(player_type *player_ptr)
30 GAME_TEXT file_name[FILE_NAME_SIZE];
31 if (!open_temporary_file(&fff, file_name))
34 for (auto tval : { ItemKindType::SWORD, ItemKindType::POLEARM, ItemKindType::HAFTED, ItemKindType::DIGGING, ItemKindType::BOW }) {
35 for (int num = 0; num < 64; num++) {
37 for (const auto &k_ref : k_info) {
38 if ((k_ref.tval != tval) || (k_ref.sval != num))
40 if ((k_ref.tval == ItemKindType::BOW) && (k_ref.sval == SV_CRIMSON || k_ref.sval == SV_HARP))
43 SUB_EXP weapon_exp = player_ptr->weapon_exp[tval][num];
44 SUB_EXP weapon_max = s_info[enum2i(player_ptr->pclass)].w_max[tval][num];
45 strip_name(tmp, k_ref.idx);
46 fprintf(fff, "%-25s ", tmp);
47 if (show_actual_value)
48 fprintf(fff, "%4d/%4d ", std::min(weapon_exp, weapon_max), weapon_max);
49 if (weapon_exp >= weapon_max)
53 fprintf(fff, "%s", exp_level_str[PlayerSkill::weapon_exp_level(weapon_exp)]);
55 fprintf(fff, " %d", weapon_exp);
63 (void)show_file(player_ptr, true, file_name, _("武器の経験値", "Weapon Proficiency"), 0, 0);
68 * @brief 魔法の経験値を表示するコマンドのメインルーチン
71 void do_cmd_knowledge_spell_exp(player_type *player_ptr)
74 GAME_TEXT file_name[FILE_NAME_SIZE];
75 if (!open_temporary_file(&fff, file_name))
78 if (player_ptr->realm1 != REALM_NONE) {
79 fprintf(fff, _("%sの魔法書\n", "%s Spellbook\n"), realm_names[player_ptr->realm1]);
80 for (SPELL_IDX i = 0; i < 32; i++) {
81 const magic_type *s_ptr;
82 if (!is_magic(player_ptr->realm1)) {
83 s_ptr = &technic_info[player_ptr->realm1 - MIN_TECHNIC][i];
85 s_ptr = &mp_ptr->info[player_ptr->realm1 - 1][i];
88 if (s_ptr->slevel >= 99)
90 SUB_EXP spell_exp = player_ptr->spell_exp[i];
91 auto exp_level = PlayerSkill::spell_exp_level(spell_exp);
92 fprintf(fff, "%-25s ", exe_spell(player_ptr, player_ptr->realm1, i, SPELL_NAME));
93 if (player_ptr->realm1 == REALM_HISSATSU) {
94 if (show_actual_value)
95 fprintf(fff, "----/---- ");
98 if (show_actual_value)
99 fprintf(fff, "%4d/%4d ", spell_exp, PlayerSkill::spell_exp_at(EXP_LEVEL_MASTER));
100 if (exp_level >= EXP_LEVEL_MASTER)
104 fprintf(fff, "%s", exp_level_str[exp_level]);
108 fprintf(fff, " %d", spell_exp);
113 if (player_ptr->realm2 != REALM_NONE) {
114 fprintf(fff, _("%sの魔法書\n", "\n%s Spellbook\n"), realm_names[player_ptr->realm2]);
115 for (SPELL_IDX i = 0; i < 32; i++) {
116 const magic_type *s_ptr;
117 if (!is_magic(player_ptr->realm1)) {
118 s_ptr = &technic_info[player_ptr->realm2 - MIN_TECHNIC][i];
120 s_ptr = &mp_ptr->info[player_ptr->realm2 - 1][i];
123 if (s_ptr->slevel >= 99)
126 SUB_EXP spell_exp = player_ptr->spell_exp[i + 32];
127 auto exp_level = PlayerSkill::spell_exp_level(spell_exp);
128 fprintf(fff, "%-25s ", exe_spell(player_ptr, player_ptr->realm2, i, SPELL_NAME));
129 if (show_actual_value)
130 fprintf(fff, "%4d/%4d ", spell_exp, PlayerSkill::spell_exp_at(EXP_LEVEL_MASTER));
131 if (exp_level >= EXP_LEVEL_EXPERT)
135 fprintf(fff, "%s", exp_level_str[exp_level]);
137 fprintf(fff, " %d", spell_exp);
143 (void)show_file(player_ptr, true, file_name, _("魔法の経験値", "Spell Proficiency"), 0, 0);
148 * @brief スキル情報を表示するコマンドのメインルーチン /
151 void do_cmd_knowledge_skill_exp(player_type *player_ptr)
154 char file_name[FILE_NAME_SIZE];
155 if (!open_temporary_file(&fff, file_name))
158 for (auto i : PLAYER_SKILL_KIND_TYPE_RANGE) {
159 SUB_EXP skill_exp = player_ptr->skill_exp[i];
160 SUB_EXP skill_max = s_info[enum2i(player_ptr->pclass)].s_max[i];
161 fprintf(fff, "%-20s ", PlayerSkill::skill_name(i));
162 if (show_actual_value)
163 fprintf(fff, "%4d/%4d ", std::min(skill_exp, skill_max), skill_max);
164 if (skill_exp >= skill_max)
168 fprintf(fff, "%s", exp_level_str[(i == PlayerSkillKindType::RIDING) ? PlayerSkill::riding_exp_level(skill_exp) : PlayerSkill::weapon_exp_level(skill_exp)]);
170 fprintf(fff, " %d", skill_exp);
175 (void)show_file(player_ptr, true, file_name, _("技能の経験値", "Miscellaneous Proficiency"), 0, 0);