OSDN Git Service

装備持ち替えと素手判定, 乗馬移動制御の放棄に関する変更と修正.
authornothere <nothere@0568b783-4c39-0410-ac80-bf13821ea2a2>
Sat, 20 Dec 2003 11:25:37 +0000 (11:25 +0000)
committernothere <nothere@0568b783-4c39-0410-ac80-bf13821ea2a2>
Sat, 20 Dec 2003 11:25:37 +0000 (11:25 +0000)
* 右手/左手の装備が呪われている場合でも持ち替えができる場合があったの
  で, そのような場合で装備持ち替えが起きないように修正. また, 二刀流
  中に非利き腕の武器が呪われた状態で非武器に持ち替える場合は非武器は
  利き腕で装備できる.
  - 素手で格闘する職業が利き腕にアイテムを持って非利き腕が素手の場合
    であっても素手攻撃計算が使われなくなるのは仕様として残す.
* 両手が非武器でふさがっている時に別の非武器を装備する場合は外す非武
  器を選べるように変更.
* 乗馬中の両手持ちを許可しない状況では. 乗馬の制御に用いる腕は "素手"
  とみなさないように変更. また, empty_hands()の引数is_monkは意味がな
  いので, 乗馬制御の腕を空きとみなすかどうかのフラグriding_controlに
  置き換えた.
* 両手に非武器装備, もしくは非武器を装備して片手は乗馬制御に使ってい
  るように, プレイヤーの両手が武器以外でふさがっている場合はプレイ
  ヤーは打撃攻撃できないように変更.
* 両手が空いている修行僧/練気術師/狂戦士が乗馬移動制御OFFを使えなかっ
  たバグを修正. また, 空いた腕があってかつ武器を持たない場合は, 空い
  た腕を武器とみなして乗馬の移動制御を切れるように変更.
* 両手持ち可能な武器判定を関数object_allow_two_hands_wielding()でまと
  めた.
* 両手が非武器でふさがっているような場合でも命中率にマーシャルアーツ
  熟練度が適用されたり, 熟練度が上がるバグを修正.
* mention_use()とdescribe_use()で "運搬中" テキストを出す条件が違って
  いたので修正. また, 英語版でleft_handerに関わらず指輪スロットの表示
  が変わらなかったバグを修正.
* 英語版では右手と左手は殴れる場合のみ "Wielding" と表記し, それ以外
  は素手の場合を含み "On arm" とした.
* 関数buki_motteruka()内の記号定数比較をobject_is_melee_weapon()で置
  き換えた.
* 転倒の変異で, 利き腕でない方の腕にしか武器がない場合に武器を落とさ
  ないバグを修正.
* 利き腕に武器以外がある場合に武器呪縛がかかっていたバグを修正. 二刀
  流の場合は確率1/2でどちらかの武器が呪縛されるように変更.
* 剣術家の剣術は非利き腕のみに武器がある状態でも使えるように変更.

16 files changed:
lib/edit/k_info.txt
src/cmd1.c
src/cmd2.c
src/cmd3.c
src/cmd5.c
src/cmd6.c
src/dungeon.c
src/externs.h
src/files.c
src/hissatsu.c
src/obj_kind.c
src/object1.c
src/racial.c
src/store.c
src/xtra1.c
src/xtra2.c

index b3398ff..ef2a91c 100644 (file)
@@ -2302,8 +2302,8 @@ G:?:d
 I:70:3:0
 W:50:0:5:0
 A:50/1
-D:$It makes your main weapon (Shattered) when you read it.
-D:¤½¤ì¤ÏÆɤà¤ÈÍø¤­ÏÓ¤ËÁõÈ÷Ãæ¤ÎÉð´ï¤ò(ÉÔÎÉÉÊ)¤ËÊѤ¨¤ë¡£
+D:$It makes your wielding weapon (Shattered) when you read it.
+D:¤½¤ì¤ÏÆɤà¤ÈÁõÈ÷Ãæ¤ÎÉð´ï¤ò(ÉÔÎÉÉÊ)¤ËÊѤ¨¤ë¡£
 
 N:214:*Ëɶñ¶¯²½*
 E:*Enchant Armor*
