OSDN Git Service

Merge pull request #513 from iks3/fix-sub-window-item-on-floor
[hengbandforosx/hengbandosx.git] / src / player-status / player-stealth.cpp
1 #include "player-status/player-stealth.h"
2 #include "mind/mind-ninja.h"
3 #include "mutation/mutation-flag-types.h"
4 #include "player/mimic-info-table.h"
5 #include "player/player-class.h"
6 #include "player/player-personality.h"
7 #include "player/player-race-types.h"
8 #include "player/player-skill.h"
9 #include "player/player-status-flags.h"
10 #include "player/race-info-table.h"
11 #include "spell-realm/spells-hex.h"
12 #include "util/bit-flags-calculator.h"
13
14 /*!
15  * @brief 隠密能力計算 - 種族
16  * @return 隠密能力の増分
17  * @details
18  * * 種族による加算
19  */
20 s16b PlayerStealth::race_value()
21 {
22     const player_race *tmp_rp_ptr;
23
24     if (this->owner_ptr->mimic_form)
25         tmp_rp_ptr = &mimic_info[this->owner_ptr->mimic_form];
26     else
27         tmp_rp_ptr = &race_info[this->owner_ptr->prace];
28
29     return tmp_rp_ptr->r_stl;
30 }
31
32 /*!
33  * @brief 隠密能力計算 - 性格
34  * @return 隠密能力の増分
35  * @details
36  * * 性格による加算
37  */
38 s16b PlayerStealth::personality_value()
39 {
40     const player_personality *a_ptr = &personality_info[this->owner_ptr->pseikaku];
41     return a_ptr->a_stl;
42 }
43
44 /*!
45  * @brief 隠密能力計算 - 職業(基礎値)
46  * @return 隠密能力の増分
47  * @details
48  * * 職業による加算
49  */
50 s16b PlayerStealth::class_base_value()
51 {
52     const player_class *c_ptr = &class_info[this->owner_ptr->pclass];
53     return c_ptr->c_stl + (c_ptr->x_stl * this->owner_ptr->lev / 10);
54 }
55
56 /*!
57  * @brief 隠密能力計算 - 職業(追加分)
58  * @return 隠密能力の増分
59  * @details
60  * * 忍者がheavy_armorならば減算(-レベル/10)
61  * * 忍者がheavy_armorでなく適正な武器を持っていれば加算(+レベル/10)
62  */
63 s16b PlayerStealth::class_value()
64 {
65     ACTION_SKILL_POWER result = 0;
66
67     if (this->owner_ptr->pclass == CLASS_NINJA) {
68         if (heavy_armor(this->owner_ptr)) {
69             result -= (this->owner_ptr->lev) / 10;
70         } else if ((!this->owner_ptr->inventory_list[INVEN_MAIN_HAND].k_idx || can_attack_with_main_hand(this->owner_ptr))
71             && (!this->owner_ptr->inventory_list[INVEN_SUB_HAND].k_idx || can_attack_with_sub_hand(this->owner_ptr))) {
72             result += (this->owner_ptr->lev) / 10;
73         }
74     }
75
76     return result;
77 }
78
79 /*!
80  * @brief 隠密能力計算 - 変異
81  * @return 隠密能力の増分
82  * @details
83  * * 変異MUT3_XTRA_NOISで減算(-3)
84  * * 変異MUT3_MOTIONで加算(+1)
85  */
86 s16b PlayerStealth::mutation_value()
87 {
88     s16b result = 0;
89     if (any_bits(this->owner_ptr->muta3, MUT3_XTRA_NOIS)) {
90         result -= 3;
91     }
92     if (any_bits(this->owner_ptr->muta3, MUT3_MOTION)) {
93         result += 1;
94     }
95     return result;
96 }
97
98 /*!
99  * @brief 隠密能力計算 - 一時効果
100  * @return 隠密能力の増分
101  * @details
102  * * 呪術を唱えていると減算(-(詠唱数+1))
103  * * 狂戦士化で減算(-7)
104  * * 隠密の歌で加算(+999)
105  */
106 s16b PlayerStealth::time_effect_value()
107 {
108     s16b result = 0;
109     if (this->owner_ptr->realm1 == REALM_HEX) {
110         if (hex_spelling_any(this->owner_ptr))
111             result -= (1 + casting_hex_num(this->owner_ptr));
112     }
113     if (is_shero(this->owner_ptr)) {
114         result -= 7;
115     }
116     if (is_time_limit_stealth(this->owner_ptr))
117         result += 999;
118
119     return result;
120 }
121
122 bool PlayerStealth::is_aggravated_s_fairy()
123 {
124     return player_aggravate_state(this->owner_ptr) == AGGRAVATE_S_FAIRY;
125 }
126
127 /*!
128  * @brief 隠密能力計算 - 影フェアリー反感時の例外処理
129  * @return 修正後の隠密能力
130  * @details
131  * * セクシーギャルでない影フェアリーがTRC_AGGRAVATE持ちの時、別処理でTRC_AGGRAVATEを無効にする代わりに減算(-3か3未満なら(現在値+2)/2)
132  */
133 s16b PlayerStealth::set_exception_value(s16b value)
134 {
135     if (this->is_aggravated_s_fairy()) {
136         value = MIN(value - 3, (value + 2) / 2);
137     }
138     return value;
139 }
140
141 /*!
142  * @brief 隠密マイナスフラグ判定
143  * @return マイナスフラグの集合体
144  * @details
145  * * TR_STELATHがマイナスの要素に加え、種族影フェアリーかつ反感のとき種族にマイナスフラグを与える
146  */
147 BIT_FLAGS PlayerStealth::getBadFlags()
148 {
149     BIT_FLAGS result = PlayerStatusBase::getBadFlags();
150
151     if (this->is_aggravated_s_fairy())
152         set_bits(result, FLAG_CAUSE_RACE);
153
154     return result;
155 }
156
157 /*!
158  * @brief 隠密値の上限と下限の設定
159  * @details
160  * * 初期値1
161  * * 最大30、最低0に補正
162  */
163 void PlayerStealth::set_locals()
164 {
165     this->default_value = 1;
166     this->min_value = 0;
167     this->max_value = 30;
168     this->tr_flag = TR_STEALTH;
169     this->tr_bad_flag = TR_STEALTH;
170 }