OSDN Git Service

[Refactor] #2925 Separated check_baseitem_chance() from collect_objects()
[hengbandforosx/hengbandosx.git] / src / knowledge / knowledge-experiences.cpp
1 /*!
2  * @brief 技能の経験を表示する
3  * @date 2020/04/23
4  * @author Hourier
5  */
6
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 "player-info/class-info.h"
14 #include "player/player-skill.h"
15 #include "player/player-status.h"
16 #include "realm/realm-names-table.h"
17 #include "spell/spells-execution.h"
18 #include "spell/technic-info-table.h"
19 #include "sv-definition/sv-bow-types.h"
20 #include "system/baseitem-info.h"
21 #include "system/player-type-definition.h"
22 #include "util/angband-files.h"
23
24 /*
25  * Display weapon-exp
26  */
27 void do_cmd_knowledge_weapon_exp(PlayerType *player_ptr)
28 {
29     FILE *fff = nullptr;
30     GAME_TEXT file_name[FILE_NAME_SIZE];
31     if (!open_temporary_file(&fff, file_name)) {
32         return;
33     }
34
35     for (auto tval : { ItemKindType::SWORD, ItemKindType::POLEARM, ItemKindType::HAFTED, ItemKindType::DIGGING, ItemKindType::BOW }) {
36         for (int num = 0; num < 64; num++) {
37             BaseitemKey bi_key(tval, num);
38             for (const auto &baseitem : baseitems_info) {
39                 if (baseitem.bi_key != bi_key) {
40                     continue;
41                 }
42
43                 const auto sval = baseitem.bi_key.sval();
44                 if ((baseitem.bi_key.tval() == ItemKindType::BOW) && (sval == SV_CRIMSON || sval == SV_HARP)) {
45                     continue;
46                 }
47
48                 SUB_EXP weapon_exp = player_ptr->weapon_exp[tval][num];
49                 SUB_EXP weapon_max = player_ptr->weapon_exp_max[tval][num];
50                 const auto tmp = strip_name(baseitem.idx);
51                 fprintf(fff, "%-25s ", tmp.data());
52                 if (show_actual_value) {
53                     fprintf(fff, "%4d/%4d ", weapon_exp, weapon_max);
54                 }
55                 if (weapon_exp >= weapon_max) {
56                     fprintf(fff, "!");
57                 } else {
58                     fprintf(fff, " ");
59                 }
60                 auto skill_rank = PlayerSkill::weapon_skill_rank(weapon_exp);
61                 fprintf(fff, "%s", PlayerSkill::skill_rank_str(skill_rank));
62                 if (cheat_xtra) {
63                     fprintf(fff, " %d", weapon_exp);
64                 }
65                 fprintf(fff, "\n");
66                 break;
67             }
68         }
69     }
70
71     angband_fclose(fff);
72     (void)show_file(player_ptr, true, file_name, _("武器の経験値", "Weapon Proficiency"), 0, 0);
73     fd_kill(file_name);
74 }
75
76 /*!
77  * @brief 魔法の経験値を表示するコマンドのメインルーチン
78  * Display spell-exp
79  */
80 void do_cmd_knowledge_spell_exp(PlayerType *player_ptr)
81 {
82     FILE *fff = nullptr;
83     GAME_TEXT file_name[FILE_NAME_SIZE];
84     if (!open_temporary_file(&fff, file_name)) {
85         return;
86     }
87
88     if (player_ptr->realm1 != REALM_NONE) {
89         fprintf(fff, _("%sの魔法書\n", "%s Spellbook\n"), realm_names[player_ptr->realm1]);
90         for (SPELL_IDX i = 0; i < 32; i++) {
91             const magic_type *s_ptr;
92             if (!is_magic(player_ptr->realm1)) {
93                 s_ptr = &technic_info[player_ptr->realm1 - MIN_TECHNIC][i];
94             } else {
95                 s_ptr = &mp_ptr->info[player_ptr->realm1 - 1][i];
96             }
97
98             if (s_ptr->slevel >= 99) {
99                 continue;
100             }
101             SUB_EXP spell_exp = player_ptr->spell_exp[i];
102             auto skill_rank = PlayerSkill::spell_skill_rank(spell_exp);
103             fprintf(fff, "%-25s ", exe_spell(player_ptr, player_ptr->realm1, i, SpellProcessType::NAME));
104             if (player_ptr->realm1 == REALM_HISSATSU) {
105                 if (show_actual_value) {
106                     fprintf(fff, "----/---- ");
107                 }
108                 fprintf(fff, "[--]");
109             } else {
110                 if (show_actual_value) {
111                     fprintf(fff, "%4d/%4d ", spell_exp, PlayerSkill::spell_exp_at(PlayerSkillRank::MASTER));
112                 }
113                 if (skill_rank >= PlayerSkillRank::MASTER) {
114                     fprintf(fff, "!");
115                 } else {
116                     fprintf(fff, " ");
117                 }
118                 fprintf(fff, "%s", PlayerSkill::skill_rank_str(skill_rank));
119             }
120
121             if (cheat_xtra) {
122                 fprintf(fff, " %d", spell_exp);
123             }
124             fprintf(fff, "\n");
125         }
126     }
127
128     if (player_ptr->realm2 != REALM_NONE) {
129         fprintf(fff, _("%sの魔法書\n", "\n%s Spellbook\n"), realm_names[player_ptr->realm2]);
130         for (SPELL_IDX i = 0; i < 32; i++) {
131             const magic_type *s_ptr;
132             if (!is_magic(player_ptr->realm1)) {
133                 s_ptr = &technic_info[player_ptr->realm2 - MIN_TECHNIC][i];
134             } else {
135                 s_ptr = &mp_ptr->info[player_ptr->realm2 - 1][i];
136             }
137
138             if (s_ptr->slevel >= 99) {
139                 continue;
140             }
141
142             SUB_EXP spell_exp = player_ptr->spell_exp[i + 32];
143             auto skill_rank = PlayerSkill::spell_skill_rank(spell_exp);
144             fprintf(fff, "%-25s ", exe_spell(player_ptr, player_ptr->realm2, i, SpellProcessType::NAME));
145             if (show_actual_value) {
146                 fprintf(fff, "%4d/%4d ", spell_exp, PlayerSkill::spell_exp_at(PlayerSkillRank::MASTER));
147             }
148             if (skill_rank >= PlayerSkillRank::EXPERT) {
149                 fprintf(fff, "!");
150             } else {
151                 fprintf(fff, " ");
152             }
153             fprintf(fff, "%s", PlayerSkill::skill_rank_str(skill_rank));
154             if (cheat_xtra) {
155                 fprintf(fff, " %d", spell_exp);
156             }
157             fprintf(fff, "\n");
158         }
159     }
160
161     angband_fclose(fff);
162     (void)show_file(player_ptr, true, file_name, _("魔法の経験値", "Spell Proficiency"), 0, 0);
163     fd_kill(file_name);
164 }
165
166 /*!
167  * @brief スキル情報を表示するコマンドのメインルーチン /
168  * Display skill-exp
169  */
170 void do_cmd_knowledge_skill_exp(PlayerType *player_ptr)
171 {
172     FILE *fff = nullptr;
173     char file_name[FILE_NAME_SIZE];
174     if (!open_temporary_file(&fff, file_name)) {
175         return;
176     }
177
178     for (auto i : PLAYER_SKILL_KIND_TYPE_RANGE) {
179         SUB_EXP skill_exp = player_ptr->skill_exp[i];
180         SUB_EXP skill_max = class_skills_info[enum2i(player_ptr->pclass)].s_max[i];
181         fprintf(fff, "%-20s ", PlayerSkill::skill_name(i));
182         if (show_actual_value) {
183             fprintf(fff, "%4d/%4d ", std::min(skill_exp, skill_max), skill_max);
184         }
185         if (skill_exp >= skill_max) {
186             fprintf(fff, "!");
187         } else {
188             fprintf(fff, " ");
189         }
190         auto skill_rank = (i == PlayerSkillKindType::RIDING) ? PlayerSkill::riding_skill_rank(skill_exp) : PlayerSkill::weapon_skill_rank(skill_exp);
191         fprintf(fff, "%s", PlayerSkill::skill_rank_str(skill_rank));
192         if (cheat_xtra) {
193             fprintf(fff, " %d", skill_exp);
194         }
195         fprintf(fff, "\n");
196     }
197
198     angband_fclose(fff);
199     (void)show_file(player_ptr, true, file_name, _("技能の経験値", "Miscellaneous Proficiency"), 0, 0);
200     fd_kill(file_name);
201 }