index a702023..57ba800 100644 (file)
@@ -1975,7 +1975,8 @@ static void py_attack_aux(int y, int x, bool *fear, bool *mdeath, s16b hand, int
        monster_type    *m_ptr = &m_list[c_ptr->m_idx];
        monster_race    *r_ptr = &r_info[m_ptr->r_idx];
 
-       object_type     *o_ptr;
+       /* Access the weapon */
+       object_type     *o_ptr = &inventory[INVEN_RARM + hand];
 
        char            m_name[80];
 
@@ -2032,7 +2033,7 @@ static void py_attack_aux(int y, int x, bool *fear, bool *mdeath, s16b hand, int
                break;
        }
 
-       if (!buki_motteruka(INVEN_RARM) && !buki_motteruka(INVEN_LARM))
+       if (!o_ptr->k_idx) /* Empty hand */
        {
                if ((r_ptr->level + 10) > p_ptr->lev)
                {
@@ -2050,7 +2051,7 @@ static void py_attack_aux(int y, int x, bool *fear, bool *mdeath, s16b hand, int
                        }
                }
        }
-       else
+       else if (object_is_melee_weapon(o_ptr))
        {
                if ((r_ptr->level + 10) > p_ptr->lev)
                {
@@ -2077,9 +2078,6 @@ static void py_attack_aux(int y, int x, bool *fear, bool *mdeath, s16b hand, int
        /* Extract monster name (or "it") */
        monster_desc(m_name, m_ptr, 0);
 
-       /* Access the weapon */
-       o_ptr = &inventory[INVEN_RARM+hand];
-
        /* Calculate the "attack quality" */
        bonus = p_ptr->to_h[hand] + o_ptr->to_h;
        chance = (p_ptr->skill_thn + (bonus * BTH_PLUS_ADJ));
@@ -3059,6 +3057,17 @@ bool py_attack(int y, int x, int mode)
 
        energy_use = 100;
 
+       if (!p_ptr->migite && !p_ptr->hidarite &&
+           !(p_ptr->muta2 & (MUT2_HORNS | MUT2_BEAK | MUT2_SCOR_TAIL | MUT2_TRUNK | MUT2_TENTACLES)))
+       {
+#ifdef JP
+               msg_print("ξ¼ê¤¬¤Õ¤µ¤¬¤Ã¤Æ¹¶·â¤Ç¤­¤Ê¤¤¡£");
+#else
+               msg_print("You cannot do attacking.");
+#endif
+               return FALSE;
+       }
+
        if (m_ptr->csleep) /* It is not honorable etc to attack helpless victims */
        {
                if (!(r_ptr->flags3 & RF3_EVIL) || one_in_(5)) chg_virtue(V_COMPASSION, -1);
index 715804f..cc2fff9 100644 (file)
@@ -3884,7 +3884,7 @@ bool do_cmd_throw_aux(int mult, bool boomerang, int shuriken)
        }
        else if (boomerang)
        {
-               if (buki_motteruka(INVEN_LARM))
+               if (buki_motteruka(INVEN_RARM) && buki_motteruka(INVEN_LARM))
                {
                        item_tester_hook = item_tester_hook_boomerang;
 #ifdef JP
@@ -3901,10 +3901,8 @@ bool do_cmd_throw_aux(int mult, bool boomerang, int shuriken)
                                return FALSE;
                        }
                }
-               else
-               {
-                       item = INVEN_RARM;
-               }
+               else if (buki_motteruka(INVEN_LARM)) item = INVEN_LARM;
+               else item = INVEN_RARM;
        }
        else
        {
index 24b1b67..688ebf8 100644 (file)
@@ -219,6 +219,8 @@ void do_cmd_wield(void)
 
        cptr q, s;
 
+       int need_switch_wielding = 0;
+
        if (p_ptr->special_defense & KATA_MUSOU)
        {
                set_action(ACTION_NONE);
@@ -260,6 +262,7 @@ void do_cmd_wield(void)
        case TV_CAPTURE:
        case TV_SHIELD:
        case TV_CARD:
+               /* Dual wielding */
                if (buki_motteruka(INVEN_RARM) && buki_motteruka(INVEN_LARM))
                {
                        /* Restrict the choices */
@@ -276,27 +279,28 @@ void do_cmd_wield(void)
 #endif
 
                        if (!get_item(&slot, q, s, (USE_EQUIP))) return;
-                       if ((slot == INVEN_RARM) && !object_is_cursed(&inventory[INVEN_RARM]))
-                       {
-                               object_type *or_ptr = &inventory[INVEN_RARM];
-                               object_type *ol_ptr = &inventory[INVEN_LARM];
-                               object_type object_tmp;
-                               object_type *otmp_ptr = &object_tmp;
-                               char ol_name[MAX_NLEN];
+                       if (slot == INVEN_RARM) need_switch_wielding = INVEN_LARM;
+               }
+
+               else if (buki_motteruka(INVEN_LARM)) slot = INVEN_RARM;
 
-                               object_desc(ol_name, ol_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
+               /* Both arms are already used by non-weapon */
+               else if (inventory[INVEN_RARM].k_idx && !object_is_melee_weapon(&inventory[INVEN_RARM]) &&
+                        inventory[INVEN_LARM].k_idx && !object_is_melee_weapon(&inventory[INVEN_LARM]))
+               {
+                       /* Restrict the choices */
+                       item_tester_hook = item_tester_hook_mochikae;
 
-                               object_copy(otmp_ptr, ol_ptr);
-                               object_copy(ol_ptr, or_ptr);
-                               object_copy(or_ptr, otmp_ptr);
+                       /* Choose a hand */
 #ifdef JP
-                               msg_format("%s¤ò%s¤Ë¹½¤¨¤Ê¤ª¤·¤¿¡£", ol_name, left_hander ? "º¸¼ê" : "±¦¼ê");
+                       q = "¤É¤Á¤é¤Î¼ê¤ËÁõÈ÷¤·¤Þ¤¹¤«?";
+                       s = "¤ª¤Ã¤È¡£";
 #else
-                               msg_format("You wield %s at %s hand.", ol_name, left_hander ? "left" : "right");
+                       q = "Equip which hand? ";
+                       s = "Oops.";
 #endif
 
-                               slot = INVEN_LARM;
-                       }
+                       if (!get_item(&slot, q, s, (USE_EQUIP))) return;
                }
                break;
 
@@ -315,6 +319,15 @@ void do_cmd_wield(void)
 #endif
                }
 
+               else if (!inventory[INVEN_RARM].k_idx && buki_motteruka(INVEN_LARM))
+               {
+#ifdef JP
+                       if (!get_check("ÆóÅáή¤ÇÀ襤¤Þ¤¹¤«¡©")) slot = INVEN_LARM;
+#else
+                       if (!get_check("Dual wielding? ")) slot = INVEN_LARM;
+#endif
+               }
+
                /* Both arms are already used */
                else if (inventory[INVEN_LARM].k_idx && inventory[INVEN_RARM].k_idx)
                {
@@ -331,6 +344,8 @@ void do_cmd_wield(void)
 #endif
 
                        if (!get_item(&slot, q, s, (USE_EQUIP))) return;
+                       if ((slot == INVEN_LARM) && !buki_motteruka(INVEN_RARM))
+                               need_switch_wielding = INVEN_RARM;
                }
                break;
 
@@ -409,6 +424,28 @@ sprintf(dummy, "%s
                if (!get_check(dummy)) return;
        }
 
+       if (need_switch_wielding && !object_is_cursed(&inventory[need_switch_wielding]))
+       {
+               object_type *slot_o_ptr = &inventory[slot];
+               object_type *switch_o_ptr = &inventory[need_switch_wielding];
+               object_type object_tmp;
+               object_type *otmp_ptr = &object_tmp;
+               char switch_name[MAX_NLEN];
+
+               object_desc(switch_name, switch_o_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY));
+
+               object_copy(otmp_ptr, switch_o_ptr);
+               object_copy(switch_o_ptr, slot_o_ptr);
+               object_copy(slot_o_ptr, otmp_ptr);
+#ifdef JP
+               msg_format("%s¤ò%s¤Ë¹½¤¨¤Ê¤ª¤·¤¿¡£", switch_name, (slot == INVEN_RARM) ? (left_hander ? "º¸¼ê" : "±¦¼ê") : (left_hander ? "±¦¼ê" : "º¸¼ê"));
+#else
+               msg_format("You wield %s at %s hand.", switch_name, (slot == INVEN_RARM) ? (left_hander ? "left" : "right") : (left_hander ? "right" : "left"));
+#endif
+
+               slot = need_switch_wielding;
+       }
+
        /* Check if completed a quest */
        for (i = 0; i < max_quests; i++)
        {
@@ -486,7 +523,7 @@ msg_print("
        switch (slot)
        {
        case INVEN_RARM:
-               if ((o_ptr->tval != TV_SHIELD) && (o_ptr->tval != TV_CAPTURE) && (o_ptr->tval != TV_CARD) && (empty_hands(FALSE) & EMPTY_HAND_LARM) && ((o_ptr->weight > 99) || (o_ptr->tval == TV_POLEARM)) && (!p_ptr->riding || (p_ptr->pet_extra_flags & PF_RYOUTE)))
+               if (object_allow_two_hands_wielding(o_ptr) && (empty_hands(FALSE) == EMPTY_HAND_LARM) && (!p_ptr->riding || (p_ptr->pet_extra_flags & PF_RYOUTE)))
 #ifdef JP
                        act = "%s(%c)¤òξ¼ê¤Ç¹½¤¨¤¿¡£";
 #else
@@ -501,10 +538,17 @@ msg_print("
                break;
 
        case INVEN_LARM:
+               if (object_allow_two_hands_wielding(o_ptr) && (empty_hands(FALSE) == EMPTY_HAND_RARM) && (!p_ptr->riding || (p_ptr->pet_extra_flags & PF_RYOUTE)))
 #ifdef JP
-               act = (left_hander ? "%s(%c)¤ò±¦¼ê¤ËÁõÈ÷¤·¤¿¡£" : "%s(%c)¤òº¸¼ê¤ËÁõÈ÷¤·¤¿¡£");
+                       act = "%s(%c)¤òξ¼ê¤Ç¹½¤¨¤¿¡£";
+#else
+                       act = "You are wielding %s (%c) with both hands.";
+#endif
+               else
+#ifdef JP
+                       act = (left_hander ? "%s(%c)¤ò±¦¼ê¤ËÁõÈ÷¤·¤¿¡£" : "%s(%c)¤òº¸¼ê¤ËÁõÈ÷¤·¤¿¡£");
 #else
-               act = (left_hander ? "You are wielding %s (%c) on right hand." : "You are wielding %s (%c) on left hand.");
+                       act = (left_hander ? "You are wielding %s (%c) on right hand." : "You are wielding %s (%c) on left hand.");
 #endif
                break;
 
@@ -584,53 +628,68 @@ msg_print("
 
 void kamaenaoshi(int item)
 {
-       object_type *o_ptr, *o2_ptr;
+       object_type *o_ptr, *new_o_ptr;
        char o_name[MAX_NLEN];
 
-       if ((item == INVEN_RARM) && buki_motteruka(INVEN_LARM))
+       if (item == INVEN_RARM)
        {
-               o_ptr = &inventory[INVEN_RARM];
-               o2_ptr = &inventory[INVEN_LARM];
-               object_copy(o_ptr, o2_ptr);
-               p_ptr->total_weight += o2_ptr->weight;
-               inven_item_increase(INVEN_LARM,-1);
-               inven_item_optimize(INVEN_LARM);
-               object_desc(o_name, o_ptr, 0);
-               if (((o_ptr->weight > 99) || (o_ptr->tval == TV_POLEARM)) && (!p_ptr->riding || (p_ptr->pet_extra_flags & PF_RYOUTE)))
+               if (buki_motteruka(INVEN_LARM))
+               {
+                       o_ptr = &inventory[INVEN_LARM];
+                       object_desc(o_name, o_ptr, 0);
+
+                       if (!object_is_cursed(o_ptr))
+                       {
+                               new_o_ptr = &inventory[INVEN_RARM];
+                               object_copy(new_o_ptr, o_ptr);
+                               p_ptr->total_weight += o_ptr->weight;
+                               inven_item_increase(INVEN_LARM, -((int)o_ptr->number));
+                               inven_item_optimize(INVEN_LARM);
+                               if (object_allow_two_hands_wielding(o_ptr) && (!p_ptr->riding || (p_ptr->pet_extra_flags & PF_RYOUTE)))
 #ifdef JP
-                       msg_format("%s¤òξ¼ê¤Ç¹½¤¨¤¿¡£", o_name );
+                                       msg_format("%s¤òξ¼ê¤Ç¹½¤¨¤¿¡£", o_name);
 #else
-                       msg_format("You are wielding %s with both hands.", o_name );
+                                       msg_format("You are wielding %s with both hands.", o_name);
 #endif
-                else
+                                else
 #ifdef JP
-                       msg_format("%s¤ò%s¤Ç¹½¤¨¤¿¡£", o_name, (left_hander ? "º¸¼ê" : "±¦¼ê"));
+                                       msg_format("%s¤ò%s¤Ç¹½¤¨¤¿¡£", o_name, (left_hander ? "º¸¼ê" : "±¦¼ê"));
 #else
-                       msg_format("You are wielding %s on %s hand.", o_name, (left_hander ? "left":"right") );
+                                       msg_format("You are wielding %s on %s hand.", o_name, (left_hander ? "left":"right"));
 #endif
+                       }
+                       else
+                       {
+                               if (object_allow_two_hands_wielding(o_ptr) && (!p_ptr->riding || (p_ptr->pet_extra_flags & PF_RYOUTE)))
+#ifdef JP
+                                       msg_format("%s¤òξ¼ê¤Ç¹½¤¨¤¿¡£", o_name);
+#else
+                                       msg_format("You are wielding %s with both hands.", o_name);
+#endif
+                       }
+               }
        }
        else if (item == INVEN_LARM)
        {
+               o_ptr = &inventory[INVEN_RARM];
+               if (o_ptr->k_idx) object_desc(o_name, o_ptr, 0);
+
                if (buki_motteruka(INVEN_RARM))
                {
-                       o_ptr = &inventory[INVEN_RARM];
-                       object_desc(o_name, o_ptr, 0);
-                       if (((o_ptr->weight > 99) || (o_ptr->tval == TV_POLEARM)) && (!p_ptr->riding || (p_ptr->pet_extra_flags & PF_RYOUTE)))
+                       if (object_allow_two_hands_wielding(o_ptr) && (!p_ptr->riding || (p_ptr->pet_extra_flags & PF_RYOUTE)))
 #ifdef JP
-                               msg_format("%s¤òξ¼ê¤Ç¹½¤¨¤¿¡£", o_name );
+                               msg_format("%s¤òξ¼ê¤Ç¹½¤¨¤¿¡£", o_name);
 #else
-                               msg_format("You are wielding %s with both hands.", o_name );
+                               msg_format("You are wielding %s with both hands.", o_name);
 #endif
                }
-               else if (!(empty_hands(FALSE) & EMPTY_HAND_RARM))
+               else if (!(empty_hands(FALSE) & EMPTY_HAND_RARM) && !object_is_cursed(o_ptr))
                {
-                       o_ptr = &inventory[INVEN_LARM];
-                       o2_ptr = &inventory[INVEN_RARM];
-                       object_copy(o_ptr, o2_ptr);
-                       p_ptr->total_weight += o2_ptr->weight;
-                       inven_item_increase(INVEN_RARM,-1);
+                       new_o_ptr = &inventory[INVEN_LARM];
+                       object_copy(new_o_ptr, o_ptr);
+                       p_ptr->total_weight += o_ptr->weight;
+                       inven_item_increase(INVEN_RARM, -((int)o_ptr->number));
                        inven_item_optimize(INVEN_RARM);
-                       object_desc(o_name, o_ptr, 0);
 #ifdef JP
                        msg_format("%s¤ò»ý¤ÁÂؤ¨¤¿¡£", o_name);
 #else
@@ -826,9 +885,11 @@ void do_cmd_drop(void)
        /* Drop (some of) the item */
        inven_drop(item, amt);
 
-       if ((item == INVEN_RARM) || (item == INVEN_LARM)) kamaenaoshi(item);
-
-       if (item >= INVEN_RARM) calc_android_exp();
+       if (item >= INVEN_RARM)
+       {
+               kamaenaoshi(item);
+               calc_android_exp();
+       }
 
        p_ptr->redraw |= (PR_EQUIPPY);
 }
index 2e7d443..a0d661c 100644 (file)
@@ -6114,28 +6114,84 @@ power_desc[num] = "Υ
 
        powers[num++] = PET_NAME;
 
-       if (p_ptr->riding && buki_motteruka(INVEN_RARM) && (empty_hands(FALSE) & EMPTY_HAND_LARM) && ((inventory[INVEN_RARM].weight > 99) || (inventory[INVEN_RARM].tval == TV_POLEARM)))
+       if (p_ptr->riding)
        {
-               if (p_ptr->pet_extra_flags & PF_RYOUTE)
+               if ((p_ptr->migite && (empty_hands(FALSE) == EMPTY_HAND_LARM) &&
+                    object_allow_two_hands_wielding(&inventory[INVEN_RARM])) ||
+                   (p_ptr->hidarite && (empty_hands(FALSE) == EMPTY_HAND_RARM) &&
+                        object_allow_two_hands_wielding(&inventory[INVEN_LARM])))
                {
+                       if (p_ptr->pet_extra_flags & PF_RYOUTE)
+                       {
+#ifdef JP
+                               power_desc[num] = "Éð´ï¤òÊÒ¼ê¤Ç»ý¤Ä";
+#else
+                               power_desc[num] = "use one hand to control a riding pet";
+#endif
+                       }
+                       else
+                       {
 #ifdef JP
-                       power_desc[num] = "Éð´ï¤òÊÒ¼ê¤Ç»ý¤Ä";
+                               power_desc[num] = "Éð´ï¤òξ¼ê¤Ç»ý¤Ä";
 #else
-                       power_desc[num] = "use one hand to control a riding pet";
+                               power_desc[num] = "use both hands for a weapon";
 #endif
+                       }
 
+                       powers[num++] = PET_RYOUTE;
                }
                else
                {
+                       switch (p_ptr->pclass)
+                       {
+                       case CLASS_MONK:
+                       case CLASS_FORCETRAINER:
+                       case CLASS_BERSERKER:
+                               if (empty_hands(FALSE) == (EMPTY_HAND_RARM | EMPTY_HAND_LARM))
+                               {
+                                       if (p_ptr->pet_extra_flags & PF_RYOUTE)
+                                       {
 #ifdef JP
-                       power_desc[num] = "Éð´ï¤òξ¼ê¤Ç»ý¤Ä";
+                                               power_desc[num] = "ÊÒ¼ê¤Ç³ÊÆ®¤¹¤ë";
 #else
-                       power_desc[num] = "use both hands for a weapon.";
+                                               power_desc[num] = "use one hand to control a riding pet";
 #endif
+                                       }
+                                       else
+                                       {
+#ifdef JP
+                                               power_desc[num] = "ξ¼ê¤Ç³ÊÆ®¤¹¤ë";
+#else
+                                               power_desc[num] = "use both hands for melee";
+#endif
+                                       }
 
-               }
+                                       powers[num++] = PET_RYOUTE;
+                               }
+                               else if ((empty_hands(FALSE) != EMPTY_HAND_NONE) && !buki_motteruka(INVEN_RARM) && !buki_motteruka(INVEN_LARM))
+                               {
+                                       if (p_ptr->pet_extra_flags & PF_RYOUTE)
+                                       {
+#ifdef JP
+                                               power_desc[num] = "³ÊÆ®¤ò¹Ô¤ï¤Ê¤¤";
+#else
+                                               power_desc[num] = "use one hand to control a riding pet";
+#endif
+                                       }
+                                       else
+                                       {
+#ifdef JP
+                                               power_desc[num] = "³ÊÆ®¤ò¹Ô¤¦";
+#else
+                                               power_desc[num] = "use one hand for melee";
+#endif
+                                       }
 
-               powers[num++] = PET_RYOUTE;
+                                       powers[num++] = PET_RYOUTE;
+                               }
+                               break;
+                       }
+               }
        }
 
        /* Nothing chosen yet */
index 8261ab1..b5071e7 100644 (file)
@@ -1665,7 +1665,14 @@ static void do_cmd_read_scroll_aux(int item, bool known)
 
                case SV_SCROLL_CURSE_WEAPON:
                {
-                       if (curse_weapon(FALSE, INVEN_RARM)) ident = TRUE;
+                       k = 0;
+                       if (buki_motteruka(INVEN_RARM))
+                       {
+                               k = INVEN_RARM;
+                               if (buki_motteruka(INVEN_LARM) && one_in_(2)) k = INVEN_LARM;
+                       }
+                       else if (buki_motteruka(INVEN_LARM)) k = INVEN_LARM;
+                       if (k && curse_weapon(FALSE, k)) ident = TRUE;
                        break;
                }
 
index 3949d95..ffe49d5 100644 (file)
@@ -3242,6 +3242,7 @@ static void process_world_aux_mutation(void)
        }
        if ((p_ptr->muta2 & MUT2_DISARM) && one_in_(10000))
        {
+               int slot = 0;
                object_type *o_ptr;
 
                disturb(0, 0);
@@ -3253,27 +3254,32 @@ static void process_world_aux_mutation(void)
                take_hit(DAMAGE_NOESCAPE, randint1(p_ptr->wt / 6), "tripping", -1);
 #endif
 
-
                msg_print(NULL);
                if (buki_motteruka(INVEN_RARM))
                {
-                       int slot = INVEN_RARM;
+                       slot = INVEN_RARM;
                        o_ptr = &inventory[INVEN_RARM];
+
                        if (buki_motteruka(INVEN_LARM) && one_in_(2))
                        {
                                o_ptr = &inventory[INVEN_LARM];
                                slot = INVEN_LARM;
                        }
-                       if (!object_is_cursed(o_ptr))
-                       {
+               }
+               else if (buki_motteruka(INVEN_LARM))
+               {
+                       o_ptr = &inventory[INVEN_LARM];
+                       slot = INVEN_LARM;
+               }
+
+               if (slot && !object_is_cursed(o_ptr))
+               {
 #ifdef JP
-                               msg_print("Éð´ï¤òÍ¤Æ¤·¤Þ¤Ã¤¿¡ª");
+                       msg_print("Éð´ï¤òÍ¤Æ¤·¤Þ¤Ã¤¿¡ª");
 #else
-                               msg_print("You drop your weapon!");
+                       msg_print("You drop your weapon!");
 #endif
-
-                               inven_drop(slot, 1);
-                       }
+                       inven_drop(slot, 1);
                }
        }
 }
index b35a483..eeb40b5 100644 (file)
@@ -1300,7 +1300,7 @@ extern void update_stuff(void);
 extern void redraw_stuff(void);
 extern void window_stuff(void);
 extern void handle_stuff(void);
-extern s16b empty_hands(bool is_monk);
+extern s16b empty_hands(bool riding_control);
 extern bool heavy_armor(void);
 
 
@@ -1575,6 +1575,7 @@ extern bool object_allow_enchant_melee_weapon(object_type *o_ptr);
 extern bool object_is_smith(object_type *o_ptr);
 extern bool object_is_artifact(object_type *o_ptr);
 extern bool object_is_nameless(object_type *o_ptr);
+extern bool object_allow_two_hands_wielding(object_type *o_ptr);
 
 /* wild.c */
 extern void set_floor_and_wall(byte type);
index 25007aa..0468674 100644 (file)
@@ -1682,61 +1682,55 @@ static void display_player_one_line(int entry, cptr val, byte attr)
 }
 
 
+static void display_player_melee_bonus(int hand, int hand_entry)
+{
+       char buf[160];
+       int show_tohit = p_ptr->dis_to_h[hand];
+       int show_todam = p_ptr->dis_to_d[hand];
+       object_type *o_ptr = &inventory[INVEN_RARM + hand];
+
+       /* Hack -- add in weapon info if known */
+       if (object_is_known(o_ptr)) show_tohit += o_ptr->to_h;
+       if (object_is_known(o_ptr)) show_todam += o_ptr->to_d;
+
+       /* Melee attacks */
+       sprintf(buf, "(%+d,%+d)", show_tohit, show_todam);
+
+       /* Dump the bonuses to hit/dam */
+       if (!buki_motteruka(INVEN_RARM) && !buki_motteruka(INVEN_LARM))
+               display_player_one_line(ENTRY_BARE_HAND, buf, TERM_L_BLUE);
+       else if (p_ptr->ryoute)
+               display_player_one_line(ENTRY_TWO_HANDS, buf, TERM_L_BLUE);
+       else
+               display_player_one_line(hand_entry, buf, TERM_L_BLUE);
+}
+
+
 /*
  * Prints the following information on the screen.
  */
 static void display_player_middle(void)
 {
        char buf[160];
-       int show_tohit, show_todam;
-       object_type *o_ptr;
-       int tmul = 0;
-       int e;
-
-       if(p_ptr->migite)
-       {
-               show_tohit = p_ptr->dis_to_h[0];
-               show_todam = p_ptr->dis_to_d[0];
 
-               o_ptr = &inventory[INVEN_RARM];
+       /* Base skill */
+       int show_tohit = p_ptr->dis_to_h_b;
+       int show_todam = 0;
 
-               /* Hack -- add in weapon info if known */
-               if (object_is_known(o_ptr)) show_tohit += o_ptr->to_h;
-               if (object_is_known(o_ptr)) show_todam += o_ptr->to_d;
+       /* Range weapon */
+       object_type *o_ptr = &inventory[INVEN_BOW];
 
-               /* Melee attacks */
-               sprintf(buf, "(%+d,%+d)", show_tohit, show_todam);
+       int tmul = 0;
+       int e;
 
-               /* Dump the bonuses to hit/dam */
-               if(!buki_motteruka(INVEN_RARM) && !buki_motteruka(INVEN_LARM))
-                       display_player_one_line(ENTRY_BARE_HAND, buf, TERM_L_BLUE);
-               else if(p_ptr->ryoute)
-                       display_player_one_line(ENTRY_TWO_HANDS, buf, TERM_L_BLUE);
-               else if (left_hander)
-                       display_player_one_line(ENTRY_LEFT_HAND1, buf, TERM_L_BLUE);
-               else
-                       display_player_one_line(ENTRY_RIGHT_HAND1, buf, TERM_L_BLUE);
+       if (p_ptr->migite)
+       {
+               display_player_melee_bonus(0, left_hander ? ENTRY_LEFT_HAND1 : ENTRY_RIGHT_HAND1);
        }
 
-       if(p_ptr->hidarite)
+       if (p_ptr->hidarite)
        {
-               show_tohit = p_ptr->dis_to_h[1];
-               show_todam = p_ptr->dis_to_d[1];
-
-               o_ptr = &inventory[INVEN_LARM];
-
-               /* Hack -- add in weapon info if known */
-               if (object_is_known(o_ptr)) show_tohit += o_ptr->to_h;
-               if (object_is_known(o_ptr)) show_todam += o_ptr->to_d;
-
-               /* Melee attacks */
-               sprintf(buf, "(%+d,%+d)", show_tohit, show_todam);
-
-               /* Dump the bonuses to hit/dam */
-               if (left_hander)
-                       display_player_one_line(ENTRY_RIGHT_HAND2, buf, TERM_L_BLUE);
-               else
-                       display_player_one_line(ENTRY_LEFT_HAND2, buf, TERM_L_BLUE);
+               display_player_melee_bonus(1, left_hander ? ENTRY_RIGHT_HAND2: ENTRY_LEFT_HAND2);
        }
        else if ((p_ptr->pclass == CLASS_MONK) && (empty_hands(TRUE) & EMPTY_HAND_RARM))
        {
@@ -1762,13 +1756,6 @@ static void display_player_middle(void)
 #endif
        }
 
-       /* Range weapon */
-       o_ptr = &inventory[INVEN_BOW];
-
-       /* Base skill */
-       show_tohit = p_ptr->dis_to_h_b;
-       show_todam = 0;
-
        /* Apply weapon bonuses */
        if (object_is_known(o_ptr)) show_tohit += o_ptr->to_h;
        if (object_is_known(o_ptr)) show_todam += o_ptr->to_d;
@@ -2270,7 +2257,8 @@ static void player_flags(u32b flgs[TR_FLAG_SIZE])
                        add_flag(flgs, TR_SPEED);
                else
                {
-                       if (!inventory[INVEN_LARM].tval || p_ptr->hidarite)
+                       if ((!inventory[INVEN_RARM].k_idx || p_ptr->migite) &&
+                           (!inventory[INVEN_LARM].k_idx || p_ptr->hidarite))
                                add_flag(flgs, TR_SPEED);
                        if (p_ptr->lev>24)
                                add_flag(flgs, TR_FREE_ACT);
@@ -4823,7 +4811,7 @@ static void dump_aux_equipment_inventory(FILE *fff)
                for (i = INVEN_RARM; i < INVEN_TOTAL; i++)
                {
                        object_desc(o_name, &inventory[i], 0);
-                       if ((i == INVEN_LARM) && p_ptr->ryoute)
+                       if ((((i == INVEN_RARM) && p_ptr->hidarite) || ((i == INVEN_LARM) && p_ptr->migite)) && p_ptr->ryoute)
 #ifdef JP
                                strcpy(o_name, "(Éð´ï¤òξ¼ê»ý¤Á)");
 #else
index bcbc98b..5fde78d 100644 (file)
@@ -1184,7 +1184,7 @@ msg_print("
 
                return;
        }
-       if (!buki_motteruka(INVEN_RARM))
+       if (!buki_motteruka(INVEN_RARM) && !buki_motteruka(INVEN_LARM))
        {
                if (flush_failure) flush();
 #ifdef JP
index 6312614..49d965f 100644 (file)
@@ -317,3 +317,13 @@ bool object_is_nameless(object_type *o_ptr)
        return FALSE;
 }
 
+
+/*
+ * Check if an object is melee weapon and allows wielding with two-hands
+ */
+bool object_allow_two_hands_wielding(object_type *o_ptr)
+{
+       if (object_is_melee_weapon(o_ptr) && ((o_ptr->weight > 99) || (o_ptr->tval == TV_POLEARM))) return TRUE;
+
+       return FALSE;
+}
index 6c796e2..ec2911b 100644 (file)
@@ -4084,131 +4084,86 @@ cptr mention_use(int i)
        switch (i)
        {
 #ifdef JP
-case INVEN_RARM: p = p_ptr->ryoute ? " Î¾¼ê" : (left_hander ? " º¸¼ê" : " ±¦¼ê"); break;
+               case INVEN_RARM:  p = p_ptr->heavy_wield[0] ? "±¿ÈÂÃæ" : ((p_ptr->ryoute && p_ptr->migite) ? " Î¾¼ê" : (left_hander ? " º¸¼ê" : " ±¦¼ê")); break;
 #else
-               case INVEN_RARM: p = "Wielding"; break;
+               case INVEN_RARM:  p = p_ptr->heavy_wield[0] ? "Just lifting" : (p_ptr->migite ? "Wielding" : "On arm"); break;
 #endif
 
 #ifdef JP
-case INVEN_LARM:   p = (left_hander ? " ±¦¼ê" : " º¸¼ê"); break;
+               case INVEN_LARM:  p = p_ptr->heavy_wield[1] ? "±¿ÈÂÃæ" : ((p_ptr->ryoute && p_ptr->hidarite) ? " Î¾¼ê" : (left_hander ? " ±¦¼ê" : " º¸¼ê")); break;
 #else
-               case INVEN_LARM:   p = "On arm"; break;
+               case INVEN_LARM:  p = p_ptr->heavy_wield[1] ? "Just lifting" : (p_ptr->hidarite ? "Wielding" : "On arm"); break;
 #endif
 
 #ifdef JP
-case INVEN_BOW:   p = "¼Í·âÍÑ"; break;
+               case INVEN_BOW:   p = (adj_str_hold[p_ptr->stat_ind[A_STR]] < inventory[i].weight / 10) ? "±¿ÈÂÃæ" : "¼Í·âÍÑ"; break;
 #else
-               case INVEN_BOW:   p = "Shooting"; break;
+               case INVEN_BOW:   p = (adj_str_hold[p_ptr->stat_ind[A_STR]] < inventory[i].weight / 10) ? "Just holding" : "Shooting"; break;
 #endif
 
 #ifdef JP
-case INVEN_LEFT:  p = (left_hander ? "±¦¼ê»Ø" : "º¸¼ê»Ø"); break;
+               case INVEN_RIGHT: p = (left_hander ? "º¸¼ê»Ø" : "±¦¼ê»Ø"); break;
 #else
-               case INVEN_LEFT:  p = "On left hand"; break;
+               case INVEN_RIGHT: p = (left_hander ? "On left hand" : "On right hand"); break;
 #endif
 
 #ifdef JP
-case INVEN_RIGHT: p = (left_hander ? "º¸¼ê»Ø" : "±¦¼ê»Ø"); break;
+               case INVEN_LEFT:  p = (left_hander ? "±¦¼ê»Ø" : "º¸¼ê»Ø"); break;
 #else
-               case INVEN_RIGHT: p = "On right hand"; break;
+               case INVEN_LEFT:  p = (left_hander ? "On right hand" : "On left hand"); break;
 #endif
 
 #ifdef JP
-case INVEN_NECK:  p = "  ¼ó"; break;
+               case INVEN_NECK:  p = "  ¼ó"; break;
 #else
                case INVEN_NECK:  p = "Around neck"; break;
 #endif
 
 #ifdef JP
-case INVEN_LITE:  p = " ¸÷¸»"; break;
+               case INVEN_LITE:  p = " ¸÷¸»"; break;
 #else
                case INVEN_LITE:  p = "Light source"; break;
 #endif
 
 #ifdef JP
-case INVEN_BODY:  p = "  ÂÎ"; break;
+               case INVEN_BODY:  p = "  ÂÎ"; break;
 #else
                case INVEN_BODY:  p = "On body"; break;
 #endif
 
 #ifdef JP
-case INVEN_OUTER: p = "ÂΤξå"; break;
+               case INVEN_OUTER: p = "ÂΤξå"; break;
 #else
                case INVEN_OUTER: p = "About body"; break;
 #endif
 
 #ifdef JP
-case INVEN_HEAD:  p = "  Ƭ"; break;
+               case INVEN_HEAD:  p = "  Ƭ"; break;
 #else
                case INVEN_HEAD:  p = "On head"; break;
 #endif
 
 #ifdef JP
-case INVEN_HANDS: p = "  ¼ê"; break;
+               case INVEN_HANDS: p = "  ¼ê"; break;
 #else
                case INVEN_HANDS: p = "On hands"; break;
 #endif
 
 #ifdef JP
-case INVEN_FEET:  p = "  ­"; break;
+               case INVEN_FEET:  p = "  ­"; break;
 #else
                case INVEN_FEET:  p = "On feet"; break;
 #endif
 
 #ifdef JP
-default:          p = "¥¶¥Ã¥¯"; break;
+               default:          p = "¥¶¥Ã¥¯"; break;
 #else
                default:          p = "In pack"; break;
 #endif
-
-       }
-
-       /* Hack -- Heavy weapon */
-       if (i == INVEN_RARM)
-       {
-               if (p_ptr->heavy_wield[0])
-               {
-#ifdef JP
-p = "±¿ÈÂÃæ";
-#else
-                       p = "Just lifting";
-#endif
-
-               }
-       }
-
-       /* Hack -- Heavy weapon */
-       if (i == INVEN_LARM)
-       {
-               if (p_ptr->heavy_wield[1])
-               {
-#ifdef JP
-p = "±¿ÈÂÃæ";
-#else
-                       p = "Just lifting";
-#endif
-
-               }
-       }
-
-       /* Hack -- Heavy bow */
-       if (i == INVEN_BOW)
-       {
-               object_type *o_ptr;
-               o_ptr = &inventory[i];
-               if (adj_str_hold[p_ptr->stat_ind[A_STR]] < o_ptr->weight / 10)
-               {
-#ifdef JP
-p = "±¿ÈÂÃæ";
-#else
-                       p = "Just holding";
-#endif
-
-               }
        }
 
        /* Return the result */
-       return (p);
+       return p;
 }
 
 
@@ -4223,118 +4178,82 @@ cptr describe_use(int i)
        switch (i)
        {
 #ifdef JP
-case INVEN_RARM: p = p_ptr->ryoute ? "ξ¼ê¤ËÁõÈ÷¤·¤Æ¤¤¤ë" : (left_hander ? "º¸¼ê¤ËÁõÈ÷¤·¤Æ¤¤¤ë" : "±¦¼ê¤ËÁõÈ÷¤·¤Æ¤¤¤ë"); break;
+               case INVEN_RARM:  p = p_ptr->heavy_wield[0] ? "±¿ÈÂÃæ¤Î" : ((p_ptr->ryoute && p_ptr->migite) ? "ξ¼ê¤ËÁõÈ÷¤·¤Æ¤¤¤ë" : (left_hander ? "º¸¼ê¤ËÁõÈ÷¤·¤Æ¤¤¤ë" : "±¦¼ê¤ËÁõÈ÷¤·¤Æ¤¤¤ë")); break;
 #else
-               case INVEN_RARM: p = "attacking monsters with"; break;
+               case INVEN_RARM:  p = p_ptr->heavy_wield[0] ? "just lifting" : (p_ptr->migite ? "attacking monsters with" : "wearing on your arm"); break;
 #endif
 
 #ifdef JP
-case INVEN_LARM:   p = (left_hander ? "±¦¼ê¤ËÁõÈ÷¤·¤Æ¤¤¤ë" : "º¸¼ê¤ËÁõÈ÷¤·¤Æ¤¤¤ë"); break;
+               case INVEN_LARM:  p = p_ptr->heavy_wield[1] ? "±¿ÈÂÃæ¤Î" : ((p_ptr->ryoute && p_ptr->hidarite) ? "ξ¼ê¤ËÁõÈ÷¤·¤Æ¤¤¤ë" : (left_hander ? "±¦¼ê¤ËÁõÈ÷¤·¤Æ¤¤¤ë" : "º¸¼ê¤ËÁõÈ÷¤·¤Æ¤¤¤ë")); break;
 #else
-               case INVEN_LARM:   p = "wearing on your arm"; break;
+               case INVEN_LARM:  p = p_ptr->heavy_wield[1] ? "just lifting" : (p_ptr->hidarite ? "attacking monsters with" : "wearing on your arm"); break;
 #endif
 
 #ifdef JP
-case INVEN_BOW:   p = "¼Í·âÍѤËÁõÈ÷¤·¤Æ¤¤¤ë"; break;
+               case INVEN_BOW:   p = (adj_str_hold[p_ptr->stat_ind[A_STR]] < inventory[i].weight / 10) ? "»ý¤Ä¤À¤±¤ÇÀº°ìÇÕ¤Î" : "¼Í·âÍѤËÁõÈ÷¤·¤Æ¤¤¤ë"; break;
 #else
-               case INVEN_BOW:   p = "shooting missiles with"; break;
+               case INVEN_BOW:   p = (adj_str_hold[p_ptr->stat_ind[A_STR]] < inventory[i].weight / 10) ? "just holding" : "shooting missiles with"; break;
 #endif
 
 #ifdef JP
-case INVEN_LEFT:  p = (left_hander ? "±¦¼ê¤Î»Ø¤Ë¤Ï¤á¤Æ¤¤¤ë" : "º¸¼ê¤Î»Ø¤Ë¤Ï¤á¤Æ¤¤¤ë"); break;
+               case INVEN_RIGHT: p = (left_hander ? "º¸¼ê¤Î»Ø¤Ë¤Ï¤á¤Æ¤¤¤ë" : "±¦¼ê¤Î»Ø¤Ë¤Ï¤á¤Æ¤¤¤ë"); break;
 #else
-               case INVEN_LEFT:  p = "wearing on your left hand"; break;
+               case INVEN_RIGHT: p = (left_hander ? "wearing on your left hand" : "wearing on your right hand"); break;
 #endif
 
 #ifdef JP
-case INVEN_RIGHT: p = (left_hander ? "º¸¼ê¤Î»Ø¤Ë¤Ï¤á¤Æ¤¤¤ë" : "±¦¼ê¤Î»Ø¤Ë¤Ï¤á¤Æ¤¤¤ë"); break;
+               case INVEN_LEFT:  p = (left_hander ? "±¦¼ê¤Î»Ø¤Ë¤Ï¤á¤Æ¤¤¤ë" : "º¸¼ê¤Î»Ø¤Ë¤Ï¤á¤Æ¤¤¤ë"); break;
 #else
-               case INVEN_RIGHT: p = "wearing on your right hand"; break;
+               case INVEN_LEFT:  p = (left_hander ? "wearing on your right hand" : "wearing on your left hand"); break;
 #endif
 
 #ifdef JP
-case INVEN_NECK:  p = "¼ó¤Ë¤«¤±¤Æ¤¤¤ë"; break;
+               case INVEN_NECK:  p = "¼ó¤Ë¤«¤±¤Æ¤¤¤ë"; break;
 #else
                case INVEN_NECK:  p = "wearing around your neck"; break;
 #endif
 
 #ifdef JP
-case INVEN_LITE:  p = "¸÷¸»¤Ë¤·¤Æ¤¤¤ë"; break;
+               case INVEN_LITE:  p = "¸÷¸»¤Ë¤·¤Æ¤¤¤ë"; break;
 #else
                case INVEN_LITE:  p = "using to light the way"; break;
 #endif
 
 #ifdef JP
-case INVEN_BODY:  p = "ÂΤËÃå¤Æ¤¤¤ë"; break;
+               case INVEN_BODY:  p = "ÂΤËÃå¤Æ¤¤¤ë"; break;
 #else
                case INVEN_BODY:  p = "wearing on your body"; break;
 #endif
 
 #ifdef JP
-case INVEN_OUTER: p = "¿È¤Ë¤Þ¤È¤Ã¤Æ¤¤¤ë"; break;
+               case INVEN_OUTER: p = "¿È¤Ë¤Þ¤È¤Ã¤Æ¤¤¤ë"; break;
 #else
                case INVEN_OUTER: p = "wearing on your back"; break;
 #endif
 
 #ifdef JP
-case INVEN_HEAD:  p = "Ƭ¤Ë¤«¤Ö¤Ã¤Æ¤¤¤ë"; break;
+               case INVEN_HEAD:  p = "Ƭ¤Ë¤«¤Ö¤Ã¤Æ¤¤¤ë"; break;
 #else
                case INVEN_HEAD:  p = "wearing on your head"; break;
 #endif
 
 #ifdef JP
-case INVEN_HANDS: p = "¼ê¤Ë¤Ä¤±¤Æ¤¤¤ë"; break;
+               case INVEN_HANDS: p = "¼ê¤Ë¤Ä¤±¤Æ¤¤¤ë"; break;
 #else
                case INVEN_HANDS: p = "wearing on your hands"; break;
 #endif
 
 #ifdef JP
-case INVEN_FEET:  p = "­¤Ë¤Ï¤¤¤Æ¤¤¤ë"; break;
+               case INVEN_FEET:  p = "­¤Ë¤Ï¤¤¤Æ¤¤¤ë"; break;
 #else
                case INVEN_FEET:  p = "wearing on your feet"; break;
 #endif
 
 #ifdef JP
-default:          p = "¥¶¥Ã¥¯¤ËÆþ¤Ã¤Æ¤¤¤ë"; break;
+               default:          p = "¥¶¥Ã¥¯¤ËÆþ¤Ã¤Æ¤¤¤ë"; break;
 #else
                default:          p = "carrying in your pack"; break;
 #endif
-
-       }
-
-       /* Hack -- Heavy weapon */
-       if (i == INVEN_RARM)
-       {
-               object_type *o_ptr;
-               int hold = adj_str_hold[p_ptr->stat_ind[A_STR]];
-
-               if (p_ptr->ryoute) hold *= 2;
-               o_ptr = &inventory[i];
-               if (hold < o_ptr->weight / 10)
-               {
-#ifdef JP
-p = "±¿ÈÂÃæ¤Î";
-#else
-                       p = "just lifting";
-#endif
-
-               }
-       }
-
-       /* Hack -- Heavy bow */
-       if (i == INVEN_BOW)
-       {
-               object_type *o_ptr;
-               o_ptr = &inventory[i];
-               if (adj_str_hold[p_ptr->stat_ind[A_STR]] < o_ptr->weight / 10)
-               {
-#ifdef JP
-p = "»ý¤Ä¤À¤±¤ÇÀº°ìÇÕ¤Î";
-#else
-                       p = "just holding";
-#endif
-
-               }
        }
 
        /* Return the result */
@@ -4530,14 +4449,14 @@ void display_equip(void)
                Term_putstr(0, i - INVEN_RARM, 3, TERM_WHITE, tmp_val);
 
                /* Obtain an item description */
-               if ((i == INVEN_LARM) && p_ptr->ryoute)
+               if ((((i == INVEN_RARM) && p_ptr->hidarite) || ((i == INVEN_LARM) && p_ptr->migite)) && p_ptr->ryoute)
                {
 #ifdef JP
                        strcpy(o_name, "(Éð´ï¤òξ¼ê»ý¤Á)");
 #else
                        strcpy(o_name, "(wielding with two-hands)");
 #endif
-                       attr = 1;
+                       attr = TERM_WHITE;
                }
                else
                {
@@ -5068,19 +4987,21 @@ int show_equip(int target_item)
                o_ptr = &inventory[i];
 
                /* Is this item acceptable? */
-               if (!item_tester_okay(o_ptr) && (!((i == INVEN_LARM) && p_ptr->ryoute) || item_tester_no_ryoute)) continue;
+               if (!item_tester_okay(o_ptr) &&
+                   (!((((i == INVEN_RARM) && p_ptr->hidarite) || ((i == INVEN_LARM) && p_ptr->migite)) && p_ptr->ryoute) ||
+                    item_tester_no_ryoute)) continue;
 
                /* Description */
                object_desc(o_name, o_ptr, 0);
 
-               if ((i == INVEN_LARM) && p_ptr->ryoute)
+               if ((((i == INVEN_RARM) && p_ptr->hidarite) || ((i == INVEN_LARM) && p_ptr->migite)) && p_ptr->ryoute)
                {
 #ifdef JP
                        (void)strcpy(out_desc[k],"(Éð´ï¤òξ¼ê»ý¤Á)");
 #else
                        (void)strcpy(out_desc[k],"(wielding with two-hands)");
 #endif
-                       out_color[k] = 1;
+                       out_color[k] = TERM_WHITE;
                }
                else
                {
@@ -5609,6 +5530,14 @@ bool get_item(int *cp, cptr pmt, cptr str, int mode)
        while ((e1 <= e2) && (!get_item_okay(e1))) e1++;
        while ((e1 <= e2) && (!get_item_okay(e2))) e2--;
 
+       if (equip && p_ptr->ryoute && !item_tester_no_ryoute)
+       {
+               if (p_ptr->migite)
+               {
+                       if (e2 < INVEN_LARM) e2 = INVEN_LARM;
+               }
+               else if (p_ptr->hidarite) e1 = INVEN_RARM;
+       }
 
 
        /* Restrict floor usage */
@@ -6636,6 +6565,15 @@ bool get_item_floor(int *cp, cptr pmt, cptr str, int mode)
        while ((e1 <= e2) && (!get_item_okay(e1))) e1++;
        while ((e1 <= e2) && (!get_item_okay(e2))) e2--;
 
+       if (equip && p_ptr->ryoute && !item_tester_no_ryoute)
+       {
+               if (p_ptr->migite)
+               {
+                       if (e2 < INVEN_LARM) e2 = INVEN_LARM;
+               }
+               else if (p_ptr->hidarite) e1 = INVEN_RARM;
+       }
+
 
        /* Count "okay" floor items */
        floor_num = 0;
index d40f8db..b172166 100644 (file)
@@ -1188,7 +1188,7 @@ static bool cmd_racial_power_aux(s32b command)
                        }
                        else if (command == -4)
                        {
-                               if (!buki_motteruka(INVEN_RARM))
+                               if (!buki_motteruka(INVEN_RARM) && !buki_motteruka(INVEN_LARM))
                                {
 #ifdef JP
                                        msg_print("Éð´ï¤ò»ý¤¿¤Ê¤¤¤È¤¤¤±¤Þ¤»¤ó¡£");
index a35e5a5..abe9e2a 100644 (file)
@@ -4001,8 +4001,12 @@ msg_format("%s
                        display_inventory();
                }
        }
-       if (item >= INVEN_RARM) calc_android_exp();
-       if ((choice == 0) && ((item == INVEN_RARM) || (item == INVEN_LARM))) kamaenaoshi(item);
+
+       if ((choice == 0) && (item >= INVEN_RARM))
+       {
+               calc_android_exp();
+               kamaenaoshi(item);
+       }
 }
 
 
index 9fb124d..3514950 100644 (file)
@@ -2913,7 +2913,7 @@ static int weight_limit(void)
 
 bool buki_motteruka(int i)
 {
-       return ((inventory[i].k_idx && inventory[i].tval >= TV_DIGGING && inventory[i].tval <= TV_SWORD) ? TRUE : FALSE);
+       return ((inventory[i].k_idx && object_is_melee_weapon(&inventory[i])) ? TRUE : FALSE);
 }
 
 
@@ -2941,6 +2941,8 @@ void calc_bonuses(void)
 {
        int             i, j, hold, neutral[2];
        int             new_speed;
+       int             default_hand = 0;
+       int             empty_hands_status = empty_hands(TRUE);
        int             extra_blows[2];
        int             extra_shots;
        object_type     *o_ptr;
@@ -3134,14 +3136,55 @@ void calc_bonuses(void)
        /* Base skill -- digging */
        p_ptr->skill_dig = 0;
 
-       if (buki_motteruka(INVEN_RARM) && (empty_hands(FALSE) & EMPTY_HAND_LARM) && ((inventory[INVEN_RARM].weight > 99) || (inventory[INVEN_RARM].tval == TV_POLEARM)) && (!p_ptr->riding || (p_ptr->pet_extra_flags & PF_RYOUTE))) p_ptr->ryoute = TRUE;
-       if (((p_ptr->pclass == CLASS_MONK) || (p_ptr->pclass == CLASS_FORCETRAINER) || (p_ptr->pclass == CLASS_BERSERKER)) && (empty_hands(TRUE) == (EMPTY_HAND_RARM | EMPTY_HAND_LARM)) && (!p_ptr->riding || (p_ptr->pet_extra_flags & PF_RYOUTE))) p_ptr->ryoute = TRUE;
-       if (buki_motteruka(INVEN_RARM) || !buki_motteruka(INVEN_LARM)) p_ptr->migite = TRUE;
-       if (buki_motteruka(INVEN_LARM)) p_ptr->hidarite = TRUE;
+       if (buki_motteruka(INVEN_RARM)) p_ptr->migite = TRUE;
+       if (buki_motteruka(INVEN_LARM))
+       {
+               p_ptr->hidarite = TRUE;
+               if (!p_ptr->migite) default_hand = 1;
+       }
+
+       if (!p_ptr->riding || (p_ptr->pet_extra_flags & PF_RYOUTE))
+       {
+               if (p_ptr->migite && (empty_hands(FALSE) == EMPTY_HAND_LARM) &&
+                       object_allow_two_hands_wielding(&inventory[INVEN_RARM]))
+               {
+                       p_ptr->ryoute = TRUE;
+               }
+               else if (p_ptr->hidarite && (empty_hands(FALSE) == EMPTY_HAND_RARM) &&
+                       object_allow_two_hands_wielding(&inventory[INVEN_LARM]))
+               {
+                       p_ptr->ryoute = TRUE;
+               }
+               else
+               {
+                       switch (p_ptr->pclass)
+                       {
+                       case CLASS_MONK:
+                       case CLASS_FORCETRAINER:
+                       case CLASS_BERSERKER:
+                               if (empty_hands(FALSE) == (EMPTY_HAND_RARM | EMPTY_HAND_LARM))
+                               {
+                                       p_ptr->migite = TRUE;
+                                       p_ptr->ryoute = TRUE;
+                               }
+                               break;
+                       }
+               }
+       }
+
+       if (!p_ptr->migite && !p_ptr->hidarite)
+       {
+               if (empty_hands_status & EMPTY_HAND_RARM) p_ptr->migite = TRUE;
+               else if (empty_hands_status == EMPTY_HAND_LARM)
+               {
+                       p_ptr->hidarite = TRUE;
+                       default_hand = 1;
+               }
+       }
 
        if (p_ptr->special_defense & KAMAE_MASK)
        {
-               if (!(empty_hands(TRUE) & EMPTY_HAND_RARM))
+               if (!(empty_hands_status & EMPTY_HAND_RARM))
                {
                        set_action(ACTION_NONE);
                }
@@ -3219,7 +3262,8 @@ void calc_bonuses(void)
                                new_speed -= (p_ptr->lev) / 10;
                                p_ptr->skill_stl -= (p_ptr->lev)/10;
                        }
-                       else if (!inventory[INVEN_LARM].tval || p_ptr->hidarite)
+                       else if ((!inventory[INVEN_RARM].k_idx || p_ptr->migite) &&
+                                (!inventory[INVEN_LARM].k_idx || p_ptr->hidarite))
                        {
                                new_speed += 3;
                                if (!(prace_is_(RACE_KLACKON) ||
@@ -3232,7 +3276,8 @@ void calc_bonuses(void)
                                if  (p_ptr->lev > 24)
                                        p_ptr->free_act = TRUE;
                        }
-                       if (!inventory[INVEN_LARM].tval || p_ptr->hidarite)
+                       if ((!inventory[INVEN_RARM].k_idx || p_ptr->migite) &&
+                           (!inventory[INVEN_LARM].k_idx || p_ptr->hidarite))
                        {
                                p_ptr->to_a += p_ptr->lev/2+5;
                                p_ptr->dis_to_a += p_ptr->lev/2+5;
@@ -4074,14 +4119,14 @@ void calc_bonuses(void)
                else
                {
                        /* Apply the bonuses to hit/damage */
-                       p_ptr->to_h[0] += bonus_to_h;
-                       p_ptr->to_d[0] += bonus_to_d;
+                       p_ptr->to_h[default_hand] += bonus_to_h;
+                       p_ptr->to_d[default_hand] += bonus_to_d;
 
                        /* Apply the mental bonuses to hit/damage, if known */
                        if (object_is_known(o_ptr))
                        {
-                               p_ptr->dis_to_h[0] += bonus_to_h;
-                               p_ptr->dis_to_d[0] += bonus_to_d;
+                               p_ptr->dis_to_h[default_hand] += bonus_to_h;
+                               p_ptr->dis_to_d[default_hand] += bonus_to_d;
                        }
                }
        }
@@ -4478,10 +4523,11 @@ void calc_bonuses(void)
 
        if (p_ptr->special_defense & KAMAE_SUZAKU) new_speed += 10;
 
-       if (!buki_motteruka(INVEN_RARM) && !buki_motteruka(INVEN_LARM))
+       if ((p_ptr->migite && (empty_hands_status & EMPTY_HAND_RARM)) ||
+           (p_ptr->hidarite && (empty_hands_status & EMPTY_HAND_LARM)))
        {
-               p_ptr->to_h[0] += (p_ptr->skill_exp[GINOU_SUDE] - WEAPON_EXP_BEGINNER) / 200;
-               p_ptr->dis_to_h[0] += (p_ptr->skill_exp[GINOU_SUDE] - WEAPON_EXP_BEGINNER) / 200;
+               p_ptr->to_h[default_hand] += (p_ptr->skill_exp[GINOU_SUDE] - WEAPON_EXP_BEGINNER) / 200;
+               p_ptr->dis_to_h[default_hand] += (p_ptr->skill_exp[GINOU_SUDE] - WEAPON_EXP_BEGINNER) / 200;
        }
 
        if (buki_motteruka(INVEN_RARM) && buki_motteruka(INVEN_LARM))
@@ -4899,7 +4945,7 @@ void calc_bonuses(void)
                        p_ptr->to_d[i] += p_ptr->lev/6;
                        p_ptr->dis_to_h[i] += p_ptr->lev/5;
                        p_ptr->dis_to_d[i] += p_ptr->lev/6;
-                       if (!p_ptr->hidarite || p_ptr->ryoute)
+                       if (((i == 0) && !p_ptr->hidarite) || p_ptr->ryoute)
                        {
                                p_ptr->to_h[i] += p_ptr->lev/5;
                                p_ptr->to_d[i] += p_ptr->lev/6;
@@ -4968,7 +5014,20 @@ void calc_bonuses(void)
                int penalty = 0;
 
                p_ptr->riding_ryoute = FALSE;
+
                if (p_ptr->ryoute || (empty_hands(FALSE) == EMPTY_HAND_NONE)) p_ptr->riding_ryoute = TRUE;
+               else if (p_ptr->pet_extra_flags & PF_RYOUTE)
+               {
+                       switch (p_ptr->pclass)
+                       {
+                       case CLASS_MONK:
+                       case CLASS_FORCETRAINER:
+                       case CLASS_BERSERKER:
+                               if ((empty_hands(FALSE) != EMPTY_HAND_NONE) && !buki_motteruka(INVEN_RARM) && !buki_motteruka(INVEN_LARM))
+                                       p_ptr->riding_ryoute = TRUE;
+                               break;
+                       }
+               }
 
                if ((p_ptr->pclass == CLASS_BEASTMASTER) || (p_ptr->pclass == CLASS_CAVALRY))
                {
@@ -4986,7 +5045,8 @@ void calc_bonuses(void)
        }
 
        /* Different calculation for monks with empty hands */
-       if (((p_ptr->pclass == CLASS_MONK) || (p_ptr->pclass == CLASS_FORCETRAINER) || (p_ptr->pclass == CLASS_BERSERKER)) && (empty_hands(TRUE) & EMPTY_HAND_RARM))
+       if (((p_ptr->pclass == CLASS_MONK) || (p_ptr->pclass == CLASS_FORCETRAINER) || (p_ptr->pclass == CLASS_BERSERKER)) &&
+               (empty_hands_status & EMPTY_HAND_RARM) && !p_ptr->hidarite)
        {
                int blow_base = p_ptr->lev + adj_dex_blow[p_ptr->stat_ind[A_DEX]];
                p_ptr->num_blow[0] = 0;
@@ -5153,13 +5213,13 @@ void calc_bonuses(void)
                bonus_to_d = ((int)(adj_str_td[p_ptr->stat_ind[A_STR]]) - 128)/2;
                bonus_to_h = ((int)(adj_str_th[p_ptr->stat_ind[A_STR]]) - 128) + ((int)(adj_dex_th[p_ptr->stat_ind[A_DEX]]) - 128);
 
-               p_ptr->to_h[0] += MAX(bonus_to_h,1);
-               p_ptr->dis_to_h[0] += MAX(bonus_to_h,1);
-               p_ptr->to_d[0] += MAX(bonus_to_d,1);
-               p_ptr->dis_to_d[0] += MAX(bonus_to_d,1);
+               p_ptr->to_h[default_hand] += MAX(bonus_to_h,1);
+               p_ptr->dis_to_h[default_hand] += MAX(bonus_to_h,1);
+               p_ptr->to_d[default_hand] += MAX(bonus_to_d,1);
+               p_ptr->dis_to_d[default_hand] += MAX(bonus_to_d,1);
        }
 
-       if (((p_ptr->pclass == CLASS_MONK) || (p_ptr->pclass == CLASS_FORCETRAINER) || (p_ptr->pclass == CLASS_BERSERKER)) && (empty_hands(TRUE) == (EMPTY_HAND_RARM | EMPTY_HAND_LARM))) p_ptr->ryoute = FALSE;
+       if (((p_ptr->pclass == CLASS_MONK) || (p_ptr->pclass == CLASS_FORCETRAINER) || (p_ptr->pclass == CLASS_BERSERKER)) && (empty_hands(FALSE) == (EMPTY_HAND_RARM | EMPTY_HAND_LARM))) p_ptr->ryoute = FALSE;
 
        /* Affect Skill -- stealth (bonus one) */
        p_ptr->skill_stl += 1;
@@ -5439,7 +5499,7 @@ void calc_bonuses(void)
                if (p_ptr->riding_ryoute)
                {
 #ifdef JP
-                       msg_print("ξ¼ê¤¬¤Õ¤µ¤¬¤Ã¤Æ¤¤¤ÆÇϤòÁà¤ì¤Ê¤¤¡£");
+                       msg_format("%sÇϤòÁà¤ì¤Ê¤¤¡£", (empty_hands(FALSE) == EMPTY_HAND_NONE) ? "ξ¼ê¤¬¤Õ¤µ¤¬¤Ã¤Æ¤¤¤Æ" : "");
 #else
                        msg_print("You are using both hand for fighting, and you can't control a riding pet.");
 #endif
@@ -5447,7 +5507,7 @@ void calc_bonuses(void)
                else
                {
 #ifdef JP
-                       msg_print("¼ê¤¬¶õ¤¤¤ÆÇϤòÁà¤ì¤ë¤è¤¦¤Ë¤Ê¤Ã¤¿¡£");
+                       msg_format("%sÇϤòÁà¤ì¤ë¤è¤¦¤Ë¤Ê¤Ã¤¿¡£", (empty_hands(FALSE) == EMPTY_HAND_NONE) ? "¼ê¤¬¶õ¤¤¤Æ" : "");
 #else
                        msg_print("You began to control riding pet with one hand.");
 #endif
@@ -5983,13 +6043,19 @@ void handle_stuff(void)
 }
 
 
-s16b empty_hands(bool is_monk)
+s16b empty_hands(bool riding_control)
 {
        s16b status = EMPTY_HAND_NONE;
-       if (is_monk && (p_ptr->pclass != CLASS_MONK) && (p_ptr->pclass != CLASS_FORCETRAINER) && (p_ptr->pclass != CLASS_BERSERKER)) return EMPTY_HAND_NONE;
 
-       if (!(inventory[INVEN_RARM].k_idx)) status |= EMPTY_HAND_RARM;
-       if (!(inventory[INVEN_LARM].k_idx)) status |= EMPTY_HAND_LARM;
+       if (!inventory[INVEN_RARM].k_idx) status |= EMPTY_HAND_RARM;
+       if (!inventory[INVEN_LARM].k_idx) status |= EMPTY_HAND_LARM;
+
+       if (riding_control && (status != EMPTY_HAND_NONE) && p_ptr->riding && !(p_ptr->pet_extra_flags & PF_RYOUTE))
+       {
+               if (status & EMPTY_HAND_LARM) status &= ~(EMPTY_HAND_LARM);
+               else if (status & EMPTY_HAND_RARM) status &= ~(EMPTY_HAND_RARM);
+       }
+
        return status;
 }
 
index ee13ff3..a9d673c 100644 (file)
@@ -5153,7 +5153,7 @@ msg_print("
 #endif
                        break;
                case REW_CURSE_WP:
-                       if (!buki_motteruka(INVEN_RARM)) break;
+                       if (!buki_motteruka(INVEN_RARM) && !buki_motteruka(INVEN_LARM)) break;
 #ifdef JP
 msg_format("%s¤ÎÀ¼¤¬¶Á¤­ÅϤä¿:",
                                chaos_patrons[p_ptr->chaos_patron]);
@@ -5168,8 +5168,14 @@ msg_print("
                        msg_print("'Thou reliest too much on thy weapon.'");
 #endif
 
-                       object_desc(o_name, &inventory[INVEN_RARM], OD_NAME_ONLY);
-                       (void)curse_weapon(FALSE, INVEN_RARM);
+                       dummy = INVEN_RARM;
+                       if (buki_motteruka(INVEN_LARM))
+                       {
+                               dummy = INVEN_LARM;
+                               if (buki_motteruka(INVEN_RARM) && one_in_(2)) dummy = INVEN_RARM;
+                       }
+                       object_desc(o_name, &inventory[dummy], OD_NAME_ONLY);
+                       (void)curse_weapon(FALSE, dummy);
 #ifdef JP
                        reward = format("%s¤¬Ç˲õ¤µ¤ì¤¿¡£", o_name);
 #else
@@ -5236,9 +5242,15 @@ msg_print("
                                case 3:
                                        if (one_in_(2))
                                        {
-                                               if (!buki_motteruka(INVEN_RARM)) break;
-                                               object_desc(o_name, &inventory[INVEN_RARM], OD_NAME_ONLY);
-                                               (void)curse_weapon(FALSE, INVEN_RARM);
+                                               if (!buki_motteruka(INVEN_RARM) && !buki_motteruka(INVEN_LARM)) break;
+                                               dummy = INVEN_RARM;
+                                               if (buki_motteruka(INVEN_LARM))
+                                               {
+                                                       dummy = INVEN_LARM;
+                                                       if (buki_motteruka(INVEN_RARM) && one_in_(2)) dummy = INVEN_RARM;
+                                               }
+                                               object_desc(o_name, &inventory[dummy], OD_NAME_ONLY);
+                                               (void)curse_weapon(FALSE, dummy);
 #ifdef JP
                                                reward = format("%s¤¬Ç˲õ¤µ¤ì¤¿¡£", o_name);
 #else
@@ -5291,7 +5303,19 @@ msg_print("
                        }
                        activate_hi_summon(py, px, FALSE);
                        (void)activate_ty_curse(FALSE, &count);
-                       if (one_in_(2)) (void)curse_weapon(FALSE, INVEN_RARM);
+                       if (one_in_(2))
+                       {
+                               dummy = 0;
+
+                               if (buki_motteruka(INVEN_RARM))
+                               {
+                                       dummy = INVEN_RARM;
+                                       if (buki_motteruka(INVEN_LARM) && one_in_(2)) dummy = INVEN_LARM;
+                               }
+                               else if (buki_motteruka(INVEN_LARM)) dummy = INVEN_LARM;
+
+                               if (dummy) (void)curse_weapon(FALSE, dummy);
+                       }
                        if (one_in_(2)) (void)curse_armor();
                        break;
                case REW_DESTRUCT: