1 #include "action/racial-execution.h"
2 #include "action/action-limited.h"
3 #include "core/asking-player.h"
4 #include "game-option/disturbance-options.h"
5 #include "racial/racial-switcher.h"
6 #include "racial/racial-util.h"
7 #include "term/screen-processor.h"
8 #include "view/display-messages.h"
11 * @brief レイシャル・パワー発動処理
12 * @param creature_ptr プレーヤーへの参照ポインタ
13 * @param command 発動するレイシャルのID
14 * @return 処理を実際に実行した場合はTRUE、キャンセルした場合FALSEを返す。
16 bool exe_racial_power(player_type *creature_ptr, const s32b command)
19 return switch_class_racial_execution(creature_ptr, command);
21 if (creature_ptr->mimic_form)
22 return switch_mimic_racial_execution(creature_ptr);
24 return switch_race_racial_execution(creature_ptr, command);
28 * @brief レイシャル・パワーの発動成功率を計算する / Returns the chance to activate a racial power/mutation
29 * @param rpi_ptr 発動したいレイシャル・パワー情報の構造体参照ポインタ
32 PERCENTAGE racial_chance(player_type *creature_ptr, rpi_type *rpi_ptr)
34 if ((creature_ptr->lev < rpi_ptr->min_level) || creature_ptr->confused)
37 PERCENTAGE difficulty = rpi_ptr->fail;
41 if (creature_ptr->stun) {
42 difficulty += (PERCENTAGE)creature_ptr->stun;
43 } else if (creature_ptr->lev > rpi_ptr->min_level) {
44 PERCENTAGE lev_adj = (PERCENTAGE)((creature_ptr->lev - rpi_ptr->min_level) / 3);
48 difficulty -= lev_adj;
54 difficulty = difficulty / 2;
55 const BASE_STATUS stat = creature_ptr->stat_cur[rpi_ptr->stat];
57 for (int i = 1; i <= stat; i++) {
58 int val = i - difficulty;
60 sum += (val <= difficulty) ? val : difficulty;
66 return ((sum * 100) / difficulty) / stat;
69 static void adjust_racial_power_difficulty(player_type *creature_ptr, rpi_type *rpi_ptr, int *difficulty)
74 if (creature_ptr->stun) {
75 *difficulty += creature_ptr->stun;
76 } else if (creature_ptr->lev > rpi_ptr->min_level) {
77 int lev_adj = ((creature_ptr->lev - rpi_ptr->min_level) / 3);
80 *difficulty -= lev_adj;
88 * @brief レイシャル・パワーの発動の判定処理
89 * @param rpi_ptr 発動したいレイシャル・パワー情報の構造体参照ポインタ
90 * @return racial_level_check_result
92 racial_level_check_result check_racial_level(player_type *creature_ptr, rpi_type *rpi_ptr)
94 PLAYER_LEVEL min_level = rpi_ptr->min_level;
95 int use_stat = rpi_ptr->stat;
96 int difficulty = rpi_ptr->fail;
98 rpi_ptr->racial_cost = rpi_ptr->cost;
99 if (creature_ptr->csp < rpi_ptr->racial_cost)
100 use_hp = rpi_ptr->racial_cost - creature_ptr->csp;
102 if (creature_ptr->lev < min_level) {
103 msg_format(_("この能力を使用するにはレベル %d に達していなければなりません。", "You need to attain level %d to use this power."), min_level);
104 free_turn(creature_ptr);
105 return RACIAL_CANCEL;
108 if (cmd_limit_confused(creature_ptr)) {
109 free_turn(creature_ptr);
110 return RACIAL_CANCEL;
111 } else if (creature_ptr->chp < use_hp) {
112 if (!get_check(_("本当に今の衰弱した状態でこの能力を使いますか?", "Really use the power in your weakened state? "))) {
113 free_turn(creature_ptr);
114 return RACIAL_CANCEL;
118 adjust_racial_power_difficulty(creature_ptr, rpi_ptr, &difficulty);
119 take_turn(creature_ptr, 100);
120 if (randint1(creature_ptr->stat_cur[use_stat]) >= ((difficulty / 2) + randint1(difficulty / 2)))
121 return RACIAL_SUCCESS;
126 msg_print(_("充分に集中できなかった。", "You've failed to concentrate hard enough."));
127 return RACIAL_FAILURE;