OSDN Git Service

[Refactor] #39010 Separated do_cmd_throw() from do_cmd_throw()
[hengband/hengband.git] / src / action / weapon-shield.c
1 #include "action/weapon-shield.h"
2 #include "flavor/flavor-describer.h"
3 #include "game-option/birth-options.h"
4 #include "inventory/inventory-object.h"
5 #include "inventory/inventory-slot-types.h"
6 #include "object-hook/hook-checker.h"
7 #include "object-hook/hook-weapon.h"
8 #include "object/object-generator.h"
9 #include "system/object-type-definition.h"
10 #include "view/display-messages.h"
11
12 /*!
13  * @brief 持ち替え処理
14  * @param owner_ptr プレーヤーへの参照ポインタ
15  * @param item 持ち替えを行いたい装備部位ID
16  * @return なし
17  */
18 void verify_equip_slot(player_type *owner_ptr, INVENTORY_IDX item)
19 {
20     object_type *o_ptr, *new_o_ptr;
21     GAME_TEXT o_name[MAX_NLEN];
22
23     if (item == INVEN_RARM) {
24         if (!has_melee_weapon(owner_ptr, INVEN_LARM))
25             return;
26
27         o_ptr = &owner_ptr->inventory_list[INVEN_LARM];
28         describe_flavor(owner_ptr, o_name, o_ptr, 0);
29
30         if (object_is_cursed(o_ptr)) {
31             if (object_allow_two_hands_wielding(o_ptr) && can_two_hands_wielding(owner_ptr))
32                 msg_format(_("%sを両手で構えた。", "You are wielding %s with both hands."), o_name);
33             return;
34         }
35
36         new_o_ptr = &owner_ptr->inventory_list[INVEN_RARM];
37         object_copy(new_o_ptr, o_ptr);
38         owner_ptr->total_weight += o_ptr->weight;
39         inven_item_increase(owner_ptr, INVEN_LARM, -((int)o_ptr->number));
40         inven_item_optimize(owner_ptr, INVEN_LARM);
41         if (object_allow_two_hands_wielding(o_ptr) && can_two_hands_wielding(owner_ptr))
42             msg_format(_("%sを両手で構えた。", "You are wielding %s with both hands."), o_name);
43         else
44             msg_format(_("%sを%sで構えた。", "You are wielding %s in your %s hand."), o_name, (left_hander ? _("左手", "left") : _("右手", "right")));
45         return;
46     }
47
48     if (item != INVEN_LARM)
49         return;
50
51     o_ptr = &owner_ptr->inventory_list[INVEN_RARM];
52     if (o_ptr->k_idx)
53         describe_flavor(owner_ptr, o_name, o_ptr, 0);
54
55     if (has_melee_weapon(owner_ptr, INVEN_RARM)) {
56         if (object_allow_two_hands_wielding(o_ptr) && can_two_hands_wielding(owner_ptr))
57             msg_format(_("%sを両手で構えた。", "You are wielding %s with both hands."), o_name);
58
59         return;
60     }
61
62     if ((empty_hands(owner_ptr, FALSE) & EMPTY_HAND_RARM) || object_is_cursed(o_ptr))
63         return;
64
65     new_o_ptr = &owner_ptr->inventory_list[INVEN_LARM];
66     object_copy(new_o_ptr, o_ptr);
67     owner_ptr->total_weight += o_ptr->weight;
68     inven_item_increase(owner_ptr, INVEN_RARM, -((int)o_ptr->number));
69     inven_item_optimize(owner_ptr, INVEN_RARM);
70     msg_format(_("%sを持ち替えた。", "You switched hand of %s."), o_name);
71 }