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;
66 * @brief レイシャル・パワーコマンドのメインルーチン / Allow user to choose a power (racial / mutation) to activate
67 * @param creature_ptr プレーヤーへの参照ポインタ
70 void do_cmd_racial_power(player_type *creature_ptr)
72 if (creature_ptr->wild_mode)
75 if (cmd_limit_confused(creature_ptr)) {
76 free_turn(creature_ptr);
80 if (creature_ptr->special_defense & (KATA_MUSOU | KATA_KOUKIJIN))
81 set_action(creature_ptr, ACTION_NONE);
84 rc_type *rc_ptr = initialize_rc_type(creature_ptr, &tmp_rc);
85 switch_class_racial(creature_ptr, rc_ptr);
86 if (creature_ptr->mimic_form)
87 switch_mimic_racial(creature_ptr, rc_ptr);
89 switch_race_racial(creature_ptr, rc_ptr);
91 select_mutation_racial(creature_ptr, rc_ptr);
93 rc_ptr->redraw = FALSE;
95 (void)strnfmt(rc_ptr->out_val, 78,
96 _("(特殊能力 %c-%c, *'で一覧, ESCで中断) どの特殊能力を使いますか?", "(Powers %c-%c, *=List, ESC=exit) Use which power? "),
97 I2A(0), (rc_ptr->num <= 26) ? I2A(rc_ptr->num - 1) : '0' + rc_ptr->num - 27);
99 if (!repeat_pull(&rc_ptr->command_code) || rc_ptr->command_code < 0 || rc_ptr->command_code >= rc_ptr->num) {
103 rc_ptr->choice = (always_show_list || use_menu) ? ESCAPE : 1;
104 while (!rc_ptr->flag) {
105 if (rc_ptr->choice == ESCAPE)
106 rc_ptr->choice = ' ';
107 else if (!get_com(rc_ptr->out_val, &rc_ptr->choice, FALSE))
110 if (use_menu && rc_ptr->choice != ' ') {
111 if (input_racial_technique_selection(creature_ptr, rc_ptr))
114 if (rc_ptr->menu_line > rc_ptr->num)
115 rc_ptr->menu_line -= rc_ptr->num;
118 if ((rc_ptr->choice == ' ') || (rc_ptr->choice == '*') || (rc_ptr->choice == '?') || (use_menu && rc_ptr->ask)) {
119 if (!rc_ptr->redraw || use_menu) {
125 rc_ptr->redraw = TRUE;
129 if (rc_ptr->num < 18)
130 prt(_(" Lv MP 失率", " Lv Cost Fail"), y++, x);
132 prt(_(" Lv MP 失率 Lv MP 失率",
133 " Lv Cost Fail Lv Cost Fail"),
136 while (ctr < rc_ptr->num) {
137 TERM_LEN x1 = ((ctr < 18) ? x : x + 40);
138 TERM_LEN y1 = ((ctr < 18) ? y + ctr : y + ctr - 18);
140 if (ctr == (rc_ptr->menu_line - 1))
141 strcpy(dummy, _(" 》 ", " > "));
149 letter = '0' + ctr - 26;
150 sprintf(dummy, " %c) ", letter);
154 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,
155 100 - racial_chance(creature_ptr, &rc_ptr->power_desc[ctr])));
160 rc_ptr->redraw = FALSE;
168 if (rc_ptr->choice == '\r' && rc_ptr->num == 1)
169 rc_ptr->choice = 'a';
171 if (isalpha(rc_ptr->choice)) {
172 rc_ptr->ask = (isupper(rc_ptr->choice));
174 rc_ptr->choice = (char)tolower(rc_ptr->choice);
176 rc_ptr->command_code = (islower(rc_ptr->choice) ? A2I(rc_ptr->choice) : -1);
179 rc_ptr->command_code = rc_ptr->choice - '0' + 26;
183 if ((rc_ptr->command_code < 0) || (rc_ptr->command_code >= rc_ptr->num)) {
190 (void)strnfmt(tmp_val, 78, _("%sを使いますか? ", "Use %s? "), rc_ptr->power_desc[rc_ptr->command_code].racial_name);
191 if (!get_check(tmp_val))
202 free_turn(creature_ptr);
206 repeat_push(rc_ptr->command_code);
209 switch (racial_aux(creature_ptr, &rc_ptr->power_desc[rc_ptr->command_code])) {
211 if (rc_ptr->power_desc[rc_ptr->command_code].number < 0)
212 rc_ptr->cast = exe_racial_power(creature_ptr, rc_ptr->power_desc[rc_ptr->command_code].number);
214 rc_ptr->cast = exe_mutation_power(creature_ptr, rc_ptr->power_desc[rc_ptr->command_code].number);
217 rc_ptr->cast = FALSE;
225 free_turn(creature_ptr);
229 int racial_cost = rc_ptr->power_desc[rc_ptr->command_code].racial_cost;
230 if (racial_cost == 0)
233 int actual_racial_cost = racial_cost / 2 + randint1(racial_cost / 2);
234 if (creature_ptr->csp < actual_racial_cost) {
235 actual_racial_cost -= creature_ptr->csp;
236 creature_ptr->csp = 0;
237 take_hit(creature_ptr, DAMAGE_USELIFE, actual_racial_cost, _("過度の集中", "concentrating too hard"), -1);
239 creature_ptr->csp -= actual_racial_cost;
241 creature_ptr->redraw |= PR_HP | PR_MANA;
242 creature_ptr->window |= PW_PLAYER | PW_SPELL;