1 #include "cmd-action/cmd-racial.h"
2 #include "action/action-limited.h"
3 #include "action/mutation-execution.h"
4 #include "core/asking-player.h"
5 #include "core/player-redraw-types.h"
6 #include "core/player-update-types.h"
7 #include "core/window-redrawer.h"
8 #include "game-option/text-display-options.h"
9 #include "io/command-repeater.h"
10 #include "io/input-key-requester.h"
11 #include "main/sound-of-music.h"
12 #include "mutation/mutation-flag-types.h"
13 #include "player/attack-defense-types.h"
14 #include "player/player-damage.h"
15 #include "player/special-defense-types.h"
16 #include "racial/class-racial-switcher.h"
17 #include "racial/mutation-racial-selector.h"
18 #include "racial/race-racial-switcher.h"
19 #include "racial/racial-switcher.h"
20 #include "racial/racial-util.h"
21 #include "status/action-setter.h"
22 #include "term/screen-processor.h"
23 #include "util/int-char-converter.h"
25 static bool input_racial_technique_selection(player_type *creature_ptr, rc_type *rc_ptr)
27 switch (rc_ptr->choice) {
30 free_turn(creature_ptr);
35 rc_ptr->menu_line += (rc_ptr->num - 1);
48 if (rc_ptr->menu_line > 18)
49 rc_ptr->menu_line -= 18;
50 else if (rc_ptr->menu_line + 18 <= rc_ptr->num)
51 rc_ptr->menu_line += 18;
57 rc_ptr->command_code = rc_ptr->menu_line - 1;
65 static void display_racial_list(rc_type *rc_ptr, char *dummy)
68 rc_ptr->redraw = TRUE;
72 if (rc_ptr->num < 18) {
73 prt(_(" Lv MP 失率", " Lv Cost Fail"), 1, 0);
77 prt(_(" Lv MP 失率 Lv MP 失率",
78 " Lv Cost Fail Lv Cost Fail"),
82 static void select_racial_power(player_type *creature_ptr, rc_type *rc_ptr)
85 display_racial_list(rc_ptr, dummy);
89 while (ctr < rc_ptr->num) {
90 TERM_LEN x1 = ((ctr < 18) ? x : x + 40);
91 TERM_LEN y1 = ((ctr < 18) ? y + ctr : y + ctr - 18);
93 if (ctr == (rc_ptr->menu_line - 1))
94 strcpy(dummy, _(" 》 ", " > "));
102 letter = '0' + ctr - 26;
104 sprintf(dummy, " %c) ", letter);
108 format("%-23.23s %2d %4d %3d%%", rc_ptr->power_desc[ctr].racial_name, rc_ptr->power_desc[ctr].min_level, rc_ptr->power_desc[ctr].cost,
109 100 - racial_chance(creature_ptr, &rc_ptr->power_desc[ctr])));
116 * @brief レイシャル・パワーコマンドのメインルーチン / Allow user to choose a power (racial / mutation) to activate
117 * @param creature_ptr プレーヤーへの参照ポインタ
120 void do_cmd_racial_power(player_type *creature_ptr)
122 if (creature_ptr->wild_mode)
125 if (cmd_limit_confused(creature_ptr)) {
126 free_turn(creature_ptr);
130 if (creature_ptr->special_defense & (KATA_MUSOU | KATA_KOUKIJIN))
131 set_action(creature_ptr, ACTION_NONE);
134 rc_type *rc_ptr = initialize_rc_type(creature_ptr, &tmp_rc);
135 switch_class_racial(creature_ptr, rc_ptr);
136 if (creature_ptr->mimic_form)
137 switch_mimic_racial(creature_ptr, rc_ptr);
139 switch_race_racial(creature_ptr, rc_ptr);
141 select_mutation_racial(creature_ptr, rc_ptr);
142 rc_ptr->flag = FALSE;
143 rc_ptr->redraw = FALSE;
145 (void)strnfmt(rc_ptr->out_val, 78,
146 _("(特殊能力 %c-%c, *'で一覧, ESCで中断) どの特殊能力を使いますか?", "(Powers %c-%c, *=List, ESC=exit) Use which power? "), I2A(0),
147 (rc_ptr->num <= 26) ? I2A(rc_ptr->num - 1) : '0' + rc_ptr->num - 27);
149 if (!repeat_pull(&rc_ptr->command_code) || rc_ptr->command_code < 0 || rc_ptr->command_code >= rc_ptr->num) {
153 rc_ptr->choice = (always_show_list || use_menu) ? ESCAPE : 1;
154 while (!rc_ptr->flag) {
155 if (rc_ptr->choice == ESCAPE)
156 rc_ptr->choice = ' ';
157 else if (!get_com(rc_ptr->out_val, &rc_ptr->choice, FALSE))
160 if (use_menu && rc_ptr->choice != ' ') {
161 if (input_racial_technique_selection(creature_ptr, rc_ptr))
164 if (rc_ptr->menu_line > rc_ptr->num)
165 rc_ptr->menu_line -= rc_ptr->num;
168 if ((rc_ptr->choice == ' ') || (rc_ptr->choice == '*') || (rc_ptr->choice == '?') || (use_menu && rc_ptr->ask)) {
169 if (!rc_ptr->redraw || use_menu) {
170 select_racial_power(creature_ptr, rc_ptr);
172 rc_ptr->redraw = FALSE;
180 if (rc_ptr->choice == '\r' && rc_ptr->num == 1)
181 rc_ptr->choice = 'a';
183 if (isalpha(rc_ptr->choice)) {
184 rc_ptr->ask = (isupper(rc_ptr->choice));
186 rc_ptr->choice = (char)tolower(rc_ptr->choice);
188 rc_ptr->command_code = (islower(rc_ptr->choice) ? A2I(rc_ptr->choice) : -1);
191 rc_ptr->command_code = rc_ptr->choice - '0' + 26;
195 if ((rc_ptr->command_code < 0) || (rc_ptr->command_code >= rc_ptr->num)) {
202 (void)strnfmt(tmp_val, 78, _("%sを使いますか? ", "Use %s? "), rc_ptr->power_desc[rc_ptr->command_code].racial_name);
203 if (!get_check(tmp_val))
214 free_turn(creature_ptr);
218 repeat_push(rc_ptr->command_code);
221 switch (racial_aux(creature_ptr, &rc_ptr->power_desc[rc_ptr->command_code])) {
223 if (rc_ptr->power_desc[rc_ptr->command_code].number < 0)
224 rc_ptr->cast = exe_racial_power(creature_ptr, rc_ptr->power_desc[rc_ptr->command_code].number);
226 rc_ptr->cast = exe_mutation_power(creature_ptr, rc_ptr->power_desc[rc_ptr->command_code].number);
230 rc_ptr->cast = FALSE;
238 free_turn(creature_ptr);
242 int racial_cost = rc_ptr->power_desc[rc_ptr->command_code].racial_cost;
243 if (racial_cost == 0)
246 int actual_racial_cost = racial_cost / 2 + randint1(racial_cost / 2);
247 if (creature_ptr->csp >= actual_racial_cost) {
248 creature_ptr->csp -= actual_racial_cost;
250 actual_racial_cost -= creature_ptr->csp;
251 creature_ptr->csp = 0;
252 take_hit(creature_ptr, DAMAGE_USELIFE, actual_racial_cost, _("過度の集中", "concentrating too hard"), -1);
255 creature_ptr->redraw |= PR_HP | PR_MANA;
256 creature_ptr->window |= PW_PLAYER | PW_SPELL;