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"
20 s16b PlayerStealth::race_value()
22 const player_race *tmp_rp_ptr;
24 if (this->owner_ptr->mimic_form)
25 tmp_rp_ptr = &mimic_info[this->owner_ptr->mimic_form];
27 tmp_rp_ptr = &race_info[this->owner_ptr->prace];
29 return tmp_rp_ptr->r_stl;
38 s16b PlayerStealth::personality_value()
40 const player_personality *a_ptr = &personality_info[this->owner_ptr->pseikaku];
45 * @brief 隠密能力計算 - 職業(基礎値)
50 s16b PlayerStealth::class_base_value()
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);
57 * @brief 隠密能力計算 - 職業(追加分)
60 * * 忍者がheavy_armorならば減算(-レベル/10)
61 * * 忍者がheavy_armorでなく適正な武器を持っていれば加算(+レベル/10)
63 s16b PlayerStealth::class_value()
65 ACTION_SKILL_POWER result = 0;
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;
83 * * 変異MUT3_XTRA_NOISで減算(-3)
84 * * 変異MUT3_MOTIONで加算(+1)
86 s16b PlayerStealth::mutation_value()
89 if (any_bits(this->owner_ptr->muta3, MUT3_XTRA_NOIS)) {
92 if (any_bits(this->owner_ptr->muta3, MUT3_MOTION)) {
99 * @brief 隠密能力計算 - 一時効果
102 * * 呪術を唱えていると減算(-(詠唱数+1))
106 s16b PlayerStealth::time_effect_value()
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));
113 if (is_shero(this->owner_ptr)) {
116 if (is_time_limit_stealth(this->owner_ptr))
122 bool PlayerStealth::is_aggravated_s_fairy()
124 return player_aggravate_state(this->owner_ptr) == AGGRAVATE_S_FAIRY;
128 * @brief 隠密能力計算 - 影フェアリー反感時の例外処理
131 * * セクシーギャルでない影フェアリーがTRC_AGGRAVATE持ちの時、別処理でTRC_AGGRAVATEを無効にする代わりに減算(-3か3未満なら(現在値+2)/2)
133 s16b PlayerStealth::set_exception_value(s16b value)
135 if (this->is_aggravated_s_fairy()) {
136 value = MIN(value - 3, (value + 2) / 2);
143 * @return マイナスフラグの集合体
145 * * TR_STELATHがマイナスの要素に加え、種族影フェアリーかつ反感のとき種族にマイナスフラグを与える
147 BIT_FLAGS PlayerStealth::getBadFlags()
149 BIT_FLAGS result = PlayerStatusBase::getBadFlags();
151 if (this->is_aggravated_s_fairy())
152 set_bits(result, FLAG_CAUSE_RACE);
158 * @brief 隠密値の上限と下限の設定
163 void PlayerStealth::set_locals()
165 this->default_value = 1;
167 this->max_value = 30;
168 this->tr_flag = TR_STEALTH;
169 this->tr_bad_flag = TR_STEALTH;