OSDN Git Service

[Implement] 一週間以上前のデバッグログの自動削除
[hengband/hengband.git] / src / action / racial-execution.c
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"
9
10 /*!
11  * @brief レイシャル・パワー発動処理
12  * @param creature_ptr プレーヤーへの参照ポインタ
13  * @param command 発動するレイシャルのID
14  * @return 処理を実際に実行した場合はTRUE、キャンセルした場合FALSEを返す。
15  */
16 bool exe_racial_power(player_type *creature_ptr, const s32b command)
17 {
18     if (command <= -3)
19         return switch_class_racial_execution(creature_ptr, command);
20
21     if (creature_ptr->mimic_form)
22         return switch_mimic_racial_execution(creature_ptr);
23
24     return switch_race_racial_execution(creature_ptr, command);
25 }
26
27 /*!
28  * @brief レイシャル・パワーの発動成功率を計算する / Returns the chance to activate a racial power/mutation
29  * @param rpi_ptr 発動したいレイシャル・パワー情報の構造体参照ポインタ
30  * @return 成功率(%)を返す
31  */
32 PERCENTAGE racial_chance(player_type *creature_ptr, rpi_type *rpi_ptr)
33 {
34     if ((creature_ptr->lev < rpi_ptr->min_level) || creature_ptr->confused)
35         return 0;
36
37     PERCENTAGE difficulty = rpi_ptr->fail;
38     if (difficulty == 0)
39         return 100;
40
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);
45         if (lev_adj > 10)
46             lev_adj = 10;
47
48         difficulty -= lev_adj;
49     }
50
51     if (difficulty < 5)
52         difficulty = 5;
53
54     difficulty = difficulty / 2;
55     const BASE_STATUS stat = creature_ptr->stat_cur[rpi_ptr->stat];
56     int sum = 0;
57     for (int i = 1; i <= stat; i++) {
58         int val = i - difficulty;
59         if (val > 0)
60             sum += (val <= difficulty) ? val : difficulty;
61     }
62
63     if (difficulty == 0)
64         return 100;
65     else
66         return ((sum * 100) / difficulty) / stat;
67 }
68
69 static void adjust_racial_power_difficulty(player_type *creature_ptr, rpi_type *rpi_ptr, int *difficulty)
70 {
71     if (*difficulty == 0)
72         return;
73
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);
78         if (lev_adj > 10)
79             lev_adj = 10;
80         *difficulty -= lev_adj;
81     }
82
83     if (*difficulty < 5)
84         *difficulty = 5;
85 }
86
87 /*!
88  * @brief レイシャル・パワーの発動の判定処理
89  * @param rpi_ptr 発動したいレイシャル・パワー情報の構造体参照ポインタ
90  * @return racial_level_check_result
91  */
92 racial_level_check_result check_racial_level(player_type *creature_ptr, rpi_type *rpi_ptr)
93 {
94     PLAYER_LEVEL min_level = rpi_ptr->min_level;
95     int use_stat = rpi_ptr->stat;
96     int difficulty = rpi_ptr->fail;
97     int use_hp = 0;
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;
101
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;
106     }
107
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;
115         }
116     }
117
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;
122
123     if (flush_failure)
124         flush();
125
126     msg_print(_("充分に集中できなかった。", "You've failed to concentrate hard enough."));
127     return RACIAL_FAILURE;
128 }