1 #include "birth/birth-select-class.h"
2 #include "birth/birth-util.h"
3 #include "io/input-key-acceptor.h"
4 #include "player-info/class-info.h"
5 #include "player-info/race-info.h"
6 #include "system/player-type-definition.h"
7 #include "term/screen-processor.h"
8 #include "term/term-color-types.h"
9 #include "util/int-char-converter.h"
10 #include "world/world.h"
12 static const char p2 = ')';
14 static TERM_COLOR birth_class_color(PlayerClassType cs)
16 if (cs < PlayerClassType::MAX) {
17 if (is_retired_class(cs))
19 if (is_winner_class(cs))
25 static void enumerate_class_list(char *sym)
27 for (auto n = 0; n < PLAYER_CLASS_TYPE_MAX; n++) {
28 cp_ptr = &class_info[n];
30 concptr str = cp_ptr->title;
34 sym[n] = ('A' + n - 26);
37 if (!(rp_ptr->choice & (1UL << n)))
38 sprintf(buf, "%c%c(%s)", sym[n], p2, str);
40 sprintf(buf, "%c%c%s", sym[n], p2, str);
42 auto cs = i2enum<PlayerClassType>(n);
43 c_put_str(birth_class_color(cs), buf, 13 + (n / 4), 2 + 19 * (n % 4));
47 static void display_class_stat(int cs, int *os, char *cur, char *sym)
52 auto pclass = i2enum<PlayerClassType>(*os);
53 c_put_str(birth_class_color(pclass), cur, 13 + (*os / 4), 2 + 19 * (*os % 4));
55 if (cs == PLAYER_CLASS_TYPE_MAX) {
56 sprintf(cur, "%c%c%s", '*', p2, _("ランダム", "Random"));
61 cp_ptr = &class_info[cs];
63 concptr str = cp_ptr->title;
64 if (!(rp_ptr->choice & (1UL << cs)))
65 sprintf(cur, "%c%c(%s)", sym[cs], p2, str);
67 sprintf(cur, "%c%c%s", sym[cs], p2, str);
69 c_put_str(TERM_L_BLUE, cp_ptr->title, 3, 40);
70 put_str(_("の職業修正", ": Class modification"), 3, 40 + strlen(cp_ptr->title));
71 put_str(_("腕力 知能 賢さ 器用 耐久 魅力 経験 ", "Str Int Wis Dex Con Chr EXP "), 4, 40);
73 sprintf(buf, "%+3d %+3d %+3d %+3d %+3d %+3d %+4d%% ", cp_ptr->c_adj[0], cp_ptr->c_adj[1], cp_ptr->c_adj[2], cp_ptr->c_adj[3], cp_ptr->c_adj[4],
74 cp_ptr->c_adj[5], cp_ptr->c_exp);
75 c_put_str(TERM_L_BLUE, buf, 5, 40);
78 sprintf(buf, "%+3d", cp_ptr->c_mhp);
79 c_put_str(TERM_L_BLUE, buf, 6, 42);
81 put_str(_("隠密", "Stealth"), 6, 47);
82 if (i2enum<PlayerClassType>(cs) == PlayerClassType::BERSERKER)
85 sprintf(buf, " %+2d", cp_ptr->c_stl);
86 c_put_str(TERM_L_BLUE, buf, 6, _(51, 54));
89 c_put_str(TERM_YELLOW, cur, 13 + (cs / 4), 2 + 19 * (cs % 4));
93 static void interpret_class_select_key_move(char c, int *cs)
106 if (*cs < PLAYER_CLASS_TYPE_MAX)
111 if (*cs + 4 <= PLAYER_CLASS_TYPE_MAX)
116 static bool select_class(PlayerType *player_ptr, char *cur, char *sym, int *k)
118 auto cs = player_ptr->pclass;
119 auto os = PlayerClassType::MAX;
120 int int_os = enum2i(os);
121 int int_cs = enum2i(cs);
123 display_class_stat(int_cs, &int_os, cur, sym);
128 sprintf(buf, _("職業を選んで下さい (%c-%c) ('='初期オプション設定, 灰色:勝利済): ", "Choose a class (%c-%c) ('=' for options, Gray is winner): "),
129 sym[0], sym[PLAYER_CLASS_TYPE_MAX - 1]);
139 if (c == ' ' || c == '\r' || c == '\n') {
140 if (int_cs == enum2i(PlayerClassType::MAX)) {
141 *k = randint0(PLAYER_CLASS_TYPE_MAX);
142 cs = i2enum<PlayerClassType>(*k);
150 interpret_class_select_key_move(c, &int_cs);
152 *k = randint0(PLAYER_CLASS_TYPE_MAX);
153 cs = i2enum<PlayerClassType>(*k);
157 *k = (islower(c) ? A2I(c) : -1);
158 if ((*k >= 0) && (*k < PLAYER_CLASS_TYPE_MAX)) {
159 cs = i2enum<PlayerClassType>(*k);
163 *k = (isupper(c) ? (26 + c - 'A') : -1);
164 if ((*k >= 26) && (*k < PLAYER_CLASS_TYPE_MAX)) {
165 cs = i2enum<PlayerClassType>(*k);
170 birth_help_option(player_ptr, c, BK_CLASS);
177 * @brief プレイヤーの職業選択を行う / Player class
179 bool get_player_class(PlayerType *player_ptr)
183 _("注意:《職業》によってキャラクターの先天的な能力やボーナスが変化します。", "Note: Your 'class' determines various intrinsic abilities and bonuses."),
185 put_str(_("()で囲まれた選択肢はこの種族には似合わない職業です。", "Any entries in parentheses should only be used by advanced players."), 11, 5);
188 char sym[PLAYER_CLASS_TYPE_MAX];
189 enumerate_class_list(sym);
192 sprintf(cur, "%c%c%s", '*', p2, _("ランダム", "Random"));
194 if (!select_class(player_ptr, cur, sym, &k))
197 player_ptr->pclass = i2enum<PlayerClassType>(k);
198 cp_ptr = &class_info[enum2i(player_ptr->pclass)];
199 mp_ptr = &m_info[enum2i(player_ptr->pclass)];
200 c_put_str(TERM_L_BLUE, cp_ptr->title, 5, 15);