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 "system/monster-race-definition.h"
23 #include "system/monster-type-definition.h"
24 #include "system/object-type-definition.h"
25 #include "system/player-type-definition.h"
26 #include "util/bit-flags-calculator.h"
29 * @brief 速度 - 初期値、下限、上限
35 void PlayerSpeed::set_locals()
37 this->default_value = 110;
39 this->max_value = 209;
40 this->tr_flag = TR_SPEED;
41 this->tr_bad_flag = TR_SPEED;
48 * ** クラッコンと妖精に加算(+レベル/10)
49 * ** 悪魔変化/吸血鬼変化で加算(+3)
51 * ** マーフォークがFF_WATER地形にいれば加算(+2+レベル/10)
52 * ** そうでなく浮遊を持っていないなら減算(-2)
54 s16b PlayerSpeed::race_value()
58 if (is_specific_player_race(this->owner_ptr, RACE_KLACKON) || is_specific_player_race(this->owner_ptr, RACE_SPRITE))
59 result += (this->owner_ptr->lev) / 10;
61 if (is_specific_player_race(this->owner_ptr, RACE_MERFOLK)) {
62 floor_type *floor_ptr = this->owner_ptr->current_floor_ptr;
63 feature_type *f_ptr = &f_info[floor_ptr->grid_array[this->owner_ptr->y][this->owner_ptr->x].feat];
64 if (has_flag(f_ptr->flags, FF_WATER)) {
65 result += (2 + this->owner_ptr->lev / 10);
66 } else if (!this->owner_ptr->levitation) {
71 if (this->owner_ptr->mimic_form) {
72 switch (this->owner_ptr->mimic_form) {
76 case MIMIC_DEMON_LORD:
91 * ** 忍者の装備が重ければ減算(-レベル/10)
92 * ** 忍者の装備が適正ならば加算(+3)さらにクラッコン、妖精、いかさま以外なら加算(+レベル/10)
93 * ** 錬気術師で装備が重くなくクラッコン、妖精、いかさま以外なら加算(+レベル/10)
94 * ** 狂戦士なら加算(+3),レベル20/30/40/50ごとに+1
96 s16b PlayerSpeed::class_value()
100 if (this->owner_ptr->pclass == CLASS_NINJA) {
101 if (heavy_armor(this->owner_ptr)) {
102 result -= (this->owner_ptr->lev) / 10;
103 } else if ((!this->owner_ptr->inventory_list[INVEN_MAIN_HAND].k_idx || can_attack_with_main_hand(this->owner_ptr))
104 && (!this->owner_ptr->inventory_list[INVEN_SUB_HAND].k_idx || can_attack_with_sub_hand(this->owner_ptr))) {
106 if (!(is_specific_player_race(this->owner_ptr, RACE_KLACKON) || is_specific_player_race(this->owner_ptr, RACE_SPRITE)
107 || (this->owner_ptr->pseikaku == PERSONALITY_MUNCHKIN)))
108 result += (this->owner_ptr->lev) / 10;
112 if ((this->owner_ptr->pclass == CLASS_MONK || this->owner_ptr->pclass == CLASS_FORCETRAINER) && !(heavy_armor(this->owner_ptr))) {
113 if (!(is_specific_player_race(this->owner_ptr, RACE_KLACKON) || is_specific_player_race(this->owner_ptr, RACE_SPRITE)
114 || (this->owner_ptr->pseikaku == PERSONALITY_MUNCHKIN)))
115 result += (this->owner_ptr->lev) / 10;
118 if (this->owner_ptr->pclass == CLASS_BERSERKER) {
120 if (this->owner_ptr->lev > 29)
122 if (this->owner_ptr->lev > 39)
124 if (this->owner_ptr->lev > 44)
126 if (this->owner_ptr->lev > 49)
136 * ** いかさまでクラッコン/妖精以外なら加算(+5+レベル/10)
138 s16b PlayerSpeed::personality_value()
141 if (this->owner_ptr->pseikaku == PERSONALITY_MUNCHKIN && this->owner_ptr->prace != RACE_KLACKON && this->owner_ptr->prace != RACE_SPRITE) {
142 result += (this->owner_ptr->lev) / 10 + 5;
148 * @brief 速度計算 - 装備品特殊セット
151 * ** 棘セット装備中ならば加算(+7)
152 * ** アイシングデス-トゥインクル装備中ならば加算(+7)
154 s16b PlayerSpeed::special_weapon_set_value()
157 if (has_melee_weapon(this->owner_ptr, INVEN_MAIN_HAND) && has_melee_weapon(this->owner_ptr, INVEN_SUB_HAND)) {
158 if ((this->owner_ptr->inventory_list[INVEN_MAIN_HAND].name1 == ART_QUICKTHORN)
159 && (this->owner_ptr->inventory_list[INVEN_SUB_HAND].name1 == ART_TINYTHORN)) {
163 if ((this->owner_ptr->inventory_list[INVEN_MAIN_HAND].name1 == ART_ICINGDEATH)
164 && (this->owner_ptr->inventory_list[INVEN_SUB_HAND].name1 == ART_TWINKLE)) {
175 * ** 装備品にTR_SPEEDがあれば加算(+pval+1
176 * ** セットで加速増減があるものを計算
178 s16b PlayerSpeed::equipments_value()
180 s16b result = PlayerStatusBase::equipments_value();
181 result += this->special_weapon_set_value();
187 * @brief 速度計算 - 一時的効果
192 * ** 呪術「衝撃のクローク」で加算(+3)
194 * ** 光速移動中は+999(最終的に+99になる)
196 s16b PlayerSpeed::time_effect_value()
200 if (is_fast(this->owner_ptr)) {
204 if (this->owner_ptr->slow) {
208 if (this->owner_ptr->realm1 == REALM_HEX) {
209 if (hex_spelling(this->owner_ptr, HEX_SHOCK_CLOAK)) {
214 if (this->owner_ptr->food >= PY_FOOD_MAX)
217 /* Temporary lightspeed forces to be maximum speed */
218 if (this->owner_ptr->lightspeed)
230 s16b PlayerSpeed::battleform_value()
233 if (any_bits(this->owner_ptr->special_defense, KAMAE_SUZAKU))
242 * ** 変異MUT3_XTRA_FATなら減算(-2)
243 * ** 変異MUT3_XTRA_LEGなら加算(+3)
244 * ** 変異MUT3_SHORT_LEGなら減算(-3)
246 s16b PlayerSpeed::mutation_value()
250 const auto &muta = this->owner_ptr->muta;
251 if (muta.has(MUTA::XTRA_FAT)) {
255 if (muta.has(MUTA::XTRA_LEGS)) {
259 if (muta.has(MUTA::SHORT_LEG)) {
270 * * 騎乗中ならばモンスターの加速に準拠、ただし騎乗技能値とモンスターレベルによるキャップ処理あり
272 s16b PlayerSpeed::riding_value()
274 monster_type *riding_m_ptr = &(this->owner_ptr)->current_floor_ptr->m_list[this->owner_ptr->riding];
275 SPEED speed = riding_m_ptr->mspeed;
278 if (!this->owner_ptr->riding) {
282 if (riding_m_ptr->mspeed > 110) {
283 result = (s16b)((speed - 110) * (this->owner_ptr->skill_exp[GINOU_RIDING] * 3 + this->owner_ptr->lev * 160L - 10000L) / (22000L));
287 result = speed - 110;
290 result += (this->owner_ptr->skill_exp[GINOU_RIDING] + this->owner_ptr->lev * 160L) / 3200;
292 if (monster_fast_remaining(riding_m_ptr))
294 if (monster_slow_remaining(riding_m_ptr))
304 * * 所持品の重量による減速処理。乗馬時は別計算。
306 s16b PlayerSpeed::inventory_weight_value()
310 int weight = calc_inventory_weight(this->owner_ptr);
313 if (this->owner_ptr->riding) {
314 monster_type *riding_m_ptr = &(this->owner_ptr)->current_floor_ptr->m_list[this->owner_ptr->riding];
315 monster_race *riding_r_ptr = &r_info[riding_m_ptr->r_idx];
316 count = 1500 + riding_r_ptr->level * 25;
318 if (this->owner_ptr->skill_exp[GINOU_RIDING] < RIDING_EXP_SKILLED) {
319 weight += (this->owner_ptr->wt * 3 * (RIDING_EXP_SKILLED - this->owner_ptr->skill_exp[GINOU_RIDING])) / RIDING_EXP_SKILLED;
322 if (weight > count) {
323 result -= ((weight - count) / (count / 5));
326 count = (int)calc_weight_limit(this->owner_ptr);
327 if (weight > count) {
328 result -= ((weight - count) / (count / 5));
335 * @brief 速度計算 - ACTION
340 s16b PlayerSpeed::action_value()
343 if (this->owner_ptr->action == ACTION_SEARCH)
350 * @return 加速修正が0でない装備に対応したBIT_FLAG
352 * * セット二刀流は両手のフラグをONにする
354 BIT_FLAGS PlayerSpeed::equipments_flags(tr_type check_flag)
356 BIT_FLAGS result = PlayerStatusBase::equipments_flags(check_flag);
358 if (this->special_weapon_set_value() != 0)
359 set_bits(result, FLAG_CAUSE_INVEN_MAIN_HAND | FLAG_CAUSE_INVEN_SUB_HAND);
365 * @brief 速度計算 - 乗馬時の例外処理
368 * * 非乗馬時 - ここまでの修正値合算をそのまま使用
369 * * 乗馬時 - 乗馬の速度と重量減衰のみを計算
371 s16b PlayerSpeed::set_exception_value(s16b value)
373 if (this->owner_ptr->riding) {
374 value = this->default_value;
375 value += this->riding_value();
376 value += this->inventory_weight_value();
377 value += this->action_value();