OSDN Git Service

[Fix] #41264 WIP,calc_to_damage()再整理中.
[hengband/hengband.git] / src / player / player-status.c
index 55646cc..9da4d6b 100644 (file)
@@ -1,7 +1,5 @@
 #include "player/player-status.h"
-#include "art-definition/art-bow-types.h"
-#include "art-definition/art-sword-types.h"
-#include "art-definition/art-weapon-types.h"
+#include "artifact/fixed-art-types.h"
 #include "autopick/autopick-reader-writer.h"
 #include "autopick/autopick.h"
 #include "cmd-action/cmd-pet.h"
@@ -16,7 +14,6 @@
 #include "core/window-redrawer.h"
 #include "dungeon/dungeon-flag-types.h"
 #include "dungeon/dungeon.h"
-//#include "dungeon/quest.h"
 #include "effect/effect-characteristics.h"
 #include "floor/cave.h"
 #include "floor/floor-events.h"
@@ -148,18 +145,20 @@ static int get_default_hand(player_type *creature_ptr);
 
 /*** Player information ***/
 
-/*
- * Static player info record
+/*!
+ * @brief プレイヤー用のクリーチャー構造体実体 / Static player info record
  */
 player_type p_body;
 
-/*
- * Pointer to the player info
+/*!
+ * @brief プレイヤー用のクリーチャー構造体参照ポインタ / Pointer to the player info
  */
 player_type *p_ptr = &p_body;
 
-/*
- * Return alignment title
+/*!
+ * @brief クリーチャーの抽象的善悪アライメントの表記を返す。 / Return alignment title
+ * @param creature_ptr 算出するクリーチャーの参照ポインタ。
+ * @return アライメントの表記を返す。
  */
 concptr your_alignment(player_type *creature_ptr)
 {
@@ -179,8 +178,10 @@ concptr your_alignment(player_type *creature_ptr)
         return _("大悪", "Chaotic");
 }
 
-/*
- * Return proficiency level of weapons and misc. skills (except riding)
+/*!
+ * @brief 武器や各種スキル(騎乗以外)の抽象的表現ランクを返す。 /  Return proficiency level of weapons and misc. skills (except riding)
+ * @param weapon_exp 経験値
+ * @return ランク値
  */
 int weapon_exp_level(int weapon_exp)
 {
@@ -196,8 +197,10 @@ int weapon_exp_level(int weapon_exp)
         return EXP_LEVEL_MASTER;
 }
 
-/*
- * Return proficiency level of riding
+/*!
+ * @brief 騎乗スキルの抽象的ランクを返す。 / Return proficiency level of riding
+ * @param weapon_exp 経験値
+ * @return ランク値
  */
 int riding_exp_level(int riding_exp)
 {
@@ -213,8 +216,10 @@ int riding_exp_level(int riding_exp)
         return EXP_LEVEL_MASTER;
 }
 
-/*
- * Return proficiency level of spells
+/*!
+ * @brief クリーチャーの呪文レベルの抽象的ランクを返す。 / Return proficiency level of spells
+ * @param spell_exp 経験値
+ * @return ランク値
  */
 int spell_exp_level(int spell_exp)
 {
@@ -230,9 +235,12 @@ int spell_exp_level(int spell_exp)
         return EXP_LEVEL_MASTER;
 }
 
