1 #include "player-status/player-speed.h"
2 #include "artifact/fixed-art-types.h"
3 #include "grid/feature-flag-types.h"
4 #include "grid/feature.h"
6 #include "inventory/inventory-slot-types.h"
7 #include "monster-race/monster-race.h"
8 #include "monster/monster-status.h"
9 #include "mutation/mutation-flag-types.h"
10 #include "object-enchant/tr-types.h"
11 #include "object/object-flags.h"
12 #include "player/attack-defense-types.h"
13 #include "player/player-race.h"
14 #include "player/player-skill.h"
15 #include "player/player-status-flags.h"
16 #include "player/player-status.h"
17 #include "player/special-defense-types.h"
18 #include "realm/realm-hex-numbers.h"
19 #include "realm/realm-types.h"
20 #include "spell-realm/spells-hex.h"
21 #include "system/floor-type-definition.h"
22 #include "util/bit-flags-calculator.h"
25 * @brief 速度 - 初期値、下限、上限
31 void PlayerSpeed::set_locals()
33 this->default_value = 110;
35 this->max_value = 209;
36 this->tr_flag = TR_SPEED;
37 this->tr_bad_flag = TR_SPEED;
44 * ** クラッコンと妖精に加算(+レベル/10)
45 * ** 悪魔変化/吸血鬼変化で加算(+3)
47 * ** マーフォークがFF_WATER地形にいれば加算(+2+レベル/10)
48 * ** そうでなく浮遊を持っていないなら減算(-2)
50 s16b PlayerSpeed::race_value()
54 if (is_specific_player_race(this->owner_ptr, RACE_KLACKON) || is_specific_player_race(this->owner_ptr, RACE_SPRITE))
55 result += (this->owner_ptr->lev) / 10;
57 if (is_specific_player_race(this->owner_ptr, RACE_MERFOLK)) {
58 floor_type *floor_ptr = this->owner_ptr->current_floor_ptr;
59 feature_type *f_ptr = &f_info[floor_ptr->grid_array[this->owner_ptr->y][this->owner_ptr->x].feat];
60 if (has_flag(f_ptr->flags, FF_WATER)) {
61 result += (2 + this->owner_ptr->lev / 10);
62 } else if (!this->owner_ptr->levitation) {
67 if (this->owner_ptr->mimic_form) {
68 switch (this->owner_ptr->mimic_form) {
72 case MIMIC_DEMON_LORD:
87 * ** 忍者の装備が重ければ減算(-レベル/10)
88 * ** 忍者の装備が適正ならば加算(+3)さらにクラッコン、妖精、いかさま以外なら加算(+レベル/10)
89 * ** 錬気術師で装備が重くなくクラッコン、妖精、いかさま以外なら加算(+レベル/10)
90 * ** 狂戦士なら加算(+3),レベル20/30/40/50ごとに+1
92 s16b PlayerSpeed::class_value()
96 if (this->owner_ptr->pclass == CLASS_NINJA) {
97 if (heavy_armor(this->owner_ptr)) {
98 result -= (this->owner_ptr->lev) / 10;
99 } else if ((!this->owner_ptr->inventory_list[INVEN_MAIN_HAND].k_idx || can_attack_with_main_hand(this->owner_ptr))
100 && (!this->owner_ptr->inventory_list[INVEN_SUB_HAND].k_idx || can_attack_with_sub_hand(this->owner_ptr))) {
102 if (!(is_specific_player_race(this->owner_ptr, RACE_KLACKON) || is_specific_player_race(this->owner_ptr, RACE_SPRITE)
103 || (this->owner_ptr->pseikaku == PERSONALITY_MUNCHKIN)))
104 result += (this->owner_ptr->lev) / 10;
108 if ((this->owner_ptr->pclass == CLASS_MONK || this->owner_ptr->pclass == CLASS_FORCETRAINER) && !(heavy_armor(this->owner_ptr))) {
109 if (!(is_specific_player_race(this->owner_ptr, RACE_KLACKON) || is_specific_player_race(this->owner_ptr, RACE_SPRITE)
110 || (this->owner_ptr->pseikaku == PERSONALITY_MUNCHKIN)))
111 result += (this->owner_ptr->lev) / 10;
114 if (this->owner_ptr->pclass == CLASS_BERSERKER) {
116 if (this->owner_ptr->lev > 29)
118 if (this->owner_ptr->lev > 39)
120 if (this->owner_ptr->lev > 44)
122 if (this->owner_ptr->lev > 49)
132 * ** いかさまでクラッコン/妖精以外なら加算(+5+レベル/10)
134 s16b PlayerSpeed::personality_value()
137 if (this->owner_ptr->pseikaku == PERSONALITY_MUNCHKIN && this->owner_ptr->prace != RACE_KLACKON && this->owner_ptr->prace != RACE_SPRITE) {
138 result += (this->owner_ptr->lev) / 10 + 5;
144 * @brief 速度計算 - 装備品特殊セット
147 * ** 棘セット装備中ならば加算(+7)
148 * ** アイシングデス-トゥインクル装備中ならば加算(+7)
150 s16b PlayerSpeed::special_weapon_set_value()
153 if (has_melee_weapon(this->owner_ptr, INVEN_MAIN_HAND) && has_melee_weapon(this->owner_ptr, INVEN_SUB_HAND)) {
154 if ((this->owner_ptr->inventory_list[INVEN_MAIN_HAND].name1 == ART_QUICKTHORN)
155 && (this->owner_ptr->inventory_list[INVEN_SUB_HAND].name1 == ART_TINYTHORN)) {
159 if ((this->owner_ptr->inventory_list[INVEN_MAIN_HAND].name1 == ART_ICINGDEATH)
160 && (this->owner_ptr->inventory_list[INVEN_SUB_HAND].name1 == ART_TWINKLE)) {
171 * ** 装備品にTR_SPEEDがあれば加算(+pval+1
172 * ** セットで加速増減があるものを計算
174 s16b PlayerSpeed::equipments_value()
176 s16b result = PlayerStatusBase::equipments_value();
177 result += this->special_weapon_set_value();
183 * @brief 速度計算 - 一時的効果
188 * ** 呪術「衝撃のクローク」で加算(+3)
190 * ** 光速移動中は+999(最終的に+99になる)
192 s16b PlayerSpeed::time_effect_value()
196 if (is_fast(this->owner_ptr)) {
200 if (this->owner_ptr->slow) {
204 if (this->owner_ptr->realm1 == REALM_HEX) {
205 if (hex_spelling(this->owner_ptr, HEX_SHOCK_CLOAK)) {
210 if (this->owner_ptr->food >= PY_FOOD_MAX)
213 /* Temporary lightspeed forces to be maximum speed */
214 if (this->owner_ptr->lightspeed)
226 s16b PlayerSpeed::battleform_value()
229 if (any_bits(this->owner_ptr->special_defense, KAMAE_SUZAKU))
238 * ** 変異MUT3_XTRA_FATなら減算(-2)
239 * ** 変異MUT3_XTRA_LEGなら加算(+3)
240 * ** 変異MUT3_SHORT_LEGなら減算(-3)
242 s16b PlayerSpeed::mutation_value()
245 if (this->owner_ptr->muta3) {
246 if (any_bits(this->owner_ptr->muta3, MUT3_XTRA_FAT)) {
250 if (any_bits(this->owner_ptr->muta3, MUT3_XTRA_LEGS)) {
254 if (any_bits(this->owner_ptr->muta3, MUT3_SHORT_LEG)) {
265 * * 騎乗中ならばモンスターの加速に準拠、ただし騎乗技能値とモンスターレベルによるキャップ処理あり
267 s16b PlayerSpeed::riding_value()
269 monster_type *riding_m_ptr = &(this->owner_ptr)->current_floor_ptr->m_list[this->owner_ptr->riding];
270 SPEED speed = riding_m_ptr->mspeed;
273 if (!this->owner_ptr->riding) {
277 if (riding_m_ptr->mspeed > 110) {
278 result = (s16b)((speed - 110) * (this->owner_ptr->skill_exp[GINOU_RIDING] * 3 + this->owner_ptr->lev * 160L - 10000L) / (22000L));
282 result = speed - 110;
285 result += (this->owner_ptr->skill_exp[GINOU_RIDING] + this->owner_ptr->lev * 160L) / 3200;
287 if (monster_fast_remaining(riding_m_ptr))
289 if (monster_slow_remaining(riding_m_ptr))
299 * * 所持品の重量による減速処理。乗馬時は別計算。
301 s16b PlayerSpeed::inventory_weight_value()
305 int weight = calc_inventory_weight(this->owner_ptr);
308 if (this->owner_ptr->riding) {
309 monster_type *riding_m_ptr = &(this->owner_ptr)->current_floor_ptr->m_list[this->owner_ptr->riding];
310 monster_race *riding_r_ptr = &r_info[riding_m_ptr->r_idx];
311 count = 1500 + riding_r_ptr->level * 25;
313 if (this->owner_ptr->skill_exp[GINOU_RIDING] < RIDING_EXP_SKILLED) {
314 weight += (this->owner_ptr->wt * 3 * (RIDING_EXP_SKILLED - this->owner_ptr->skill_exp[GINOU_RIDING])) / RIDING_EXP_SKILLED;
317 if (weight > count) {
318 result -= ((weight - count) / (count / 5));
321 count = (int)calc_weight_limit(this->owner_ptr);
322 if (weight > count) {
323 result -= ((weight - count) / (count / 5));
330 * @brief 速度計算 - ACTION
335 s16b PlayerSpeed::action_value()
338 if (this->owner_ptr->action == ACTION_SEARCH)
345 * @return 加速修正が0でない装備に対応したBIT_FLAG
347 * * セット二刀流は両手のフラグをONにする
349 BIT_FLAGS PlayerSpeed::equipments_flags(tr_type check_flag)
351 BIT_FLAGS result = PlayerStatusBase::equipments_flags(check_flag);
353 if (this->special_weapon_set_value() != 0)
354 set_bits(result, FLAG_CAUSE_INVEN_MAIN_HAND | FLAG_CAUSE_INVEN_SUB_HAND);
360 * @brief 速度計算 - 乗馬時の例外処理
363 * * 非乗馬時 - ここまでの修正値合算をそのまま使用
364 * * 乗馬時 - 乗馬の速度と重量減衰のみを計算
366 s16b PlayerSpeed::set_exception_value(s16b value)
368 if (this->owner_ptr->riding) {
369 value = this->default_value;
370 value += this->riding_value();
371 value += this->inventory_weight_value();