OSDN Git Service

Merge branch 'master' of git.osdn.net:/gitroot/hengband/hengband
[hengband/hengband.git] / src / object-hook / hook-weapon.c
1 #include "object-hook/hook-weapon.h"
2 #include "object-enchant/tr-types.h"
3 #include "object-hook/hook-armor.h"
4 #include "object/object-flags.h"
5 #include "player/player-skill.h"
6 #include "sv-definition/sv-weapon-types.h"
7 #include "system/object-type-definition.h"
8 #include "util/bit-flags-calculator.h"
9
10 /*!
11  * @brief 武器匠の「武器」鑑定対象になるかを判定する。/ Hook to specify "weapon"
12  * @param o_ptr オブジェクトの構造体の参照ポインタ。
13  * @return 対象になるならTRUEを返す。
14  */
15 bool item_tester_hook_orthodox_melee_weapons(player_type *player_ptr, object_type *o_ptr)
16 {
17     /* Unused */
18     (void)player_ptr;
19
20     switch (o_ptr->tval) {
21     case TV_HAFTED:
22     case TV_POLEARM:
23     case TV_DIGGING: {
24         return TRUE;
25     }
26     case TV_SWORD: {
27         if (o_ptr->sval != SV_POISON_NEEDLE)
28             return TRUE;
29     }
30     }
31
32     return FALSE;
33 }
34
35 /*!
36  * @brief オブジェクトが右手か左手に装備できる武器かどうかの判定
37  * @param o_ptr 判定するオブジェクトの構造体参照ポインタ
38  * @return 右手か左手の武器として装備できるならばTRUEを返す。
39  */
40 bool item_tester_hook_melee_weapon(player_type *player_ptr, object_type *o_ptr)
41 {
42     /* Unused */
43     (void)player_ptr;
44
45     /* Check for a usable slot */
46     if ((o_ptr->tval >= TV_DIGGING) && (o_ptr->tval <= TV_SWORD))
47         return TRUE;
48
49     return FALSE;
50 }
51
52 /*!
53  * @brief 修復対象となる壊れた武器かを判定する。 / Hook to specify "broken weapon"
54  * @param o_ptr オブジェクトの構造体の参照ポインタ。
55  * @return 修復対象になるならTRUEを返す。
56  */
57 bool item_tester_hook_broken_weapon(player_type *player_ptr, object_type *o_ptr)
58 {
59     /* Unused */
60     (void)player_ptr;
61
62     if (o_ptr->tval != TV_SWORD)
63         return FALSE;
64
65     switch (o_ptr->sval) {
66     case SV_BROKEN_DAGGER:
67     case SV_BROKEN_SWORD:
68         return TRUE;
69     }
70
71     return FALSE;
72 }
73
74 /*!
75  * @brief オブジェクトが投射可能な武器かどうかを返す。
76  * @param o_ptr 判定するオブジェクトの構造体参照ポインタ
77  * @return 投射可能な武器ならばTRUE
78  */
79 bool item_tester_hook_boomerang(player_type *player_ptr, object_type *o_ptr)
80 {
81     /* Unused */
82     (void)player_ptr;
83
84     if ((o_ptr->tval == TV_DIGGING) || (o_ptr->tval == TV_SWORD) || (o_ptr->tval == TV_POLEARM) || (o_ptr->tval == TV_HAFTED))
85         return TRUE;
86
87     return FALSE;
88 }
89
90 /*!
91  * @brief オブジェクトがどちらの手にも装備できる武器かどうかの判定
92  * @param o_ptr 判定するオブジェクトの構造体参照ポインタ
93  * @return 左右両方の手で装備できるならばTRUEを返す。
94  */
95 bool item_tester_hook_mochikae(player_type *player_ptr, object_type *o_ptr)
96 {
97     /* Unused */
98     (void)player_ptr;
99
100     /* Check for a usable slot */
101     if (((o_ptr->tval >= TV_DIGGING) && (o_ptr->tval <= TV_SWORD)) || (o_ptr->tval == TV_SHIELD) || (o_ptr->tval == TV_CAPTURE) || (o_ptr->tval == TV_CARD))
102         return TRUE;
103
104     return FALSE;
105 }
106
107 /*!
108  * @brief オブジェクトがプレイヤーの職業に応じた適正武器か否かを返す / Favorite weapons
109  * @param o_ptr 対象のオブジェクト構造体ポインタ
110  * @return オブジェクトが適正武器ならばTRUEを返す
111  */
112 bool object_is_favorite(player_type *player_ptr, object_type *o_ptr)
113 {
114     /* Only melee weapons match */
115     if (!(o_ptr->tval == TV_POLEARM || o_ptr->tval == TV_SWORD || o_ptr->tval == TV_DIGGING || o_ptr->tval == TV_HAFTED)) {
116         return FALSE;
117     }
118
119     /* Favorite weapons are varied depend on the class */
120     switch (player_ptr->pclass) {
121     case CLASS_PRIEST: {
122         BIT_FLAGS flgs[TR_FLAG_SIZE];
123         object_flags_known(player_ptr, o_ptr, flgs);
124
125         if (!have_flag(flgs, TR_BLESSED) && !(o_ptr->tval == TV_HAFTED))
126             return FALSE;
127         break;
128     }
129
130     case CLASS_MONK:
131     case CLASS_FORCETRAINER:
132         /* Icky to wield? */
133         if (!(s_info[player_ptr->pclass].w_max[o_ptr->tval - TV_WEAPON_BEGIN][o_ptr->sval]))
134             return FALSE;
135         break;
136
137     case CLASS_BEASTMASTER:
138     case CLASS_CAVALRY: {
139         BIT_FLAGS flgs[TR_FLAG_SIZE];
140         object_flags_known(player_ptr, o_ptr, flgs);
141
142         /* Is it known to be suitable to using while riding? */
143         if (!(have_flag(flgs, TR_RIDING)))
144             return FALSE;
145
146         break;
147     }
148
149     case CLASS_NINJA:
150         /* Icky to wield? */
151         if (s_info[player_ptr->pclass].w_max[o_ptr->tval - TV_WEAPON_BEGIN][o_ptr->sval] <= WEAPON_EXP_BEGINNER)
152             return FALSE;
153         break;
154
155     default:
156         /* All weapons are okay for non-special classes */
157         return TRUE;
158     }
159
160     return TRUE;
161 }
162
163 /*!
164  * @brief オブジェクトが武器として装備できるかどうかを返す / Check if an object is weapon (including bows and ammo)
165  * @param o_ptr 対象のオブジェクト構造体ポインタ
166  * @return 武器として使えるならばTRUEを返す
167  */
168 bool object_is_weapon(player_type *player_ptr, object_type *o_ptr)
169 {
170     /* Unused */
171     (void)player_ptr;
172
173     if (TV_WEAPON_BEGIN <= o_ptr->tval && o_ptr->tval <= TV_WEAPON_END)
174         return TRUE;
175
176     return FALSE;
177 }
178
179 /*!
180  * @brief オブジェクトが武器や矢弾として使用できるかを返す / Check if an object is weapon (including bows and ammo)
181  * Rare weapons/aromors including Blade of Chaos, Dragon armors, etc.
182  * @param o_ptr 対象のオブジェクト構造体ポインタ
183  * @return 武器や矢弾として使えるならばTRUEを返す
184  */
185 bool object_is_weapon_ammo(object_type *o_ptr)
186 {
187     if (TV_MISSILE_BEGIN <= o_ptr->tval && o_ptr->tval <= TV_WEAPON_END)
188         return TRUE;
189
190     return FALSE;
191 }
192
193 /*!
194  * @brief オブジェクトが武器、防具、矢弾として使用できるかを返す / Check if an object is weapon, armour or ammo
195  * @param o_ptr 対象のオブジェクト構造体ポインタ
196  * @return 武器、防具、矢弾として使えるならばTRUEを返す
197  */
198 bool object_is_weapon_armour_ammo(player_type *player_ptr, object_type *o_ptr)
199 {
200     /* Unused */
201     (void)player_ptr;
202
203     if (object_is_weapon_ammo(o_ptr) || object_is_armour(player_ptr, o_ptr))
204         return TRUE;
205
206     return FALSE;
207 }
208
209 /*!
210  * @brief オブジェクトが近接武器として装備できるかを返す / Melee weapons
211  * @param o_ptr 対象のオブジェクト構造体ポインタ
212  * @return 近接武器として使えるならばTRUEを返す
213  */
214 bool object_is_melee_weapon(object_type *o_ptr)
215 {
216     if (TV_DIGGING <= o_ptr->tval && o_ptr->tval <= TV_SWORD)
217         return TRUE;
218
219     return FALSE;
220 }
221
222 /*!
223  * @brief オブジェクトが装備可能であるかを返す / Wearable including all weapon, all armour, bow, light source, amulet, and ring
224  * @param o_ptr 対象のオブジェクト構造体ポインタ
225  * @return 装備可能ならばTRUEを返す
226  */
227 bool object_is_wearable(object_type *o_ptr)
228 {
229     if (TV_WEARABLE_BEGIN <= o_ptr->tval && o_ptr->tval <= TV_WEARABLE_END)
230         return TRUE;
231
232     return FALSE;
233 }
234
235 /*!
236  * @brief オブジェクトが装備品であるかを返す(object_is_wearableに矢弾を含む) / Equipment including all wearable objects and ammo
237  * @param o_ptr 対象のオブジェクト構造体ポインタ
238  * @return 装備品ならばTRUEを返す
239  */
240 bool object_is_equipment(object_type *o_ptr)
241 {
242     if (TV_EQUIP_BEGIN <= o_ptr->tval && o_ptr->tval <= TV_EQUIP_END)
243         return TRUE;
244
245     return FALSE;
246 }
247
248 /*!
249  * @brief オブジェクトが強化不能武器であるかを返す / Poison needle can not be enchanted
250  * @param o_ptr 対象のオブジェクト構造体ポインタ
251  * @return 強化不能ならばTRUEを返す
252  */
253 bool object_refuse_enchant_weapon(object_type *o_ptr)
254 {
255     if (o_ptr->tval == TV_SWORD && o_ptr->sval == SV_POISON_NEEDLE)
256         return TRUE;
257
258     return FALSE;
259 }
260
261 /*!
262  * @brief オブジェクトが強化可能武器であるかを返す /
263  * Check if an object is weapon (including bows and ammo) and allows enchantment
264  * @param o_ptr 対象のオブジェクト構造体ポインタ
265  * @return 強化可能ならばTRUEを返す
266  */
267 bool object_allow_enchant_weapon(player_type *player_ptr, object_type *o_ptr)
268 {
269     /* Unused */
270     (void)player_ptr;
271
272     if (object_is_weapon_ammo(o_ptr) && !object_refuse_enchant_weapon(o_ptr))
273         return TRUE;
274
275     return FALSE;
276 }
277
278 /*!
279  * @brief オブジェクトが強化可能な近接武器であるかを返す /
280  * Check if an object is melee weapon and allows enchantment
281  * @param o_ptr 対象のオブジェクト構造体ポインタ
282  * @return 強化可能な近接武器ならばTRUEを返す
283  */
284 bool object_allow_enchant_melee_weapon(player_type *player_ptr, object_type *o_ptr)
285 {
286     /* Unused */
287     (void)player_ptr;
288
289     if (object_is_melee_weapon(o_ptr) && !object_refuse_enchant_weapon(o_ptr))
290         return TRUE;
291
292     return FALSE;
293 }
294
295 /*!
296  * @brief オブジェクトが両手持ち可能な武器かを返す /
297  * Check if an object is melee weapon and allows wielding with two-hands
298  * @param o_ptr 対象のオブジェクト構造体ポインタ
299  * @return 両手持ち可能ならばTRUEを返す
300  */
301 bool object_allow_two_hands_wielding(object_type *o_ptr)
302 {
303     if (object_is_melee_weapon(o_ptr) && ((o_ptr->weight > 99) || (o_ptr->tval == TV_POLEARM)))
304         return TRUE;
305
306     return FALSE;
307 }