-/*
- * Delayed visual update
- * Only used if update_view(), update_lite() or update_mon_lite() was called
+/*!
+ * @brief 遅延描画更新 / Delayed visual update
+ * @details update_view(), update_lite(), update_mon_lite() においてのみ更新すること / Only used if update_view(), update_lite() or update_mon_lite() was called
+ * @param player_ptr 主観となるプレイヤー構造体参照ポインタ
+ * @todo 将来独自インターフェース実装にはz-term系に追い出すべきか?
+ * @return なし
  */
 static void delayed_visual_update(player_type *player_ptr)
 {
@@ -270,6 +278,24 @@ static bool is_heavy_shoot(player_type *creature_ptr, object_type *o_ptr)
 }
 
 /*!
+ * @brief 所持品総重量を計算する
+ * @param creature_ptr 計算対象となるクリーチャーの参照ポインタ
+ * @return 総重量
+ */
+WEIGHT calc_inventory_weight(player_type *creature_ptr)
+{
+    WEIGHT weight = 0;
+
+    object_type *o_ptr;
+    for (inventory_slot_type i = 0; i < INVEN_TOTAL; i++) {
+        o_ptr = &creature_ptr->inventory_list[i];
+        if (!o_ptr->k_idx)
+            continue;
+        weight += o_ptr->weight * o_ptr->number;
+    }
+    return weight;
+}
+/*!
  * @brief プレイヤーの全ステータスを更新する /
  * Calculate the players current "state", taking into account
  * not only race/class intrinsics, but also objects being worn
@@ -292,6 +318,7 @@ static bool is_heavy_shoot(player_type *creature_ptr, object_type *o_ptr)
  *
  * This function induces various "status" messages.
  * </pre>
+ * @todo ここで計算していた各値は一部の状態変化メッセージ処理を除き、今後必要な時に適示計算する形に移行するためほぼすべて削られる。
  */
 void calc_bonuses(player_type *creature_ptr)
 {
@@ -319,47 +346,35 @@ void calc_bonuses(player_type *creature_ptr)
     ARMOUR_CLASS old_dis_ac = creature_ptr->dis_ac;
     ARMOUR_CLASS old_dis_to_a = creature_ptr->dis_to_a;
 
-    creature_ptr->pass_wall = is_pass_wall(creature_ptr);
-    creature_ptr->kill_wall = is_kill_wall(creature_ptr);
-    creature_ptr->xtra_might = is_xtra_might(creature_ptr);
-    creature_ptr->esp_evil = is_esp_evil(creature_ptr);
-    creature_ptr->esp_animal = is_esp_animal(creature_ptr);
-    creature_ptr->esp_undead = is_esp_undead(creature_ptr);
-    creature_ptr->esp_demon = is_esp_demon(creature_ptr);
-    creature_ptr->esp_orc = is_esp_orc(creature_ptr);
-    creature_ptr->esp_troll = is_esp_troll(creature_ptr);
-    creature_ptr->esp_giant = is_esp_giant(creature_ptr);
-    creature_ptr->esp_dragon = is_esp_dragon(creature_ptr);
-    creature_ptr->esp_human = is_esp_human(creature_ptr);
-    creature_ptr->esp_good = is_esp_good(creature_ptr);
-    creature_ptr->esp_nonliving = is_esp_nonliving(creature_ptr);
-    creature_ptr->esp_unique = is_esp_unique(creature_ptr);
-    creature_ptr->telepathy = is_esp_telepathy(creature_ptr);
+    creature_ptr->xtra_might = has_xtra_might(creature_ptr);
+    creature_ptr->esp_evil = has_esp_evil(creature_ptr);
+    creature_ptr->esp_animal = has_esp_animal(creature_ptr);
+    creature_ptr->esp_undead = has_esp_undead(creature_ptr);
+    creature_ptr->esp_demon = has_esp_demon(creature_ptr);
+    creature_ptr->esp_orc = has_esp_orc(creature_ptr);
+    creature_ptr->esp_troll = has_esp_troll(creature_ptr);
+    creature_ptr->esp_giant = has_esp_giant(creature_ptr);
+    creature_ptr->esp_dragon = has_esp_dragon(creature_ptr);
+    creature_ptr->esp_human = has_esp_human(creature_ptr);
+    creature_ptr->esp_good = has_esp_good(creature_ptr);
+    creature_ptr->esp_nonliving = has_esp_nonliving(creature_ptr);
+    creature_ptr->esp_unique = has_esp_unique(creature_ptr);
+    creature_ptr->telepathy = has_esp_telepathy(creature_ptr);
     creature_ptr->bless_blade = has_bless_blade(creature_ptr);
     creature_ptr->easy_2weapon = has_easy2_weapon(creature_ptr);
     creature_ptr->down_saving = has_down_saving(creature_ptr);
     creature_ptr->yoiyami = has_no_ac(creature_ptr);
     creature_ptr->mighty_throw = has_mighty_throw(creature_ptr);
     creature_ptr->dec_mana = has_dec_mana(creature_ptr);
-    creature_ptr->reflect = has_reflect(creature_ptr);
     creature_ptr->see_nocto = has_see_nocto(creature_ptr);
     creature_ptr->warning = has_warning(creature_ptr);
     creature_ptr->anti_magic = has_anti_magic(creature_ptr);
     creature_ptr->anti_tele = has_anti_tele(creature_ptr);
-    creature_ptr->sh_fire = has_sh_fire(creature_ptr);
-    creature_ptr->sh_elec = has_sh_elec(creature_ptr);
-    creature_ptr->sh_cold = has_sh_cold(creature_ptr);
     creature_ptr->easy_spell = has_easy_spell(creature_ptr);
     creature_ptr->heavy_spell = has_heavy_spell(creature_ptr);
     creature_ptr->hold_exp = has_hold_exp(creature_ptr);
     creature_ptr->see_inv = has_see_inv(creature_ptr);
     creature_ptr->free_act = has_free_act(creature_ptr);
-    creature_ptr->sustain_str = is_sustain_str(creature_ptr);
-    creature_ptr->sustain_int = is_sustain_int(creature_ptr);
-    creature_ptr->sustain_wis = is_sustain_wis(creature_ptr);
-    creature_ptr->sustain_dex = is_sustain_dex(creature_ptr);
-    creature_ptr->sustain_con = is_sustain_con(creature_ptr);
-    creature_ptr->sustain_chr = is_sustain_chr(creature_ptr);
     creature_ptr->levitation = has_levitation(creature_ptr);
     has_can_swim(creature_ptr);
     creature_ptr->slow_digest = has_slow_digest(creature_ptr);
@@ -367,34 +382,9 @@ void calc_bonuses(player_type *creature_ptr)
     has_curses(creature_ptr);
     creature_ptr->impact = has_impact(creature_ptr);
     has_extra_blow(creature_ptr);
-    creature_ptr->resist_acid = is_resist_acid(creature_ptr);
-    creature_ptr->resist_elec = is_resist_elec(creature_ptr);
-    creature_ptr->resist_fire = is_resist_fire(creature_ptr);
-    creature_ptr->resist_cold = is_resist_cold(creature_ptr);
-    creature_ptr->resist_pois = is_resist_pois(creature_ptr);
-    creature_ptr->resist_conf = is_resist_conf(creature_ptr);
-    creature_ptr->resist_sound = is_resist_sound(creature_ptr);
-    creature_ptr->resist_lite = is_resist_lite(creature_ptr);
-    creature_ptr->resist_dark = is_resist_dark(creature_ptr);
-    creature_ptr->resist_chaos = is_resist_chaos(creature_ptr);
-    creature_ptr->resist_disen = is_resist_disen(creature_ptr);
-    creature_ptr->resist_shard = is_resist_shard(creature_ptr);
-    creature_ptr->resist_nexus = is_resist_nexus(creature_ptr);
-    creature_ptr->resist_blind = is_resist_blind(creature_ptr);
-    creature_ptr->resist_neth = is_resist_neth(creature_ptr);
-    creature_ptr->resist_time = is_resist_time(creature_ptr);
-    creature_ptr->resist_fear = is_resist_fear(creature_ptr);
-    creature_ptr->resist_time = is_resist_time(creature_ptr);
-    creature_ptr->resist_water = is_resist_water(creature_ptr);
 
     creature_ptr->lite = has_lite(creature_ptr);
 
-    const player_race *tmp_rp_ptr;
-    if (creature_ptr->mimic_form)
-        tmp_rp_ptr = &mimic_info[creature_ptr->mimic_form];
-    else
-        tmp_rp_ptr = &race_info[creature_ptr->prace];
-
     if (creature_ptr->special_defense & KAMAE_MASK) {
         if (!(empty_hands_status & EMPTY_HAND_RARM)) {
             set_action(creature_ptr, ACTION_NONE);
@@ -428,8 +418,8 @@ void calc_bonuses(player_type *creature_ptr)
     }
 
     for (int i = 0; i < 2; i++) {
-        creature_ptr->icky_wield[i] = is_icky_wield_weapon(creature_ptr, i);
-        creature_ptr->riding_wield[i] = is_riding_wield_weapon(creature_ptr, i);
+        creature_ptr->icky_wield[i] = has_icky_wield_weapon(creature_ptr, i);
+        creature_ptr->riding_wield[i] = has_riding_wield_weapon(creature_ptr, i);
         creature_ptr->num_blow[i] = calc_num_blow(creature_ptr, i);
         creature_ptr->to_dd[i] = calc_to_weapon_dice_num(creature_ptr, INVEN_RARM + i);
         creature_ptr->to_ds[i] = calc_to_weapon_dice_side(creature_ptr, INVEN_RARM + i);
@@ -492,6 +482,7 @@ void calc_bonuses(player_type *creature_ptr)
         return;
 
     put_equipment_warning(creature_ptr);
+    check_no_flowed(creature_ptr);
 }
 
 static void calc_alignment(player_type *creature_ptr)
@@ -1117,7 +1108,7 @@ s16b calc_num_fire(player_type *creature_ptr, object_type *o_ptr)
 {
     int extra_shots = 0;
     BIT_FLAGS flgs[TR_FLAG_SIZE];
-    creature_ptr->num_fire = 100;
+
     for (inventory_slot_type i = INVEN_RARM; i < INVEN_TOTAL; i++) {
         object_type *q_ptr;
         q_ptr = &creature_ptr->inventory_list[i];
@@ -1269,7 +1260,7 @@ static ACTION_SKILL_POWER calc_stealth(player_type *creature_ptr)
         if (hex_spelling_any(creature_ptr))
             pow -= (1 + casting_hex_num(creature_ptr));
     }
-    if ((is_specific_player_race(creature_ptr, RACE_S_FAIRY)) && (creature_ptr->pseikaku != PERSONALITY_SEXY) && (creature_ptr->cursed & TRC_AGGRAVATE)) {
+    if (player_aggravate_state(creature_ptr) == AGGRAVATE_S_FAIRY) {
         pow = MIN(pow - 3, (pow + 2) / 2);
     }
 
@@ -1277,11 +1268,13 @@ static ACTION_SKILL_POWER calc_stealth(player_type *creature_ptr)
         pow -= 7;
     }
 
-    if (creature_ptr->pclass == CLASS_NINJA && heavy_armor(creature_ptr)) {
-        pow -= (creature_ptr->lev) / 10;
-    } else if ((!creature_ptr->inventory_list[INVEN_RARM].k_idx || has_right_hand_weapon(creature_ptr))
-        && (!creature_ptr->inventory_list[INVEN_LARM].k_idx || has_left_hand_weapon(creature_ptr))) {
-        pow += (creature_ptr->lev) / 10;
+    if (creature_ptr->pclass == CLASS_NINJA) {
+        if (heavy_armor(creature_ptr)) {
+            pow -= (creature_ptr->lev) / 10;
+        } else if ((!creature_ptr->inventory_list[INVEN_RARM].k_idx || has_right_hand_weapon(creature_ptr))
+            && (!creature_ptr->inventory_list[INVEN_LARM].k_idx || has_left_hand_weapon(creature_ptr))) {
+            pow += (creature_ptr->lev) / 10;
+        }
     }
 
     if (is_time_limit_stealth(creature_ptr))
@@ -1666,14 +1659,12 @@ static s16b calc_num_blow(player_type *creature_ptr, int i)
 {
     object_type *o_ptr;
     BIT_FLAGS flgs[TR_FLAG_SIZE];
-    s16b num_blow = 0;
+    s16b num_blow = 1;
 
     o_ptr = &creature_ptr->inventory_list[INVEN_RARM + i];
     object_flags(creature_ptr, o_ptr, flgs);
     creature_ptr->heavy_wield[i] = FALSE;
-    if (!has_melee_weapon(creature_ptr, INVEN_RARM + i)) {
-        num_blow = 1;
-    } else {
+    if (has_melee_weapon(creature_ptr, INVEN_RARM + i)) {
         if (calc_weapon_weight_limit(creature_ptr) < o_ptr->weight / 10) {
             creature_ptr->heavy_wield[i] = TRUE;
         }
@@ -1701,7 +1692,7 @@ static s16b calc_num_blow(player_type *creature_ptr, int i)
             div = ((o_ptr->weight < wgt) ? wgt : o_ptr->weight);
             str_index = (adj_str_blow[creature_ptr->stat_ind[A_STR]] * mul / div);
 
-            if (has_two_handed_weapons(creature_ptr) && !is_disable_two_handed_bonus(creature_ptr, 0))
+            if (has_two_handed_weapons(creature_ptr) && !has_disable_two_handed_bonus(creature_ptr, 0))
                 str_index++;
             if (creature_ptr->pclass == CLASS_NINJA)
                 str_index = MAX(0, str_index - 1);
@@ -1797,7 +1788,7 @@ static s16b calc_num_blow(player_type *creature_ptr, int i)
         num_blow += 1 + creature_ptr->extra_blows[0];
     }
 
-    if (is_not_ninja_weapon(creature_ptr, i)) {
+    if (has_not_ninja_weapon(creature_ptr, i)) {
         num_blow /= 2;
         if (num_blow < 1)
             num_blow = 1;
@@ -2514,18 +2505,10 @@ static s16b calc_speed(player_type *creature_ptr)
 
     s16b pow = 110;
 
-    int j = creature_ptr->total_weight;
+    int j = calc_inventory_weight(creature_ptr);
     int count;
 
     if (!creature_ptr->riding) {
-        count = (int)weight_limit(creature_ptr);
-
-        const player_race *tmp_rp_ptr;
-        if (creature_ptr->mimic_form)
-            tmp_rp_ptr = &mimic_info[creature_ptr->mimic_form];
-        else
-            tmp_rp_ptr = &race_info[creature_ptr->prace];
-
         if (is_specific_player_race(creature_ptr, RACE_KLACKON) || is_specific_player_race(creature_ptr, RACE_SPRITE))
             pow += (creature_ptr->lev) / 10;
 
@@ -2637,6 +2620,10 @@ static s16b calc_speed(player_type *creature_ptr)
             }
         }
 
+        count = (int)calc_weight_limit(creature_ptr);
+        if (j > count)
+            pow -= ((j - count) / (count / 5));
+
     } else {
         monster_type *riding_m_ptr = &creature_ptr->current_floor_ptr->m_list[creature_ptr->riding];
         monster_race *riding_r_ptr = &r_info[riding_m_ptr->r_idx];
@@ -2982,21 +2969,16 @@ static s16b calc_to_damage(player_type *creature_ptr, INVENTORY_IDX slot, bool i
                 bonus_to_d = (o_ptr->to_d + 1) / 2;
         }
 
-        if ((i == INVEN_LEFT || i == INVEN_RIGHT) && !has_two_handed_weapons(creature_ptr)) {
+        if ((i == INVEN_LEFT || i == INVEN_RIGHT) && has_two_handed_weapons(creature_ptr)) {
             damage += (s16b)bonus_to_d;
-        } else if (has_right_hand_weapon(creature_ptr) && has_left_hand_weapon(creature_ptr)) {
-            if (id == 0)
-                damage += (bonus_to_d > 0) ? (bonus_to_d + 1) / 2 : bonus_to_d;
-            if (id == 1)
-                damage += (bonus_to_d > 0) ? bonus_to_d / 2 : bonus_to_d;
-        } else if (id == get_default_hand(creature_ptr)) {
+        } else if ((has_right_hand_weapon(creature_ptr) && id == 0 && i == INVEN_RIGHT)) {// || (has_left_hand_weapon(creature_ptr) && id == 1 && i == INVEN_LEFT)) {
             damage += (s16b)bonus_to_d;
         }
     }
 
     if (get_default_hand(creature_ptr) == id) {
         if ((is_martial_arts_mode(creature_ptr) && empty_hands(creature_ptr, FALSE) == (EMPTY_HAND_RARM | EMPTY_HAND_LARM))
-            || !is_disable_two_handed_bonus(creature_ptr, 0)) {
+            || !has_disable_two_handed_bonus(creature_ptr, 0)) {
             int bonus_to_d = 0;
             bonus_to_d = ((int)(adj_str_td[creature_ptr->stat_ind[A_STR]]) - 128) / 2;
             damage += MAX(bonus_to_d, 1);
@@ -3010,62 +2992,20 @@ static s16b calc_to_damage(player_type *creature_ptr, INVENTORY_IDX slot, bool i
     return damage;
 }
 
+/*!
+ * @brief 武器の命中修正を計算する。 / Calculate hit bonus from a wielded weapon.
+ * @details
+ * 'slot' MUST be INVEN_RARM or INVEM_LARM.
+ */
 static s16b calc_to_hit(player_type *creature_ptr, INVENTORY_IDX slot, bool is_true_value)
 {
-    int id = slot - INVEN_RARM;
-    object_type *o_ptr = &creature_ptr->inventory_list[slot];
-    BIT_FLAGS flgs[TR_FLAG_SIZE];
-    object_flags(creature_ptr, o_ptr, flgs);
-    tval_type tval = creature_ptr->inventory_list[INVEN_RARM + id].tval - TV_WEAPON_BEGIN;
-    OBJECT_SUBTYPE_VALUE sval = creature_ptr->inventory_list[INVEN_RARM + id].sval;
-
     s16b hit = 0;
 
+    /* Base bonuses */
     hit += ((int)(adj_dex_th[creature_ptr->stat_ind[A_DEX]]) - 128);
     hit += ((int)(adj_str_th[creature_ptr->stat_ind[A_STR]]) - 128);
 
-    if ((creature_ptr->pclass == CLASS_PRIEST) && (!(has_flag(flgs, TR_BLESSED))) && ((o_ptr->tval == TV_SWORD) || (o_ptr->tval == TV_POLEARM))) {
-        hit -= 2;
-    } else if (creature_ptr->pclass == CLASS_BERSERKER) {
-        hit += creature_ptr->lev / 5;
-        if (((id == 0) && !has_left_hand_weapon(creature_ptr)) || has_two_handed_weapons(creature_ptr)) {
-            hit += creature_ptr->lev / 5;
-        }
-    } else if (creature_ptr->pclass == CLASS_SORCERER) {
-        if (!((o_ptr->tval == TV_HAFTED) && ((o_ptr->sval == SV_WIZSTAFF) || (o_ptr->sval == SV_NAMAKE_HAMMER)))) {
-            hit -= 200;
-        } else {
-            hit -= 30;
-        }
-    }
-
-    if ((object_is_fully_known(o_ptr) || is_true_value) && o_ptr->curse_flags & TRC_LOW_MELEE) {
-        if (o_ptr->curse_flags & TRC_HEAVY_CURSE) {
-            hit -= 15;
-        } else {
-            hit -= 5;
-        }
-    }
-
-    if ((creature_ptr->realm1 == REALM_HEX) && object_is_cursed(o_ptr)) {
-        if (o_ptr->curse_flags & (TRC_CURSED)) {
-            hit += 5;
-        }
-        if (o_ptr->curse_flags & (TRC_HEAVY_CURSE)) {
-            hit += 7;
-        }
-        if (o_ptr->curse_flags & (TRC_PERMA_CURSE)) {
-            hit += 13;
-        }
-        if (o_ptr->curse_flags & (TRC_TY_CURSE)) {
-            hit += 5;
-        }
-    }
-
-    if (calc_weapon_weight_limit(creature_ptr) < o_ptr->weight / 10) {
-        hit += 2 * (calc_weapon_weight_limit(creature_ptr) - o_ptr->weight / 10);
-    }
-
+    /* Temporary bonuses */
     if (is_blessed(creature_ptr)) {
         hit += 10;
     }
@@ -3084,59 +3024,128 @@ static s16b calc_to_hit(player_type *creature_ptr, INVENTORY_IDX slot, bool is_t
         hit -= 5;
     }
 
-    if (creature_ptr->riding) {
-        if ((o_ptr->tval == TV_POLEARM) && ((o_ptr->sval == SV_LANCE) || (o_ptr->sval == SV_HEAVY_LANCE))) {
-            hit += 15;
+    /* Default hand bonuses */
+    int id = slot - INVEN_RARM;
+    int default_hand = get_default_hand(creature_ptr);
+    if (default_hand == id) {
+        /* Add trained bonus of empty hands' combat when having no weapon and riding */
+        if ((!has_right_hand_weapon(creature_ptr) && (empty_hands(creature_ptr, TRUE) & EMPTY_HAND_LARM))
+            || (!has_left_hand_weapon(creature_ptr) && (empty_hands(creature_ptr, TRUE) & EMPTY_HAND_RARM))) {
+            hit += (creature_ptr->skill_exp[GINOU_SUDE] - WEAPON_EXP_BEGINNER) / 200;
+        }
+
+        if ((is_martial_arts_mode(creature_ptr) && empty_hands(creature_ptr, FALSE) == (EMPTY_HAND_RARM | EMPTY_HAND_LARM))
+            || !has_disable_two_handed_bonus(creature_ptr, 0)) {
+            int bonus_to_h = 0;
+            bonus_to_h = ((int)(adj_str_th[creature_ptr->stat_ind[A_STR]]) - 128) + ((int)(adj_dex_th[creature_ptr->stat_ind[A_DEX]]) - 128);
+            hit += MAX(bonus_to_h, 1);
         }
     }
 
-    if (creature_ptr->riding != 0 && !(o_ptr->tval == TV_POLEARM) && ((o_ptr->sval == SV_LANCE) || (o_ptr->sval == SV_HEAVY_LANCE))
-        && !has_flag(flgs, TR_RIDING)) {
+    /* Bonuses and penalties by weapon */
+    if (has_melee_weapon(creature_ptr, slot)) {
+        object_type *o_ptr = &creature_ptr->inventory_list[slot];
+        BIT_FLAGS flgs[TR_FLAG_SIZE];
+        object_flags(creature_ptr, o_ptr, flgs);
 
-        int penalty;
-        if ((creature_ptr->pclass == CLASS_BEASTMASTER) || (creature_ptr->pclass == CLASS_CAVALRY)) {
-            penalty = 5;
-        } else {
-            penalty = r_info[creature_ptr->current_floor_ptr->m_list[creature_ptr->riding].r_idx].level - creature_ptr->skill_exp[GINOU_RIDING] / 80;
-            penalty += 30;
-            if (penalty < 30)
-                penalty = 30;
+        tval_type tval = o_ptr->tval - TV_WEAPON_BEGIN;
+        OBJECT_SUBTYPE_VALUE sval = o_ptr->sval;
+
+        /* Traind bonuses */
+        hit += (creature_ptr->weapon_exp[tval][sval] - WEAPON_EXP_BEGINNER) / 200;
+
+        /* Weight penalty */
+        if (calc_weapon_weight_limit(creature_ptr) < o_ptr->weight / 10) {
+            hit += 2 * (calc_weapon_weight_limit(creature_ptr) - o_ptr->weight / 10);
         }
-        hit -= (s16b)penalty;
-    }
 
-    hit += (creature_ptr->weapon_exp[tval][sval] - WEAPON_EXP_BEGINNER) / 200;
+        /* Low melee penalty */
+        if ((object_is_fully_known(o_ptr) || is_true_value) && o_ptr->curse_flags & TRC_LOW_MELEE) {
+            if (o_ptr->curse_flags & TRC_HEAVY_CURSE) {
+                hit -= 15;
+            } else {
+                hit -= 5;
+            }
+        }
 
-    if (is_not_ninja_weapon(creature_ptr, id) || is_not_monk_weapon(creature_ptr, id)) {
-        hit -= 40;
-    }
+        /* Riding bonus and penalty */
+        if (creature_ptr->riding) {
+            if ((o_ptr->tval == TV_POLEARM) && ((o_ptr->sval == SV_LANCE) || (o_ptr->sval == SV_HEAVY_LANCE))) {
+                hit += 15;
+            }
+        }
 
-    if (get_default_hand(creature_ptr) == id) {
-        if ((has_right_hand_weapon(creature_ptr) && (empty_hands(creature_ptr, TRUE) & EMPTY_HAND_RARM))
-            || (has_left_hand_weapon(creature_ptr) && (empty_hands(creature_ptr, TRUE) & EMPTY_HAND_LARM))) {
-            hit += (creature_ptr->skill_exp[GINOU_SUDE] - WEAPON_EXP_BEGINNER) / 200;
+        if (creature_ptr->riding != 0 && !(o_ptr->tval == TV_POLEARM) && ((o_ptr->sval == SV_LANCE) || (o_ptr->sval == SV_HEAVY_LANCE))
+            && !has_flag(flgs, TR_RIDING)) {
+
+            int penalty;
+            if ((creature_ptr->pclass == CLASS_BEASTMASTER) || (creature_ptr->pclass == CLASS_CAVALRY)) {
+                penalty = 5;
+            } else {
+                penalty = r_info[creature_ptr->current_floor_ptr->m_list[creature_ptr->riding].r_idx].level - creature_ptr->skill_exp[GINOU_RIDING] / 80;
+                penalty += 30;
+                if (penalty < 30)
+                    penalty = 30;
+            }
+            hit -= (s16b)penalty;
         }
 
-        if ((is_martial_arts_mode(creature_ptr) && empty_hands(creature_ptr, FALSE) == (EMPTY_HAND_RARM | EMPTY_HAND_LARM))
-            || !is_disable_two_handed_bonus(creature_ptr, 0)) {
-            int bonus_to_h = 0;
-            bonus_to_h = ((int)(adj_str_th[creature_ptr->stat_ind[A_STR]]) - 128) + ((int)(adj_dex_th[creature_ptr->stat_ind[A_DEX]]) - 128);
-            hit += MAX(bonus_to_h, 1);
+        /* Class penalties */
+        if ((creature_ptr->pclass == CLASS_PRIEST) && (!(has_flag(flgs, TR_BLESSED))) && ((o_ptr->tval == TV_SWORD) || (o_ptr->tval == TV_POLEARM))) {
+            hit -= 2;
+        } else if (creature_ptr->pclass == CLASS_BERSERKER) {
+            hit += creature_ptr->lev / 5;
+            if (((id == 0) && !has_left_hand_weapon(creature_ptr)) || has_two_handed_weapons(creature_ptr)) {
+                hit += creature_ptr->lev / 5;
+            }
+        } else if (creature_ptr->pclass == CLASS_SORCERER) {
+            if (!((o_ptr->tval == TV_HAFTED) && ((o_ptr->sval == SV_WIZSTAFF) || (o_ptr->sval == SV_NAMAKE_HAMMER)))) {
+                hit -= 200;
+            } else {
+                hit -= 30;
+            }
+        }
+
+        if (has_not_ninja_weapon(creature_ptr, id) || has_not_monk_weapon(creature_ptr, id)) {
+            hit -= 40;
+        }
+
+        /* Hex realm bonuses */
+        if ((creature_ptr->realm1 == REALM_HEX) && object_is_cursed(o_ptr)) {
+            if (o_ptr->curse_flags & (TRC_CURSED)) {
+                hit += 5;
+            }
+            if (o_ptr->curse_flags & (TRC_HEAVY_CURSE)) {
+                hit += 7;
+            }
+            if (o_ptr->curse_flags & (TRC_PERMA_CURSE)) {
+                hit += 13;
+            }
+            if (o_ptr->curse_flags & (TRC_TY_CURSE)) {
+                hit += 5;
+            }
         }
     }
 
-    int default_hand = get_default_hand(creature_ptr);
+    /* Bonuses from inventory */
     for (inventory_slot_type i = INVEN_RARM; i < INVEN_TOTAL; i++) {
-        int bonus_to_h;
-        o_ptr = &creature_ptr->inventory_list[i];
-        if (!o_ptr->k_idx || o_ptr->tval == TV_CAPTURE || (i == INVEN_RARM && has_melee_weapon(creature_ptr, i))
-            || (i == INVEN_LARM && has_melee_weapon(creature_ptr, i)) || i == INVEN_BOW)
+        object_type *o_ptr = &creature_ptr->inventory_list[i];
+
+        /* Ignore empty hands, handed weapons, bows and capture balls */
+        if (!o_ptr->k_idx
+            || o_ptr->tval == TV_CAPTURE
+            || (i == INVEN_RARM && has_melee_weapon(creature_ptr, i))
+            || (i == INVEN_LARM && has_melee_weapon(creature_ptr, i))
+            || i == INVEN_BOW)
             continue;
 
+        /* Fake value does not include unknown objects' value */
         if (is_true_value || !object_is_known(o_ptr))
             continue;
-        bonus_to_h = o_ptr->to_h;
 
+        int bonus_to_h = o_ptr->to_h;
+
+        /* When wields only a weapon */
         if (creature_ptr->pclass == CLASS_NINJA) {
             if (o_ptr->to_h > 0)
                 bonus_to_h = (o_ptr->to_h + 1) / 2;
@@ -3147,6 +3156,7 @@ static s16b calc_to_hit(player_type *creature_ptr, INVENTORY_IDX slot, bool is_t
             continue;
         }
 
+        /* When wields two weapons on each hand */
         if (has_right_hand_weapon(creature_ptr) && has_left_hand_weapon(creature_ptr)) {
             if (default_hand == 0)
                 hit += (bonus_to_h > 0) ? (bonus_to_h + 1) / 2 : bonus_to_h;
@@ -3158,10 +3168,13 @@ static s16b calc_to_hit(player_type *creature_ptr, INVENTORY_IDX slot, bool is_t
         if (default_hand == id)
             hit += (s16b)bonus_to_h;
     }
+
+    /* Martial arts bonus */
     if (is_martial_arts_mode(creature_ptr) && (!heavy_armor(creature_ptr) || creature_ptr->pclass != CLASS_BERSERKER)) {
         hit += (creature_ptr->lev / 3);
     }
 
+    /* Two handed combat penalty */
     hit -= calc_double_weapon_penalty(creature_ptr, slot);
 
     return hit;
@@ -3302,7 +3315,7 @@ static s16b calc_to_hit_misc(player_type *creature_ptr)
             if (o_ptr->to_h > 0)
                 bonus_to_h = (o_ptr->to_h + 1) / 2;
         }
-        to_hit += (s16b)o_ptr->to_h;
+        to_hit += (s16b)bonus_to_h;
     }
 
     if (is_blessed(creature_ptr)) {
@@ -3346,8 +3359,8 @@ static DICE_NUMBER calc_to_weapon_dice_num(player_type *creature_ptr, INVENTORY_
 
 static DICE_NUMBER calc_to_weapon_dice_side(player_type *creature_ptr, INVENTORY_IDX slot)
 {
-    (creature_ptr); // unused
-    (slot); // unused
+    (void)creature_ptr; // unused
+    (void)slot; // unused
     return 0;
 }
 
@@ -3356,7 +3369,7 @@ static DICE_NUMBER calc_to_weapon_dice_side(player_type *creature_ptr, INVENTORY
  * Computes current weight limit.
  * @return 制限重量(ポンド)
  */
-WEIGHT weight_limit(player_type *creature_ptr)
+WEIGHT calc_weight_limit(player_type *creature_ptr)
 {
     WEIGHT i = (WEIGHT)adj_str_wgt[creature_ptr->stat_ind[A_STR]] * 50;
     if (creature_ptr->pclass == CLASS_BERSERKER)
@@ -3366,12 +3379,12 @@ WEIGHT weight_limit(player_type *creature_ptr)
 
 /*!
  * @brief プレイヤーが現在右手/左手に武器を持っているか判定する /
- * @param i 判定する手のID(右手:0 左手:1)
+ * @param i 判定する手のID(右手:INVEN_RARM 左手:INVEN_LARM)
  * @return 持っているならばTRUE
  */
-bool has_melee_weapon(player_type *creature_ptr, int i)
+bool has_melee_weapon(player_type *creature_ptr, int slot)
 {
-    return ((creature_ptr->inventory_list[i].k_idx && object_is_melee_weapon(&creature_ptr->inventory_list[i])) ? TRUE : FALSE);
+    return ((creature_ptr->inventory_list[slot].k_idx) && object_is_melee_weapon(&creature_ptr->inventory_list[slot]));
 }
 
 /*!